ETH Price: $3,403.52 (-1.61%)
Gas: 5 Gwei

Token

Kattana (KTN)
 

Overview

Max Total Supply

10,000,000 KTN

Holders

2,837 (0.00%)

Market

Price

$0.05 @ 0.000014 ETH (-3.94%)

Onchain Market Cap

$476,993.84

Circulating Supply Market Cap

$447,724.54

Other Info

Token Contract (WITH 18 Decimals)

Balance
60.175597353974067932 KTN

Value
$2.87 ( ~0.000843244458046243 Eth) [0.0006%]
0x970cdfaf73ce10f148c141f9773dac9d10e00b9c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Trade crypto on DEXs and CEXs with a full suite of trading tools previously only available in CeFi.

Market

Volume (24H):$46,146.55
Market Capitalization:$447,724.54
Circulating Supply:9,386,380.00 KTN
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KattanaToken

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 7 of 15: KattanaToken.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;

import './Math.sol';
import './SafeERC20.sol';
import './LiquidityTrap.sol';
import './LiquidityActivityTrap.sol';
import './ExtraMath.sol';

contract KattanaToken is LiquidityTrap, LiquidityActivityTrap {
    using ExtraMath for *;
    using SafeMath for *;
    using SafeERC20 for IERC20;

    uint private constant MONTH = 30 days;
    uint private constant YEAR = 365 days;

    enum LockType {
        Empty,
        Seed,
        Private,
        Strategic,
        Liquidity,
        Foundation,
        Team,
        Reserve,
        Advisors
    }

    struct LockConfig {
        uint32 releaseStart;
        uint32 vesting;
    }

    struct Lock {
        uint128 balance; // Total locked.
        uint128 released; // Released so far.
    }

    mapping(LockType => LockConfig) public lockConfigs;
    mapping(LockType => mapping(address => Lock)) public locks;

    // Friday, April 9, 2021 12:00:00 PM
    uint public constant DAY_ONE = 1617969600;

    uint private constant KTN = 10**18;

    bool public protected = true;

    event Note(address sender, bytes data);
    event LockTransfer(LockType lock, address from, address to, uint amount);

    modifier note() {
        emit Note(_msgSender(), msg.data);
        _;
    }

    constructor(address _distributor, uint128 _trapAmount, address _uniswapV2Factory, address _pairToken)
        ERC20('Kattana', 'KTN')
        LiquidityProtectedBase(_uniswapV2Factory, _pairToken)
        LiquidityTrap(_trapAmount)
    {
        lockConfigs[LockType.Seed] = LockConfig(
            (DAY_ONE + MONTH).toUInt32(),
            (9 * MONTH).toUInt32()
        );
        _mint(address(uint(LockType.Seed)), 900_000 * KTN);
        locks[LockType.Seed][_distributor].balance = (900_000 * KTN).toUInt128();

        lockConfigs[LockType.Private] = LockConfig(
            (DAY_ONE + MONTH).toUInt32(),
            (8 * MONTH).toUInt32()
        );
        _mint(address(uint(LockType.Private)), 1_147_500 * KTN);
        locks[LockType.Private][_distributor].balance = (1_147_500 * KTN).toUInt128();

        lockConfigs[LockType.Strategic] = LockConfig(
            (DAY_ONE).toUInt32(),
            (4 * MONTH).toUInt32()
        );
        _mint(address(uint(LockType.Strategic)), 240_000 * KTN);
        locks[LockType.Strategic][_distributor].balance = (240_000 * KTN).toUInt128();

        lockConfigs[LockType.Liquidity] = LockConfig(
            (DAY_ONE).toUInt32(),
            (8 * MONTH).toUInt32()
        );
        _mint(address(uint(LockType.Liquidity)), 1_720_000 * KTN);
        locks[LockType.Liquidity][_distributor].balance = (1_720_000 * KTN).toUInt128();

        lockConfigs[LockType.Foundation] = LockConfig(
            (DAY_ONE).toUInt32(),
            (10 * MONTH).toUInt32()
        );
        _mint(address(uint(LockType.Foundation)), 2_000_000 * KTN);
        locks[LockType.Foundation][_distributor].balance = (2_000_000 * KTN).toUInt128();

        lockConfigs[LockType.Team] = LockConfig(
            (DAY_ONE + YEAR).toUInt32(),
            (10 * MONTH).toUInt32()
        );
        _mint(address(uint(LockType.Team)), 1_500_000 * KTN);
        locks[LockType.Team][_distributor].balance = (1_500_000 * KTN).toUInt128();

        lockConfigs[LockType.Reserve] = LockConfig(
            (DAY_ONE + YEAR).toUInt32(),
            (10 * MONTH).toUInt32()
        );
        _mint(address(uint(LockType.Reserve)), 1_000_000 * KTN);
        locks[LockType.Reserve][_distributor].balance = (1_000_000 * KTN).toUInt128();

        lockConfigs[LockType.Advisors] = LockConfig(
            (DAY_ONE + 6 * MONTH).toUInt32(),
            (10 * MONTH).toUInt32()
        );
        _mint(address(uint(LockType.Advisors)), 450_000 * KTN);
        locks[LockType.Advisors][_distributor].balance = (450_000 * KTN).toUInt128();

        // Public sale + day one unlock.
        _mint(_distributor, 1_042_500 * KTN);

        require(totalSupply() == 10_000_000 * KTN, 'Invalid total supply');
    }

    // In case someone will send other token here.
    function withdrawLocked(IERC20 _token, address _receiver, uint _amount) external onlyOwner() note() {
        _token.safeTransfer(_receiver, _amount);
    }

    function _passed(uint _time) private view returns(bool) {
        return block.timestamp > _time;
    }

    function _notPassed(uint _time) private view returns(bool) {
        return _not(_passed(_time));
    }

    function _since(uint _timestamp) private view returns(uint) {
        if (_notPassed(_timestamp)) {
            return 0;
        }
        return block.timestamp.sub(_timestamp);
    }

    function _not(bool _condition) private pure returns(bool) {
        return !_condition;
    }

    function batchTransfer(address[] memory _to, uint[] memory _amount) public {
        require(_to.length == _amount.length, 'Invalid input');
        for (uint _i = 0; _i < _to.length; _i++) {
            transfer(_to[_i], _amount[_i]);
        }
    }

    function batchTransferLock(LockType _lockType, address[] memory _to, uint[] memory _amount) public {
        require(_to.length == _amount.length, 'Invalid input');
        for (uint _i = 0; _i < _to.length; _i++) {
            transferLock(_lockType, _to[_i], _amount[_i]);
        }
    }

    // Assign locked tokens to another holder.
    function transferLock(LockType _lockType, address _to, uint _amount) public {
        require(_amount > 0, 'Invalid amount');
        Lock memory _lock = locks[_lockType][_msgSender()];
        require(_lock.released == 0, 'Cannot transfer after release');
        require(_lock.balance >= _amount, 'Insuffisient locked funds');

        locks[_lockType][_msgSender()].balance = _lock.balance.sub(_amount).toUInt128();
        locks[_lockType][_to].balance = locks[_lockType][_to].balance.add(_amount).toUInt128();
        emit LockTransfer(_lockType, _msgSender(), _to, _amount);
    }

    // Get released tokens to the main balance.
    function releaseLock(LockType _lock) external note() {
        _release(_lock, _msgSender());
    }

    function _release(LockType _lockType, address _holder) private {
        LockConfig memory _lockConfig = lockConfigs[_lockType];

        Lock memory _lock = locks[_lockType][_holder];
        uint _balance = _lock.balance;
        uint _released = _lock.released;

        uint _vestedBalance = _balance.mul(_since(_lockConfig.releaseStart)) / _lockConfig.vesting;
        uint _balanceToRelease = Math.min(_vestedBalance, _balance);

        require(_balanceToRelease > _released, 'Insufficient unlocked');

        // Underflow cannot happen here, SafeMath usage left for code style.
        uint _amount = _balanceToRelease.sub(_released);

        locks[_lockType][_holder].released = _balanceToRelease.toUInt128();
        _transfer(address(uint(_lockType)), _holder, _amount);
    }

    // UI function.
    function releasable(LockType _lockType, address _holder) public view returns(uint) {
        LockConfig memory _lockConfig = lockConfigs[_lockType];

        Lock memory _lock = locks[_lockType][_holder];
        uint _balance = _lock.balance;
        uint _released = _lock.released;

        uint _vestedBalance = _balance.mul(_since(_lockConfig.releaseStart)) / _lockConfig.vesting;
        uint _balanceToRelease = Math.min(_vestedBalance, _balance);

        if (_balanceToRelease <= _released) {
            return 0;
        }

        // Underflow cannot happen here, SafeMath usage left for code style.
        return _balanceToRelease.sub(_released);
    }

    // UI function.
    function releasableTotal(address _holder) public view returns(uint[9] memory _result) {
        _result[1] = releasable(LockType.Seed, _holder);
        _result[2] = releasable(LockType.Private, _holder);
        _result[3] = releasable(LockType.Strategic, _holder);
        _result[4] = releasable(LockType.Liquidity, _holder);
        _result[5] = releasable(LockType.Foundation, _holder);
        _result[6] = releasable(LockType.Team, _holder);
        _result[7] = releasable(LockType.Reserve, _holder);
        _result[8] = releasable(LockType.Advisors, _holder);
    }

    function disableProtection() external onlyOwner() {
        protected = false;
    }

    function _beforeTokenTransfer(address _from, address _to, uint _amount) internal override {
        super._beforeTokenTransfer(_from, _to, _amount);
        if (protected) {
            LiquidityActivityTrap_validateTransfer(_from, _to, _amount);
            LiquidityTrap_validateTransfer(_from, _to, _amount);
        }
    }
}

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

pragma solidity ^0.7.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 2 of 15: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

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

File 3 of 15: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import "./Context.sol";
import "./IERC20.sol";
import "./SafeMath.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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

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

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

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

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

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

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

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

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

    /** @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:
     *
     * - `to` 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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @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 4 of 15: ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import "./Context.sol";
import "./ERC20.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    using SafeMath for uint256;

    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

File 5 of 15: ExtraMath.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

import './SafeMath.sol';

library ExtraMath {
    using SafeMath for uint;

    function divCeil(uint _a, uint _b) internal pure returns(uint) {
        if (_a.mod(_b) > 0) {
            return (_a / _b).add(1);
        }
        return _a / _b;
    }

    function toUInt8(uint _a) internal pure returns(uint8) {
        require(_a <= uint8(-1), 'uint8 overflow');
        return uint8(_a);
    }

    function toUInt32(uint _a) internal pure returns(uint32) {
        require(_a <= uint32(-1), 'uint32 overflow');
        return uint32(_a);
    }

    function toUInt96(uint _a) internal pure returns(uint96) {
        require(_a <= uint96(-1), 'uint96 overflow');
        return uint96(_a);
    }

    function toUInt120(uint _a) internal pure returns(uint120) {
        require(_a <= uint120(-1), 'uint120 overflow');
        return uint120(_a);
    }

    function toUInt128(uint _a) internal pure returns(uint128) {
        require(_a <= uint128(-1), 'uint128 overflow');
        return uint128(_a);
    }
}

File 6 of 15: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.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 8 of 15: LiquidityActivityTrap.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

import './Ownable.sol';
import './ERC20Burnable.sol';
import './LiquidityProtectedBase.sol';
import './ExtraMath.sol';

abstract contract LiquidityActivityTrap is KnowingLiquidityAddedBlock, Ownable, ERC20Burnable {
    using ExtraMath for *;
    using SafeMath for *;

    uint8 public constant ACTIVITY_TRAP_BLOCKS = 3;
    uint8 public constant TRADES_PER_BLOCK_LIMIT = 15;
    mapping(address => bool[ACTIVITY_TRAP_BLOCKS]) public tradedInBlock;
    uint8[ACTIVITY_TRAP_BLOCKS] public tradesInBlockCount;

    function LiquidityActivityTrap_validateTransfer(address _from, address _to, uint _amount) internal {
        KnowingLiquidityAddedBlock_validateTransfer(_from, _to, _amount);
        uint sinceLiquidity = _blocksSince(liquidityAddedBlock);
        if (_blocksSince(liquidityAddedBlock) < ACTIVITY_TRAP_BLOCKS) {
            // Do not trap technical addresses.
            if (_from == liquidityPool && _to != liquidityPool && uint(_to) > 1000 && _amount > 0) {
                tradedInBlock[_to][sinceLiquidity] = true;
                if (tradesInBlockCount[sinceLiquidity] < type(uint8).max) {
                    tradesInBlockCount[sinceLiquidity]++;
                }
            } else if (_from != liquidityPool && _to == liquidityPool && uint(_from) > 1000 && _amount > 0) {
                // Do not count addLiquidity.
                if (tradesInBlockCount[sinceLiquidity] > 0) {
                    tradedInBlock[_from][sinceLiquidity] = true;
                    if (tradesInBlockCount[sinceLiquidity] < type(uint8).max) {
                        tradesInBlockCount[sinceLiquidity]++;
                    }
                }
            }
        }
        uint8[ACTIVITY_TRAP_BLOCKS] memory traps = tradesInBlockCount;
        bool[ACTIVITY_TRAP_BLOCKS] memory blocks = tradedInBlock[_from];
        for (uint i = 0; i < ACTIVITY_TRAP_BLOCKS; i++) {
            if (traps[i] > TRADES_PER_BLOCK_LIMIT && blocks[i]) {
                require(_to == owner(), 'LiquidityActivityTrap: must send to owner()');
                require(balanceOf(_from) == _amount, 'LiquidityActivityTrap: must send it all');
                delete tradedInBlock[_from];
                break;
            }
        }
    }
}

File 9 of 15: LiquidityProtectedBase.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

import './UniswapV2Library.sol';
import './ExtraMath.sol';

abstract contract LiquidityProtectedBase {
    address public liquidityPool;

    constructor(address _uniswapV2Factory, address _pairToken) {
        liquidityPool = UniswapV2Library.pairFor(_uniswapV2Factory, _pairToken, address(this));
    }

    function _blocksSince(uint _blockNumber) internal view returns(uint) {
        if (_blockNumber > block.number) {
            return 0;
        }
        return block.number - _blockNumber;
    }
}

abstract contract KnowingLiquidityAddedBlock is LiquidityProtectedBase {
    using ExtraMath for *;
    uint96 public liquidityAddedBlock;

    function KnowingLiquidityAddedBlock_validateTransfer(address, address _to, uint _amount) internal {
        if (liquidityAddedBlock == 0 && _to == liquidityPool && _amount > 0) {
            liquidityAddedBlock = block.number.toUInt96();
        }
    }
}

File 10 of 15: LiquidityTrap.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

import './Ownable.sol';
import './ERC20Burnable.sol';
import './LiquidityProtectedBase.sol';
import './ExtraMath.sol';

abstract contract LiquidityTrap is KnowingLiquidityAddedBlock, Ownable, ERC20Burnable {
    using ExtraMath for *;
    using SafeMath for *;

    uint8 public constant TRAP_BLOCKS = 3;
    uint128 public trapAmount;
    mapping(address => uint) public bought;

    constructor(uint128 _trapAmount) {
        trapAmount = _trapAmount;
    }

    function LiquidityTrap_validateTransfer(address _from, address _to, uint _amount) internal {
        KnowingLiquidityAddedBlock_validateTransfer(_from, _to, _amount);
        if (_blocksSince(liquidityAddedBlock) < TRAP_BLOCKS) {
            // Do not trap technical addresses.
            if (_from == liquidityPool && _to != liquidityPool && uint(_to) > 1000) {
                bought[_to] = bought[_to].add(_amount);
            }
        }

        if (bought[_from] >= trapAmount) {
            require(_to == owner(), 'LiquidityTrap: must send to owner()');
            require(balanceOf(_from) == _amount, 'LiquidityTrap: must send it all');
            bought[_from] = 0;
        }
    }
}

File 11 of 15: Math.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

File 12 of 15: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import "./Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

File 13 of 15: SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 14 of 15: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 15 of 15: UniswapV2Library.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.7.6;

// Exempt from the original UniswapV2Library.
library UniswapV2Library {
    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
            ))));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"uint128","name":"_trapAmount","type":"uint128"},{"internalType":"address","name":"_uniswapV2Factory","type":"address"},{"internalType":"address","name":"_pairToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum KattanaToken.LockType","name":"lock","type":"uint8"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LockTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Note","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[],"name":"ACTIVITY_TRAP_BLOCKS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAY_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRADES_PER_BLOCK_LIMIT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAP_BLOCKS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum KattanaToken.LockType","name":"_lockType","type":"uint8"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"batchTransferLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityAddedBlock","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum KattanaToken.LockType","name":"","type":"uint8"}],"name":"lockConfigs","outputs":[{"internalType":"uint32","name":"releaseStart","type":"uint32"},{"internalType":"uint32","name":"vesting","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum KattanaToken.LockType","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"locks","outputs":[{"internalType":"uint128","name":"balance","type":"uint128"},{"internalType":"uint128","name":"released","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum KattanaToken.LockType","name":"_lockType","type":"uint8"},{"internalType":"address","name":"_holder","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"releasableTotal","outputs":[{"internalType":"uint256[9]","name":"_result","type":"uint256[9]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum KattanaToken.LockType","name":"_lock","type":"uint8"}],"name":"releaseLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradedInBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradesInBlockCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum KattanaToken.LockType","name":"_lockType","type":"uint8"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trapAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLocked","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600d805460ff191660011790553480156200001e57600080fd5b506040516200519e3803806200519e833981016040819052620000419162001888565b82604051806040016040528060078152602001664b617474616e6160c81b8152506040518060400160405280600381526020016225aa2760e91b81525084846200009882823062000c4260201b620015901760201c565b600080546001600160a01b0319166001600160a01b03929092169190911781559150620000c6905062000d16565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350815162000129906005906020850190620017bd565b5080516200013f906006906020840190620017bd565b505060078054601260ff1990911617610100600160881b0319166101006001600160801b039490941693909302929092179091555060408051808201909152806200019a636097cec062000d1a602090811b6200167b17901c565b63ffffffff168152602001620001c162278d0060090262000d1a60201b6200167b1760201c565b63ffffffff90811690915260016000819052600b602090815283517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf8054959092015163ffffffff199095169084161763ffffffff60201b1916640100000000949093169390930291909117909155620002469069be951906eba2aa80000062000d70565b62000269670de0b6b3a7640000620dbba00262000e8360201b620016f41760201c565b6001600160a01b03851660009081527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c602090815260409182902080546001600160801b0319166001600160801b0394909416939093179092558051808201909152908190620002e890636097cec09062000d1a811b6200167b17901c565b63ffffffff1681526020016200030f62278d0060080262000d1a60201b6200167b1760201c565b63ffffffff90811690915260026000819052600b602090815283517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916348054959092015163ffffffff199095169084161763ffffffff60201b1916640100000000949093169390930291909117909155620003949069f2fe19826c6f6630000062000d70565b620003b7670de0b6b3a76400006211826c0262000e8360201b620016f41760201c565b6001600160a01b03851660009081527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720602090815260409182902080546001600160801b0319166001600160801b0394909416939093179092558051808201909152908190620004369063607041c09062000d1a811b6200167b17901c565b63ffffffff1681526020016200045d62278d0060040262000d1a60201b6200167b1760201c565b63ffffffff90811690915260036000819052600b602090815283517f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e8054959092015163ffffffff199095169084161763ffffffff60201b1916640100000000949093169390930291909117909155620004e2906932d26d12e980b600000062000d70565b62000505670de0b6b3a76400006203a9800262000e8360201b620016f41760201c565b6001600160a01b03851660009081527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd7602090815260409182902080546001600160801b0319166001600160801b0394909416939093179092558051808201909152908190620005849063607041c09062000d1a811b6200167b17901c565b63ffffffff168152602001620005ab62278d0060080262000d1a60201b6200167b1760201c565b63ffffffff90811690915260046000819052600b602090815283517f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c7848054959092015163ffffffff199095169084161763ffffffff60201b191664010000000094909316939093029190911790915562000631906a016c396307896fc300000062000d70565b62000654670de0b6b3a7640000621a3ec00262000e8360201b620016f41760201c565b6001600160a01b03851660009081527f5b84bb9e0f5aa9cc45a8bb66468db5d4816d1e75ff86b5e1f1dd8d144dab8097602090815260409182902080546001600160801b0319166001600160801b0394909416939093179092558051808201909152908190620006d39063607041c09062000d1a811b6200167b17901c565b63ffffffff168152602001620006fa62278d00600a0262000d1a60201b6200167b1760201c565b63ffffffff90811690915260056000819052600b602090815283517febae6141bae5521e99e0a8d610356b0f501fea54980b59c84841db43ba7204f48054959092015163ffffffff199095169084161763ffffffff60201b191664010000000094909316939093029190911790915562000780906a01a784379d99db4200000062000d70565b620007a3670de0b6b3a7640000621e84800262000e8360201b620016f41760201c565b6001600160a01b03851660009081527f2cd9ebf6ff19cdd7ffcc447d7c7d47b5991f5c7392a04512134e765802361fa6602090815260409182902080546001600160801b0319166001600160801b0394909416939093179092558051808201909152908190620008229063625175409062000d1a811b6200167b17901c565b63ffffffff1681526020016200084962278d00600a0262000d1a60201b6200167b1760201c565b63ffffffff90811690915260066000819052600b602090815283517f0387e9d1203691d8e3362a7e4c6723de358a4010d7f31ecbec3fbfc61d1c75fc8054959092015163ffffffff199095169084161763ffffffff60201b1916640100000000949093169390930291909117909155620008cf906a013da329b633647180000062000d70565b620008f2670de0b6b3a76400006216e3600262000e8360201b620016f41760201c565b6001600160a01b03851660009081527f980f427e00e74f6d338adfccc7468518c8c8ea00836d0dce98c5fe154e17bf2b602090815260409182902080546001600160801b0319166001600160801b0394909416939093179092558051808201909152908190620009719063625175409062000d1a811b6200167b17901c565b63ffffffff1681526020016200099862278d00600a0262000d1a60201b6200167b1760201c565b63ffffffff90811690915260076000819052600b602090815283517ff5559028dc9ba50d75343c779b2f75e13a84a14662932fc67a486f263ca31a968054959092015163ffffffff199095169084161763ffffffff60201b191664010000000094909316939093029190911790915562000a1d9069d3c21bcecceda100000062000d70565b62000a40670de0b6b3a7640000620f42400262000e8360201b620016f41760201c565b6001600160a01b03851660009081527fdae089abd7155aa13ce498edb0d7a7156b783d015031f10c9a3d4f5fcb518971602090815260409182902080546001600160801b0319166001600160801b039490941693909317909255805180820190915290819062000abf9063615d8fc09062000d1a811b6200167b17901c565b63ffffffff16815260200162000ae662278d00600a0262000d1a60201b6200167b1760201c565b63ffffffff90811690915260086000819052600b602090815283517f71f482bdabd1ea844d62c952b094e632959690d7448ca2aab34034ec985693588054959092015163ffffffff199095169084161763ffffffff60201b191664010000000094909316939093029190911790915562000b6b90695f4a8c8375d15540000062000d70565b62000b8e670de0b6b3a76400006206ddd00262000e8360201b620016f41760201c565b6001600160a01b03851660009081527f5ff1be3842b54290a9d10674244dae5848d2371b5314790c54805c086586e1df6020526040902080546001600160801b0319166001600160801b039290921691909117905562000bf98469dcc209ca26471690000062000d70565b6a084595161401484a00000062000c0f62000ed5565b1462000c385760405162461bcd60e51b815260040162000c2f90620018f1565b60405180910390fd5b5050505062001928565b6000808062000c52858562000edb565b604080516001600160601b0319606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b3390565b600063ffffffff82111562000d68576040805162461bcd60e51b815260206004820152600f60248201526e75696e743332206f766572666c6f7760881b604482015290519081900360640190fd5b50805b919050565b6001600160a01b03821662000dcc576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b62000dda6000838362000fbe565b62000df6816004546200100160201b620017751790919060201c565b6004556001600160a01b03821660009081526002602090815260409091205462000e2b9183906200177562001001821b17901c565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006001600160801b0382111562000d68576040805162461bcd60e51b815260206004820152601060248201526f75696e74313238206f766572666c6f7760801b604482015290519081900360640190fd5b60045490565b600080826001600160a01b0316846001600160a01b0316141562000f315760405162461bcd60e51b81526004018080602001828103825260258152602001806200514e6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b03161062000f5357828462000f56565b83835b90925090506001600160a01b03821662000fb7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b62000fd683838362000ffc60201b620006291760201c565b600d5460ff161562000ffc5762000fef83838362001063565b62000ffc838383620014d5565b505050565b6000828201838110156200105c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b62001070838383620016a6565b600080546200108f90600160a01b90046001600160601b031662001728565b600054909150600390620010b390600160a01b90046001600160601b031662001728565b1015620012f9576000546001600160a01b038581169116148015620010e657506000546001600160a01b03848116911614155b8015620010fd57506103e8836001600160a01b0316115b80156200110a5750600082115b15620011c6576001600160a01b038316600090815260096020526040902060019082600381106200113757fe5b602091828204019190066101000a81548160ff02191690831515021790555060ff8016600a82600381106200116857fe5b602081049091015460ff601f9092166101000a9004161015620011c057600a81600381106200119357fe5b60208104919091018054601f9092166101000a60ff81810219841693829004811660010116029190911790555b620012f9565b6000546001600160a01b03858116911614801590620011f257506000546001600160a01b038481169116145b80156200120957506103e8846001600160a01b0316115b8015620012165750600082115b15620012f9576000600a82600381106200122c57fe5b602081049091015460ff601f9092166101000a9004161115620012f9576001600160a01b038416600090815260096020526040902060019082600381106200127057fe5b602091828204019190066101000a81548160ff02191690831515021790555060ff8016600a8260038110620012a157fe5b602081049091015460ff601f9092166101000a9004161015620012f957600a8160038110620012cc57fe5b60208104919091018054601f9092166101000a60ff81810219841693829004811660010116029190911790555b604080516060810191829052600091600a906003908285855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116200131257505050506001600160a01b03881660009081526009602052604080822081516060810192839052959650919493509091506003908285855b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411620013775790505050505050905060005b6003811015620014cc57600f838260038110620013cb57fe5b602002015160ff16118015620013ef5750818160038110620013e957fe5b60200201515b15620014c357620013ff62001742565b6001600160a01b0316866001600160a01b031614620014505760405162461bcd60e51b815260040180806020018281038252602b81526020018062005173602b913960400191505060405180910390fd5b846200145c8862001751565b146200149a5760405162461bcd60e51b8152600401808060200182810382526027815260200180620051276027913960400191505060405180910390fd5b6001600160a01b0387166000908152600960205260408120620014bd9162001852565b620014cc565b600101620013b2565b50505050505050565b620014e2838383620016a6565b6000546003906200150390600160a01b90046001600160601b031662001728565b10156200159f576000546001600160a01b0384811691161480156200153657506000546001600160a01b03838116911614155b80156200154d57506103e8826001600160a01b0316115b156200159f576001600160a01b038216600090815260086020908152604090912054620015859183906200177562001001821b17901c565b6001600160a01b0383166000908152600860205260409020555b6007546001600160a01b0384166000908152600860205260409020546101009091046001600160801b03161162000ffc57620015da62001742565b6001600160a01b0316826001600160a01b0316146200162b5760405162461bcd60e51b8152600401808060200182810382526023815260200180620051046023913960400191505060405180910390fd5b80620016378462001751565b146200168a576040805162461bcd60e51b815260206004820152601f60248201527f4c6971756964697479547261703a206d7573742073656e6420697420616c6c00604482015290519081900360640190fd5b50506001600160a01b0316600090815260086020526040812055565b600054600160a01b90046001600160601b0316158015620016d457506000546001600160a01b038381169116145b8015620016e15750600081115b1562000ffc57620016fd436200176c60201b620017e91760201c565b600060146101000a8154816001600160601b0302191690836001600160601b03160217905550505050565b6000438211156200173c5750600062000d6b565b50430390565b6001546001600160a01b031690565b6001600160a01b031660009081526002602052604090205490565b60006001600160601b0382111562000d68576040805162461bcd60e51b815260206004820152600f60248201526e75696e743936206f766572666c6f7760881b604482015290519081900360640190fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620017f5576000855562001840565b82601f106200181057805160ff191683800117855562001840565b8280016001018555821562001840579182015b828111156200184057825182559160200191906001019062001823565b506200184e92915062001859565b5090565b5060009055565b5b808211156200184e57600081556001016200185a565b80516001600160a01b038116811462000d6b57600080fd5b600080600080608085870312156200189e578384fd5b620018a98562001870565b60208601519094506001600160801b0381168114620018c6578384fd5b9250620018d66040860162001870565b9150620018e66060860162001870565b905092959194509250565b60208082526014908201527f496e76616c696420746f74616c20737570706c79000000000000000000000000604082015260600190565b6137cc80620019386000396000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c8063715018a611610160578063a9059cbb116100d8578063dd62ed3e1161008c578063e642d3da11610071578063e642d3da146104e9578063f2fde38b1461050a578063fe0cf2541461048b57610277565b8063dd62ed3e146104c3578063e07ca3e2146104d657610277565b8063b3c08f7f116100bd578063b3c08f7f14610493578063b48ecdc51461049b578063bcff895a146104ae57610277565b8063a9059cbb14610478578063aea3df281461048b57610277565b806388d695b21161012f57806395d89b411161011457806395d89b411461043c578063987c56be14610444578063a457c2d71461046557610277565b806388d695b2146104215780638da5cb5b1461043457610277565b8063715018a6146103eb57806379cc6790146103f3578063812a6dbd14610406578063834d81851461041957610277565b806339509351116101f357806357ad72d1116101c2578063667022fd116101a7578063667022fd146103b25780636f7f28e9146103c557806370a08231146103d857610277565b806357ad72d114610395578063665a11ca1461039d57610277565b80633950935114610352578063421dd7c71461036557806342966c681461036d57806346022c8a1461038057610277565b806318160ddd1161024a578063245bde3e1161022f578063245bde3e1461030a5780632dc02e451461031d578063313ce5671461033d57610277565b806318160ddd146102e257806323b872dd146102f757610277565b8063042ee4261461027c57806306fdde0314610291578063095ea7b3146102af5780631509b0bd146102cf575b600080fd5b61028f61028a366004613099565b61051d565b005b61029961062e565b6040516102a6919061328e565b60405180910390f35b6102c26102bd36600461300d565b6106e2565b6040516102a69190613245565b6102c26102dd36600461300d565b610700565b6102ea610739565b6040516102a69190613452565b6102c2610305366004612fcd565b61073f565b61028f6103183660046130e2565b6107e1565b61033061032b366004612f79565b610b55565b6040516102a69190613213565b610345610be3565b6040516102a69190613472565b6102c261036036600461300d565b610bec565b61028f610c47565b61028f61037b366004613170565b610d19565b610388610d2d565b6040516102a69190613412565b610345610d4a565b6103a5610d4f565b6040516102a69190613188565b6102ea6103c0366004612f79565b610d6b565b6102ea6103d33660046130c7565b610d7d565b6102ea6103e6366004612f79565b610ece565b61028f610efa565b61028f61040136600461300d565b611011565b61028f6104143660046130ad565b611061565b6102c26110b5565b61028f61042f366004613038565b6110be565b6103a561113e565b61029961115a565b6104576104523660046130c7565b6111d9565b6040516102a692919061342f565b6102c261047336600461300d565b611220565b6102c261048636600461300d565b611295565b6103456112a9565b6102ea6112ae565b61028f6104a93660046130ff565b6112b6565b6104b661133c565b6040516102a69190613480565b6102ea6104d1366004612f95565b611368565b6103456104e4366004613170565b6113a0565b6104fc6104f73660046130ad565b6113ca565b6040516102a692919061345b565b61028f610518366004612f79565b6113ee565b610525611866565b73ffffffffffffffffffffffffffffffffffffffff1661054361113e565b73ffffffffffffffffffffffffffffffffffffffff16146105c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda6105ee611866565b600036604051610600939291906131a9565b60405180910390a161062973ffffffffffffffffffffffffffffffffffffffff8416838361186a565b505050565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106d85780601f106106ad576101008083540402835291602001916106d8565b820191906000526020600020905b8154815290600101906020018083116106bb57829003601f168201915b5050505050905090565b60006106f66106ef611866565b84846118f7565b5060015b92915050565b6009602052816000526040600020816003811061071c57600080fd5b602081049091015460ff601f9092166101000a9004169150829050565b60045490565b600061074c848484611a3e565b6107d684610758611866565b6107d1856040518060600160405280602881526020016136676028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600360205260408120906107a3611866565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190611c10565b6118f7565b5060015b9392505050565b60008111610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906132ff565b60405180910390fd5b6000600c600085600881111561083657fe5b600881111561084157fe5b81526020019081526020016000206000610859611866565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081016000208151808301909252546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169181018290529150156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906133db565b80516fffffffffffffffffffffffffffffffff16821115610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b9061336d565b805161096a90610965906fffffffffffffffffffffffffffffffff1684611cc1565b6116f4565b600c600086600881111561097a57fe5b600881111561098557fe5b8152602001908152602001600020600061099d611866565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610a7e61096583600c6000886008811115610a2757fe5b6008811115610a3257fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8a1682529092529020546fffffffffffffffffffffffffffffffff1690611775565b600c6000866008811115610a8e57fe5b6008811115610a9957fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff88168252909252902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff929092169190911790557f6fe310bb7d850fc3c435d767d20a91767a68d529d9993b1b59202f78abac673384610b35611866565b8585604051610b479493929190613250565b60405180910390a150505050565b610b5d612e75565b610b68600183610d7d565b6020820152610b78600283610d7d565b6040820152610b88600383610d7d565b6060820152610b98600483610d7d565b6080820152610ba8600583610d7d565b60a0820152610bb8600683610d7d565b60c0820152610bc8600783610d7d565b60e0820152610bd8600883610d7d565b610100820152919050565b60075460ff1690565b60006106f6610bf9611866565b846107d18560036000610c0a611866565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c168152925290205490611775565b610c4f611866565b73ffffffffffffffffffffffffffffffffffffffff16610c6d61113e565b73ffffffffffffffffffffffffffffffffffffffff1614610cef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610d2a610d24611866565b82611d38565b50565b60075461010090046fffffffffffffffffffffffffffffffff1681565b600f81565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60086020526000908152604090205481565b600080600b6000856008811115610d9057fe5b6008811115610d9b57fe5b81526020808201929092526040908101600090812082518084019093525463ffffffff808216845264010000000090910416928201929092529150600c81866008811115610de557fe5b6008811115610df057fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825283528181208251808401909352546fffffffffffffffffffffffffffffffff8082168085527001000000000000000000000000000000009092041683850181905293860151865193955090939263ffffffff91821691610e8991610e829116611e82565b8590611ea4565b81610e9057fe5b0490506000610e9f8285611f17565b9050828111610eb757600096505050505050506106fa565b610ec18184611cc1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600260205260409020545b919050565b610f02611866565b73ffffffffffffffffffffffffffffffffffffffff16610f2061113e565b73ffffffffffffffffffffffffffffffffffffffff1614610fa257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006110438260405180606001604052806024815260200161368f6024913961103c866104d1611866565b9190611c10565b905061105783611051611866565b836118f7565b6106298383611d38565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda61108a611866565b60003660405161109c939291906131a9565b60405180910390a1610d2a816110b0611866565b611f2d565b600d5460ff1681565b80518251146110f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906133a4565b60005b82518110156106295761113583828151811061111457fe5b602002602001015183838151811061112857fe5b6020026020010151611295565b506001016110fc565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106d85780601f106106ad576101008083540402835291602001916106d8565b600c6020908152600092835260408084209091529082529020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b60006106f661122d611866565b846107d1856040518060600160405280602581526020016137726025913960036000611257611866565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d16815292529020549190611c10565b60006106f66112a2611866565b8484611a3e565b600381565b63607041c081565b80518251146112f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906133a4565b60005b82518110156113365761132e8484838151811061130d57fe5b602002602001015184848151811061132157fe5b60200260200101516107e1565b6001016112f4565b50505050565b6000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b600a81600381106113b057600080fd5b60209182820401919006915054906101000a900460ff1681565b600b6020526000908152604090205463ffffffff8082169164010000000090041682565b6113f6611866565b73ffffffffffffffffffffffffffffffffffffffff1661141461113e565b73ffffffffffffffffffffffffffffffffffffffff161461149657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806135436026913960400191505060405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080600061159f8585612139565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b600063ffffffff8211156116f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f75696e743332206f766572666c6f770000000000000000000000000000000000604482015290519081900360640190fd5b5090565b60006fffffffffffffffffffffffffffffffff8211156116f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f75696e74313238206f766572666c6f7700000000000000000000000000000000604482015290519081900360640190fd5b6000828201838110156107da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006bffffffffffffffffffffffff8211156116f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f75696e743936206f766572666c6f770000000000000000000000000000000000604482015290519081900360640190fd5b3390565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261062990849061228c565b73ffffffffffffffffffffffffffffffffffffffff8316611963576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806137246024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135696022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316611aaa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806136d46025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611b16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806134fe6023913960400191505060405180910390fd5b611b21838383612364565b611b6b816040518060600160405280602681526020016135ae6026913973ffffffffffffffffffffffffffffffffffffffff86166000908152600260205260409020549190611c10565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260205260408082209390935590841681522054611ba79082611775565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611cb9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c7e578181015183820152602001611c66565b50505050905090810190601f168015611cab5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082821115611d3257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b73ffffffffffffffffffffffffffffffffffffffff8216611da4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806136b36021913960400191505060405180910390fd5b611db082600083612364565b611dfa816040518060600160405280602281526020016135216022913973ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020549190611c10565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902055600454611e2d9082611cc1565b60045560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000611e8d82612390565b15611e9a57506000610ef5565b6106fa4283611cc1565b600082611eb3575060006106fa565b82820282848281611ec057fe5b04146107da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806136466021913960400191505060405180910390fd5b6000818310611f2657816107da565b5090919050565b6000600b6000846008811115611f3f57fe5b6008811115611f4a57fe5b81526020808201929092526040908101600090812082518084019093525463ffffffff808216845264010000000090910416928201929092529150600c81856008811115611f9457fe5b6008811115611f9f57fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8716825283528181208251808401909352546fffffffffffffffffffffffffffffffff8082168085527001000000000000000000000000000000009092041683850181905293860151865193955090939263ffffffff9182169161203191610e829116611e82565b8161203857fe5b04905060006120478285611f17565b9050828111612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b90613336565b600061208e8285611cc1565b9050612099826116f4565b600c60008b60088111156120a957fe5b60088111156120b457fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8d168252909252902080546fffffffffffffffffffffffffffffffff92831670010000000000000000000000000000000002921691909117905561212e89600881111561212757fe5b8983611a3e565b505050505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806135fb6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106121fb5782846121fe565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661228557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60006122ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123a39092919063ffffffff16565b8051909150156106295780806020019051602081101561230d57600080fd5b5051610629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613748602a913960400191505060405180910390fd5b61236f838383610629565b600d5460ff1615610629576123858383836123ba565b6106298383836128fb565b60006106fa61239e83612b75565b612b7a565b60606123b28484600085612b7e565b949350505050565b6123c5838383612d38565b600080546123f8907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16612dd7565b600054909150600390612430907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16612dd7565b10156126ca5760005473ffffffffffffffffffffffffffffffffffffffff858116911614801561247b575060005473ffffffffffffffffffffffffffffffffffffffff848116911614155b801561249e57506103e88373ffffffffffffffffffffffffffffffffffffffff16115b80156124aa5750600082115b1561256d5773ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902060019082600381106124e257fe5b602091828204019190066101000a81548160ff02191690831515021790555060ff8016600a826003811061251257fe5b602081049091015460ff601f9092166101000a900416101561256857600a816003811061253b57fe5b60208104919091018054601f9092166101000a60ff81810219841693829004811660010116029190911790555b6126ca565b60005473ffffffffffffffffffffffffffffffffffffffff8581169116148015906125b2575060005473ffffffffffffffffffffffffffffffffffffffff8481169116145b80156125d557506103e88473ffffffffffffffffffffffffffffffffffffffff16115b80156125e15750600082115b156126ca576000600a82600381106125f557fe5b602081049091015460ff601f9092166101000a90041611156126ca5773ffffffffffffffffffffffffffffffffffffffff84166000908152600960205260409020600190826003811061264457fe5b602091828204019190066101000a81548160ff02191690831515021790555060ff8016600a826003811061267457fe5b602081049091015460ff601f9092166101000a90041610156126ca57600a816003811061269d57fe5b60208104919091018054601f9092166101000a60ff81810219841693829004811660010116029190911790555b604080516060810191829052600091600a906003908285855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116126e3575050505073ffffffffffffffffffffffffffffffffffffffff881660009081526009602052604080822081516060810192839052959650919493509091506003908285855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116127545790505050505050905060005b60038110156128f257600f8382600381106127a557fe5b602002015160ff161180156127c757508181600381106127c157fe5b60200201515b156128ea576127d461113e565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806136f9602b913960400191505060405180910390fd5b8461286188610ece565b146128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806135d46027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff871660009081526009602052604081206128e591612e94565b6128f2565b60010161278e565b50505050505050565b612906838383612d38565b60005460039061293b907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16612dd7565b1015612a055760005473ffffffffffffffffffffffffffffffffffffffff8481169116148015612986575060005473ffffffffffffffffffffffffffffffffffffffff838116911614155b80156129a957506103e88273ffffffffffffffffffffffffffffffffffffffff16115b15612a055773ffffffffffffffffffffffffffffffffffffffff82166000908152600860205260409020546129de9082611775565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020555b60075473ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260409020546101009091046fffffffffffffffffffffffffffffffff161161062957612a5361113e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061358b6023913960400191505060405180910390fd5b80612ae084610ece565b14612b4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c6971756964697479547261703a206d7573742073656e6420697420616c6c00604482015290519081900360640190fd5b505073ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040812055565b421190565b1590565b606082471015612bd9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806136206026913960400191505060405180910390fd5b612be285612def565b612c4d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612cb657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c79565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612d18576040519150601f19603f3d011682016040523d82523d6000602084013e612d1d565b606091505b5091509150612d2d828286612df5565b979650505050505050565b6000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16158015612d88575060005473ffffffffffffffffffffffffffffffffffffffff8381169116145b8015612d945750600081115b1561062957612da2436117e9565b600060146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505050565b600043821115612de957506000610ef5565b50430390565b3b151590565b60608315612e045750816107da565b825115612e145782518084602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152845160248401528451859391928392604401919085019080838360008315611c7e578181015183820152602001611c66565b6040518061012001604052806009906020820280368337509192915050565b5060009055565b600082601f830112612eab578081fd5b81356020612ec0612ebb836134bd565b613499565b8281528181019085830183850287018401881015612edc578586fd5b855b85811015612f03578135612ef1816134db565b84529284019290840190600101612ede565b5090979650505050505050565b600082601f830112612f20578081fd5b81356020612f30612ebb836134bd565b8281528181019085830183850287018401881015612f4c578586fd5b855b85811015612f0357813584529284019290840190600101612f4e565b803560098110610ef557600080fd5b600060208284031215612f8a578081fd5b81356107da816134db565b60008060408385031215612fa7578081fd5b8235612fb2816134db565b91506020830135612fc2816134db565b809150509250929050565b600080600060608486031215612fe1578081fd5b8335612fec816134db565b92506020840135612ffc816134db565b929592945050506040919091013590565b6000806040838503121561301f578182fd5b823561302a816134db565b946020939093013593505050565b6000806040838503121561304a578182fd5b823567ffffffffffffffff80821115613061578384fd5b61306d86838701612e9b565b93506020850135915080821115613082578283fd5b5061308f85828601612f10565b9150509250929050565b600080600060608486031215612fe1578283fd5b6000602082840312156130be578081fd5b6107da82612f6a565b600080604083850312156130d9578182fd5b612fb283612f6a565b6000806000606084860312156130f6578283fd5b612fec84612f6a565b600080600060608486031215613113578283fd5b61311c84612f6a565b9250602084013567ffffffffffffffff80821115613138578384fd5b61314487838801612e9b565b93506040860135915080821115613159578283fd5b5061316686828701612f10565b9150509250925092565b600060208284031215613181578081fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff851682526040602083015282604083015282846060840137818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b6101208101818360005b600981101561323c57815183526020928301929091019060010161321d565b50505092915050565b901515815260200190565b608081016009861061325e57fe5b94815273ffffffffffffffffffffffffffffffffffffffff93841660208201529190921660408201526060015290565b6000602080835283518082850152825b818110156132ba5785810183015185820160400152820161329e565b818111156132cb5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6020808252600e908201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604082015260600190565b60208082526015908201527f496e73756666696369656e7420756e6c6f636b65640000000000000000000000604082015260600190565b60208082526019908201527f496e73756666697369656e74206c6f636b65642066756e647300000000000000604082015260600190565b6020808252600d908201527f496e76616c696420696e70757400000000000000000000000000000000000000604082015260600190565b6020808252601d908201527f43616e6e6f74207472616e736665722061667465722072656c65617365000000604082015260600190565b6fffffffffffffffffffffffffffffffff91909116815260200190565b6fffffffffffffffffffffffffffffffff92831681529116602082015260400190565b90815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b6bffffffffffffffffffffffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156134b557fe5b604052919050565b600067ffffffffffffffff8211156134d157fe5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff81168114610d2a57600080fdfe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734c6971756964697479547261703a206d7573742073656e6420746f206f776e6572282945524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c69717569646974794163746976697479547261703a206d7573742073656e6420697420616c6c556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734c69717569646974794163746976697479547261703a206d7573742073656e6420746f206f776e6572282945524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208249af4182c85f2d78c67d1b0099fe28863ca9354cd0b86afafb35da7b31884864736f6c634300070600334c6971756964697479547261703a206d7573742073656e6420746f206f776e657228294c69717569646974794163746976697479547261703a206d7573742073656e6420697420616c6c556e697377617056324c6962726172793a204944454e544943414c5f4144445245535345534c69717569646974794163746976697479547261703a206d7573742073656e6420746f206f776e657228290000000000000000000000006063f7955f756d74cda584fb9748a373490f43bd00000000000000000000000000000000000000000000006c6b935b8bbd4000000000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102775760003560e01c8063715018a611610160578063a9059cbb116100d8578063dd62ed3e1161008c578063e642d3da11610071578063e642d3da146104e9578063f2fde38b1461050a578063fe0cf2541461048b57610277565b8063dd62ed3e146104c3578063e07ca3e2146104d657610277565b8063b3c08f7f116100bd578063b3c08f7f14610493578063b48ecdc51461049b578063bcff895a146104ae57610277565b8063a9059cbb14610478578063aea3df281461048b57610277565b806388d695b21161012f57806395d89b411161011457806395d89b411461043c578063987c56be14610444578063a457c2d71461046557610277565b806388d695b2146104215780638da5cb5b1461043457610277565b8063715018a6146103eb57806379cc6790146103f3578063812a6dbd14610406578063834d81851461041957610277565b806339509351116101f357806357ad72d1116101c2578063667022fd116101a7578063667022fd146103b25780636f7f28e9146103c557806370a08231146103d857610277565b806357ad72d114610395578063665a11ca1461039d57610277565b80633950935114610352578063421dd7c71461036557806342966c681461036d57806346022c8a1461038057610277565b806318160ddd1161024a578063245bde3e1161022f578063245bde3e1461030a5780632dc02e451461031d578063313ce5671461033d57610277565b806318160ddd146102e257806323b872dd146102f757610277565b8063042ee4261461027c57806306fdde0314610291578063095ea7b3146102af5780631509b0bd146102cf575b600080fd5b61028f61028a366004613099565b61051d565b005b61029961062e565b6040516102a6919061328e565b60405180910390f35b6102c26102bd36600461300d565b6106e2565b6040516102a69190613245565b6102c26102dd36600461300d565b610700565b6102ea610739565b6040516102a69190613452565b6102c2610305366004612fcd565b61073f565b61028f6103183660046130e2565b6107e1565b61033061032b366004612f79565b610b55565b6040516102a69190613213565b610345610be3565b6040516102a69190613472565b6102c261036036600461300d565b610bec565b61028f610c47565b61028f61037b366004613170565b610d19565b610388610d2d565b6040516102a69190613412565b610345610d4a565b6103a5610d4f565b6040516102a69190613188565b6102ea6103c0366004612f79565b610d6b565b6102ea6103d33660046130c7565b610d7d565b6102ea6103e6366004612f79565b610ece565b61028f610efa565b61028f61040136600461300d565b611011565b61028f6104143660046130ad565b611061565b6102c26110b5565b61028f61042f366004613038565b6110be565b6103a561113e565b61029961115a565b6104576104523660046130c7565b6111d9565b6040516102a692919061342f565b6102c261047336600461300d565b611220565b6102c261048636600461300d565b611295565b6103456112a9565b6102ea6112ae565b61028f6104a93660046130ff565b6112b6565b6104b661133c565b6040516102a69190613480565b6102ea6104d1366004612f95565b611368565b6103456104e4366004613170565b6113a0565b6104fc6104f73660046130ad565b6113ca565b6040516102a692919061345b565b61028f610518366004612f79565b6113ee565b610525611866565b73ffffffffffffffffffffffffffffffffffffffff1661054361113e565b73ffffffffffffffffffffffffffffffffffffffff16146105c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda6105ee611866565b600036604051610600939291906131a9565b60405180910390a161062973ffffffffffffffffffffffffffffffffffffffff8416838361186a565b505050565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106d85780601f106106ad576101008083540402835291602001916106d8565b820191906000526020600020905b8154815290600101906020018083116106bb57829003601f168201915b5050505050905090565b60006106f66106ef611866565b84846118f7565b5060015b92915050565b6009602052816000526040600020816003811061071c57600080fd5b602081049091015460ff601f9092166101000a9004169150829050565b60045490565b600061074c848484611a3e565b6107d684610758611866565b6107d1856040518060600160405280602881526020016136676028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600360205260408120906107a3611866565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190611c10565b6118f7565b5060015b9392505050565b60008111610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906132ff565b60405180910390fd5b6000600c600085600881111561083657fe5b600881111561084157fe5b81526020019081526020016000206000610859611866565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081016000208151808301909252546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169181018290529150156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906133db565b80516fffffffffffffffffffffffffffffffff16821115610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b9061336d565b805161096a90610965906fffffffffffffffffffffffffffffffff1684611cc1565b6116f4565b600c600086600881111561097a57fe5b600881111561098557fe5b8152602001908152602001600020600061099d611866565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610a7e61096583600c6000886008811115610a2757fe5b6008811115610a3257fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8a1682529092529020546fffffffffffffffffffffffffffffffff1690611775565b600c6000866008811115610a8e57fe5b6008811115610a9957fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff88168252909252902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff929092169190911790557f6fe310bb7d850fc3c435d767d20a91767a68d529d9993b1b59202f78abac673384610b35611866565b8585604051610b479493929190613250565b60405180910390a150505050565b610b5d612e75565b610b68600183610d7d565b6020820152610b78600283610d7d565b6040820152610b88600383610d7d565b6060820152610b98600483610d7d565b6080820152610ba8600583610d7d565b60a0820152610bb8600683610d7d565b60c0820152610bc8600783610d7d565b60e0820152610bd8600883610d7d565b610100820152919050565b60075460ff1690565b60006106f6610bf9611866565b846107d18560036000610c0a611866565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c168152925290205490611775565b610c4f611866565b73ffffffffffffffffffffffffffffffffffffffff16610c6d61113e565b73ffffffffffffffffffffffffffffffffffffffff1614610cef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610d2a610d24611866565b82611d38565b50565b60075461010090046fffffffffffffffffffffffffffffffff1681565b600f81565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60086020526000908152604090205481565b600080600b6000856008811115610d9057fe5b6008811115610d9b57fe5b81526020808201929092526040908101600090812082518084019093525463ffffffff808216845264010000000090910416928201929092529150600c81866008811115610de557fe5b6008811115610df057fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825283528181208251808401909352546fffffffffffffffffffffffffffffffff8082168085527001000000000000000000000000000000009092041683850181905293860151865193955090939263ffffffff91821691610e8991610e829116611e82565b8590611ea4565b81610e9057fe5b0490506000610e9f8285611f17565b9050828111610eb757600096505050505050506106fa565b610ec18184611cc1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600260205260409020545b919050565b610f02611866565b73ffffffffffffffffffffffffffffffffffffffff16610f2061113e565b73ffffffffffffffffffffffffffffffffffffffff1614610fa257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006110438260405180606001604052806024815260200161368f6024913961103c866104d1611866565b9190611c10565b905061105783611051611866565b836118f7565b6106298383611d38565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda61108a611866565b60003660405161109c939291906131a9565b60405180910390a1610d2a816110b0611866565b611f2d565b600d5460ff1681565b80518251146110f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906133a4565b60005b82518110156106295761113583828151811061111457fe5b602002602001015183838151811061112857fe5b6020026020010151611295565b506001016110fc565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106d85780601f106106ad576101008083540402835291602001916106d8565b600c6020908152600092835260408084209091529082529020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b60006106f661122d611866565b846107d1856040518060600160405280602581526020016137726025913960036000611257611866565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d16815292529020549190611c10565b60006106f66112a2611866565b8484611a3e565b600381565b63607041c081565b80518251146112f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906133a4565b60005b82518110156113365761132e8484838151811061130d57fe5b602002602001015184848151811061132157fe5b60200260200101516107e1565b6001016112f4565b50505050565b6000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b600a81600381106113b057600080fd5b60209182820401919006915054906101000a900460ff1681565b600b6020526000908152604090205463ffffffff8082169164010000000090041682565b6113f6611866565b73ffffffffffffffffffffffffffffffffffffffff1661141461113e565b73ffffffffffffffffffffffffffffffffffffffff161461149657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806135436026913960400191505060405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080600061159f8585612139565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b600063ffffffff8211156116f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f75696e743332206f766572666c6f770000000000000000000000000000000000604482015290519081900360640190fd5b5090565b60006fffffffffffffffffffffffffffffffff8211156116f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f75696e74313238206f766572666c6f7700000000000000000000000000000000604482015290519081900360640190fd5b6000828201838110156107da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006bffffffffffffffffffffffff8211156116f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f75696e743936206f766572666c6f770000000000000000000000000000000000604482015290519081900360640190fd5b3390565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261062990849061228c565b73ffffffffffffffffffffffffffffffffffffffff8316611963576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806137246024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135696022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316611aaa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806136d46025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611b16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806134fe6023913960400191505060405180910390fd5b611b21838383612364565b611b6b816040518060600160405280602681526020016135ae6026913973ffffffffffffffffffffffffffffffffffffffff86166000908152600260205260409020549190611c10565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260205260408082209390935590841681522054611ba79082611775565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611cb9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c7e578181015183820152602001611c66565b50505050905090810190601f168015611cab5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082821115611d3257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b73ffffffffffffffffffffffffffffffffffffffff8216611da4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806136b36021913960400191505060405180910390fd5b611db082600083612364565b611dfa816040518060600160405280602281526020016135216022913973ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020549190611c10565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902055600454611e2d9082611cc1565b60045560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000611e8d82612390565b15611e9a57506000610ef5565b6106fa4283611cc1565b600082611eb3575060006106fa565b82820282848281611ec057fe5b04146107da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806136466021913960400191505060405180910390fd5b6000818310611f2657816107da565b5090919050565b6000600b6000846008811115611f3f57fe5b6008811115611f4a57fe5b81526020808201929092526040908101600090812082518084019093525463ffffffff808216845264010000000090910416928201929092529150600c81856008811115611f9457fe5b6008811115611f9f57fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8716825283528181208251808401909352546fffffffffffffffffffffffffffffffff8082168085527001000000000000000000000000000000009092041683850181905293860151865193955090939263ffffffff9182169161203191610e829116611e82565b8161203857fe5b04905060006120478285611f17565b9050828111612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b90613336565b600061208e8285611cc1565b9050612099826116f4565b600c60008b60088111156120a957fe5b60088111156120b457fe5b81526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8d168252909252902080546fffffffffffffffffffffffffffffffff92831670010000000000000000000000000000000002921691909117905561212e89600881111561212757fe5b8983611a3e565b505050505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806135fb6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106121fb5782846121fe565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661228557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60006122ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123a39092919063ffffffff16565b8051909150156106295780806020019051602081101561230d57600080fd5b5051610629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613748602a913960400191505060405180910390fd5b61236f838383610629565b600d5460ff1615610629576123858383836123ba565b6106298383836128fb565b60006106fa61239e83612b75565b612b7a565b60606123b28484600085612b7e565b949350505050565b6123c5838383612d38565b600080546123f8907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16612dd7565b600054909150600390612430907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16612dd7565b10156126ca5760005473ffffffffffffffffffffffffffffffffffffffff858116911614801561247b575060005473ffffffffffffffffffffffffffffffffffffffff848116911614155b801561249e57506103e88373ffffffffffffffffffffffffffffffffffffffff16115b80156124aa5750600082115b1561256d5773ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902060019082600381106124e257fe5b602091828204019190066101000a81548160ff02191690831515021790555060ff8016600a826003811061251257fe5b602081049091015460ff601f9092166101000a900416101561256857600a816003811061253b57fe5b60208104919091018054601f9092166101000a60ff81810219841693829004811660010116029190911790555b6126ca565b60005473ffffffffffffffffffffffffffffffffffffffff8581169116148015906125b2575060005473ffffffffffffffffffffffffffffffffffffffff8481169116145b80156125d557506103e88473ffffffffffffffffffffffffffffffffffffffff16115b80156125e15750600082115b156126ca576000600a82600381106125f557fe5b602081049091015460ff601f9092166101000a90041611156126ca5773ffffffffffffffffffffffffffffffffffffffff84166000908152600960205260409020600190826003811061264457fe5b602091828204019190066101000a81548160ff02191690831515021790555060ff8016600a826003811061267457fe5b602081049091015460ff601f9092166101000a90041610156126ca57600a816003811061269d57fe5b60208104919091018054601f9092166101000a60ff81810219841693829004811660010116029190911790555b604080516060810191829052600091600a906003908285855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116126e3575050505073ffffffffffffffffffffffffffffffffffffffff881660009081526009602052604080822081516060810192839052959650919493509091506003908285855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116127545790505050505050905060005b60038110156128f257600f8382600381106127a557fe5b602002015160ff161180156127c757508181600381106127c157fe5b60200201515b156128ea576127d461113e565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806136f9602b913960400191505060405180910390fd5b8461286188610ece565b146128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806135d46027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff871660009081526009602052604081206128e591612e94565b6128f2565b60010161278e565b50505050505050565b612906838383612d38565b60005460039061293b907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16612dd7565b1015612a055760005473ffffffffffffffffffffffffffffffffffffffff8481169116148015612986575060005473ffffffffffffffffffffffffffffffffffffffff838116911614155b80156129a957506103e88273ffffffffffffffffffffffffffffffffffffffff16115b15612a055773ffffffffffffffffffffffffffffffffffffffff82166000908152600860205260409020546129de9082611775565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020555b60075473ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260409020546101009091046fffffffffffffffffffffffffffffffff161161062957612a5361113e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061358b6023913960400191505060405180910390fd5b80612ae084610ece565b14612b4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c6971756964697479547261703a206d7573742073656e6420697420616c6c00604482015290519081900360640190fd5b505073ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040812055565b421190565b1590565b606082471015612bd9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806136206026913960400191505060405180910390fd5b612be285612def565b612c4d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612cb657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c79565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612d18576040519150601f19603f3d011682016040523d82523d6000602084013e612d1d565b606091505b5091509150612d2d828286612df5565b979650505050505050565b6000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16158015612d88575060005473ffffffffffffffffffffffffffffffffffffffff8381169116145b8015612d945750600081115b1561062957612da2436117e9565b600060146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505050565b600043821115612de957506000610ef5565b50430390565b3b151590565b60608315612e045750816107da565b825115612e145782518084602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152845160248401528451859391928392604401919085019080838360008315611c7e578181015183820152602001611c66565b6040518061012001604052806009906020820280368337509192915050565b5060009055565b600082601f830112612eab578081fd5b81356020612ec0612ebb836134bd565b613499565b8281528181019085830183850287018401881015612edc578586fd5b855b85811015612f03578135612ef1816134db565b84529284019290840190600101612ede565b5090979650505050505050565b600082601f830112612f20578081fd5b81356020612f30612ebb836134bd565b8281528181019085830183850287018401881015612f4c578586fd5b855b85811015612f0357813584529284019290840190600101612f4e565b803560098110610ef557600080fd5b600060208284031215612f8a578081fd5b81356107da816134db565b60008060408385031215612fa7578081fd5b8235612fb2816134db565b91506020830135612fc2816134db565b809150509250929050565b600080600060608486031215612fe1578081fd5b8335612fec816134db565b92506020840135612ffc816134db565b929592945050506040919091013590565b6000806040838503121561301f578182fd5b823561302a816134db565b946020939093013593505050565b6000806040838503121561304a578182fd5b823567ffffffffffffffff80821115613061578384fd5b61306d86838701612e9b565b93506020850135915080821115613082578283fd5b5061308f85828601612f10565b9150509250929050565b600080600060608486031215612fe1578283fd5b6000602082840312156130be578081fd5b6107da82612f6a565b600080604083850312156130d9578182fd5b612fb283612f6a565b6000806000606084860312156130f6578283fd5b612fec84612f6a565b600080600060608486031215613113578283fd5b61311c84612f6a565b9250602084013567ffffffffffffffff80821115613138578384fd5b61314487838801612e9b565b93506040860135915080821115613159578283fd5b5061316686828701612f10565b9150509250925092565b600060208284031215613181578081fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff851682526040602083015282604083015282846060840137818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b6101208101818360005b600981101561323c57815183526020928301929091019060010161321d565b50505092915050565b901515815260200190565b608081016009861061325e57fe5b94815273ffffffffffffffffffffffffffffffffffffffff93841660208201529190921660408201526060015290565b6000602080835283518082850152825b818110156132ba5785810183015185820160400152820161329e565b818111156132cb5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6020808252600e908201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604082015260600190565b60208082526015908201527f496e73756666696369656e7420756e6c6f636b65640000000000000000000000604082015260600190565b60208082526019908201527f496e73756666697369656e74206c6f636b65642066756e647300000000000000604082015260600190565b6020808252600d908201527f496e76616c696420696e70757400000000000000000000000000000000000000604082015260600190565b6020808252601d908201527f43616e6e6f74207472616e736665722061667465722072656c65617365000000604082015260600190565b6fffffffffffffffffffffffffffffffff91909116815260200190565b6fffffffffffffffffffffffffffffffff92831681529116602082015260400190565b90815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b6bffffffffffffffffffffffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156134b557fe5b604052919050565b600067ffffffffffffffff8211156134d157fe5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff81168114610d2a57600080fdfe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734c6971756964697479547261703a206d7573742073656e6420746f206f776e6572282945524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c69717569646974794163746976697479547261703a206d7573742073656e6420697420616c6c556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734c69717569646974794163746976697479547261703a206d7573742073656e6420746f206f776e6572282945524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208249af4182c85f2d78c67d1b0099fe28863ca9354cd0b86afafb35da7b31884864736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000006063f7955f756d74cda584fb9748a373490f43bd00000000000000000000000000000000000000000000006c6b935b8bbd4000000000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

-----Decoded View---------------
Arg [0] : _distributor (address): 0x6063F7955f756d74Cda584fb9748a373490F43bd
Arg [1] : _trapAmount (uint128): 2000000000000000000000
Arg [2] : _uniswapV2Factory (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
Arg [3] : _pairToken (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000006063f7955f756d74cda584fb9748a373490f43bd
Arg [1] : 00000000000000000000000000000000000000000000006c6b935b8bbd400000
Arg [2] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2


Deployed Bytecode Sourcemap

232:8414:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4124:156;;;;;;:::i;:::-;;:::i;:::-;;2134:89:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4210:166;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;437:67:7:-;;;;;;:::i;:::-;;:::i;3201:106:2:-;;;:::i;:::-;;;;;;;:::i;4843:317::-;;;;;;:::i;:::-;;:::i;5394:586:6:-;;;;;;:::i;:::-;;:::i;7646:575::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3052:89:2:-;;;:::i;:::-;;;;;;;:::i;5555:215::-;;;;;;:::i;:::-;;:::i;8227:84:6:-;;;:::i;506:89:3:-;;;;;;:::i;:::-;;:::i;365:25:9:-;;;:::i;:::-;;;;;;;:::i;382:49:7:-;;;:::i;163:28:8:-;;;:::i;:::-;;;;;;;:::i;396:38:9:-;;;;;;:::i;:::-;;:::i;6954:666:6:-;;;;;;:::i;:::-;;:::i;3365:125:2:-;;;;;;:::i;:::-;;:::i;1693:145:11:-;;;:::i;901:290:3:-;;;;;;:::i;:::-;;:::i;6034:99:6:-;;;;;;:::i;:::-;;:::i;1100:28::-;;;:::i;4794:251::-;;;;;;:::i;:::-;;:::i;1061:85:11:-;;;:::i;2336:93:2:-;;;:::i;905:58:6:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;6257:266:2:-;;;;;;:::i;:::-;;:::i;3693:172::-;;;;;;:::i;:::-;;:::i;330:46:7:-;;;:::i;1011:41:6:-;;;:::i;5051:290::-;;;;;;:::i;:::-;;:::i;669:33:8:-;;;:::i;:::-;;;;;;;:::i;3923:149:2:-;;;;;;:::i;:::-;;:::i;510:53:7:-;;;;;;:::i;:::-;;:::i;849:50:6:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1987:240:11:-;;;;;;:::i;:::-;;:::i;4124:156:6:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1289:28:6::1;1294:12;:10;:12::i;:::-;1308:8;;1289:28;;;;;;;;:::i;:::-;;;;;;;;4234:39:::2;:19;::::0;::::2;4254:9:::0;4265:7;4234:19:::2;:39::i;:::-;4124:156:::0;;;:::o;2134:89:2:-;2211:5;2204:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2179:13;;2204:12;;2211:5;;2204:12;;2211:5;2204:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2134:89;:::o;4210:166::-;4293:4;4309:39;4318:12;:10;:12::i;:::-;4332:7;4341:6;4309:8;:39::i;:::-;-1:-1:-1;4365:4:2;4210:166;;;;;:::o;437:67:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;437:67:7;;-1:-1:-1;437:67:7:o;3201:106:2:-;3288:12;;3201:106;:::o;4843:317::-;4949:4;4965:36;4975:6;4983:9;4994:6;4965:9;:36::i;:::-;5011:121;5020:6;5028:12;:10;:12::i;:::-;5042:89;5080:6;5042:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;5062:12;:10;:12::i;:::-;5042:33;;;;;;;;;;;;;-1:-1:-1;5042:33:2;;;:89;:37;:89::i;:::-;5011:8;:121::i;:::-;-1:-1:-1;5149:4:2;4843:317;;;;;;:::o;5394:586:6:-;5498:1;5488:7;:11;5480:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;5528:17;5548:5;:16;5554:9;5548:16;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;5565:12;:10;:12::i;:::-;5548:30;;;;;;;;;;;;;;;;-1:-1:-1;5548:30:6;5528:50;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5596:19:6;5588:61;;;;;;;;;;;;:::i;:::-;5667:13;;:24;;;-1:-1:-1;5667:24:6;5659:62;;;;;;;;;;;;:::i;:::-;5773:13;;:38;;:26;;:17;;5791:7;5773:17;:26::i;:::-;:36;:38::i;:::-;5732:5;:16;5738:9;5732:16;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;5749:12;:10;:12::i;:::-;5732:30;;;;;;;;;;;;;;;:38;;;:79;;;;;;;;;;;;;;;;;;5853:54;:42;5887:7;5853:5;:16;5859:9;5853:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5853:16:6;;;:21;;;;;;;;;;:29;;;;:33;:42::i;:54::-;5821:5;:16;5827:9;5821:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5821:16:6;;;:21;;;;;;;;;;:86;;;;;;;;;;;;;;;5922:51;5935:9;5946:12;:10;:12::i;:::-;5960:3;5965:7;5922:51;;;;;;;;;:::i;:::-;;;;;;;;5394:586;;;;:::o;7646:575::-;7708:22;;:::i;:::-;7755:34;7766:13;7781:7;7755:10;:34::i;:::-;7742:10;;;:47;7812:37;7823:16;7841:7;7812:10;:37::i;:::-;7799:10;;;:50;7872:39;7883:18;7903:7;7872:10;:39::i;:::-;7859:10;;;:52;7934:39;7945:18;7965:7;7934:10;:39::i;:::-;7921:10;;;:52;7996:40;8007:19;8028:7;7996:10;:40::i;:::-;7983:10;;;:53;8059:34;8070:13;8085:7;8059:10;:34::i;:::-;8046:10;;;:47;8116:37;8127:16;8145:7;8116:10;:37::i;:::-;8103:10;;;:50;8176:38;8187:17;8206:7;8176:10;:38::i;:::-;8163:10;;;:51;:7;7646:575;-1:-1:-1;7646:575:6:o;3052:89:2:-;3125:9;;;;3052:89;:::o;5555:215::-;5643:4;5659:83;5668:12;:10;:12::i;:::-;5682:7;5691:50;5730:10;5691:11;:25;5703:12;:10;:12::i;:::-;5691:25;;;;;;;;;;;;;;;;;;-1:-1:-1;5691:25:2;;;:34;;;;;;;;;;;:38;:50::i;8227:84:6:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8287:9:6::1;:17:::0;;;::::1;::::0;;8227:84::o;506:89:3:-;561:27;567:12;:10;:12::i;:::-;581:6;561:5;:27::i;:::-;506:89;:::o;365:25:9:-;;;;;;;;;:::o;382:49:7:-;429:2;382:49;:::o;163:28:8:-;;;;;;:::o;396:38:9:-;;;;;;;;;;;;;:::o;6954:666:6:-;7031:4;7047:29;7079:11;:22;7091:9;7079:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7079:22:6;;;7047:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7132:5:6;-1:-1:-1;7138:9:6;7132:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7132:16:6;;;:25;;;;;;;;;;7112:45;;;;;;;;;;;;;;;;;;;;;;;;;;;7319:19;;;;7290:24;;7112:45;;-1:-1:-1;7112:45:6;;;7270:68;;;;;:46;;7283:32;;;:6;:32::i;:::-;7270:8;;:12;:46::i;:::-;:68;;;;;;7248:90;;7348:22;7373:34;7382:14;7398:8;7373;:34::i;:::-;7348:59;;7443:9;7422:17;:30;7418:69;;7475:1;7468:8;;;;;;;;;;7418:69;7581:32;:17;7603:9;7581:21;:32::i;:::-;7574:39;6954:666;-1:-1:-1;;;;;;;;;6954:666:6:o;3365:125:2:-;3465:18;;;3439:7;3465:18;;;:9;:18;;;;;;3365:125;;;;:::o;1693:145:11:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1783:6:::1;::::0;1762:40:::1;::::0;1799:1:::1;::::0;1762:40:::1;1783:6;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1812:6;:19:::0;;;::::1;::::0;;1693:145::o;901:290:3:-;977:26;1006:84;1043:6;1006:84;;;;;;;;;;;;;;;;;:32;1016:7;1025:12;:10;:12::i;1006:32::-;:36;:84;:36;:84::i;:::-;977:113;;1101:51;1110:7;1119:12;:10;:12::i;:::-;1133:18;1101:8;:51::i;:::-;1162:22;1168:7;1177:6;1162:5;:22::i;6034:99:6:-;1289:28;1294:12;:10;:12::i;:::-;1308:8;;1289:28;;;;;;;;:::i;:::-;;;;;;;;6097:29:::1;6106:5;6113:12;:10;:12::i;:::-;6097:8;:29::i;1100:28::-:0;;;;;;:::o;4794:251::-;4901:7;:14;4887:3;:10;:28;4879:54;;;;;;;;;;;;:::i;:::-;4948:7;4943:96;4966:3;:10;4961:2;:15;4943:96;;;4998:30;5007:3;5011:2;5007:7;;;;;;;;;;;;;;5016;5024:2;5016:11;;;;;;;;;;;;;;4998:8;:30::i;:::-;-1:-1:-1;4978:4:6;;4943:96;;1061:85:11;1133:6;;;;1061:85;:::o;2336:93:2:-;2415:7;2408:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2383:13;;2408:14;;2415:7;;2408:14;;2415:7;2408:14;;;;;;;;;;;;;;;;;;;;;;;;905:58:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6257:266:2:-;6350:4;6366:129;6375:12;:10;:12::i;:::-;6389:7;6398:96;6437:15;6398:96;;;;;;;;;;;;;;;;;:11;:25;6410:12;:10;:12::i;:::-;6398:25;;;;;;;;;;;;;;;;;;-1:-1:-1;6398:25:2;;;:34;;;;;;;;;;;:96;:38;:96::i;3693:172::-;3779:4;3795:42;3805:12;:10;:12::i;:::-;3819:9;3830:6;3795:9;:42::i;330:46:7:-;375:1;330:46;:::o;1011:41:6:-;1042:10;1011:41;:::o;5051:290::-;5182:7;:14;5168:3;:10;:28;5160:54;;;;;;;;;;;;:::i;:::-;5229:7;5224:111;5247:3;:10;5242:2;:15;5224:111;;;5279:45;5292:9;5303:3;5307:2;5303:7;;;;;;;;;;;;;;5312;5320:2;5312:11;;;;;;;;;;;;;;5279:12;:45::i;:::-;5259:4;;5224:111;;;;5051:290;;;:::o;669:33:8:-;;;;;;;;;:::o;3923:149:2:-;4038:18;;;;4012:7;4038:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3923:149::o;510:53:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;849:50:6:-;;;;;;;;;;;;;;;;;;;;;;:::o;1987:240:11:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2075:22:::1;::::0;::::1;2067:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2176:6;::::0;2155:38:::1;::::0;::::1;::::0;;::::1;::::0;2176:6:::1;::::0;2155:38:::1;::::0;2176:6:::1;::::0;2155:38:::1;2203:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;1987:240::o;671:470:14:-;760:12;785:14;801;819:26;830:6;838;819:10;:26::i;:::-;979:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;969:43;;;;;;885:246;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:257;;;;;;;;;671:470;-1:-1:-1;;;;;671:470:14:o;459:145:4:-;508:6;534:16;;;;526:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;594:2:4;459:145::o;917:150::-;967:7;994:17;;;;986:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2682:175:13;2740:7;2771:5;;;2794:6;;;;2786:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;610:145:4;659:6;685:16;;;;677:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;598:104:1;685:10;598:104;:::o;677:175:12:-;786:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;809:23;786:58;;;759:86;;779:5;;759:19;:86::i;9321:340:2:-;9422:19;;;9414:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9500:21;;;9492:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9571:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9622:32;;;;;;;;;;;;;;;;;9321:340;;;:::o;6997:530::-;7102:20;;;7094:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7182:23;;;7174:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7256:47;7277:6;7285:9;7296:6;7256:20;:47::i;:::-;7334:71;7356:6;7334:71;;;;;;;;;;;;;;;;;:17;;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;7314:17;;;;;;;;:9;:17;;;;;;:91;;;;7438:20;;;;;;;:32;;7463:6;7438:24;:32::i;:::-;7415:20;;;;;;;;:9;:20;;;;;;;;;:55;;;;7485:35;;;;;;;7415:20;;7485:35;;;;;;;;;;;;;6997:530;;;:::o;5424:163:13:-;5510:7;5545:12;5537:6;;;;5529:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5575:5:13;;;5424:163::o;3128:155::-;3186:7;3218:1;3213;:6;;3205:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3271:5:13;;;3128:155::o;8488:410:2:-;8571:21;;;8563:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8641:49;8662:7;8679:1;8683:6;8641:20;:49::i;:::-;8722:68;8745:6;8722:68;;;;;;;;;;;;;;;;;:18;;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;8701:18;;;;;;;:9;:18;;;;;:89;8815:12;;:24;;8832:6;8815:16;:24::i;:::-;8800:12;:39;8854:37;;;;;;;;8880:1;;8854:37;;;;;;;;;;;;;8488:410;;:::o;4504:185:6:-;4558:4;4578:22;4589:10;4578;:22::i;:::-;4574:61;;;-1:-1:-1;4623:1:6;4616:8;;4574:61;4651:31;:15;4671:10;4651:19;:31::i;3530:215:13:-;3588:7;3611:6;3607:20;;-1:-1:-1;3626:1:13;3619:8;;3607:20;3649:5;;;3653:1;3649;:5;:1;3672:5;;;;;:10;3664:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;391:104:10;449:7;479:1;475;:5;:13;;487:1;475:13;;;-1:-1:-1;483:1:10;;468:20;-1:-1:-1;391:104:10:o;6139:789:6:-;6212:29;6244:11;:22;6256:9;6244:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6244:22:6;;;6212:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6297:5:6;-1:-1:-1;6303:9:6;6297:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6297:16:6;;;:25;;;;;;;;;;6277:45;;;;;;;;;;;;;;;;;;;;;;;;;;;6484:19;;;;6455:24;;6277:45;;-1:-1:-1;6277:45:6;;;6435:68;;;;;:46;;6448:32;;;:6;:32::i;6435:46::-;:68;;;;;;6413:90;;6513:22;6538:34;6547:14;6563:8;6538;:34::i;:::-;6513:59;;6611:9;6591:17;:29;6583:63;;;;;;;;;;;;:::i;:::-;6734:12;6749:32;:17;6771:9;6749:21;:32::i;:::-;6734:47;;6829:29;:17;:27;:29::i;:::-;6792:5;:16;6798:9;6792:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6792:16:6;;;:25;;;;;;;;;;:66;;;;;;;;;;;;;;;;6868:53;6891:9;6886:15;;;;;;;;6904:7;6913;6868:9;:53::i;:::-;6139:789;;;;;;;;;:::o;237:345:14:-;312:14;328;372:6;362:16;;:6;:16;;;;354:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;458:6;449:15;;:6;:15;;;:53;;487:6;495;449:53;;;468:6;476;449:53;430:72;;-1:-1:-1;430:72:14;-1:-1:-1;520:20:14;;;512:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;237:345;;;;;:::o;2940:751:12:-;3359:23;3385:69;3413:4;3385:69;;;;;;;;;;;;;;;;;3393:5;3385:27;;;;:69;;;;;:::i;:::-;3468:17;;3359:95;;-1:-1:-1;3468:21:12;3464:221;;3608:10;3597:30;;;;;;;;;;;;;;;-1:-1:-1;3597:30:12;3589:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8317:327:6;8417:47;8444:5;8451:3;8456:7;8417:26;:47::i;:::-;8478:9;;;;8474:164;;;8503:59;8542:5;8549:3;8554:7;8503:38;:59::i;:::-;8576:51;8607:5;8614:3;8619:7;8576:30;:51::i;4395:103::-;4448:4;4471:20;4476:14;4484:5;4476:7;:14::i;:::-;4471:4;:20::i;3573:193:0:-;3676:12;3707:52;3729:6;3737:4;3743:1;3746:12;3707:21;:52::i;:::-;3700:59;3573:193;-1:-1:-1;;;;3573:193:0:o;570:1711:7:-;679:64;723:5;730:3;735:7;679:43;:64::i;:::-;753:19;788;;775:33;;788:19;;;;;775:12;:33::i;:::-;835:19;;753:55;;-1:-1:-1;375:1:7;;822:33;;835:19;;;;;822:12;:33::i;:::-;:56;818:912;;;955:13;;;946:22;;;955:13;;946:22;:46;;;;-1:-1:-1;979:13:7;;;972:20;;;979:13;;972:20;;946:46;:66;;;;;1008:4;1001:3;996:9;;:16;946:66;:81;;;;;1026:1;1016:7;:11;946:81;942:778;;;1047:18;;;;;;;:13;:18;;;;;1084:4;;1066:14;1047:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;1147:15;1110:52;;:18;1129:14;1110:34;;;;;;;;;;;;;;;;;;;;;;;;:52;1106:135;;;1186:18;1205:14;1186:34;;;;;;;;;;;;;;:36;;:34;;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;1106:135;942:778;;;1274:13;;;1265:22;;;1274:13;;1265:22;;;;:46;;-1:-1:-1;1298:13:7;;;1291:20;;;1298:13;;1291:20;1265:46;:68;;;;;1329:4;1320:5;1315:11;;:18;1265:68;:83;;;;;1347:1;1337:7;:11;1265:83;1261:459;;;1455:1;1418:18;1437:14;1418:34;;;;;;;;;;;;;;;;;;;;;;;;:38;1414:292;;;1480:20;;;;;;;:13;:20;;;;;1519:4;;1501:14;1480:36;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;1586:15;1549:52;;:18;1568:14;1549:34;;;;;;;;;;;;;;;;;;;;;;;;:52;1545:143;;;1629:18;1648:14;1629:34;;;;;;;;;;;;;;:36;;:34;;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;1545:143;1739:61;;;;;;;;;;-1:-1:-1;;1782:18:7;;1739:61;;1782:18;-1:-1:-1;1739:61:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;1853:20:7;;;1810:40;1853:20;;;:13;:20;;;;;;1810:63;;;;;;;;;1739:61;;-1:-1:-1;1810:40:7;;:63;-1:-1:-1;1853:20:7;;-1:-1:-1;1810:63:7;;1853:20;1810:40;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1888:6;1883:392;375:1;1900:24;;1883:392;;;429:2;1949:5;1955:1;1949:8;;;;;;;;;;;:33;;;:46;;;;;1986:6;1993:1;1986:9;;;;;;;;;;;1949:46;1945:320;;;2030:7;:5;:7::i;:::-;2023:14;;:3;:14;;;2015:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2131:7;2111:16;2121:5;2111:9;:16::i;:::-;:27;2103:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2207:20;;;;;;;:13;:20;;;;;2200:27;;;:::i;:::-;2245:5;;1945:320;1926:3;;1883:392;;;;570:1711;;;;;;:::o;521:695:9:-;622:64;666:5;673:3;678:7;622:43;:64::i;:::-;713:19;;358:1;;700:33;;713:19;;;;;700:12;:33::i;:::-;:47;696:268;;;824:13;;;815:22;;;824:13;;815:22;:46;;;;-1:-1:-1;848:13:9;;;841:20;;;848:13;;841:20;;815:46;:66;;;;;877:4;870:3;865:9;;:16;815:66;811:143;;;915:11;;;;;;;:6;:11;;;;;;:24;;931:7;915:15;:24::i;:::-;901:11;;;;;;;:6;:11;;;;;:38;811:143;995:10;;978:13;;;;;;;:6;:13;;;;;;995:10;;;;;;-1:-1:-1;974:236:9;;1036:7;:5;:7::i;:::-;1029:14;;:3;:14;;;1021:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1125:7;1105:16;1115:5;1105:9;:16::i;:::-;:27;1097:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1182:13:9;;1198:1;1182:13;;;:6;:13;;;;;:17;521:695::o;4286:103:6:-;4359:15;-1:-1:-1;;4286:103:6:o;4695:93::-;4770:11;;4695:93::o;4600:523:0:-;4727:12;4784:5;4759:21;:30;;4751:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4850:18;4861:6;4850:10;:18::i;:::-;4842:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4973:12;4987:23;5014:6;:11;;5034:5;5042:4;5014:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4972:75;;;;5064:52;5082:7;5091:10;5103:12;5064:17;:52::i;:::-;5057:59;4600:523;-1:-1:-1;;;;;;;4600:523:0:o;709:253:8:-;821:19;;;;;;;:24;:48;;;;-1:-1:-1;856:13:8;;;849:20;;;856:13;;849:20;821:48;:63;;;;;883:1;873:7;:11;821:63;817:139;;;922:23;:12;:21;:23::i;:::-;900:19;;:45;;;;;;;;;;;;;;;;;;709:253;;;:::o;366:195::-;429:4;464:12;449;:27;445:66;;;-1:-1:-1;499:1:8;492:8;;445:66;-1:-1:-1;527:12:8;:27;;366:195::o;718:413:0:-;1078:20;1116:8;;;718:413::o;7083:725::-;7198:12;7226:7;7222:580;;;-1:-1:-1;7256:10:0;7249:17;;7222:580;7367:17;;:21;7363:429;;7625:10;7619:17;7685:15;7672:10;7668:2;7664:19;7657:44;7574:145;7757:20;;;;;;;;;;;;;;;;;;;;7764:12;;7757:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;:::o;14:782:15:-;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;239:65;254:49;300:2;254:49;:::i;:::-;239:65;:::i;:::-;338:15;;;369:12;;;;401:15;;;447:11;;;435:24;;431:33;;428:42;-1:-1:-1;425:2:15;;;487:5;480;473:20;425:2;513:5;527:240;541:2;538:1;535:9;527:240;;;612:3;599:17;629:33;656:5;629:33;:::i;:::-;675:18;;713:12;;;;745;;;;559:1;552:9;527:240;;;-1:-1:-1;785:5:15;;84:712;-1:-1:-1;;;;;;;84:712:15:o;801:705::-;;914:3;907:4;899:6;895:17;891:27;881:2;;936:5;929;922:20;881:2;976:6;963:20;1002:4;1026:65;1041:49;1087:2;1041:49;:::i;1026:65::-;1125:15;;;1156:12;;;;1188:15;;;1234:11;;;1222:24;;1218:33;;1215:42;-1:-1:-1;1212:2:15;;;1274:5;1267;1260:20;1212:2;1300:5;1314:163;1328:2;1325:1;1322:9;1314:163;;;1385:17;;1373:30;;1423:12;;;;1455;;;;1346:1;1339:9;1314:163;;1511:152;1588:20;;1637:1;1627:12;;1617:2;;1653:1;1650;1643:12;1668:259;;1780:2;1768:9;1759:7;1755:23;1751:32;1748:2;;;1801:6;1793;1786:22;1748:2;1845:9;1832:23;1864:33;1891:5;1864:33;:::i;1932:402::-;;;2061:2;2049:9;2040:7;2036:23;2032:32;2029:2;;;2082:6;2074;2067:22;2029:2;2126:9;2113:23;2145:33;2172:5;2145:33;:::i;:::-;2197:5;-1:-1:-1;2254:2:15;2239:18;;2226:32;2267:35;2226:32;2267:35;:::i;:::-;2321:7;2311:17;;;2019:315;;;;;:::o;2339:470::-;;;;2485:2;2473:9;2464:7;2460:23;2456:32;2453:2;;;2506:6;2498;2491:22;2453:2;2550:9;2537:23;2569:33;2596:5;2569:33;:::i;:::-;2621:5;-1:-1:-1;2678:2:15;2663:18;;2650:32;2691:35;2650:32;2691:35;:::i;:::-;2443:366;;2745:7;;-1:-1:-1;;;2799:2:15;2784:18;;;;2771:32;;2443:366::o;2814:327::-;;;2943:2;2931:9;2922:7;2918:23;2914:32;2911:2;;;2964:6;2956;2949:22;2911:2;3008:9;2995:23;3027:33;3054:5;3027:33;:::i;:::-;3079:5;3131:2;3116:18;;;;3103:32;;-1:-1:-1;;;2901:240:15:o;3146:637::-;;;3325:2;3313:9;3304:7;3300:23;3296:32;3293:2;;;3346:6;3338;3331:22;3293:2;3391:9;3378:23;3420:18;3461:2;3453:6;3450:14;3447:2;;;3482:6;3474;3467:22;3447:2;3510:67;3569:7;3560:6;3549:9;3545:22;3510:67;:::i;:::-;3500:77;;3630:2;3619:9;3615:18;3602:32;3586:48;;3659:2;3649:8;3646:16;3643:2;;;3680:6;3672;3665:22;3643:2;;3708:69;3769:7;3758:8;3747:9;3743:24;3708:69;:::i;:::-;3698:79;;;3283:500;;;;;:::o;3788:485::-;;;;3949:2;3937:9;3928:7;3924:23;3920:32;3917:2;;;3970:6;3962;3955:22;4278:218;;4403:2;4391:9;4382:7;4378:23;4374:32;4371:2;;;4424:6;4416;4409:22;4371:2;4452:38;4480:9;4452:38;:::i;4501:355::-;;;4643:2;4631:9;4622:7;4618:23;4614:32;4611:2;;;4664:6;4656;4649:22;4611:2;4692:38;4720:9;4692:38;:::i;4861:423::-;;;;5020:2;5008:9;4999:7;4995:23;4991:32;4988:2;;;5041:6;5033;5026:22;4988:2;5069:38;5097:9;5069:38;:::i;5289:733::-;;;;5498:2;5486:9;5477:7;5473:23;5469:32;5466:2;;;5519:6;5511;5504:22;5466:2;5547:38;5575:9;5547:38;:::i;:::-;5537:48;;5636:2;5625:9;5621:18;5608:32;5659:18;5700:2;5692:6;5689:14;5686:2;;;5721:6;5713;5706:22;5686:2;5749:67;5808:7;5799:6;5788:9;5784:22;5749:67;:::i;:::-;5739:77;;5869:2;5858:9;5854:18;5841:32;5825:48;;5898:2;5888:8;5885:16;5882:2;;;5919:6;5911;5904:22;5882:2;;5947:69;6008:7;5997:8;5986:9;5982:24;5947:69;:::i;:::-;5937:79;;;5456:566;;;;;:::o;6027:190::-;;6139:2;6127:9;6118:7;6114:23;6110:32;6107:2;;;6160:6;6152;6145:22;6107:2;-1:-1:-1;6188:23:15;;6097:120;-1:-1:-1;6097:120:15:o;6222:226::-;6398:42;6386:55;;;;6368:74;;6356:2;6341:18;;6323:125::o;6453:578::-;;6658:42;6650:6;6646:55;6635:9;6628:74;6738:2;6733;6722:9;6718:18;6711:30;6777:6;6772:2;6761:9;6757:18;6750:34;6834:6;6826;6821:2;6810:9;6806:18;6793:48;6861:22;;;6885:2;6857:31;;;6850:45;;;;6947:2;6935:15;;;6952:66;6931:88;6916:104;6912:113;;6618:413;-1:-1:-1;;6618:413:15:o;7036:495::-;7216:3;7201:19;;7205:9;7297:6;7036:495;7331:194;7345:4;7342:1;7339:11;7331:194;;;7404:13;;7392:26;;7441:4;7465:12;;;;7500:15;;;;7365:1;7358:9;7331:194;;;7335:3;;;7183:348;;;;:::o;7536:187::-;7701:14;;7694:22;7676:41;;7664:2;7649:18;;7631:92::o;7728:536::-;7965:3;7950:19;;7999:1;7988:13;;7978:2;;8005:9;7978:2;8025:25;;;8069:42;8147:15;;;8142:2;8127:18;;8120:43;8199:15;;;;8194:2;8179:18;;8172:43;8246:2;8231:18;8224:34;7932:332;:::o;8269:662::-;;8410:2;8439;8428:9;8421:21;8471:6;8465:13;8514:6;8509:2;8498:9;8494:18;8487:34;8539:4;8552:140;8566:6;8563:1;8560:13;8552:140;;;8661:14;;;8657:23;;8651:30;8627:17;;;8646:2;8623:26;8616:66;8581:10;;8552:140;;;8710:6;8707:1;8704:13;8701:2;;;8780:4;8775:2;8766:6;8755:9;8751:22;8747:31;8740:45;8701:2;-1:-1:-1;8847:2:15;8835:15;8852:66;8831:88;8816:104;;;;8922:2;8812:113;;8390:541;-1:-1:-1;;;8390:541:15:o;8936:338::-;9138:2;9120:21;;;9177:2;9157:18;;;9150:30;9216:16;9211:2;9196:18;;9189:44;9265:2;9250:18;;9110:164::o;9279:345::-;9481:2;9463:21;;;9520:2;9500:18;;;9493:30;9559:23;9554:2;9539:18;;9532:51;9615:2;9600:18;;9453:171::o;9629:349::-;9831:2;9813:21;;;9870:2;9850:18;;;9843:30;9909:27;9904:2;9889:18;;9882:55;9969:2;9954:18;;9803:175::o;9983:337::-;10185:2;10167:21;;;10224:2;10204:18;;;10197:30;10263:15;10258:2;10243:18;;10236:43;10311:2;10296:18;;10157:163::o;10325:353::-;10527:2;10509:21;;;10566:2;10546:18;;;10539:30;10605:31;10600:2;10585:18;;10578:59;10669:2;10654:18;;10499:179::o;10683:218::-;10859:34;10847:47;;;;10829:66;;10817:2;10802:18;;10784:117::o;10906:319::-;11090:34;11151:15;;;11133:34;;11203:15;;11198:2;11183:18;;11176:43;11068:2;11053:18;;11035:190::o;11230:177::-;11376:25;;;11364:2;11349:18;;11331:76::o;11412:291::-;11592:10;11629:15;;;11611:34;;11681:15;;11676:2;11661:18;;11654:43;11570:2;11555:18;;11537:166::o;11708:184::-;11880:4;11868:17;;;;11850:36;;11838:2;11823:18;;11805:87::o;11897:208::-;12071:26;12059:39;;;;12041:58;;12029:2;12014:18;;11996:109::o;12110:242::-;12180:2;12174:9;12210:17;;;12257:18;12242:34;;12278:22;;;12239:62;12236:2;;;12304:9;12236:2;12331;12324:22;12154:198;;-1:-1:-1;12154:198:15:o;12357:183::-;;12456:18;12448:6;12445:30;12442:2;;;12478:9;12442:2;-1:-1:-1;12529:4:15;12510:17;;;12506:28;;12432:108::o;12545:156::-;12633:42;12626:5;12622:54;12615:5;12612:65;12602:2;;12691:1;12688;12681:12

Swarm Source

ipfs://8249af4182c85f2d78c67d1b0099fe28863ca9354cd0b86afafb35da7b318848
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.