ETH Price: $3,349.12 (-0.22%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve205288642024-08-14 19:09:23139 days ago1723662563IN
0x0e990454...bEdF4E3F0
0 ETH0.000315236.70836134
Approve204798962024-08-07 23:10:47146 days ago1723072247IN
0x0e990454...bEdF4E3F0
0 ETH0.000111642.36568098
Approve202789772024-07-10 22:06:23174 days ago1720649183IN
0x0e990454...bEdF4E3F0
0 ETH0.000315996.69556139
Approve200911572024-06-14 16:11:47200 days ago1718381507IN
0x0e990454...bEdF4E3F0
0 ETH0.0016104134.12256837
Approve200886022024-06-14 7:38:11200 days ago1718350691IN
0x0e990454...bEdF4E3F0
0 ETH0.0008939118.94086413
Approve200588362024-06-10 3:46:47204 days ago1717991207IN
0x0e990454...bEdF4E3F0
0 ETH0.00027755.87999983
Approve200546702024-06-09 13:48:59205 days ago1717940939IN
0x0e990454...bEdF4E3F0
0 ETH0.0005117210.8428551
Approve200153002024-06-04 1:53:47210 days ago1717466027IN
0x0e990454...bEdF4E3F0
0 ETH0.000285.93294116
Approve200051172024-06-02 15:45:59212 days ago1717343159IN
0x0e990454...bEdF4E3F0
0 ETH0.0006220213.25058755
Approve199591482024-05-27 5:33:59218 days ago1716788039IN
0x0e990454...bEdF4E3F0
0 ETH0.000449049.56565108
Approve199478752024-05-25 15:46:11220 days ago1716651971IN
0x0e990454...bEdF4E3F0
0 ETH0.000229514.856963
Approve199454822024-05-25 7:44:59220 days ago1716623099IN
0x0e990454...bEdF4E3F0
0 ETH0.000261385.53849248
Approve199453782024-05-25 7:24:11220 days ago1716621851IN
0x0e990454...bEdF4E3F0
0 ETH0.000231714.90980496
Approve199180852024-05-21 11:48:47224 days ago1716292127IN
0x0e990454...bEdF4E3F0
0 ETH0.0008218517.41404501
Approve199110392024-05-20 12:08:47225 days ago1716206927IN
0x0e990454...bEdF4E3F0
0 ETH0.0002775.90246421
Approve199107072024-05-20 11:01:59225 days ago1716202919IN
0x0e990454...bEdF4E3F0
0 ETH0.0004963410.5168342
Approve199008602024-05-19 1:59:23226 days ago1716083963IN
0x0e990454...bEdF4E3F0
0 ETH0.000150413.20663274
Approve198878652024-05-17 6:19:35228 days ago1715926775IN
0x0e990454...bEdF4E3F0
0 ETH0.00017243.65298782
Approve198878512024-05-17 6:16:47228 days ago1715926607IN
0x0e990454...bEdF4E3F0
0 ETH0.000157453.34985318
Approve198825692024-05-16 12:34:35229 days ago1715862875IN
0x0e990454...bEdF4E3F0
0 ETH0.00034997.4139273
Approve198702562024-05-14 19:17:59231 days ago1715714279IN
0x0e990454...bEdF4E3F0
0 ETH0.000465039.8533877
Approve198670792024-05-14 8:32:23231 days ago1715675543IN
0x0e990454...bEdF4E3F0
0 ETH0.000383518.12615418
Approve198652112024-05-14 2:16:23231 days ago1715652983IN
0x0e990454...bEdF4E3F0
0 ETH0.000281155.95734727
Approve198569202024-05-12 22:28:23233 days ago1715552903IN
0x0e990454...bEdF4E3F0
0 ETH0.000257015.44582341
Approve198567382024-05-12 21:51:47233 days ago1715550707IN
0x0e990454...bEdF4E3F0
0 ETH0.000248545.26642457
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DESI

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-05-06
*/

// SPDX-License-Identifier: MIT

/*
    Website: https://desicow.io
    Telegram: https://t.me/Desi_Cow
    Twitter: https://twitter.com/Desi_Cow_

*/

pragma solidity 0.8.18;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

library SafeERC20 {
    using Address for address;

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

interface IERC20Errors {
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );
    error ERC20InvalidSender(address sender);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidSpender(address spender);
}

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

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

    uint256 private _totalSupply;

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        if (currentAllowance < amount) {
            revert ERC20InsufficientAllowance(
                recipient,
                currentAllowance,
                amount
            );
        }
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    function increaseAllowance(address spender, uint256 addtionalValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addtionalValue
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractionValue)
        public
        virtual
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractionValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractionValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        if (sender == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (recipient == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        uint256 senderBalance = _balances[sender];
        if (senderBalance < amount) {
            revert ERC20InsufficientBalance(sender, senderBalance, amount);
        }
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount)
        internal
        virtual
    {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }

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

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }

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

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

interface ILpPair {
    function sync() external;
}

interface IDexRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

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

contract DESI is ERC20, Ownable {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    IDexRouter public immutable dexRouter;
    address public immutable lpPair;

    IERC20 public immutable WETH;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public taxAddress = 0xae5950CcB704334108212B88Ad2339c626502572;

    bool public swapEnabled = false;

    uint256 private buyFee;
    uint256 private sellFee;
    uint256 private transferFee;

    struct WhitelistWallet {
        bool isExcludedFromFees;
    }

    mapping(address => WhitelistWallet) public _whitelistWallet;

    mapping(address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event EnabledSwap();
    event DisabledSwap();
    event UpdatedFees(uint256 buyFee, uint256 sellFee, uint256 transferFee);
    event UpdatedTaxAddress(address indexed newWallet);
    event OwnerForcedSwapBack(uint256 timestamp);
    event TransferForeignToken(address token, uint256 amount);
    event ReuppedApprovals();
    event SwapTokensAtAmountUpdated(uint256 newAmount);
    event WhiteList(
        bool isExcludedFromFees
    );

    error ChainNotConfigured();


    constructor() {
        _name = "INDIAN DESI COW COIN";
        _symbol = "DESI";
        _decimals = 18;
        uint256 totalSupply = 15_000_000_000 * 10**_decimals;
        
        swapTokensAtAmount = totalSupply / 500;

        buyFee = 450; // 4.5% Fees
        sellFee = 525; // 5.25% Fees
        transferFee = 100;  // 1% Fees

        address newOwner = msg.sender; // can leave alone if owner is deployer.

        address _dexRouter;
        address ethcoinAddress;

        if (block.chainid == 1) {
            ethcoinAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if (block.chainid == 11155111) {
            ethcoinAddress = 0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9;
            _dexRouter = 0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008;
        } else {
            revert ChainNotConfigured();
        }

        // initialize router
        dexRouter = IDexRouter(_dexRouter);
        WETH = IERC20(ethcoinAddress);

        // create pair
        lpPair = IDexFactory(dexRouter.factory()).createPair(
            address(this),
            address(WETH)
        );
        setAutomatedMarketMakerPair(address(lpPair), true);

        // setWhitelist(address(lpPair), false, false, true);
        setWhitelist(address(this), true);
        setWhitelist(address(0xdead), true);
        setWhitelist(newOwner, true);

        _createInitialSupply(address(newOwner), totalSupply);
        transferOwnership(newOwner);

        WETH.approve(address(dexRouter), type(uint256).max);
        _approve(address(this), address(dexRouter), type(uint256).max);
    }

    function name() public view override returns (string memory) {
        return _name;
    }

    function symbol() public view override returns (string memory) {
        return _symbol;
    }

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

    /// @notice Adds or removes an address from the whitelist.
    /// @dev Only the owner can call this function.
    /// @param account The address to whitelist or unwhitelist.
    /// @param isExcludedFromFees True if the address should be excluded from fees, false otherwise.
    function setWhitelist(
        address account,
        bool isExcludedFromFees
    ) public {
        _whitelistWallet[account] = WhitelistWallet(
            isExcludedFromFees
        );
        emit WhiteList(
            isExcludedFromFees
        );
    }


    /// @notice Enables or disables the automatic swap of accumulated fees for WETH.
    /// @dev This function can only be called by the contract owner.
    /// @param _enable Set to true to enable automatic swapping, false to disable.
    function setSwapEnabled(bool _enable) external onlyOwner {
        swapEnabled = _enable;
        if (_enable) {
            emit EnabledSwap();
        } else {
            emit DisabledSwap();
        }
    }


    /// @notice change the minimum amount of tokens to sell from fees
    /// @param newAmount The new minimum amount of tokens to sell
    /// @dev This function allows the contract owner to adjust the threshold at which accumulated fees are automatically swapped for WETH and sent to the tax address.
    /// Requirements:
    /// - The `newAmount` must be greater than or equal to 0.001% of the total supply.
    /// - The `newAmount` must be less than or equal to 1% of the total supply.
    /// Emits a {SwapTokensAtAmountUpdated} event.
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        uint256 _totalSupply = totalSupply();
        require(
            newAmount >= (_totalSupply * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (_totalSupply * 1) / 100,
            "Swap amount cannot be higher than 1% total supply."
        );
        swapTokensAtAmount = newAmount;
        emit SwapTokensAtAmountUpdated(newAmount);
    }

    /// @notice Sets or unsets the automated market maker pair status for a given address.
    /// @param pair The address of the pair to update.
    /// @param value True to set the pair as an automated market maker pair, false to unset it.
    /// @dev This function can only be called by the owner. 
    ///     The pair cannot be removed from automatedMarketMakerPairs if it is the lpPair.
    ///     This function also excludes/includes the pair from max transaction limits depending on the value.
    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != lpPair || value,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );
        automatedMarketMakerPairs[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    /// @notice Updates the buy, sell, and transfer fees for the token.
    /// @dev Only callable by the owner. Fees are input as basis points (e.g., 700 for 7%).
    /// @param _buyFee The new buy fee, in basis points.
    /// @param _sellFee The new sell fee, in basis points.
    /// @param _transferFee The new transfer fee, in basis points.
    function updateFees(
        uint256 _buyFee,
        uint256 _sellFee,
        uint256 _transferFee
    ) external onlyOwner {
        require(_buyFee <= 700, "Must keep buy fees at 7% or less");
        require(_sellFee <= 700, "Must keep sell fees at 7% or less");
        require(_transferFee <= 700, "Must keep transfer fees at 7% or less");
        buyFee = _buyFee;
        sellFee = _sellFee;
        transferFee = _transferFee;
        emit UpdatedFees(buyFee, sellFee, transferFee);
    }

    /// @notice Returns the buy, sell, and transfer fees for the token, represented as basis points (hundredths of a percent).
    /// @dev For example, a fee of 5.5% would be returned as 550.
    /// @return _buyFee The current buy fee in basis points.
    /// @return _sellFee The current sell fee in basis points.
    /// @return _transferFee The current transfer fee in basis points.
    function getFees()
        external
        view
        returns (
            uint256 _buyFee,
            uint256 _sellFee,
            uint256 _transferFee
        )
    {
        return (buyFee, sellFee, transferFee);
    }

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

        if (_whitelistWallet[from].isExcludedFromFees || _whitelistWallet[to].isExcludedFromFees) {
            return 0;
        }

        uint256 fees;

        if (automatedMarketMakerPairs[to] && sellFee > 0) {
            fees = (amount * sellFee) / 10000;
        } else if (automatedMarketMakerPairs[from] && buyFee > 0) {
            fees = (amount * buyFee) / 10000;
        } else if (transferFee > 0) {
            fees = (amount * transferFee) / 10000;
        }

        if (fees > 0) {
            super._transfer(from, address(this), fees);
        }

        return fees;
    }

    function _executeSwap() internal {
        if (
            balanceOf(address(this)) > swapTokensAtAmount &&
            swapEnabled &&
            !swapping
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        uint256 fees = _takeFee(from, to, amount);
        _executeSwap();
        super._transfer(from, to, amount - fees);
    }

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

        // make the swap
        dexRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(taxAddress),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));

        if (contractBalance == 0) {
            return;
        }

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

        swapTokensForWETH(contractBalance);

        if (WETH.balanceOf(address(this)) > 0) {
            WETH.transfer(taxAddress, WETH.balanceOf(address(this)));
        }
    }

    function _forceSwapBack() private {
        uint256 contractBalance = balanceOf(address(this));

        if (contractBalance == 0) {
            return;
        }

        swapTokensForWETH(contractBalance);

        if (WETH.balanceOf(address(this)) > 0) {
            WETH.transfer(taxAddress, WETH.balanceOf(address(this)));
        }
    }

    /// @notice Allows the owner to transfer any ERC20 tokens sent to the contract.
    /// @dev This function can only be called by the owner.
    /// @param _token The address of the ERC20 token to transfer.
    /// @param _to The address to transfer the tokens to.
    /// @dev Emits a {TransferForeignToken} event.
    /// Requirements:
    /// - `_token` address cannot be zero.
    function transferForeignToken(address _token, address _to)
        external
        onlyOwner
    {
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token), _to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    /// @notice Sets the tax address where fees are collected.
    /// @dev Only callable by the owner.
    /// @param _taxAddress The new tax address. Must not be the zero address.
    /// @ emits UpdatedTaxAddress event with the new tax address.
    function setTaxAddress(address _taxAddress) external onlyOwner {
        require(_taxAddress != address(0), "address cannot be 0");
        taxAddress = payable(_taxAddress);
        setWhitelist(_taxAddress, true);
        emit UpdatedTaxAddress(_taxAddress);
    }

    /// @notice Forcefully swap back accumulated tokens for WETH and send to the tax address, even if the accumulated amount is below the threshold.
    /// @dev This function can be used to manually trigger a swap in case of slippage issues or other unforeseen circumstances.
    /// @dev Only callable by the owner.
    /// Emits an {OwnerForcedSwapBack} event with the current timestamp.
    function forceSwapBack() external onlyOwner {
        swapping = true;
        _forceSwapBack();
        swapping = false;
        emit OwnerForcedSwapBack(block.timestamp);
    }

    function updateAllowanceForSwapping() external onlyOwner {
        WETH.approve(address(dexRouter), type(uint256).max);
        _approve(address(this), address(dexRouter), type(uint256).max);
        emit ReuppedApprovals();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ChainNotConfigured","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"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":[],"name":"DisabledSwap","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"ReuppedApprovals","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"SwapTokensAtAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"UpdatedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedTaxAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isExcludedFromFees","type":"bool"}],"name":"WhiteList","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelistWallet","outputs":[{"internalType":"bool","name":"isExcludedFromFees","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractionValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFees","outputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_transferFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addtionalValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxAddress","type":"address"}],"name":"setTaxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isExcludedFromFees","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"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":"updateAllowanceForSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_transferFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405273ae5950ccb704334108212b88ad2339c626502572600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600860146101000a81548160ff0219169083151502179055503480156200008157600080fd5b50600062000094620005e560201b60201c565b905080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506040518060400160405280601481526020017f494e4449414e204445534920434f5720434f494e0000000000000000000000008152506004908162000179919062000fd5565b506040518060400160405280600481526020017f444553490000000000000000000000000000000000000000000000000000000081525060059081620001c0919062000fd5565b506012600660006101000a81548160ff021916908360ff1602179055506000600660009054906101000a900460ff16600a620001fd91906200124c565b64037e11d6006200020f91906200129d565b90506101f48162000221919062001317565b6007819055506101c260098190555061020d600a819055506064600b81905550600033905060008060014603620002865773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29050737a250d5630b4cf539739df2c5dacb4c659f2488d9150620002f8565b62aa36a74603620002c557737b79995e5f793a07bc00c21412e50ecae098e7f9905073c532a74256d3db42d0bf7a0400fefdbad76940089150620002f7565b6040517f4cffccf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d49190620013b9565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060c0516040518363ffffffff1660e01b815260040162000412929190620013fc565b6020604051808303816000875af115801562000432573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004589190620013b9565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620004a060a0516001620005ed60201b60201c565b620004b3306001620007ad60201b60201c565b620004c861dead6001620007ad60201b60201c565b620004db836001620007ad60201b60201c565b620004ed83856200085d60201b60201c565b620004fe83620009b060201b60201c565b60c05173ffffffffffffffffffffffffffffffffffffffff1663095ea7b36080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200055f9291906200143a565b6020604051808303816000875af11580156200057f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005a59190620014a4565b50620005db306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62000b8460201b60201c565b505050506200172c565b600033905090565b620005fd620005e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200068f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006869062001537565b60405180910390fd5b60a05173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580620006ca5750805b6200070c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070390620015cf565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6040518060200160405280821515815250600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055509050507feef7d1273b513272e863e6cf3068add356fa793a2ca624f49fdf55d9a361bf708160405162000851919062001602565b60405180910390a15050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620008d25760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620008c991906200161f565b60405180910390fd5b8060026000828254620008e691906200163c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200093d91906200163c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620009a4919062001677565b60405180910390a35050565b620009c0620005e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a499062001537565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000ac4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000abb906200170a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000bf95760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040162000bf091906200161f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000c6e5760006040517f94280d6200000000000000000000000000000000000000000000000000000000815260040162000c6591906200161f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000d4e919062001677565b60405180910390a3505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ddd57607f821691505b60208210810362000df35762000df262000d95565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000e5d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000e1e565b62000e69868362000e1e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000eb662000eb062000eaa8462000e81565b62000e8b565b62000e81565b9050919050565b6000819050919050565b62000ed28362000e95565b62000eea62000ee18262000ebd565b84845462000e2b565b825550505050565b600090565b62000f0162000ef2565b62000f0e81848462000ec7565b505050565b5b8181101562000f365762000f2a60008262000ef7565b60018101905062000f14565b5050565b601f82111562000f855762000f4f8162000df9565b62000f5a8462000e0e565b8101602085101562000f6a578190505b62000f8262000f798562000e0e565b83018262000f13565b50505b505050565b600082821c905092915050565b600062000faa6000198460080262000f8a565b1980831691505092915050565b600062000fc5838362000f97565b9150826002028217905092915050565b62000fe08262000d5b565b67ffffffffffffffff81111562000ffc5762000ffb62000d66565b5b62001008825462000dc4565b6200101582828562000f3a565b600060209050601f8311600181146200104d576000841562001038578287015190505b62001044858262000fb7565b865550620010b4565b601f1984166200105d8662000df9565b60005b82811015620010875784890151825560018201915060208501945060208101905062001060565b86831015620010a75784890151620010a3601f89168262000f97565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200114a57808604811115620011225762001121620010bc565b5b6001851615620011325780820291505b80810290506200114285620010eb565b945062001102565b94509492505050565b60008262001165576001905062001238565b8162001175576000905062001238565b81600181146200118e57600281146200119957620011cf565b600191505062001238565b60ff841115620011ae57620011ad620010bc565b5b8360020a915084821115620011c857620011c7620010bc565b5b5062001238565b5060208310610133831016604e8410600b8410161715620012095782820a905083811115620012035762001202620010bc565b5b62001238565b620012188484846001620010f8565b92509050818404811115620012325762001231620010bc565b5b81810290505b9392505050565b600060ff82169050919050565b6000620012598262000e81565b915062001266836200123f565b9250620012957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001153565b905092915050565b6000620012aa8262000e81565b9150620012b78362000e81565b9250828202620012c78162000e81565b91508282048414831517620012e157620012e0620010bc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620013248262000e81565b9150620013318362000e81565b925082620013445762001343620012e8565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620013818262001354565b9050919050565b620013938162001374565b81146200139f57600080fd5b50565b600081519050620013b38162001388565b92915050565b600060208284031215620013d257620013d16200134f565b5b6000620013e284828501620013a2565b91505092915050565b620013f68162001374565b82525050565b6000604082019050620014136000830185620013eb565b620014226020830184620013eb565b9392505050565b620014348162000e81565b82525050565b6000604082019050620014516000830185620013eb565b62001460602083018462001429565b9392505050565b60008115159050919050565b6200147e8162001467565b81146200148a57600080fd5b50565b6000815190506200149e8162001473565b92915050565b600060208284031215620014bd57620014bc6200134f565b5b6000620014cd848285016200148d565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200151f602083620014d6565b91506200152c82620014e7565b602082019050919050565b60006020820190508181036000830152620015528162001510565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000620015b7603983620014d6565b9150620015c48262001559565b604082019050919050565b60006020820190508181036000830152620015ea81620015a8565b9050919050565b620015fc8162001467565b82525050565b6000602082019050620016196000830184620015f1565b92915050565b6000602082019050620016366000830184620013eb565b92915050565b6000620016498262000e81565b9150620016568362000e81565b9250828201905080821115620016715762001670620010bc565b5b92915050565b60006020820190506200168e600083018462001429565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000620016f2602683620014d6565b9150620016ff8262001694565b604082019050919050565b600060208201905081810360008301526200172581620016e3565b9050919050565b60805160a05160c051613df6620017b060003960008181610a6e0152818161171501528181611ed001528181611f7001528181611fcf015281816126f40152818161291a015281816129ba0152612a19015260008181610c89015261133c0152600081816106a101528181610aaa01528181610b5101526127630152613df66000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638366e79a1161010f578063b62496f5116100a2578063dd62ed3e11610071578063dd62ed3e14610587578063e01af92c146105b7578063e2f45605146105d3578063f2fde38b146105f1576101f0565b8063b62496f5146104fd578063b7bda68f1461052d578063d257b34f1461054b578063db8d55f114610567576101f0565b8063a1883d26116100de578063a1883d2614610463578063a457c2d71461047f578063a9059cbb146104af578063ad5c4648146104df576101f0565b80638366e79a146103ef5780638da5cb5b1461040b57806395d89b41146104295780639a7a23d614610447576101f0565b8063313ce5671161018757806353d6fd591161015657806353d6fd591461037b5780636ddd17131461039757806370a08231146103b5578063715018a6146103e5576101f0565b8063313ce567146103055780633950935114610323578063452ed4f11461035357806351f205e414610371576101f0565b806318160ddd116101c357806318160ddd1461029157806322429085146102af57806323b872dd146102cb57806325424896146102fb576101f0565b806306fdde03146101f55780630758d92414610213578063095ea7b3146102315780630b81a5b614610261575b600080fd5b6101fd61060d565b60405161020a9190612d74565b60405180910390f35b61021b61069f565b6040516102289190612e15565b60405180910390f35b61024b60048036038101906102469190612ea9565b6106c3565b6040516102589190612f04565b60405180910390f35b61027b60048036038101906102769190612f1f565b6106e1565b6040516102889190612f04565b60405180910390f35b61029961070c565b6040516102a69190612f5b565b60405180910390f35b6102c960048036038101906102c49190612f76565b610716565b005b6102e560048036038101906102e09190612fc9565b6108d7565b6040516102f29190612f04565b60405180910390f35b6103036109d5565b005b61030d610bc4565b60405161031a9190613038565b60405180910390f35b61033d60048036038101906103389190612ea9565b610bdb565b60405161034a9190612f04565b60405180910390f35b61035b610c87565b6040516103689190613062565b60405180910390f35b610379610cab565b005b610395600480360381019061039091906130a9565b610db9565b005b61039f610e67565b6040516103ac9190612f04565b60405180910390f35b6103cf60048036038101906103ca9190612f1f565b610e7a565b6040516103dc9190612f5b565b60405180910390f35b6103ed610ec2565b005b610409600480360381019061040491906130e9565b61101a565b005b6104136111e7565b6040516104209190613062565b60405180910390f35b610431611211565b60405161043e9190612d74565b60405180910390f35b610461600480360381019061045c91906130a9565b6112a3565b005b61047d60048036038101906104789190612f1f565b611472565b005b61049960048036038101906104949190612ea9565b61160a565b6040516104a69190612f04565b60405180910390f35b6104c960048036038101906104c49190612ea9565b6116f5565b6040516104d69190612f04565b60405180910390f35b6104e7611713565b6040516104f4919061314a565b60405180910390f35b61051760048036038101906105129190612f1f565b611737565b6040516105249190612f04565b60405180910390f35b610535611757565b6040516105429190613062565b60405180910390f35b61056560048036038101906105609190613165565b61177d565b005b61056f61191a565b60405161057e93929190613192565b60405180910390f35b6105a1600480360381019061059c91906130e9565b611933565b6040516105ae9190612f5b565b60405180910390f35b6105d160048036038101906105cc91906131c9565b6119ba565b005b6105db611ad2565b6040516105e89190612f5b565b60405180910390f35b61060b60048036038101906106069190612f1f565b611ad8565b005b60606004805461061c90613225565b80601f016020809104026020016040519081016040528092919081815260200182805461064890613225565b80156106955780601f1061066a57610100808354040283529160200191610695565b820191906000526020600020905b81548152906001019060200180831161067857829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006106d76106d0611c9e565b8484611ca6565b6001905092915050565b600c6020528060005260406000206000915090508060000160009054906101000a900460ff16905081565b6000600254905090565b61071e611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a4906132a2565b60405180910390fd5b6102bc8311156107f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e99061330e565b60405180910390fd5b6102bc821115610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e906133a0565b60405180910390fd5b6102bc81111561087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390613432565b60405180910390fd5b8260098190555081600a8190555080600b819055507fdee9e37af3ea8d668829450175b129f10d826c482d4a23993888ebdd011b9813600954600a54600b546040516108ca93929190613192565b60405180910390a1505050565b60006108e4848484611e75565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061092f611c9e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156109b5578381846040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016109ac93929190613452565b60405180910390fd5b6109c9856109c1611c9e565b858403611ca6565b60019150509392505050565b6109dd611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a63906132a2565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610b07929190613489565b6020604051808303816000875af1158015610b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a91906134c7565b50610b96307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611ca6565b7f442677e6ee13f56c544261dd3126fe163b578cb60cedbfda8ee82b3d2dec0ab260405160405180910390a1565b6000600660009054906101000a900460ff16905090565b6000610c7d610be8611c9e565b848460016000610bf6611c9e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c789190613523565b611ca6565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cb3611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906132a2565b60405180910390fd5b6001600660016101000a81548160ff021916908315150217905550610d65611ea8565b6000600660016101000a81548160ff0219169083151502179055507f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb3242604051610daf9190612f5b565b60405180910390a1565b6040518060200160405280821515815250600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055509050507feef7d1273b513272e863e6cf3068add356fa793a2ca624f49fdf55d9a361bf7081604051610e5b9190612f04565b60405180910390a15050565b600860149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eca611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f50906132a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611022611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a8906132a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611120576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611117906135a3565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161115b9190613062565b602060405180830381865afa158015611178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119c91906135d8565b90506111a98383836120cd565b7fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e43883826040516111da929190613489565b60405180910390a1505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461122090613225565b80601f016020809104026020016040519081016040528092919081815260200182805461124c90613225565b80156112995780601f1061126e57610100808354040283529160200191611299565b820191906000526020600020905b81548152906001019060200180831161127c57829003601f168201915b5050505050905090565b6112ab611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461133a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611331906132a2565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415806113925750805b6113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613677565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b61147a611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611500906132a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f906136e3565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506115c4816001610db9565b8073ffffffffffffffffffffffffffffffffffffffff167ff95a3f3be1ad3ec3d252a63182a8332b013f2251a59a30a03ecd260cbe263cc260405160405180910390a250565b60008060016000611619611c9e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613775565b60405180910390fd5b6116ea6116e1611c9e565b85858403611ca6565b600191505092915050565b6000611709611702611c9e565b8484611e75565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d6020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611785611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b906132a2565b60405180910390fd5b600061181e61070c565b9050620186a06001826118319190613795565b61183b9190613806565b82101561187d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611874906138a9565b60405180910390fd5b606460018261188c9190613795565b6118969190613806565b8211156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf9061393b565b60405180910390fd5b816007819055507f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b1458260405161190e9190612f5b565b60405180910390a15050565b6000806000600954600a54600b54925092509250909192565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6119c2611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a48906132a2565b60405180910390fd5b80600860146101000a81548160ff0219169083151502179055508015611aa2577fc49c1e96242859ad1fcebbc65d8629059ac9afdb0f8a7524f5097a388ed304c160405160405180910390a1611acf565b7f12be78ac2c29f3b4b0cca88b9c3ef07cc32e0024bc37404683fa40ff95a320cc60405160405180910390a15b50565b60075481565b611ae0611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b66906132a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd5906139cd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d185760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611d0f9190613062565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d8a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611d819190613062565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e689190612f5b565b60405180910390a3505050565b6000611e82848484612153565b9050611e8c61235c565b611ea284848385611e9d91906139ed565b6123e0565b50505050565b6000611eb330610e7a565b905060008103611ec357506120cb565b611ecc81612655565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f279190613062565b602060405180830381865afa158015611f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6891906135d8565b11156120c9577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120269190613062565b602060405180830381865afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206791906135d8565b6040518363ffffffff1660e01b8152600401612084929190613489565b6020604051808303816000875af11580156120a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c791906134c7565b505b505b565b61214e8363a9059cbb60e01b84846040516024016120ec929190613489565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061281b565b505050565b6000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16806121fc5750600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b1561220a5760009050612355565b6000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561226757506000600a54115b1561228e57612710600a548461227d9190613795565b6122879190613806565b905061233b565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156122e957506000600954115b1561231057612710600954846122ff9190613795565b6123099190613806565b905061233a565b6000600b54111561233957612710600b548461232c9190613795565b6123369190613806565b90505b5b5b60008111156123505761234f8530836123e0565b5b809150505b9392505050565b60075461236830610e7a565b1180156123815750600860149054906101000a900460ff165b801561239a5750600660019054906101000a900460ff16155b156123de576001600660016101000a81548160ff0219169083151502179055506123c26128e2565b6000600660016101000a81548160ff0219169083151502179055505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124525760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016124499190613062565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124c45760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016124bb9190613062565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612550578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161254793929190613452565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125e39190613523565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126479190612f5b565b60405180910390a350505050565b6000600267ffffffffffffffff81111561267257612671613a21565b5b6040519080825280602002602001820160405280156126a05781602001602082028036833780820191505090505b50905030816000815181106126b8576126b7613a50565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061272757612726613a50565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c11d79583600084600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016127e5959493929190613b78565b600060405180830381600087803b1580156127ff57600080fd5b505af1158015612813573d6000803e3d6000fd5b505050505050565b600061287d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b179092919063ffffffff16565b90506000815111156128dd578080602001905181019061289d91906134c7565b6128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d390613c44565b60405180910390fd5b5b505050565b60006128ed30610e7a565b9050600081036128fd5750612b15565b60075481111561290d5760075490505b61291681612655565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016129719190613062565b602060405180830381865afa15801561298e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b291906135d8565b1115612b13577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a709190613062565b602060405180830381865afa158015612a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab191906135d8565b6040518363ffffffff1660e01b8152600401612ace929190613489565b6020604051808303816000875af1158015612aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1191906134c7565b505b505b565b6060612b268484600085612b2f565b90509392505050565b606082471015612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90613cd6565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b9d9190613d3d565b60006040518083038185875af1925050503d8060008114612bda576040519150601f19603f3d011682016040523d82523d6000602084013e612bdf565b606091505b5091509150612bf087838387612bfc565b92505050949350505050565b60608315612c5e576000835103612c5657612c1685612c71565b612c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4c90613da0565b60405180910390fd5b5b829050612c69565b612c688383612c94565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115612ca75781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdb9190612d74565b60405180910390fd5b600081519050919050565b600082825260208201905092915050565b60005b83811015612d1e578082015181840152602081019050612d03565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d4682612ce4565b612d508185612cef565b9350612d60818560208601612d00565b612d6981612d2a565b840191505092915050565b60006020820190508181036000830152612d8e8184612d3b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612ddb612dd6612dd184612d96565b612db6565b612d96565b9050919050565b6000612ded82612dc0565b9050919050565b6000612dff82612de2565b9050919050565b612e0f81612df4565b82525050565b6000602082019050612e2a6000830184612e06565b92915050565b600080fd5b6000612e4082612d96565b9050919050565b612e5081612e35565b8114612e5b57600080fd5b50565b600081359050612e6d81612e47565b92915050565b6000819050919050565b612e8681612e73565b8114612e9157600080fd5b50565b600081359050612ea381612e7d565b92915050565b60008060408385031215612ec057612ebf612e30565b5b6000612ece85828601612e5e565b9250506020612edf85828601612e94565b9150509250929050565b60008115159050919050565b612efe81612ee9565b82525050565b6000602082019050612f196000830184612ef5565b92915050565b600060208284031215612f3557612f34612e30565b5b6000612f4384828501612e5e565b91505092915050565b612f5581612e73565b82525050565b6000602082019050612f706000830184612f4c565b92915050565b600080600060608486031215612f8f57612f8e612e30565b5b6000612f9d86828701612e94565b9350506020612fae86828701612e94565b9250506040612fbf86828701612e94565b9150509250925092565b600080600060608486031215612fe257612fe1612e30565b5b6000612ff086828701612e5e565b935050602061300186828701612e5e565b925050604061301286828701612e94565b9150509250925092565b600060ff82169050919050565b6130328161301c565b82525050565b600060208201905061304d6000830184613029565b92915050565b61305c81612e35565b82525050565b60006020820190506130776000830184613053565b92915050565b61308681612ee9565b811461309157600080fd5b50565b6000813590506130a38161307d565b92915050565b600080604083850312156130c0576130bf612e30565b5b60006130ce85828601612e5e565b92505060206130df85828601613094565b9150509250929050565b60008060408385031215613100576130ff612e30565b5b600061310e85828601612e5e565b925050602061311f85828601612e5e565b9150509250929050565b600061313482612de2565b9050919050565b61314481613129565b82525050565b600060208201905061315f600083018461313b565b92915050565b60006020828403121561317b5761317a612e30565b5b600061318984828501612e94565b91505092915050565b60006060820190506131a76000830186612f4c565b6131b46020830185612f4c565b6131c16040830184612f4c565b949350505050565b6000602082840312156131df576131de612e30565b5b60006131ed84828501613094565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061323d57607f821691505b6020821081036132505761324f6131f6565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061328c602083612cef565b915061329782613256565b602082019050919050565b600060208201905081810360008301526132bb8161327f565b9050919050565b7f4d757374206b656570206275792066656573206174203725206f72206c657373600082015250565b60006132f8602083612cef565b9150613303826132c2565b602082019050919050565b60006020820190508181036000830152613327816132eb565b9050919050565b7f4d757374206b6565702073656c6c2066656573206174203725206f72206c657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061338a602183612cef565b91506133958261332e565b604082019050919050565b600060208201905081810360008301526133b98161337d565b9050919050565b7f4d757374206b656570207472616e736665722066656573206174203725206f7260008201527f206c657373000000000000000000000000000000000000000000000000000000602082015250565b600061341c602583612cef565b9150613427826133c0565b604082019050919050565b6000602082019050818103600083015261344b8161340f565b9050919050565b60006060820190506134676000830186613053565b6134746020830185612f4c565b6134816040830184612f4c565b949350505050565b600060408201905061349e6000830185613053565b6134ab6020830184612f4c565b9392505050565b6000815190506134c18161307d565b92915050565b6000602082840312156134dd576134dc612e30565b5b60006134eb848285016134b2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061352e82612e73565b915061353983612e73565b9250828201905080821115613551576135506134f4565b5b92915050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b600061358d601a83612cef565b915061359882613557565b602082019050919050565b600060208201905081810360008301526135bc81613580565b9050919050565b6000815190506135d281612e7d565b92915050565b6000602082840312156135ee576135ed612e30565b5b60006135fc848285016135c3565b91505092915050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613661603983612cef565b915061366c82613605565b604082019050919050565b6000602082019050818103600083015261369081613654565b9050919050565b7f616464726573732063616e6e6f74206265203000000000000000000000000000600082015250565b60006136cd601383612cef565b91506136d882613697565b602082019050919050565b600060208201905081810360008301526136fc816136c0565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061375f602583612cef565b915061376a82613703565b604082019050919050565b6000602082019050818103600083015261378e81613752565b9050919050565b60006137a082612e73565b91506137ab83612e73565b92508282026137b981612e73565b915082820484148315176137d0576137cf6134f4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061381182612e73565b915061381c83612e73565b92508261382c5761382b6137d7565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000613893603583612cef565b915061389e82613837565b604082019050919050565b600060208201905081810360008301526138c281613886565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20312520746f74616c20737570706c792e0000000000000000000000000000602082015250565b6000613925603283612cef565b9150613930826138c9565b604082019050919050565b6000602082019050818103600083015261395481613918565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139b7602683612cef565b91506139c28261395b565b604082019050919050565b600060208201905081810360008301526139e6816139aa565b9050919050565b60006139f882612e73565b9150613a0383612e73565b9250828203905081811115613a1b57613a1a6134f4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000613aa4613a9f613a9a84613a7f565b612db6565b612e73565b9050919050565b613ab481613a89565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613aef81612e35565b82525050565b6000613b018383613ae6565b60208301905092915050565b6000602082019050919050565b6000613b2582613aba565b613b2f8185613ac5565b9350613b3a83613ad6565b8060005b83811015613b6b578151613b528882613af5565b9750613b5d83613b0d565b925050600181019050613b3e565b5085935050505092915050565b600060a082019050613b8d6000830188612f4c565b613b9a6020830187613aab565b8181036040830152613bac8186613b1a565b9050613bbb6060830185613053565b613bc86080830184612f4c565b9695505050505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613c2e602a83612cef565b9150613c3982613bd2565b604082019050919050565b60006020820190508181036000830152613c5d81613c21565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613cc0602683612cef565b9150613ccb82613c64565b604082019050919050565b60006020820190508181036000830152613cef81613cb3565b9050919050565b600081519050919050565b600081905092915050565b6000613d1782613cf6565b613d218185613d01565b9350613d31818560208601612d00565b80840191505092915050565b6000613d498284613d0c565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613d8a601d83612cef565b9150613d9582613d54565b602082019050919050565b60006020820190508181036000830152613db981613d7d565b905091905056fea2646970667358221220b26c1e5c0073af84b4a0993969dbf81b4644dd756316646931586d563677357f64736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80638366e79a1161010f578063b62496f5116100a2578063dd62ed3e11610071578063dd62ed3e14610587578063e01af92c146105b7578063e2f45605146105d3578063f2fde38b146105f1576101f0565b8063b62496f5146104fd578063b7bda68f1461052d578063d257b34f1461054b578063db8d55f114610567576101f0565b8063a1883d26116100de578063a1883d2614610463578063a457c2d71461047f578063a9059cbb146104af578063ad5c4648146104df576101f0565b80638366e79a146103ef5780638da5cb5b1461040b57806395d89b41146104295780639a7a23d614610447576101f0565b8063313ce5671161018757806353d6fd591161015657806353d6fd591461037b5780636ddd17131461039757806370a08231146103b5578063715018a6146103e5576101f0565b8063313ce567146103055780633950935114610323578063452ed4f11461035357806351f205e414610371576101f0565b806318160ddd116101c357806318160ddd1461029157806322429085146102af57806323b872dd146102cb57806325424896146102fb576101f0565b806306fdde03146101f55780630758d92414610213578063095ea7b3146102315780630b81a5b614610261575b600080fd5b6101fd61060d565b60405161020a9190612d74565b60405180910390f35b61021b61069f565b6040516102289190612e15565b60405180910390f35b61024b60048036038101906102469190612ea9565b6106c3565b6040516102589190612f04565b60405180910390f35b61027b60048036038101906102769190612f1f565b6106e1565b6040516102889190612f04565b60405180910390f35b61029961070c565b6040516102a69190612f5b565b60405180910390f35b6102c960048036038101906102c49190612f76565b610716565b005b6102e560048036038101906102e09190612fc9565b6108d7565b6040516102f29190612f04565b60405180910390f35b6103036109d5565b005b61030d610bc4565b60405161031a9190613038565b60405180910390f35b61033d60048036038101906103389190612ea9565b610bdb565b60405161034a9190612f04565b60405180910390f35b61035b610c87565b6040516103689190613062565b60405180910390f35b610379610cab565b005b610395600480360381019061039091906130a9565b610db9565b005b61039f610e67565b6040516103ac9190612f04565b60405180910390f35b6103cf60048036038101906103ca9190612f1f565b610e7a565b6040516103dc9190612f5b565b60405180910390f35b6103ed610ec2565b005b610409600480360381019061040491906130e9565b61101a565b005b6104136111e7565b6040516104209190613062565b60405180910390f35b610431611211565b60405161043e9190612d74565b60405180910390f35b610461600480360381019061045c91906130a9565b6112a3565b005b61047d60048036038101906104789190612f1f565b611472565b005b61049960048036038101906104949190612ea9565b61160a565b6040516104a69190612f04565b60405180910390f35b6104c960048036038101906104c49190612ea9565b6116f5565b6040516104d69190612f04565b60405180910390f35b6104e7611713565b6040516104f4919061314a565b60405180910390f35b61051760048036038101906105129190612f1f565b611737565b6040516105249190612f04565b60405180910390f35b610535611757565b6040516105429190613062565b60405180910390f35b61056560048036038101906105609190613165565b61177d565b005b61056f61191a565b60405161057e93929190613192565b60405180910390f35b6105a1600480360381019061059c91906130e9565b611933565b6040516105ae9190612f5b565b60405180910390f35b6105d160048036038101906105cc91906131c9565b6119ba565b005b6105db611ad2565b6040516105e89190612f5b565b60405180910390f35b61060b60048036038101906106069190612f1f565b611ad8565b005b60606004805461061c90613225565b80601f016020809104026020016040519081016040528092919081815260200182805461064890613225565b80156106955780601f1061066a57610100808354040283529160200191610695565b820191906000526020600020905b81548152906001019060200180831161067857829003601f168201915b5050505050905090565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b60006106d76106d0611c9e565b8484611ca6565b6001905092915050565b600c6020528060005260406000206000915090508060000160009054906101000a900460ff16905081565b6000600254905090565b61071e611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a4906132a2565b60405180910390fd5b6102bc8311156107f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e99061330e565b60405180910390fd5b6102bc821115610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e906133a0565b60405180910390fd5b6102bc81111561087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390613432565b60405180910390fd5b8260098190555081600a8190555080600b819055507fdee9e37af3ea8d668829450175b129f10d826c482d4a23993888ebdd011b9813600954600a54600b546040516108ca93929190613192565b60405180910390a1505050565b60006108e4848484611e75565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061092f611c9e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156109b5578381846040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016109ac93929190613452565b60405180910390fd5b6109c9856109c1611c9e565b858403611ca6565b60019150509392505050565b6109dd611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a63906132a2565b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610b07929190613489565b6020604051808303816000875af1158015610b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a91906134c7565b50610b96307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611ca6565b7f442677e6ee13f56c544261dd3126fe163b578cb60cedbfda8ee82b3d2dec0ab260405160405180910390a1565b6000600660009054906101000a900460ff16905090565b6000610c7d610be8611c9e565b848460016000610bf6611c9e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c789190613523565b611ca6565b6001905092915050565b7f000000000000000000000000272914a8bf40d24aa4b6e04a1dae12194922bc1981565b610cb3611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906132a2565b60405180910390fd5b6001600660016101000a81548160ff021916908315150217905550610d65611ea8565b6000600660016101000a81548160ff0219169083151502179055507f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb3242604051610daf9190612f5b565b60405180910390a1565b6040518060200160405280821515815250600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055509050507feef7d1273b513272e863e6cf3068add356fa793a2ca624f49fdf55d9a361bf7081604051610e5b9190612f04565b60405180910390a15050565b600860149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eca611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f50906132a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611022611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a8906132a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611120576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611117906135a3565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161115b9190613062565b602060405180830381865afa158015611178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119c91906135d8565b90506111a98383836120cd565b7fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e43883826040516111da929190613489565b60405180910390a1505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461122090613225565b80601f016020809104026020016040519081016040528092919081815260200182805461124c90613225565b80156112995780601f1061126e57610100808354040283529160200191611299565b820191906000526020600020905b81548152906001019060200180831161127c57829003601f168201915b5050505050905090565b6112ab611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461133a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611331906132a2565b60405180910390fd5b7f000000000000000000000000272914a8bf40d24aa4b6e04a1dae12194922bc1973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415806113925750805b6113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613677565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b61147a611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611500906132a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f906136e3565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506115c4816001610db9565b8073ffffffffffffffffffffffffffffffffffffffff167ff95a3f3be1ad3ec3d252a63182a8332b013f2251a59a30a03ecd260cbe263cc260405160405180910390a250565b60008060016000611619611c9e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613775565b60405180910390fd5b6116ea6116e1611c9e565b85858403611ca6565b600191505092915050565b6000611709611702611c9e565b8484611e75565b6001905092915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600d6020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611785611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b906132a2565b60405180910390fd5b600061181e61070c565b9050620186a06001826118319190613795565b61183b9190613806565b82101561187d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611874906138a9565b60405180910390fd5b606460018261188c9190613795565b6118969190613806565b8211156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf9061393b565b60405180910390fd5b816007819055507f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b1458260405161190e9190612f5b565b60405180910390a15050565b6000806000600954600a54600b54925092509250909192565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6119c2611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a48906132a2565b60405180910390fd5b80600860146101000a81548160ff0219169083151502179055508015611aa2577fc49c1e96242859ad1fcebbc65d8629059ac9afdb0f8a7524f5097a388ed304c160405160405180910390a1611acf565b7f12be78ac2c29f3b4b0cca88b9c3ef07cc32e0024bc37404683fa40ff95a320cc60405160405180910390a15b50565b60075481565b611ae0611c9e565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b66906132a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd5906139cd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d185760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611d0f9190613062565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d8a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611d819190613062565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e689190612f5b565b60405180910390a3505050565b6000611e82848484612153565b9050611e8c61235c565b611ea284848385611e9d91906139ed565b6123e0565b50505050565b6000611eb330610e7a565b905060008103611ec357506120cb565b611ecc81612655565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f279190613062565b602060405180830381865afa158015611f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6891906135d8565b11156120c9577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120269190613062565b602060405180830381865afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206791906135d8565b6040518363ffffffff1660e01b8152600401612084929190613489565b6020604051808303816000875af11580156120a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c791906134c7565b505b505b565b61214e8363a9059cbb60e01b84846040516024016120ec929190613489565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061281b565b505050565b6000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16806121fc5750600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b1561220a5760009050612355565b6000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561226757506000600a54115b1561228e57612710600a548461227d9190613795565b6122879190613806565b905061233b565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156122e957506000600954115b1561231057612710600954846122ff9190613795565b6123099190613806565b905061233a565b6000600b54111561233957612710600b548461232c9190613795565b6123369190613806565b90505b5b5b60008111156123505761234f8530836123e0565b5b809150505b9392505050565b60075461236830610e7a565b1180156123815750600860149054906101000a900460ff165b801561239a5750600660019054906101000a900460ff16155b156123de576001600660016101000a81548160ff0219169083151502179055506123c26128e2565b6000600660016101000a81548160ff0219169083151502179055505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124525760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016124499190613062565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124c45760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016124bb9190613062565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612550578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161254793929190613452565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125e39190613523565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126479190612f5b565b60405180910390a350505050565b6000600267ffffffffffffffff81111561267257612671613a21565b5b6040519080825280602002602001820160405280156126a05781602001602082028036833780820191505090505b50905030816000815181106126b8576126b7613a50565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061272757612726613a50565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff16635c11d79583600084600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016127e5959493929190613b78565b600060405180830381600087803b1580156127ff57600080fd5b505af1158015612813573d6000803e3d6000fd5b505050505050565b600061287d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b179092919063ffffffff16565b90506000815111156128dd578080602001905181019061289d91906134c7565b6128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d390613c44565b60405180910390fd5b5b505050565b60006128ed30610e7a565b9050600081036128fd5750612b15565b60075481111561290d5760075490505b61291681612655565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016129719190613062565b602060405180830381865afa15801561298e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b291906135d8565b1115612b13577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a709190613062565b602060405180830381865afa158015612a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab191906135d8565b6040518363ffffffff1660e01b8152600401612ace929190613489565b6020604051808303816000875af1158015612aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1191906134c7565b505b505b565b6060612b268484600085612b2f565b90509392505050565b606082471015612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90613cd6565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b9d9190613d3d565b60006040518083038185875af1925050503d8060008114612bda576040519150601f19603f3d011682016040523d82523d6000602084013e612bdf565b606091505b5091509150612bf087838387612bfc565b92505050949350505050565b60608315612c5e576000835103612c5657612c1685612c71565b612c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4c90613da0565b60405180910390fd5b5b829050612c69565b612c688383612c94565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115612ca75781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdb9190612d74565b60405180910390fd5b600081519050919050565b600082825260208201905092915050565b60005b83811015612d1e578082015181840152602081019050612d03565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d4682612ce4565b612d508185612cef565b9350612d60818560208601612d00565b612d6981612d2a565b840191505092915050565b60006020820190508181036000830152612d8e8184612d3b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612ddb612dd6612dd184612d96565b612db6565b612d96565b9050919050565b6000612ded82612dc0565b9050919050565b6000612dff82612de2565b9050919050565b612e0f81612df4565b82525050565b6000602082019050612e2a6000830184612e06565b92915050565b600080fd5b6000612e4082612d96565b9050919050565b612e5081612e35565b8114612e5b57600080fd5b50565b600081359050612e6d81612e47565b92915050565b6000819050919050565b612e8681612e73565b8114612e9157600080fd5b50565b600081359050612ea381612e7d565b92915050565b60008060408385031215612ec057612ebf612e30565b5b6000612ece85828601612e5e565b9250506020612edf85828601612e94565b9150509250929050565b60008115159050919050565b612efe81612ee9565b82525050565b6000602082019050612f196000830184612ef5565b92915050565b600060208284031215612f3557612f34612e30565b5b6000612f4384828501612e5e565b91505092915050565b612f5581612e73565b82525050565b6000602082019050612f706000830184612f4c565b92915050565b600080600060608486031215612f8f57612f8e612e30565b5b6000612f9d86828701612e94565b9350506020612fae86828701612e94565b9250506040612fbf86828701612e94565b9150509250925092565b600080600060608486031215612fe257612fe1612e30565b5b6000612ff086828701612e5e565b935050602061300186828701612e5e565b925050604061301286828701612e94565b9150509250925092565b600060ff82169050919050565b6130328161301c565b82525050565b600060208201905061304d6000830184613029565b92915050565b61305c81612e35565b82525050565b60006020820190506130776000830184613053565b92915050565b61308681612ee9565b811461309157600080fd5b50565b6000813590506130a38161307d565b92915050565b600080604083850312156130c0576130bf612e30565b5b60006130ce85828601612e5e565b92505060206130df85828601613094565b9150509250929050565b60008060408385031215613100576130ff612e30565b5b600061310e85828601612e5e565b925050602061311f85828601612e5e565b9150509250929050565b600061313482612de2565b9050919050565b61314481613129565b82525050565b600060208201905061315f600083018461313b565b92915050565b60006020828403121561317b5761317a612e30565b5b600061318984828501612e94565b91505092915050565b60006060820190506131a76000830186612f4c565b6131b46020830185612f4c565b6131c16040830184612f4c565b949350505050565b6000602082840312156131df576131de612e30565b5b60006131ed84828501613094565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061323d57607f821691505b6020821081036132505761324f6131f6565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061328c602083612cef565b915061329782613256565b602082019050919050565b600060208201905081810360008301526132bb8161327f565b9050919050565b7f4d757374206b656570206275792066656573206174203725206f72206c657373600082015250565b60006132f8602083612cef565b9150613303826132c2565b602082019050919050565b60006020820190508181036000830152613327816132eb565b9050919050565b7f4d757374206b6565702073656c6c2066656573206174203725206f72206c657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061338a602183612cef565b91506133958261332e565b604082019050919050565b600060208201905081810360008301526133b98161337d565b9050919050565b7f4d757374206b656570207472616e736665722066656573206174203725206f7260008201527f206c657373000000000000000000000000000000000000000000000000000000602082015250565b600061341c602583612cef565b9150613427826133c0565b604082019050919050565b6000602082019050818103600083015261344b8161340f565b9050919050565b60006060820190506134676000830186613053565b6134746020830185612f4c565b6134816040830184612f4c565b949350505050565b600060408201905061349e6000830185613053565b6134ab6020830184612f4c565b9392505050565b6000815190506134c18161307d565b92915050565b6000602082840312156134dd576134dc612e30565b5b60006134eb848285016134b2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061352e82612e73565b915061353983612e73565b9250828201905080821115613551576135506134f4565b5b92915050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b600061358d601a83612cef565b915061359882613557565b602082019050919050565b600060208201905081810360008301526135bc81613580565b9050919050565b6000815190506135d281612e7d565b92915050565b6000602082840312156135ee576135ed612e30565b5b60006135fc848285016135c3565b91505092915050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613661603983612cef565b915061366c82613605565b604082019050919050565b6000602082019050818103600083015261369081613654565b9050919050565b7f616464726573732063616e6e6f74206265203000000000000000000000000000600082015250565b60006136cd601383612cef565b91506136d882613697565b602082019050919050565b600060208201905081810360008301526136fc816136c0565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061375f602583612cef565b915061376a82613703565b604082019050919050565b6000602082019050818103600083015261378e81613752565b9050919050565b60006137a082612e73565b91506137ab83612e73565b92508282026137b981612e73565b915082820484148315176137d0576137cf6134f4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061381182612e73565b915061381c83612e73565b92508261382c5761382b6137d7565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000613893603583612cef565b915061389e82613837565b604082019050919050565b600060208201905081810360008301526138c281613886565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20312520746f74616c20737570706c792e0000000000000000000000000000602082015250565b6000613925603283612cef565b9150613930826138c9565b604082019050919050565b6000602082019050818103600083015261395481613918565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139b7602683612cef565b91506139c28261395b565b604082019050919050565b600060208201905081810360008301526139e6816139aa565b9050919050565b60006139f882612e73565b9150613a0383612e73565b9250828203905081811115613a1b57613a1a6134f4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000613aa4613a9f613a9a84613a7f565b612db6565b612e73565b9050919050565b613ab481613a89565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613aef81612e35565b82525050565b6000613b018383613ae6565b60208301905092915050565b6000602082019050919050565b6000613b2582613aba565b613b2f8185613ac5565b9350613b3a83613ad6565b8060005b83811015613b6b578151613b528882613af5565b9750613b5d83613b0d565b925050600181019050613b3e565b5085935050505092915050565b600060a082019050613b8d6000830188612f4c565b613b9a6020830187613aab565b8181036040830152613bac8186613b1a565b9050613bbb6060830185613053565b613bc86080830184612f4c565b9695505050505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613c2e602a83612cef565b9150613c3982613bd2565b604082019050919050565b60006020820190508181036000830152613c5d81613c21565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613cc0602683612cef565b9150613ccb82613c64565b604082019050919050565b60006020820190508181036000830152613cef81613cb3565b9050919050565b600081519050919050565b600081905092915050565b6000613d1782613cf6565b613d218185613d01565b9350613d31818560208601612d00565b80840191505092915050565b6000613d498284613d0c565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613d8a601d83612cef565b9150613d9582613d54565b602082019050919050565b60006020820190508181036000830152613db981613d7d565b905091905056fea2646970667358221220b26c1e5c0073af84b4a0993969dbf81b4644dd756316646931586d563677357f64736f6c63430008120033

Deployed Bytecode Sourcemap

16695:12614:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19730:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16822:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10652:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17300:59;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9918:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23365:510;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10870:606;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29072:234;;;:::i;:::-;;19934:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11484:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16866:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28880:184;;;:::i;:::-;;20309:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17092:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10034:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14333:150;;;:::i;:::-;;27556:390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14119:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19830:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22647:358;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28206:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11797:485;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10219:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16906:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17368:57;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17013:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21607:522;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24276:237;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;10443:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20830:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16971:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14491:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19730:92;19776:13;19809:5;19802:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19730:92;:::o;16822:37::-;;;:::o;10652:210::-;10771:4;10793:39;10802:12;:10;:12::i;:::-;10816:7;10825:6;10793:8;:39::i;:::-;10850:4;10843:11;;10652:210;;;;:::o;17300:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9918:108::-;9979:7;10006:12;;9999:19;;9918:108;:::o;23365:510::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23525:3:::1;23514:7;:14;;23506:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;23596:3;23584:8;:15;;23576:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;23672:3;23656:12;:19;;23648:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23737:7;23728:6;:16;;;;23765:8;23755:7;:18;;;;23798:12;23784:11;:26;;;;23826:41;23838:6;;23846:7;;23855:11;;23826:41;;;;;;;;:::i;:::-;;;;;;;;23365:510:::0;;;:::o;10870:606::-;11010:4;11027:36;11037:6;11045:9;11056:6;11027:9;:36::i;:::-;11076:24;11103:11;:19;11115:6;11103:19;;;;;;;;;;;;;;;:33;11123:12;:10;:12::i;:::-;11103:33;;;;;;;;;;;;;;;;11076:60;;11170:6;11151:16;:25;11147:194;;;11245:9;11273:16;11308:6;11200:129;;;;;;;;;;;;;:::i;:::-;;;;;;;;11147:194;11376:57;11385:6;11393:12;:10;:12::i;:::-;11426:6;11407:16;:25;11376:8;:57::i;:::-;11464:4;11457:11;;;10870:606;;;;;:::o;29072:234::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29140:4:::1;:12;;;29161:9;29173:17;29140:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29202:62;29219:4;29234:9;29246:17;29202:8;:62::i;:::-;29280:18;;;;;;;;;;29072:234::o:0;19934:83::-;19975:5;20000:9;;;;;;;;;;;19993:16;;19934:83;:::o;11484:305::-;11603:4;11625:134;11648:12;:10;:12::i;:::-;11675:7;11734:14;11697:11;:25;11709:12;:10;:12::i;:::-;11697:25;;;;;;;;;;;;;;;:34;11723:7;11697:34;;;;;;;;;;;;;;;;:51;;;;:::i;:::-;11625:8;:134::i;:::-;11777:4;11770:11;;11484:305;;;;:::o;16866:31::-;;;:::o;28880:184::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28946:4:::1;28935:8;;:15;;;;;;;;;;;;;;;;;;28961:16;:14;:16::i;:::-;28999:5;28988:8;;:16;;;;;;;;;;;;;;;;;;29020:36;29040:15;29020:36;;;;;;:::i;:::-;;;;;;;;28880:184::o:0;20309:271::-;20444:59;;;;;;;;20474:18;20444:59;;;;;20416:16;:25;20433:7;20416:25;;;;;;;;;;;;;;;:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20519:53;20543:18;20519:53;;;;;;:::i;:::-;;;;;;;;20309:271;;:::o;17092:31::-;;;;;;;;;;;;;:::o;10034:177::-;10153:7;10185:9;:18;10195:7;10185:18;;;;;;;;;;;;;;;;10178:25;;10034:177;;;:::o;14333:150::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14442:1:::1;14405:40;;14426:6;;;;;;;;;;;14405:40;;;;;;;;;;;;14473:1;14456:6;;:19;;;;;;;;;;;;;;;;;;14333:150::o:0;27556:390::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27694:1:::1;27676:20;;:6;:20;;::::0;27668:59:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27738:24;27772:6;27765:24;;;27798:4;27765:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27738:66;;27815:61;27845:6;27854:3;27859:16;27815:22;:61::i;:::-;27892:46;27913:6;27921:16;27892:46;;;;;;;:::i;:::-;;;;;;;;27657:289;27556:390:::0;;:::o;14119:79::-;14157:7;14184:6;;;;;;;;;;;14177:13;;14119:79;:::o;19830:96::-;19878:13;19911:7;19904:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19830:96;:::o;22647:358::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22791:6:::1;22783:14;;:4;:14;;;;:23;;;;22801:5;22783:23;22761:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;22936:5;22902:25;:31;22928:4;22902:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;22991:5;22957:40;;22985:4;22957:40;;;;;;;;;;;;22647:358:::0;;:::o;28206:271::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28311:1:::1;28288:25;;:11;:25;;::::0;28280:57:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28369:11;28348:10;;:33;;;;;;;;;;;;;;;;;;28392:31;28405:11;28418:4;28392:12;:31::i;:::-;28457:11;28439:30;;;;;;;;;;;;28206:271:::0;:::o;11797:485::-;11918:4;11940:24;11967:11;:25;11979:12;:10;:12::i;:::-;11967:25;;;;;;;;;;;;;;;:34;11993:7;11967:34;;;;;;;;;;;;;;;;11940:61;;12054:16;12034;:36;;12012:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;12171:68;12180:12;:10;:12::i;:::-;12194:7;12222:16;12203;:35;12171:8;:68::i;:::-;12270:4;12263:11;;;11797:485;;;;:::o;10219:216::-;10341:4;10363:42;10373:12;:10;:12::i;:::-;10387:9;10398:6;10363:9;:42::i;:::-;10423:4;10416:11;;10219:216;;;;:::o;16906:28::-;;;:::o;17368:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;17013:70::-;;;;;;;;;;;;;:::o;21607:522::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21690:20:::1;21713:13;:11;:13::i;:::-;21690:36;;21793:6;21788:1;21773:12;:16;;;;:::i;:::-;21772:27;;;;:::i;:::-;21759:9;:40;;21737:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;21947:3;21942:1;21927:12;:16;;;;:::i;:::-;21926:24;;;;:::i;:::-;21913:9;:37;;21891:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;22060:9;22039:18;:30;;;;22085:36;22111:9;22085:36;;;;;;:::i;:::-;;;;;;;;21679:450;21607:522:::0;:::o;24276:237::-;24359:15;24389:16;24420:20;24476:6;;24484:7;;24493:11;;24468:37;;;;;;24276:237;;;:::o;10443:201::-;10577:7;10609:11;:18;10621:5;10609:18;;;;;;;;;;;;;;;:27;10628:7;10609:27;;;;;;;;;;;;;;;;10602:34;;10443:201;;;;:::o;20830:217::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20912:7:::1;20898:11;;:21;;;;;;;;;;;;;;;;;;20934:7;20930:110;;;20963:13;;;;;;;;;;20930:110;;;21014:14;;;;;;;;;;20930:110;20830:217:::0;:::o;16971:33::-;;;;:::o;14491:281::-;14256:12;:10;:12::i;:::-;14246:22;;:6;;;;;;;;;;;:22;;;14238:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14614:1:::1;14594:22;;:8;:22;;::::0;14572:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14727:8;14698:38;;14719:6;;;;;;;;;;;14698:38;;;;;;;;;;;;14756:8;14747:6;;:17;;;;;;;;;;;;;;;;;;14491:281:::0;:::o;221:98::-;274:7;301:10;294:17;;221:98;:::o;13343:425::-;13492:1;13475:19;;:5;:19;;;13471:91;;13547:1;13518:32;;;;;;;;;;;:::i;:::-;;;;;;;;13471:91;13595:1;13576:21;;:7;:21;;;13572:92;;13649:1;13621:31;;;;;;;;;;;:::i;:::-;;;;;;;;13572:92;13706:6;13676:11;:18;13688:5;13676:18;;;;;;;;;;;;;;;:27;13695:7;13676:27;;;;;;;;;;;;;;;:36;;;;13744:7;13728:32;;13737:5;13728:32;;;13753:6;13728:32;;;;;;:::i;:::-;;;;;;;;13343:425;;;:::o;25554:249::-;25678:12;25693:26;25702:4;25708:2;25712:6;25693:8;:26::i;:::-;25678:41;;25730:14;:12;:14::i;:::-;25755:40;25771:4;25777:2;25790:4;25781:6;:13;;;;:::i;:::-;25755:15;:40::i;:::-;25667:136;25554:249;;;:::o;26802:355::-;26847:23;26873:24;26891:4;26873:9;:24::i;:::-;26847:50;;26933:1;26914:15;:20;26910:59;;26951:7;;;26910:59;26981:34;26999:15;26981:17;:34::i;:::-;27064:1;27032:4;:14;;;27055:4;27032:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;27028:122;;;27082:4;:13;;;27096:10;;;;;;;;;;;27108:4;:14;;;27131:4;27108:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27082:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27028:122;26836:321;26802:355;:::o;7488:248::-;7605:123;7639:5;7682:23;;;7707:2;7711:5;7659:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7605:19;:123::i;:::-;7488:248;;;:::o;24521:739::-;24633:7;24659:16;:22;24676:4;24659:22;;;;;;;;;;;;;;;:41;;;;;;;;;;;;:84;;;;24704:16;:20;24721:2;24704:20;;;;;;;;;;;;;;;:39;;;;;;;;;;;;24659:84;24655:125;;;24767:1;24760:8;;;;24655:125;24792:12;24821:25;:29;24847:2;24821:29;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;;24864:1;24854:7;;:11;24821:44;24817:317;;;24910:5;24899:7;;24890:6;:16;;;;:::i;:::-;24889:26;;;;:::i;:::-;24882:33;;24817:317;;;24937:25;:31;24963:4;24937:31;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;24981:1;24972:6;;:10;24937:45;24933:201;;;25026:5;25016:6;;25007;:15;;;;:::i;:::-;25006:25;;;;:::i;:::-;24999:32;;24933:201;;;25067:1;25053:11;;:15;25049:85;;;25117:5;25102:11;;25093:6;:20;;;;:::i;:::-;25092:30;;;;:::i;:::-;25085:37;;25049:85;24933:201;24817:317;25157:1;25150:4;:8;25146:83;;;25175:42;25191:4;25205;25212;25175:15;:42::i;:::-;25146:83;25248:4;25241:11;;;24521:739;;;;;;:::o;25268:278::-;25357:18;;25330:24;25348:4;25330:9;:24::i;:::-;:45;:73;;;;;25392:11;;;;;;;;;;;25330:73;:99;;;;;25421:8;;;;;;;;;;;25420:9;25330:99;25312:227;;;25467:4;25456:8;;:15;;;;;;;;;;;;;;;;;;25486:10;:8;:10::i;:::-;25522:5;25511:8;;:16;;;;;;;;;;;;;;;;;;25312:227;25268:278::o;12290:696::-;12444:1;12426:20;;:6;:20;;;12422:90;;12497:1;12470:30;;;;;;;;;;;:::i;:::-;;;;;;;;12422:90;12547:1;12526:23;;:9;:23;;;12522:95;;12602:1;12573:32;;;;;;;;;;;:::i;:::-;;;;;;;;12522:95;12627:21;12651:9;:17;12661:6;12651:17;;;;;;;;;;;;;;;;12627:41;;12699:6;12683:13;:22;12679:117;;;12754:6;12762:13;12777:6;12729:55;;;;;;;;;;;;;:::i;:::-;;;;;;;;12679:117;12867:6;12851:13;:22;12831:9;:17;12841:6;12831:17;;;;;;;;;;;;;;;:42;;;;12919:6;12895:9;:20;12905:9;12895:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12960:9;12943:35;;12952:6;12943:35;;;12971:6;12943:35;;;;;;:::i;:::-;;;;;;;;12411:575;12290:696;;;:::o;25811:509::-;25938:21;25976:1;25962:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25938:40;;26007:4;25989;25994:1;25989:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;26041:4;26023;26028:1;26023:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;26085:9;:63;;;26163:11;26189:1;26233:4;26260:10;;;;;;;;;;;26286:15;26085:227;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25867:453;25811:509;:::o;7744:419::-;7825:23;7851:106;7893:4;7851:106;;;;;;;;;;;;;;;;;7859:5;7851:27;;;;:106;;;;;:::i;:::-;7825:132;;7992:1;7972:10;:17;:21;7968:188;;;8047:10;8036:30;;;;;;;;;;;;:::i;:::-;8010:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;7968:188;7814:349;7744:419;;:::o;26328:466::-;26367:23;26393:24;26411:4;26393:9;:24::i;:::-;26367:50;;26453:1;26434:15;:20;26430:59;;26471:7;;;26430:59;26523:18;;26505:15;:36;26501:105;;;26576:18;;26558:36;;26501:105;26618:34;26636:15;26618:17;:34::i;:::-;26701:1;26669:4;:14;;;26692:4;26669:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;26665:122;;;26719:4;:13;;;26733:10;;;;;;;;;;;26745:4;:14;;;26768:4;26745:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26719:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26665:122;26356:438;26328:466;:::o;1310:229::-;1447:12;1479:52;1501:6;1509:4;1515:1;1518:12;1479:21;:52::i;:::-;1472:59;;1310:229;;;;;:::o;2526:612::-;2696:12;2768:5;2743:21;:30;;2721:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;2851:12;2865:23;2892:6;:11;;2911:5;2932:4;2892:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2850:97;;;;2978:152;3023:6;3048:7;3074:10;3103:12;2978:26;:152::i;:::-;2958:172;;;;2526:612;;;;;;:::o;5661:644::-;5846:12;5875:7;5871:427;;;5924:1;5903:10;:17;:22;5899:290;;6121:18;6132:6;6121:10;:18::i;:::-;6113:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5899:290;6210:10;6203:17;;;;5871:427;6253:33;6261:10;6273:12;6253:7;:33::i;:::-;5661:644;;;;;;;:::o;474:115::-;534:4;580:1;558:7;:19;;;:23;551:30;;474:115;;;:::o;6847:575::-;7051:1;7031:10;:17;:21;7027:388;;;7263:10;7257:17;7320:15;7307:10;7303:2;7299:19;7292:44;7027:388;7390:12;7383:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:99:1;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:126::-;1386:7;1426:42;1419:5;1415:54;1404:65;;1349:126;;;:::o;1481:60::-;1509:3;1530:5;1523:12;;1481:60;;;:::o;1547:142::-;1597:9;1630:53;1648:34;1657:24;1675:5;1657:24;:::i;:::-;1648:34;:::i;:::-;1630:53;:::i;:::-;1617:66;;1547:142;;;:::o;1695:126::-;1745:9;1778:37;1809:5;1778:37;:::i;:::-;1765:50;;1695:126;;;:::o;1827:145::-;1896:9;1929:37;1960:5;1929:37;:::i;:::-;1916:50;;1827:145;;;:::o;1978:169::-;2084:56;2134:5;2084:56;:::i;:::-;2079:3;2072:69;1978:169;;:::o;2153:260::-;2265:4;2303:2;2292:9;2288:18;2280:26;;2316:90;2403:1;2392:9;2388:17;2379:6;2316:90;:::i;:::-;2153:260;;;;:::o;2500:117::-;2609:1;2606;2599:12;2746:96;2783:7;2812:24;2830:5;2812:24;:::i;:::-;2801:35;;2746:96;;;:::o;2848:122::-;2921:24;2939:5;2921:24;:::i;:::-;2914:5;2911:35;2901:63;;2960:1;2957;2950:12;2901:63;2848:122;:::o;2976:139::-;3022:5;3060:6;3047:20;3038:29;;3076:33;3103:5;3076:33;:::i;:::-;2976:139;;;;:::o;3121:77::-;3158:7;3187:5;3176:16;;3121:77;;;:::o;3204:122::-;3277:24;3295:5;3277:24;:::i;:::-;3270:5;3267:35;3257:63;;3316:1;3313;3306:12;3257:63;3204:122;:::o;3332:139::-;3378:5;3416:6;3403:20;3394:29;;3432:33;3459:5;3432:33;:::i;:::-;3332:139;;;;:::o;3477:474::-;3545:6;3553;3602:2;3590:9;3581:7;3577:23;3573:32;3570:119;;;3608:79;;:::i;:::-;3570:119;3728:1;3753:53;3798:7;3789:6;3778:9;3774:22;3753:53;:::i;:::-;3743:63;;3699:117;3855:2;3881:53;3926:7;3917:6;3906:9;3902:22;3881:53;:::i;:::-;3871:63;;3826:118;3477:474;;;;;:::o;3957:90::-;3991:7;4034:5;4027:13;4020:21;4009:32;;3957:90;;;:::o;4053:109::-;4134:21;4149:5;4134:21;:::i;:::-;4129:3;4122:34;4053:109;;:::o;4168:210::-;4255:4;4293:2;4282:9;4278:18;4270:26;;4306:65;4368:1;4357:9;4353:17;4344:6;4306:65;:::i;:::-;4168:210;;;;:::o;4384:329::-;4443:6;4492:2;4480:9;4471:7;4467:23;4463:32;4460:119;;;4498:79;;:::i;:::-;4460:119;4618:1;4643:53;4688:7;4679:6;4668:9;4664:22;4643:53;:::i;:::-;4633:63;;4589:117;4384:329;;;;:::o;4719:118::-;4806:24;4824:5;4806:24;:::i;:::-;4801:3;4794:37;4719:118;;:::o;4843:222::-;4936:4;4974:2;4963:9;4959:18;4951:26;;4987:71;5055:1;5044:9;5040:17;5031:6;4987:71;:::i;:::-;4843:222;;;;:::o;5071:619::-;5148:6;5156;5164;5213:2;5201:9;5192:7;5188:23;5184:32;5181:119;;;5219:79;;:::i;:::-;5181:119;5339:1;5364:53;5409:7;5400:6;5389:9;5385:22;5364:53;:::i;:::-;5354:63;;5310:117;5466:2;5492:53;5537:7;5528:6;5517:9;5513:22;5492:53;:::i;:::-;5482:63;;5437:118;5594:2;5620:53;5665:7;5656:6;5645:9;5641:22;5620:53;:::i;:::-;5610:63;;5565:118;5071:619;;;;;:::o;5696:::-;5773:6;5781;5789;5838:2;5826:9;5817:7;5813:23;5809:32;5806:119;;;5844:79;;:::i;:::-;5806:119;5964:1;5989:53;6034:7;6025:6;6014:9;6010:22;5989:53;:::i;:::-;5979:63;;5935:117;6091:2;6117:53;6162:7;6153:6;6142:9;6138:22;6117:53;:::i;:::-;6107:63;;6062:118;6219:2;6245:53;6290:7;6281:6;6270:9;6266:22;6245:53;:::i;:::-;6235:63;;6190:118;5696:619;;;;;:::o;6321:86::-;6356:7;6396:4;6389:5;6385:16;6374:27;;6321:86;;;:::o;6413:112::-;6496:22;6512:5;6496:22;:::i;:::-;6491:3;6484:35;6413:112;;:::o;6531:214::-;6620:4;6658:2;6647:9;6643:18;6635:26;;6671:67;6735:1;6724:9;6720:17;6711:6;6671:67;:::i;:::-;6531:214;;;;:::o;6751:118::-;6838:24;6856:5;6838:24;:::i;:::-;6833:3;6826:37;6751:118;;:::o;6875:222::-;6968:4;7006:2;6995:9;6991:18;6983:26;;7019:71;7087:1;7076:9;7072:17;7063:6;7019:71;:::i;:::-;6875:222;;;;:::o;7103:116::-;7173:21;7188:5;7173:21;:::i;:::-;7166:5;7163:32;7153:60;;7209:1;7206;7199:12;7153:60;7103:116;:::o;7225:133::-;7268:5;7306:6;7293:20;7284:29;;7322:30;7346:5;7322:30;:::i;:::-;7225:133;;;;:::o;7364:468::-;7429:6;7437;7486:2;7474:9;7465:7;7461:23;7457:32;7454:119;;;7492:79;;:::i;:::-;7454:119;7612:1;7637:53;7682:7;7673:6;7662:9;7658:22;7637:53;:::i;:::-;7627:63;;7583:117;7739:2;7765:50;7807:7;7798:6;7787:9;7783:22;7765:50;:::i;:::-;7755:60;;7710:115;7364:468;;;;;:::o;7838:474::-;7906:6;7914;7963:2;7951:9;7942:7;7938:23;7934:32;7931:119;;;7969:79;;:::i;:::-;7931:119;8089:1;8114:53;8159:7;8150:6;8139:9;8135:22;8114:53;:::i;:::-;8104:63;;8060:117;8216:2;8242:53;8287:7;8278:6;8267:9;8263:22;8242:53;:::i;:::-;8232:63;;8187:118;7838:474;;;;;:::o;8318:140::-;8382:9;8415:37;8446:5;8415:37;:::i;:::-;8402:50;;8318:140;;;:::o;8464:159::-;8565:51;8610:5;8565:51;:::i;:::-;8560:3;8553:64;8464:159;;:::o;8629:250::-;8736:4;8774:2;8763:9;8759:18;8751:26;;8787:85;8869:1;8858:9;8854:17;8845:6;8787:85;:::i;:::-;8629:250;;;;:::o;8885:329::-;8944:6;8993:2;8981:9;8972:7;8968:23;8964:32;8961:119;;;8999:79;;:::i;:::-;8961:119;9119:1;9144:53;9189:7;9180:6;9169:9;9165:22;9144:53;:::i;:::-;9134:63;;9090:117;8885:329;;;;:::o;9220:442::-;9369:4;9407:2;9396:9;9392:18;9384:26;;9420:71;9488:1;9477:9;9473:17;9464:6;9420:71;:::i;:::-;9501:72;9569:2;9558:9;9554:18;9545:6;9501:72;:::i;:::-;9583;9651:2;9640:9;9636:18;9627:6;9583:72;:::i;:::-;9220:442;;;;;;:::o;9668:323::-;9724:6;9773:2;9761:9;9752:7;9748:23;9744:32;9741:119;;;9779:79;;:::i;:::-;9741:119;9899:1;9924:50;9966:7;9957:6;9946:9;9942:22;9924:50;:::i;:::-;9914:60;;9870:114;9668:323;;;;:::o;9997:180::-;10045:77;10042:1;10035:88;10142:4;10139:1;10132:15;10166:4;10163:1;10156:15;10183:320;10227:6;10264:1;10258:4;10254:12;10244:22;;10311:1;10305:4;10301:12;10332:18;10322:81;;10388:4;10380:6;10376:17;10366:27;;10322:81;10450:2;10442:6;10439:14;10419:18;10416:38;10413:84;;10469:18;;:::i;:::-;10413:84;10234:269;10183:320;;;:::o;10509:182::-;10649:34;10645:1;10637:6;10633:14;10626:58;10509:182;:::o;10697:366::-;10839:3;10860:67;10924:2;10919:3;10860:67;:::i;:::-;10853:74;;10936:93;11025:3;10936:93;:::i;:::-;11054:2;11049:3;11045:12;11038:19;;10697:366;;;:::o;11069:419::-;11235:4;11273:2;11262:9;11258:18;11250:26;;11322:9;11316:4;11312:20;11308:1;11297:9;11293:17;11286:47;11350:131;11476:4;11350:131;:::i;:::-;11342:139;;11069:419;;;:::o;11494:182::-;11634:34;11630:1;11622:6;11618:14;11611:58;11494:182;:::o;11682:366::-;11824:3;11845:67;11909:2;11904:3;11845:67;:::i;:::-;11838:74;;11921:93;12010:3;11921:93;:::i;:::-;12039:2;12034:3;12030:12;12023:19;;11682:366;;;:::o;12054:419::-;12220:4;12258:2;12247:9;12243:18;12235:26;;12307:9;12301:4;12297:20;12293:1;12282:9;12278:17;12271:47;12335:131;12461:4;12335:131;:::i;:::-;12327:139;;12054:419;;;:::o;12479:220::-;12619:34;12615:1;12607:6;12603:14;12596:58;12688:3;12683:2;12675:6;12671:15;12664:28;12479:220;:::o;12705:366::-;12847:3;12868:67;12932:2;12927:3;12868:67;:::i;:::-;12861:74;;12944:93;13033:3;12944:93;:::i;:::-;13062:2;13057:3;13053:12;13046:19;;12705:366;;;:::o;13077:419::-;13243:4;13281:2;13270:9;13266:18;13258:26;;13330:9;13324:4;13320:20;13316:1;13305:9;13301:17;13294:47;13358:131;13484:4;13358:131;:::i;:::-;13350:139;;13077:419;;;:::o;13502:224::-;13642:34;13638:1;13630:6;13626:14;13619:58;13711:7;13706:2;13698:6;13694:15;13687:32;13502:224;:::o;13732:366::-;13874:3;13895:67;13959:2;13954:3;13895:67;:::i;:::-;13888:74;;13971:93;14060:3;13971:93;:::i;:::-;14089:2;14084:3;14080:12;14073:19;;13732:366;;;:::o;14104:419::-;14270:4;14308:2;14297:9;14293:18;14285:26;;14357:9;14351:4;14347:20;14343:1;14332:9;14328:17;14321:47;14385:131;14511:4;14385:131;:::i;:::-;14377:139;;14104:419;;;:::o;14529:442::-;14678:4;14716:2;14705:9;14701:18;14693:26;;14729:71;14797:1;14786:9;14782:17;14773:6;14729:71;:::i;:::-;14810:72;14878:2;14867:9;14863:18;14854:6;14810:72;:::i;:::-;14892;14960:2;14949:9;14945:18;14936:6;14892:72;:::i;:::-;14529:442;;;;;;:::o;14977:332::-;15098:4;15136:2;15125:9;15121:18;15113:26;;15149:71;15217:1;15206:9;15202:17;15193:6;15149:71;:::i;:::-;15230:72;15298:2;15287:9;15283:18;15274:6;15230:72;:::i;:::-;14977:332;;;;;:::o;15315:137::-;15369:5;15400:6;15394:13;15385:22;;15416:30;15440:5;15416:30;:::i;:::-;15315:137;;;;:::o;15458:345::-;15525:6;15574:2;15562:9;15553:7;15549:23;15545:32;15542:119;;;15580:79;;:::i;:::-;15542:119;15700:1;15725:61;15778:7;15769:6;15758:9;15754:22;15725:61;:::i;:::-;15715:71;;15671:125;15458:345;;;;:::o;15809:180::-;15857:77;15854:1;15847:88;15954:4;15951:1;15944:15;15978:4;15975:1;15968:15;15995:191;16035:3;16054:20;16072:1;16054:20;:::i;:::-;16049:25;;16088:20;16106:1;16088:20;:::i;:::-;16083:25;;16131:1;16128;16124:9;16117:16;;16152:3;16149:1;16146:10;16143:36;;;16159:18;;:::i;:::-;16143:36;15995:191;;;;:::o;16192:176::-;16332:28;16328:1;16320:6;16316:14;16309:52;16192:176;:::o;16374:366::-;16516:3;16537:67;16601:2;16596:3;16537:67;:::i;:::-;16530:74;;16613:93;16702:3;16613:93;:::i;:::-;16731:2;16726:3;16722:12;16715:19;;16374:366;;;:::o;16746:419::-;16912:4;16950:2;16939:9;16935:18;16927:26;;16999:9;16993:4;16989:20;16985:1;16974:9;16970:17;16963:47;17027:131;17153:4;17027:131;:::i;:::-;17019:139;;16746:419;;;:::o;17171:143::-;17228:5;17259:6;17253:13;17244:22;;17275:33;17302:5;17275:33;:::i;:::-;17171:143;;;;:::o;17320:351::-;17390:6;17439:2;17427:9;17418:7;17414:23;17410:32;17407:119;;;17445:79;;:::i;:::-;17407:119;17565:1;17590:64;17646:7;17637:6;17626:9;17622:22;17590:64;:::i;:::-;17580:74;;17536:128;17320:351;;;;:::o;17677:244::-;17817:34;17813:1;17805:6;17801:14;17794:58;17886:27;17881:2;17873:6;17869:15;17862:52;17677:244;:::o;17927:366::-;18069:3;18090:67;18154:2;18149:3;18090:67;:::i;:::-;18083:74;;18166:93;18255:3;18166:93;:::i;:::-;18284:2;18279:3;18275:12;18268:19;;17927:366;;;:::o;18299:419::-;18465:4;18503:2;18492:9;18488:18;18480:26;;18552:9;18546:4;18542:20;18538:1;18527:9;18523:17;18516:47;18580:131;18706:4;18580:131;:::i;:::-;18572:139;;18299:419;;;:::o;18724:169::-;18864:21;18860:1;18852:6;18848:14;18841:45;18724:169;:::o;18899:366::-;19041:3;19062:67;19126:2;19121:3;19062:67;:::i;:::-;19055:74;;19138:93;19227:3;19138:93;:::i;:::-;19256:2;19251:3;19247:12;19240:19;;18899:366;;;:::o;19271:419::-;19437:4;19475:2;19464:9;19460:18;19452:26;;19524:9;19518:4;19514:20;19510:1;19499:9;19495:17;19488:47;19552:131;19678:4;19552:131;:::i;:::-;19544:139;;19271:419;;;:::o;19696:224::-;19836:34;19832:1;19824:6;19820:14;19813:58;19905:7;19900:2;19892:6;19888:15;19881:32;19696:224;:::o;19926:366::-;20068:3;20089:67;20153:2;20148:3;20089:67;:::i;:::-;20082:74;;20165:93;20254:3;20165:93;:::i;:::-;20283:2;20278:3;20274:12;20267:19;;19926:366;;;:::o;20298:419::-;20464:4;20502:2;20491:9;20487:18;20479:26;;20551:9;20545:4;20541:20;20537:1;20526:9;20522:17;20515:47;20579:131;20705:4;20579:131;:::i;:::-;20571:139;;20298:419;;;:::o;20723:410::-;20763:7;20786:20;20804:1;20786:20;:::i;:::-;20781:25;;20820:20;20838:1;20820:20;:::i;:::-;20815:25;;20875:1;20872;20868:9;20897:30;20915:11;20897:30;:::i;:::-;20886:41;;21076:1;21067:7;21063:15;21060:1;21057:22;21037:1;21030:9;21010:83;20987:139;;21106:18;;:::i;:::-;20987:139;20771:362;20723:410;;;;:::o;21139:180::-;21187:77;21184:1;21177:88;21284:4;21281:1;21274:15;21308:4;21305:1;21298:15;21325:185;21365:1;21382:20;21400:1;21382:20;:::i;:::-;21377:25;;21416:20;21434:1;21416:20;:::i;:::-;21411:25;;21455:1;21445:35;;21460:18;;:::i;:::-;21445:35;21502:1;21499;21495:9;21490:14;;21325:185;;;;:::o;21516:240::-;21656:34;21652:1;21644:6;21640:14;21633:58;21725:23;21720:2;21712:6;21708:15;21701:48;21516:240;:::o;21762:366::-;21904:3;21925:67;21989:2;21984:3;21925:67;:::i;:::-;21918:74;;22001:93;22090:3;22001:93;:::i;:::-;22119:2;22114:3;22110:12;22103:19;;21762:366;;;:::o;22134:419::-;22300:4;22338:2;22327:9;22323:18;22315:26;;22387:9;22381:4;22377:20;22373:1;22362:9;22358:17;22351:47;22415:131;22541:4;22415:131;:::i;:::-;22407:139;;22134:419;;;:::o;22559:237::-;22699:34;22695:1;22687:6;22683:14;22676:58;22768:20;22763:2;22755:6;22751:15;22744:45;22559:237;:::o;22802:366::-;22944:3;22965:67;23029:2;23024:3;22965:67;:::i;:::-;22958:74;;23041:93;23130:3;23041:93;:::i;:::-;23159:2;23154:3;23150:12;23143:19;;22802:366;;;:::o;23174:419::-;23340:4;23378:2;23367:9;23363:18;23355:26;;23427:9;23421:4;23417:20;23413:1;23402:9;23398:17;23391:47;23455:131;23581:4;23455:131;:::i;:::-;23447:139;;23174:419;;;:::o;23599:225::-;23739:34;23735:1;23727:6;23723:14;23716:58;23808:8;23803:2;23795:6;23791:15;23784:33;23599:225;:::o;23830:366::-;23972:3;23993:67;24057:2;24052:3;23993:67;:::i;:::-;23986:74;;24069:93;24158:3;24069:93;:::i;:::-;24187:2;24182:3;24178:12;24171:19;;23830:366;;;:::o;24202:419::-;24368:4;24406:2;24395:9;24391:18;24383:26;;24455:9;24449:4;24445:20;24441:1;24430:9;24426:17;24419:47;24483:131;24609:4;24483:131;:::i;:::-;24475:139;;24202:419;;;:::o;24627:194::-;24667:4;24687:20;24705:1;24687:20;:::i;:::-;24682:25;;24721:20;24739:1;24721:20;:::i;:::-;24716:25;;24765:1;24762;24758:9;24750:17;;24789:1;24783:4;24780:11;24777:37;;;24794:18;;:::i;:::-;24777:37;24627:194;;;;:::o;24827:180::-;24875:77;24872:1;24865:88;24972:4;24969:1;24962:15;24996:4;24993:1;24986:15;25013:180;25061:77;25058:1;25051:88;25158:4;25155:1;25148:15;25182:4;25179:1;25172:15;25199:85;25244:7;25273:5;25262:16;;25199:85;;;:::o;25290:158::-;25348:9;25381:61;25399:42;25408:32;25434:5;25408:32;:::i;:::-;25399:42;:::i;:::-;25381:61;:::i;:::-;25368:74;;25290:158;;;:::o;25454:147::-;25549:45;25588:5;25549:45;:::i;:::-;25544:3;25537:58;25454:147;;:::o;25607:114::-;25674:6;25708:5;25702:12;25692:22;;25607:114;;;:::o;25727:184::-;25826:11;25860:6;25855:3;25848:19;25900:4;25895:3;25891:14;25876:29;;25727:184;;;;:::o;25917:132::-;25984:4;26007:3;25999:11;;26037:4;26032:3;26028:14;26020:22;;25917:132;;;:::o;26055:108::-;26132:24;26150:5;26132:24;:::i;:::-;26127:3;26120:37;26055:108;;:::o;26169:179::-;26238:10;26259:46;26301:3;26293:6;26259:46;:::i;:::-;26337:4;26332:3;26328:14;26314:28;;26169:179;;;;:::o;26354:113::-;26424:4;26456;26451:3;26447:14;26439:22;;26354:113;;;:::o;26503:732::-;26622:3;26651:54;26699:5;26651:54;:::i;:::-;26721:86;26800:6;26795:3;26721:86;:::i;:::-;26714:93;;26831:56;26881:5;26831:56;:::i;:::-;26910:7;26941:1;26926:284;26951:6;26948:1;26945:13;26926:284;;;27027:6;27021:13;27054:63;27113:3;27098:13;27054:63;:::i;:::-;27047:70;;27140:60;27193:6;27140:60;:::i;:::-;27130:70;;26986:224;26973:1;26970;26966:9;26961:14;;26926:284;;;26930:14;27226:3;27219:10;;26627:608;;;26503:732;;;;:::o;27241:831::-;27504:4;27542:3;27531:9;27527:19;27519:27;;27556:71;27624:1;27613:9;27609:17;27600:6;27556:71;:::i;:::-;27637:80;27713:2;27702:9;27698:18;27689:6;27637:80;:::i;:::-;27764:9;27758:4;27754:20;27749:2;27738:9;27734:18;27727:48;27792:108;27895:4;27886:6;27792:108;:::i;:::-;27784:116;;27910:72;27978:2;27967:9;27963:18;27954:6;27910:72;:::i;:::-;27992:73;28060:3;28049:9;28045:19;28036:6;27992:73;:::i;:::-;27241:831;;;;;;;;:::o;28078:229::-;28218:34;28214:1;28206:6;28202:14;28195:58;28287:12;28282:2;28274:6;28270:15;28263:37;28078:229;:::o;28313:366::-;28455:3;28476:67;28540:2;28535:3;28476:67;:::i;:::-;28469:74;;28552:93;28641:3;28552:93;:::i;:::-;28670:2;28665:3;28661:12;28654:19;;28313:366;;;:::o;28685:419::-;28851:4;28889:2;28878:9;28874:18;28866:26;;28938:9;28932:4;28928:20;28924:1;28913:9;28909:17;28902:47;28966:131;29092:4;28966:131;:::i;:::-;28958:139;;28685:419;;;:::o;29110:225::-;29250:34;29246:1;29238:6;29234:14;29227:58;29319:8;29314:2;29306:6;29302:15;29295:33;29110:225;:::o;29341:366::-;29483:3;29504:67;29568:2;29563:3;29504:67;:::i;:::-;29497:74;;29580:93;29669:3;29580:93;:::i;:::-;29698:2;29693:3;29689:12;29682:19;;29341:366;;;:::o;29713:419::-;29879:4;29917:2;29906:9;29902:18;29894:26;;29966:9;29960:4;29956:20;29952:1;29941:9;29937:17;29930:47;29994:131;30120:4;29994:131;:::i;:::-;29986:139;;29713:419;;;:::o;30138:98::-;30189:6;30223:5;30217:12;30207:22;;30138:98;;;:::o;30242:147::-;30343:11;30380:3;30365:18;;30242:147;;;;:::o;30395:386::-;30499:3;30527:38;30559:5;30527:38;:::i;:::-;30581:88;30662:6;30657:3;30581:88;:::i;:::-;30574:95;;30678:65;30736:6;30731:3;30724:4;30717:5;30713:16;30678:65;:::i;:::-;30768:6;30763:3;30759:16;30752:23;;30503:278;30395:386;;;;:::o;30787:271::-;30917:3;30939:93;31028:3;31019:6;30939:93;:::i;:::-;30932:100;;31049:3;31042:10;;30787:271;;;;:::o;31064:179::-;31204:31;31200:1;31192:6;31188:14;31181:55;31064:179;:::o;31249:366::-;31391:3;31412:67;31476:2;31471:3;31412:67;:::i;:::-;31405:74;;31488:93;31577:3;31488:93;:::i;:::-;31606:2;31601:3;31597:12;31590:19;;31249:366;;;:::o;31621:419::-;31787:4;31825:2;31814:9;31810:18;31802:26;;31874:9;31868:4;31864:20;31860:1;31849:9;31845:17;31838:47;31902:131;32028:4;31902:131;:::i;:::-;31894:139;;31621:419;;;:::o

Swarm Source

ipfs://b26c1e5c0073af84b4a0993969dbf81b4644dd756316646931586d563677357f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.