POL Price: $0.676716 (+9.39%)
 

Overview

Max Total Supply

2,853,158,137.20335641123392301 PHNX

Holders

1,611 (0.00%)

Market

Price

$0.0001 @ 0.000172 POL

Onchain Market Cap

$332,421.45

Circulating Supply Market Cap

$143,001.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
936,102.353350696239048903 PHNX

Value
$109.07 ( ~161.1754 POL) [0.0328%]
0x103BaFC2989EcB0aECe6BCD3d653c3AD3E87C6ea
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Phenix Finance project is an initiative led by a team of committed, experienced, and community-driven people that focuses on delivering easy rewards and DeFi services to project and business owners in the crypto space.

Market

Volume (24H):$441.99
Market Capitalization:$143,001.00
Circulating Supply:1,923,833,363.00 PHNX
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
PhenixFinance

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-11-08
*/

// File: contracts/InterfaceLP.sol

pragma solidity ^0.7.4;


interface InterfaceLP {
    function sync() external;
}

// File: contracts/SafeMathInt.sol

pragma solidity ^0.7.4;


library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != -1 || a != MIN_INT256);

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
}

// File: contracts/SafeMath.sol

pragma solidity ^0.7.4;


library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: contracts/Ownable.sol

pragma solidity ^0.7.4;


contract Ownable {
    address private _owner;

    event OwnershipRenounced(address indexed previousOwner);

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

    constructor() {
        _owner = msg.sender;
    }

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

    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(_owner);
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/IVVSRouter01.sol

pragma solidity ^0.7.4;


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

    function WETH() external pure returns (address);

    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 addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

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

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

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

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

// File: contracts/IVVSRouter.sol

pragma solidity ^0.7.4;



interface IVVSRouter is IVVSRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

// File: contracts/IVVSFactory.sol

pragma solidity ^0.7.4;


interface IVVSFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// File: contracts/IERC20.sol

pragma solidity ^0.7.4;


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

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

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

    function transfer(address to, uint256 value) external returns (bool);

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

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: contracts/ERC20Detailed.sol

pragma solidity ^0.7.4;



abstract contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(
        string memory name,
        string memory symbol,
        uint8 decimals
    ) {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

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

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

// File: contracts/Phenix.sol

pragma solidity ^0.7.4;










contract PhenixFinance is ERC20Detailed, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    event Rebase(uint256 indexed totalSupply);

    address[] public pairAddresses;
    address public liquidityReceiver;
    address public phenixFundReserveReceiver;
    bool public initialDistributionFinished;

    mapping(address => bool) _allowTransfer;
    mapping(address => bool) _isFeeExempt;

    uint256 private constant FXP_BASE = 1000000;
    uint256 private constant DECIMALS = 18;
    uint256 private constant MAX_UINT256 = ~uint256(0);
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;
    uint256 private constant REBASE_INTERVAL = 86400;
    uint256 private constant INITIAL_FRAGMENTS_SUPPLY =
        10 * 10**6 * 10**DECIMALS;

    uint256 public liquidityFee = 2;
    uint256 public phenixVaultFee = 8;
    uint256 public sellFee = 5;
    uint256 public totalFee = liquidityFee.add(phenixVaultFee);
    uint256 public feeDenominator = 100;

    uint256 public lastRebaseTimestamp = block.timestamp;
    uint256 public lastRebaseDelta = 0;
    uint256 public rebasePercentDelta = (18 * FXP_BASE) / 1000;

    bool public rebaseRX3Enabled = true;
    uint256 public rebaseRX3Multiplier = FXP_BASE;
    uint256 public rebaseMaxRX3Multiplier = FXP_BASE + FXP_BASE / 2;
    uint256 public rebaseRX3MultiplierStep = (1 * FXP_BASE) / 1000;

    IVVSRouter public router;
    bool public swapEnabled = true;
    uint256 private gonSwapThreshold = (TOTAL_GONS * 10) / 10000;
    bool inSwap;

    uint256 private constant TOTAL_GONS =
        MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY);
    uint256 private constant MAX_SUPPLY = ~uint128(0);
    uint256 private _totalSupply;
    uint256 private _gonsPerFragment;
    mapping(address => uint256) private _gonBalances;
    mapping(address => mapping(address => uint256)) private _allowedFragments;
    mapping(address => bool) public taxableAddress;
    mapping(address => bool) public authorizedRebaseAddress;

    constructor() ERC20Detailed("Phenix Finance", "PHNX", uint8(DECIMALS)) {
        router = IVVSRouter(0x51aBA405De2b25E5506DeA32A6697F450cEB1a17);

        address _pairAddress = address(
            IVVSFactory(router.factory()).createPair(
                router.WETH(),
                address(this)
            )
        );

        liquidityReceiver = address(msg.sender);
        phenixFundReserveReceiver = address(msg.sender);

        _allowedFragments[address(this)][address(router)] = uint256(-1);

        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        _gonBalances[address(msg.sender)] = TOTAL_GONS;
        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        _isFeeExempt[address(phenixFundReserveReceiver)] = true;
        _isFeeExempt[address(this)] = true;
        _isFeeExempt[address(msg.sender)] = true;

        taxableAddress[_pairAddress] = true;
        pairAddresses.push(_pairAddress);
        authorizedRebaseAddress[address(msg.sender)] = true;
        
        emit Transfer(address(0x0), address(msg.sender), _totalSupply);
    }

    /**
     * @dev Swapping switch used to mitigate any calculation
     * issues during swapBack.
     */
    modifier noReentrancy() {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier initialDistributionLock() {
        require(
            initialDistributionFinished ||
                isOwner() ||
                _allowTransfer[msg.sender],
            "Initial distirbution not finalized."
        );
        _;
    }

    modifier validRecipient(address to) {
        require(to != address(0x0));
        _;
    }

    /**
     * @dev Returns the delta of the next rebase.
     * @return next rebase delta as uint256 value.
     */
    function getNextRebase(uint256 _timestamp) public view returns (uint256) {
        uint256 rebaseTimestampDelta = _timestamp - lastRebaseTimestamp;

        uint256 nextScaledRebaseIntervalPercentage = rebaseTimestampDelta
            .mul(FXP_BASE)
            .div(REBASE_INTERVAL);

        uint256 nextRebaseDelta = _totalSupply
            .mul(rebasePercentDelta)
            .div(FXP_BASE)
            .mul(nextScaledRebaseIntervalPercentage)
            .div(FXP_BASE);

        if (rebaseRX3Enabled == true) {
            nextRebaseDelta = nextRebaseDelta
                .mul(
                    rebaseRX3Multiplier < rebaseMaxRX3Multiplier
                        ? rebaseRX3Multiplier
                        : rebaseMaxRX3Multiplier
                )
                .div(FXP_BASE);
        }

        return nextRebaseDelta;
    }

    /**
     * @dev Rebases total token supply based on the getNextRebase()
     * return result. Rebase is capped when MAX_SUPPLY is reached.
     */
    function _rebase() internal {
        uint256 supplyDelta = getNextRebase(block.timestamp);
        _totalSupply = _totalSupply.add(uint256(supplyDelta));

        if (_totalSupply > MAX_SUPPLY) {
            _totalSupply = MAX_SUPPLY;
        }

        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        lastRebaseDelta = supplyDelta;
        lastRebaseTimestamp = block.timestamp;
        rebaseRX3Multiplier = FXP_BASE;

        emit Rebase(_totalSupply);
    }

    /**
     * @dev Executes the internal _rebase() function and then
     * performs the sync() call on all applicable pairAddresses
     */
    function rebaseAndSync() external {
        require(
            authorizedRebaseAddress[msg.sender] == true,
            "Not authroized to execute rebase"
        );

        _rebase();

        for (uint256 i = 0; i < pairAddresses.length; i++) {
            if (taxableAddress[pairAddresses[i]] == true) {
                InterfaceLP(pairAddresses[i]).sync();
            }
        }
    }

    /**
     * @dev Sets the last rebase time to the current block
     * timestamp as means to reset the value.
     */
    function resetLastRebaseTimestamp() external {
        require(
            authorizedRebaseAddress[msg.sender] == true,
            "Not authroized to execute this function."
        );

        lastRebaseTimestamp = block.timestamp;
    }

    /**
     * @dev Returns total token supply. Overrides ERC-20
     * totalSupply() function to return elastic supply.
     */
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Transfers amount tokens to an address.
     * @param to Receiver of the transfered tokens.
     * @param value Amount of tokens that are received.
     * @return true
     */
    function transfer(address to, uint256 value)
        external
        override
        validRecipient(to)
        initialDistributionLock
        returns (bool)
    {
        _transferFrom(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Adds LP contract address and removes
     * fees from the given address. Added pair contract tested
     * sync() before adding to see if it is a pair address.
     * Addition will fail if sync() fails.
     * @param _address Update LP contract address.
     */
    function addLPAddress(address _address) external onlyOwner {
        InterfaceLP(_address).sync();

        for (uint256 i = 0; i < pairAddresses.length; i++) {
            require(pairAddresses[i] != _address, "Pair address already added");
        }

        pairAddresses.push(_address);
        taxableAddress[_address] = true;
    }

    /**
     * @dev Returns array of all LP Addresses
     * @return address[] Array of LP Addresses.
     **/
    function getLPAddresses() external view returns (address[] memory) {
        return pairAddresses;
    }

    /**
     * @dev Updates given address' taxable status.
     * @param _address Subject address of taxable state adjustment.
     * @param _status State if address should be taxed.
     */
    function setTaxableAddress(address _address, bool _status)
        external
        onlyOwner
    {
        taxableAddress[_address] = _status;
    }

    /**
     * @dev Updates given address' Authorized Rebase status.
     * @param _address Subject address of Authorized Rebase state adjustment.
     * @param _status State if address should be allowed call rebaseAndSync().
     */
    function setAuthorizedRebaseAddress(address _address, bool _status)
        external
        onlyOwner
    {
        authorizedRebaseAddress[_address] = _status;
    }

    /**
     * @dev Returns spender alloance of an owner address.
     * Overides ERC-20 allowance(address, address) function
     * to return allowed fragments.
     * @param owner Owner address of tokens.
     * @param spender Spender address of tokens.
     * @return uint256 Amount of allowed tokens for the spender to use.
     */
    function allowance(address owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowedFragments[owner][spender];
    }

    /**
     * @dev Returns balance of given address. Overrides
     * ERC-20 balanceOf(address) to provide balance based
     * on holder gons and gonsPerFragment.
     * @param who Balance of address.
     * @return uint256 value of address balance.
     */
    function balanceOf(address who) external view override returns (uint256) {
        return _gonBalances[who].div(_gonsPerFragment);
    }

    /**
     * @dev Performs basic token transfer. Used as
     * internal function in _transferFrom(address,
     * address, uint256) function.
     * @param from sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param amount amount of tokens for receiver.
     * @return true.
     */
    function _basicTransfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 gonAmount = amount.mul(_gonsPerFragment);
        _gonBalances[from] = _gonBalances[from].sub(gonAmount);
        _gonBalances[to] = _gonBalances[to].add(gonAmount);
        return true;
    }

    /**
     * @dev Transfers token from sender address
     * to receiver address. Performs token supply
     * rebase provided it is acceptable. Executes
     * _baseTransfer(address, address, uint256) if
     * swap is in progress.
     * @param sender sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param amount amount of tokens for receiver.
     * @return true.
     */
    function _transferFrom(
        address sender,
        address to,
        uint256 amount
    ) internal returns (bool) {
        if (inSwap) {
            return _basicTransfer(sender, to, amount);
        }

        uint256 gonAmount = amount.mul(_gonsPerFragment);

        if (_shouldSwapBack()) {
            _swapBack();
        }

        if (rebaseRX3Enabled == true) {
            rebaseRX3Multiplier = rebaseRX3Multiplier.add(
                rebaseRX3MultiplierStep
            );
        }

        _gonBalances[sender] = _gonBalances[sender].sub(gonAmount);

        uint256 gonAmountReceived = _shouldTakeFee(sender, to)
            ? _takeFee(sender, to, gonAmount)
            : gonAmount;
        _gonBalances[to] = _gonBalances[to].add(gonAmountReceived);

        emit Transfer(sender, to, gonAmountReceived.div(_gonsPerFragment));

        return true;
    }

    /**
     * @dev Transfers token from sender address
     * to receiver address. Overrides ERC-20
     * transferFrom(address, address, uint256) to
     * check value of allowed fragments that sender
     * can access from the owner (from address).
     * @param from sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param value amount of tokens for receiver.
     * @return true.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override validRecipient(to) returns (bool) {
        if (_allowedFragments[from][msg.sender] != uint256(-1)) {
            _allowedFragments[from][msg.sender] = _allowedFragments[from][
                msg.sender
            ].sub(value, "Insufficient Allowance");
        }

        _transferFrom(from, to, value);
        return true;
    }

    /**
     * @dev Executes fee allocations and distributes tokens
     * to contract address, phenix vault receiver address, and
     * liquidity receiver address.
     */
    function _swapBack() internal noReentrancy {
        uint256 contractTokenBalance = _gonBalances[address(this)].div(
            _gonsPerFragment
        );
        uint256 amountToLiquify = contractTokenBalance
            .mul(liquidityFee)
            .div(totalFee)
            .div(2);
        uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify);

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

        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance.sub(balanceBefore);
        uint256 totalETHFee = totalFee.sub(liquidityFee.div(2));

        uint256 amountETHLiquidity = amountETH
            .mul(liquidityFee)
            .div(totalETHFee)
            .div(2);

        if (amountToLiquify > 0) {
            router.addLiquidityETH{value: amountETHLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                liquidityReceiver,
                block.timestamp
            );
        }

        (bool success, ) = payable(phenixFundReserveReceiver).call{
            value: address(this).balance
        }("");
    }

    /**
     * @dev Calculates swap fee and returns new allocation
     * of swap based on swap conditions. Calculate is based
     * on liquidity fee and phenix vault fee. Sell fee will also
     * be taken into consideration if receiver is pair address.
     * @return uint256 gonAmount that is transfered in the swap.
     */
    function _takeFee(
        address sender,
        address to,
        uint256 gonAmount
    ) internal returns (uint256) {
        uint256 _totalFee = totalFee;
        if (taxableAddress[to] == true) _totalFee = _totalFee.add(sellFee);

        uint256 feeAmount = gonAmount.mul(_totalFee).div(feeDenominator);

        _gonBalances[address(this)] = _gonBalances[address(this)].add(
            feeAmount
        );
        emit Transfer(sender, address(this), feeAmount.div(_gonsPerFragment));

        return gonAmount.sub(feeAmount);
    }

    /**
     * @dev Decreases spender allowance of sender address.
     * @param spender Spender address.
     * @param subtractedValue Amount to reduce spender allowance by.
     * @return bool
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        initialDistributionLock
        returns (bool)
    {
        uint256 oldValue = _allowedFragments[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowedFragments[msg.sender][spender] = 0;
        } else {
            _allowedFragments[msg.sender][spender] = oldValue.sub(
                subtractedValue
            );
        }
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    /**
     * @dev Updates router address
     * @param _address address to set for the dex router
     */
    function updateRouter(address _address) external onlyOwner {
        require(address(router) != _address, "Router address already set");
        router = IVVSRouter(_address);
    }

    /**
     * @dev Increases spender allowance of sender address.
     * @param spender Spender address.
     * @param addedValue Amount to increase spender allowance by.
     * @return bool
     */
    function increaseAllowance(address spender, uint256 addedValue)
        external
        initialDistributionLock
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][
            spender
        ].add(addedValue);
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    /**
     * @dev Approves spender address to use sender tokens.
     * @param spender Spender address.
     * @param value Amount of tokens spender can access.
     * @return bool
     */
    function approve(address spender, uint256 value)
        external
        override
        initialDistributionLock
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Checks if given address is exempt from swap fees.
     * @param _addr Address to check current exemption status.
     * @return bool
     */
    function checkFeeExempt(address _addr) external view returns (bool) {
        return _isFeeExempt[_addr];
    }

    /**
     * @dev Unlocks tokens and sets initialDistributedFinished
     * to true. Only callable from owner address.
     */
    function setInitialDistributionFinished() external onlyOwner {
        initialDistributionFinished = true;
    }

    /**
     * @dev Enables transfers for a specific address.
     * Only callable from owner address.
     * @param _addr Address to enable transfers.
     */
    function enableTransfer(address _addr) external onlyOwner {
        _allowTransfer[_addr] = true;
    }

    /**
     * @dev Sets given address to have exceptions from
     * swap fees. Only callable from owner address.
     * @param _addr Address to set fee exemptions.
     */
    function setFeeExempt(address _addr) external onlyOwner {
        _isFeeExempt[_addr] = true;
    }

    /**
     * @dev Checks if a sender (from) and receiver
     * (to) need swap fees applied in transfer. Used
     * in _transferFrom(address, address, uint256) internal
     * function. Should only apply when user is interacting with
     * the pair (to or from)
     * @param from Sender address of swap
     * @param to Receiver address of swap.
     * @return bool True if fees apply on transfer.
     */
    function _shouldTakeFee(address from, address to)
        internal
        view
        returns (bool)
    {
        return
            (taxableAddress[from] || taxableAddress[to]) &&
            (!_isFeeExempt[from] && !_isFeeExempt[to]);
    }

    /**
     * @dev Updates swap back settings.
     * @param _enabled bool value to determine of swap back is enabled.
     * @param _num uint256 value for the swap back threshhold
     * @param _denom uint256 value used for the threshold deminator
     */
    function setSwapBackSettings(
        bool _enabled,
        uint256 _num,
        uint256 _denom
    ) external onlyOwner {
        swapEnabled = _enabled;
        gonSwapThreshold = TOTAL_GONS.div(_denom).mul(_num);
    }

    /**
     * @dev Updates RX3 Rebase settings.
     * @param _enabled bool value to determine of RX3 Protocol is enabled.
     * @param _rebaseMaxRX3Multiplier uint256 value for the max RX3 Multiplier
     * @param _rebaseRX3MultiplierStep uint256 value used for the RX3 Multiplier Step
     */
    function setRX3Settings(
        bool _enabled,
        uint256 _rebaseMaxRX3Multiplier,
        uint256 _rebaseRX3MultiplierStep
    ) external onlyOwner {
        rebaseRX3Enabled = _enabled;
        rebaseMaxRX3Multiplier = _rebaseMaxRX3Multiplier;
        rebaseRX3MultiplierStep = _rebaseRX3MultiplierStep;
    }

    /**
     * @dev Configures Rebase settings. Sets
     * RebasePercentDelta, and Accuracy.
     * @param _percentage value of rebase percent delta based on a daily interval (18)
     * @param _accuracy defines the value of the rebase delta percentage demoninator (1000)
     */
    function setRebaseSettings(uint256 _percentage, uint256 _accuracy)
        external
        onlyOwner
    {
        rebasePercentDelta = (_percentage * FXP_BASE) / _accuracy;
    }

    /**
     * @dev Check whether the a swap back can be performed.
     * @return bool, true if swapBack is allowed to execute.
     */
    function _shouldSwapBack() internal view returns (bool) {
        return
            taxableAddress[msg.sender] == false &&
            !inSwap &&
            swapEnabled &&
            _gonBalances[address(this)] >= gonSwapThreshold;
    }

    /**
     * @dev Returns current circulating token supply
     * @return uint256, value of total circulating supply.
     */
    function getCirculatingSupply() public view returns (uint256) {
        return
            (TOTAL_GONS.sub(_gonBalances[DEAD]).sub(_gonBalances[ZERO])).div(
                _gonsPerFragment
            );
    }

    function isNotInSwap() external view returns (bool) {
        return !inSwap;
    }

    function checkSwapThreshold() external view returns (uint256) {
        return gonSwapThreshold.div(_gonsPerFragment);
    }

    function setFeeReceivers(
        address _liquidityReceiver,
        address _phenixFundReserveReceiver
    ) external onlyOwner {
        liquidityReceiver = _liquidityReceiver;
        phenixFundReserveReceiver = _phenixFundReserveReceiver;
    }

    function setFees(
        uint256 _liquidityFee,
        uint256 _phenixVaultFee,
        uint256 _sellFee,
        uint256 _feeDenominator
    ) external onlyOwner {
        liquidityFee = _liquidityFee;
        phenixVaultFee = _phenixVaultFee;
        sellFee = _sellFee;
        totalFee = liquidityFee.add(phenixVaultFee);
        feeDenominator = _feeDenominator;
        require(totalFee < feeDenominator / 4);
    }

    function emergencyRecoverETH() external onlyOwner {
        require(address(this).balance > 0, "No ETH to recover.");
        (bool success, ) = address(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Failed to recover ETH.");
    }

    function emergencyRecoverToken(address _tokenAddress) external onlyOwner {
        require(
            IERC20(_tokenAddress).balanceOf(address(this)) > 0,
            "No tokens to recover."
        );
        IERC20(_tokenAddress).transfer(
            msg.sender,
            IERC20(_tokenAddress).balanceOf(address(this))
        );
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"Rebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addLPAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedRebaseAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyRecoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"emergencyRecoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"enableTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialDistributionFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isNotInSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityReceiver","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phenixFundReserveReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phenixVaultFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseAndSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseMaxRX3Multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebasePercentDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3Multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3MultiplierStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetLastRebaseTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IVVSRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAuthorizedRebaseAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityReceiver","type":"address"},{"internalType":"address","name":"_phenixFundReserveReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_phenixVaultFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setInitialDistributionFinished","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_rebaseMaxRX3Multiplier","type":"uint256"},{"internalType":"uint256","name":"_rebaseRX3MultiplierStep","type":"uint256"}],"name":"setRX3Settings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"},{"internalType":"uint256","name":"_accuracy","type":"uint256"}],"name":"setRebaseSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_denom","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setTaxableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxableAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600260085560086009556005600a5562000031600954600854620008fb60201b620034321790919060201c565b600b556064600c5542600d556000600e556103e8620f4240601202816200005457fe5b04600f556001601060006101000a81548160ff021916908315150217905550620f42406011556002620f4240816200008857fe5b04620f4240016012556103e8620f424060010281620000a357fe5b0460135560016014806101000a81548160ff021916908315150217905550612710600a6012600a0a629896800260001981620000db57fe5b06600019030281620000e957fe5b04601555348015620000fa57600080fd5b506040518060400160405280600e81526020017f5068656e69782046696e616e63650000000000000000000000000000000000008152506040518060400160405280600481526020017f50484e5800000000000000000000000000000000000000000000000000000000815250601282600090805190602001906200018192919062000aa1565b5081600190805190602001906200019a92919062000aa1565b5080600260006101000a81548160ff021916908360ff16021790555050505033600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507351aba405de2b25e5506dea32a6697f450ceb1a17601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620002ba57600080fd5b505afa158015620002cf573d6000803e3d6000fd5b505050506040513d6020811015620002e657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663c9c65396601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200037b57600080fd5b505afa15801562000390573d6000803e3d6000fd5b505050506040513d6020811015620003a757600080fd5b8101908080519060200190929190505050306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156200042357600080fd5b505af115801562000438573d6000803e3d6000fd5b505050506040513d60208110156200044f57600080fd5b8101908080519060200190929190505050905033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506012600a0a62989680026017819055506012600a0a629896800260001981620005cc57fe5b0660001903601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620006496017546012600a0a6298968002600019816200063057fe5b06600019036200098460201b620034ba1790919060201c565b601881905550600160076000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6017546040518082815260200191505060405180910390a35062000b57565b6000808284019050838110156200097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000620009ce83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620009d660201b60201c565b905092915050565b6000808311829062000a86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000a4a57808201518184015260208101905062000a2d565b50505050905090810190601f16801562000a785780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858162000a9357fe5b049050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000ad9576000855562000b25565b82601f1062000af457805160ff191683800117855562000b25565b8280016001018555821562000b25579182015b8281111562000b2457825182559160200191906001019062000b07565b5b50905062000b34919062000b38565b5090565b5b8082111562000b5357600081600090555060010162000b39565b5090565b6147588062000b676000396000f3fe60806040526004361061037a5760003560e01c8063784d20b1116101d1578063b065406911610102578063d1fce264116100a0578063dd62ed3e1161006f578063dd62ed3e146111ef578063f2fde38b14611274578063f887ea40146112c5578063fff434811461130657610381565b8063d1fce264146110a3578063d4399790146110d0578063d5938aac14611137578063d780d4dc1461118857610381565b8063bdb938e2116100dc578063bdb938e214610f77578063c851cc3214610fd4578063c939a4f614611025578063d08893581461105257610381565b8063b065406914610ed2578063b86a2fd714610efd578063bd94c8dd14610f2857610381565b806399e3b3bd1161016f578063a8688e2a11610149578063a8688e2a14610dba578063a9059cbb14610e0b578063a92558d014610e7c578063ab92c3f214610ea757610381565b806399e3b3bd14610c97578063a457c2d714610cd8578063a4b45c0014610d4957610381565b80638da5cb5b116101ab5780638da5cb5b14610b6e5780638f32d59b14610baf57806395d89b4114610bdc57806398118cb414610c6c57610381565b8063784d20b114610a9557806383b4ac6814610afc57806389e9616e14610b2957610381565b80632d517fdc116102ab578063530ddf64116102495780636fcba377116102235780636fcba3771461096f57806370a08231146109c8578063715018a614610a2d578063749796a514610a4457610381565b8063530ddf64146109005780636d351d1a146109175780636ddd17131461094257610381565b8063395093511161028557806339509351146107e15780634513e7d0146108525780634bfed05c146108695780634c50855d1461089457610381565b80632d517fdc14610737578063313ce567146107625780633751ed741461079057610381565b806323b872dd116103185780632b112e49116102f25780632b112e491461069f5780632b14ca56146106ca5780632b28af1b146106f55780632be6937d1461072057610381565b806323b872dd14610570578063264d26dd146106015780632abf77f51461064257610381565b8063180b0d7e11610354578063180b0d7e146104d857806318160ddd14610503578063186e2d771461052e5780631df4ccfc1461054557610381565b806306fdde031461038657806307f594a314610416578063095ea7b31461046757610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b61136b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103db5780820151818401526020810190506103c0565b50505050905090810190601f1680156104085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042257600080fd5b506104656004803603602081101561043957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061140d565b005b34801561047357600080fd5b506104c06004803603604081101561048a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611686565b60405180821515815260200191505060405180910390f35b3480156104e457600080fd5b506104ed611840565b6040518082815260200191505060405180910390f35b34801561050f57600080fd5b50610518611846565b6040518082815260200191505060405180910390f35b34801561053a57600080fd5b50610543611850565b005b34801561055157600080fd5b5061055a6119b6565b6040518082815260200191505060405180910390f35b34801561057c57600080fd5b506105e96004803603606081101561059357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119bc565b60405180821515815260200191505060405180910390f35b34801561060d57600080fd5b50610616611bfb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561064e57600080fd5b5061069d6004803603604081101561066557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611c21565b005b3480156106ab57600080fd5b506106b4611c8d565b6040518082815260200191505060405180910390f35b3480156106d657600080fd5b506106df611d65565b6040518082815260200191505060405180910390f35b34801561070157600080fd5b5061070a611d6b565b6040518082815260200191505060405180910390f35b34801561072c57600080fd5b50610735611d71565b005b34801561074357600080fd5b5061074c611d9f565b6040518082815260200191505060405180910390f35b34801561076e57600080fd5b50610777611da5565b604051808260ff16815260200191505060405180910390f35b34801561079c57600080fd5b506107df600480360360608110156107b357600080fd5b810190808035151590602001909291908035906020019092919080359060200190929190505050611dbc565b005b3480156107ed57600080fd5b5061083a6004803603604081101561080457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dfa565b60405180821515815260200191505060405180910390f35b34801561085e57600080fd5b506108676120be565b005b34801561087557600080fd5b5061087e612170565b6040518082815260200191505060405180910390f35b3480156108a057600080fd5b506108a9612176565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108ec5780820151818401526020810190506108d1565b505050509050019250505060405180910390f35b34801561090c57600080fd5b50610915612204565b005b34801561092357600080fd5b5061092c61241a565b6040518082815260200191505060405180910390f35b34801561094e57600080fd5b50610957612438565b60405180821515815260200191505060405180910390f35b34801561097b57600080fd5b506109c66004803603608081101561099257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612449565b005b3480156109d457600080fd5b50610a17600480360360208110156109eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124b3565b6040518082815260200191505060405180910390f35b348015610a3957600080fd5b50610a42612510565b005b348015610a5057600080fd5b50610a9360048036036020811015610a6757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125ca565b005b348015610aa157600080fd5b50610ae460048036036020811015610ab857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612636565b60405180821515815260200191505060405180910390f35b348015610b0857600080fd5b50610b11612656565b60405180821515815260200191505060405180910390f35b348015610b3557600080fd5b50610b6c60048036036040811015610b4c57600080fd5b81019080803590602001909291908035906020019092919050505061266e565b005b348015610b7a57600080fd5b50610b83612698565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bbb57600080fd5b50610bc46126c2565b60405180821515815260200191505060405180910390f35b348015610be857600080fd5b50610bf161271a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c31578082015181840152602081019050610c16565b50505050905090810190601f168015610c5e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c7857600080fd5b50610c816127bc565b6040518082815260200191505060405180910390f35b348015610ca357600080fd5b50610cac6127c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ce457600080fd5b50610d3160048036036040811015610cfb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127e8565b60405180821515815260200191505060405180910390f35b348015610d5557600080fd5b50610db860048036036040811015610d6c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b41565b005b348015610dc657600080fd5b50610e0960048036036020811015610ddd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bd8565b005b348015610e1757600080fd5b50610e6460048036036040811015610e2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dfe565b60405180821515815260200191505060405180910390f35b348015610e8857600080fd5b50610e91612f1a565b6040518082815260200191505060405180910390f35b348015610eb357600080fd5b50610ebc612f20565b6040518082815260200191505060405180910390f35b348015610ede57600080fd5b50610ee7612f26565b6040518082815260200191505060405180910390f35b348015610f0957600080fd5b50610f12612f2c565b6040518082815260200191505060405180910390f35b348015610f3457600080fd5b50610f6160048036036020811015610f4b57600080fd5b8101908080359060200190929190505050612f32565b6040518082815260200191505060405180910390f35b348015610f8357600080fd5b50610fd260048036036040811015610f9a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061302a565b005b348015610fe057600080fd5b5061102360048036036020811015610ff757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613096565b005b34801561103157600080fd5b5061103a6131af565b60405180821515815260200191505060405180910390f35b34801561105e57600080fd5b506110a16004803603606081101561107557600080fd5b8101908080351515906020019092919080359060200190929190803590602001909291905050506131c2565b005b3480156110af57600080fd5b506110b8613234565b60405180821515815260200191505060405180910390f35b3480156110dc57600080fd5b5061111f600480360360208110156110f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613247565b60405180821515815260200191505060405180910390f35b34801561114357600080fd5b506111866004803603602081101561115a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329d565b005b34801561119457600080fd5b506111d7600480360360208110156111ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613309565b60405180821515815260200191505060405180910390f35b3480156111fb57600080fd5b5061125e6004803603604081101561121257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613329565b6040518082815260200191505060405180910390f35b34801561128057600080fd5b506112c36004803603602081101561129757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133b0565b005b3480156112d157600080fd5b506112da6133cd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561131257600080fd5b5061133f6004803603602081101561132957600080fd5b81019080803590602001909291905050506133f3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114035780601f106113d857610100808354040283529160200191611403565b820191906000526020600020905b8154815290600101906020018083116113e657829003601f168201915b5050505050905090565b6114156126c2565b61141e57600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561148757600080fd5b505afa15801561149b573d6000803e3d6000fd5b505050506040513d60208110156114b157600080fd5b810190808051906020019092919050505011611535576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20746f6b656e7320746f207265636f7665722e000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156115b957600080fd5b505afa1580156115cd573d6000803e3d6000fd5b505050506040513d60208110156115e357600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506040513d602081101561167157600080fd5b81019080805190602001909291905050505050565b6000600560149054906101000a900460ff16806116a757506116a66126c2565b5b806116fb5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b81601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600c5481565b6000601754905090565b6118586126c2565b61186157600080fd5b600047116118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f2045544820746f207265636f7665722e000000000000000000000000000081525060200191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114611937576040519150601f19603f3d011682016040523d82523d6000602084013e61193c565b606091505b50509050806119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4661696c656420746f207265636f766572204554482e0000000000000000000081525060200191505060405180910390fd5b50565b600b5481565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611be357611b62836040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135049092919063ffffffff16565b601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b611bee8585856135c4565b5060019150509392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c296126c2565b611c3257600080fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000611d60601854611d52601960008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d446019600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546012600a0a629896800260001981611d3157fe5b066000190361382b90919063ffffffff16565b61382b90919063ffffffff16565b6134ba90919063ffffffff16565b905090565b600a5481565b600e5481565b611d796126c2565b611d8257600080fd5b6001600560146101000a81548160ff021916908315150217905550565b60115481565b6000600260009054906101000a900460ff16905090565b611dc46126c2565b611dcd57600080fd5b82601060006101000a81548160ff0219169083151502179055508160128190555080601381905550505050565b6000600560149054906101000a900460ff1680611e1b5750611e1a6126c2565b5b80611e6f5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611ec4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b611f5382601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60011515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612167576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806146fb6028913960400191505060405180910390fd5b42600d81905550565b600f5481565b606060038054806020026020016040519081016040528092919081815260200182805480156121fa57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116121b0575b5050505050905090565b60011515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f742061757468726f697a656420746f20657865637574652072656261736581525060200191505060405180910390fd5b6122d2613875565b60005b6003805490508110156124175760011515601b6000600384815481106122f757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561240a576003818154811061237f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156123f157600080fd5b505af1158015612405573d6000803e3d6000fd5b505050505b80806001019150506122d5565b50565b60006124336018546015546134ba90919063ffffffff16565b905090565b60148054906101000a900460ff1681565b6124516126c2565b61245a57600080fd5b836008819055508260098190555081600a8190555061248660095460085461343290919063ffffffff16565b600b8190555080600c819055506004600c548161249f57fe5b04600b54106124ad57600080fd5b50505050565b6000612509601854601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134ba90919063ffffffff16565b9050919050565b6125186126c2565b61252157600080fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6125d26126c2565b6125db57600080fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601c6020528060005260406000206000915054906101000a900460ff1681565b6000601660009054906101000a900460ff1615905090565b6126766126c2565b61267f57600080fd5b80620f424083028161268d57fe5b04600f819055505050565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127b25780601f10612787576101008083540402835291602001916127b2565b820191906000526020600020905b81548152906001019060200180831161279557829003601f168201915b5050505050905090565b60085481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560149054906101000a900460ff168061280957506128086126c2565b5b8061285d5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b6000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083106129c1576000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a55565b6129d4838261382b90919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b612b496126c2565b612b5257600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b612be06126c2565b612be957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c3157600080fd5b505af1158015612c45573d6000803e3d6000fd5b5050505060005b600380549050811015612d3f578173ffffffffffffffffffffffffffffffffffffffff1660038281548110612c7d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f50616972206164647265737320616c726561647920616464656400000000000081525060200191505060405180910390fd5b8080600101915050612c4c565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e3b57600080fd5b600560149054906101000a900460ff1680612e5a5750612e596126c2565b5b80612eae5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612f03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b612f0e3385856135c4565b50600191505092915050565b60135481565b60125481565b60095481565b600d5481565b600080600d54830390506000612f6962015180612f5b620f42408561395490919063ffffffff16565b6134ba90919063ffffffff16565b90506000612fc0620f4240612fb284612fa4620f4240612f96600f5460175461395490919063ffffffff16565b6134ba90919063ffffffff16565b61395490919063ffffffff16565b6134ba90919063ffffffff16565b905060011515601060009054906101000a900460ff161515141561301f5761301c620f424061300e60125460115410612ffb57601254612fff565b6011545b8461395490919063ffffffff16565b6134ba90919063ffffffff16565b90505b809350505050919050565b6130326126c2565b61303b57600080fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61309e6126c2565b6130a757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561316b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f526f75746572206164647265737320616c72656164792073657400000000000081525060200191505060405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900460ff1681565b6131ca6126c2565b6131d357600080fd5b826014806101000a81548160ff0219169083151502179055506132298261321b836012600a0a62989680026000198161320857fe5b06600019036134ba90919063ffffffff16565b61395490919063ffffffff16565b601581905550505050565b600560149054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6132a56126c2565b6132ae57600080fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601b6020528060005260406000206000915054906101000a900460ff1681565b6000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6133b86126c2565b6133c157600080fd5b6133ca816139da565b50565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6003818154811061340357600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808284019050838110156134b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006134fc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ad4565b905092915050565b60008383111582906135b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561357657808201518184015260208101905061355b565b50505050905090810190601f1680156135a35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000601660009054906101000a900460ff16156135ed576135e6848484613b9a565b9050613824565b60006136046018548461395490919063ffffffff16565b905061360e613cea565b1561361c5761361b613dc0565b5b60011515601060009054906101000a900460ff16151514156136565761364f60135460115461343290919063ffffffff16565b6011819055505b6136a881601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461382b90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006136f7868661438f565b613701578161370d565b61370c8686846144e6565b5b905061376181601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef613808601854856134ba90919063ffffffff16565b6040518082815260200191505060405180910390a36001925050505b9392505050565b600061386d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613504565b905092915050565b600061388042612f32565b90506138978160175461343290919063ffffffff16565b6017819055506000196fffffffffffffffffffffffffffffffff1660175411156138d7576000196fffffffffffffffffffffffffffffffff166017819055505b6139046017546012600a0a6298968002600019816138f157fe5b06600019036134ba90919063ffffffff16565b60188190555080600e8190555042600d81905550620f42406011819055506017547fafae32ce2847c13a56ab802c034c27d3c19f1d61be48c424c5df134145cd44d060405160405180910390a250565b60008083141561396757600090506139d4565b600082840290508284828161397857fe5b04146139cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146b76021913960400191505060405180910390fd5b809150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a1457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290613b80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b45578082015181840152602081019050613b2a565b50505050905090810190601f168015613b725780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8c57fe5b049050809150509392505050565b600080613bb26018548461395490919063ffffffff16565b9050613c0681601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461382b90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c9b81601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019150509392505050565b6000801515601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015613d585750601660009054906101000a900460ff16155b8015613d6e575060148054906101000a900460ff165b8015613dbb5750601554601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b905090565b6001601660006101000a81548160ff0219169083151502179055506000613e31601854601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134ba90919063ffffffff16565b90506000613e716002613e63600b54613e556008548761395490919063ffffffff16565b6134ba90919063ffffffff16565b6134ba90919063ffffffff16565b90506000613e88828461382b90919063ffffffff16565b90506000600267ffffffffffffffff81118015613ea457600080fd5b50604051908082528060200260200182016040528015613ed35781602001602082028036833780820191505090505b5090503081600081518110613ee457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8657600080fd5b505afa158015613f9a573d6000803e3d6000fd5b505050506040513d6020811015613fb057600080fd5b810190808051906020019092919050505081600181518110613fce57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156140d15780820151818401526020810190506140b6565b505050509050019650505050505050600060405180830381600087803b1580156140fa57600080fd5b505af115801561410e573d6000803e3d6000fd5b505050506000614127824761382b90919063ffffffff16565b9050600061415561414460026008546134ba90919063ffffffff16565b600b5461382b90919063ffffffff16565b905060006141936002614185846141776008548861395490919063ffffffff16565b6134ba90919063ffffffff16565b6134ba90919063ffffffff16565b905060008711156142de57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308a600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b15801561428a57600080fd5b505af115801561429e573d6000803e3d6000fd5b50505050506040513d60608110156142b557600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114614360576040519150601f19603f3d011682016040523d82523d6000602084013e614365565b606091505b505090505050505050505050506000601660006101000a81548160ff021916908315150217905550565b6000601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806144325750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156144de5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156144dd5750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b905092915050565b600080600b54905060011515601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561455f5761455c600a548261343290919063ffffffff16565b90505b6000614588600c5461457a848761395490919063ffffffff16565b6134ba90919063ffffffff16565b90506145dc81601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614683601854856134ba90919063ffffffff16565b6040518082815260200191505060405180910390a36146ab818561382b90919063ffffffff16565b92505050939250505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e697469616c20646973746972627574696f6e206e6f742066696e616c697a65642e4e6f742061757468726f697a656420746f206578656375746520746869732066756e6374696f6e2ea26469706673582212207c8f192275475dd6f94c61eea96b5ac365473a4643a1c9b7ab3df7768fe6e43064736f6c63430007060033

Deployed Bytecode

0x60806040526004361061037a5760003560e01c8063784d20b1116101d1578063b065406911610102578063d1fce264116100a0578063dd62ed3e1161006f578063dd62ed3e146111ef578063f2fde38b14611274578063f887ea40146112c5578063fff434811461130657610381565b8063d1fce264146110a3578063d4399790146110d0578063d5938aac14611137578063d780d4dc1461118857610381565b8063bdb938e2116100dc578063bdb938e214610f77578063c851cc3214610fd4578063c939a4f614611025578063d08893581461105257610381565b8063b065406914610ed2578063b86a2fd714610efd578063bd94c8dd14610f2857610381565b806399e3b3bd1161016f578063a8688e2a11610149578063a8688e2a14610dba578063a9059cbb14610e0b578063a92558d014610e7c578063ab92c3f214610ea757610381565b806399e3b3bd14610c97578063a457c2d714610cd8578063a4b45c0014610d4957610381565b80638da5cb5b116101ab5780638da5cb5b14610b6e5780638f32d59b14610baf57806395d89b4114610bdc57806398118cb414610c6c57610381565b8063784d20b114610a9557806383b4ac6814610afc57806389e9616e14610b2957610381565b80632d517fdc116102ab578063530ddf64116102495780636fcba377116102235780636fcba3771461096f57806370a08231146109c8578063715018a614610a2d578063749796a514610a4457610381565b8063530ddf64146109005780636d351d1a146109175780636ddd17131461094257610381565b8063395093511161028557806339509351146107e15780634513e7d0146108525780634bfed05c146108695780634c50855d1461089457610381565b80632d517fdc14610737578063313ce567146107625780633751ed741461079057610381565b806323b872dd116103185780632b112e49116102f25780632b112e491461069f5780632b14ca56146106ca5780632b28af1b146106f55780632be6937d1461072057610381565b806323b872dd14610570578063264d26dd146106015780632abf77f51461064257610381565b8063180b0d7e11610354578063180b0d7e146104d857806318160ddd14610503578063186e2d771461052e5780631df4ccfc1461054557610381565b806306fdde031461038657806307f594a314610416578063095ea7b31461046757610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b61136b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103db5780820151818401526020810190506103c0565b50505050905090810190601f1680156104085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042257600080fd5b506104656004803603602081101561043957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061140d565b005b34801561047357600080fd5b506104c06004803603604081101561048a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611686565b60405180821515815260200191505060405180910390f35b3480156104e457600080fd5b506104ed611840565b6040518082815260200191505060405180910390f35b34801561050f57600080fd5b50610518611846565b6040518082815260200191505060405180910390f35b34801561053a57600080fd5b50610543611850565b005b34801561055157600080fd5b5061055a6119b6565b6040518082815260200191505060405180910390f35b34801561057c57600080fd5b506105e96004803603606081101561059357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119bc565b60405180821515815260200191505060405180910390f35b34801561060d57600080fd5b50610616611bfb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561064e57600080fd5b5061069d6004803603604081101561066557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611c21565b005b3480156106ab57600080fd5b506106b4611c8d565b6040518082815260200191505060405180910390f35b3480156106d657600080fd5b506106df611d65565b6040518082815260200191505060405180910390f35b34801561070157600080fd5b5061070a611d6b565b6040518082815260200191505060405180910390f35b34801561072c57600080fd5b50610735611d71565b005b34801561074357600080fd5b5061074c611d9f565b6040518082815260200191505060405180910390f35b34801561076e57600080fd5b50610777611da5565b604051808260ff16815260200191505060405180910390f35b34801561079c57600080fd5b506107df600480360360608110156107b357600080fd5b810190808035151590602001909291908035906020019092919080359060200190929190505050611dbc565b005b3480156107ed57600080fd5b5061083a6004803603604081101561080457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dfa565b60405180821515815260200191505060405180910390f35b34801561085e57600080fd5b506108676120be565b005b34801561087557600080fd5b5061087e612170565b6040518082815260200191505060405180910390f35b3480156108a057600080fd5b506108a9612176565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108ec5780820151818401526020810190506108d1565b505050509050019250505060405180910390f35b34801561090c57600080fd5b50610915612204565b005b34801561092357600080fd5b5061092c61241a565b6040518082815260200191505060405180910390f35b34801561094e57600080fd5b50610957612438565b60405180821515815260200191505060405180910390f35b34801561097b57600080fd5b506109c66004803603608081101561099257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612449565b005b3480156109d457600080fd5b50610a17600480360360208110156109eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124b3565b6040518082815260200191505060405180910390f35b348015610a3957600080fd5b50610a42612510565b005b348015610a5057600080fd5b50610a9360048036036020811015610a6757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125ca565b005b348015610aa157600080fd5b50610ae460048036036020811015610ab857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612636565b60405180821515815260200191505060405180910390f35b348015610b0857600080fd5b50610b11612656565b60405180821515815260200191505060405180910390f35b348015610b3557600080fd5b50610b6c60048036036040811015610b4c57600080fd5b81019080803590602001909291908035906020019092919050505061266e565b005b348015610b7a57600080fd5b50610b83612698565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bbb57600080fd5b50610bc46126c2565b60405180821515815260200191505060405180910390f35b348015610be857600080fd5b50610bf161271a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c31578082015181840152602081019050610c16565b50505050905090810190601f168015610c5e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c7857600080fd5b50610c816127bc565b6040518082815260200191505060405180910390f35b348015610ca357600080fd5b50610cac6127c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ce457600080fd5b50610d3160048036036040811015610cfb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127e8565b60405180821515815260200191505060405180910390f35b348015610d5557600080fd5b50610db860048036036040811015610d6c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b41565b005b348015610dc657600080fd5b50610e0960048036036020811015610ddd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bd8565b005b348015610e1757600080fd5b50610e6460048036036040811015610e2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dfe565b60405180821515815260200191505060405180910390f35b348015610e8857600080fd5b50610e91612f1a565b6040518082815260200191505060405180910390f35b348015610eb357600080fd5b50610ebc612f20565b6040518082815260200191505060405180910390f35b348015610ede57600080fd5b50610ee7612f26565b6040518082815260200191505060405180910390f35b348015610f0957600080fd5b50610f12612f2c565b6040518082815260200191505060405180910390f35b348015610f3457600080fd5b50610f6160048036036020811015610f4b57600080fd5b8101908080359060200190929190505050612f32565b6040518082815260200191505060405180910390f35b348015610f8357600080fd5b50610fd260048036036040811015610f9a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061302a565b005b348015610fe057600080fd5b5061102360048036036020811015610ff757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613096565b005b34801561103157600080fd5b5061103a6131af565b60405180821515815260200191505060405180910390f35b34801561105e57600080fd5b506110a16004803603606081101561107557600080fd5b8101908080351515906020019092919080359060200190929190803590602001909291905050506131c2565b005b3480156110af57600080fd5b506110b8613234565b60405180821515815260200191505060405180910390f35b3480156110dc57600080fd5b5061111f600480360360208110156110f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613247565b60405180821515815260200191505060405180910390f35b34801561114357600080fd5b506111866004803603602081101561115a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329d565b005b34801561119457600080fd5b506111d7600480360360208110156111ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613309565b60405180821515815260200191505060405180910390f35b3480156111fb57600080fd5b5061125e6004803603604081101561121257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613329565b6040518082815260200191505060405180910390f35b34801561128057600080fd5b506112c36004803603602081101561129757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133b0565b005b3480156112d157600080fd5b506112da6133cd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561131257600080fd5b5061133f6004803603602081101561132957600080fd5b81019080803590602001909291905050506133f3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114035780601f106113d857610100808354040283529160200191611403565b820191906000526020600020905b8154815290600101906020018083116113e657829003601f168201915b5050505050905090565b6114156126c2565b61141e57600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561148757600080fd5b505afa15801561149b573d6000803e3d6000fd5b505050506040513d60208110156114b157600080fd5b810190808051906020019092919050505011611535576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20746f6b656e7320746f207265636f7665722e000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156115b957600080fd5b505afa1580156115cd573d6000803e3d6000fd5b505050506040513d60208110156115e357600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506040513d602081101561167157600080fd5b81019080805190602001909291905050505050565b6000600560149054906101000a900460ff16806116a757506116a66126c2565b5b806116fb5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b81601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600c5481565b6000601754905090565b6118586126c2565b61186157600080fd5b600047116118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f2045544820746f207265636f7665722e000000000000000000000000000081525060200191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114611937576040519150601f19603f3d011682016040523d82523d6000602084013e61193c565b606091505b50509050806119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4661696c656420746f207265636f766572204554482e0000000000000000000081525060200191505060405180910390fd5b50565b600b5481565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611be357611b62836040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135049092919063ffffffff16565b601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b611bee8585856135c4565b5060019150509392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c296126c2565b611c3257600080fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000611d60601854611d52601960008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d446019600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546012600a0a629896800260001981611d3157fe5b066000190361382b90919063ffffffff16565b61382b90919063ffffffff16565b6134ba90919063ffffffff16565b905090565b600a5481565b600e5481565b611d796126c2565b611d8257600080fd5b6001600560146101000a81548160ff021916908315150217905550565b60115481565b6000600260009054906101000a900460ff16905090565b611dc46126c2565b611dcd57600080fd5b82601060006101000a81548160ff0219169083151502179055508160128190555080601381905550505050565b6000600560149054906101000a900460ff1680611e1b5750611e1a6126c2565b5b80611e6f5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611ec4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b611f5382601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60011515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612167576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806146fb6028913960400191505060405180910390fd5b42600d81905550565b600f5481565b606060038054806020026020016040519081016040528092919081815260200182805480156121fa57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116121b0575b5050505050905090565b60011515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f742061757468726f697a656420746f20657865637574652072656261736581525060200191505060405180910390fd5b6122d2613875565b60005b6003805490508110156124175760011515601b6000600384815481106122f757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561240a576003818154811061237f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156123f157600080fd5b505af1158015612405573d6000803e3d6000fd5b505050505b80806001019150506122d5565b50565b60006124336018546015546134ba90919063ffffffff16565b905090565b60148054906101000a900460ff1681565b6124516126c2565b61245a57600080fd5b836008819055508260098190555081600a8190555061248660095460085461343290919063ffffffff16565b600b8190555080600c819055506004600c548161249f57fe5b04600b54106124ad57600080fd5b50505050565b6000612509601854601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134ba90919063ffffffff16565b9050919050565b6125186126c2565b61252157600080fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6125d26126c2565b6125db57600080fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601c6020528060005260406000206000915054906101000a900460ff1681565b6000601660009054906101000a900460ff1615905090565b6126766126c2565b61267f57600080fd5b80620f424083028161268d57fe5b04600f819055505050565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127b25780601f10612787576101008083540402835291602001916127b2565b820191906000526020600020905b81548152906001019060200180831161279557829003601f168201915b5050505050905090565b60085481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560149054906101000a900460ff168061280957506128086126c2565b5b8061285d5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b6000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083106129c1576000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a55565b6129d4838261382b90919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b612b496126c2565b612b5257600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b612be06126c2565b612be957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c3157600080fd5b505af1158015612c45573d6000803e3d6000fd5b5050505060005b600380549050811015612d3f578173ffffffffffffffffffffffffffffffffffffffff1660038281548110612c7d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f50616972206164647265737320616c726561647920616464656400000000000081525060200191505060405180910390fd5b8080600101915050612c4c565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e3b57600080fd5b600560149054906101000a900460ff1680612e5a5750612e596126c2565b5b80612eae5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612f03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b612f0e3385856135c4565b50600191505092915050565b60135481565b60125481565b60095481565b600d5481565b600080600d54830390506000612f6962015180612f5b620f42408561395490919063ffffffff16565b6134ba90919063ffffffff16565b90506000612fc0620f4240612fb284612fa4620f4240612f96600f5460175461395490919063ffffffff16565b6134ba90919063ffffffff16565b61395490919063ffffffff16565b6134ba90919063ffffffff16565b905060011515601060009054906101000a900460ff161515141561301f5761301c620f424061300e60125460115410612ffb57601254612fff565b6011545b8461395490919063ffffffff16565b6134ba90919063ffffffff16565b90505b809350505050919050565b6130326126c2565b61303b57600080fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61309e6126c2565b6130a757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561316b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f526f75746572206164647265737320616c72656164792073657400000000000081525060200191505060405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900460ff1681565b6131ca6126c2565b6131d357600080fd5b826014806101000a81548160ff0219169083151502179055506132298261321b836012600a0a62989680026000198161320857fe5b06600019036134ba90919063ffffffff16565b61395490919063ffffffff16565b601581905550505050565b600560149054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6132a56126c2565b6132ae57600080fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601b6020528060005260406000206000915054906101000a900460ff1681565b6000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6133b86126c2565b6133c157600080fd5b6133ca816139da565b50565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6003818154811061340357600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808284019050838110156134b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006134fc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ad4565b905092915050565b60008383111582906135b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561357657808201518184015260208101905061355b565b50505050905090810190601f1680156135a35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000601660009054906101000a900460ff16156135ed576135e6848484613b9a565b9050613824565b60006136046018548461395490919063ffffffff16565b905061360e613cea565b1561361c5761361b613dc0565b5b60011515601060009054906101000a900460ff16151514156136565761364f60135460115461343290919063ffffffff16565b6011819055505b6136a881601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461382b90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006136f7868661438f565b613701578161370d565b61370c8686846144e6565b5b905061376181601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef613808601854856134ba90919063ffffffff16565b6040518082815260200191505060405180910390a36001925050505b9392505050565b600061386d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613504565b905092915050565b600061388042612f32565b90506138978160175461343290919063ffffffff16565b6017819055506000196fffffffffffffffffffffffffffffffff1660175411156138d7576000196fffffffffffffffffffffffffffffffff166017819055505b6139046017546012600a0a6298968002600019816138f157fe5b06600019036134ba90919063ffffffff16565b60188190555080600e8190555042600d81905550620f42406011819055506017547fafae32ce2847c13a56ab802c034c27d3c19f1d61be48c424c5df134145cd44d060405160405180910390a250565b60008083141561396757600090506139d4565b600082840290508284828161397857fe5b04146139cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146b76021913960400191505060405180910390fd5b809150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a1457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290613b80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b45578082015181840152602081019050613b2a565b50505050905090810190601f168015613b725780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8c57fe5b049050809150509392505050565b600080613bb26018548461395490919063ffffffff16565b9050613c0681601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461382b90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c9b81601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019150509392505050565b6000801515601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015613d585750601660009054906101000a900460ff16155b8015613d6e575060148054906101000a900460ff165b8015613dbb5750601554601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b905090565b6001601660006101000a81548160ff0219169083151502179055506000613e31601854601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134ba90919063ffffffff16565b90506000613e716002613e63600b54613e556008548761395490919063ffffffff16565b6134ba90919063ffffffff16565b6134ba90919063ffffffff16565b90506000613e88828461382b90919063ffffffff16565b90506000600267ffffffffffffffff81118015613ea457600080fd5b50604051908082528060200260200182016040528015613ed35781602001602082028036833780820191505090505b5090503081600081518110613ee457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8657600080fd5b505afa158015613f9a573d6000803e3d6000fd5b505050506040513d6020811015613fb057600080fd5b810190808051906020019092919050505081600181518110613fce57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156140d15780820151818401526020810190506140b6565b505050509050019650505050505050600060405180830381600087803b1580156140fa57600080fd5b505af115801561410e573d6000803e3d6000fd5b505050506000614127824761382b90919063ffffffff16565b9050600061415561414460026008546134ba90919063ffffffff16565b600b5461382b90919063ffffffff16565b905060006141936002614185846141776008548861395490919063ffffffff16565b6134ba90919063ffffffff16565b6134ba90919063ffffffff16565b905060008711156142de57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308a600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b15801561428a57600080fd5b505af115801561429e573d6000803e3d6000fd5b50505050506040513d60608110156142b557600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114614360576040519150601f19603f3d011682016040523d82523d6000602084013e614365565b606091505b505090505050505050505050506000601660006101000a81548160ff021916908315150217905550565b6000601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806144325750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156144de5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156144dd5750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b905092915050565b600080600b54905060011515601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561455f5761455c600a548261343290919063ffffffff16565b90505b6000614588600c5461457a848761395490919063ffffffff16565b6134ba90919063ffffffff16565b90506145dc81601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614683601854856134ba90919063ffffffff16565b6040518082815260200191505060405180910390a36146ab818561382b90919063ffffffff16565b92505050939250505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e697469616c20646973746972627574696f6e206e6f742066696e616c697a65642e4e6f742061757468726f697a656420746f206578656375746520746869732066756e6374696f6e2ea26469706673582212207c8f192275475dd6f94c61eea96b5ac365473a4643a1c9b7ab3df7768fe6e43064736f6c63430007060033

Deployed Bytecode Sourcemap

11923:23297:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11569:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34829:351;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29146:286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13002:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18494:102;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34531:290;;;;;;;;;;;;;:::i;:::-;;12937:58;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24124:457;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12136:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20530:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33375:215;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12904:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13105:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29860:114;;;;;;;;;;;;;:::i;:::-;;13255:45;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11755:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32035:325;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28502:439;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18106:247;;;;;;;;;;;;;:::i;:::-;;13146:58;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19819:106;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17567:406;;;;;;;;;;;;;:::i;:::-;;33691:126;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13479:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34088:435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21521:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3290:126;;;;;;;;;;;;;:::i;:::-;;30439:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14029:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33598:85;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32655:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3025:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3190:92;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11660:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12826:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12175:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27355:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33825:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19350:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18805:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13377:62;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13307:63;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12864:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13046:52;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15894:869;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20129:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28104:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13213:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31494:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12222:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29606:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30147:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13976:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21054:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3424:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13448:24;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12099:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11569:83;11606:13;11639:5;11632:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11569:83;:::o;34829:351::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34984:1:::1;34942:13;34935:31;;;34975:4;34935:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:50;34913:121;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35052:13;35045:30;;;35090:10;35122:13;35115:31;;;35155:4;35115:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;35045:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;34829:351:::0;:::o;29146:286::-;29282:4;15476:27;;;;;;;;;;;:57;;;;15524:9;:7;:9::i;:::-;15476:57;:104;;;;15554:14;:26;15569:10;15554:26;;;;;;;;;;;;;;;;;;;;;;;;;15476:104;15454:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29345:5:::1;29304:17;:29;29322:10;29304:29;;;;;;;;;;;;;;;:38;29334:7;29304:38;;;;;;;;;;;;;;;:46;;;;29387:7;29366:36;;29375:10;29366:36;;;29396:5;29366:36;;;;;;;;;;;;;;;;;;29420:4;29413:11;;29146:286:::0;;;;:::o;13002:35::-;;;;:::o;18494:102::-;18549:7;18576:12;;18569:19;;18494:102;:::o;34531:290::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34624:1:::1;34600:21;:25;34592:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34660:12;34686:10;34678:24;;34724:21;34678:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34659:101;;;34779:7;34771:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;3173:1;34531:290::o:0;12937:58::-;;;;:::o;24124:457::-;24267:4;24254:2;15740:3;15726:18;;:2;:18;;;;15718:27;;;;;;24335:2:::1;24288:17;:23;24306:4;24288:23;;;;;;;;;;;;;;;:35;24312:10;24288:35;;;;;;;;;;;;;;;;:50;24284:225;;24393:104;24465:5;24393:104;;;;;;;;;;;;;;;;::::0;:17:::1;:23;24411:4;24393:23;;;;;;;;;;;;;;;:67;24435:10;24393:67;;;;;;;;;;;;;;;;:71;;:104;;;;;:::i;:::-;24355:17;:23;24373:4;24355:23;;;;;;;;;;;;;;;:35;24379:10;24355:35;;;;;;;;;;;;;;;:142;;;;24284:225;24521:30;24535:4;24541:2;24545:5;24521:13;:30::i;:::-;;24569:4;24562:11;;24124:457:::0;;;;;;:::o;12136:32::-;;;;;;;;;;;;;:::o;20530:172::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;20687:7:::1;20651:23;:33;20675:8;20651:33;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;20530:172:::0;;:::o;33375:215::-;33428:7;33468:114;33551:16;;33469:58;33508:12;:18;12627:42;33508:18;;;;;;;;;;;;;;;;33469:34;33484:12;:18;12546:42;33484:18;;;;;;;;;;;;;;;;12448:2;12805;:12;12792:10;:25;12505:1;12496:11;13665:38;;;;;;12505:1;12496:11;13650:54;33469:14;;:34;;;;:::i;:::-;:38;;:58;;;;:::i;:::-;33468:64;;:114;;;;:::i;:::-;33448:134;;33375:215;:::o;12904:26::-;;;;:::o;13105:34::-;;;;:::o;29860:114::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;29962:4:::1;29932:27;;:34;;;;;;;;;;;;;;;;;;29860:114::o:0;13255:45::-;;;;:::o;11755:83::-;11796:5;11821:9;;;;;;;;;;;11814:16;;11755:83;:::o;32035:325::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;32224:8:::1;32205:16;;:27;;;;;;;;;;;;;;;;;;32268:23;32243:22;:48;;;;32328:24;32302:23;:50;;;;32035:325:::0;;;:::o;28502:439::-;28635:4;15476:27;;;;;;;;;;;:57;;;;15524:9;:7;:9::i;:::-;15476:57;:104;;;;15554:14;:26;15569:10;15554:26;;;;;;;;;;;;;;;;;;;;;;;;;15476:104;15454:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28698:78:::1;28765:10;28698:17;:29;28716:10;28698:29;;;;;;;;;;;;;;;:62;28742:7;28698:62;;;;;;;;;;;;;;;;:66;;:78;;;;:::i;:::-;28657:17;:29;28675:10;28657:29;;;;;;;;;;;;;;;:38;28687:7;28657:38;;;;;;;;;;;;;;;:119;;;;28840:7;28792:119;;28815:10;28792:119;;;28862:17;:29;28880:10;28862:29;;;;;;;;;;;;;;;:38;28892:7;28862:38;;;;;;;;;;;;;;;;28792:119;;;;;;;;;;;;;;;;;;28929:4;28922:11;;28502:439:::0;;;;:::o;18106:247::-;18223:4;18184:43;;:23;:35;18208:10;18184:35;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;18162:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18330:15;18308:19;:37;;;;18106:247::o;13146:58::-;;;;:::o;19819:106::-;19868:16;19904:13;19897:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19819:106;:::o;17567:406::-;17673:4;17634:43;;:23;:35;17658:10;17634:35;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;17612:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17750:9;:7;:9::i;:::-;17777;17772:194;17796:13;:20;;;;17792:1;:24;17772:194;;;17878:4;17842:40;;:14;:32;17857:13;17871:1;17857:16;;;;;;;;;;;;;;;;;;;;;;;;;17842:32;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;17838:117;;;17915:13;17929:1;17915:16;;;;;;;;;;;;;;;;;;;;;;;;;17903:34;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17838:117;17818:3;;;;;;;17772:194;;;;17567:406::o;33691:126::-;33744:7;33771:38;33792:16;;33771;;:20;;:38;;;;:::i;:::-;33764:45;;33691:126;:::o;13479:30::-;;;;;;;;;;;;:::o;34088:435::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34284:13:::1;34269:12;:28;;;;34325:15;34308:14;:32;;;;34361:8;34351:7;:18;;;;34391:32;34408:14;;34391:12;;:16;;:32;;;;:::i;:::-;34380:8;:43;;;;34451:15;34434:14;:32;;;;34513:1;34496:14;;:18;;;;;;34485:8;;:29;34477:38;;;::::0;::::1;;34088:435:::0;;;;:::o;21521:138::-;21585:7;21612:39;21634:16;;21612:12;:17;21625:3;21612:17;;;;;;;;;;;;;;;;:21;;:39;;;;:::i;:::-;21605:46;;21521:138;;;:::o;3290:126::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;3371:6:::1;;;;;;;;;;;3352:26;;;;;;;;;;;;3406:1;3389:6;;:19;;;;;;;;;;;;;;;;;;3290:126::o:0;30439:101::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;30528:4:::1;30506:12;:19;30519:5;30506:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;30439:101:::0;:::o;14029:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;33598:85::-;33644:4;33669:6;;;;;;;;;;;33668:7;33661:14;;33598:85;:::o;32655:185::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;32823:9:::1;12398:7;32797:11;:22;32796:36;;;;;;32775:18;:57;;;;32655:185:::0;;:::o;3025:79::-;3063:7;3090:6;;;;;;;;;;;3083:13;;3025:79;:::o;3190:92::-;3230:4;3268:6;;;;;;;;;;;3254:20;;:10;:20;;;3247:27;;3190:92;:::o;11660:87::-;11699:13;11732:7;11725:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11660:87;:::o;12826:31::-;;;;:::o;12175:40::-;;;;;;;;;;;;;:::o;27355:629::-;27493:4;15476:27;;;;;;;;;;;:57;;;;15524:9;:7;:9::i;:::-;15476:57;:104;;;;15554:14;:26;15569:10;15554:26;;;;;;;;;;;;;;;;;;;;;;;;;15476:104;15454:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27515:16:::1;27534:17;:29;27552:10;27534:29;;;;;;;;;;;;;;;:38;27564:7;27534:38;;;;;;;;;;;;;;;;27515:57;;27606:8;27587:15;:27;27583:237;;27672:1;27631:17;:29;27649:10;27631:29;;;;;;;;;;;;;;;:38;27661:7;27631:38;;;;;;;;;;;;;;;:42;;;;27583:237;;;27747:61;27778:15;27747:8;:12;;:61;;;;:::i;:::-;27706:17;:29;27724:10;27706:29;;;;;;;;;;;;;;;:38;27736:7;27706:38;;;;;;;;;;;;;;;:102;;;;27583:237;27883:7;27835:119;;27858:10;27835:119;;;27905:17;:29;27923:10;27905:29;;;;;;;;;;;;;;;:38;27935:7;27905:38;;;;;;;;;;;;;;;;27835:119;;;;;;;;;;;;;;;;;;27972:4;27965:11;;;27355:629:::0;;;;:::o;33825:255::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;33989::::1;33969:17;;:38;;;;;;;;;;;;;;;;;;34046:26;34018:25;;:54;;;;;;;;;;;;;;;;;;33825:255:::0;;:::o;19350:346::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;19432:8:::1;19420:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19466:9;19461:145;19485:13;:20;;;;19481:1;:24;19461:145;;;19555:8;19535:28;;:13;19549:1;19535:16;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;19527:67;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;19507:3;;;;;;;19461:145;;;;19618:13;19637:8;19618:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19684:4;19657:14;:24;19672:8;19657:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;19350:346:::0;:::o;18805:248::-;18965:4;18910:2;15740:3;15726:18;;:2;:18;;;;15718:27;;;;;;15476::::1;;;;;;;;;;;:57;;;;15524:9;:7;:9::i;:::-;15476:57;:104;;;;15554:14;:26;15569:10;15554:26;;;;;;;;;;;;;;;;;;;;;;;;;15476:104;15454:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18987:36:::2;19001:10;19013:2;19017:5;18987:13;:36::i;:::-;;19041:4;19034:11;;18805:248:::0;;;;;:::o;13377:62::-;;;;:::o;13307:63::-;;;;:::o;12864:33::-;;;;:::o;13046:52::-;;;;:::o;15894:869::-;15958:7;15978:28;16022:19;;16009:10;:32;15978:63;;16054:42;16099:83;12719:5;16099:48;12398:7;16099:20;:38;;:48;;;;:::i;:::-;:66;;:83;;;;:::i;:::-;16054:128;;16195:23;16221:160;12398:7;16221:132;16318:34;16221:78;12398:7;16221:50;16252:18;;16221:12;;:30;;:50;;;;:::i;:::-;:68;;:78;;;;:::i;:::-;:96;;:132;;;;:::i;:::-;:150;;:160;;;;:::i;:::-;16195:186;;16418:4;16398:24;;:16;;;;;;;;;;;:24;;;16394:327;;;16457:252;12398:7;16457:220;16539:22;;16517:19;;:44;:141;;16636:22;;16517:141;;;16589:19;;16517:141;16457:15;:37;;:220;;;;:::i;:::-;:242;;:252;;;;:::i;:::-;16439:270;;16394:327;16740:15;16733:22;;;;;15894:869;;;:::o;20129:154::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;20268:7:::1;20241:14;:24;20256:8;20241:24;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;20129:154:::0;;:::o;28104:184::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;28201:8:::1;28182:27;;28190:6;;;;;;;;;;;28182:27;;;;28174:66;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28271:8;28251:6;;:29;;;;;;;;;;;;;;;;;;28104:184:::0;:::o;13213:35::-;;;;;;;;;;;;;:::o;31494:230::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;31646:8:::1;31632:11;::::0;:22:::1;;;;;;;;;;;;;;;;;;31684:32;31711:4;31684:22;31699:6;12448:2;12805;:12;12792:10;:25;12505:1;12496:11;13665:38;;;;;;12505:1;12496:11;13650:54;31684:14;;:22;;;;:::i;:::-;:26;;:32;;;;:::i;:::-;31665:16;:51;;;;31494:230:::0;;;:::o;12222:39::-;;;;;;;;;;;;;:::o;29606:113::-;29668:4;29692:12;:19;29705:5;29692:19;;;;;;;;;;;;;;;;;;;;;;;;;29685:26;;29606:113;;;:::o;30147:105::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;30240:4:::1;30216:14;:21;30231:5;30216:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;30147:105:::0;:::o;13976:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;21054:192::-;21173:7;21205:17;:24;21223:5;21205:24;;;;;;;;;;;;;;;:33;21230:7;21205:33;;;;;;;;;;;;;;;;21198:40;;21054:192;;;;:::o;3424:109::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;3497:28:::1;3516:8;3497:18;:28::i;:::-;3424:109:::0;:::o;13448:24::-;;;;;;;;;;;;;:::o;12099:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1337:181::-;1395:7;1415:9;1431:1;1427;:5;1415:17;;1456:1;1451;:6;;1443:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1509:1;1502:8;;;1337:181;;;;:::o;2162:132::-;2220:7;2247:39;2251:1;2254;2247:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2240:46;;2162:132;;;;:::o;1670:226::-;1790:7;1823:1;1818;:6;;1826:12;1810:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1850:9;1866:1;1862;:5;1850:17;;1887:1;1880:8;;;1670:226;;;;;:::o;22768:910::-;22887:4;22908:6;;;;;;;;;;;22904:80;;;22938:34;22953:6;22961:2;22965:6;22938:14;:34::i;:::-;22931:41;;;;22904:80;22996:17;23016:28;23027:16;;23016:6;:10;;:28;;;;:::i;:::-;22996:48;;23061:17;:15;:17::i;:::-;23057:61;;;23095:11;:9;:11::i;:::-;23057:61;23154:4;23134:24;;:16;;;;;;;;;;;:24;;;23130:159;;;23197:80;23239:23;;23197:19;;:23;;:80;;;;:::i;:::-;23175:19;:102;;;;23130:159;23324:35;23349:9;23324:12;:20;23337:6;23324:20;;;;;;;;;;;;;;;;:24;;:35;;;;:::i;:::-;23301:12;:20;23314:6;23301:20;;;;;;;;;;;;;;;:58;;;;23372:25;23400:26;23415:6;23423:2;23400:14;:26::i;:::-;:98;;23489:9;23400:98;;;23442:31;23451:6;23459:2;23463:9;23442:8;:31::i;:::-;23400:98;23372:126;;23528:39;23549:17;23528:12;:16;23541:2;23528:16;;;;;;;;;;;;;;;;:20;;:39;;;;:::i;:::-;23509:12;:16;23522:2;23509:16;;;;;;;;;;;;;;;:58;;;;23602:2;23585:61;;23594:6;23585:61;;;23606:39;23628:16;;23606:17;:21;;:39;;;;:::i;:::-;23585:61;;;;;;;;;;;;;;;;;;23666:4;23659:11;;;;22768:910;;;;;;:::o;1526:136::-;1584:7;1611:43;1615:1;1618;1611:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1604:50;;1526:136;;;;:::o;16926:487::-;16965:19;16987:30;17001:15;16987:13;:30::i;:::-;16965:52;;17043:38;17068:11;17043:12;;:16;;:38;;;;:::i;:::-;17028:12;:53;;;;13758:1;13749:11;17113:10;;17098:12;;:25;17094:83;;;13758:1;13749:11;17155:10;;17140:12;:25;;;;17094:83;17208:28;17223:12;;12448:2;12805;:12;12792:10;:25;12505:1;12496:11;13665:38;;;;;;12505:1;12496:11;13650:54;17208:14;;:28;;;;:::i;:::-;17189:16;:47;;;;17267:11;17249:15;:29;;;;17311:15;17289:19;:37;;;;12398:7;17337:19;:30;;;;17392:12;;17385:20;;;;;;;;;;16926:487;:::o;1904:250::-;1962:7;1991:1;1986;:6;1982:47;;;2016:1;2009:8;;;;1982:47;2041:9;2057:1;2053;:5;2041:17;;2086:1;2081;2077;:5;;;;;;:10;2069:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2145:1;2138:8;;;1904:250;;;;;:::o;3541:187::-;3635:1;3615:22;;:8;:22;;;;3607:31;;;;;;3683:8;3654:38;;3675:6;;;;;;;;;;;3654:38;;;;;;;;;;;;3712:8;3703:6;;:17;;;;;;;;;;;;;;;;;;3541:187;:::o;2302:225::-;2422:7;2454:1;2450;:5;2457:12;2442:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2481:9;2497:1;2493;:5;;;;;;2481:17;;2518:1;2511:8;;;2302:225;;;;;:::o;21997:339::-;22115:4;22132:17;22152:28;22163:16;;22152:6;:10;;:28;;;;:::i;:::-;22132:48;;22212:33;22235:9;22212:12;:18;22225:4;22212:18;;;;;;;;;;;;;;;;:22;;:33;;;;:::i;:::-;22191:12;:18;22204:4;22191:18;;;;;;;;;;;;;;;:54;;;;22275:31;22296:9;22275:12;:16;22288:2;22275:16;;;;;;;;;;;;;;;;:20;;:31;;;;:::i;:::-;22256:12;:16;22269:2;22256:16;;;;;;;;;;;;;;;:50;;;;22324:4;22317:11;;;21997:339;;;;;:::o;32989:246::-;33039:4;33106:5;33076:35;;:14;:26;33091:10;33076:26;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;:59;;;;;33129:6;;;;;;;;;;;33128:7;33076:59;:87;;;;;33152:11;;;;;;;;;;33076:87;:151;;;;;33211:16;;33180:12;:27;33201:4;33180:27;;;;;;;;;;;;;;;;:47;;33076:151;33056:171;;32989:246;:::o;24768:1466::-;15351:4;15342:6;;:13;;;;;;;;;;;;;;;;;;24822:28:::1;24853:73;24899:16;;24853:12;:27;24874:4;24853:27;;;;;;;;;;;;;;;;:31;;:73;;;;:::i;:::-;24822:104;;24937:23;24963:101;25062:1;24963:80;25034:8;;24963:52;25002:12;;24963:20;:38;;:52;;;;:::i;:::-;:70;;:80;;;;:::i;:::-;:98;;:101;;;;:::i;:::-;24937:127;;25075:20;25098:41;25123:15;25098:20;:24;;:41;;;;:::i;:::-;25075:64;;25152:21;25190:1;25176:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25152:40;;25221:4;25203;25208:1;25203:7;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;25247:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;25237:4;25242:1;25237:7;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;25273:21;25297;25273:45;;25331:6;;;;;;;;;;;:57;;;25403:12;25430:1;25446:4;25473;25493:15;25331:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25532:17;25552:40;25578:13;25552:21;:25;;:40;;;;:::i;:::-;25532:60;;25603:19;25625:33;25638:19;25655:1;25638:12;;:16;;:19;;;;:::i;:::-;25625:8;;:12;;:33;;;;:::i;:::-;25603:55;;25671:26;25700:93;25791:1;25700:72;25760:11;25700:41;25728:12;;25700:9;:27;;:41;;;;:::i;:::-;:59;;:72;;;;:::i;:::-;:90;;:93;;;;:::i;:::-;25671:122;;25828:1;25810:15;:19;25806:292;;;25846:6;;;;;;;;;;;:22;;;25876:18;25922:4;25946:15;25980:1;26000::::0;26020:17:::1;;;;;;;;;;;26056:15;25846:240;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25806:292;26111:12;26137:25;;;;;;;;;;;26129:39;;26190:21;26129:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26110:116;;;15366:1;;;;;;;;;15387:5:::0;15378:6;;:14;;;;;;;;;;;;;;;;;;24768:1466::o;30969:253::-;31069:4;31112:14;:20;31127:4;31112:20;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;31136:14;:18;31151:2;31136:18;;;;;;;;;;;;;;;;;;;;;;;;;31112:42;31111:103;;;;;31174:12;:18;31187:4;31174:18;;;;;;;;;;;;;;;;;;;;;;;;;31173:19;:40;;;;;31197:12;:16;31210:2;31197:16;;;;;;;;;;;;;;;;;;;;;;;;;31196:17;31173:40;31111:103;31091:123;;30969:253;;;;:::o;26578:560::-;26695:7;26715:17;26735:8;;26715:28;;26780:4;26758:26;;:14;:18;26773:2;26758:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;26754:66;;;26798:22;26812:7;;26798:9;:13;;:22;;;;:::i;:::-;26786:34;;26754:66;26833:17;26853:44;26882:14;;26853:24;26867:9;26853;:13;;:24;;;;:::i;:::-;:28;;:44;;;;:::i;:::-;26833:64;;26940:66;26986:9;26940:12;:27;26961:4;26940:27;;;;;;;;;;;;;;;;:31;;:66;;;;:::i;:::-;26910:12;:27;26931:4;26910:27;;;;;;;;;;;;;;;:96;;;;27047:4;27022:64;;27031:6;27022:64;;;27054:31;27068:16;;27054:9;:13;;:31;;;;:::i;:::-;27022:64;;;;;;;;;;;;;;;;;;27106:24;27120:9;27106;:13;;:24;;;;:::i;:::-;27099:31;;;;26578:560;;;;;:::o

Swarm Source

ipfs://7c8f192275475dd6f94c61eea96b5ac365473a4643a1c9b7ab3df7768fe6e430
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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