ETH Price: $3,395.75 (-1.84%)
Gas: 6 Gwei

Token

Rekt Ralph (REKT)
 

Overview

Max Total Supply

420,690,000,000,000 REKT

Holders

165

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.774563918591386793 REKT

Value
$0.00
0xf21f6acd67cb797c2ba40e540097225f992a6d84
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RektRalph

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-07
*/

pragma solidity 0.8.20;

// SPDX-License-Identifier: MIT

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

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

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

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20{
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);
    }

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, 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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

library SafeERC20 {
    using Address for address;

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

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

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

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

interface ILpPair {
    function sync() external;
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}

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

contract RektRalph is ERC20, Ownable {

    mapping (address => bool) public exemptFromFees;
    mapping (address => bool) public exemptFromLimits;

    bool public tradingAllowed;

    mapping (address => bool) public isAMMPair;

    address public treasuryAddress;

    uint64 public tax;

    mapping(address => uint256) private _holderLastTransferBlock; // MEV protection
    bool public antiMevEnabled = true;

    bool public limited = true;

    uint256 public swapTokensAtAmt;

    address public lpPair;
    IDexRouter public dexRouter;
    address public immutable WETH;

    TxLimits public txLimits;

    uint64 public constant FEE_DIVISOR = 10000;

    // structs

    struct TxLimits {
        uint128 transactionLimit;
        uint128 walletLimit;
    }

    // events

    event UpdatedTransactionLimit(uint newMax);
    event UpdatedWalletLimit(uint newMax);
    event SetExemptFromFees(address _address, bool _isExempt);
    event SetExemptFromLimits(address _address, bool _isExempt);
    event RemovedLimits();
    event UpdatedTax(uint newAmt);

    // constructor

    constructor()
        ERC20("Rekt Ralph", "REKT")
    {   
        _mint(msg.sender, 420_690_000_000_000 * 1e18);

        address _v2Router;

        // @dev assumes WETH pair
        if(block.chainid == 1){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 5){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 97){
            _v2Router = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1;
        } else if(block.chainid == 42161){
            _v2Router = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
        } else {
            revert("Chain not configured");
        }

        dexRouter = IDexRouter(_v2Router);

        txLimits.transactionLimit = uint128(totalSupply() * 5 / 1000);
        txLimits.walletLimit = uint128(totalSupply() * 1 / 100);
        swapTokensAtAmt = totalSupply() * 25 / 100000;

        treasuryAddress = msg.sender; // update

        tax = 200;

        WETH = dexRouter.WETH();
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), WETH);

        isAMMPair[lpPair] = true;

        exemptFromLimits[lpPair] = true;
        exemptFromLimits[msg.sender] = true;
        exemptFromLimits[address(this)] = true;

        exemptFromFees[msg.sender] = true;
        exemptFromFees[address(this)] = true;
 
        _approve(address(this), address(dexRouter), type(uint256).max);
        _approve(address(msg.sender), address(dexRouter), totalSupply());
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        
        if(!exemptFromFees[from] && !exemptFromFees[to]){
            require(tradingAllowed, "Trading not active");
            checkLimits(from, to, amount);
            amount -= handleTax(from, to, amount);
        }

        super._transfer(from,to,amount);
    }

    function checkLimits(address from, address to, uint256 amount) internal {
        if(limited){
            bool exFromLimitsTo = exemptFromLimits[to];
            uint256 balanceOfTo = balanceOf(to);
            TxLimits memory _txLimits = txLimits;
            // buy
            if (isAMMPair[from] && !exFromLimitsTo) {
                require(amount <= _txLimits.transactionLimit, "Max Txn");
                require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
            } 
            // sell
            else if (isAMMPair[to] && !exemptFromLimits[from]) {
                require(amount <= _txLimits.transactionLimit, "Max Txn");
            }
            else if(!exFromLimitsTo) {
                require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
            }
        }

        if (antiMevEnabled){
            if(isAMMPair[to]){
                require(_holderLastTransferBlock[from] < block.number, "Anti MEV");
            } else {
                _holderLastTransferBlock[to] = block.number;
                _holderLastTransferBlock[tx.origin] = block.number;
            }
        }
    }

    function handleTax(address from, address to, uint256 amount) internal returns (uint256){

        if(balanceOf(address(this)) >= swapTokensAtAmt && !isAMMPair[from]) {
            convertTaxes();
        }
        
        uint128 _tax = 0;


        if (isAMMPair[to] || isAMMPair[from]){
            _tax = uint128(amount * tax / FEE_DIVISOR);
            super._transfer(from, address(this), _tax);
        }
        
        return _tax;
    }

    function swapTokensForETH(uint256 tokenAmt) private {

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

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmt,
            0,
            path,
            address(treasuryAddress),
            block.timestamp
        );
    }

    function convertTaxes() private {

        uint256 contractBalance = balanceOf(address(this));

        if(contractBalance > swapTokensAtAmt * 20){
            contractBalance = swapTokensAtAmt * 20;
        }

        if(contractBalance > 0){
            swapTokensForETH(contractBalance);
        }
    }

    // owner functions
    function setExemptFromFee(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        require(_address != address(this), "Cannot unexempt contract");
        exemptFromFees[_address] = _isExempt;
        emit SetExemptFromFees(_address, _isExempt);
    }

    function setExemptFromLimit(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        if(!_isExempt){
            require(_address != lpPair, "Cannot remove pair");
        }
        exemptFromLimits[_address] = _isExempt;
        emit SetExemptFromLimits(_address, _isExempt);
    }

    function updateTransactionLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 1000)/(10**decimals()), "Too low");
        txLimits.transactionLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedTransactionLimit(txLimits.transactionLimit);
    }

    function updateWalletLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 1000)/(10**decimals()), "Too low");
        txLimits.walletLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedWalletLimit(txLimits.walletLimit);
    }

    function updateSwapTokensAmt(uint256 newAmount) external onlyOwner {
        require(newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply.");
        swapTokensAtAmt = newAmount;
    }

    function updateTax(uint64 _tax) external onlyOwner {
        require(_tax  <= 500, "Keep tax below 10%");
        tax = _tax;
        emit UpdatedTax(_tax);
    }

    function enableTrading() external onlyOwner {
        require(!tradingAllowed, "Trading already enabled");
        tradingAllowed = true;
    }

    function removeLimits() external onlyOwner {
        limited = false;
        TxLimits memory _txLimits;
        uint256 supply = totalSupply();
        _txLimits.transactionLimit = uint128(supply);
        _txLimits.walletLimit = uint128(supply);
        txLimits = _txLimits;
        emit RemovedLimits();
    }

    function updateMevBlockerEnabled(bool _enabled) external onlyOwner {
        antiMevEnabled = _enabled;
    }

    function airdropToWallets(address[] calldata wallets, uint256[] calldata amountsInWei) external onlyOwner {
        require(wallets.length == amountsInWei.length, "arrays length mismatch");
        for(uint256 i = 0; i < wallets.length; i++){
            super._transfer(msg.sender, wallets[i], amountsInWei[i]);
        }
    }

    function rescueTokens(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token),_to, _contractBalance);
    }

    function updateTreasuryAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        treasuryAddress = _address;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetExemptFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetExemptFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedTransactionLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedWalletLimit","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiMevEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAMMPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tax","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"txLimits","outputs":[{"internalType":"uint128","name":"transactionLimit","type":"uint128"},{"internalType":"uint128","name":"walletLimit","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateMevBlockerEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_tax","type":"uint64"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newNumInTokens","type":"uint128"}],"name":"updateTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newNumInTokens","type":"uint128"}],"name":"updateWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600c805461ffff19166101011790553480156200001f575f80fd5b506040518060400160405280600a8152602001690a4cad6e840a4c2d8e0d60b31b81525060405180604001604052806004815260200163149152d560e21b815250816003908162000071919062000784565b50600462000080828262000784565b5050505f62000094620004f860201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000fb336d14bddab3e51a57cff87a50000000620004fc565b5f46600103620001215750737a250d5630b4cf539739df2c5dacb4c659f2488d620001de565b46600503620001465750737a250d5630b4cf539739df2c5dacb4c659f2488d620001de565b466061036200016b575073d99d1c33f9fc3444f8101754abc46c52416550d1620001de565b4661a4b103620001915750731b02da8cb0d097eb8d57a175b88c7d8b47997506620001de565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b600f80546001600160a01b0319166001600160a01b0383161790556103e86200020660025490565b6200021390600562000860565b6200021f919062000880565b601080546001600160801b0319166001600160801b039290921691909117905560646200024b60025490565b6200025890600162000860565b62000264919062000880565b601080546001600160801b03928316600160801b029216919091179055620186a06200028f60025490565b6200029c90601962000860565b620002a8919062000880565b600d55600a80546001600160e01b03191633600160a01b600160e01b03191617601960a31b179055600f54604080516315ab88c960e31b815290516001600160a01b039092169163ad5c4648916004808201926020929091908290030181865afa15801562000319573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200033f9190620008a0565b6001600160a01b03908116608052600f546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa1580156200038e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003b49190620008a0565b6080516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af115801562000403573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004299190620008a0565b600e80546001600160a01b0319166001600160a01b0392831690811782555f908152600960209081526040808320805460ff1990811660019081179092559454861684526007835281842080548616821790553380855282852080548716831790553080865283862080548816841790559085526006909352818420805486168217905582845292208054909316909117909155600f54620004ce92165f19620005bd565b600f54620004f19033906001600160a01b0316620004eb60025490565b620005bd565b50620008e5565b3390565b6001600160a01b038216620005545760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620001d5565b8060025f828254620005679190620008cf565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038316620006215760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620001d5565b6001600160a01b038216620006845760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620001d5565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200070d57607f821691505b6020821081036200072c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200077f575f81815260208120601f850160051c810160208610156200075a5750805b601f850160051c820191505b818110156200077b5782815560010162000766565b5050505b505050565b81516001600160401b03811115620007a057620007a0620006e4565b620007b881620007b18454620006f8565b8462000732565b602080601f831160018114620007ee575f8415620007d65750858301515b5f19600386901b1c1916600185901b1785556200077b565b5f85815260208120601f198616915b828110156200081e57888601518255948401946001909101908401620007fd565b50858210156200083c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200087a576200087a6200084c565b92915050565b5f826200089b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215620008b1575f80fd5b81516001600160a01b0381168114620008c8575f80fd5b9392505050565b808201808211156200087a576200087a6200084c565b608051612429620009055f395f81816104d40152611c8d01526124295ff3fe608060405234801561000f575f80fd5b506004361061023f575f3560e01c8063841e456111610135578063a9059cbb116100b4578063c78d0fa011610079578063c78d0fa01461053e578063ccad03e114610547578063dd62ed3e1461055a578063f270fde41461056d578063f2fde38b146105ab575f80fd5b8063a9059cbb146104bc578063ad5c4648146104cf578063b0249cc6146104f6578063bedafd0114610518578063c5f956af1461052b575f80fd5b8063925c3ff3116100fa578063925c3ff31461045157806395d89b411461046457806399c8d5561461046c5780639e93ad8e146104a0578063a457c2d7146104a9575f80fd5b8063841e4561146103f1578063860a32ec146104045780638a8c523c146104165780638d3e6e401461041e5780638da5cb5b14610440575f80fd5b8063452ed4f1116101c1578063627e9d8e11610186578063627e9d8e1461039957806366ebd39a146103a657806370a08231146103b9578063715018a6146103e1578063751039fc146103e9575f80fd5b8063452ed4f11461033157806353371be0146103445780635431c94e1461035157806359758994146103645780635a90a49e14610377575f80fd5b80632307b441116102075780632307b441146102d657806323b872dd146102e9578063313ce567146102fc57806336e18e191461030b578063395093511461031e575f80fd5b806306fdde03146102435780630758d92414610261578063095ea7b31461028c57806318160ddd146102af57806321045918146102c1575b5f80fd5b61024b6105be565b6040516102589190611ed1565b60405180910390f35b600f54610274906001600160a01b031681565b6040516001600160a01b039091168152602001610258565b61029f61029a366004611f1e565b61064e565b6040519015158152602001610258565b6002545b604051908152602001610258565b6102d46102cf366004611f46565b610667565b005b6102d46102e4366004611fa5565b6107bb565b61029f6102f736600461200c565b610899565b60405160128152602001610258565b6102d4610319366004612045565b6108bc565b61029f61032c366004611f1e565b6109dd565b600e54610274906001600160a01b031681565b60085461029f9060ff1681565b6102d461035f366004612072565b6109fe565b6102d46103723660046120b0565b610af8565b61029f6103853660046120cb565b60066020525f908152604090205460ff1681565b600c5461029f9060ff1681565b6102d46103b4366004612045565b610b35565b6102b36103c73660046120cb565b6001600160a01b03165f9081526020819052604090205490565b6102d4610c49565b6102d4610cbc565b6102d46103ff3660046120cb565b610d5c565b600c5461029f90610100900460ff1681565b6102d4610ded565b61029f61042c3660046120cb565b60076020525f908152604090205460ff1681565b6005546001600160a01b0316610274565b6102d461045f3660046120e4565b610e79565b61024b610f50565b600a5461048790600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610258565b61048761271081565b61029f6104b7366004611f1e565b610f5f565b61029f6104ca366004611f1e565b610fd9565b6102747f000000000000000000000000000000000000000000000000000000000000000081565b61029f6105043660046120cb565b60096020525f908152604090205460ff1681565b6102d461052636600461210b565b610fe6565b600a54610274906001600160a01b031681565b6102b3600d5481565b6102d461055536600461210b565b611110565b6102b3610568366004612072565b611232565b60105461058b906001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610258565b6102d46105b93660046120cb565b61125c565b6060600380546105cd90612140565b80601f01602080910402602001604051908101604052809291908181526020018280546105f990612140565b80156106445780601f1061061b57610100808354040283529160200191610644565b820191905f5260205f20905b81548152906001019060200180831161062757829003601f168201915b5050505050905090565b5f3361065b818585611346565b60019150505b92915050565b6005546001600160a01b0316331461069a5760405162461bcd60e51b815260040161069190612178565b60405180910390fd5b620186a06106a760025490565b6106b29060016121c1565b6106bc91906121d8565b8110156107295760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610691565b6103e861073560025490565b6107409060056121c1565b61074a91906121d8565b8111156107b65760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610691565b600d55565b6005546001600160a01b031633146107e55760405162461bcd60e51b815260040161069190612178565b82811461082d5760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610691565b5f5b83811015610892576108803386868481811061084d5761084d6121f7565b905060200201602081019061086291906120cb565b858585818110610874576108746121f7565b90506020020135611469565b8061088a8161220b565b91505061082f565b5050505050565b5f336108a685828561160c565b6108b1858585611684565b506001949350505050565b6005546001600160a01b031633146108e65760405162461bcd60e51b815260040161069190612178565b6108f26012600a612303565b6103e86108fe60025490565b6109099060016121c1565b61091391906121d8565b61091d91906121d8565b816001600160801b0316101561095f5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610691565b61096b6012600a612303565b61097e906001600160801b0383166121c1565b601080546fffffffffffffffffffffffffffffffff19166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f3361065b8185856109ef8383611232565b6109f99190612311565b611346565b6005546001600160a01b03163314610a285760405162461bcd60e51b815260040161069190612178565b6001600160a01b038216610a7e5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610691565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae69190612324565b9050610af383838361173e565b505050565b6005546001600160a01b03163314610b225760405162461bcd60e51b815260040161069190612178565b600c805460ff1916911515919091179055565b6005546001600160a01b03163314610b5f5760405162461bcd60e51b815260040161069190612178565b610b6b6012600a612303565b6103e8610b7760025490565b610b829060016121c1565b610b8c91906121d8565b610b9691906121d8565b816001600160801b03161015610bd85760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610691565b610be46012600a612303565b610bf7906001600160801b0383166121c1565b601080546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade0788906020016109d2565b6005546001600160a01b03163314610c735760405162461bcd60e51b815260040161069190612178565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610ce65760405162461bcd60e51b815260040161069190612178565b600c805461ff0019169055604080518082019091525f80825260208201525f610d0e60025490565b6001600160801b03811680845260208401819052600160801b8102176010556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b6005546001600160a01b03163314610d865760405162461bcd60e51b815260040161069190612178565b6001600160a01b038116610dcb5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610691565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610e175760405162461bcd60e51b815260040161069190612178565b60085460ff1615610e6a5760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610691565b6008805460ff19166001179055565b6005546001600160a01b03163314610ea35760405162461bcd60e51b815260040161069190612178565b6101f48167ffffffffffffffff161115610ef45760405162461bcd60e51b81526020600482015260126024820152714b656570207461782062656c6f772031302560701b6044820152606401610691565b600a805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff8416908102919091179091556040519081527f5582bb85c6567acbabcb3b1166d082a7a8215af3f33d510a94139c82b8d49043906020016109d2565b6060600480546105cd90612140565b5f3381610f6c8286611232565b905083811015610fcc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610691565b6108b18286868403611346565b5f3361065b818585611684565b6005546001600160a01b031633146110105760405162461bcd60e51b815260040161069190612178565b6001600160a01b0382166110555760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610691565b306001600160a01b038316036110ad5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610691565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b0316331461113a5760405162461bcd60e51b815260040161069190612178565b6001600160a01b03821661117f5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610691565b806111d757600e546001600160a01b03908116908316036111d75760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610691565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101611104565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146112865760405162461bcd60e51b815260040161069190612178565b6001600160a01b0381166112eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610691565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166113a85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610691565b6001600160a01b0382166114095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610691565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166114cd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610691565b6001600160a01b03821661152f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610691565b6001600160a01b0383165f90815260208190526040902054818110156115a65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610691565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b5f6116178484611232565b90505f19811461167e57818110156116715760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610691565b61167e8484848403611346565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff161580156116c457506001600160a01b0382165f9081526006602052604090205460ff16155b156117335760085460ff166117105760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610691565b61171b838383611790565b611726838383611a2e565b611730908261233b565b90505b610af3838383611469565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610af3908490611b0a565b600c54610100900460ff161561198c576001600160a01b038281165f9081526007602090815260408083205483835281842054825180840184526010546001600160801b038082168352600160801b90910416818601529589168552600990935292205460ff928316939192168015611807575082155b156118a85780516001600160801b03168411156118505760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610691565b60208101516001600160801b03166118688386612311565b11156118a35760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610691565b611988565b6001600160a01b0385165f9081526009602052604090205460ff1680156118e757506001600160a01b0386165f9081526007602052604090205460ff16155b156119305780516001600160801b03168411156118a35760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610691565b826119885760208101516001600160801b031661194d8386612311565b11156119885760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610691565b5050505b600c5460ff1615610af3576001600160a01b0382165f9081526009602052604090205460ff1615611a08576001600160a01b0383165f908152600b60205260409020544311610af35760405162461bcd60e51b815260206004820152600860248201526720b73a349026a2ab60c11b6044820152606401610691565b506001600160a01b03165f908152600b6020526040808220439081905532835291205550565b600d54305f90815260208190526040812054909111158015611a6857506001600160a01b0384165f9081526009602052604090205460ff16155b15611a7557611a75611bdb565b6001600160a01b0383165f9081526009602052604081205460ff1680611ab257506001600160a01b0385165f9081526009602052604090205460ff165b15611af957600a5461271090611ad990600160a01b900467ffffffffffffffff16856121c1565b611ae391906121d8565b9050611af98530836001600160801b0316611469565b6001600160801b0316949350505050565b5f611b5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c229092919063ffffffff16565b805190915015610af35780806020019051810190611b7c919061234e565b610af35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610691565b305f90815260208190526040902054600d54611bf89060146121c1565b811115611c1057600d54611c0d9060146121c1565b90505b8015611c1f57611c1f81611c38565b50565b6060611c3084845f85611d3b565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c6b57611c6b6121f7565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611cbf57611cbf6121f7565b6001600160a01b039283166020918202929092010152600f54600a5460405163791ac94760e01b81529183169263791ac94792611d0a9287925f928892909116904290600401612369565b5f604051808303815f87803b158015611d21575f80fd5b505af1158015611d33573d5f803e3d5ffd5b505050505050565b606082471015611d9c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610691565b5f80866001600160a01b03168587604051611db791906123d8565b5f6040518083038185875af1925050503d805f8114611df1576040519150601f19603f3d011682016040523d82523d5f602084013e611df6565b606091505b5091509150611e0787838387611e12565b979650505050505050565b60608315611e805782515f03611e79576001600160a01b0385163b611e795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610691565b5081611c30565b611c308383815115611e955781518083602001fd5b8060405162461bcd60e51b81526004016106919190611ed1565b5f5b83811015611ec9578181015183820152602001611eb1565b50505f910152565b602081525f8251806020840152611eef816040850160208701611eaf565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611f19575f80fd5b919050565b5f8060408385031215611f2f575f80fd5b611f3883611f03565b946020939093013593505050565b5f60208284031215611f56575f80fd5b5035919050565b5f8083601f840112611f6d575f80fd5b50813567ffffffffffffffff811115611f84575f80fd5b6020830191508360208260051b8501011115611f9e575f80fd5b9250929050565b5f805f8060408587031215611fb8575f80fd5b843567ffffffffffffffff80821115611fcf575f80fd5b611fdb88838901611f5d565b90965094506020870135915080821115611ff3575f80fd5b5061200087828801611f5d565b95989497509550505050565b5f805f6060848603121561201e575f80fd5b61202784611f03565b925061203560208501611f03565b9150604084013590509250925092565b5f60208284031215612055575f80fd5b81356001600160801b038116811461206b575f80fd5b9392505050565b5f8060408385031215612083575f80fd5b61208c83611f03565b915061209a60208401611f03565b90509250929050565b8015158114611c1f575f80fd5b5f602082840312156120c0575f80fd5b813561206b816120a3565b5f602082840312156120db575f80fd5b61206b82611f03565b5f602082840312156120f4575f80fd5b813567ffffffffffffffff8116811461206b575f80fd5b5f806040838503121561211c575f80fd5b61212583611f03565b91506020830135612135816120a3565b809150509250929050565b600181811c9082168061215457607f821691505b60208210810361217257634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610661576106616121ad565b5f826121f257634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161221c5761221c6121ad565b5060010190565b600181815b8085111561225d57815f1904821115612243576122436121ad565b8085161561225057918102915b93841c9390800290612228565b509250929050565b5f8261227357506001610661565b8161227f57505f610661565b8160018114612295576002811461229f576122bb565b6001915050610661565b60ff8411156122b0576122b06121ad565b50506001821b610661565b5060208310610133831016604e8410600b84101617156122de575081810a610661565b6122e88383612223565b805f19048211156122fb576122fb6121ad565b029392505050565b5f61206b60ff841683612265565b80820180821115610661576106616121ad565b5f60208284031215612334575f80fd5b5051919050565b81810381811115610661576106616121ad565b5f6020828403121561235e575f80fd5b815161206b816120a3565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156123b75784516001600160a01b031683529383019391830191600101612392565b50506001600160a01b03969096166060850152505050608001529392505050565b5f82516123e9818460208701611eaf565b919091019291505056fea264697066735822122032dc76e0429af9462880dab904b63728da65e11970f75d6befee1766ea7a5efc64736f6c63430008140033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061023f575f3560e01c8063841e456111610135578063a9059cbb116100b4578063c78d0fa011610079578063c78d0fa01461053e578063ccad03e114610547578063dd62ed3e1461055a578063f270fde41461056d578063f2fde38b146105ab575f80fd5b8063a9059cbb146104bc578063ad5c4648146104cf578063b0249cc6146104f6578063bedafd0114610518578063c5f956af1461052b575f80fd5b8063925c3ff3116100fa578063925c3ff31461045157806395d89b411461046457806399c8d5561461046c5780639e93ad8e146104a0578063a457c2d7146104a9575f80fd5b8063841e4561146103f1578063860a32ec146104045780638a8c523c146104165780638d3e6e401461041e5780638da5cb5b14610440575f80fd5b8063452ed4f1116101c1578063627e9d8e11610186578063627e9d8e1461039957806366ebd39a146103a657806370a08231146103b9578063715018a6146103e1578063751039fc146103e9575f80fd5b8063452ed4f11461033157806353371be0146103445780635431c94e1461035157806359758994146103645780635a90a49e14610377575f80fd5b80632307b441116102075780632307b441146102d657806323b872dd146102e9578063313ce567146102fc57806336e18e191461030b578063395093511461031e575f80fd5b806306fdde03146102435780630758d92414610261578063095ea7b31461028c57806318160ddd146102af57806321045918146102c1575b5f80fd5b61024b6105be565b6040516102589190611ed1565b60405180910390f35b600f54610274906001600160a01b031681565b6040516001600160a01b039091168152602001610258565b61029f61029a366004611f1e565b61064e565b6040519015158152602001610258565b6002545b604051908152602001610258565b6102d46102cf366004611f46565b610667565b005b6102d46102e4366004611fa5565b6107bb565b61029f6102f736600461200c565b610899565b60405160128152602001610258565b6102d4610319366004612045565b6108bc565b61029f61032c366004611f1e565b6109dd565b600e54610274906001600160a01b031681565b60085461029f9060ff1681565b6102d461035f366004612072565b6109fe565b6102d46103723660046120b0565b610af8565b61029f6103853660046120cb565b60066020525f908152604090205460ff1681565b600c5461029f9060ff1681565b6102d46103b4366004612045565b610b35565b6102b36103c73660046120cb565b6001600160a01b03165f9081526020819052604090205490565b6102d4610c49565b6102d4610cbc565b6102d46103ff3660046120cb565b610d5c565b600c5461029f90610100900460ff1681565b6102d4610ded565b61029f61042c3660046120cb565b60076020525f908152604090205460ff1681565b6005546001600160a01b0316610274565b6102d461045f3660046120e4565b610e79565b61024b610f50565b600a5461048790600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610258565b61048761271081565b61029f6104b7366004611f1e565b610f5f565b61029f6104ca366004611f1e565b610fd9565b6102747f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61029f6105043660046120cb565b60096020525f908152604090205460ff1681565b6102d461052636600461210b565b610fe6565b600a54610274906001600160a01b031681565b6102b3600d5481565b6102d461055536600461210b565b611110565b6102b3610568366004612072565b611232565b60105461058b906001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610258565b6102d46105b93660046120cb565b61125c565b6060600380546105cd90612140565b80601f01602080910402602001604051908101604052809291908181526020018280546105f990612140565b80156106445780601f1061061b57610100808354040283529160200191610644565b820191905f5260205f20905b81548152906001019060200180831161062757829003601f168201915b5050505050905090565b5f3361065b818585611346565b60019150505b92915050565b6005546001600160a01b0316331461069a5760405162461bcd60e51b815260040161069190612178565b60405180910390fd5b620186a06106a760025490565b6106b29060016121c1565b6106bc91906121d8565b8110156107295760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610691565b6103e861073560025490565b6107409060056121c1565b61074a91906121d8565b8111156107b65760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610691565b600d55565b6005546001600160a01b031633146107e55760405162461bcd60e51b815260040161069190612178565b82811461082d5760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610691565b5f5b83811015610892576108803386868481811061084d5761084d6121f7565b905060200201602081019061086291906120cb565b858585818110610874576108746121f7565b90506020020135611469565b8061088a8161220b565b91505061082f565b5050505050565b5f336108a685828561160c565b6108b1858585611684565b506001949350505050565b6005546001600160a01b031633146108e65760405162461bcd60e51b815260040161069190612178565b6108f26012600a612303565b6103e86108fe60025490565b6109099060016121c1565b61091391906121d8565b61091d91906121d8565b816001600160801b0316101561095f5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610691565b61096b6012600a612303565b61097e906001600160801b0383166121c1565b601080546fffffffffffffffffffffffffffffffff19166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f3361065b8185856109ef8383611232565b6109f99190612311565b611346565b6005546001600160a01b03163314610a285760405162461bcd60e51b815260040161069190612178565b6001600160a01b038216610a7e5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610691565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae69190612324565b9050610af383838361173e565b505050565b6005546001600160a01b03163314610b225760405162461bcd60e51b815260040161069190612178565b600c805460ff1916911515919091179055565b6005546001600160a01b03163314610b5f5760405162461bcd60e51b815260040161069190612178565b610b6b6012600a612303565b6103e8610b7760025490565b610b829060016121c1565b610b8c91906121d8565b610b9691906121d8565b816001600160801b03161015610bd85760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610691565b610be46012600a612303565b610bf7906001600160801b0383166121c1565b601080546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade0788906020016109d2565b6005546001600160a01b03163314610c735760405162461bcd60e51b815260040161069190612178565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610ce65760405162461bcd60e51b815260040161069190612178565b600c805461ff0019169055604080518082019091525f80825260208201525f610d0e60025490565b6001600160801b03811680845260208401819052600160801b8102176010556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b6005546001600160a01b03163314610d865760405162461bcd60e51b815260040161069190612178565b6001600160a01b038116610dcb5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610691565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610e175760405162461bcd60e51b815260040161069190612178565b60085460ff1615610e6a5760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610691565b6008805460ff19166001179055565b6005546001600160a01b03163314610ea35760405162461bcd60e51b815260040161069190612178565b6101f48167ffffffffffffffff161115610ef45760405162461bcd60e51b81526020600482015260126024820152714b656570207461782062656c6f772031302560701b6044820152606401610691565b600a805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff8416908102919091179091556040519081527f5582bb85c6567acbabcb3b1166d082a7a8215af3f33d510a94139c82b8d49043906020016109d2565b6060600480546105cd90612140565b5f3381610f6c8286611232565b905083811015610fcc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610691565b6108b18286868403611346565b5f3361065b818585611684565b6005546001600160a01b031633146110105760405162461bcd60e51b815260040161069190612178565b6001600160a01b0382166110555760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610691565b306001600160a01b038316036110ad5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610691565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b0316331461113a5760405162461bcd60e51b815260040161069190612178565b6001600160a01b03821661117f5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610691565b806111d757600e546001600160a01b03908116908316036111d75760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610691565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101611104565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146112865760405162461bcd60e51b815260040161069190612178565b6001600160a01b0381166112eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610691565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166113a85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610691565b6001600160a01b0382166114095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610691565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166114cd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610691565b6001600160a01b03821661152f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610691565b6001600160a01b0383165f90815260208190526040902054818110156115a65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610691565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b5f6116178484611232565b90505f19811461167e57818110156116715760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610691565b61167e8484848403611346565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff161580156116c457506001600160a01b0382165f9081526006602052604090205460ff16155b156117335760085460ff166117105760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610691565b61171b838383611790565b611726838383611a2e565b611730908261233b565b90505b610af3838383611469565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610af3908490611b0a565b600c54610100900460ff161561198c576001600160a01b038281165f9081526007602090815260408083205483835281842054825180840184526010546001600160801b038082168352600160801b90910416818601529589168552600990935292205460ff928316939192168015611807575082155b156118a85780516001600160801b03168411156118505760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610691565b60208101516001600160801b03166118688386612311565b11156118a35760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610691565b611988565b6001600160a01b0385165f9081526009602052604090205460ff1680156118e757506001600160a01b0386165f9081526007602052604090205460ff16155b156119305780516001600160801b03168411156118a35760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610691565b826119885760208101516001600160801b031661194d8386612311565b11156119885760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610691565b5050505b600c5460ff1615610af3576001600160a01b0382165f9081526009602052604090205460ff1615611a08576001600160a01b0383165f908152600b60205260409020544311610af35760405162461bcd60e51b815260206004820152600860248201526720b73a349026a2ab60c11b6044820152606401610691565b506001600160a01b03165f908152600b6020526040808220439081905532835291205550565b600d54305f90815260208190526040812054909111158015611a6857506001600160a01b0384165f9081526009602052604090205460ff16155b15611a7557611a75611bdb565b6001600160a01b0383165f9081526009602052604081205460ff1680611ab257506001600160a01b0385165f9081526009602052604090205460ff165b15611af957600a5461271090611ad990600160a01b900467ffffffffffffffff16856121c1565b611ae391906121d8565b9050611af98530836001600160801b0316611469565b6001600160801b0316949350505050565b5f611b5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c229092919063ffffffff16565b805190915015610af35780806020019051810190611b7c919061234e565b610af35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610691565b305f90815260208190526040902054600d54611bf89060146121c1565b811115611c1057600d54611c0d9060146121c1565b90505b8015611c1f57611c1f81611c38565b50565b6060611c3084845f85611d3b565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c6b57611c6b6121f7565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611cbf57611cbf6121f7565b6001600160a01b039283166020918202929092010152600f54600a5460405163791ac94760e01b81529183169263791ac94792611d0a9287925f928892909116904290600401612369565b5f604051808303815f87803b158015611d21575f80fd5b505af1158015611d33573d5f803e3d5ffd5b505050505050565b606082471015611d9c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610691565b5f80866001600160a01b03168587604051611db791906123d8565b5f6040518083038185875af1925050503d805f8114611df1576040519150601f19603f3d011682016040523d82523d5f602084013e611df6565b606091505b5091509150611e0787838387611e12565b979650505050505050565b60608315611e805782515f03611e79576001600160a01b0385163b611e795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610691565b5081611c30565b611c308383815115611e955781518083602001fd5b8060405162461bcd60e51b81526004016106919190611ed1565b5f5b83811015611ec9578181015183820152602001611eb1565b50505f910152565b602081525f8251806020840152611eef816040850160208701611eaf565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611f19575f80fd5b919050565b5f8060408385031215611f2f575f80fd5b611f3883611f03565b946020939093013593505050565b5f60208284031215611f56575f80fd5b5035919050565b5f8083601f840112611f6d575f80fd5b50813567ffffffffffffffff811115611f84575f80fd5b6020830191508360208260051b8501011115611f9e575f80fd5b9250929050565b5f805f8060408587031215611fb8575f80fd5b843567ffffffffffffffff80821115611fcf575f80fd5b611fdb88838901611f5d565b90965094506020870135915080821115611ff3575f80fd5b5061200087828801611f5d565b95989497509550505050565b5f805f6060848603121561201e575f80fd5b61202784611f03565b925061203560208501611f03565b9150604084013590509250925092565b5f60208284031215612055575f80fd5b81356001600160801b038116811461206b575f80fd5b9392505050565b5f8060408385031215612083575f80fd5b61208c83611f03565b915061209a60208401611f03565b90509250929050565b8015158114611c1f575f80fd5b5f602082840312156120c0575f80fd5b813561206b816120a3565b5f602082840312156120db575f80fd5b61206b82611f03565b5f602082840312156120f4575f80fd5b813567ffffffffffffffff8116811461206b575f80fd5b5f806040838503121561211c575f80fd5b61212583611f03565b91506020830135612135816120a3565b809150509250929050565b600181811c9082168061215457607f821691505b60208210810361217257634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610661576106616121ad565b5f826121f257634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161221c5761221c6121ad565b5060010190565b600181815b8085111561225d57815f1904821115612243576122436121ad565b8085161561225057918102915b93841c9390800290612228565b509250929050565b5f8261227357506001610661565b8161227f57505f610661565b8160018114612295576002811461229f576122bb565b6001915050610661565b60ff8411156122b0576122b06121ad565b50506001821b610661565b5060208310610133831016604e8410600b84101617156122de575081810a610661565b6122e88383612223565b805f19048211156122fb576122fb6121ad565b029392505050565b5f61206b60ff841683612265565b80820180821115610661576106616121ad565b5f60208284031215612334575f80fd5b5051919050565b81810381811115610661576106616121ad565b5f6020828403121561235e575f80fd5b815161206b816120a3565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156123b75784516001600160a01b031683529383019391830191600101612392565b50506001600160a01b03969096166060850152505050608001529392505050565b5f82516123e9818460208701611eaf565b919091019291505056fea264697066735822122032dc76e0429af9462880dab904b63728da65e11970f75d6befee1766ea7a5efc64736f6c63430008140033

Deployed Bytecode Sourcemap

21481:8780:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4189:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22019:27;;;;;-1:-1:-1;;;;;22019:27:0;;;;;;-1:-1:-1;;;;;853:32:1;;;835:51;;823:2;808:18;22019:27:0;670:222:1;6549:201:0;;;;;;:::i;:::-;;:::i;:::-;;;1499:14:1;;1492:22;1474:41;;1462:2;1447:18;6549:201:0;1334:187:1;5318:108:0;5406:12;;5318:108;;;1672:25:1;;;1660:2;1645:18;5318:108:0;1526:177:1;28312:346:0;;;;;;:::i;:::-;;:::i;:::-;;29442:333;;;;;;:::i;:::-;;:::i;7330:261::-;;;;;;:::i;:::-;;:::i;5160:93::-;;;5243:2;3518:36:1;;3506:2;3491:18;5160:93:0;3376:184:1;27672:322:0;;;;;;:::i;:::-;;:::i;8000:238::-;;;;;;:::i;:::-;;:::i;21991:21::-;;;;;-1:-1:-1;;;;;21991:21:0;;;21639:26;;;;;;;;;29783:296;;;;;;:::i;:::-;;:::i;29323:111::-;;;;;;:::i;:::-;;:::i;21527:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21875:33;;;;;;;;;28002:302;;;;;;:::i;:::-;;:::i;5489:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5590:18:0;5563:7;5590:18;;;;;;;;;;;;5489:127;13103:150;;;:::i;28994:321::-;;;:::i;30087:171::-;;;;;;:::i;:::-;;:::i;21917:26::-;;;;;;;;;;;;28840:146;;;:::i;21581:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;12889:79;12954:6;;-1:-1:-1;;;;;12954:6:0;12889:79;;28666:166;;;;;;:::i;:::-;;:::i;4408:104::-;;;:::i;21764:17::-;;;;;-1:-1:-1;;;21764:17:0;;;;;;;;;5367:18:1;5355:31;;;5337:50;;5325:2;5310:18;21764:17:0;5193:200:1;22124:42:0;;22161:5;22124:42;;8741:436;;;;;;:::i;:::-;;:::i;5822:193::-;;;;;;:::i;:::-;;:::i;22053:29::-;;;;;21674:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26985:319;;;;;;:::i;:::-;;:::i;21725:30::-;;;;;-1:-1:-1;;;;;21725:30:0;;;21952;;;;;;27312:352;;;;;;:::i;:::-;;:::i;6078:151::-;;;;;;:::i;:::-;;:::i;22091:24::-;;;;;-1:-1:-1;;;;;22091:24:0;;;;-1:-1:-1;;;22091:24:0;;;;;;;;;-1:-1:-1;;;;;5963:15:1;;;5945:34;;6015:15;;;;6010:2;5995:18;;5988:43;5865:18;22091:24:0;5718:319:1;13261:244:0;;;;;;:::i;:::-;;:::i;4189:100::-;4243:13;4276:5;4269:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4189:100;:::o;6549:201::-;6632:4;175:10;6688:32;175:10;6704:7;6713:6;6688:8;:32::i;:::-;6738:4;6731:11;;;6549:201;;;;;:::o;28312:346::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;;;;;;;;;28433:6:::1;28412:13;5406:12:::0;;;5318:108;28412:13:::1;:17;::::0;28428:1:::1;28412:17;:::i;:::-;28411:28;;;;:::i;:::-;28398:9;:41;;28390:107;;;::::0;-1:-1:-1;;;28390:107:0;;7517:2:1;28390:107:0::1;::::0;::::1;7499:21:1::0;7556:2;7536:18;;;7529:30;7595:34;7575:18;;;7568:62;-1:-1:-1;;;7646:18:1;;;7639:51;7707:19;;28390:107:0::1;7315:417:1::0;28390:107:0::1;28551:4;28530:13;5406:12:::0;;;5318:108;28530:13:::1;:17;::::0;28546:1:::1;28530:17;:::i;:::-;28529:26;;;;:::i;:::-;28516:9;:39;;28508:104;;;::::0;-1:-1:-1;;;28508:104:0;;7939:2:1;28508:104:0::1;::::0;::::1;7921:21:1::0;7978:2;7958:18;;;7951:30;8017:34;7997:18;;;7990:62;-1:-1:-1;;;8068:18:1;;;8061:50;8128:19;;28508:104:0::1;7737:416:1::0;28508:104:0::1;28623:15;:27:::0;28312:346::o;29442:333::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;29567:37;;::::1;29559:72;;;::::0;-1:-1:-1;;;29559:72:0;;8360:2:1;29559:72:0::1;::::0;::::1;8342:21:1::0;8399:2;8379:18;;;8372:30;-1:-1:-1;;;8418:18:1;;;8411:52;8480:18;;29559:72:0::1;8158:346:1::0;29559:72:0::1;29646:9;29642:126;29661:18:::0;;::::1;29642:126;;;29700:56;29716:10;29728:7;;29736:1;29728:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;29740:12;;29753:1;29740:15;;;;;;;:::i;:::-;;;;;;;29700;:56::i;:::-;29681:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29642:126;;;;29442:333:::0;;;;:::o;7330:261::-;7427:4;175:10;7485:38;7501:4;175:10;7516:6;7485:15;:38::i;:::-;7534:27;7544:4;7550:2;7554:6;7534:9;:27::i;:::-;-1:-1:-1;7579:4:0;;7330:261;-1:-1:-1;;;;7330:261:0:o;27672:322::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;27812:14:::1;5243:2:::0;27812::::1;:14;:::i;:::-;27805:4;27785:13;5406:12:::0;;;5318:108;27785:13:::1;:17;::::0;27801:1:::1;27785:17;:::i;:::-;:24;;;;:::i;:::-;27784:43;;;;:::i;:::-;27766:14;-1:-1:-1::0;;;;;27766:61:0::1;;;27758:81;;;::::0;-1:-1:-1;;;27758:81:0;;10366:2:1;27758:81:0::1;::::0;::::1;10348:21:1::0;10405:1;10385:18;;;10378:29;-1:-1:-1;;;10423:18:1;;;10416:37;10470:18;;27758:81:0::1;10164:330:1::0;27758:81:0::1;27904:14;5243:2:::0;27904::::1;:14;:::i;:::-;27886:33;::::0;-1:-1:-1;;;;;27886:33:0;::::1;;:::i;:::-;27850:8;:70:::0;;-1:-1:-1;;27850:70:0::1;-1:-1:-1::0;;;;;27850:70:0;;;::::1;::::0;;::::1;::::0;;27936:50:::1;::::0;10645:66:1;;;27936:50:0::1;::::0;10633:2:1;10618:18;27936:50:0::1;;;;;;;;27672:322:::0;:::o;8000:238::-;8088:4;175:10;8144:64;175:10;8160:7;8197:10;8169:25;175:10;8160:7;8169:9;:25::i;:::-;:38;;;;:::i;:::-;8144:8;:64::i;29783:296::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29872:20:0;::::1;29864:59;;;::::0;-1:-1:-1;;;29864:59:0;;11054:2:1;29864:59:0::1;::::0;::::1;11036:21:1::0;11093:2;11073:18;;;11066:30;11132:28;11112:18;;;11105:56;11178:18;;29864:59:0::1;10852:350:1::0;29864:59:0::1;29961:39;::::0;-1:-1:-1;;;29961:39:0;;29994:4:::1;29961:39;::::0;::::1;835:51:1::0;29934:24:0::1;::::0;-1:-1:-1;;;;;29961:24:0;::::1;::::0;::::1;::::0;808:18:1;;29961:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29934:66;;30011:60;30041:6;30049:3;30054:16;30011:22;:60::i;:::-;29853:226;29783:296:::0;;:::o;29323:111::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;29401:14:::1;:25:::0;;-1:-1:-1;;29401:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29323:111::o;28002:302::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;28137:14:::1;5243:2:::0;28137::::1;:14;:::i;:::-;28130:4;28110:13;5406:12:::0;;;5318:108;28110:13:::1;:17;::::0;28126:1:::1;28110:17;:::i;:::-;:24;;;;:::i;:::-;28109:43;;;;:::i;:::-;28091:14;-1:-1:-1::0;;;;;28091:61:0::1;;;28083:81;;;::::0;-1:-1:-1;;;28083:81:0;;10366:2:1;28083:81:0::1;::::0;::::1;10348:21:1::0;10405:1;10385:18;;;10378:29;-1:-1:-1;;;10423:18:1;;;10416:37;10470:18;;28083:81:0::1;10164:330:1::0;28083:81:0::1;28224:14;5243:2:::0;28224::::1;:14;:::i;:::-;28206:33;::::0;-1:-1:-1;;;;;28206:33:0;::::1;;:::i;:::-;28175:8;:65:::0;;-1:-1:-1;;;;;28175:65:0;;::::1;-1:-1:-1::0;;;28175:65:0;;::::1;::::0;::::1;;::::0;;;;28256:40:::1;::::0;28275:20;;;::::1;;10645:66:1::0;;28256:40:0::1;::::0;10633:2:1;10618:18;28256:40:0::1;10499:218:1::0;13103:150:0;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;13196:6:::1;::::0;13175:40:::1;::::0;13212:1:::1;::::0;-1:-1:-1;;;;;13196:6:0::1;::::0;13175:40:::1;::::0;13212:1;;13175:40:::1;13226:6;:19:::0;;-1:-1:-1;;;;;;13226:19:0::1;::::0;;13103:150::o;28994:321::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;29048:7:::1;:15:::0;;-1:-1:-1;;29048:15:0::1;::::0;;-1:-1:-1;;;;;;;;;29058:5:0::1;-1:-1:-1::0;;;;;;;29110:14:0::1;29127:13;5406:12:::0;;;5318:108;29127:13:::1;-1:-1:-1::0;;;;;29151:44:0;::::1;::::0;;;29206:21:::1;::::0;::::1;:39:::0;;;-1:-1:-1;;;29256:20:0;::::1;;:8;:20:::0;29292:15:::1;::::0;29110:30;;-1:-1:-1;29292:15:0::1;::::0;29151:26:::1;::::0;29292:15:::1;29037:278;;28994:321::o:0;30087:171::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30174:22:0;::::1;30166:47;;;::::0;-1:-1:-1;;;30166:47:0;;11598:2:1;30166:47:0::1;::::0;::::1;11580:21:1::0;11637:2;11617:18;;;11610:30;-1:-1:-1;;;11656:18:1;;;11649:42;11708:18;;30166:47:0::1;11396:336:1::0;30166:47:0::1;30224:15;:26:::0;;-1:-1:-1;;;;;;30224:26:0::1;-1:-1:-1::0;;;;;30224:26:0;;;::::1;::::0;;;::::1;::::0;;30087:171::o;28840:146::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;28904:14:::1;::::0;::::1;;28903:15;28895:51;;;::::0;-1:-1:-1;;;28895:51:0;;11939:2:1;28895:51:0::1;::::0;::::1;11921:21:1::0;11978:2;11958:18;;;11951:30;12017:25;11997:18;;;11990:53;12060:18;;28895:51:0::1;11737:347:1::0;28895:51:0::1;28957:14;:21:::0;;-1:-1:-1;;28957:21:0::1;28974:4;28957:21;::::0;;28840:146::o;28666:166::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;28745:3:::1;28736:4;:12;;;;28728:43;;;::::0;-1:-1:-1;;;28728:43:0;;12291:2:1;28728:43:0::1;::::0;::::1;12273:21:1::0;12330:2;12310:18;;;12303:30;-1:-1:-1;;;12349:18:1;;;12342:48;12407:18;;28728:43:0::1;12089:342:1::0;28728:43:0::1;28782:3;:10:::0;;-1:-1:-1;;;;28782:10:0::1;-1:-1:-1::0;;;28782:10:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;28808:16:::1;::::0;5337:50:1;;;28808:16:0::1;::::0;5325:2:1;5310:18;28808:16:0::1;5193:200:1::0;4408:104:0;4464:13;4497:7;4490:14;;;;;:::i;8741:436::-;8834:4;175:10;8834:4;8917:25;175:10;8934:7;8917:9;:25::i;:::-;8890:52;;8981:15;8961:16;:35;;8953:85;;;;-1:-1:-1;;;8953:85:0;;12844:2:1;8953:85:0;;;12826:21:1;12883:2;12863:18;;;12856:30;12922:34;12902:18;;;12895:62;-1:-1:-1;;;12973:18:1;;;12966:35;13018:19;;8953:85:0;12642:401:1;8953:85:0;9074:60;9083:5;9090:7;9118:15;9099:16;:34;9074:8;:60::i;5822:193::-;5901:4;175:10;5957:28;175:10;5974:2;5978:6;5957:9;:28::i;26985:319::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27083:22:0;::::1;27075:47;;;::::0;-1:-1:-1;;;27075:47:0;;13250:2:1;27075:47:0::1;::::0;::::1;13232:21:1::0;13289:2;13269:18;;;13262:30;-1:-1:-1;;;13308:18:1;;;13301:42;13360:18;;27075:47:0::1;13048:336:1::0;27075:47:0::1;27161:4;-1:-1:-1::0;;;;;27141:25:0;::::1;::::0;27133:62:::1;;;::::0;-1:-1:-1;;;27133:62:0;;13591:2:1;27133:62:0::1;::::0;::::1;13573:21:1::0;13630:2;13610:18;;;13603:30;13669:26;13649:18;;;13642:54;13713:18;;27133:62:0::1;13389:348:1::0;27133:62:0::1;-1:-1:-1::0;;;;;27206:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;;:36;;-1:-1:-1;;27206:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27258:38;;13910:51:1;;;13977:18;;;13970:50;27258:38:0::1;::::0;13883:18:1;27258:38:0::1;;;;;;;;26985:319:::0;;:::o;27312:352::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27412:22:0;::::1;27404:47;;;::::0;-1:-1:-1;;;27404:47:0;;13250:2:1;27404:47:0::1;::::0;::::1;13232:21:1::0;13289:2;13269:18;;;13262:30;-1:-1:-1;;;13308:18:1;;;13301:42;13360:18;;27404:47:0::1;13048:336:1::0;27404:47:0::1;27466:9;27462:90;;27511:6;::::0;-1:-1:-1;;;;;27511:6:0;;::::1;27499:18:::0;;::::1;::::0;27491:49:::1;;;::::0;-1:-1:-1;;;27491:49:0;;14233:2:1;27491:49:0::1;::::0;::::1;14215:21:1::0;14272:2;14252:18;;;14245:30;-1:-1:-1;;;14291:18:1;;;14284:48;14349:18;;27491:49:0::1;14031:342:1::0;27491:49:0::1;-1:-1:-1::0;;;;;27562:26:0;::::1;;::::0;;;:16:::1;:26;::::0;;;;;;;;:38;;-1:-1:-1;;27562:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27616:40;;13910:51:1;;;13977:18;;;13970:50;27616:40:0::1;::::0;13883:18:1;27616:40:0::1;13742:284:1::0;6078:151:0;-1:-1:-1;;;;;6194:18:0;;;6167:7;6194:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6078:151::o;13261:244::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13350:22:0;::::1;13342:73;;;::::0;-1:-1:-1;;;13342:73:0;;14580:2:1;13342:73:0::1;::::0;::::1;14562:21:1::0;14619:2;14599:18;;;14592:30;14658:34;14638:18;;;14631:62;-1:-1:-1;;;14709:18:1;;;14702:36;14755:19;;13342:73:0::1;14378:402:1::0;13342:73:0::1;13452:6;::::0;13431:38:::1;::::0;-1:-1:-1;;;;;13431:38:0;;::::1;::::0;13452:6:::1;::::0;13431:38:::1;::::0;13452:6:::1;::::0;13431:38:::1;13480:6;:17:::0;;-1:-1:-1;;;;;;13480:17:0::1;-1:-1:-1::0;;;;;13480:17:0;;;::::1;::::0;;;::::1;::::0;;13261:244::o;11502:346::-;-1:-1:-1;;;;;11604:19:0;;11596:68;;;;-1:-1:-1;;;11596:68:0;;14987:2:1;11596:68:0;;;14969:21:1;15026:2;15006:18;;;14999:30;15065:34;15045:18;;;15038:62;-1:-1:-1;;;15116:18:1;;;15109:34;15160:19;;11596:68:0;14785:400:1;11596:68:0;-1:-1:-1;;;;;11683:21:0;;11675:68;;;;-1:-1:-1;;;11675:68:0;;15392:2:1;11675:68:0;;;15374:21:1;15431:2;15411:18;;;15404:30;15470:34;15450:18;;;15443:62;-1:-1:-1;;;15521:18:1;;;15514:32;15563:19;;11675:68:0;15190:398:1;11675:68:0;-1:-1:-1;;;;;11756:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11808:32;;1672:25:1;;;11808:32:0;;1645:18:1;11808:32:0;;;;;;;11502:346;;;:::o;9647:705::-;-1:-1:-1;;;;;9744:18:0;;9736:68;;;;-1:-1:-1;;;9736:68:0;;15795:2:1;9736:68:0;;;15777:21:1;15834:2;15814:18;;;15807:30;15873:34;15853:18;;;15846:62;-1:-1:-1;;;15924:18:1;;;15917:35;15969:19;;9736:68:0;15593:401:1;9736:68:0;-1:-1:-1;;;;;9823:16:0;;9815:64;;;;-1:-1:-1;;;9815:64:0;;16201:2:1;9815:64:0;;;16183:21:1;16240:2;16220:18;;;16213:30;16279:34;16259:18;;;16252:62;-1:-1:-1;;;16330:18:1;;;16323:33;16373:19;;9815:64:0;15999:399:1;9815:64:0;-1:-1:-1;;;;;9914:15:0;;9892:19;9914:15;;;;;;;;;;;9948:21;;;;9940:72;;;;-1:-1:-1;;;9940:72:0;;16605:2:1;9940:72:0;;;16587:21:1;16644:2;16624:18;;;16617:30;16683:34;16663:18;;;16656:62;-1:-1:-1;;;16734:18:1;;;16727:36;16780:19;;9940:72:0;16403:402:1;9940:72:0;-1:-1:-1;;;;;10048:15:0;;;:9;:15;;;;;;;;;;;10066:20;;;10048:38;;10266:13;;;;;;;;;;:23;;;;;;10318:26;;1672:25:1;;;10266:13:0;;10318:26;;1645:18:1;10318:26:0;;;;;;;9725:627;9647:705;;;:::o;12139:419::-;12240:24;12267:25;12277:5;12284:7;12267:9;:25::i;:::-;12240:52;;-1:-1:-1;;12307:16:0;:37;12303:248;;12389:6;12369:16;:26;;12361:68;;;;-1:-1:-1;;;12361:68:0;;17012:2:1;12361:68:0;;;16994:21:1;17051:2;17031:18;;;17024:30;17090:31;17070:18;;;17063:59;17139:18;;12361:68:0;16810:353:1;12361:68:0;12473:51;12482:5;12489:7;12517:6;12498:16;:25;12473:8;:51::i;:::-;12229:329;12139:419;;;:::o;24179:409::-;-1:-1:-1;;;;;24325:20:0;;;;;;:14;:20;;;;;;;;24324:21;:44;;;;-1:-1:-1;;;;;;24350:18:0;;;;;;:14;:18;;;;;;;;24349:19;24324:44;24321:216;;;24392:14;;;;24384:45;;;;-1:-1:-1;;;24384:45:0;;17370:2:1;24384:45:0;;;17352:21:1;17409:2;17389:18;;;17382:30;-1:-1:-1;;;17428:18:1;;;17421:48;17486:18;;24384:45:0;17168:342:1;24384:45:0;24444:29;24456:4;24462:2;24466:6;24444:11;:29::i;:::-;24498:27;24508:4;24514:2;24518:6;24498:9;:27::i;:::-;24488:37;;;;:::i;:::-;;;24321:216;24549:31;24565:4;24570:2;24573:6;24549:15;:31::i;19675:177::-;19785:58;;;-1:-1:-1;;;;;17840:32:1;;19785:58:0;;;17822:51:1;17889:18;;;;17882:34;;;19785:58:0;;;;;;;;;;17795:18:1;;;;19785:58:0;;;;;;;;-1:-1:-1;;;;;19785:58:0;-1:-1:-1;;;19785:58:0;;;19758:86;;19778:5;;19758:19;:86::i;24596:1171::-;24682:7;;;;;;;24679:753;;;-1:-1:-1;;;;;24727:20:0;;;24705:19;24727:20;;;:16;:20;;;;;;;;;5590:18;;;;;;;24812:36;;;;;;;24840:8;24812:36;-1:-1:-1;;;;;24812:36:0;;;;;-1:-1:-1;;;24812:36:0;;;;;;;;24887:15;;;;;:9;:15;;;;;;24727:20;;;;;5590:18;;24887:15;:34;;;;;24907:14;24906:15;24887:34;24883:538;;;24960:26;;-1:-1:-1;;;;;24950:36:0;;;;24942:56;;;;-1:-1:-1;;;24942:56:0;;18129:2:1;24942:56:0;;;18111:21:1;18168:1;18148:18;;;18141:29;-1:-1:-1;;;18186:18:1;;;18179:37;18233:18;;24942:56:0;17927:330:1;24942:56:0;25049:21;;;;-1:-1:-1;;;;;25025:45:0;:20;25034:11;25025:6;:20;:::i;:::-;:45;;25017:68;;;;-1:-1:-1;;;25017:68:0;;18464:2:1;25017:68:0;;;18446:21:1;18503:2;18483:18;;;18476:30;-1:-1:-1;;;18522:18:1;;;18515:40;18572:18;;25017:68:0;18262:334:1;25017:68:0;24883:538;;;-1:-1:-1;;;;;25146:13:0;;;;;;:9;:13;;;;;;;;:40;;;;-1:-1:-1;;;;;;25164:22:0;;;;;;:16;:22;;;;;;;;25163:23;25146:40;25142:279;;;25225:26;;-1:-1:-1;;;;;25215:36:0;;;;25207:56;;;;-1:-1:-1;;;25207:56:0;;18129:2:1;25207:56:0;;;18111:21:1;18168:1;18148:18;;;18141:29;-1:-1:-1;;;18186:18:1;;;18179:37;18233:18;;25207:56:0;17927:330:1;25142:279:0;25302:14;25298:123;;25369:21;;;;-1:-1:-1;;;;;25345:45:0;:20;25354:11;25345:6;:20;:::i;:::-;:45;;25337:68;;;;-1:-1:-1;;;25337:68:0;;18464:2:1;25337:68:0;;;18446:21:1;18503:2;18483:18;;;18476:30;-1:-1:-1;;;18522:18:1;;;18515:40;18572:18;;25337:68:0;18262:334:1;25337:68:0;24690:742;;;24679:753;25448:14;;;;25444:316;;;-1:-1:-1;;;;;25481:13:0;;;;;;:9;:13;;;;;;;;25478:271;;;-1:-1:-1;;;;;25522:30:0;;;;;;:24;:30;;;;;;25555:12;-1:-1:-1;25514:66:0;;;;-1:-1:-1;;;25514:66:0;;18803:2:1;25514:66:0;;;18785:21:1;18842:1;18822:18;;;18815:29;-1:-1:-1;;;18860:18:1;;;18853:38;18908:18;;25514:66:0;18601:331:1;25478:271:0;-1:-1:-1;;;;;;25621:28:0;;;;;:24;:28;;;;;;25652:12;25621:43;;;;25708:9;25683:35;;;;:50;-1:-1:-1;24596:1171:0:o;25775:462::-;25906:15;;25896:4;25854:7;5590:18;;;;;;;;;;;25854:7;;-1:-1:-1;25878:43:0;:63;;;;-1:-1:-1;;;;;;25926:15:0;;;;;;:9;:15;;;;;;;;25925:16;25878:63;25875:109;;;25958:14;:12;:14::i;:::-;-1:-1:-1;;;;;26039:13:0;;26004:12;26039:13;;;:9;:13;;;;;;;;;:32;;-1:-1:-1;;;;;;26056:15:0;;;;;;:9;:15;;;;;;;;26039:32;26035:163;;;26111:3;;22161:5;;26102:12;;-1:-1:-1;;;26111:3:0;;26102:26;26111:3;26102:6;:12;:::i;:::-;:26;;;;:::i;:::-;26087:42;;26144;26160:4;26174;26181;-1:-1:-1;;;;;26144:42:0;:15;:42::i;:::-;-1:-1:-1;;;;;26218:11:0;;25775:462;-1:-1:-1;;;;25775:462:0:o;20073:333::-;20154:23;20180:69;20208:4;20180:69;;;;;;;;;;;;;;;;;20188:5;-1:-1:-1;;;;;20180:27:0;;;:69;;;;;:::i;:::-;20264:17;;20154:95;;-1:-1:-1;20264:21:0;20260:139;;20321:10;20310:30;;;;;;;;;;;;:::i;:::-;20302:85;;;;-1:-1:-1;;;20302:85:0;;19389:2:1;20302:85:0;;;19371:21:1;19428:2;19408:18;;;19401:30;19467:34;19447:18;;;19440:62;-1:-1:-1;;;19518:18:1;;;19511:40;19568:19;;20302:85:0;19187:406:1;26636:317:0;26725:4;26681:23;5590:18;;;;;;;;;;;26765:15;;:20;;26783:2;26765:20;:::i;:::-;26747:15;:38;26744:107;;;26819:15;;:20;;26837:2;26819:20;:::i;:::-;26801:38;;26744:107;26866:19;;26863:83;;26901:33;26918:15;26901:16;:33::i;:::-;26668:285;26636:317::o;14178:229::-;14315:12;14347:52;14369:6;14377:4;14383:1;14386:12;14347:21;:52::i;:::-;14340:59;14178:229;-1:-1:-1;;;;14178:229:0:o;26245:383::-;26334:16;;;26348:1;26334:16;;;;;;;;26310:21;;26334:16;;;;;;;;;;-1:-1:-1;26334:16:0;26310:40;;26379:4;26361;26366:1;26361:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;26361:23:0;;;-1:-1:-1;;;;;26361:23:0;;;;;26405:4;26395;26400:1;26395:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26395:14:0;;;:7;;;;;;;;;:14;26422:9;;26563:15;;26422:198;;-1:-1:-1;;;26422:198:0;;:9;;;;:60;;:198;;26497:8;;26422:9;;26536:4;;26563:15;;;;26594;;26422:198;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26297:331;26245:383;:::o;15298:455::-;15468:12;15526:5;15501:21;:30;;15493:81;;;;-1:-1:-1;;;15493:81:0;;20917:2:1;15493:81:0;;;20899:21:1;20956:2;20936:18;;;20929:30;20995:34;20975:18;;;20968:62;-1:-1:-1;;;21046:18:1;;;21039:36;21092:19;;15493:81:0;20715:402:1;15493:81:0;15586:12;15600:23;15627:6;-1:-1:-1;;;;;15627:11:0;15646:5;15653:4;15627:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15585:73;;;;15676:69;15703:6;15711:7;15720:10;15732:12;15676:26;:69::i;:::-;15669:76;15298:455;-1:-1:-1;;;;;;;15298:455:0:o;17871:644::-;18056:12;18085:7;18081:427;;;18113:10;:17;18134:1;18113:22;18109:290;;-1:-1:-1;;;;;13619:19:0;;;18323:60;;;;-1:-1:-1;;;18323:60:0;;21616:2:1;18323:60:0;;;21598:21:1;21655:2;21635:18;;;21628:30;21694:31;21674:18;;;21667:59;21743:18;;18323:60:0;21414:353:1;18323:60:0;-1:-1:-1;18420:10:0;18413:17;;18081:427;18463:33;18471:10;18483:12;19218:17;;:21;19214:388;;19450:10;19444:17;19507:15;19494:10;19490:2;19486:19;19479:44;19214:388;19577:12;19570:20;;-1:-1:-1;;;19570:20:0;;;;;;;;:::i;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;897:173::-;965:20;;-1:-1:-1;;;;;1014:31:1;;1004:42;;994:70;;1060:1;1057;1050:12;994:70;897:173;;;:::o;1075:254::-;1143:6;1151;1204:2;1192:9;1183:7;1179:23;1175:32;1172:52;;;1220:1;1217;1210:12;1172:52;1243:29;1262:9;1243:29;:::i;:::-;1233:39;1319:2;1304:18;;;;1291:32;;-1:-1:-1;;;1075:254:1:o;1708:180::-;1767:6;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;-1:-1:-1;1859:23:1;;1708:180;-1:-1:-1;1708:180:1:o;1893:367::-;1956:8;1966:6;2020:3;2013:4;2005:6;2001:17;1997:27;1987:55;;2038:1;2035;2028:12;1987:55;-1:-1:-1;2061:20:1;;2104:18;2093:30;;2090:50;;;2136:1;2133;2126:12;2090:50;2173:4;2165:6;2161:17;2149:29;;2233:3;2226:4;2216:6;2213:1;2209:14;2201:6;2197:27;2193:38;2190:47;2187:67;;;2250:1;2247;2240:12;2187:67;1893:367;;;;;:::o;2265:773::-;2387:6;2395;2403;2411;2464:2;2452:9;2443:7;2439:23;2435:32;2432:52;;;2480:1;2477;2470:12;2432:52;2520:9;2507:23;2549:18;2590:2;2582:6;2579:14;2576:34;;;2606:1;2603;2596:12;2576:34;2645:70;2707:7;2698:6;2687:9;2683:22;2645:70;:::i;:::-;2734:8;;-1:-1:-1;2619:96:1;-1:-1:-1;2822:2:1;2807:18;;2794:32;;-1:-1:-1;2838:16:1;;;2835:36;;;2867:1;2864;2857:12;2835:36;;2906:72;2970:7;2959:8;2948:9;2944:24;2906:72;:::i;:::-;2265:773;;;;-1:-1:-1;2997:8:1;-1:-1:-1;;;;2265:773:1:o;3043:328::-;3120:6;3128;3136;3189:2;3177:9;3168:7;3164:23;3160:32;3157:52;;;3205:1;3202;3195:12;3157:52;3228:29;3247:9;3228:29;:::i;:::-;3218:39;;3276:38;3310:2;3299:9;3295:18;3276:38;:::i;:::-;3266:48;;3361:2;3350:9;3346:18;3333:32;3323:42;;3043:328;;;;;:::o;3565:301::-;3624:6;3677:2;3665:9;3656:7;3652:23;3648:32;3645:52;;;3693:1;3690;3683:12;3645:52;3732:9;3719:23;-1:-1:-1;;;;;3775:5:1;3771:46;3764:5;3761:57;3751:85;;3832:1;3829;3822:12;3751:85;3855:5;3565:301;-1:-1:-1;;;3565:301:1:o;4079:260::-;4147:6;4155;4208:2;4196:9;4187:7;4183:23;4179:32;4176:52;;;4224:1;4221;4214:12;4176:52;4247:29;4266:9;4247:29;:::i;:::-;4237:39;;4295:38;4329:2;4318:9;4314:18;4295:38;:::i;:::-;4285:48;;4079:260;;;;;:::o;4344:118::-;4430:5;4423:13;4416:21;4409:5;4406:32;4396:60;;4452:1;4449;4442:12;4467:241;4523:6;4576:2;4564:9;4555:7;4551:23;4547:32;4544:52;;;4592:1;4589;4582:12;4544:52;4631:9;4618:23;4650:28;4672:5;4650:28;:::i;4713:186::-;4772:6;4825:2;4813:9;4804:7;4800:23;4796:32;4793:52;;;4841:1;4838;4831:12;4793:52;4864:29;4883:9;4864:29;:::i;4904:284::-;4962:6;5015:2;5003:9;4994:7;4990:23;4986:32;4983:52;;;5031:1;5028;5021:12;4983:52;5070:9;5057:23;5120:18;5113:5;5109:30;5102:5;5099:41;5089:69;;5154:1;5151;5144:12;5398:315;5463:6;5471;5524:2;5512:9;5503:7;5499:23;5495:32;5492:52;;;5540:1;5537;5530:12;5492:52;5563:29;5582:9;5563:29;:::i;:::-;5553:39;;5642:2;5631:9;5627:18;5614:32;5655:28;5677:5;5655:28;:::i;:::-;5702:5;5692:15;;;5398:315;;;;;:::o;6042:380::-;6121:1;6117:12;;;;6164;;;6185:61;;6239:4;6231:6;6227:17;6217:27;;6185:61;6292:2;6284:6;6281:14;6261:18;6258:38;6255:161;;6338:10;6333:3;6329:20;6326:1;6319:31;6373:4;6370:1;6363:15;6401:4;6398:1;6391:15;6255:161;;6042:380;;;:::o;6427:356::-;6629:2;6611:21;;;6648:18;;;6641:30;6707:34;6702:2;6687:18;;6680:62;6774:2;6759:18;;6427:356::o;6788:127::-;6849:10;6844:3;6840:20;6837:1;6830:31;6880:4;6877:1;6870:15;6904:4;6901:1;6894:15;6920:168;6993:9;;;7024;;7041:15;;;7035:22;;7021:37;7011:71;;7062:18;;:::i;7093:217::-;7133:1;7159;7149:132;;7203:10;7198:3;7194:20;7191:1;7184:31;7238:4;7235:1;7228:15;7266:4;7263:1;7256:15;7149:132;-1:-1:-1;7295:9:1;;7093:217::o;8509:127::-;8570:10;8565:3;8561:20;8558:1;8551:31;8601:4;8598:1;8591:15;8625:4;8622:1;8615:15;8641:135;8680:3;8701:17;;;8698:43;;8721:18;;:::i;:::-;-1:-1:-1;8768:1:1;8757:13;;8641:135::o;8781:422::-;8870:1;8913:5;8870:1;8927:270;8948:7;8938:8;8935:21;8927:270;;;9007:4;9003:1;8999:6;8995:17;8989:4;8986:27;8983:53;;;9016:18;;:::i;:::-;9066:7;9056:8;9052:22;9049:55;;;9086:16;;;;9049:55;9165:22;;;;9125:15;;;;8927:270;;;8931:3;8781:422;;;;;:::o;9208:806::-;9257:5;9287:8;9277:80;;-1:-1:-1;9328:1:1;9342:5;;9277:80;9376:4;9366:76;;-1:-1:-1;9413:1:1;9427:5;;9366:76;9458:4;9476:1;9471:59;;;;9544:1;9539:130;;;;9451:218;;9471:59;9501:1;9492:10;;9515:5;;;9539:130;9576:3;9566:8;9563:17;9560:43;;;9583:18;;:::i;:::-;-1:-1:-1;;9639:1:1;9625:16;;9654:5;;9451:218;;9753:2;9743:8;9740:16;9734:3;9728:4;9725:13;9721:36;9715:2;9705:8;9702:16;9697:2;9691:4;9688:12;9684:35;9681:77;9678:159;;;-1:-1:-1;9790:19:1;;;9822:5;;9678:159;9869:34;9894:8;9888:4;9869:34;:::i;:::-;9939:6;9935:1;9931:6;9927:19;9918:7;9915:32;9912:58;;;9950:18;;:::i;:::-;9988:20;;9208:806;-1:-1:-1;;;9208:806:1:o;10019:140::-;10077:5;10106:47;10147:4;10137:8;10133:19;10127:4;10106:47;:::i;10722:125::-;10787:9;;;10808:10;;;10805:36;;;10821:18;;:::i;11207:184::-;11277:6;11330:2;11318:9;11309:7;11305:23;11301:32;11298:52;;;11346:1;11343;11336:12;11298:52;-1:-1:-1;11369:16:1;;11207:184;-1:-1:-1;11207:184:1:o;17515:128::-;17582:9;;;17603:11;;;17600:37;;;17617:18;;:::i;18937:245::-;19004:6;19057:2;19045:9;19036:7;19032:23;19028:32;19025:52;;;19073:1;19070;19063:12;19025:52;19105:9;19099:16;19124:28;19146:5;19124:28;:::i;19730:980::-;19992:4;20040:3;20029:9;20025:19;20071:6;20060:9;20053:25;20097:2;20135:6;20130:2;20119:9;20115:18;20108:34;20178:3;20173:2;20162:9;20158:18;20151:31;20202:6;20237;20231:13;20268:6;20260;20253:22;20306:3;20295:9;20291:19;20284:26;;20345:2;20337:6;20333:15;20319:29;;20366:1;20376:195;20390:6;20387:1;20384:13;20376:195;;;20455:13;;-1:-1:-1;;;;;20451:39:1;20439:52;;20546:15;;;;20511:12;;;;20487:1;20405:9;20376:195;;;-1:-1:-1;;;;;;;20627:32:1;;;;20622:2;20607:18;;20600:60;-1:-1:-1;;;20691:3:1;20676:19;20669:35;20588:3;19730:980;-1:-1:-1;;;19730:980:1:o;21122:287::-;21251:3;21289:6;21283:13;21305:66;21364:6;21359:3;21352:4;21344:6;21340:17;21305:66;:::i;:::-;21387:16;;;;;21122:287;-1:-1:-1;;21122:287:1:o

Swarm Source

ipfs://32dc76e0429af9462880dab904b63728da65e11970f75d6befee1766ea7a5efc
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.