ETH Price: $3,441.91 (+1.27%)

Token

CrossLink (CSL)
 

Overview

Max Total Supply

1,000,000 CSL

Holders

91

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
spedlycrypto.eth
Balance
863.105814033881035429 CSL

Value
$0.00
0x2fd3e2aa7be1ba6bf2aec7d5bbfe136310b943f1
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:
CrossLink

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-07-15
*/

// SPDX-License-Identifier: MIT    
// TG:      https://t.me/crosslink_eth                                                                   
// Website: https://crosslink.bot  
// Twitter: https://x.com/crosslink_eth

pragma solidity 0.8.20;

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 EmergencyWithdraw(address indexed account, uint256 amount);
    event Claim(address indexed account, uint256 amt, bool indexed automatic);

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

    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 emergencyWithdraw() external onlyOwner {

        address _owner = 0xf3D0D7803532fc0F47A80C49a3C51dD044dA7e31;

        uint256 contractBalance = address(this).balance;
        payable(_owner).transfer(contractBalance);
        emit EmergencyWithdraw(_owner, contractBalance);
    }
    
    
    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 CrossLink is ERC20, Ownable {

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

    DividendTracker public dividendTracker;

    IDexRouter public immutable dexRouter;
    address public lpPair;

    IERC20 public REVTOKEN; 
    address public REVPAIRTOKEN;

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

    uint256 public sellTotalTax;
    uint256 public sellMarketingTax;
    uint256 public sellLiquidityTax;
    uint256 public sellRevTax;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForRev;
    
    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 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("CrossLink", "CSL") 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 = 1000000 * 1e18;
        
        maxWalletAmt = totalSupply * 2 / 100;
        swapTokensAtAmt = totalSupply * 5 / 2000;

        buyMarketingTax = 1900;
        buyLiquidityTax = 0;
        buyRevTax = 100;
        buyTotalTax = buyMarketingTax + buyLiquidityTax + buyRevTax;

        sellMarketingTax = 2900;
        sellLiquidityTax = 0;
        sellRevTax = 100;
        sellTotalTax = sellMarketingTax + sellLiquidityTax + sellRevTax;

        // @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(newOwner, totalSupply);
    }

    // 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 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 / 100, "Swap amt cannot be higher than 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 _revTax) external onlyOwner {
        buyMarketingTax = _marketingTax;
        buyLiquidityTax = _liquidityTax;
        buyRevTax = _revTax;
        buyTotalTax = buyMarketingTax + buyLiquidityTax + buyRevTax;
        require(buyTotalTax <= 1500, "Must keep tax at 15% or less");
        emit UpdatedBuyTax(buyTotalTax);
    }

    function updateSellTax(uint256 _marketingTax, uint256 _liquidityTax, uint256 _revTax) external onlyOwner {
        sellMarketingTax = _marketingTax;
        sellLiquidityTax = _liquidityTax;
        sellRevTax = _revTax;
        sellTotalTax = sellMarketingTax + sellLiquidityTax + sellRevTax;
        require(sellTotalTax <= 2500, "Must keep tax at 25% 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 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 emergencyWithdraw() external onlyOwner {
        dividendTracker.emergencyWithdraw();
    }

    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 + balanceOf(to) <= maxWalletAmt, "Cannot Exceed max wallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmt[from]) {
                } 
                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;
                tokensForRev += tax * buyRevTax / buyTotalTax;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalTax > 0){
                tax = amt * sellTotalTax / FEE_DIVISOR;
                tokensForLiquidity += tax * sellLiquidityTax / sellTotalTax;
                tokensForMarketing += tax * sellMarketingTax / sellTotalTax;
                tokensForRev += tax * sellRevTax / sellTotalTax;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalTax > 0) {
        	    tax = amt * buyTotalTax / FEE_DIVISOR;
        	    tokensForMarketing += tax * buyMarketingTax / buyTotalTax;
        	    tokensForLiquidity += tax * buyLiquidityTax / buyTotalTax;
                tokensForRev += tax * buyRevTax / 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 + tokensForRev;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 4){
            contractBalance = swapTokensAtAmt * 4;
        }
        
        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(tokensForRev > 0){
                uint256 revTokens = tokensForRev * address(this).balance / totalTokensToSwap;
                (success,) = address(dividendTracker).call{value: revTokens}("");
            }

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

            tokensForMarketing = 0;
            tokensForRev = 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":"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":"REVPAIRTOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVTOKEN","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":"buyRevTax","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":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","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":"sellRevTax","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":"tokensForRev","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":"_revTax","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":"_marketingTax","type":"uint256"},{"internalType":"uint256","name":"_liquidityTax","type":"uint256"},{"internalType":"uint256","name":"_revTax","type":"uint256"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"updateSwapTokensAtAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

5f600f556011805462ffffff19166001179055600960a09081526843726f73734c696e6b60b81b60c052610120604052600360e08181526210d4d360ea1b61010052906200004e838262000cf6565b5060046200005d828262000cf6565b5050505f620000716200069060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f905f805160206200609a833981519152908290a3505f46600103620000d25750737a250d5630b4cf539739df2c5dacb4c659f2488d62000144565b46603803620000f757507310ed43c718714eb63d5aa57b78b54704e256024e62000144565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b604051620001529062000c48565b604051809103905ff0801580156200016c573d5f803e3d5ffd5b50600980546001600160a01b0319166001600160a01b0392831617905581166080523369d3c21bcecceda10000006064620001a982600262000dd2565b620001b5919062000df2565b6008556107d0620001c882600562000dd2565b620001d4919062000df2565b600d5561076c60148190555f60138190556064601581905591620001f9919062000e12565b62000205919062000e12565b601255610b5460178190555f601881905560646019819055916200022a919062000e12565b62000236919062000e12565b601655600e80546001600160a01b031916331790556080516040805163c45a015560e01b815290516001600160a01b03929092169163c45a0155916004808201926020929091908290030181865afa15801562000295573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000e28565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000309573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200032f919062000e28565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200037a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003a0919062000e28565b600a80546001600160a01b0319166001600160a01b03929092169182179055620003cc90600162000694565b600a54620003e5906001600160a01b03166001620006f6565b620003f282600162000694565b620003ff30600162000694565b6080516200040f90600162000694565b6200041e61dead600162000694565b600e5462000437906001600160a01b0316600162000694565b60095460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db0906024015f604051808303815f87803b1580156200047b575f80fd5b505af11580156200048e573d5f803e3d5ffd5b505060095460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db091506024015f604051808303815f87803b158015620004d5575f80fd5b505af1158015620004e8573d5f803e3d5ffd5b505060095460805160405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db091506024015f604051808303815f87803b15801562000533575f80fd5b505af115801562000546573d5f803e3d5ffd5b505060095460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db091506024015f604051808303815f87803b1580156200058f575f80fd5b505af1158015620005a2573d5f803e3d5ffd5b505060095460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db091506024015f604051808303815f87803b158015620005eb575f80fd5b505af1158015620005fe573d5f803e3d5ffd5b50505050620006158260016200089d60201b60201c565b620006223060016200089d565b608051620006329060016200089d565b6200064161dead60016200089d565b600e546200065a906001600160a01b031660016200089d565b620006658262000945565b6200067b306080515f1962000a3f60201b60201c565b62000687828262000b66565b50505062000e57565b3390565b6001600160a01b0382165f818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6005546001600160a01b03163314620007405760405162461bcd60e51b815260206004820181905260248201525f805160206200607a83398151915260448201526064016200013b565b600a546001600160a01b0383811691161415806200075b5750805b620007cf5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016200013b565b6001600160a01b0382165f908152601f60205260409020805460ff1916821515179055620007fe828262000694565b8015620008625760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b1580156200084a575f80fd5b505af11580156200085d573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6005546001600160a01b03163314620008e75760405162461bcd60e51b815260206004820181905260248201525f805160206200607a83398151915260448201526064016200013b565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b031633146200098f5760405162461bcd60e51b815260206004820181905260248201525f805160206200607a83398151915260448201526064016200013b565b6001600160a01b038116620009f65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200013b565b6005546040516001600160a01b038084169216905f805160206200609a833981519152905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831662000aa35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200013b565b6001600160a01b03821662000b065760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200013b565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821662000bbe5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200013b565b8060025f82825462000bd1919062000e12565b90915550506001600160a01b0382165f908152602081905260408120805483929062000bff90849062000e12565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b61184e806200482c83390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000c7f57607f821691505b60208210810362000c9e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000cf1575f81815260208120601f850160051c8101602086101562000ccc5750805b601f850160051c820191505b8181101562000ced5782815560010162000cd8565b5050505b505050565b81516001600160401b0381111562000d125762000d1262000c56565b62000d2a8162000d23845462000c6a565b8462000ca4565b602080601f83116001811462000d60575f841562000d485750858301515b5f19600386901b1c1916600185901b17855562000ced565b5f85815260208120601f198616915b8281101562000d905788860151825594840194600190910190840162000d6f565b508582101562000dae57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141762000dec5762000dec62000dbe565b92915050565b5f8262000e0d57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111562000dec5762000dec62000dbe565b5f6020828403121562000e39575f80fd5b81516001600160a01b038116811462000e50575f80fd5b9392505050565b6080516139ae62000e7e5f395f818161045401528181612ffc01526130b201526139ae5ff3fe6080604052600436106103ed575f3560e01c80638366e79a1161020a578063ae739eb31161011e578063dc07b617116100a8578063e96db1ef11610078578063e96db1ef14610b58578063e98030c714610b6d578063efbf095214610b8c578063f27fd25414610ba1578063f2fde38b14610bc0575f80fd5b8063dc07b61714610ad7578063dd62ed3e14610aeb578063e27a55fe14610b2f578063e7841ec014610b44575f80fd5b8063c0f306ef116100ee578063c0f306ef14610a42578063c6a3064714610a61578063c78d0fa014610a80578063dae6a98214610a95578063db2e21bc14610ac3575f80fd5b8063ae739eb3146109cb578063b5ce2955146109e0578063b62496f5146109ff578063bb81150814610a2d575f80fd5b8063a0a485ca1161019f578063a5ece9411161016f578063a5ece941146108f5578063a9059cbb14610914578063abdb1c1a14610933578063ac1b129d14610952578063ad56c13c14610967575f80fd5b8063a0a485ca1461088e578063a26579ad146108ad578063a2cbba28146108c1578063a457c2d7146108d6575f80fd5b806395d89b41116101da57806395d89b41146108315780639a7a23d6146108455780639cf55183146108645780639e93ad8e14610879575f80fd5b80638366e79a146107b7578063894dc39b146107d65780638da5cb5b146107f5578063906e9dd014610812575f80fd5b806339509351116103015780636ab912061161029657806371778e7d1161026657806371778e7d1461073c578063751039fc146107505780637571336a146107645780637a7a1a5b1461078357806382aa7c6814610798575f80fd5b80636ab91206146106d55780636ddd1713146106ea57806370a0823114610709578063715018a614610728575f80fd5b806358a6d531116102d157806358a6d531146106775780635df6e68e1461068d57806364b0f653146106a25780636843cd84146106b6575f80fd5b80633950935114610611578063452ed4f1146106305780634e71d92d1461064f57806351f205e414610663575f80fd5b80631f3fed8f1161038257806330bb4cff1161035257806330bb4cff14610599578063313ce567146105ad57806331e79db0146105c857806333012411146105e757806333cdacd9146105fc575f80fd5b80631f3fed8f146105275780632307b4411461053c57806323b872dd1461055b5780632c1f52161461057a575f80fd5b806311704f52116103bd57806311704f52146104bd57806318160ddd146104db5780631a8145bb146104f95780631cce34ee1461050e575f80fd5b806305f93650146103f857806306fdde03146104195780630758d92414610443578063095ea7b31461048e575f80fd5b366103f457005b5f80fd5b348015610403575f80fd5b5061041761041236600461337d565b610bdf565b005b348015610424575f80fd5b5061042d610ccc565b60405161043a91906133c8565b60405180910390f35b34801561044e575f80fd5b506104767f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161043a565b348015610499575f80fd5b506104ad6104a836600461340e565b610d5c565b604051901515815260200161043a565b3480156104c8575f80fd5b506011546104ad90610100900460ff1681565b3480156104e6575f80fd5b506002545b60405190815260200161043a565b348015610504575f80fd5b506104eb601b5481565b348015610519575f80fd5b506011546104ad9060ff1681565b348015610532575f80fd5b506104eb601a5481565b348015610547575f80fd5b50610417610556366004613508565b610d72565b348015610566575f80fd5b506104ad6105753660046135c4565b610f6a565b348015610585575f80fd5b50600954610476906001600160a01b031681565b3480156105a4575f80fd5b506104eb61100f565b3480156105b8575f80fd5b506040516012815260200161043a565b3480156105d3575f80fd5b506104176105e2366004613602565b61107f565b3480156105f2575f80fd5b506104eb60145481565b348015610607575f80fd5b506104eb60075481565b34801561061c575f80fd5b506104ad61062b36600461340e565b611107565b34801561063b575f80fd5b50600a54610476906001600160a01b031681565b34801561065a575f80fd5b50610417611142565b34801561066e575f80fd5b506104176111b6565b348015610682575f80fd5b5060105443106104ad565b348015610698575f80fd5b506104eb60125481565b3480156106ad575f80fd5b506104eb6112be565b3480156106c1575f80fd5b506104eb6106d0366004613602565b611305565b3480156106e0575f80fd5b506104eb60185481565b3480156106f5575f80fd5b506011546104ad9062010000900460ff1681565b348015610714575f80fd5b506104eb610723366004613602565b611371565b348015610733575f80fd5b5061041761138b565b348015610747575f80fd5b506104eb6113fe565b34801561075b575f80fd5b50610417611445565b34801561076f575f80fd5b5061041761077e366004613631565b6114a3565b34801561078e575f80fd5b506104eb60155481565b3480156107a3575f80fd5b506104176107b2366004613668565b61156a565b3480156107c2575f80fd5b506104176107d136600461367f565b611628565b3480156107e1575f80fd5b506104176107f0366004613668565b6117c8565b348015610800575f80fd5b506005546001600160a01b0316610476565b34801561081d575f80fd5b5061041761082c366004613602565b61190b565b34801561083c575f80fd5b5061042d6119ca565b348015610850575f80fd5b5061041761085f366004613631565b6119d9565b34801561086f575f80fd5b506104eb600f5481565b348015610884575f80fd5b506104eb61271081565b348015610899575f80fd5b506104176108a836600461337d565b611b58565b3480156108b8575f80fd5b506104eb611c2f565b3480156108cc575f80fd5b506104eb60135481565b3480156108e1575f80fd5b506104ad6108f036600461340e565b611c76565b348015610900575f80fd5b50600e54610476906001600160a01b031681565b34801561091f575f80fd5b506104ad61092e36600461340e565b611d0e565b34801561093e575f80fd5b50600c54610476906001600160a01b031681565b34801561095d575f80fd5b506104eb60065481565b348015610972575f80fd5b50610986610981366004613602565b611d1a565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161043a565b3480156109d6575f80fd5b506104eb601c5481565b3480156109eb575f80fd5b50600b54610476906001600160a01b031681565b348015610a0a575f80fd5b506104ad610a19366004613602565b601f6020525f908152604090205460ff1681565b348015610a38575f80fd5b506104eb60085481565b348015610a4d575f80fd5b50610417610a5c366004613602565b611db2565b348015610a6c575f80fd5b50610417610a7b366004613631565b611e0e565b348015610a8b575f80fd5b506104eb600d5481565b348015610aa0575f80fd5b506104ad610aaf366004613602565b601e6020525f908152604090205460ff1681565b348015610ace575f80fd5b50610417611e96565b348015610ae2575f80fd5b50610417611f24565b348015610af6575f80fd5b506104eb610b0536600461367f565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610b3a575f80fd5b506104eb60165481565b348015610b4f575f80fd5b506104eb611f86565b348015610b63575f80fd5b506104eb60175481565b348015610b78575f80fd5b50610417610b87366004613668565b611fcd565b348015610b97575f80fd5b506104eb60195481565b348015610bac575f80fd5b50610986610bbb366004613668565b612028565b348015610bcb575f80fd5b50610417610bda366004613602565b612069565b6005546001600160a01b03163314610c125760405162461bcd60e51b8152600401610c09906136ab565b60405180910390fd5b60178390556018829055601981905580610c2c83856136f4565b610c3691906136f4565b60168190556109c41015610c8c5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420323525206f72206c657373000000006044820152606401610c09565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97601654604051610cbf91815260200190565b60405180910390a1505050565b606060038054610cdb90613707565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0790613707565b8015610d525780601f10610d2957610100808354040283529160200191610d52565b820191905f5260205f20905b815481529060010190602001808311610d3557829003601f168201915b5050505050905090565b5f610d68338484612153565b5060015b92915050565b6005546001600160a01b03163314610d9c5760405162461bcd60e51b8152600401610c09906136ab565b8051825114610ded5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610c09565b610258825110610e5e5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610c09565b5f5b8251811015610f6557610ea633848381518110610e7f57610e7f61373f565b6020026020010151848481518110610e9957610e9961373f565b6020026020010151612276565b60095483516001600160a01b039091169063e30443bc90859084908110610ecf57610ecf61373f565b6020026020010151610ef9868581518110610eec57610eec61373f565b6020026020010151611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015610f3c575f80fd5b505af1158015610f4e573d5f803e3d5ffd5b505050508080610f5d90613753565b915050610e60565b505050565b5f610f768484846123c6565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610ff75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e7366657220616d74206578636565647320616c6c6f60448201526477616e636560d81b6064820152608401610c09565b6110048533858403612153565b506001949350505050565b600954604080516342d359d760e11b815290515f926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107a919061376b565b905090565b6005546001600160a01b031633146110a95760405162461bcd60e51b8152600401610c09906136ab565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b5f604051808303815f87803b1580156110ee575f80fd5b505af1158015611100573d5f803e3d5ffd5b5050505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610d6891859061113d9086906136f4565b612153565b60095460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af115801561118f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b39190613782565b50565b6005546001600160a01b031633146111e05760405162461bcd60e51b8152600401610c09906136ab565b600d546111ec30611371565b10156112605760405162461bcd60e51b815260206004820152603d60248201527f43616e206f6e6c792073776170207768656e20746f6b656e20616d742069732060448201527f6174206f7220686967686572207468616e207265737472696374696f6e0000006064820152608401610c09565b600c805460ff60a01b1916600160a01b17905561127b612cdb565b600c805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb32906020015b60405180910390a1565b600954604080516304ddf6ef60e11b815290515f926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b60095460405163156dbbf560e31b81526001600160a01b0383811660048301525f92169063ab6ddfa890602401602060405180830381865afa15801561134d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6c919061376b565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b031633146113b55760405162461bcd60e51b8152600401610c09906136ab565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6009546040805163ad7a672f60e01b815290515f926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b6005546001600160a01b0316331461146f5760405162461bcd60e51b8152600401610c09906136ab565b6011805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a1565b6005546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610c09906136ab565b8061154057600a546001600160a01b03908116908316036115405760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610c09565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146115945760405162461bcd60e51b8152600401610c09906136ab565b601154610100900460ff16156116005760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610c09565b6011805462ffff0019166201010017905543600f8190556116229082906136f4565b60105550565b6005546001600160a01b031633146116525760405162461bcd60e51b8152600401610c09906136ab565b6001600160a01b0382166116a85760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610c09565b6001600160a01b038216301415806116c85750601154610100900460ff16155b6117145760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610c09565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611758573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177c919061376b565b9050611789838383612ef3565b604080516001600160a01b0385168152602081018390527fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e4389101610cbf565b6005546001600160a01b031633146117f25760405162461bcd60e51b8152600401610c09906136ab565b620f42406117ff60025490565b61180a90600161379d565b61181491906137b4565b81101561187f5760405162461bcd60e51b815260206004820152603360248201527f5377617020616d742063616e6e6f74206265206c6f776572207468616e20302e6044820152721818181892903a37ba30b61039bab838363c9760691b6064820152608401610c09565b606461188a60025490565b61189590600161379d565b61189f91906137b4565b8111156119065760405162461bcd60e51b815260206004820152602f60248201527f5377617020616d742063616e6e6f7420626520686967686572207468616e203160448201526e12903a37ba30b61039bab838363c9760891b6064820152608401610c09565b600d55565b6005546001600160a01b031633146119355760405162461bcd60e51b8152600401610c09906136ab565b6001600160a01b0381166119815760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610c09565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a9905f90a250565b606060048054610cdb90613707565b6005546001600160a01b03163314611a035760405162461bcd60e51b8152600401610c09906136ab565b600a546001600160a01b038381169116141580611a1d5750805b611a8f5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c09565b6001600160a01b0382165f908152601f60205260409020805460ff1916821515179055611abc8282612f45565b8015611b1d5760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015611b06575f80fd5b505af1158015611b18573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6005546001600160a01b03163314611b825760405162461bcd60e51b8152600401610c09906136ab565b60148390556013829055601581905580611b9c83856136f4565b611ba691906136f4565b60128190556105dc1015611bfc5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420313525206f72206c657373000000006044820152606401610c09565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508601254604051610cbf91815260200190565b60095460408051631bc9e27b60e21b815290515f926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611cf75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c09565b611d043385858403612153565b5060019392505050565b5f610d683384846123c6565b60095460405163fbcbc0f160e01b81526001600160a01b0383811660048301525f92839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9791906137d3565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611ddc5760405162461bcd60e51b8152600401610c09906136ab565b60095460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef906024016110d7565b6005546001600160a01b03163314611e385760405162461bcd60e51b8152600401610c09906136ab565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b03163314611ec05760405162461bcd60e51b8152600401610c09906136ab565b60095f9054906101000a90046001600160a01b03166001600160a01b031663db2e21bc6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611f0c575f80fd5b505af1158015611f1e573d5f803e3d5ffd5b50505050565b6005546001600160a01b03163314611f4e5760405162461bcd60e51b8152600401610c09906136ab565b60025460088190556040519081527f5c2c6bbd255d68d22e47fbc0e1cbb9e5c5c2892d91144941f6b7f61d3b1c8a55906020016112b4565b6009546040805163039e107b60e61b815290515f926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b6005546001600160a01b03163314611ff75760405162461bcd60e51b8152600401610c09906136ab565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024016110d7565b600954604051635183d6fd60e01b8152600481018390525f9182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611d57565b6005546001600160a01b031633146120935760405162461bcd60e51b8152600401610c09906136ab565b6001600160a01b0381166120f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c09565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166121b55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c09565b6001600160a01b0382166122165760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c09565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661229c5760405162461bcd60e51b8152600401610c0990613838565b6001600160a01b0382166122c25760405162461bcd60e51b8152600401610c099061387d565b6001600160a01b0383165f90815260208190526040902054818110156123365760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220616d7420657863656564732062616c616044820152626e636560e81b6064820152608401610c09565b6001600160a01b038085165f9081526020819052604080822085850390559185168152908120805484929061236c9084906136f4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123b891815260200190565b60405180910390a350505050565b6001600160a01b0383166123ec5760405162461bcd60e51b8152600401610c0990613838565b6001600160a01b0382166124125760405162461bcd60e51b8152600401610c099061387d565b805f0361242457610f6583835f612276565b601154610100900460ff166124b5576001600160a01b0383165f908152601d602052604090205460ff168061247057506001600160a01b0382165f908152601d602052604090205460ff165b6124b55760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c09565b6001600160a01b0383165f908152601d602052604090205460ff16806124f257506001600160a01b0382165f908152601d602052604090205460ff165b806125065750600c54600160a01b900460ff165b1561260557612516838383612276565b6009546001600160a01b031663e30443bc8461253181611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612574575f80fd5b505af1158015612586573d5f803e3d5ffd5b50506009546001600160a01b0316915063e30443bc9050836125a781611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b1580156125ea575f80fd5b505af11580156125fc573d5f803e3d5ffd5b50505050505050565b60115460ff161561281d576005546001600160a01b0384811691161480159061263c57506005546001600160a01b03838116911614155b801561265057506001600160a01b03821615155b801561266757506001600160a01b03821661dead14155b801561268b57506001600160a01b0383165f908152601d602052604090205460ff16155b80156126af57506001600160a01b0382165f908152601d602052604090205460ff16155b1561281d576001600160a01b0383165f908152601f602052604090205460ff1680156126f357506001600160a01b0382165f908152601e602052604090205460ff16155b1561275c5760085461270483611371565b61270e90836136f4565b11156127575760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c09565b61281d565b6001600160a01b0382165f908152601f602052604090205460ff16801561279b57506001600160a01b0383165f908152601e602052604090205460ff16155b61281d576001600160a01b0382165f908152601e602052604090205460ff1661281d576008546127ca83611371565b6127d490836136f4565b111561281d5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c09565b5f61282730611371565b600d5490915081108015908190612846575060115462010000900460ff165b801561285c5750600c54600160a01b900460ff16155b801561287f57506001600160a01b0384165f908152601f602052604090205460ff165b156128ad57600c805460ff60a01b1916600160a01b17905561289f612cdb565b600c805460ff60a01b191690555b6001600160a01b0385165f908152601d602052604090205460019060ff16806128ed57506001600160a01b0385165f908152601d602052604090205460ff165b156128f557505f5b5f8115612bdd576010544310801561292457506001600160a01b0387165f908152601f602052604090205460ff165b801561294857506001600160a01b0386165f908152601f602052604090205460ff16155b801561296c57506001600160a01b0386165f908152601d602052604090205460ff16155b801561297957505f601254115b15612a2d5761271061298d866126ac61379d565b61299791906137b4565b9050601254601354826129aa919061379d565b6129b491906137b4565b601b5f8282546129c491906136f4565b90915550506012546014546129d9908361379d565b6129e391906137b4565b601a5f8282546129f391906136f4565b9091555050601254601554612a08908361379d565b612a1291906137b4565b601c5f828254612a2291906136f4565b90915550612bbf9050565b6001600160a01b0386165f908152601f602052604090205460ff168015612a5557505f601654115b15612ae65761271060165486612a6b919061379d565b612a7591906137b4565b905060165460185482612a88919061379d565b612a9291906137b4565b601b5f828254612aa291906136f4565b9091555050601654601754612ab7908361379d565b612ac191906137b4565b601a5f828254612ad191906136f4565b9091555050601654601954612a08908361379d565b6001600160a01b0387165f908152601f602052604090205460ff168015612b0e57505f601254115b15612bbf5761271060125486612b24919061379d565b612b2e91906137b4565b905060125460145482612b41919061379d565b612b4b91906137b4565b601a5f828254612b5b91906136f4565b9091555050601254601354612b70908361379d565b612b7a91906137b4565b601b5f828254612b8a91906136f4565b9091555050601254601554612b9f908361379d565b612ba991906137b4565b601c5f828254612bb991906136f4565b90915550505b8015612bd057612bd0873083612276565b612bda81866138c0565b94505b612be8878787612276565b6009546001600160a01b031663e30443bc88612c0381611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612c46575f80fd5b505af1158015612c58573d5f803e3d5ffd5b50506009546001600160a01b0316915063e30443bc905087612c7981611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612cbc575f80fd5b505af1158015612cce573d5f803e3d5ffd5b5050505050505050505050565b5f612ce530611371565b90505f601c54601a54601b54612cfb91906136f4565b612d0591906136f4565b9050811580612d12575080155b15612d1b575050565b600d54612d2990600461379d565b821115612d4157600d54612d3e90600461379d565b91505b601b5415612dfe575f81601b5484612d59919061379d565b612d6391906137b4565b600a54909150612d7e9030906001600160a01b031683612276565b600a5f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612dca575f80fd5b505af1925050508015612ddb575060015b50612de681846138c0565b9250601b5482612df691906138c0565b5f601b559150505b8115612eef575f612e0e83612fa7565b601c5415612e87575f8247601c54612e26919061379d565b612e3091906137b4565b6009546040519192506001600160a01b03169082905f81818185875af1925050503d805f8114612e7b576040519150601f19603f3d011682016040523d82523d5f602084013e612e80565b606091505b5090925050505b601a5415612ee457600e546040516001600160a01b039091169047905f81818185875af1925050503d805f8114612ed9576040519150601f19603f3d011682016040523d82523d5f602084013e612ede565b606091505b50909150505b505f601a819055601c555b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f65908490613122565b6001600160a01b0382165f818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612fda57612fda61373f565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613056573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061307a91906138d3565b8160018151811061308d5761308d61373f565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac947906130f19085905f908690309042906004016138ee565b5f604051808303815f87803b158015613108575f80fd5b505af115801561311a573d5f803e3d5ffd5b505050505050565b5f613176826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131f39092919063ffffffff16565b805190915015610f6557808060200190518101906131949190613782565b610f655760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c09565b606061320184845f85613209565b949350505050565b60608247101561326a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c09565b5f80866001600160a01b03168587604051613285919061395d565b5f6040518083038185875af1925050503d805f81146132bf576040519150601f19603f3d011682016040523d82523d5f602084013e6132c4565b606091505b50915091506132d5878383876132e0565b979650505050505050565b6060831561334e5782515f03613347576001600160a01b0385163b6133475760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c09565b5081613201565b61320183838151156133635781518083602001fd5b8060405162461bcd60e51b8152600401610c0991906133c8565b5f805f6060848603121561338f575f80fd5b505081359360208301359350604090920135919050565b5f5b838110156133c05781810151838201526020016133a8565b50505f910152565b602081525f82518060208401526133e68160408501602087016133a6565b601f01601f19169190910160400192915050565b6001600160a01b03811681146111b3575f80fd5b5f806040838503121561341f575f80fd5b823561342a816133fa565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561347557613475613438565b604052919050565b5f67ffffffffffffffff82111561349657613496613438565b5060051b60200190565b5f82601f8301126134af575f80fd5b813560206134c46134bf8361347d565b61344c565b82815260059290921b840181019181810190868411156134e2575f80fd5b8286015b848110156134fd57803583529183019183016134e6565b509695505050505050565b5f8060408385031215613519575f80fd5b823567ffffffffffffffff80821115613530575f80fd5b818501915085601f830112613543575f80fd5b813560206135536134bf8361347d565b82815260059290921b84018101918181019089841115613571575f80fd5b948201945b83861015613598578535613589816133fa565b82529482019490820190613576565b965050860135925050808211156135ad575f80fd5b506135ba858286016134a0565b9150509250929050565b5f805f606084860312156135d6575f80fd5b83356135e1816133fa565b925060208401356135f1816133fa565b929592945050506040919091013590565b5f60208284031215613612575f80fd5b813561361d816133fa565b9392505050565b80151581146111b3575f80fd5b5f8060408385031215613642575f80fd5b823561364d816133fa565b9150602083013561365d81613624565b809150509250929050565b5f60208284031215613678575f80fd5b5035919050565b5f8060408385031215613690575f80fd5b823561369b816133fa565b9150602083013561365d816133fa565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d6c57610d6c6136e0565b600181811c9082168061371b57607f821691505b60208210810361373957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613764576137646136e0565b5060010190565b5f6020828403121561377b575f80fd5b5051919050565b5f60208284031215613792575f80fd5b815161361d81613624565b8082028115828204841417610d6c57610d6c6136e0565b5f826137ce57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f805f805f80610100898b0312156137eb575f80fd5b88516137f6816133fa565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610d6c57610d6c6136e0565b5f602082840312156138e3575f80fd5b815161361d816133fa565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561393c5784516001600160a01b031683529383019391830191600101613917565b50506001600160a01b03969096166060850152505050608001529392505050565b5f825161396e8184602087016133a6565b919091019291505056fea26469706673582212203d1462679fed100e158c571db3a43e3f4e6862bf05c36657de8d670c3b041b3f64736f6c6343000814003360a060405234801561000f575f80fd5b505f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600e556101f46080526080516117d461007a5f395f818161046a0152610a5701526117d45ff3fe6080604052600436106101b2575f3560e01c8063a8b9d240116100e7578063db2e21bc11610087578063e98030c711610062578063e98030c7146104f2578063f2fde38b14610511578063fbcbc0f114610530578063ffb2c4791461054f575f80fd5b8063db2e21bc146104ab578063e30443bc146104bf578063e7841ec0146104de575f80fd5b8063ad7a672f116100c2578063ad7a672f14610425578063bc4c4b371461043a578063be10b61414610459578063c0f306ef1461048c575f80fd5b8063a8b9d240146103a7578063aafd847a146103c6578063ab6ddfa8146103fa575f80fd5b80635183d6fd11610152578063715018a61161012d578063715018a61461033957806385a6b3ae1461034d5780638da5cb5b1461036257806391b89fba14610388575f80fd5b80635183d6fd146102ac5780636a474002146103105780636f2789ec14610324575f80fd5b806327ce01471161018d57806327ce01471461021b5780633009a6091461023a57806331e79db01461024f5780634e7b827f1461026e575f80fd5b806303c83302146101c557806309bbedde146101cd578063226cfa3d146101f0575f80fd5b366101c1576101bf610589565b005b5f80fd5b6101bf610589565b3480156101d8575f80fd5b506007545b6040519081526020015b60405180910390f35b3480156101fb575f80fd5b506101dd61020a36600461158a565b600d6020525f908152604090205481565b348015610226575f80fd5b506101dd61023536600461158a565b61060d565b348015610245575f80fd5b506101dd600b5481565b34801561025a575f80fd5b506101bf61026936600461158a565b61066f565b348015610279575f80fd5b5061029c61028836600461158a565b600c6020525f908152604090205460ff1681565b60405190151581526020016101e7565b3480156102b7575f80fd5b506102cb6102c63660046115a5565b61070d565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101e7565b34801561031b575f80fd5b506101bf610773565b34801561032f575f80fd5b506101dd600e5481565b348015610344575f80fd5b506101bf61077c565b348015610358575f80fd5b506101dd60065481565b34801561036d575f80fd5b505f546040516001600160a01b0390911681526020016101e7565b348015610393575f80fd5b506101dd6103a236600461158a565b6107ed565b3480156103b2575f80fd5b506101dd6103c136600461158a565b6107f3565b3480156103d1575f80fd5b506101dd6103e036600461158a565b6001600160a01b03165f9081526003602052604090205490565b348015610405575f80fd5b506101dd61041436600461158a565b60046020525f908152604090205481565b348015610430575f80fd5b506101dd60055481565b348015610445575f80fd5b5061029c6104543660046115bc565b61081e565b348015610464575f80fd5b506101dd7f000000000000000000000000000000000000000000000000000000000000000081565b348015610497575f80fd5b506101bf6104a636600461158a565b6108c6565b3480156104b6575f80fd5b506101bf61095a565b3480156104ca575f80fd5b506101bf6104d93660046115f7565b610a0d565b3480156104e9575f80fd5b50600b546101dd565b3480156104fd575f80fd5b506101bf61050c3660046115a5565b610ab9565b34801561051c575f80fd5b506101bf61052b36600461158a565b610c20565b34801561053b575f80fd5b506102cb61054a36600461158a565b610d07565b34801561055a575f80fd5b5061056e6105693660046115a5565b610de6565b604080519384526020840192909252908201526060016101e7565b6005541561060b57348015610609576005546105c0906105ad83600160801b610efa565b6105b79190611635565b60015490610f7f565b60015560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26006546106059082610f7f565b6006555b505b565b6001600160a01b0381165f908152600260209081526040808320546004909252822054600154600160801b9261065f9261065a926106549161064f9190610efa565b610fdd565b90610feb565b611025565b6106699190611635565b92915050565b5f546001600160a01b031633146106a15760405162461bcd60e51b815260040161069890611654565b60405180910390fd5b6001600160a01b0381165f908152600c60205260408120805460ff191660011790556106ce908290611036565b6106d7816110ca565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b25905f90a250565b5f805f805f805f8061071e60075490565b891061074157505f96505f19955085945086935083925082915081905080610768565b5f61074b8a6111f5565b905061075681610d07565b98509850985098509850985098509850505b919395975091939597565b61060933611225565b5f546001600160a01b031633146107a55760405162461bcd60e51b815260040161069890611654565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f610669825b6001600160a01b0381165f90815260036020526040812054610669906108188461060d565b90611311565b5f80546001600160a01b031633146108485760405162461bcd60e51b815260040161069890611654565b5f61085284611225565b905080156108bd576001600160a01b0384165f818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906108ab9085815260200190565b60405180910390a36001915050610669565b505f9392505050565b5f546001600160a01b031633146108ef5760405162461bcd60e51b815260040161069890611654565b6001600160a01b0381165f908152600c602052604090205460ff16610912575f80fd5b6001600160a01b0381165f818152600c6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b5f546001600160a01b031633146109835760405162461bcd60e51b815260040161069890611654565b60405173f3d0d7803532fc0f47a80c49a3c51dd044da7e31904790829082156108fc029083905f818181858888f193505050501580156109c5573d5f803e3d5ffd5b50816001600160a01b03167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969582604051610a0191815260200190565b60405180910390a25050565b5f546001600160a01b03163314610a365760405162461bcd60e51b815260040161069890611654565b6001600160a01b0382165f908152600c602052604090205460ff16610ab5577f00000000000000000000000000000000000000000000000000000000000000008110610a9557610a868282611036565b610a908282611352565b610aa8565b610a9f825f611036565b610aa8826110ca565b610ab382600161081e565b505b5050565b5f546001600160a01b03163314610ae25760405162461bcd60e51b815260040161069890611654565b6104b08110158015610af75750620151808111155b610b775760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610698565b600e548103610bee5760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610698565b600e5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f905f90a3600e55565b5f546001600160a01b03163314610c495760405162461bcd60e51b815260040161069890611654565b6001600160a01b038116610cae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610698565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b805f808080808080610d188861140d565b96505f1995505f8712610d7657600b54871115610d4457600b54610d3d90889061144f565b9550610d76565b600b546007545f9110610d57575f610d66565b600b54600754610d6691611311565b9050610d728882610feb565b9650505b610d7f886107f3565b9450610d8a8861060d565b6001600160a01b0389165f908152600d6020526040902054909450925082610db2575f610dc0565b600e54610dc0908490610f7f565b9150428211610dcf575f610dd9565b610dd98242611311565b9050919395975091939597565b6007545f9081908190808203610e06575050600b545f9250829150610ef3565b600b545f805a90505f805b8984108015610e1f57508582105b15610ee25784610e2e81611689565b60075490965086109050610e40575f94505b5f60075f018681548110610e5657610e566116a1565b5f9182526020808320909101546001600160a01b0316808352600d909152604090912054909150610e8690611488565b15610ea957610e9681600161081e565b15610ea95781610ea581611689565b9250505b82610eb381611689565b9350505f5a905080851115610ed957610ed6610ecf8683611311565b8790610f7f565b95505b9350610e119050565b600b85905590975095509193505050505b9193909250565b5f825f03610f0957505f610669565b5f610f1483856116b5565b905082610f218583611635565b14610f785760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610698565b9392505050565b5f80610f8b83856116cc565b905083811015610f785760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610698565b5f8181811215610669575f80fd5b5f80610ff783856116df565b90505f83121580156110095750838112155b8061101d57505f8312801561101d57508381125b610f78575f80fd5b5f80821215611032575f80fd5b5090565b6001600160a01b0382165f9081526004602052604090208054908290558082111561108f575f6110668383611311565b905061107284826114ad565b8060055f82825461108391906116cc565b90915550610ab3915050565b80821015610ab3575f6110a28284611311565b90506110ae8482611505565b8060055f8282546110bf9190611706565b909155505050505050565b6001600160a01b0381165f908152600a602052604090205460ff166110ec5750565b6001600160a01b0381165f908152600a60209081526040808320805460ff1916905560088252808320839055600990915281205460075490919061113290600190611706565b90505f60075f01828154811061114a5761114a6116a1565b5f9182526020808320909101546001600160a01b0390811680845260099092526040808420879055908716835282209190915560078054919250829185908110611196576111966116a1565b5f91825260209091200180546001600160a01b0319166001600160a01b039290921691909117905560078054806111cf576111cf611719565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f60075f01828154811061120b5761120b6116a1565b5f918252602090912001546001600160a01b031692915050565b5f80611230836107f3565b90508015611309576001600160a01b0383165f9081526003602052604090205461125a9082610f7f565b6001600160a01b0384165f81815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906112a89084815260200190565b60405180910390a25f836001600160a01b0316826040515f6040518083038185875af1925050503d805f81146112f9576040519150601f19603f3d011682016040523d82523d5f602084013e6112fe565b606091505b509295945050505050565b505f92915050565b5f610f7883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061153e565b6001600160a01b0382165f908152600a602052604090205460ff161561138e576001600160a01b03919091165f90815260086020526040902055565b6001600160a01b0382165f818152600a60209081526040808320805460ff1916600190811790915560088352818420869055600780546009909452918420839055820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555050565b6001600160a01b0381165f908152600a602052604081205460ff1661143457505f19919050565b506001600160a01b03165f9081526009602052604090205490565b5f8061145b838561172d565b90505f831215801561146d5750838113155b8061101d57505f8312801561101d5750838113610f78575f80fd5b5f4282111561149857505f919050565b600e546114a54284611311565b101592915050565b6114e66114c861064f83600154610efa90919063ffffffff16565b6001600160a01b0384165f908152600260205260409020549061144f565b6001600160a01b039092165f9081526002602052604090209190915550565b6114e661152061064f83600154610efa90919063ffffffff16565b6001600160a01b0384165f9081526002602052604090205490610feb565b5f81848411156115615760405162461bcd60e51b81526004016106989190611753565b505f61156d8486611706565b95945050505050565b6001600160a01b0381168114610609575f80fd5b5f6020828403121561159a575f80fd5b8135610f7881611576565b5f602082840312156115b5575f80fd5b5035919050565b5f80604083850312156115cd575f80fd5b82356115d881611576565b9150602083013580151581146115ec575f80fd5b809150509250929050565b5f8060408385031215611608575f80fd5b823561161381611576565b946020939093013593505050565b634e487b7160e01b5f52601160045260245ffd5b5f8261164f57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f6001820161169a5761169a611621565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b808202811582820484141761066957610669611621565b8082018082111561066957610669611621565b8082018281125f8312801582168215821617156116fe576116fe611621565b505092915050565b8181038181111561066957610669611621565b634e487b7160e01b5f52603160045260245ffd5b8181035f83128015838313168383128216171561174c5761174c611621565b5092915050565b5f6020808352835180828501525f5b8181101561177e57858101830151858201604001528201611762565b505f604082860101526040601f19601f830116850101925050509291505056fea264697066735822122019a03715535dc571578a1b50004c726975d33c6d759b561428ef7e45cd73f46364736f6c634300081400334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106103ed575f3560e01c80638366e79a1161020a578063ae739eb31161011e578063dc07b617116100a8578063e96db1ef11610078578063e96db1ef14610b58578063e98030c714610b6d578063efbf095214610b8c578063f27fd25414610ba1578063f2fde38b14610bc0575f80fd5b8063dc07b61714610ad7578063dd62ed3e14610aeb578063e27a55fe14610b2f578063e7841ec014610b44575f80fd5b8063c0f306ef116100ee578063c0f306ef14610a42578063c6a3064714610a61578063c78d0fa014610a80578063dae6a98214610a95578063db2e21bc14610ac3575f80fd5b8063ae739eb3146109cb578063b5ce2955146109e0578063b62496f5146109ff578063bb81150814610a2d575f80fd5b8063a0a485ca1161019f578063a5ece9411161016f578063a5ece941146108f5578063a9059cbb14610914578063abdb1c1a14610933578063ac1b129d14610952578063ad56c13c14610967575f80fd5b8063a0a485ca1461088e578063a26579ad146108ad578063a2cbba28146108c1578063a457c2d7146108d6575f80fd5b806395d89b41116101da57806395d89b41146108315780639a7a23d6146108455780639cf55183146108645780639e93ad8e14610879575f80fd5b80638366e79a146107b7578063894dc39b146107d65780638da5cb5b146107f5578063906e9dd014610812575f80fd5b806339509351116103015780636ab912061161029657806371778e7d1161026657806371778e7d1461073c578063751039fc146107505780637571336a146107645780637a7a1a5b1461078357806382aa7c6814610798575f80fd5b80636ab91206146106d55780636ddd1713146106ea57806370a0823114610709578063715018a614610728575f80fd5b806358a6d531116102d157806358a6d531146106775780635df6e68e1461068d57806364b0f653146106a25780636843cd84146106b6575f80fd5b80633950935114610611578063452ed4f1146106305780634e71d92d1461064f57806351f205e414610663575f80fd5b80631f3fed8f1161038257806330bb4cff1161035257806330bb4cff14610599578063313ce567146105ad57806331e79db0146105c857806333012411146105e757806333cdacd9146105fc575f80fd5b80631f3fed8f146105275780632307b4411461053c57806323b872dd1461055b5780632c1f52161461057a575f80fd5b806311704f52116103bd57806311704f52146104bd57806318160ddd146104db5780631a8145bb146104f95780631cce34ee1461050e575f80fd5b806305f93650146103f857806306fdde03146104195780630758d92414610443578063095ea7b31461048e575f80fd5b366103f457005b5f80fd5b348015610403575f80fd5b5061041761041236600461337d565b610bdf565b005b348015610424575f80fd5b5061042d610ccc565b60405161043a91906133c8565b60405180910390f35b34801561044e575f80fd5b506104767f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161043a565b348015610499575f80fd5b506104ad6104a836600461340e565b610d5c565b604051901515815260200161043a565b3480156104c8575f80fd5b506011546104ad90610100900460ff1681565b3480156104e6575f80fd5b506002545b60405190815260200161043a565b348015610504575f80fd5b506104eb601b5481565b348015610519575f80fd5b506011546104ad9060ff1681565b348015610532575f80fd5b506104eb601a5481565b348015610547575f80fd5b50610417610556366004613508565b610d72565b348015610566575f80fd5b506104ad6105753660046135c4565b610f6a565b348015610585575f80fd5b50600954610476906001600160a01b031681565b3480156105a4575f80fd5b506104eb61100f565b3480156105b8575f80fd5b506040516012815260200161043a565b3480156105d3575f80fd5b506104176105e2366004613602565b61107f565b3480156105f2575f80fd5b506104eb60145481565b348015610607575f80fd5b506104eb60075481565b34801561061c575f80fd5b506104ad61062b36600461340e565b611107565b34801561063b575f80fd5b50600a54610476906001600160a01b031681565b34801561065a575f80fd5b50610417611142565b34801561066e575f80fd5b506104176111b6565b348015610682575f80fd5b5060105443106104ad565b348015610698575f80fd5b506104eb60125481565b3480156106ad575f80fd5b506104eb6112be565b3480156106c1575f80fd5b506104eb6106d0366004613602565b611305565b3480156106e0575f80fd5b506104eb60185481565b3480156106f5575f80fd5b506011546104ad9062010000900460ff1681565b348015610714575f80fd5b506104eb610723366004613602565b611371565b348015610733575f80fd5b5061041761138b565b348015610747575f80fd5b506104eb6113fe565b34801561075b575f80fd5b50610417611445565b34801561076f575f80fd5b5061041761077e366004613631565b6114a3565b34801561078e575f80fd5b506104eb60155481565b3480156107a3575f80fd5b506104176107b2366004613668565b61156a565b3480156107c2575f80fd5b506104176107d136600461367f565b611628565b3480156107e1575f80fd5b506104176107f0366004613668565b6117c8565b348015610800575f80fd5b506005546001600160a01b0316610476565b34801561081d575f80fd5b5061041761082c366004613602565b61190b565b34801561083c575f80fd5b5061042d6119ca565b348015610850575f80fd5b5061041761085f366004613631565b6119d9565b34801561086f575f80fd5b506104eb600f5481565b348015610884575f80fd5b506104eb61271081565b348015610899575f80fd5b506104176108a836600461337d565b611b58565b3480156108b8575f80fd5b506104eb611c2f565b3480156108cc575f80fd5b506104eb60135481565b3480156108e1575f80fd5b506104ad6108f036600461340e565b611c76565b348015610900575f80fd5b50600e54610476906001600160a01b031681565b34801561091f575f80fd5b506104ad61092e36600461340e565b611d0e565b34801561093e575f80fd5b50600c54610476906001600160a01b031681565b34801561095d575f80fd5b506104eb60065481565b348015610972575f80fd5b50610986610981366004613602565b611d1a565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161043a565b3480156109d6575f80fd5b506104eb601c5481565b3480156109eb575f80fd5b50600b54610476906001600160a01b031681565b348015610a0a575f80fd5b506104ad610a19366004613602565b601f6020525f908152604090205460ff1681565b348015610a38575f80fd5b506104eb60085481565b348015610a4d575f80fd5b50610417610a5c366004613602565b611db2565b348015610a6c575f80fd5b50610417610a7b366004613631565b611e0e565b348015610a8b575f80fd5b506104eb600d5481565b348015610aa0575f80fd5b506104ad610aaf366004613602565b601e6020525f908152604090205460ff1681565b348015610ace575f80fd5b50610417611e96565b348015610ae2575f80fd5b50610417611f24565b348015610af6575f80fd5b506104eb610b0536600461367f565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610b3a575f80fd5b506104eb60165481565b348015610b4f575f80fd5b506104eb611f86565b348015610b63575f80fd5b506104eb60175481565b348015610b78575f80fd5b50610417610b87366004613668565b611fcd565b348015610b97575f80fd5b506104eb60195481565b348015610bac575f80fd5b50610986610bbb366004613668565b612028565b348015610bcb575f80fd5b50610417610bda366004613602565b612069565b6005546001600160a01b03163314610c125760405162461bcd60e51b8152600401610c09906136ab565b60405180910390fd5b60178390556018829055601981905580610c2c83856136f4565b610c3691906136f4565b60168190556109c41015610c8c5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420323525206f72206c657373000000006044820152606401610c09565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97601654604051610cbf91815260200190565b60405180910390a1505050565b606060038054610cdb90613707565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0790613707565b8015610d525780601f10610d2957610100808354040283529160200191610d52565b820191905f5260205f20905b815481529060010190602001808311610d3557829003601f168201915b5050505050905090565b5f610d68338484612153565b5060015b92915050565b6005546001600160a01b03163314610d9c5760405162461bcd60e51b8152600401610c09906136ab565b8051825114610ded5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610c09565b610258825110610e5e5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610c09565b5f5b8251811015610f6557610ea633848381518110610e7f57610e7f61373f565b6020026020010151848481518110610e9957610e9961373f565b6020026020010151612276565b60095483516001600160a01b039091169063e30443bc90859084908110610ecf57610ecf61373f565b6020026020010151610ef9868581518110610eec57610eec61373f565b6020026020010151611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015610f3c575f80fd5b505af1158015610f4e573d5f803e3d5ffd5b505050508080610f5d90613753565b915050610e60565b505050565b5f610f768484846123c6565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610ff75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e7366657220616d74206578636565647320616c6c6f60448201526477616e636560d81b6064820152608401610c09565b6110048533858403612153565b506001949350505050565b600954604080516342d359d760e11b815290515f926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107a919061376b565b905090565b6005546001600160a01b031633146110a95760405162461bcd60e51b8152600401610c09906136ab565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b5f604051808303815f87803b1580156110ee575f80fd5b505af1158015611100573d5f803e3d5ffd5b5050505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610d6891859061113d9086906136f4565b612153565b60095460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af115801561118f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b39190613782565b50565b6005546001600160a01b031633146111e05760405162461bcd60e51b8152600401610c09906136ab565b600d546111ec30611371565b10156112605760405162461bcd60e51b815260206004820152603d60248201527f43616e206f6e6c792073776170207768656e20746f6b656e20616d742069732060448201527f6174206f7220686967686572207468616e207265737472696374696f6e0000006064820152608401610c09565b600c805460ff60a01b1916600160a01b17905561127b612cdb565b600c805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb32906020015b60405180910390a1565b600954604080516304ddf6ef60e11b815290515f926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b60095460405163156dbbf560e31b81526001600160a01b0383811660048301525f92169063ab6ddfa890602401602060405180830381865afa15801561134d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6c919061376b565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b031633146113b55760405162461bcd60e51b8152600401610c09906136ab565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6009546040805163ad7a672f60e01b815290515f926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b6005546001600160a01b0316331461146f5760405162461bcd60e51b8152600401610c09906136ab565b6011805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a1565b6005546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610c09906136ab565b8061154057600a546001600160a01b03908116908316036115405760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610c09565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146115945760405162461bcd60e51b8152600401610c09906136ab565b601154610100900460ff16156116005760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610c09565b6011805462ffff0019166201010017905543600f8190556116229082906136f4565b60105550565b6005546001600160a01b031633146116525760405162461bcd60e51b8152600401610c09906136ab565b6001600160a01b0382166116a85760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610c09565b6001600160a01b038216301415806116c85750601154610100900460ff16155b6117145760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610c09565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611758573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177c919061376b565b9050611789838383612ef3565b604080516001600160a01b0385168152602081018390527fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e4389101610cbf565b6005546001600160a01b031633146117f25760405162461bcd60e51b8152600401610c09906136ab565b620f42406117ff60025490565b61180a90600161379d565b61181491906137b4565b81101561187f5760405162461bcd60e51b815260206004820152603360248201527f5377617020616d742063616e6e6f74206265206c6f776572207468616e20302e6044820152721818181892903a37ba30b61039bab838363c9760691b6064820152608401610c09565b606461188a60025490565b61189590600161379d565b61189f91906137b4565b8111156119065760405162461bcd60e51b815260206004820152602f60248201527f5377617020616d742063616e6e6f7420626520686967686572207468616e203160448201526e12903a37ba30b61039bab838363c9760891b6064820152608401610c09565b600d55565b6005546001600160a01b031633146119355760405162461bcd60e51b8152600401610c09906136ab565b6001600160a01b0381166119815760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610c09565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a9905f90a250565b606060048054610cdb90613707565b6005546001600160a01b03163314611a035760405162461bcd60e51b8152600401610c09906136ab565b600a546001600160a01b038381169116141580611a1d5750805b611a8f5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c09565b6001600160a01b0382165f908152601f60205260409020805460ff1916821515179055611abc8282612f45565b8015611b1d5760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015611b06575f80fd5b505af1158015611b18573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6005546001600160a01b03163314611b825760405162461bcd60e51b8152600401610c09906136ab565b60148390556013829055601581905580611b9c83856136f4565b611ba691906136f4565b60128190556105dc1015611bfc5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420313525206f72206c657373000000006044820152606401610c09565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508601254604051610cbf91815260200190565b60095460408051631bc9e27b60e21b815290515f926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611cf75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c09565b611d043385858403612153565b5060019392505050565b5f610d683384846123c6565b60095460405163fbcbc0f160e01b81526001600160a01b0383811660048301525f92839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9791906137d3565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611ddc5760405162461bcd60e51b8152600401610c09906136ab565b60095460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef906024016110d7565b6005546001600160a01b03163314611e385760405162461bcd60e51b8152600401610c09906136ab565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b03163314611ec05760405162461bcd60e51b8152600401610c09906136ab565b60095f9054906101000a90046001600160a01b03166001600160a01b031663db2e21bc6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611f0c575f80fd5b505af1158015611f1e573d5f803e3d5ffd5b50505050565b6005546001600160a01b03163314611f4e5760405162461bcd60e51b8152600401610c09906136ab565b60025460088190556040519081527f5c2c6bbd255d68d22e47fbc0e1cbb9e5c5c2892d91144941f6b7f61d3b1c8a55906020016112b4565b6009546040805163039e107b60e61b815290515f926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611056573d5f803e3d5ffd5b6005546001600160a01b03163314611ff75760405162461bcd60e51b8152600401610c09906136ab565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024016110d7565b600954604051635183d6fd60e01b8152600481018390525f9182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611d57565b6005546001600160a01b031633146120935760405162461bcd60e51b8152600401610c09906136ab565b6001600160a01b0381166120f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c09565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166121b55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c09565b6001600160a01b0382166122165760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c09565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661229c5760405162461bcd60e51b8152600401610c0990613838565b6001600160a01b0382166122c25760405162461bcd60e51b8152600401610c099061387d565b6001600160a01b0383165f90815260208190526040902054818110156123365760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220616d7420657863656564732062616c616044820152626e636560e81b6064820152608401610c09565b6001600160a01b038085165f9081526020819052604080822085850390559185168152908120805484929061236c9084906136f4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123b891815260200190565b60405180910390a350505050565b6001600160a01b0383166123ec5760405162461bcd60e51b8152600401610c0990613838565b6001600160a01b0382166124125760405162461bcd60e51b8152600401610c099061387d565b805f0361242457610f6583835f612276565b601154610100900460ff166124b5576001600160a01b0383165f908152601d602052604090205460ff168061247057506001600160a01b0382165f908152601d602052604090205460ff165b6124b55760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c09565b6001600160a01b0383165f908152601d602052604090205460ff16806124f257506001600160a01b0382165f908152601d602052604090205460ff165b806125065750600c54600160a01b900460ff165b1561260557612516838383612276565b6009546001600160a01b031663e30443bc8461253181611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612574575f80fd5b505af1158015612586573d5f803e3d5ffd5b50506009546001600160a01b0316915063e30443bc9050836125a781611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b1580156125ea575f80fd5b505af11580156125fc573d5f803e3d5ffd5b50505050505050565b60115460ff161561281d576005546001600160a01b0384811691161480159061263c57506005546001600160a01b03838116911614155b801561265057506001600160a01b03821615155b801561266757506001600160a01b03821661dead14155b801561268b57506001600160a01b0383165f908152601d602052604090205460ff16155b80156126af57506001600160a01b0382165f908152601d602052604090205460ff16155b1561281d576001600160a01b0383165f908152601f602052604090205460ff1680156126f357506001600160a01b0382165f908152601e602052604090205460ff16155b1561275c5760085461270483611371565b61270e90836136f4565b11156127575760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c09565b61281d565b6001600160a01b0382165f908152601f602052604090205460ff16801561279b57506001600160a01b0383165f908152601e602052604090205460ff16155b61281d576001600160a01b0382165f908152601e602052604090205460ff1661281d576008546127ca83611371565b6127d490836136f4565b111561281d5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c09565b5f61282730611371565b600d5490915081108015908190612846575060115462010000900460ff165b801561285c5750600c54600160a01b900460ff16155b801561287f57506001600160a01b0384165f908152601f602052604090205460ff165b156128ad57600c805460ff60a01b1916600160a01b17905561289f612cdb565b600c805460ff60a01b191690555b6001600160a01b0385165f908152601d602052604090205460019060ff16806128ed57506001600160a01b0385165f908152601d602052604090205460ff165b156128f557505f5b5f8115612bdd576010544310801561292457506001600160a01b0387165f908152601f602052604090205460ff165b801561294857506001600160a01b0386165f908152601f602052604090205460ff16155b801561296c57506001600160a01b0386165f908152601d602052604090205460ff16155b801561297957505f601254115b15612a2d5761271061298d866126ac61379d565b61299791906137b4565b9050601254601354826129aa919061379d565b6129b491906137b4565b601b5f8282546129c491906136f4565b90915550506012546014546129d9908361379d565b6129e391906137b4565b601a5f8282546129f391906136f4565b9091555050601254601554612a08908361379d565b612a1291906137b4565b601c5f828254612a2291906136f4565b90915550612bbf9050565b6001600160a01b0386165f908152601f602052604090205460ff168015612a5557505f601654115b15612ae65761271060165486612a6b919061379d565b612a7591906137b4565b905060165460185482612a88919061379d565b612a9291906137b4565b601b5f828254612aa291906136f4565b9091555050601654601754612ab7908361379d565b612ac191906137b4565b601a5f828254612ad191906136f4565b9091555050601654601954612a08908361379d565b6001600160a01b0387165f908152601f602052604090205460ff168015612b0e57505f601254115b15612bbf5761271060125486612b24919061379d565b612b2e91906137b4565b905060125460145482612b41919061379d565b612b4b91906137b4565b601a5f828254612b5b91906136f4565b9091555050601254601354612b70908361379d565b612b7a91906137b4565b601b5f828254612b8a91906136f4565b9091555050601254601554612b9f908361379d565b612ba991906137b4565b601c5f828254612bb991906136f4565b90915550505b8015612bd057612bd0873083612276565b612bda81866138c0565b94505b612be8878787612276565b6009546001600160a01b031663e30443bc88612c0381611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612c46575f80fd5b505af1158015612c58573d5f803e3d5ffd5b50506009546001600160a01b0316915063e30443bc905087612c7981611371565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612cbc575f80fd5b505af1158015612cce573d5f803e3d5ffd5b5050505050505050505050565b5f612ce530611371565b90505f601c54601a54601b54612cfb91906136f4565b612d0591906136f4565b9050811580612d12575080155b15612d1b575050565b600d54612d2990600461379d565b821115612d4157600d54612d3e90600461379d565b91505b601b5415612dfe575f81601b5484612d59919061379d565b612d6391906137b4565b600a54909150612d7e9030906001600160a01b031683612276565b600a5f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612dca575f80fd5b505af1925050508015612ddb575060015b50612de681846138c0565b9250601b5482612df691906138c0565b5f601b559150505b8115612eef575f612e0e83612fa7565b601c5415612e87575f8247601c54612e26919061379d565b612e3091906137b4565b6009546040519192506001600160a01b03169082905f81818185875af1925050503d805f8114612e7b576040519150601f19603f3d011682016040523d82523d5f602084013e612e80565b606091505b5090925050505b601a5415612ee457600e546040516001600160a01b039091169047905f81818185875af1925050503d805f8114612ed9576040519150601f19603f3d011682016040523d82523d5f602084013e612ede565b606091505b50909150505b505f601a819055601c555b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f65908490613122565b6001600160a01b0382165f818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612fda57612fda61373f565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613056573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061307a91906138d3565b8160018151811061308d5761308d61373f565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac947906130f19085905f908690309042906004016138ee565b5f604051808303815f87803b158015613108575f80fd5b505af115801561311a573d5f803e3d5ffd5b505050505050565b5f613176826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131f39092919063ffffffff16565b805190915015610f6557808060200190518101906131949190613782565b610f655760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c09565b606061320184845f85613209565b949350505050565b60608247101561326a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c09565b5f80866001600160a01b03168587604051613285919061395d565b5f6040518083038185875af1925050503d805f81146132bf576040519150601f19603f3d011682016040523d82523d5f602084013e6132c4565b606091505b50915091506132d5878383876132e0565b979650505050505050565b6060831561334e5782515f03613347576001600160a01b0385163b6133475760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c09565b5081613201565b61320183838151156133635781518083602001fd5b8060405162461bcd60e51b8152600401610c0991906133c8565b5f805f6060848603121561338f575f80fd5b505081359360208301359350604090920135919050565b5f5b838110156133c05781810151838201526020016133a8565b50505f910152565b602081525f82518060208401526133e68160408501602087016133a6565b601f01601f19169190910160400192915050565b6001600160a01b03811681146111b3575f80fd5b5f806040838503121561341f575f80fd5b823561342a816133fa565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561347557613475613438565b604052919050565b5f67ffffffffffffffff82111561349657613496613438565b5060051b60200190565b5f82601f8301126134af575f80fd5b813560206134c46134bf8361347d565b61344c565b82815260059290921b840181019181810190868411156134e2575f80fd5b8286015b848110156134fd57803583529183019183016134e6565b509695505050505050565b5f8060408385031215613519575f80fd5b823567ffffffffffffffff80821115613530575f80fd5b818501915085601f830112613543575f80fd5b813560206135536134bf8361347d565b82815260059290921b84018101918181019089841115613571575f80fd5b948201945b83861015613598578535613589816133fa565b82529482019490820190613576565b965050860135925050808211156135ad575f80fd5b506135ba858286016134a0565b9150509250929050565b5f805f606084860312156135d6575f80fd5b83356135e1816133fa565b925060208401356135f1816133fa565b929592945050506040919091013590565b5f60208284031215613612575f80fd5b813561361d816133fa565b9392505050565b80151581146111b3575f80fd5b5f8060408385031215613642575f80fd5b823561364d816133fa565b9150602083013561365d81613624565b809150509250929050565b5f60208284031215613678575f80fd5b5035919050565b5f8060408385031215613690575f80fd5b823561369b816133fa565b9150602083013561365d816133fa565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d6c57610d6c6136e0565b600181811c9082168061371b57607f821691505b60208210810361373957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613764576137646136e0565b5060010190565b5f6020828403121561377b575f80fd5b5051919050565b5f60208284031215613792575f80fd5b815161361d81613624565b8082028115828204841417610d6c57610d6c6136e0565b5f826137ce57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f805f805f80610100898b0312156137eb575f80fd5b88516137f6816133fa565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610d6c57610d6c6136e0565b5f602082840312156138e3575f80fd5b815161361d816133fa565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561393c5784516001600160a01b031683529383019391830191600101613917565b50506001600160a01b03969096166060850152505050608001529392505050565b5f825161396e8184602087016133a6565b919091019291505056fea26469706673582212203d1462679fed100e158c571db3a43e3f4e6862bf05c36657de8d670c3b041b3f64736f6c63430008140033

Deployed Bytecode Sourcemap

39581:17112:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46971:420;;;;;;;;;;-1:-1:-1;46971:420:0;;;;;:::i;:::-;;:::i;:::-;;8583:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39773:37;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1174:32:1;;;1156:51;;1144:2;1129:18;39773:37:0;991:222:1;9491:163:0;;;;;;;;;;-1:-1:-1;9491:163:0;;;;;:::i;:::-;;:::i;:::-;;;1839:14:1;;1832:22;1814:41;;1802:2;1787:18;9491:163:0;1674:187:1;40176:31:0;;;;;;;;;;-1:-1:-1;40176:31:0;;;;;;;;;;;8904:108;;;;;;;;;;-1:-1:-1;8992:12:0;;8904:108;;;2012:25:1;;;2000:2;1985:18;8904:108:0;1866:177:1;40630:33:0;;;;;;;;;;;;;;;;40138:31;;;;;;;;;;-1:-1:-1;40138:31:0;;;;;;;;40590:33;;;;;;;;;;;;;;;;45312:520;;;;;;;;;;-1:-1:-1;45312:520:0;;;;;:::i;:::-;;:::i;9662:443::-;;;;;;;;;;-1:-1:-1;9662:443:0;;;;;:::i;:::-;;:::i;39726:38::-;;;;;;;;;;-1:-1:-1;39726:38:0;;;;-1:-1:-1;;;;;39726:38:0;;;47834:141;;;;;;;;;;;;;:::i;8803:93::-;;;;;;;;;;-1:-1:-1;8803:93:0;;8886:2;5378:36:1;;5366:2;5351:18;8803:93:0;5236:184:1;44083:130:0;;;;;;;;;;-1:-1:-1;44083:130:0;;;;;:::i;:::-;;:::i;40376:30::-;;;;;;;;;;;;;;;;39658:25;;;;;;;;;;;;;;;;10113:215;;;;;;;;;;-1:-1:-1;10113:215:0;;;;;:::i;:::-;;:::i;39817:21::-;;;;;;;;;;-1:-1:-1;39817:21:0;;;;-1:-1:-1;;;;;39817:21:0;;;48778:97;;;;;;;;;;;;;:::i;55426:306::-;;;;;;;;;;;;;:::i;56533:120::-;;;;;;;;;;-1:-1:-1;56627:18:0;;56612:12;:33;56533:120;;40306:26;;;;;;;;;;;;;;;;49127:141;;;;;;;;;;;;;:::i;47980:134::-;;;;;;;;;;-1:-1:-1;47980:134:0;;;;;:::i;:::-;;:::i;40518:31::-;;;;;;;;;;;;;;;;40214;;;;;;;;;;-1:-1:-1;40214:31:0;;;;;;;;;;;9020:127;;;;;;;;;;-1:-1:-1;9020:127:0;;;;;:::i;:::-;;:::i;12496:150::-;;;;;;;;;;;;;:::i;49280:119::-;;;;;;;;;;;;;:::i;44496:113::-;;;;;;;;;;;;;:::i;45844:257::-;;;;;;;;;;-1:-1:-1;45844:257:0;;;;;:::i;:::-;;:::i;40413:24::-;;;;;;;;;;;;;;;;56203:322;;;;;;;;;;-1:-1:-1;56203:322:0;;;;;:::i;:::-;;:::i;55740:457::-;;;;;;;;;;-1:-1:-1;55740:457:0;;;;;:::i;:::-;;:::i;44767:321::-;;;;;;;;;;-1:-1:-1;44767:321:0;;;;;:::i;:::-;;:::i;12282:79::-;;;;;;;;;;-1:-1:-1;12347:6:0;;-1:-1:-1;;;;;12347:6:0;12282:79;;55103:271;;;;;;;;;;-1:-1:-1;55103:271:0;;;;;:::i;:::-;;:::i;8691:104::-;;;;;;;;;;;;;:::i;46109:437::-;;;;;;;;;;-1:-1:-1;46109:437:0;;;;;:::i;:::-;;:::i;40020:35::-;;;;;;;;;;;;;;;;40254:43;;;;;;;;;;;;40292:5;40254:43;;46554:409;;;;;;;;;;-1:-1:-1;46554:409:0;;;;;:::i;:::-;;:::i;47718:108::-;;;;;;;;;;;;;:::i;40339:30::-;;;;;;;;;;;;;;;;10336:413;;;;;;;;;;-1:-1:-1;10336:413:0;;;;;:::i;:::-;;:::i;39980:31::-;;;;;;;;;;-1:-1:-1;39980:31:0;;;;-1:-1:-1;;;;;39980:31:0;;;9155:169;;;;;;;;;;-1:-1:-1;9155:169:0;;;;;:::i;:::-;;:::i;39877:27::-;;;;;;;;;;-1:-1:-1;39877:27:0;;;;-1:-1:-1;;;;;39877:27:0;;;39627:24;;;;;;;;;;;;;;;;48122:318;;;;;;;;;;-1:-1:-1;48122:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7330:32:1;;;7312:51;;7394:2;7379:18;;7372:34;;;;7422:18;;;7415:34;;;;7480:2;7465:18;;7458:34;;;;7523:3;7508:19;;7501:35;7350:3;7552:19;;7545:35;7611:3;7596:19;;7589:35;7655:3;7640:19;;7633:35;7299:3;7284:19;48122:318:0;6973:701:1;40670:27:0;;;;;;;;;;;;;;;;39847:22;;;;;;;;;;-1:-1:-1;39847:22:0;;;;-1:-1:-1;;;;;39847:22:0;;;40839:58;;;;;;;;;;-1:-1:-1;40839:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39690:27;;;;;;;;;;;;;;;;44318:126;;;;;;;;;;-1:-1:-1;44318:126:0;;;;;:::i;:::-;;:::i;47399:179::-;;;;;;;;;;-1:-1:-1;47399:179:0;;;;;:::i;:::-;;:::i;39941:30::-;;;;;;;;;;;;;;;;40769:61;;;;;;;;;;-1:-1:-1;40769:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;48883:102;;;;;;;;;;;;;:::i;44617:142::-;;;;;;;;;;;;;:::i;9332:151::-;;;;;;;;;;-1:-1:-1;9332:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;9448:18:0;;;9421:7;9448:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9332:151;40446:27;;;;;;;;;;;;;;;;48993:126;;;;;;;;;;;;;:::i;40480:31::-;;;;;;;;;;;;;;;;47586:124;;;;;;;;;;-1:-1:-1;47586:124:0;;;;;:::i;:::-;;:::i;40556:25::-;;;;;;;;;;;;;;;;48445:325;;;;;;;;;;-1:-1:-1;48445:325:0;;;;;:::i;:::-;;:::i;12654:244::-;;;;;;;;;;-1:-1:-1;12654:244:0;;;;;:::i;:::-;;:::i;46971:420::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;;;;;;;;;47087:16:::1;:32:::0;;;47130:16:::1;:32:::0;;;47173:10:::1;:20:::0;;;47186:7;47219:35:::1;47149:13:::0;47106;47219:35:::1;:::i;:::-;:48;;;;:::i;:::-;47204:12;:63:::0;;;47302:4:::1;-1:-1:-1::0;47286:20:0::1;47278:61;;;::::0;-1:-1:-1;;;47278:61:0;;8726:2:1;47278:61:0::1;::::0;::::1;8708:21:1::0;8765:2;8745:18;;;8738:30;8804;8784:18;;;8777:58;8852:18;;47278:61:0::1;8524:352:1::0;47278:61:0::1;47355:28;47370:12;;47355:28;;;;2012:25:1::0;;2000:2;1985:18;;1866:177;47355:28:0::1;;;;;;;;46971:420:::0;;;:::o;8583:100::-;8637:13;8670:5;8663:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8583:100;:::o;9491:163::-;9571:4;9588:36;364:10;9611:7;9620:3;9588:8;:36::i;:::-;-1:-1:-1;9642:4:0;9491:163;;;;;:::o;45312:520::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;45451:12:::1;:19;45433:7;:14;:37;45425:80;;;::::0;-1:-1:-1;;;45425:80:0;;9468:2:1;45425:80:0::1;::::0;::::1;9450:21:1::0;9507:2;9487:18;;;9480:30;9546:32;9526:18;;;9519:60;9596:18;;45425:80:0::1;9266:354:1::0;45425:80:0::1;45541:3;45524:7;:14;:20;45516:87;;;::::0;-1:-1:-1;;;45516:87:0;;9827:2:1;45516: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;;45516:87:0::1;9625:418:1::0;45516:87:0::1;45618:9;45614:211;45637:7;:14;45633:1;:18;45614:211;;;45672:56;45688:10;45700:7;45708:1;45700:10;;;;;;;;:::i;:::-;;;;;;;45712:12;45725:1;45712:15;;;;;;;;:::i;:::-;;;;;;;45672;:56::i;:::-;45743:15;::::0;45778:10;;-1:-1:-1;;;;;45743:15:0;;::::1;::::0;:26:::1;::::0;45778:7;;45786:1;;45778:10;::::1;;;;;:::i;:::-;;;;;;;45791:21;45801:7;45809:1;45801:10;;;;;;;;:::i;:::-;;;;;;;45791:9;:21::i;:::-;45743:70;::::0;-1:-1:-1;;;;;;45743:70:0::1;::::0;;;;;;-1:-1:-1;;;;;10388:32:1;;;45743:70:0::1;::::0;::::1;10370:51:1::0;10437:18;;;10430:34;10343:18;;45743:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45653:3;;;;;:::i;:::-;;;;45614:211;;;;45312:520:::0;;:::o;9662:443::-;9765:4;9782:33;9792:6;9800:9;9811:3;9782:9;:33::i;:::-;-1:-1:-1;;;;;9855:19:0;;9828:24;9855:19;;;:11;:19;;;;;;;;364:10;9855:33;;;;;;;;9907:23;;;;9899:73;;;;-1:-1:-1;;;9899:73:0;;10817:2:1;9899: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;;9899:73:0;10615:401:1;9899:73:0;10008:54;10017:6;364:10;10058:3;10039:16;:22;10008:8;:54::i;:::-;-1:-1:-1;10093:4:0;;9662:443;-1:-1:-1;;;;9662:443:0:o;47834:141::-;47924:15;;:43;;;-1:-1:-1;;;47924:43:0;;;;47897:7;;-1:-1:-1;;;;;47924:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47917:50;;47834:141;:::o;44083:130::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;44160:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;44160:45:0;;-1:-1:-1;;;;;1174:32:1;;;44160:45:0::1;::::0;::::1;1156:51:1::0;44160:15:0;;::::1;::::0;:36:::1;::::0;1129:18:1;;44160:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44083:130:::0;:::o;10113:215::-;364:10;10201:4;10250:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10250:34:0;;;;;;;;;;10201:4;;10218:80;;10241:7;;10250:47;;10287:10;;10250:47;:::i;:::-;10218:8;:80::i;48778:97::-;48809:15;;:58;;-1:-1:-1;;;48809:58:0;;48848:10;48809:58;;;11394:51:1;48809:15:0;11461:18:1;;;11454:50;-1:-1:-1;;;;;48809:15:0;;;;:30;;11367:18:1;;48809:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48778:97::o;55426:306::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;55517:15:::1;;55489:24;55507:4;55489:9;:24::i;:::-;:43;;55481:117;;;::::0;-1:-1:-1;;;55481:117:0;;11967:2:1;55481: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;;55481:117:0::1;11765:425:1::0;55481:117:0::1;55609:8;:15:::0;;-1:-1:-1;;;;55609:15:0::1;-1:-1:-1::0;;;55609:15:0::1;::::0;;55635:10:::1;:8;:10::i;:::-;55656:8;:16:::0;;-1:-1:-1;;;;55656:16:0::1;::::0;;55688:36:::1;::::0;55708:15:::1;2012:25:1::0;;55688:36:0::1;::::0;2000:2:1;1985:18;55688:36:0::1;;;;;;;;55426:306::o:0;49127:141::-;49219:15;;:41;;;-1:-1:-1;;;49219:41:0;;;;49192:7;;-1:-1:-1;;;;;49219:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;47980:134;48071:15;;:38;;-1:-1:-1;;;48071:38:0;;-1:-1:-1;;;;;1174:32:1;;;48071:38:0;;;1156:51:1;48050:7:0;;48071:15;;:29;;1129:18:1;;48071:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9020:127::-;-1:-1:-1;;;;;9121:18:0;9094:7;9121:18;;;;;;;;;;;;9020:127::o;12496:150::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;12589:6:::1;::::0;12568:40:::1;::::0;12605:1:::1;::::0;-1:-1:-1;;;;;12589:6:0::1;::::0;12568:40:::1;::::0;12605:1;;12568:40:::1;12619:6;:19:::0;;-1:-1:-1;;;;;;12619:19:0::1;::::0;;12496:150::o;49280:119::-;49361:15;;:30;;;-1:-1:-1;;;49361:30:0;;;;49334:7;;-1:-1:-1;;;;;49361:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;44496:113;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;44550:12:::1;:20:::0;;-1:-1:-1;;44550:20:0::1;::::0;;44586:15:::1;::::0;::::1;::::0;44565:5:::1;::::0;44586:15:::1;44496:113::o:0;45844:257::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;45940:4:::1;45936:104;;45978:6;::::0;-1:-1:-1;;;;;45978:6:0;;::::1;45968:16:::0;;::::1;::::0;45960:68:::1;;;::::0;-1:-1:-1;;;45960:68:0;;12397:2:1;45960: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;;45960:68:0::1;12195:403:1::0;45960:68:0::1;-1:-1:-1::0;;;;;46050:36:0;;;::::1;;::::0;;;:28:::1;:36;::::0;;;;:43;;-1:-1:-1;;46050:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45844:257::o;56203:322::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;56291:11:::1;::::0;::::1;::::0;::::1;;;56290:12;56282:68;;;::::0;-1:-1:-1;;;56282:68:0;;12805:2:1;56282: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;;56282:68:0::1;12603:407:1::0;56282:68:0::1;56361:11;:18:::0;;-1:-1:-1;;56390:18:0;;;;;56438:12:::1;56419:16;:31:::0;;;56482:35:::1;::::0;56501:16;;56482:35:::1;:::i;:::-;56461:18;:56:::0;-1:-1:-1;56203:322:0:o;55740:457::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55837:20:0;::::1;55829:59;;;::::0;-1:-1:-1;;;55829:59:0;;13217:2:1;55829:59:0::1;::::0;::::1;13199:21:1::0;13256:2;13236:18;;;13229:30;13295:28;13275:18;;;13268:56;13341:18;;55829:59:0::1;13015:350:1::0;55829:59:0::1;-1:-1:-1::0;;;;;55907:23:0;::::1;55925:4;55907:23;;::::0;:39:::1;;-1:-1:-1::0;55935:11:0::1;::::0;::::1;::::0;::::1;;;55934:12;55907:39;55899:80;;;::::0;-1:-1:-1;;;55899:80:0;;13572:2:1;55899:80:0::1;::::0;::::1;13554:21:1::0;13611:2;13591:18;;;13584:30;13650;13630:18;;;13623:58;13698:18;;55899:80:0::1;13370:352:1::0;55899:80:0::1;56017:39;::::0;-1:-1:-1;;;56017:39:0;;56050:4:::1;56017:39;::::0;::::1;1156:51:1::0;55990:24:0::1;::::0;-1:-1:-1;;;;;56017:24:0;::::1;::::0;::::1;::::0;1129:18:1;;56017:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55990:66;;56067:60;56097:6;56105:3;56110:16;56067:22;:60::i;:::-;56143:46;::::0;;-1:-1:-1;;;;;10388:32:1;;10370:51;;10452:2;10437:18;;10430:34;;;56143:46:0::1;::::0;10343:18:1;56143:46:0::1;10180:290:1::0;44767:321:0;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;44881:7:::1;44861:13;8992:12:::0;;;8904:108;44861:13:::1;:17;::::0;44877:1:::1;44861:17;:::i;:::-;:27;;;;:::i;:::-;44851:6;:37;;44843:101;;;::::0;-1:-1:-1;;;44843:101:0;;14603:2:1;44843:101:0::1;::::0;::::1;14585:21:1::0;14642:2;14622:18;;;14615:30;14681:34;14661:18;;;14654:62;-1:-1:-1;;;14732:18:1;;;14725:49;14791:19;;44843:101:0::1;14401:415:1::0;44843:101:0::1;44992:3;44972:13;8992:12:::0;;;8904:108;44972:13:::1;:17;::::0;44988:1:::1;44972:17;:::i;:::-;:23;;;;:::i;:::-;44962:6;:33;;44954:93;;;::::0;-1:-1:-1;;;44954:93:0;;15023:2:1;44954:93:0::1;::::0;::::1;15005:21:1::0;15062:2;15042:18;;;15035:30;15101:34;15081:18;;;15074:62;-1:-1:-1;;;15152:18:1;;;15145:45;15207:19;;44954:93:0::1;14821:411:1::0;44954:93:0::1;45057:15;:24:::0;44767:321::o;55103:271::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55197:31:0;::::1;55189:63;;;::::0;-1:-1:-1;;;55189:63:0;;15439:2:1;55189:63:0::1;::::0;::::1;15421:21:1::0;15478:2;15458:18;;;15451:30;-1:-1:-1;;;15497:18:1;;;15490:49;15556:18;;55189:63:0::1;15237:343:1::0;55189:63:0::1;55263:16;:45:::0;;-1:-1:-1;;;;;;55263:45:0::1;-1:-1:-1::0;;;;;55263:45:0;::::1;::::0;;::::1;::::0;;;55324:42:::1;::::0;::::1;::::0;-1:-1:-1;;55324:42:0::1;55103:271:::0;:::o;8691:104::-;8747:13;8780:7;8773:14;;;;;:::i;46109:437::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;46216:6:::1;::::0;-1:-1:-1;;;;;46208:14:0;;::::1;46216:6:::0;::::1;46208:14;;::::0;:23:::1;;;46226:5;46208:23;46200:93;;;::::0;-1:-1:-1;;;46200:93:0;;15787:2:1;46200:93:0::1;::::0;::::1;15769:21:1::0;15826:2;15806:18;;;15799:30;15865:34;15845:18;;;15838:62;15936:27;15916:18;;;15909:55;15981:19;;46200:93:0::1;15585:421:1::0;46200:93:0::1;-1:-1:-1::0;;;;;46304:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;:39;;-1:-1:-1;;46304:39:0::1;::::0;::::1;;;::::0;;46354::::1;46304:31:::0;:39;46354:26:::1;:39::i;:::-;46407:5;46404:79;;;46429:15;::::0;:42:::1;::::0;-1:-1:-1;;;46429:42:0;;-1:-1:-1;;;;;1174:32:1;;;46429:42:0::1;::::0;::::1;1156:51:1::0;46429:15:0;;::::1;::::0;:36:::1;::::0;1129:18:1;;46429:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46404:79;46498:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;46498:40:0;::::1;::::0;::::1;::::0;;;::::1;46109:437:::0;;:::o;46554:409::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;46669:15:::1;:31:::0;;;46711:15:::1;:31:::0;;;46753:9:::1;:19:::0;;;46765:7;46797:33:::1;46729:13:::0;46687;46797:33:::1;:::i;:::-;:45;;;;:::i;:::-;46783:11;:59:::0;;;46876:4:::1;-1:-1:-1::0;46861:19:0::1;46853:60;;;::::0;-1:-1:-1;;;46853:60:0;;16213:2:1;46853:60:0::1;::::0;::::1;16195:21:1::0;16252:2;16232:18;;;16225:30;16291;16271:18;;;16264:58;16339:18;;46853:60:0::1;16011:352:1::0;46853:60:0::1;46929:26;46943:11;;46929:26;;;;2012:25:1::0;;2000:2;1985:18;;1866:177;47718:108:0;47791:15;;:27;;;-1:-1:-1;;;47791:27:0;;;;47764:7;;-1:-1:-1;;;;;47791:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;10336:413;364:10;10429:4;10473:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10473:34:0;;;;;;;;;;10526:35;;;;10518:85;;;;-1:-1:-1;;;10518:85:0;;16570:2:1;10518:85:0;;;16552:21:1;16609:2;16589:18;;;16582:30;16648:34;16628:18;;;16621:62;-1:-1:-1;;;16699:18:1;;;16692:35;16744:19;;10518:85:0;16368:401:1;10518:85:0;10639:67;364:10;10662:7;10690:15;10671:16;:34;10639:8;:67::i;:::-;-1:-1:-1;10737:4:0;;10336:413;-1:-1:-1;;;10336:413:0:o;9155:169::-;9238:4;9255:39;364:10;9279:9;9290:3;9255:9;:39::i;48122:318::-;48397:15;;:35;;-1:-1:-1;;;48397:35:0;;-1:-1:-1;;;;;1174:32:1;;;48397:35:0;;;1156:51:1;48218:7:0;;;;;;;;;;;;;;;;48397:15;;;:26;;1129:18:1;;48397:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48390:42;;;;;;;;;;;;;;;;48122:318;;;;;;;;;:::o;44318:126::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;44393:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;44393:43:0;;-1:-1:-1;;;;;1174:32:1;;;44393:43:0::1;::::0;::::1;1156:51:1::0;44393:15:0;;::::1;::::0;:34:::1;::::0;1129:18:1;;44393:43:0::1;991:222:1::0;47399:179:0;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47483:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;47483:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47537:33;;1814:41:1;;;47537:33:0::1;::::0;1787:18:1;47537:33:0::1;;;;;;;47399:179:::0;;:::o;48883:102::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;48942:15:::1;;;;;;;;;-1:-1:-1::0;;;;;48942:15:0::1;-1:-1:-1::0;;;;;48942:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48883:102::o:0;44617:142::-;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;8992:12;;44674::::1;:28:::0;;;44718:33:::1;::::0;2012:25:1;;;44718:33:0::1;::::0;2000:2:1;1985:18;44718:33:0::1;1866:177:1::0;48993:126:0;49072:15;;:39;;;-1:-1:-1;;;49072:39:0;;;;49048:7;;-1:-1:-1;;;;;49072:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;47586:124;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;47660:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;47660:42:0;;::::1;::::0;::::1;2012:25:1::0;;;-1:-1:-1;;;;;47660:15:0;;::::1;::::0;:31:::1;::::0;1985:18:1;;47660:42:0::1;1866:177:1::0;48445:325:0;48722:15;;:40;;-1:-1:-1;;;48722:40:0;;;;;2012:25:1;;;48546:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48722:15:0;;;;:33;;1985:18:1;;48722:40:0;1866:177:1;12654:244:0;12409:6;;-1:-1:-1;;;;;12409:6:0;364:10;12409:22;12401:67;;;;-1:-1:-1;;;12401:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12743:22:0;::::1;12735:73;;;::::0;-1:-1:-1;;;12735:73:0;;17662:2:1;12735:73:0::1;::::0;::::1;17644:21:1::0;17701:2;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;-1:-1:-1;;;17791:18:1;;;17784:36;17837:19;;12735:73:0::1;17460:402:1::0;12735:73:0::1;12845:6;::::0;12824:38:::1;::::0;-1:-1:-1;;;;;12824:38:0;;::::1;::::0;12845:6:::1;::::0;12824:38:::1;::::0;12845:6:::1;::::0;12824:38:::1;12873:6;:17:::0;;-1:-1:-1;;;;;;12873:17:0::1;-1:-1:-1::0;;;;;12873:17:0;;;::::1;::::0;;;::::1;::::0;;12654:244::o;11614:337::-;-1:-1:-1;;;;;11713:19:0;;11705:68;;;;-1:-1:-1;;;11705:68:0;;18069:2:1;11705:68:0;;;18051:21:1;18108:2;18088:18;;;18081:30;18147:34;18127:18;;;18120:62;-1:-1:-1;;;18198:18:1;;;18191:34;18242:19;;11705:68:0;17867:400:1;11705:68:0;-1:-1:-1;;;;;11792:21:0;;11784:68;;;;-1:-1:-1;;;11784:68:0;;18474:2:1;11784:68:0;;;18456:21:1;18513:2;18493:18;;;18486:30;18552:34;18532:18;;;18525:62;-1:-1:-1;;;18603:18:1;;;18596:32;18645:19;;11784:68:0;18272:398:1;11784:68:0;-1:-1:-1;;;;;11865:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:33;;;11914:29;;2012:25:1;;;11914:29:0;;1985:18:1;11914:29:0;;;;;;;11614:337;;;:::o;10757:562::-;-1:-1:-1;;;;;10860:20:0;;10852:70;;;;-1:-1:-1;;;10852:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10941:23:0;;10933:71;;;;-1:-1:-1;;;10933:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11041:17:0;;11017:21;11041:17;;;;;;;;;;;11077:20;;;;11069:68;;;;-1:-1:-1;;;11069:68:0;;19687:2:1;11069:68:0;;;19669:21:1;19726:2;19706:18;;;19699:30;19765:34;19745:18;;;19738:62;-1:-1:-1;;;19816:18:1;;;19809:33;19859:19;;11069:68:0;19485:399:1;11069:68:0;-1:-1:-1;;;;;11173:17:0;;;:9;:17;;;;;;;;;;;11193:19;;;11173:39;;11234:20;;;;;;;;:27;;11209:3;;11173:9;11234:27;;11209:3;;11234:27;:::i;:::-;;;;;;;;11296:9;-1:-1:-1;;;;;11279:32:0;11288:6;-1:-1:-1;;;;;11279:32:0;;11307:3;11279:32;;;;2012:25:1;;2000:2;1985:18;;1866:177;11279:32:0;;;;;;;;10841:478;10757:562;;;:::o;49411:3788::-;-1:-1:-1;;;;;49508:18:0;;49500:68;;;;-1:-1:-1;;;49500:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49587:16:0;;49579:64;;;;-1:-1:-1;;;49579:64:0;;;;;;;:::i;:::-;49657:3;49664:1;49657:8;49654:88;;49681:28;49697:4;49703:2;49707:1;49681:15;:28::i;49654:88::-;49766:11;;;;;;;49762:128;;-1:-1:-1;;;;;49801:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;49829:22:0;;;;;;:18;:22;;;;;;;;49801:50;49793:85;;;;-1:-1:-1;;;49793:85:0;;20091:2:1;49793:85:0;;;20073:21:1;20130:2;20110:18;;;20103:30;-1:-1:-1;;;20149:18:1;;;20142:52;20211:18;;49793:85:0;19889:346:1;49793:85:0;-1:-1:-1;;;;;49905:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;49933:22:0;;;;;;:18;:22;;;;;;;;49905:50;:62;;;-1:-1:-1;49959:8:0;;-1:-1:-1;;;49959:8:0;;;;49905:62;49902:286;;;49983:30;49999:4;50005:2;50009:3;49983:15;:30::i;:::-;50028:15;;-1:-1:-1;;;;;50028:15:0;:26;50063:4;50070:15;50063:4;50070:9;:15::i;:::-;50028:58;;-1:-1:-1;;;;;;50028:58:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;50028:58:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;50028:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50101:15:0;;-1:-1:-1;;;;;50101:15:0;;-1:-1:-1;50101:26:0;;-1:-1:-1;50136:2:0;50141:13;50136:2;50141:9;:13::i;:::-;50101:54;;-1:-1:-1;;;;;;50101:54:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;50101:54:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;50101:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49411:3788;;;:::o;49902:286::-;50211:12;;;;50208:755;;;12347:6;;-1:-1:-1;;;;;50243:15:0;;;12347:6;;50243:15;;;;:32;;-1:-1:-1;12347:6:0;;-1:-1:-1;;;;;50262:13:0;;;12347:6;;50262:13;;50243:32;:52;;;;-1:-1:-1;;;;;;50279:16:0;;;;50243:52;:77;;;;-1:-1:-1;;;;;;50299:21:0;;50313:6;50299:21;;50243:77;:106;;;;-1:-1:-1;;;;;;50325:24:0;;;;;;:18;:24;;;;;;;;50324:25;50243:106;:133;;;;-1:-1:-1;;;;;;50354:22:0;;;;;;:18;:22;;;;;;;;50353:23;50243:133;50239:713;;;-1:-1:-1;;;;;50428:31:0;;;;;;:25;:31;;;;;;;;:68;;;;-1:-1:-1;;;;;;50464:32:0;;;;;;:28;:32;;;;;;;;50463:33;50428:68;50424:513;;;50552:12;;50535:13;50545:2;50535:9;:13::i;:::-;50529:19;;:3;:19;:::i;:::-;:35;;50521:72;;;;-1:-1:-1;;;50521:72:0;;20442:2:1;50521:72:0;;;20424:21:1;20481:2;20461:18;;;20454:30;-1:-1:-1;;;20500:18:1;;;20493:54;20564:18;;50521:72:0;20240:348:1;50521:72:0;50424:513;;;-1:-1:-1;;;;;50670:29:0;;;;;;:25;:29;;;;;;;;:68;;;;-1:-1:-1;;;;;;50704:34:0;;;;;;:28;:34;;;;;;;;50703:35;50670:68;50666:271;;-1:-1:-1;;;;;50789:32:0;;;;;;:28;:32;;;;;;;;50784:153;;50876:12;;50859:13;50869:2;50859:9;:13::i;:::-;50853:19;;:3;:19;:::i;:::-;:35;;50845:72;;;;-1:-1:-1;;;50845:72:0;;20442:2:1;50845:72:0;;;20424:21:1;20481:2;20461:18;;;20454:30;-1:-1:-1;;;20500:18:1;;;20493:54;20564:18;;50845:72:0;20240:348:1;50845:72:0;50975:28;51006:24;51024:4;51006:9;:24::i;:::-;51090:15;;50975:55;;-1:-1:-1;51066:39:0;;;;;;;51121:22;;-1:-1:-1;51132:11:0;;;;;;;51121:22;:35;;;;-1:-1:-1;51148:8:0;;-1:-1:-1;;;51148:8:0;;;;51147:9;51121:35;:68;;;;-1:-1:-1;;;;;;51160:29:0;;;;;;:25;:29;;;;;;;;51121:68;51118:171;;;51206:8;:15;;-1:-1:-1;;;;51206:15:0;-1:-1:-1;;;51206:15:0;;;51236:10;:8;:10::i;:::-;51261:8;:16;;-1:-1:-1;;;;51261:16:0;;;51118:171;-1:-1:-1;;;;;51419:24:0;;51301:12;51419:24;;;:18;:24;;;;;;51316:4;;51419:24;;;:50;;-1:-1:-1;;;;;;51447:22:0;;;;;;:18;:22;;;;;;;;51419:50;51416:97;;;-1:-1:-1;51496:5:0;51416:97;51533:11;51635:7;51632:1381;;;56627:18;;56612:12;:33;51663:60;;;;-1:-1:-1;;;;;;51692:31:0;;;;;;:25;:31;;;;;;;;51663:60;:94;;;;-1:-1:-1;;;;;;51728:29:0;;;;;;:25;:29;;;;;;;;51727:30;51663:94;:121;;;;-1:-1:-1;;;;;;51762:22:0;;;;;;:18;:22;;;;;;;;51761:23;51663:121;:140;;;;;51802:1;51788:11;;:15;51663:140;51660:1190;;;40292:5;51829:10;:3;51835:4;51829:10;:::i;:::-;:24;;;;:::i;:::-;51823:30;;51915:11;;51897:15;;51891:3;:21;;;;:::i;:::-;:35;;;;:::i;:::-;51869:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;51991:11:0;;51973:15;;51967:21;;:3;:21;:::i;:::-;:35;;;;:::i;:::-;51945:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;52055:11:0;;52043:9;;52037:15;;:3;:15;:::i;:::-;:29;;;;:::i;:::-;52021:12;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;51660:1190:0;;-1:-1:-1;51660:1190:0;;-1:-1:-1;;;;;52129:29:0;;;;;;:25;:29;;;;;;;;:49;;;;;52177:1;52162:12;;:16;52129:49;52125:725;;;40292:5;52210:12;;52204:3;:18;;;;:::i;:::-;:32;;;;:::i;:::-;52198:38;;52302:12;;52283:16;;52277:3;:22;;;;:::i;:::-;:37;;;;:::i;:::-;52255:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52380:12:0;;52361:16;;52355:22;;:3;:22;:::i;:::-;:37;;;;:::i;:::-;52333:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52446:12:0;;52433:10;;52427:16;;:3;:16;:::i;52125:725::-;-1:-1:-1;;;;;52519:31:0;;;;;;:25;:31;;;;;;;;:50;;;;;52568:1;52554:11;;:15;52519:50;52516:334;;;40292:5;52599:11;;52593:3;:17;;;;:::i;:::-;:31;;;;:::i;:::-;52587:37;;52686:11;;52668:15;;52662:3;:21;;;;:::i;:::-;:35;;;;:::i;:::-;52640:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;52759:11:0;;52741:15;;52735:21;;:3;:21;:::i;:::-;:35;;;;:::i;:::-;52713:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;52823:11:0;;52811:9;;52805:15;;:3;:15;:::i;:::-;:29;;;;:::i;:::-;52789:12;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;52516:334:0;52881:7;;52878:91;;52912:41;52928:4;52942;52949:3;52912:15;:41::i;:::-;52991:10;52998:3;52991:10;;:::i;:::-;;;51632:1381;53025:30;53041:4;53047:2;53051:3;53025:15;:30::i;:::-;53068:15;;-1:-1:-1;;;;;53068:15:0;:26;53103:4;53110:15;53103:4;53110:9;:15::i;:::-;53068:58;;-1:-1:-1;;;;;;53068:58:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;53068:58:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;53068:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53137:15:0;;-1:-1:-1;;;;;53137:15:0;;-1:-1:-1;53137:26:0;;-1:-1:-1;53172:2:0;53177:13;53172:2;53177:9;:13::i;:::-;53137:54;;-1:-1:-1;;;;;;53137:54:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;53137:54:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;53137:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49487:3712;;;;49411:3788;;;:::o;53709:1386::-;53750:23;53776:24;53794:4;53776:9;:24::i;:::-;53750:50;;53811:25;53881:12;;53860:18;;53839;;:39;;;;:::i;:::-;:54;;;;:::i;:::-;53811:82;-1:-1:-1;53917:20:0;;;:46;;-1:-1:-1;53941:22:0;;53917:46;53914:60;;;53966:7;;53709:1386::o;53914:60::-;54007:15;;:19;;54025:1;54007:19;:::i;:::-;53989:15;:37;53986:105;;;54060:15;;:19;;54078:1;54060:19;:::i;:::-;54042:37;;53986:105;54114:18;;:22;54111:396;;54152:23;54217:17;54196:18;;54178:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;54280:6;;54152:82;;-1:-1:-1;54249:55:0;;54273:4;;-1:-1:-1;;;;;54280:6:0;54152:82;54249:15;:55::i;:::-;54331:6;;;;;;;;;-1:-1:-1;;;;;54331:6:0;-1:-1:-1;;;;;54323:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54319:37;54370:34;54389:15;54370:34;;:::i;:::-;;;54440:18;;54419:39;;;;;:::i;:::-;54494:1;54473:18;:22;54419:39;-1:-1:-1;;54111:396:0;54530:19;;54527:561;;54565:12;54592:32;54608:15;54592;:32::i;:::-;54642:12;;:16;54639:214;;54678:17;54737;54713:21;54698:12;;:36;;;;:::i;:::-;:56;;;;:::i;:::-;54794:15;;54786:51;;54678:76;;-1:-1:-1;;;;;;54794:15:0;;54678:76;;54786:51;;;;54678:76;54794:15;54786:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54773:64:0;;-1:-1:-1;;;54639:214:0;54872:18;;:22;54869:138;;54935:16;;54927:64;;-1:-1:-1;;;;;54935:16:0;;;;54965:21;;54927:64;;;;54965:21;54935:16;54927:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54914:77:0;;-1:-1:-1;;54869:138:0;-1:-1:-1;55044:1:0;55023:18;:22;;;55060:12;:16;54527:561;53737:1358;;53709:1386::o;6786:211::-;6930:58;;;-1:-1:-1;;;;;10388:32:1;;6930:58:0;;;10370:51:1;10437:18;;;;10430:34;;;6930:58:0;;;;;;;;;;10343:18:1;;;;6930:58:0;;;;;;;;-1:-1:-1;;;;;6930:58:0;-1:-1:-1;;;6930:58:0;;;6903:86;;6923:5;;6903:19;:86::i;45100:204::-;-1:-1:-1;;;;;45188:36:0;;;;;;:28;:36;;;;;;;;;:49;;-1:-1:-1;;45188:49:0;;;;;;;;;;45253:43;;11394:51:1;;;11461:18;;;11454:50;45253:43:0;;11367:18:1;45253:43:0;;;;;;;45100:204;;:::o;53207:494::-;53355:16;;;53369:1;53355:16;;;;;;;;53331:21;;53355:16;;;;;;;;;;-1:-1:-1;53355:16:0;53331:40;;53400:4;53382;53387:1;53382:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;53382:23:0;;;-1:-1:-1;;;;;53382:23:0;;;;;53426:9;-1:-1:-1;;;;;53426:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53416:4;53421:1;53416:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53416:26:0;;;:7;;;;;;;;;:26;53481:212;;-1:-1:-1;;;53481:212:0;;:9;:60;;;;;;:212;;53556:8;;53579:1;;53620:4;;53647;;53667:15;;53481:212;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53258:443;53207:494;:::o;7005:333::-;7086:23;7112:69;7140:4;7112:69;;;;;;;;;;;;;;;;;7120:5;-1:-1:-1;;;;;7112:27:0;;;:69;;;;;:::i;:::-;7196:17;;7086:95;;-1:-1:-1;7196:21:0;7192:139;;7253:10;7242:30;;;;;;;;;;;;:::i;:::-;7234:85;;;;-1:-1:-1;;;7234:85:0;;22668:2:1;7234:85:0;;;22650:21:1;22707:2;22687:18;;;22680:30;22746:34;22726:18;;;22719:62;-1:-1:-1;;;22797:18:1;;;22790:40;22847:19;;7234:85:0;22466:406:1;1289:229:0;1426:12;1458:52;1480:6;1488:4;1494:1;1497:12;1458:21;:52::i;:::-;1451:59;1289:229;-1:-1:-1;;;;1289:229:0:o;2409:455::-;2579:12;2637:5;2612:21;:30;;2604:81;;;;-1:-1:-1;;;2604:81:0;;23079:2:1;2604:81:0;;;23061:21:1;23118:2;23098:18;;;23091:30;23157:34;23137:18;;;23130:62;-1:-1:-1;;;23208:18:1;;;23201:36;23254:19;;2604:81:0;22877:402:1;2604:81:0;2697:12;2711:23;2738:6;-1:-1:-1;;;;;2738:11:0;2757:5;2764:4;2738:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2696:73;;;;2787:69;2814:6;2822:7;2831:10;2843:12;2787:26;:69::i;:::-;2780:76;2409:455;-1:-1:-1;;;;;;;2409:455:0:o;4982:644::-;5167:12;5196:7;5192:427;;;5224:10;:17;5245:1;5224:22;5220:290;;-1:-1:-1;;;;;739:19:0;;;5434:60;;;;-1:-1:-1;;;5434:60:0;;23778:2:1;5434:60:0;;;23760:21:1;23817:2;23797:18;;;23790:30;23856:31;23836:18;;;23829:59;23905:18;;5434:60:0;23576:353:1;5434:60:0;-1:-1:-1;5531:10:0;5524:17;;5192:427;5574:33;5582:10;5594:12;6329:17;;:21;6325:388;;6561:10;6555:17;6618:15;6605:10;6601:2;6597:19;6590:44;6325:388;6688:12;6681:20;;-1:-1:-1;;;6681:20:0;;;;;;;;:::i;14:316:1:-;91:6;99;107;160:2;148:9;139:7;135:23;131:32;128:52;;;176:1;173;166:12;128:52;-1:-1:-1;;199:23:1;;;269:2;254:18;;241:32;;-1:-1:-1;320:2:1;305:18;;;292:32;;14:316;-1:-1:-1;14:316:1:o;335:250::-;420:1;430:113;444:6;441:1;438:13;430:113;;;520:11;;;514:18;501:11;;;494:39;466:2;459:10;430:113;;;-1:-1:-1;;577:1:1;559:16;;552:27;335:250::o;590:396::-;739:2;728:9;721:21;702:4;771:6;765:13;814:6;809:2;798:9;794:18;787:34;830:79;902:6;897:2;886:9;882:18;877:2;869:6;865:15;830:79;:::i;:::-;970:2;949:15;-1:-1:-1;;945:29:1;930:45;;;;977:2;926:54;;590:396;-1:-1:-1;;590:396:1:o;1218:131::-;-1:-1:-1;;;;;1293:31:1;;1283:42;;1273:70;;1339:1;1336;1329:12;1354:315;1422:6;1430;1483:2;1471:9;1462:7;1458:23;1454:32;1451:52;;;1499:1;1496;1489:12;1451:52;1538:9;1525:23;1557:31;1582:5;1557:31;:::i;:::-;1607:5;1659:2;1644:18;;;;1631:32;;-1:-1:-1;;;1354:315:1:o;2048:127::-;2109:10;2104:3;2100:20;2097:1;2090:31;2140:4;2137:1;2130:15;2164:4;2161:1;2154:15;2180:275;2251:2;2245:9;2316:2;2297:13;;-1:-1:-1;;2293:27:1;2281:40;;2351:18;2336:34;;2372:22;;;2333:62;2330:88;;;2398:18;;:::i;:::-;2434:2;2427:22;2180:275;;-1:-1:-1;2180:275:1:o;2460:183::-;2520:4;2553:18;2545:6;2542:30;2539:56;;;2575:18;;:::i;:::-;-1:-1:-1;2620:1:1;2616:14;2632:4;2612:25;;2460:183::o;2648:662::-;2702:5;2755:3;2748:4;2740:6;2736:17;2732:27;2722:55;;2773:1;2770;2763:12;2722:55;2809:6;2796:20;2835:4;2859:60;2875:43;2915:2;2875:43;:::i;:::-;2859:60;:::i;:::-;2953:15;;;3039:1;3035:10;;;;3023:23;;3019:32;;;2984:12;;;;3063:15;;;3060:35;;;3091:1;3088;3081:12;3060:35;3127:2;3119:6;3115:15;3139:142;3155:6;3150:3;3147:15;3139:142;;;3221:17;;3209:30;;3259:12;;;;3172;;3139:142;;;-1:-1:-1;3299:5:1;2648:662;-1:-1:-1;;;;;;2648:662:1:o;3315:1215::-;3433:6;3441;3494:2;3482:9;3473:7;3469:23;3465:32;3462:52;;;3510:1;3507;3500:12;3462:52;3550:9;3537:23;3579:18;3620:2;3612:6;3609:14;3606:34;;;3636:1;3633;3626:12;3606:34;3674:6;3663:9;3659:22;3649:32;;3719:7;3712:4;3708:2;3704:13;3700:27;3690:55;;3741:1;3738;3731:12;3690:55;3777:2;3764:16;3799:4;3823:60;3839:43;3879:2;3839:43;:::i;3823:60::-;3917:15;;;3999:1;3995:10;;;;3987:19;;3983:28;;;3948:12;;;;4023:19;;;4020:39;;;4055:1;4052;4045:12;4020:39;4079:11;;;;4099:217;4115:6;4110:3;4107:15;4099:217;;;4195:3;4182:17;4212:31;4237:5;4212:31;:::i;:::-;4256:18;;4132:12;;;;4294;;;;4099:217;;;4335:5;-1:-1:-1;;4378:18:1;;4365:32;;-1:-1:-1;;4409:16:1;;;4406:36;;;4438:1;4435;4428:12;4406:36;;4461:63;4516:7;4505:8;4494:9;4490:24;4461:63;:::i;:::-;4451:73;;;3315:1215;;;;;:::o;4535:456::-;4612:6;4620;4628;4681:2;4669:9;4660:7;4656:23;4652:32;4649:52;;;4697:1;4694;4687:12;4649:52;4736:9;4723:23;4755:31;4780:5;4755:31;:::i;:::-;4805:5;-1:-1:-1;4862:2:1;4847:18;;4834:32;4875:33;4834:32;4875:33;:::i;:::-;4535:456;;4927:7;;-1:-1:-1;;;4981:2:1;4966:18;;;;4953:32;;4535:456::o;5425:247::-;5484:6;5537:2;5525:9;5516:7;5512:23;5508:32;5505:52;;;5553:1;5550;5543:12;5505:52;5592:9;5579:23;5611:31;5636:5;5611:31;:::i;:::-;5661:5;5425:247;-1:-1:-1;;;5425:247:1:o;5885:118::-;5971:5;5964:13;5957:21;5950:5;5947:32;5937:60;;5993:1;5990;5983:12;6008:382;6073:6;6081;6134:2;6122:9;6113:7;6109:23;6105:32;6102:52;;;6150:1;6147;6140:12;6102:52;6189:9;6176:23;6208:31;6233:5;6208:31;:::i;:::-;6258:5;-1:-1:-1;6315:2:1;6300:18;;6287:32;6328:30;6287:32;6328:30;:::i;:::-;6377:7;6367:17;;;6008:382;;;;;:::o;6395:180::-;6454:6;6507:2;6495:9;6486:7;6482:23;6478:32;6475:52;;;6523:1;6520;6513:12;6475:52;-1:-1:-1;6546:23:1;;6395:180;-1:-1:-1;6395:180:1:o;6580:388::-;6648:6;6656;6709:2;6697:9;6688:7;6684:23;6680:32;6677:52;;;6725:1;6722;6715:12;6677:52;6764:9;6751:23;6783:31;6808:5;6783:31;:::i;:::-;6833:5;-1:-1:-1;6890:2:1;6875:18;;6862:32;6903:33;6862:32;6903: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;16774:681::-;16905:6;16913;16921;16929;16937;16945;16953;16961;17014:3;17002:9;16993:7;16989:23;16985:33;16982:53;;;17031:1;17028;17021:12;16982:53;17063:9;17057:16;17082:31;17107:5;17082:31;:::i;:::-;17132:5;17122:15;;;17177:2;17166:9;17162:18;17156:25;17146:35;;17221:2;17210:9;17206:18;17200:25;17190:35;;17265:2;17254:9;17250:18;17244:25;17234:35;;17309:3;17298:9;17294:19;17288:26;17278:36;;17354:3;17343:9;17339:19;17333:26;17323:36;;17399:3;17388:9;17384:19;17378:26;17368:36;;17444:3;17433:9;17429:19;17423:26;17413:36;;16774:681;;;;;;;;;;;:::o;18675:401::-;18877:2;18859:21;;;18916:2;18896:18;;;18889:30;18955:34;18950:2;18935:18;;18928:62;-1:-1:-1;;;19021:2:1;19006:18;;18999:35;19066:3;19051:19;;18675:401::o;19081:399::-;19283:2;19265:21;;;19322:2;19302:18;;;19295:30;19361:34;19356:2;19341:18;;19334:62;-1:-1:-1;;;19427:2:1;19412:18;;19405:33;19470:3;19455:19;;19081:399::o;20593:128::-;20660:9;;;20681:11;;;20678:37;;;20695:18;;:::i;21225:251::-;21295:6;21348:2;21336:9;21327:7;21323:23;21319:32;21316:52;;;21364:1;21361;21354:12;21316:52;21396:9;21390:16;21415:31;21440:5;21415:31;:::i;21481:980::-;21743:4;21791:3;21780:9;21776:19;21822:6;21811:9;21804:25;21848:2;21886:6;21881:2;21870:9;21866:18;21859:34;21929:3;21924:2;21913:9;21909:18;21902:31;21953:6;21988;21982:13;22019:6;22011;22004:22;22057:3;22046:9;22042:19;22035:26;;22096:2;22088:6;22084:15;22070:29;;22117:1;22127:195;22141:6;22138:1;22135:13;22127:195;;;22206:13;;-1:-1:-1;;;;;22202:39:1;22190:52;;22297:15;;;;22262:12;;;;22238:1;22156:9;22127:195;;;-1:-1:-1;;;;;;;22378:32:1;;;;22373:2;22358:18;;22351:60;-1:-1:-1;;;22442:3:1;22427:19;22420:35;22339:3;21481:980;-1:-1:-1;;;21481:980:1:o;23284:287::-;23413:3;23451:6;23445:13;23467:66;23526:6;23521:3;23514:4;23506:6;23502:17;23467:66;:::i;:::-;23549:16;;;;;23284:287;-1:-1:-1;;23284:287:1:o

Swarm Source

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