Token BUFFDOGE (buffdoge.online)

MEME 
 

Overview [ERC-20]

Max Total Supply:
868,934,483.904480749909158229 BUFFDOGE

Holders:
905 (0.00%)

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

BuffDoge aims to bring unique solidity code to the DeFi space that improves the user's Uniswap experience. BuffDoge is coded to enforce a 5 minute cooldown on buys and sells, eliminating frontrunning bots that are draining ETH.

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BUFFDOGE

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 10: BuffDoge.sol
pragma solidity ^0.8.0;

import './Address.sol';
import './IUniswapV2Factory.sol';
import './IUniswapV2Pair.sol';
import './IUniswapV2Router02.sol';
import './ERC20.sol';

/**
 * @notice ERC20 token with cost basis tracking and restricted loss-taking
 */
contract BUFFDOGE is ERC20 {
  using Address for address payable;

  string public override name = 'BUFFDOGE (buffdoge.online)';
  string public override symbol = 'BUFFDOGE';

  address private constant UNISWAP_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
  address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

  uint private constant SUPPLY = 1e9 ether;

  address private _owner;

  address private _pair;

  uint private _openedAt;
  uint private _closedAt;

  mapping (address => uint) private _basisOf;
  mapping (address => uint) public cooldownOf;

  uint private _initialBasis;

  uint private _ath;
  uint private _athTimestamp;

  struct Minting {
    address recipient;
    uint amount;
  }

  /**
   * @notice deploy
   */
  constructor () payable {
    _owner = msg.sender;

    // setup uniswap pair and store address

    _pair = IUniswapV2Factory(
      IUniswapV2Router02(UNISWAP_ROUTER).factory()
    ).createPair(WETH, address(this));

    // prepare to add liquidity

    _approve(address(this), UNISWAP_ROUTER, SUPPLY);

    // prepare to remove liquidity

    IERC20(_pair).approve(UNISWAP_ROUTER, type(uint).max);
  }

  receive () external payable {}

  /**
   * @notice get cost basis for given address
   * @param account address to query
   * @return cost basis
   */
  function basisOf (
    address account
  ) public view returns (uint) {
    uint basis = _basisOf[account];

    if (basis == 0 && balanceOf(account) > 0) {
      basis = _initialBasis;
    }

    return basis;
  }

  /**
   * @notice mint team tokens prior to opening of trade
   * @param mintings structured minting data (recipient, amount)
   */
  function mint (
    Minting[] calldata mintings
  ) external {
    require(msg.sender == _owner, 'ERR: sender must be owner');
    require(_openedAt == 0, 'ERR: already opened');

    uint mintedSupply;

    for (uint i; i < mintings.length; i++) {
      Minting memory m = mintings[i];
      uint amount = m.amount;
      address recipient = m.recipient;

      mintedSupply += amount;
      _balances[recipient] += amount;
      emit Transfer(address(0), recipient, amount);
    }

    _totalSupply += mintedSupply;
  }

  /**
   * @notice open trading
   * @dev sender must be owner
   * @dev trading must not yet have been opened
   */
  function open () external {
    require(msg.sender == _owner, 'ERR: sender must be owner');
    require(_openedAt == 0, 'ERR: already opened');

    _openedAt = block.timestamp;

    // add liquidity, set initial cost basis

    _mint(address(this), SUPPLY - totalSupply());

    _initialBasis = (1 ether) * address(this).balance / balanceOf(address(this));

    IUniswapV2Router02(
      UNISWAP_ROUTER
    ).addLiquidityETH{
      value: address(this).balance
    }(
      address(this),
      balanceOf(address(this)),
      0,
      0,
      address(this),
      block.timestamp
    );
  }

  /**
   * @notice close trading
   * @dev trading must not yet have been closed
   * @dev minimum time since open must have elapsed
   */
  function close () external {
    require(_openedAt != 0, 'ERR: not yet opened');
    require(_closedAt == 0, 'ERR: already closed');
    require(block.timestamp > _openedAt + (1 days), 'ERR: too soon');

    _closedAt = block.timestamp;

    require(
      block.timestamp > _athTimestamp + (1 weeks),
      'ERR: recent ATH'
    );

    (uint token, ) = IUniswapV2Router02(
      UNISWAP_ROUTER
    ).removeLiquidityETH(
      address(this),
      IERC20(_pair).balanceOf(address(this)),
      0,
      0,
      address(this),
      block.timestamp
    );

    _burn(address(this), token);
  }

  /**
   * @notice exchange BUFFDOGE for proportion of ETH in contract
   * @dev trading must have been closed
   */
  function liquidate () external {
    require(_closedAt > 0, 'ERR: not yet closed');
    
    uint balance = balanceOf(msg.sender);

    require(balance != 0, 'ERR: zero balance');

    uint payout = address(this).balance * balance / totalSupply();

    _burn(msg.sender, balance);
    payable(msg.sender).sendValue(payout);
  }

  /**
   * @notice withdraw remaining ETH from contract
   * @dev trading must have been closed
   * @dev minimum time since close must have elapsed
   */
  function liquidateUnclaimed () external {
    require(_closedAt > 0, 'ERR: not yet closed');
    require(block.timestamp > _closedAt + (12 weeks), 'ERR: too soon');
    payable(_owner).sendValue(address(this).balance);
  }

  function _beforeTokenTransfer (
    address from,
    address to,
    uint amount
  ) override internal {
    super._beforeTokenTransfer(from, to, amount);

    // ignore minting and burning
    if (from == address(0) || to == address(0)) return;

    // ignore add/remove liquidity
    if (from == address(this) || to == address(this)) return;
    if (from == UNISWAP_ROUTER || to == UNISWAP_ROUTER) return;

    require(_openedAt > 0);

    require(
      msg.sender == UNISWAP_ROUTER || msg.sender == _pair,
      'ERR: sender must be uniswap'
    );
    require(amount <= 5e9 ether /* revert message not returned by Uniswap */);

    address[] memory path = new address[](2);

    if (from == _pair) {
      require(cooldownOf[to] < block.timestamp /* revert message not returned by Uniswap */);
      cooldownOf[to] = block.timestamp + (5 minutes);

      path[0] = WETH;
      path[1] = address(this);

      uint[] memory amounts = IUniswapV2Router02(UNISWAP_ROUTER).getAmountsIn(
        amount,
        path
      );

      uint balance = balanceOf(to);
      uint fromBasis = (1 ether) * amounts[0] / amount;
      _basisOf[to] = (fromBasis * amount + basisOf(to) * balance) / (amount + balance);

      if (fromBasis > _ath) {
        _ath = fromBasis;
        _athTimestamp = block.timestamp;
      }
    } else if (to == _pair) {
      // blacklist Vitalik Buterin
      require(from != 0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B /* revert message not returned by Uniswap */);
      require(cooldownOf[from] < block.timestamp /* revert message not returned by Uniswap */);
      cooldownOf[from] = block.timestamp + (5 minutes);

      path[0] = address(this);
      path[1] = WETH;

      uint[] memory amounts = IUniswapV2Router02(UNISWAP_ROUTER).getAmountsOut(
        amount,
        path
      );

      require(basisOf(from) <= (1 ether) * amounts[1] / amount /* revert message not returned by Uniswap */);
    }
  }
}

File 1 of 10: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 10: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 4 of 10: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping (address => uint256) internal _balances;

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

    uint256 internal _totalSupply;

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

File 5 of 10: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 6 of 10: IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 7 of 10: IUniswapV2Factory.sol
pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 8 of 10: IUniswapV2Pair.sol
pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 9 of 10: IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

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

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

File 10 of 10: IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

Contract 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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"basisOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cooldownOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidateUnclaimed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct BUFFDOGE.Minting[]","name":"mintings","type":"tuple[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060400160405280601a81526020017f42554646444f4745202862756666646f67652e6f6e6c696e6529000000000000815250600390805190602001906200005192919062000553565b506040518060400160405280600881526020017f42554646444f4745000000000000000000000000000000000000000000000000815250600490805190602001906200009f92919062000553565b5033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200013c57600080fd5b505afa15801562000151573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000177919062000631565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2306040518363ffffffff1660e01b8152600401620001c79291906200077b565b602060405180830381600087803b158015620001e257600080fd5b505af1158015620001f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021d919062000631565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200029030737a250d5630b4cf539739df2c5dacb4c659f2488d6b033b2e3c9fd0803ce80000006200038060201b60201c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040162000323929190620007a8565b602060405180830381600087803b1580156200033e57600080fd5b505af115801562000353573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037991906200065d565b506200092a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620003f3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ea90620007f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000466576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045d90620007d5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000546919062000819565b60405180910390a3505050565b828054620005619062000891565b90600052602060002090601f016020900481019282620005855760008555620005d1565b82601f10620005a057805160ff1916838001178555620005d1565b82800160010185558215620005d1579182015b82811115620005d0578251825591602001919060010190620005b3565b5b509050620005e09190620005e4565b5090565b5b80821115620005ff576000816000905550600101620005e5565b5090565b6000815190506200061481620008f6565b92915050565b6000815190506200062b8162000910565b92915050565b6000602082840312156200064457600080fd5b6000620006548482850162000603565b91505092915050565b6000602082840312156200067057600080fd5b600062000680848285016200061a565b91505092915050565b620006948162000847565b82525050565b6000620006a960228362000836565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006200071160248362000836565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b620007758162000887565b82525050565b600060408201905062000792600083018562000689565b620007a1602083018462000689565b9392505050565b6000604082019050620007bf600083018562000689565b620007ce60208301846200076a565b9392505050565b60006020820190508181036000830152620007f0816200069a565b9050919050565b60006020820190508181036000830152620008128162000702565b9050919050565b60006020820190506200083060008301846200076a565b92915050565b600082825260208201905092915050565b6000620008548262000867565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620008aa57607f821691505b60208210811415620008c157620008c0620008c7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620009018162000847565b81146200090d57600080fd5b50565b6200091b816200085b565b81146200092757600080fd5b50565b6135bf806200093a6000396000f3fe6080604052600436106100f75760003560e01c80634e7a6a021161008a578063a9059cbb11610059578063a9059cbb14610311578063b33a7a171461034e578063dd62ed3e1461038b578063fcfff16f146103c8576100fe565b80634e7a6a021461024357806370a08231146102805780637e0b4201146102bd57806395d89b41146102e6576100fe565b806328a07025116100c657806328a07025146101d35780632fc01391146101ea578063313ce5671461020157806343d726d61461022c576100fe565b806306fdde0314610103578063095ea7b31461012e57806318160ddd1461016b57806323b872dd14610196576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b506101186103df565b6040516101259190612e9f565b60405180910390f35b34801561013a57600080fd5b50610155600480360381019061015091906124db565b61046d565b6040516101629190612e84565b60405180910390f35b34801561017757600080fd5b5061018061048b565b60405161018d9190613141565b60405180910390f35b3480156101a257600080fd5b506101bd60048036038101906101b8919061248c565b610495565b6040516101ca9190612e84565b60405180910390f35b3480156101df57600080fd5b506101e8610596565b005b3480156101f657600080fd5b506101ff610685565b005b34801561020d57600080fd5b50610216610769565b604051610223919061318c565b60405180910390f35b34801561023857600080fd5b50610241610772565b005b34801561024f57600080fd5b5061026a60048036038101906102659190612427565b610a0d565b6040516102779190613141565b60405180910390f35b34801561028c57600080fd5b506102a760048036038101906102a29190612427565b610a7e565b6040516102b49190613141565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190612517565b610ac6565b005b3480156102f257600080fd5b506102fb610d0d565b6040516103089190612e9f565b60405180910390f35b34801561031d57600080fd5b50610338600480360381019061033391906124db565b610d9b565b6040516103459190612e84565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190612427565b610db9565b6040516103829190613141565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190612450565b610dd1565b6040516103bf9190613141565b60405180910390f35b3480156103d457600080fd5b506103dd610e58565b005b600380546103ec90613413565b80601f016020809104026020016040519081016040528092919081815260200182805461041890613413565b80156104655780601f1061043a57610100808354040283529160200191610465565b820191906000526020600020905b81548152906001019060200180831161044857829003601f168201915b505050505081565b600061048161047a611041565b8484611049565b6001905092915050565b6000600254905090565b60006104a2848484611214565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006104ed611041565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561056d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056490613021565b60405180910390fd5b61058a85610579611041565b85846105859190613345565b611049565b60019150509392505050565b6000600854116105db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d290612f61565b60405180910390fd5b60006105e633610a7e565b9050600081141561062c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062390613061565b60405180910390fd5b600061063661048b565b824761064291906132eb565b61064c91906132ba565b90506106583383611493565b610681813373ffffffffffffffffffffffffffffffffffffffff1661166790919063ffffffff16565b5050565b6000600854116106ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c190612f61565b60405180910390fd5b626ebe006008546106db9190613264565b421161071c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610713906130c1565b60405180910390fd5b61076747600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661166790919063ffffffff16565b565b60006012905090565b600060075414156107b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107af90612fe1565b60405180910390fd5b6000600854146107fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f490612f21565b60405180910390fd5b6201518060075461080e9190613264565b421161084f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610846906130c1565b60405180910390fd5b4260088190555062093a80600d546108679190613264565b42116108a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089f90613101565b60405180910390fd5b6000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff166302751cec30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109369190612e08565b60206040518083038186803b15801561094e57600080fd5b505afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098691906125c6565b60008030426040518763ffffffff1660e01b81526004016109ac96959493929190612e23565b6040805180830381600087803b1580156109c557600080fd5b505af11580156109d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fd91906125ef565b509050610a0a3082611493565b50565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081148015610a6a57506000610a6884610a7e565b115b15610a7557600b5490505b80915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90613041565b60405180910390fd5b600060075414610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9290612fc1565b60405180910390fd5b6000805b83839050811015610cee576000848483818110610be5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060400201803603810190610bfb919061259d565b90506000816020015190506000826000015190508185610c1b9190613264565b9450816000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c6b9190613264565b925050819055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cd09190613141565b60405180910390a35050508080610ce690613445565b915050610b9f565b508060026000828254610d019190613264565b92505081905550505050565b60048054610d1a90613413565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4690613413565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b505050505081565b6000610daf610da8611041565b8484611214565b6001905092915050565b600a6020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613041565b60405180910390fd5b600060075414610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2490612fc1565b60405180910390fd5b42600781905550610f5c30610f4061048b565b6b033b2e3c9fd0803ce8000000610f579190613345565b61175b565b610f6530610a7e565b47670de0b6b3a7640000610f7991906132eb565b610f8391906132ba565b600b81905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7194730610fc430610a7e565b60008030426040518863ffffffff1660e01b8152600401610fea96959493929190612e23565b6060604051808303818588803b15801561100357600080fd5b505af1158015611017573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061103c919061262b565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b0906130e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112090612f01565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112079190613141565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b906130a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90612ec1565b60405180910390fd5b6112ff8383836118af565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c90612f41565b60405180910390fd5b81816113919190613345565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114219190613264565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114859190613141565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90613081565b60405180910390fd5b61150f826000836118af565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90612ee1565b60405180910390fd5b81816115a19190613345565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546115f59190613345565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161165a9190613141565b60405180910390a3505050565b804710156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190612fa1565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516116d090612df3565b60006040518083038185875af1925050503d806000811461170d576040519150601f19603f3d011682016040523d82523d6000602084013e611712565b606091505b5050905080611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90612f81565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613121565b60405180910390fd5b6117d7600083836118af565b80600260008282546117e99190613264565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183e9190613264565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118a39190613141565b60405180910390a35050565b6118ba8383836122b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806119215750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561192b576122b2565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061199057503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561199a576122b2565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611a275750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611a31576122b2565b600060075411611a4057600080fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611adb5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190613001565b60405180910390fd5b6b1027e72f1f12813088000000811115611b3357600080fd5b6000600267ffffffffffffffff811115611b76577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ba45781602001602082028036833780820191505090505b509050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f545742600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611c4857600080fd5b61012c42611c569190613264565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600081518110611ce8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611d5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff16631f00ca7484846040518363ffffffff1660e01b8152600401611de892919061315c565b60006040518083038186803b158015611e0057600080fd5b505afa158015611e14573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e3d919061255c565b90506000611e4a85610a7e565b905060008483600081518110611e89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151670de0b6b3a7640000611ea491906132eb565b611eae91906132ba565b90508185611ebc9190613264565b82611ec688610a0d565b611ed091906132eb565b8683611edc91906132eb565b611ee69190613264565b611ef091906132ba565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c54811115611f4c5780600c8190555042600d819055505b5050506122b0565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122af5773ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ff757600080fd5b42600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061204257600080fd5b61012c426120509190613264565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555030816000815181106120ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612157577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84846040518363ffffffff1660e01b81526004016121e292919061315c565b60006040518083038186803b1580156121fa57600080fd5b505afa15801561220e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612237919061255c565b90508281600181518110612274577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151670de0b6b3a764000061228f91906132eb565b61229991906132ba565b6122a286610a0d565b11156122ad57600080fd5b505b5b505b505050565b505050565b60006122cf6122ca846131d8565b6131a7565b905080838252602082019050828560208602820111156122ee57600080fd5b60005b8581101561231e57816123048882612412565b8452602084019350602083019250506001810190506122f1565b5050509392505050565b6000813590506123378161355b565b92915050565b60008083601f84011261234f57600080fd5b8235905067ffffffffffffffff81111561236857600080fd5b60208301915083604082028301111561238057600080fd5b9250929050565b600082601f83011261239857600080fd5b81516123a88482602086016122bc565b91505092915050565b6000604082840312156123c357600080fd5b6123cd60406131a7565b905060006123dd84828501612328565b60008301525060206123f1848285016123fd565b60208301525092915050565b60008135905061240c81613572565b92915050565b60008151905061242181613572565b92915050565b60006020828403121561243957600080fd5b600061244784828501612328565b91505092915050565b6000806040838503121561246357600080fd5b600061247185828601612328565b925050602061248285828601612328565b9150509250929050565b6000806000606084860312156124a157600080fd5b60006124af86828701612328565b93505060206124c086828701612328565b92505060406124d1868287016123fd565b9150509250925092565b600080604083850312156124ee57600080fd5b60006124fc85828601612328565b925050602061250d858286016123fd565b9150509250929050565b6000806020838503121561252a57600080fd5b600083013567ffffffffffffffff81111561254457600080fd5b6125508582860161233d565b92509250509250929050565b60006020828403121561256e57600080fd5b600082015167ffffffffffffffff81111561258857600080fd5b61259484828501612387565b91505092915050565b6000604082840312156125af57600080fd5b60006125bd848285016123b1565b91505092915050565b6000602082840312156125d857600080fd5b60006125e684828501612412565b91505092915050565b6000806040838503121561260257600080fd5b600061261085828601612412565b925050602061262185828601612412565b9150509250929050565b60008060006060848603121561264057600080fd5b600061264e86828701612412565b935050602061265f86828701612412565b925050604061267086828701612412565b9150509250925092565b60006126868383612692565b60208301905092915050565b61269b81613379565b82525050565b6126aa81613379565b82525050565b60006126bb82613214565b6126c58185613237565b93506126d083613204565b8060005b838110156127015781516126e8888261267a565b97506126f38361322a565b9250506001810190506126d4565b5085935050505092915050565b6127178161338b565b82525050565b612726816133ce565b82525050565b60006127378261321f565b6127418185613253565b93506127518185602086016133e0565b61275a8161354a565b840191505092915050565b6000612772602383613253565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006127d8602283613253565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061283e602283613253565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006128a4601383613253565b91507f4552523a20616c726561647920636c6f736564000000000000000000000000006000830152602082019050919050565b60006128e4602683613253565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061294a601383613253565b91507f4552523a206e6f742079657420636c6f736564000000000000000000000000006000830152602082019050919050565b600061298a603a83613253565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006129f0601d83613253565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b6000612a30601383613253565b91507f4552523a20616c7265616479206f70656e6564000000000000000000000000006000830152602082019050919050565b6000612a70601383613253565b91507f4552523a206e6f7420796574206f70656e6564000000000000000000000000006000830152602082019050919050565b6000612ab0601b83613253565b91507f4552523a2073656e646572206d75737420626520756e697377617000000000006000830152602082019050919050565b6000612af0602883613253565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b56601983613253565b91507f4552523a2073656e646572206d757374206265206f776e6572000000000000006000830152602082019050919050565b6000612b96601183613253565b91507f4552523a207a65726f2062616c616e63650000000000000000000000000000006000830152602082019050919050565b6000612bd6602183613253565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c3c602583613253565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ca2600d83613253565b91507f4552523a20746f6f20736f6f6e000000000000000000000000000000000000006000830152602082019050919050565b6000612ce2600083613248565b9150600082019050919050565b6000612cfc602483613253565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d62600f83613253565b91507f4552523a20726563656e742041544800000000000000000000000000000000006000830152602082019050919050565b6000612da2601f83613253565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b612dde816133b7565b82525050565b612ded816133c1565b82525050565b6000612dfe82612cd5565b9150819050919050565b6000602082019050612e1d60008301846126a1565b92915050565b600060c082019050612e3860008301896126a1565b612e456020830188612dd5565b612e52604083018761271d565b612e5f606083018661271d565b612e6c60808301856126a1565b612e7960a0830184612dd5565b979650505050505050565b6000602082019050612e99600083018461270e565b92915050565b60006020820190508181036000830152612eb9818461272c565b905092915050565b60006020820190508181036000830152612eda81612765565b9050919050565b60006020820190508181036000830152612efa816127cb565b9050919050565b60006020820190508181036000830152612f1a81612831565b9050919050565b60006020820190508181036000830152612f3a81612897565b9050919050565b60006020820190508181036000830152612f5a816128d7565b9050919050565b60006020820190508181036000830152612f7a8161293d565b9050919050565b60006020820190508181036000830152612f9a8161297d565b9050919050565b60006020820190508181036000830152612fba816129e3565b9050919050565b60006020820190508181036000830152612fda81612a23565b9050919050565b60006020820190508181036000830152612ffa81612a63565b9050919050565b6000602082019050818103600083015261301a81612aa3565b9050919050565b6000602082019050818103600083015261303a81612ae3565b9050919050565b6000602082019050818103600083015261305a81612b49565b9050919050565b6000602082019050818103600083015261307a81612b89565b9050919050565b6000602082019050818103600083015261309a81612bc9565b9050919050565b600060208201905081810360008301526130ba81612c2f565b9050919050565b600060208201905081810360008301526130da81612c95565b9050919050565b600060208201905081810360008301526130fa81612cef565b9050919050565b6000602082019050818103600083015261311a81612d55565b9050919050565b6000602082019050818103600083015261313a81612d95565b9050919050565b60006020820190506131566000830184612dd5565b92915050565b60006040820190506131716000830185612dd5565b818103602083015261318381846126b0565b90509392505050565b60006020820190506131a16000830184612de4565b92915050565b6000604051905081810181811067ffffffffffffffff821117156131ce576131cd61351b565b5b8060405250919050565b600067ffffffffffffffff8211156131f3576131f261351b565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061326f826133b7565b915061327a836133b7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132af576132ae61348e565b5b828201905092915050565b60006132c5826133b7565b91506132d0836133b7565b9250826132e0576132df6134bd565b5b828204905092915050565b60006132f6826133b7565b9150613301836133b7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561333a5761333961348e565b5b828202905092915050565b6000613350826133b7565b915061335b836133b7565b92508282101561336e5761336d61348e565b5b828203905092915050565b600061338482613397565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006133d9826133b7565b9050919050565b60005b838110156133fe5780820151818401526020810190506133e3565b8381111561340d576000848401525b50505050565b6000600282049050600182168061342b57607f821691505b6020821081141561343f5761343e6134ec565b5b50919050565b6000613450826133b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134835761348261348e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61356481613379565b811461356f57600080fd5b50565b61357b816133b7565b811461358657600080fd5b5056fea2646970667358221220c2f88279ccfeb78127d33643b06d5553ec59a7eb890b5f9538902b4477f611b164736f6c63430008000033

Deployed ByteCode Sourcemap

266:6669:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;338:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3118:166:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2109:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3751:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4201:338:1;;;;;;;;;;;;;:::i;:::-;;4705:226;;;;;;;;;;;;;:::i;:::-;;1958:91:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3456:618:1;;;;;;;;;;;;;:::i;:::-;;1654:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2273:125:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2021:540:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;401:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2601:172:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;827:43:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2831:149:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2689:617:1;;;;;;;;;;;;;:::i;:::-;;338:58;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3118:166:3:-;3201:4;3217:39;3226:12;:10;:12::i;:::-;3240:7;3249:6;3217:8;:39::i;:::-;3273:4;3266:11;;3118:166;;;;:::o;2109:106::-;2170:7;2196:12;;2189:19;;2109:106;:::o;3751:414::-;3857:4;3873:36;3883:6;3891:9;3902:6;3873:9;:36::i;:::-;3920:24;3947:11;:19;3959:6;3947:19;;;;;;;;;;;;;;;:33;3967:12;:10;:12::i;:::-;3947:33;;;;;;;;;;;;;;;;3920:60;;4018:6;3998:16;:26;;3990:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;4079:57;4088:6;4096:12;:10;:12::i;:::-;4129:6;4110:16;:25;;;;:::i;:::-;4079:8;:57::i;:::-;4154:4;4147:11;;;3751:414;;;;;:::o;4201:338:1:-;4259:1;4247:9;;:13;4239:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;4297:12;4312:21;4322:10;4312:9;:21::i;:::-;4297:36;;4361:1;4350:7;:12;;4342:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4393:11;4441:13;:11;:13::i;:::-;4431:7;4407:21;:31;;;;:::i;:::-;:47;;;;:::i;:::-;4393:61;;4463:26;4469:10;4481:7;4463:5;:26::i;:::-;4496:37;4526:6;4504:10;4496:29;;;;:37;;;;:::i;:::-;4201:338;;:::o;4705:226::-;4772:1;4760:9;;:13;4752:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;4843:8;4830:9;;:22;;;;:::i;:::-;4812:15;:40;4804:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4877:48;4903:21;4885:6;;;;;;;;;;;4877:25;;;;:48;;;;:::i;:::-;4705:226::o;1958:91:3:-;2016:5;2040:2;2033:9;;1958:91;:::o;3456:618:1:-;3511:1;3498:9;;:14;;3490:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3564:1;3551:9;;:14;3543:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3635:6;3622:9;;:20;;;;:::i;:::-;3604:15;:38;3596:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3681:15;3669:9;:27;;;;3756:7;3739:13;;:25;;;;:::i;:::-;3721:15;:43;3705:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;3807:10;492:42;3823:67;;;3907:4;3928:5;;;;;;;;;;;3921:23;;;3953:4;3921:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3968:1;3978;3996:4;4010:15;3823:209;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3806:226;;;4041:27;4055:4;4062:5;4041;:27::i;:::-;3456:618;:::o;1654:224::-;1720:4;1733:10;1746:8;:17;1755:7;1746:17;;;;;;;;;;;;;;;;1733:30;;1785:1;1776:5;:10;:36;;;;;1811:1;1790:18;1800:7;1790:9;:18::i;:::-;:22;1776:36;1772:80;;;1831:13;;1823:21;;1772:80;1867:5;1860:12;;;1654:224;;;:::o;2273:125:3:-;2347:7;2373:9;:18;2383:7;2373:18;;;;;;;;;;;;;;;;2366:25;;2273:125;;;:::o;2021:540:1:-;2113:6;;;;;;;;;;;2099:20;;:10;:20;;;2091:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2177:1;2164:9;;:14;2156:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2211:17;2242:6;2237:282;2254:8;;:15;;2250:1;:19;2237:282;;;2285:16;2304:8;;2313:1;2304:11;;;;;;;;;;;;;;;;;;;;2285:30;;;;;;;;;;:::i;:::-;;;2324:11;2338:1;:8;;;2324:22;;2355:17;2375:1;:11;;;2355:31;;2413:6;2397:22;;;;;:::i;:::-;;;2452:6;2428:9;:20;2438:9;2428:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;2493:9;2472:39;;2489:1;2472:39;;;2504:6;2472:39;;;;;;:::i;:::-;;;;;;;;2237:282;;;2271:3;;;;;:::i;:::-;;;;2237:282;;;;2543:12;2527;;:28;;;;;;;:::i;:::-;;;;;;;;2021:540;;;:::o;401:42::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2601:172:3:-;2687:4;2703:42;2713:12;:10;:12::i;:::-;2727:9;2738:6;2703:9;:42::i;:::-;2762:4;2755:11;;2601:172;;;;:::o;827:43:1:-;;;;;;;;;;;;;;;;;:::o;2831:149:3:-;2920:7;2946:11;:18;2958:5;2946:18;;;;;;;;;;;;;;;:27;2965:7;2946:27;;;;;;;;;;;;;;;;2939:34;;2831:149;;;;:::o;2689:617:1:-;2744:6;;;;;;;;;;;2730:20;;:10;:20;;;2722:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2808:1;2795:9;;:14;2787:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2854:15;2842:9;:27;;;;2926:44;2940:4;2956:13;:11;:13::i;:::-;651:9;2947:22;;;;:::i;:::-;2926:5;:44::i;:::-;3031:24;3049:4;3031:9;:24::i;:::-;3007:21;2996:7;2995:33;;;;:::i;:::-;:60;;;;:::i;:::-;2979:13;:76;;;;492:42;3064:64;;;3144:21;3189:4;3203:24;3221:4;3203:9;:24::i;:::-;3236:1;3246;3264:4;3278:15;3064:236;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2689:617::o;586:96:2:-;639:7;665:10;658:17;;586:96;:::o;7063:340:3:-;7181:1;7164:19;;:5;:19;;;;7156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7261:1;7242:21;;:7;:21;;;;7234:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7343:6;7313:11;:18;7325:5;7313:18;;;;;;;;;;;;;;;:27;7332:7;7313:27;;;;;;;;;;;;;;;:36;;;;7380:7;7364:32;;7373:5;7364:32;;;7389:6;7364:32;;;;;;:::i;:::-;;;;;;;;7063:340;;;:::o;4639:592::-;4762:1;4744:20;;:6;:20;;;;4736:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;4845:1;4824:23;;:9;:23;;;;4816:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4898:47;4919:6;4927:9;4938:6;4898:20;:47::i;:::-;4956:21;4980:9;:17;4990:6;4980:17;;;;;;;;;;;;;;;;4956:41;;5032:6;5015:13;:23;;5007:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;5127:6;5111:13;:22;;;;:::i;:::-;5091:9;:17;5101:6;5091:17;;;;;;;;;;;;;;;:42;;;;5167:6;5143:9;:20;5153:9;5143:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;5206:9;5189:35;;5198:6;5189:35;;;5217:6;5189:35;;;;;;:::i;:::-;;;;;;;;4639:592;;;;:::o;6157:483::-;6259:1;6240:21;;:7;:21;;;;6232:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6310:49;6331:7;6348:1;6352:6;6310:20;:49::i;:::-;6370:22;6395:9;:18;6405:7;6395:18;;;;;;;;;;;;;;;;6370:43;;6449:6;6431:14;:24;;6423:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6542:6;6525:14;:23;;;;:::i;:::-;6504:9;:18;6514:7;6504:18;;;;;;;;;;;;;;;:44;;;;6574:6;6558:12;;:22;;;;;;;:::i;:::-;;;;;;;;6622:1;6596:37;;6605:7;6596:37;;;6626:6;6596:37;;;;;;:::i;:::-;;;;;;;;6157:483;;;:::o;2048:391:0:-;2162:6;2137:21;:31;;2129:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2291:12;2309:9;:14;;2332:6;2309:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2290:54;;;2362:7;2354:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2048:391;;;:::o;5507:330:3:-;5609:1;5590:21;;:7;:21;;;;5582:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;5658:49;5687:1;5691:7;5700:6;5658:20;:49::i;:::-;5734:6;5718:12;;:22;;;;;;;:::i;:::-;;;;;;;;5772:6;5750:9;:18;5760:7;5750:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;5814:7;5793:37;;5810:1;5793:37;;;5823:6;5793:37;;;;;;:::i;:::-;;;;;;;;5507:330;;:::o;4937:1995:1:-;5052:44;5079:4;5085:2;5089:6;5052:26;:44::i;:::-;5160:1;5144:18;;:4;:18;;;:38;;;;5180:1;5166:16;;:2;:16;;;5144:38;5140:51;;;5184:7;;5140:51;5255:4;5239:21;;:4;:21;;;:44;;;;5278:4;5264:19;;:2;:19;;;5239:44;5235:57;;;5285:7;;5235:57;492:42;5302:22;;:4;:22;;;:46;;;;492:42;5328:20;;:2;:20;;;5302:46;5298:59;;;5350:7;;5298:59;5385:1;5373:9;;:13;5365:22;;;;;;492:42;5412:28;;:10;:28;;;:51;;;;5458:5;;;;;;;;;;;5444:19;;:10;:19;;;5412:51;5396:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;5533:9;5523:6;:19;;5515:73;;;;;;5597:21;5635:1;5621:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5597:40;;5658:5;;;;;;;;;;;5650:13;;:4;:13;;;5646:1281;;;5699:15;5682:10;:14;5693:2;5682:14;;;;;;;;;;;;;;;;:32;5674:86;;;;;;5805:9;5786:15;:29;;;;:::i;:::-;5769:10;:14;5780:2;5769:14;;;;;;;;;;;;;;;:46;;;;571:42;5826:4;5831:1;5826:7;;;;;;;;;;;;;;;;;;;;;:14;;;;;;;;;;;5867:4;5849;5854:1;5849:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;5883:21;492:42;5907:47;;;5965:6;5982:4;5907:88;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5883:112;;6006:12;6021:13;6031:2;6021:9;:13::i;:::-;6006:28;;6043:14;6085:6;6072:7;6080:1;6072:10;;;;;;;;;;;;;;;;;;;;;;6061:7;6060:22;;;;:::i;:::-;:31;;;;:::i;:::-;6043:48;;6172:7;6163:6;:16;;;;:::i;:::-;6151:7;6137:11;6145:2;6137:7;:11::i;:::-;:21;;;;:::i;:::-;6128:6;6116:9;:18;;;;:::i;:::-;:42;;;;:::i;:::-;6115:65;;;;:::i;:::-;6100:8;:12;6109:2;6100:12;;;;;;;;;;;;;;;:80;;;;6207:4;;6195:9;:16;6191:101;;;6231:9;6224:4;:16;;;;6267:15;6251:13;:31;;;;6191:101;5646:1281;;;;;;6315:5;;;;;;;;;;;6309:11;;:2;:11;;;6305:622;;;6383:42;6375:50;;:4;:50;;;;6367:104;;;;;;6507:15;6488:10;:16;6499:4;6488:16;;;;;;;;;;;;;;;;:34;6480:88;;;;;;6615:9;6596:15;:29;;;;:::i;:::-;6577:10;:16;6588:4;6577:16;;;;;;;;;;;;;;;:48;;;;6654:4;6636;6641:1;6636:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;571:42;6668:4;6673:1;6668:7;;;;;;;;;;;;;;;;;;;;;:14;;;;;;;;;;;6693:21;492:42;6717:48;;;6776:6;6793:4;6717:89;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6693:113;;6867:6;6854:7;6862:1;6854:10;;;;;;;;;;;;;;;;;;;;;;6843:7;6842:22;;;;:::i;:::-;:31;;;;:::i;:::-;6825:13;6833:4;6825:7;:13::i;:::-;:48;;6817:102;;;;;;6305:622;;5646:1281;4937:1995;;;;;:::o;7990:92:3:-;;;;:::o;24:644:10:-;;156:80;171:64;228:6;171:64;:::i;:::-;156:80;:::i;:::-;147:89;;256:5;284:6;277:5;270:21;310:4;303:5;299:16;292:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;402:1;399;392:12;350:2;430:1;415:247;440:6;437:1;434:13;415:247;;;507:3;535:48;579:3;567:10;535:48;:::i;:::-;530:3;523:61;613:4;608:3;604:14;597:21;;647:4;642:3;638:14;631:21;;475:187;462:1;459;455:9;450:14;;415:247;;;419:14;137:531;;;;;;;:::o;674:139::-;;758:6;745:20;736:29;;774:33;801:5;774:33;:::i;:::-;726:87;;;;:::o;852:393::-;;;1011:3;1004:4;996:6;992:17;988:27;978:2;;1029:1;1026;1019:12;978:2;1065:6;1052:20;1042:30;;1095:18;1087:6;1084:30;1081:2;;;1127:1;1124;1117:12;1081:2;1164:4;1156:6;1152:17;1140:29;;1218:3;1210:4;1202:6;1198:17;1188:8;1184:32;1181:41;1178:2;;;1235:1;1232;1225:12;1178:2;968:277;;;;;:::o;1268:318::-;;1399:3;1392:4;1384:6;1380:17;1376:27;1366:2;;1417:1;1414;1407:12;1366:2;1450:6;1444:13;1475:105;1576:3;1568:6;1561:4;1553:6;1549:17;1475:105;:::i;:::-;1466:114;;1356:230;;;;;:::o;1623:512::-;;1740:4;1728:9;1723:3;1719:19;1715:30;1712:2;;;1758:1;1755;1748:12;1712:2;1780:20;1795:4;1780:20;:::i;:::-;1771:29;;1864:1;1904:49;1949:3;1940:6;1929:9;1925:22;1904:49;:::i;:::-;1897:4;1890:5;1886:16;1879:75;1810:155;2026:2;2067:49;2112:3;2103:6;2092:9;2088:22;2067:49;:::i;:::-;2060:4;2053:5;2049:16;2042:75;1975:153;1702:433;;;;:::o;2141:139::-;;2225:6;2212:20;2203:29;;2241:33;2268:5;2241:33;:::i;:::-;2193:87;;;;:::o;2286:143::-;;2374:6;2368:13;2359:22;;2390:33;2417:5;2390:33;:::i;:::-;2349:80;;;;:::o;2435:262::-;;2543:2;2531:9;2522:7;2518:23;2514:32;2511:2;;;2559:1;2556;2549:12;2511:2;2602:1;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2573:117;2501:196;;;;:::o;2703:407::-;;;2828:2;2816:9;2807:7;2803:23;2799:32;2796:2;;;2844:1;2841;2834:12;2796:2;2887:1;2912:53;2957:7;2948:6;2937:9;2933:22;2912:53;:::i;:::-;2902:63;;2858:117;3014:2;3040:53;3085:7;3076:6;3065:9;3061:22;3040:53;:::i;:::-;3030:63;;2985:118;2786:324;;;;;:::o;3116:552::-;;;;3258:2;3246:9;3237:7;3233:23;3229:32;3226:2;;;3274:1;3271;3264:12;3226:2;3317:1;3342:53;3387:7;3378:6;3367:9;3363:22;3342:53;:::i;:::-;3332:63;;3288:117;3444:2;3470:53;3515:7;3506:6;3495:9;3491:22;3470:53;:::i;:::-;3460:63;;3415:118;3572:2;3598:53;3643:7;3634:6;3623:9;3619:22;3598:53;:::i;:::-;3588:63;;3543:118;3216:452;;;;;:::o;3674:407::-;;;3799:2;3787:9;3778:7;3774:23;3770:32;3767:2;;;3815:1;3812;3805:12;3767:2;3858:1;3883:53;3928:7;3919:6;3908:9;3904:22;3883:53;:::i;:::-;3873:63;;3829:117;3985:2;4011:53;4056:7;4047:6;4036:9;4032:22;4011:53;:::i;:::-;4001:63;;3956:118;3757:324;;;;;:::o;4087:477::-;;;4256:2;4244:9;4235:7;4231:23;4227:32;4224:2;;;4272:1;4269;4262:12;4224:2;4343:1;4332:9;4328:17;4315:31;4373:18;4365:6;4362:30;4359:2;;;4405:1;4402;4395:12;4359:2;4441:106;4539:7;4530:6;4519:9;4515:22;4441:106;:::i;:::-;4423:124;;;;4286:271;4214:350;;;;;:::o;4570:420::-;;4714:2;4702:9;4693:7;4689:23;4685:32;4682:2;;;4730:1;4727;4720:12;4682:2;4794:1;4783:9;4779:17;4773:24;4824:18;4816:6;4813:30;4810:2;;;4856:1;4853;4846:12;4810:2;4884:89;4965:7;4956:6;4945:9;4941:22;4884:89;:::i;:::-;4874:99;;4744:239;4672:318;;;;:::o;4996:310::-;;5128:2;5116:9;5107:7;5103:23;5099:32;5096:2;;;5144:1;5141;5134:12;5096:2;5187:1;5212:77;5281:7;5272:6;5261:9;5257:22;5212:77;:::i;:::-;5202:87;;5158:141;5086:220;;;;:::o;5312:284::-;;5431:2;5419:9;5410:7;5406:23;5402:32;5399:2;;;5447:1;5444;5437:12;5399:2;5490:1;5515:64;5571:7;5562:6;5551:9;5547:22;5515:64;:::i;:::-;5505:74;;5461:128;5389:207;;;;:::o;5602:440::-;;;5738:2;5726:9;5717:7;5713:23;5709:32;5706:2;;;5754:1;5751;5744:12;5706:2;5797:1;5822:64;5878:7;5869:6;5858:9;5854:22;5822:64;:::i;:::-;5812:74;;5768:128;5935:2;5961:64;6017:7;6008:6;5997:9;5993:22;5961:64;:::i;:::-;5951:74;;5906:129;5696:346;;;;;:::o;6048:596::-;;;;6201:2;6189:9;6180:7;6176:23;6172:32;6169:2;;;6217:1;6214;6207:12;6169:2;6260:1;6285:64;6341:7;6332:6;6321:9;6317:22;6285:64;:::i;:::-;6275:74;;6231:128;6398:2;6424:64;6480:7;6471:6;6460:9;6456:22;6424:64;:::i;:::-;6414:74;;6369:129;6537:2;6563:64;6619:7;6610:6;6599:9;6595:22;6563:64;:::i;:::-;6553:74;;6508:129;6159:485;;;;;:::o;6650:179::-;;6740:46;6782:3;6774:6;6740:46;:::i;:::-;6818:4;6813:3;6809:14;6795:28;;6730:99;;;;:::o;6835:108::-;6912:24;6930:5;6912:24;:::i;:::-;6907:3;6900:37;6890:53;;:::o;6949:118::-;7036:24;7054:5;7036:24;:::i;:::-;7031:3;7024:37;7014:53;;:::o;7103:732::-;;7251:54;7299:5;7251:54;:::i;:::-;7321:86;7400:6;7395:3;7321:86;:::i;:::-;7314:93;;7431:56;7481:5;7431:56;:::i;:::-;7510:7;7541:1;7526:284;7551:6;7548:1;7545:13;7526:284;;;7627:6;7621:13;7654:63;7713:3;7698:13;7654:63;:::i;:::-;7647:70;;7740:60;7793:6;7740:60;:::i;:::-;7730:70;;7586:224;7573:1;7570;7566:9;7561:14;;7526:284;;;7530:14;7826:3;7819:10;;7227:608;;;;;;;:::o;7841:109::-;7922:21;7937:5;7922:21;:::i;:::-;7917:3;7910:34;7900:50;;:::o;7956:147::-;8051:45;8090:5;8051:45;:::i;:::-;8046:3;8039:58;8029:74;;:::o;8109:364::-;;8225:39;8258:5;8225:39;:::i;:::-;8280:71;8344:6;8339:3;8280:71;:::i;:::-;8273:78;;8360:52;8405:6;8400:3;8393:4;8386:5;8382:16;8360:52;:::i;:::-;8437:29;8459:6;8437:29;:::i;:::-;8432:3;8428:39;8421:46;;8201:272;;;;;:::o;8479:367::-;;8642:67;8706:2;8701:3;8642:67;:::i;:::-;8635:74;;8739:34;8735:1;8730:3;8726:11;8719:55;8805:5;8800:2;8795:3;8791:12;8784:27;8837:2;8832:3;8828:12;8821:19;;8625:221;;;:::o;8852:366::-;;9015:67;9079:2;9074:3;9015:67;:::i;:::-;9008:74;;9112:34;9108:1;9103:3;9099:11;9092:55;9178:4;9173:2;9168:3;9164:12;9157:26;9209:2;9204:3;9200:12;9193:19;;8998:220;;;:::o;9224:366::-;;9387:67;9451:2;9446:3;9387:67;:::i;:::-;9380:74;;9484:34;9480:1;9475:3;9471:11;9464:55;9550:4;9545:2;9540:3;9536:12;9529:26;9581:2;9576:3;9572:12;9565:19;;9370:220;;;:::o;9596:317::-;;9759:67;9823:2;9818:3;9759:67;:::i;:::-;9752:74;;9856:21;9852:1;9847:3;9843:11;9836:42;9904:2;9899:3;9895:12;9888:19;;9742:171;;;:::o;9919:370::-;;10082:67;10146:2;10141:3;10082:67;:::i;:::-;10075:74;;10179:34;10175:1;10170:3;10166:11;10159:55;10245:8;10240:2;10235:3;10231:12;10224:30;10280:2;10275:3;10271:12;10264:19;;10065:224;;;:::o;10295:317::-;;10458:67;10522:2;10517:3;10458:67;:::i;:::-;10451:74;;10555:21;10551:1;10546:3;10542:11;10535:42;10603:2;10598:3;10594:12;10587:19;;10441:171;;;:::o;10618:390::-;;10781:67;10845:2;10840:3;10781:67;:::i;:::-;10774:74;;10878:34;10874:1;10869:3;10865:11;10858:55;10944:28;10939:2;10934:3;10930:12;10923:50;10999:2;10994:3;10990:12;10983:19;;10764:244;;;:::o;11014:327::-;;11177:67;11241:2;11236:3;11177:67;:::i;:::-;11170:74;;11274:31;11270:1;11265:3;11261:11;11254:52;11332:2;11327:3;11323:12;11316:19;;11160:181;;;:::o;11347:317::-;;11510:67;11574:2;11569:3;11510:67;:::i;:::-;11503:74;;11607:21;11603:1;11598:3;11594:11;11587:42;11655:2;11650:3;11646:12;11639:19;;11493:171;;;:::o;11670:317::-;;11833:67;11897:2;11892:3;11833:67;:::i;:::-;11826:74;;11930:21;11926:1;11921:3;11917:11;11910:42;11978:2;11973:3;11969:12;11962:19;;11816:171;;;:::o;11993:325::-;;12156:67;12220:2;12215:3;12156:67;:::i;:::-;12149:74;;12253:29;12249:1;12244:3;12240:11;12233:50;12309:2;12304:3;12300:12;12293:19;;12139:179;;;:::o;12324:372::-;;12487:67;12551:2;12546:3;12487:67;:::i;:::-;12480:74;;12584:34;12580:1;12575:3;12571:11;12564:55;12650:10;12645:2;12640:3;12636:12;12629:32;12687:2;12682:3;12678:12;12671:19;;12470:226;;;:::o;12702:323::-;;12865:67;12929:2;12924:3;12865:67;:::i;:::-;12858:74;;12962:27;12958:1;12953:3;12949:11;12942:48;13016:2;13011:3;13007:12;13000:19;;12848:177;;;:::o;13031:315::-;;13194:67;13258:2;13253:3;13194:67;:::i;:::-;13187:74;;13291:19;13287:1;13282:3;13278:11;13271:40;13337:2;13332:3;13328:12;13321:19;;13177:169;;;:::o;13352:365::-;;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13612:34;13608:1;13603:3;13599:11;13592:55;13678:3;13673:2;13668:3;13664:12;13657:25;13708:2;13703:3;13699:12;13692:19;;13498:219;;;:::o;13723:369::-;;13886:67;13950:2;13945:3;13886:67;:::i;:::-;13879:74;;13983:34;13979:1;13974:3;13970:11;13963:55;14049:7;14044:2;14039:3;14035:12;14028:29;14083:2;14078:3;14074:12;14067:19;;13869:223;;;:::o;14098:311::-;;14261:67;14325:2;14320:3;14261:67;:::i;:::-;14254:74;;14358:15;14354:1;14349:3;14345:11;14338:36;14400:2;14395:3;14391:12;14384:19;;14244:165;;;:::o;14415:297::-;;14595:83;14676:1;14671:3;14595:83;:::i;:::-;14588:90;;14704:1;14699:3;14695:11;14688:18;;14578:134;;;:::o;14718:368::-;;14881:67;14945:2;14940:3;14881:67;:::i;:::-;14874:74;;14978:34;14974:1;14969:3;14965:11;14958:55;15044:6;15039:2;15034:3;15030:12;15023:28;15077:2;15072:3;15068:12;15061:19;;14864:222;;;:::o;15092:313::-;;15255:67;15319:2;15314:3;15255:67;:::i;:::-;15248:74;;15352:17;15348:1;15343:3;15339:11;15332:38;15396:2;15391:3;15387:12;15380:19;;15238:167;;;:::o;15411:329::-;;15574:67;15638:2;15633:3;15574:67;:::i;:::-;15567:74;;15671:33;15667:1;15662:3;15658:11;15651:54;15731:2;15726:3;15722:12;15715:19;;15557:183;;;:::o;15746:118::-;15833:24;15851:5;15833:24;:::i;:::-;15828:3;15821:37;15811:53;;:::o;15870:112::-;15953:22;15969:5;15953:22;:::i;:::-;15948:3;15941:35;15931:51;;:::o;15988:379::-;;16194:147;16337:3;16194:147;:::i;:::-;16187:154;;16358:3;16351:10;;16176:191;;;:::o;16373:222::-;;16504:2;16493:9;16489:18;16481:26;;16517:71;16585:1;16574:9;16570:17;16561:6;16517:71;:::i;:::-;16471:124;;;;:::o;16601:807::-;;16888:3;16877:9;16873:19;16865:27;;16902:71;16970:1;16959:9;16955:17;16946:6;16902:71;:::i;:::-;16983:72;17051:2;17040:9;17036:18;17027:6;16983:72;:::i;:::-;17065:80;17141:2;17130:9;17126:18;17117:6;17065:80;:::i;:::-;17155;17231:2;17220:9;17216:18;17207:6;17155:80;:::i;:::-;17245:73;17313:3;17302:9;17298:19;17289:6;17245:73;:::i;:::-;17328;17396:3;17385:9;17381:19;17372:6;17328:73;:::i;:::-;16855:553;;;;;;;;;:::o;17414:210::-;;17539:2;17528:9;17524:18;17516:26;;17552:65;17614:1;17603:9;17599:17;17590:6;17552:65;:::i;:::-;17506:118;;;;:::o;17630:313::-;;17781:2;17770:9;17766:18;17758:26;;17830:9;17824:4;17820:20;17816:1;17805:9;17801:17;17794:47;17858:78;17931:4;17922:6;17858:78;:::i;:::-;17850:86;;17748:195;;;;:::o;17949:419::-;;18153:2;18142:9;18138:18;18130:26;;18202:9;18196:4;18192:20;18188:1;18177:9;18173:17;18166:47;18230:131;18356:4;18230:131;:::i;:::-;18222:139;;18120:248;;;:::o;18374:419::-;;18578:2;18567:9;18563:18;18555:26;;18627:9;18621:4;18617:20;18613:1;18602:9;18598:17;18591:47;18655:131;18781:4;18655:131;:::i;:::-;18647:139;;18545:248;;;:::o;18799:419::-;;19003:2;18992:9;18988:18;18980:26;;19052:9;19046:4;19042:20;19038:1;19027:9;19023:17;19016:47;19080:131;19206:4;19080:131;:::i;:::-;19072:139;;18970:248;;;:::o;19224:419::-;;19428:2;19417:9;19413:18;19405:26;;19477:9;19471:4;19467:20;19463:1;19452:9;19448:17;19441:47;19505:131;19631:4;19505:131;:::i;:::-;19497:139;;19395:248;;;:::o;19649:419::-;;19853:2;19842:9;19838:18;19830:26;;19902:9;19896:4;19892:20;19888:1;19877:9;19873:17;19866:47;19930:131;20056:4;19930:131;:::i;:::-;19922:139;;19820:248;;;:::o;20074:419::-;;20278:2;20267:9;20263:18;20255:26;;20327:9;20321:4;20317:20;20313:1;20302:9;20298:17;20291:47;20355:131;20481:4;20355:131;:::i;:::-;20347:139;;20245:248;;;:::o;20499:419::-;;20703:2;20692:9;20688:18;20680:26;;20752:9;20746:4;20742:20;20738:1;20727:9;20723:17;20716:47;20780:131;20906:4;20780:131;:::i;:::-;20772:139;;20670:248;;;:::o;20924:419::-;;21128:2;21117:9;21113:18;21105:26;;21177:9;21171:4;21167:20;21163:1;21152:9;21148:17;21141:47;21205:131;21331:4;21205:131;:::i;:::-;21197:139;;21095:248;;;:::o;21349:419::-;;21553:2;21542:9;21538:18;21530:26;;21602:9;21596:4;21592:20;21588:1;21577:9;21573:17;21566:47;21630:131;21756:4;21630:131;:::i;:::-;21622:139;;21520:248;;;:::o;21774:419::-;;21978:2;21967:9;21963:18;21955:26;;22027:9;22021:4;22017:20;22013:1;22002:9;21998:17;21991:47;22055:131;22181:4;22055:131;:::i;:::-;22047:139;;21945:248;;;:::o;22199:419::-;;22403:2;22392:9;22388:18;22380:26;;22452:9;22446:4;22442:20;22438:1;22427:9;22423:17;22416:47;22480:131;22606:4;22480:131;:::i;:::-;22472:139;;22370:248;;;:::o;22624:419::-;;22828:2;22817:9;22813:18;22805:26;;22877:9;22871:4;22867:20;22863:1;22852:9;22848:17;22841:47;22905:131;23031:4;22905:131;:::i;:::-;22897:139;;22795:248;;;:::o;23049:419::-;;23253:2;23242:9;23238:18;23230:26;;23302:9;23296:4;23292:20;23288:1;23277:9;23273:17;23266:47;23330:131;23456:4;23330:131;:::i;:::-;23322:139;;23220:248;;;:::o;23474:419::-;;23678:2;23667:9;23663:18;23655:26;;23727:9;23721:4;23717:20;23713:1;23702:9;23698:17;23691:47;23755:131;23881:4;23755:131;:::i;:::-;23747:139;;23645:248;;;:::o;23899:419::-;;24103:2;24092:9;24088:18;24080:26;;24152:9;24146:4;24142:20;24138:1;24127:9;24123:17;24116:47;24180:131;24306:4;24180:131;:::i;:::-;24172:139;;24070:248;;;:::o;24324:419::-;;24528:2;24517:9;24513:18;24505:26;;24577:9;24571:4;24567:20;24563:1;24552:9;24548:17;24541:47;24605:131;24731:4;24605:131;:::i;:::-;24597:139;;24495:248;;;:::o;24749:419::-;;24953:2;24942:9;24938:18;24930:26;;25002:9;24996:4;24992:20;24988:1;24977:9;24973:17;24966:47;25030:131;25156:4;25030:131;:::i;:::-;25022:139;;24920:248;;;:::o;25174:419::-;;25378:2;25367:9;25363:18;25355:26;;25427:9;25421:4;25417:20;25413:1;25402:9;25398:17;25391:47;25455:131;25581:4;25455:131;:::i;:::-;25447:139;;25345:248;;;:::o;25599:419::-;;25803:2;25792:9;25788:18;25780:26;;25852:9;25846:4;25842:20;25838:1;25827:9;25823:17;25816:47;25880:131;26006:4;25880:131;:::i;:::-;25872:139;;25770:248;;;:::o;26024:419::-;;26228:2;26217:9;26213:18;26205:26;;26277:9;26271:4;26267:20;26263:1;26252:9;26248:17;26241:47;26305:131;26431:4;26305:131;:::i;:::-;26297:139;;26195:248;;;:::o;26449:222::-;;26580:2;26569:9;26565:18;26557:26;;26593:71;26661:1;26650:9;26646:17;26637:6;26593:71;:::i;:::-;26547:124;;;;:::o;26677:483::-;;26886:2;26875:9;26871:18;26863:26;;26899:71;26967:1;26956:9;26952:17;26943:6;26899:71;:::i;:::-;27017:9;27011:4;27007:20;27002:2;26991:9;26987:18;26980:48;27045:108;27148:4;27139:6;27045:108;:::i;:::-;27037:116;;26853:307;;;;;:::o;27166:214::-;;27293:2;27282:9;27278:18;27270:26;;27306:67;27370:1;27359:9;27355:17;27346:6;27306:67;:::i;:::-;27260:120;;;;:::o;27386:283::-;;27452:2;27446:9;27436:19;;27494:4;27486:6;27482:17;27601:6;27589:10;27586:22;27565:18;27553:10;27550:34;27547:62;27544:2;;;27612:18;;:::i;:::-;27544:2;27652:10;27648:2;27641:22;27426:243;;;;:::o;27675:311::-;;27842:18;27834:6;27831:30;27828:2;;;27864:18;;:::i;:::-;27828:2;27914:4;27906:6;27902:17;27894:25;;27974:4;27968;27964:15;27956:23;;27757:229;;;:::o;27992:132::-;;28082:3;28074:11;;28112:4;28107:3;28103:14;28095:22;;28064:60;;;:::o;28130:114::-;;28231:5;28225:12;28215:22;;28204:40;;;:::o;28250:99::-;;28336:5;28330:12;28320:22;;28309:40;;;:::o;28355:113::-;;28457:4;28452:3;28448:14;28440:22;;28430:38;;;:::o;28474:184::-;;28607:6;28602:3;28595:19;28647:4;28642:3;28638:14;28623:29;;28585:73;;;;:::o;28664:147::-;;28802:3;28787:18;;28777:34;;;;:::o;28817:169::-;;28935:6;28930:3;28923:19;28975:4;28970:3;28966:14;28951:29;;28913:73;;;;:::o;28992:305::-;;29051:20;29069:1;29051:20;:::i;:::-;29046:25;;29085:20;29103:1;29085:20;:::i;:::-;29080:25;;29239:1;29171:66;29167:74;29164:1;29161:81;29158:2;;;29245:18;;:::i;:::-;29158:2;29289:1;29286;29282:9;29275:16;;29036:261;;;;:::o;29303:185::-;;29360:20;29378:1;29360:20;:::i;:::-;29355:25;;29394:20;29412:1;29394:20;:::i;:::-;29389:25;;29433:1;29423:2;;29438:18;;:::i;:::-;29423:2;29480:1;29477;29473:9;29468:14;;29345:143;;;;:::o;29494:348::-;;29557:20;29575:1;29557:20;:::i;:::-;29552:25;;29591:20;29609:1;29591:20;:::i;:::-;29586:25;;29779:1;29711:66;29707:74;29704:1;29701:81;29696:1;29689:9;29682:17;29678:105;29675:2;;;29786:18;;:::i;:::-;29675:2;29834:1;29831;29827:9;29816:20;;29542:300;;;;:::o;29848:191::-;;29908:20;29926:1;29908:20;:::i;:::-;29903:25;;29942:20;29960:1;29942:20;:::i;:::-;29937:25;;29981:1;29978;29975:8;29972:2;;;29986:18;;:::i;:::-;29972:2;30031:1;30028;30024:9;30016:17;;29893:146;;;;:::o;30045:96::-;;30111:24;30129:5;30111:24;:::i;:::-;30100:35;;30090:51;;;:::o;30147:90::-;;30224:5;30217:13;30210:21;30199:32;;30189:48;;;:::o;30243:126::-;;30320:42;30313:5;30309:54;30298:65;;30288:81;;;:::o;30375:77::-;;30441:5;30430:16;;30420:32;;;:::o;30458:86::-;;30533:4;30526:5;30522:16;30511:27;;30501:43;;;:::o;30550:121::-;;30641:24;30659:5;30641:24;:::i;:::-;30628:37;;30618:53;;;:::o;30677:307::-;30745:1;30755:113;30769:6;30766:1;30763:13;30755:113;;;30854:1;30849:3;30845:11;30839:18;30835:1;30830:3;30826:11;30819:39;30791:2;30788:1;30784:10;30779:15;;30755:113;;;30886:6;30883:1;30880:13;30877:2;;;30966:1;30957:6;30952:3;30948:16;30941:27;30877:2;30726:258;;;;:::o;30990:320::-;;31071:1;31065:4;31061:12;31051:22;;31118:1;31112:4;31108:12;31139:18;31129:2;;31195:4;31187:6;31183:17;31173:27;;31129:2;31257;31249:6;31246:14;31226:18;31223:38;31220:2;;;31276:18;;:::i;:::-;31220:2;31041:269;;;;:::o;31316:233::-;;31378:24;31396:5;31378:24;:::i;:::-;31369:33;;31424:66;31417:5;31414:77;31411:2;;;31494:18;;:::i;:::-;31411:2;31541:1;31534:5;31530:13;31523:20;;31359:190;;;:::o;31555:180::-;31603:77;31600:1;31593:88;31700:4;31697:1;31690:15;31724:4;31721:1;31714:15;31741:180;31789:77;31786:1;31779:88;31886:4;31883:1;31876:15;31910:4;31907:1;31900:15;31927:180;31975:77;31972:1;31965:88;32072:4;32069:1;32062:15;32096:4;32093:1;32086:15;32113:180;32161:77;32158:1;32151:88;32258:4;32255:1;32248:15;32282:4;32279:1;32272:15;32299:102;;32391:2;32387:7;32382:2;32375:5;32371:14;32367:28;32357:38;;32347:54;;;:::o;32407:122::-;32480:24;32498:5;32480:24;:::i;:::-;32473:5;32470:35;32460:2;;32519:1;32516;32509:12;32460:2;32450:79;:::o;32535:122::-;32608:24;32626:5;32608:24;:::i;:::-;32601:5;32598:35;32588:2;;32647:1;32644;32637:12;32588:2;32578:79;:::o

Swarm Source

ipfs://c2f88279ccfeb78127d33643b06d5553ec59a7eb890b5f9538902b4477f611b1

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.