Contract Address Details

0x05888e66703c1e79aD5803433CF25a05f18e76C6

Token
HotDoge (HOTDOGE)
Creator
0xc83206ā€“34279b at 0xdaa47dā€“1f43a5
Balance
0 Doge
Tokens
Fetching tokens...
Transactions
681 Transactions
Transfers
421 Transfers
Gas Used
43,145,057
Last Balance Update
26722750
Contract name:
HotDoge




Optimization enabled
false
Compiler version
v0.8.16+commit.07a7930e




EVM Version
default




Verified at
2022-09-18T14:04:54.129848Z

Contract source code

// File: HotDoge.sol



pragma solidity ^0.8.16;

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

    function decimals() external view returns (uint8);

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

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

    function getOwner() external view returns (address);

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

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

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

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

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

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

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

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

interface IDEXRouter {
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (
            uint amountToken,
            uint amountETH,
            uint liquidity
        );

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);
}

abstract contract Ownable {
    address internal _owner;

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

    constructor() {
        address msgSender = msg.sender;

        _owner = msgSender;

        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(owner() == msg.sender, "Ownable: caller is not the owner");

        _;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));

        _owner = address(0);
    }

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

        emit OwnershipTransferred(_owner, newOwner);

        _owner = newOwner;
    }
}

contract HotDoge is Ownable, IBEP20 {
    //shares represent the token someone with reflections turned on has.

    //over time each share becomes worth more tokens so the tokens someone holds grow

    mapping(address => uint) public Shares;

    //exFcluded from Reflection accounts just track the exact amount of tokens

    mapping(address => uint) public ExcludedBalances;

    mapping(address => bool) public ExcludedFromReflection;

    mapping(address => bool) public ExcludedFromFees;

    mapping(address => uint) public StrongApe;


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



    uint constant APE_DURATION= 5 minutes;
    uint constant APE_TAX_DURATION= 1 days;


    //Market makers have different Fees for Buy/Sell

    mapping(address => bool) public _isMarketMaker;

    uint _buyTax = 1000;

    uint _sellTax = 1000;

    uint _transferTax = 0;

    //The taxes are split into different uses and need to add up to "TAX_DENOMINATOR"

    uint _marketingTax = 4000;

    uint _reflectionTax = 3000;

    uint _liquidityTax = 3000;

    uint _contractTax = TAX_DENOMINATOR - _reflectionTax;

    //percentage of dexPair that should be swapped with each contract swap (15=0.15%)

    uint _swapTreshold = 15;

    //If liquidity is greater than treshold, stop creating AutoLP(15%)

    uint _liquifyTreshold = 1500;

    //Manual swap disables auto swap, should there be a problem

    bool _manualSwap;

    uint launchTimestamp = type(uint).max;

    uint _liquidityUnlockTime;

    uint constant TAX_DENOMINATOR = 10000;

    //DividentMagnifier to make Reflection more accurate

    uint constant DividentMagnifier = 2**128;

    uint TokensPerShare = DividentMagnifier;

    uint8 constant _decimals = 9;

    uint constant InitialSupply = 10**9 * 10**_decimals;
    uint public maxWallet=InitialSupply/10000000000000000000;
    uint public maxTX=InitialSupply/10000000000000000000;
    //All non excluded tokens get tracked here as shares

    uint _totalShares;

    //All excluded tokens get tracked here as tokens

    uint _totalExcludedTokens;

    function symbol() external pure override returns (string memory) {
        return "HOTDOGE";
    }

    function name() external pure override returns (string memory) {
        return "HotDoge";
    }

    address public marketingWallet;
    address dexPair;
    //TestNet
    //address private constant DEXrouter =
    //    0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;

        
    address private constant DEXrouter =
        0x72d85Ab47fBfc5E7E04a8bcfCa1601D8f8cE1a50;


    IDEXRouter pancakeRouter = IDEXRouter(DEXrouter);

    event onSetManualSwap(bool manual);

    event OnSetOverLiquifyTreshold(uint amount);

    event OnSetSwapTreshold(uint treshold);

    event OnSetAMM(address AMM, bool add);

    event OnSetTaxes(
        uint Buy,
        uint Sell,
        uint Transfer,
        uint Reflection,
        uint Liquidity,
        uint Marketing
    );

    event OnSetExcludedFromFee(address account, bool exclude);

    event OnSetLaunchTimestamp(uint Timestamp);

    event OnSetExcludedFromReflection(address account, bool exclude);

    event OnSetMarketingWallet(address wallet);

    event OnProlongLPLock(uint UnlockTimestamp);

    event OnReleaseLP();

    constructor() {
        dexPair = IPancakeFactory(pancakeRouter.factory()).createPair(
            address(this),
            pancakeRouter.WETH()
        );

        _isMarketMaker[dexPair] = true;

        addTokens(msg.sender, (InitialSupply * 999) / 1000);

        //Sends tokens to dead address to prevent overflows from happening- due to reflection with no receiver

        addTokens(address(0xdead), InitialSupply / 1000);

        emit Transfer(address(0), address(0xdead), InitialSupply / 1000);

        emit Transfer(address(0), msg.sender, (InitialSupply * 999) / 1000);

        //Pancake pair and contract never get reflections and can't be included

        _excludeFromReflection(address(this), true);

        _excludeFromReflection(dexPair, true);

        //Contract never pays fees and can't be included

        ExcludedFromFees[msg.sender] = true;

        ExcludedFromFees[address(this)] = true;

        //Dev and marketing wallet are by default the owner and need to be set later

        marketingWallet = msg.sender;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///Transfer/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    function _transfer(
        address sender,
        address recipient,
        uint amount
    ) private {
        require(sender != address(0), "transfer from zero");

        require(recipient != address(0), "transfer to zero");

        require(amount > 0, "amount zero");

        if (ExcludedFromFees[sender] || ExcludedFromFees[recipient])
            transferFeeless(sender, recipient, amount);
        else transferWithFee(sender, recipient, amount);

        emit Transfer(sender, recipient, amount);
    }

    function transferFeeless(
        address sender,
        address recipient,
        uint amount
    ) private {
        removeTokens(sender, amount);

        addTokens(recipient, amount);
    }

    function transferWithFee(
        address sender,
        address recipient,
        uint amount
    ) private {
        require(amount<=maxTX,"MaxTX");
        require(block.timestamp >= launchTimestamp);

        bool isBuy = _isMarketMaker[sender];

        bool isSell = _isMarketMaker[recipient];

        uint tax;
        if (isSell){
            if(block.timestamp < launchTimestamp+APE_TAX_DURATION)
            {
                uint strongApe=StrongApe[sender];
                if(block.timestamp<(launchTimestamp+strongApe))
                    tax=_strongApeTax(strongApe);
                else tax = _sellTax;
            }else tax = _sellTax;
        }else if (isBuy) {
            if (block.timestamp < (launchTimestamp + APE_DURATION)){
                if( StrongApe[recipient]==0){
                    uint TimeLeft=(launchTimestamp+APE_DURATION)-block.timestamp;
                    StrongApe[recipient]=APE_TAX_DURATION*TimeLeft/APE_DURATION;
                } 
                }
            tax = _buyTax;
            require(balanceOf(recipient)+amount<maxWallet,"max Wallet");
        } 
        else{
            //for transfers RPG Studios tax still applies
            if(block.timestamp < launchTimestamp+APE_TAX_DURATION){
                uint strongApe=StrongApe[sender];
                if(block.timestamp<launchTimestamp+strongApe)
                    tax=_strongApeTax(strongApe);
                else tax = _transferTax;
            }else tax = _transferTax;
            require(balanceOf(recipient)+amount<maxWallet,"max Wallet");
        } 

        if (!_isSwappingContractModifier && sender != dexPair && !_manualSwap)
            _swapContractToken(false);

        uint TaxedAmount = (amount * tax) / TAX_DENOMINATOR;

        uint ContractToken = (TaxedAmount * _contractTax) / TAX_DENOMINATOR;

        uint ReflectToken = TaxedAmount - ContractToken;

        removeTokens(sender, amount);

        addTokens(recipient, amount - TaxedAmount);

        if (ContractToken > 0) addTokens(address(this), ContractToken);

        if (ReflectToken > 0) reflectTokens(ReflectToken);
    }

    function _strongApeTax(uint duration) private view returns (uint) {
        uint timeSinceLaunch = block.timestamp - launchTimestamp;
        return 10000 - (((10000 - _sellTax) * timeSinceLaunch) / duration);

    }

    //Adds token respecting reflection

    function addTokens(address account, uint tokens) private {
        uint Balance = balanceOf(account);

        uint newBalance = Balance + tokens;

        if (ExcludedFromReflection[account]) {
            ExcludedBalances[account] = newBalance;

            _totalExcludedTokens += tokens;
        } else {
            uint oldShares = SharesFromTokens(Balance);

            uint newShares = SharesFromTokens(newBalance);

            Shares[account] = newShares;

            _totalShares += (newShares - oldShares);
        }
    }

    //Removes token respecting reflection

    function removeTokens(address account, uint tokens) private {
        uint Balance = balanceOf(account);

        require(tokens <= Balance, "Transfer exceeds Balance");

        uint newBalance = Balance - tokens;

        if (ExcludedFromReflection[account]) {
            ExcludedBalances[account] = newBalance;

            _totalExcludedTokens -= (Balance - newBalance);
        } else {
            uint oldShares = SharesFromTokens(Balance);

            uint newShares = SharesFromTokens(newBalance);

            Shares[account] = newShares;

            _totalShares -= (oldShares - newShares);
        }
    }

    //Handles reflection of already substracted token

    function reflectTokens(uint tokens) private {
        if (_totalShares == 0) return; //if total shares=0 reflection dissapears into nothing

        TokensPerShare += (tokens * DividentMagnifier) / _totalShares;
    }

    function TokensFromShares(uint shares) public view returns (uint) {
        return (shares * TokensPerShare) / DividentMagnifier;
    }

    function SharesFromTokens(uint tokens) public view returns (uint) {
        return (tokens * DividentMagnifier) / TokensPerShare;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///SwapContractToken////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool private _isSwappingContractModifier;

    modifier lockTheSwap() {
        _isSwappingContractModifier = true;

        _;

        _isSwappingContractModifier = false;
    }

    function _swapContractToken(bool ignoreLimits) private lockTheSwap {
        uint256 contractBalance = ExcludedBalances[address(this)];

        if (_contractTax == 0) return;

        uint256 tokenToSwap = (ExcludedBalances[dexPair] * _swapTreshold) /
            TAX_DENOMINATOR;

        //only swap if contractBalance is larger than tokenToSwap or ignore limits

        if (contractBalance < tokenToSwap) {
            if (ignoreLimits) tokenToSwap = contractBalance;
            else return;
        }

        //splits the token in TokenForLiquidity and tokenForMarketing

        uint256 tokenForLiquidity = isOverLiquified()
            ? 0
            : (tokenToSwap * _liquidityTax) / _contractTax;

        uint256 tokenForMarketing = tokenToSwap - tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves

        uint256 liqToken = tokenForLiquidity / 2;

        //swaps marktetingToken and the liquidity token half for BNB

        uint256 swapToken = liqToken + tokenForMarketing;

        if (swapToken == 0) return;

        _swapTokenForBNB(swapToken);

        uint256 newBNB = address(this).balance;

        //calculates the amount of BNB belonging to the LP-Pair and converts them to LP

        uint256 liqBNB = (newBNB * liqToken) / swapToken;

        if (liqBNB > 0) _addLiquidity(liqToken, liqBNB);

        (bool sent, ) = marketingWallet.call{value: address(this).balance}("");

        sent = true;
    }

    function _swapTokenForBNB(uint256 tokens) private {
        address[] memory path = new address[](2);

        path[0] = address(this);

        path[1] = pancakeRouter.WETH();

        _allowances[address(this)][address(pancakeRouter)] = tokens;

        pancakeRouter.swapExactTokensForETH(
            tokens,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenamount, uint256 bnbamount) private {
        _allowances[address(this)][address(pancakeRouter)] = tokenamount;

        try
            pancakeRouter.addLiquidityETH{value: bnbamount}(
                address(this),
                tokenamount,
                0,
                0,
                address(this),
                block.timestamp
            )
        {} catch {}
    }

    function isOverLiquified() public view returns (bool) {
        return
            ExcludedBalances[dexPair] >
            (totalSupply() * _liquifyTreshold) / TAX_DENOMINATOR;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///Settings/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    function ReflectTokens(uint amount) external {
        removeTokens(msg.sender, amount);

        reflectTokens(amount);

        emit Transfer(msg.sender, address(0), amount);
    }
    event OnSetTXRestrictions(uint maxWallet_, uint maxTX_);
    function SetTXRestrictions(uint maxWallet_, uint maxTX_) external onlyOwner{
        require(maxWallet_>=InitialSupply/10000000000000000000);
        require(maxTX_>=InitialSupply/10000000000000000000);
        maxWallet=maxWallet_;
        maxTX=maxTX_;
        emit OnSetTXRestrictions(maxTX_,maxWallet_);

    }
    function swapContractToken(uint treshold) external onlyOwner {
        uint prevTreshold = _swapTreshold;

        _swapTreshold = treshold;

        _swapContractToken(true);

        _swapTreshold = prevTreshold;
    }

    function setManualSwap(bool manual) external onlyOwner {
        _manualSwap = manual;

        emit onSetManualSwap(manual);
    }

    function setOverLiquifyTreshold(uint amount) external onlyOwner {
        require(amount < TAX_DENOMINATOR);

        _liquifyTreshold = amount;

        emit OnSetOverLiquifyTreshold(amount);
    }

    function setSwapTreshold(uint treshold) external onlyOwner {
        require(treshold <= TAX_DENOMINATOR / 100);

        _swapTreshold = treshold;

        emit OnSetSwapTreshold(treshold);
    }

    function setAMM(address AMM, bool add) external onlyOwner {
        require(AMM != dexPair);

        _isMarketMaker[AMM] = add;

        emit OnSetAMM(AMM, add);
    }

    function setTaxes(
        uint Buy,
        uint Sell,
        uint Transfer,
        uint Reflection,
        uint Liquidity,
        uint Marketing
    ) public onlyOwner {
        uint maxTax = (TAX_DENOMINATOR / 100) * 10; //10% max tax

        require(Buy <= maxTax && Sell <= maxTax && Transfer <= maxTax);

        require(Reflection + Liquidity + Marketing == TAX_DENOMINATOR);

        _buyTax = Buy;

        _sellTax = Sell;

        _transferTax = Transfer;

        _reflectionTax = Reflection;

        _liquidityTax = Liquidity;

        _marketingTax = Marketing;

        _contractTax = TAX_DENOMINATOR - _reflectionTax;

        emit OnSetTaxes(Buy, Sell, Transfer, Reflection, Liquidity, Marketing);
    }

    function setExcludedFromFee(address account, bool exclude)
        public
        onlyOwner
    {
        require(exclude || account != address(this));

        ExcludedFromFees[account] = exclude;

        emit OnSetExcludedFromFee(account, exclude);
    }

    function setLaunchInSeconds(uint secondsUntilLaunch) public onlyOwner {
        setLaunchTimestamp(block.timestamp + secondsUntilLaunch);
    }

    function setLaunchTimestamp(uint Timestamp) public onlyOwner {
        require(block.timestamp < launchTimestamp);

        require(Timestamp >= block.timestamp);

        launchTimestamp = Timestamp;

        emit OnSetLaunchTimestamp(Timestamp);
    }

    function setExcludedFromReflection(address account, bool exclude)
        public
        onlyOwner
    {
        //Contract and PancakePair never can receive reflections

        require(account != address(this) && account != dexPair);

        //Burn wallet always receives reflections

        require(account != address(0xdead));

        _excludeFromReflection(account, exclude);

        emit OnSetExcludedFromReflection(account, exclude);
    }

    function _excludeFromReflection(address account, bool exclude) private {
        require(ExcludedFromReflection[account] != exclude);

        uint tokens = balanceOf(account);

        ExcludedFromReflection[account] = exclude;

        if (exclude) {
            uint shares = Shares[account];

            _totalShares -= shares;

            Shares[account] = 0;

            ExcludedBalances[account] = tokens;

            _totalExcludedTokens += tokens;
        } else {
            ExcludedBalances[account] = 0;

            _totalExcludedTokens -= tokens;

            uint shares = SharesFromTokens(tokens);

            Shares[account] = shares;

            _totalShares += shares;
        }
    }

    function SetMarketingWallet(address newMarketingWallet) public onlyOwner {
        marketingWallet = newMarketingWallet;

        emit OnSetMarketingWallet(0x8660a233A477aaA025e5207fbf32119326eD121b);
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///View/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    function getTaxes()
        public
        view
        returns (
            uint Buy,
            uint Sell,
            uint Transfer,
            uint Reflection,
            uint LP,
            uint Marketing
        )
    {
        Buy = _buyTax;

        Sell = _sellTax;

        Transfer = _transferTax;

        Reflection = _reflectionTax;

        LP = _liquidityTax;

        Marketing = _marketingTax;
    }

    function getInfo()
        public
        view
        returns (
            uint SwapTreshold,
            uint LiquifyTreshold,
            uint LaunchTimestamp,
            uint TotalShares,
            uint TotalExcluded,
            bool ManualSwap
        )
    {
        SwapTreshold = _swapTreshold;

        LiquifyTreshold = _liquifyTreshold;

        LaunchTimestamp = launchTimestamp;

        TotalExcluded = _totalExcludedTokens;

        TotalShares = _totalShares;

        ManualSwap = _manualSwap;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///Liquidity Lock///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    function LockLiquidityForSeconds(uint secondsUntilUnlock) public onlyOwner {
        SetUnlockTimestamp(secondsUntilUnlock + block.timestamp);
    }

    function SetUnlockTimestamp(uint newUnlockTime) public onlyOwner {
        // require new unlock time to be longer than old one

        require(newUnlockTime > _liquidityUnlockTime);

        _liquidityUnlockTime = newUnlockTime;

        emit OnProlongLPLock(_liquidityUnlockTime);
    }

    //Release Liquidity Tokens once unlock time is over

    function LiquidityRelease() public onlyOwner {
        //Only callable if liquidity Unlock time is over

        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");

        IBEP20 liquidityToken = IBEP20(dexPair);

        uint amount = liquidityToken.balanceOf(address(this));

        liquidityToken.transfer(msg.sender, amount);

        emit OnReleaseLP();
    }

    function RescueTokens(address token) public onlyOwner {
        require(token != address(this) && token != dexPair);

        IBEP20(token).transfer(
            msg.sender,
            IBEP20(token).balanceOf(address(this))
        );
    }

    function getLiquidityLockSeconds()
        public
        view
        returns (uint256 LockedSeconds)
    {
        if (block.timestamp < _liquidityUnlockTime)
            return _liquidityUnlockTime - block.timestamp;

        return 0;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///BEP20 Implementation/////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    receive() external payable {}

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

    function getOwner() external view override returns (address) {
        return owner();
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (ExcludedFromReflection[account]) return ExcludedBalances[account];

        return TokensFromShares(Shares[account]);
    }

    function totalSupply() public view override returns (uint256) {
        return _totalExcludedTokens + TokensFromShares(_totalShares);
    }

    function allowance(address _owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint256 amount)
        external
        override
        returns (bool)
    {
        _approve(msg.sender, spender, amount);

        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0));

        require(spender != address(0));

        _allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    function transfer(address recipient, uint amount)
        external
        override
        returns (bool)
    {
        _transfer(msg.sender, recipient, amount);

        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];

        require(currentAllowance >= amount, "Transfer exceeds allowance");

        _approve(sender, msg.sender, currentAllowance - amount);

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            _allowances[msg.sender][spender] + addedValue
        );

        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        returns (bool)
    {
        uint256 currentAllowance = _allowances[msg.sender][spender];

        require(currentAllowance >= subtractedValue);

        _approve(msg.sender, spender, currentAllowance - subtractedValue);

        return true;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OnProlongLPLock","inputs":[{"type":"uint256","name":"UnlockTimestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OnReleaseLP","inputs":[],"anonymous":false},{"type":"event","name":"OnSetAMM","inputs":[{"type":"address","name":"AMM","internalType":"address","indexed":false},{"type":"bool","name":"add","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OnSetExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"bool","name":"exclude","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OnSetExcludedFromReflection","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"bool","name":"exclude","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OnSetLaunchTimestamp","inputs":[{"type":"uint256","name":"Timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OnSetMarketingWallet","inputs":[{"type":"address","name":"wallet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OnSetOverLiquifyTreshold","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OnSetSwapTreshold","inputs":[{"type":"uint256","name":"treshold","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OnSetTXRestrictions","inputs":[{"type":"uint256","name":"maxWallet_","internalType":"uint256","indexed":false},{"type":"uint256","name":"maxTX_","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OnSetTaxes","inputs":[{"type":"uint256","name":"Buy","internalType":"uint256","indexed":false},{"type":"uint256","name":"Sell","internalType":"uint256","indexed":false},{"type":"uint256","name":"Transfer","internalType":"uint256","indexed":false},{"type":"uint256","name":"Reflection","internalType":"uint256","indexed":false},{"type":"uint256","name":"Liquidity","internalType":"uint256","indexed":false},{"type":"uint256","name":"Marketing","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"onSetManualSwap","inputs":[{"type":"bool","name":"manual","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"ExcludedBalances","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"ExcludedFromFees","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"ExcludedFromReflection","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"LiquidityRelease","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"LockLiquidityForSeconds","inputs":[{"type":"uint256","name":"secondsUntilUnlock","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"ReflectTokens","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"RescueTokens","inputs":[{"type":"address","name":"token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetMarketingWallet","inputs":[{"type":"address","name":"newMarketingWallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetTXRestrictions","inputs":[{"type":"uint256","name":"maxWallet_","internalType":"uint256"},{"type":"uint256","name":"maxTX_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetUnlockTimestamp","inputs":[{"type":"uint256","name":"newUnlockTime","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"Shares","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"SharesFromTokens","inputs":[{"type":"uint256","name":"tokens","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"StrongApe","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"TokensFromShares","inputs":[{"type":"uint256","name":"shares","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_isMarketMaker","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"SwapTreshold","internalType":"uint256"},{"type":"uint256","name":"LiquifyTreshold","internalType":"uint256"},{"type":"uint256","name":"LaunchTimestamp","internalType":"uint256"},{"type":"uint256","name":"TotalShares","internalType":"uint256"},{"type":"uint256","name":"TotalExcluded","internalType":"uint256"},{"type":"bool","name":"ManualSwap","internalType":"bool"}],"name":"getInfo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"LockedSeconds","internalType":"uint256"}],"name":"getLiquidityLockSeconds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"Buy","internalType":"uint256"},{"type":"uint256","name":"Sell","internalType":"uint256"},{"type":"uint256","name":"Transfer","internalType":"uint256"},{"type":"uint256","name":"Reflection","internalType":"uint256"},{"type":"uint256","name":"LP","internalType":"uint256"},{"type":"uint256","name":"Marketing","internalType":"uint256"}],"name":"getTaxes","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOverLiquified","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"marketingWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxTX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxWallet","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAMM","inputs":[{"type":"address","name":"AMM","internalType":"address"},{"type":"bool","name":"add","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"exclude","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludedFromReflection","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"exclude","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLaunchInSeconds","inputs":[{"type":"uint256","name":"secondsUntilLaunch","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLaunchTimestamp","inputs":[{"type":"uint256","name":"Timestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setManualSwap","inputs":[{"type":"bool","name":"manual","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOverLiquifyTreshold","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapTreshold","inputs":[{"type":"uint256","name":"treshold","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxes","inputs":[{"type":"uint256","name":"Buy","internalType":"uint256"},{"type":"uint256","name":"Sell","internalType":"uint256"},{"type":"uint256","name":"Transfer","internalType":"uint256"},{"type":"uint256","name":"Reflection","internalType":"uint256"},{"type":"uint256","name":"Liquidity","internalType":"uint256"},{"type":"uint256","name":"Marketing","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapContractToken","inputs":[{"type":"uint256","name":"treshold","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
            

Contract Creation Code

0x60806040526103e86008556103e86009556000600a55610fa0600b55610bb8600c55610bb8600d55600c5461271062000039919062000d38565b600e55600f80556105dc6010557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601255700100000000000000000000000000000000601455678ac7230489e800006009600a62000098919062000ed4565b633b9aca00620000a9919062000f25565b620000b5919062000fb5565b601555678ac7230489e800006009600a620000d1919062000ed4565b633b9aca00620000e2919062000f25565b620000ee919062000fb5565b6016557372d85ab47fbfc5e7e04a8bcfca1601d8f8ce1a50601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200015357600080fd5b506000339050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000263573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000289919062001057565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000313573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000339919062001057565b6040518363ffffffff1660e01b8152600401620003589291906200109a565b6020604051808303816000875af115801562000378573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039e919062001057565b601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004a8336103e86103e76009600a62000473919062000ed4565b633b9aca0062000484919062000f25565b62000490919062000f25565b6200049c919062000fb5565b6200076960201b60201c565b620004eb61dead6103e86009600a620004c2919062000ed4565b633b9aca00620004d3919062000f25565b620004df919062000fb5565b6200076960201b60201c565b61dead73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6103e86009600a62000550919062000ed4565b633b9aca0062000561919062000f25565b6200056d919062000fb5565b6040516200057c9190620010d8565b60405180910390a33373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6103e86103e76009600a620005ea919062000ed4565b633b9aca00620005fb919062000f25565b62000607919062000f25565b62000613919062000fb5565b604051620006229190620010d8565b60405180910390a36200063d306001620008e760201b60201c565b62000672601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620008e760201b60201c565b6001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555033601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062001130565b60006200077c8362000b9c60201b60201c565b9050600082826200078e9190620010f5565b9050600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615620008485780600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082601860008282546200083b9190620010f5565b92505081905550620008e1565b60006200085b8362000c9160201b60201c565b90506000620008708362000c9160201b60201c565b905080600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508181620008c4919062000d38565b60176000828254620008d79190620010f5565b9250508190555050505b50505050565b801515600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036200094457600080fd5b6000620009578362000b9c60201b60201c565b905081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550811562000ac1576000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050806017600082825462000a0f919062000d38565b925050819055506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816018600082825462000ab39190620010f5565b925050819055505062000b97565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806018600082825462000b1a919062000d38565b92505081905550600062000b348262000c9160201b60201c565b905080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806017600082825462000b8e9190620010f5565b92505081905550505b505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161562000c3957600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905062000c8c565b62000c89600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000cc860201b60201c565b90505b919050565b60006014547001000000000000000000000000000000008362000cb5919062000f25565b62000cc1919062000fb5565b9050919050565b60007001000000000000000000000000000000006014548362000cec919062000f25565b62000cf8919062000fb5565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d458262000cff565b915062000d528362000cff565b925082820390508181111562000d6d5762000d6c62000d09565b5b92915050565b60008160011c9050919050565b6000808291508390505b600185111562000dd25780860481111562000daa5762000da962000d09565b5b600185161562000dba5780820291505b808102905062000dca8562000d73565b945062000d8a565b94509492505050565b60008262000ded576001905062000ec0565b8162000dfd576000905062000ec0565b816001811462000e16576002811462000e215762000e57565b600191505062000ec0565b60ff84111562000e365762000e3562000d09565b5b8360020a91508482111562000e505762000e4f62000d09565b5b5062000ec0565b5060208310610133831016604e8410600b841016171562000e915782820a90508381111562000e8b5762000e8a62000d09565b5b62000ec0565b62000ea0848484600162000d80565b9250905081840481111562000eba5762000eb962000d09565b5b81810290505b9392505050565b600060ff82169050919050565b600062000ee18262000cff565b915062000eee8362000ec7565b925062000f1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000ddb565b905092915050565b600062000f328262000cff565b915062000f3f8362000cff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000f7b5762000f7a62000d09565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000fc28262000cff565b915062000fcf8362000cff565b92508262000fe25762000fe162000f86565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200101f8262000ff2565b9050919050565b620010318162001012565b81146200103d57600080fd5b50565b600081519050620010518162001026565b92915050565b60006020828403121562001070576200106f62000fed565b5b6000620010808482850162001040565b91505092915050565b620010948162001012565b82525050565b6000604082019050620010b1600083018562001089565b620010c0602083018462001089565b9392505050565b620010d28162000cff565b82525050565b6000602082019050620010ef6000830184620010c7565b92915050565b6000620011028262000cff565b91506200110f8362000cff565b92508282019050808211156200112a576200112962000d09565b5b92915050565b614f0980620011406000396000f3fe60806040526004361061028c5760003560e01c80636612e66f1161015a578063a9b434d9116100c1578063d726059f1161007a578063d726059f14610a29578063db2c08b414610a52578063dd62ed3e14610a8f578063ebae7c1c14610acc578063f2fde38b14610af7578063f8b45b0514610b2057610293565b8063a9b434d9146108e3578063a9d3cd8a14610920578063aa45b09c14610949578063ad9200b114610986578063cafcb679146109c3578063cfd1940e14610a0057610293565b8063893d20e811610113578063893d20e8146107bf5780638da5cb5b146107ea5780639515ff2a1461081557806395d89b411461083e578063a457c2d714610869578063a9059cbb146108a657610293565b80636612e66f146106c357806368707c98146106ec57806370a0823114610715578063715018a61461075257806375f0a8741461076957806388d28b771461079457610293565b80632d99812a116101fe578063409d96ae116101b7578063409d96ae146105b057806346e35f03146105d95780635304757b146106045780635a9b0b891461062d5780635c1ed6061461065d5780635d7b47e11461068657610293565b80632d99812a146104a4578063313ce567146104cd5780633227925f146104f8578063324c7bdd1461052157806332955a671461054a578063395093511461057357610293565b806318160ddd1161025057806318160ddd146103695780631b23f762146103945780631d5165cf146103d15780631e743d18146103fa57806323b872dd146104375780632973ef2d1461047457610293565b806304d4c990146102985780630612f39d146102c157806306fdde03146102d85780630918992b14610303578063095ea7b31461032c57610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613d28565b610b4b565b005b3480156102cd57600080fd5b506102d6610cb2565b005b3480156102e457600080fd5b506102ed610ec0565b6040516102fa9190613e45565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613e67565b610efd565b005b34801561033857600080fd5b50610353600480360381019061034e9190613ef2565b610fce565b6040516103609190613f4d565b60405180910390f35b34801561037557600080fd5b5061037e610fe5565b60405161038b9190613f77565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613f92565b611004565b6040516103c89190613f77565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190613f92565b61101c565b005b34801561040657600080fd5b50610421600480360381019061041c9190613f92565b611120565b60405161042e9190613f4d565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613fbf565b611140565b60405161046b9190613f4d565b60405180910390f35b34801561048057600080fd5b50610489611233565b60405161049b96959493929190614012565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c6919061409f565b611262565b005b3480156104d957600080fd5b506104e261132b565b6040516104ef91906140e8565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a9190613e67565b611334565b005b34801561052d57600080fd5b5061054860048036038101906105439190613e67565b6113c0565b005b34801561055657600080fd5b50610571600480360381019061056c9190613e67565b61144c565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613ef2565b611510565b6040516105a79190613f4d565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613f92565b6115ae565b005b3480156105e557600080fd5b506105ee6117b1565b6040516105fb9190613f4d565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190613e67565b61183d565b005b34801561063957600080fd5b506106426118d5565b60405161065496959493929190614103565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f9190613e67565b611911565b005b34801561069257600080fd5b506106ad60048036038101906106a89190613f92565b61198d565b6040516106ba9190613f77565b60405180910390f35b3480156106cf57600080fd5b506106ea60048036038101906106e59190614164565b6119a5565b005b3480156106f857600080fd5b50610713600480360381019061070e91906141a4565b611aef565b005b34801561072157600080fd5b5061073c60048036038101906107379190613f92565b611c27565b6040516107499190613f77565b60405180910390f35b34801561075e57600080fd5b50610767611d12565b005b34801561077557600080fd5b5061077e611e45565b60405161078b91906141f3565b60405180910390f35b3480156107a057600080fd5b506107a9611e6b565b6040516107b69190613f77565b60405180910390f35b3480156107cb57600080fd5b506107d4611e94565b6040516107e191906141f3565b60405180910390f35b3480156107f657600080fd5b506107ff611ea3565b60405161080c91906141f3565b60405180910390f35b34801561082157600080fd5b5061083c60048036038101906108379190614164565b611ecc565b005b34801561084a57600080fd5b50610853612055565b6040516108609190613e45565b60405180910390f35b34801561087557600080fd5b50610890600480360381019061088b9190613ef2565b612092565b60405161089d9190613f4d565b60405180910390f35b3480156108b257600080fd5b506108cd60048036038101906108c89190613ef2565b612142565b6040516108da9190613f4d565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613f92565b612159565b6040516109179190613f4d565b60405180910390f35b34801561092c57600080fd5b5061094760048036038101906109429190614164565b612179565b005b34801561095557600080fd5b50610970600480360381019061096b9190613e67565b6122dc565b60405161097d9190613f77565b60405180910390f35b34801561099257600080fd5b506109ad60048036038101906109a89190613e67565b61230f565b6040516109ba9190613f77565b60405180910390f35b3480156109cf57600080fd5b506109ea60048036038101906109e59190613f92565b612342565b6040516109f79190613f4d565b60405180910390f35b348015610a0c57600080fd5b50610a276004803603810190610a229190613e67565b612362565b005b348015610a3557600080fd5b50610a506004803603810190610a4b9190613e67565b612433565b005b348015610a5e57600080fd5b50610a796004803603810190610a749190613f92565b6124f9565b604051610a869190613f77565b60405180910390f35b348015610a9b57600080fd5b50610ab66004803603810190610ab1919061420e565b612511565b604051610ac39190613f77565b60405180910390f35b348015610ad857600080fd5b50610ae1612598565b604051610aee9190613f77565b60405180910390f35b348015610b0357600080fd5b50610b1e6004803603810190610b199190613f92565b61259e565b005b348015610b2c57600080fd5b50610b3561273f565b604051610b429190613f77565b60405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff16610b6a611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb79061429a565b60405180910390fd5b6000600a6064612710610bd39190614318565b610bdd9190614349565b9050808711158015610bef5750808611155b8015610bfb5750808511155b610c0457600080fd5b612710828486610c1491906143a3565b610c1e91906143a3565b14610c2857600080fd5b866008819055508560098190555084600a8190555083600c8190555082600d8190555081600b81905550600c54612710610c6291906143d7565b600e819055507f95617e149b678679d65360792e6610c8fc9add72efd72fc3c8d94792801ca5c9878787878787604051610ca196959493929190614012565b60405180910390a150505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16610cd1611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e9061429a565b60405180910390fd5b601354421015610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390614457565b60405180910390fd5b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dce91906141f3565b602060405180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f919061448c565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610e4c9291906144b9565b6020604051808303816000875af1158015610e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f91906144f7565b507f28bacca46f5c57fe13623e9d5093cb2fab892814aca9b39384ab86550d9aa67560405160405180910390a15050565b60606040518060400160405280600781526020017f486f74446f676500000000000000000000000000000000000000000000000000815250905090565b3373ffffffffffffffffffffffffffffffffffffffff16610f1c611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f699061429a565b60405180910390fd5b6012544210610f8057600080fd5b42811015610f8d57600080fd5b806012819055507f818d823b27cf035ff2e055a65b6227b854203322ac5dbd674add6aa0d9d657d181604051610fc39190613f77565b60405180910390a150565b6000610fdb338484612745565b6001905092915050565b6000610ff26017546122dc565b601854610fff91906143a3565b905090565b60016020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff1661103b611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110889061429a565b60405180910390fd5b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa84eeda79ee9db5fc195488a69e6981aa457299570e28a92392eb9c84e005d79738660a233a477aaa025e5207fbf32119326ed121b60405161111591906141f3565b60405180910390a150565b60046020528060005260406000206000915054906101000a900460ff1681565b600061114d8484846128a2565b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890614570565b60405180910390fd5b6112278533858461122291906143d7565b612745565b60019150509392505050565b60008060008060008060085495506009549450600a549350600c549250600d549150600b549050909192939495565b3373ffffffffffffffffffffffffffffffffffffffff16611281611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce9061429a565b60405180910390fd5b80601160006101000a81548160ff0219169083151502179055507fa1334f73b4ca3b2391bae4d1db09bf2b9697a0ea492081a8a94206d8ec8384f0816040516113209190613f4d565b60405180910390a150565b60006009905090565b3373ffffffffffffffffffffffffffffffffffffffff16611353611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a09061429a565b60405180910390fd5b6113bd42826113b891906143a3565b612433565b50565b3373ffffffffffffffffffffffffffffffffffffffff166113df611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c9061429a565b60405180910390fd5b611449814261144491906143a3565b610efd565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661146b611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b89061429a565b60405180910390fd5b61271081106114cf57600080fd5b806010819055507fb46c8769af693755739d87a719196ddb7961844f19fc54dbad7b9d97690b7b5e816040516115059190613f77565b60405180910390a150565b60006115a4338484600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461159f91906143a3565b612745565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166115cd611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a9061429a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156116ad5750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6116b657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161170c91906141f3565b602060405180830381865afa158015611729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174d919061448c565b6040518363ffffffff1660e01b815260040161176a9291906144b9565b6020604051808303816000875af1158015611789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad91906144f7565b5050565b60006127106010546117c1610fe5565b6117cb9190614349565b6117d59190614318565b60026000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411905090565b3373ffffffffffffffffffffffffffffffffffffffff1661185c611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a99061429a565b60405180910390fd5b6000600f54905081600f819055506118ca6001612aef565b80600f819055505050565b600080600080600080600f5495506010549450601254935060185491506017549250601160009054906101000a900460ff169050909192939495565b61191b3382612d6a565b61192481612f14565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119829190613f77565b60405180910390a350565b60056020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff166119c4611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a119061429a565b60405180910390fd5b8080611a5257503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611a5b57600080fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe8b454213ef316b3de93adc4e156b9aa662bb0ab7b22bcdae2e2f95b9311da668282604051611ae3929190614590565b60405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff16611b0e611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b9061429a565b60405180910390fd5b678ac7230489e800006009600a611b7b91906146ec565b633b9aca00611b8a9190614349565b611b949190614318565b821015611ba057600080fd5b678ac7230489e800006009600a611bb791906146ec565b633b9aca00611bc69190614349565b611bd09190614318565b811015611bdc57600080fd5b81601581905550806016819055507fc951fd5f6c1738a40b939a6515d5082a37d60fcda98a7003c2cc4665d10219c98183604051611c1b929190614737565b60405180910390a15050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611cc257600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611d0d565b611d0a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122dc565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16611d31611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e9061429a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601354421015611e8c5742601354611e8591906143d7565b9050611e91565b600090505b90565b6000611e9e611ea3565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611eeb611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f389061429a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611fcb5750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611fd457600080fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361200e57600080fd5b6120188282612f65565b7fddf34c728783f45f37f9f67e80e1d3339edb7190424dad8a0a1604c1ed6e45498282604051612049929190614590565b60405180910390a15050565b60606040518060400160405280600781526020017f484f54444f474500000000000000000000000000000000000000000000000000815250905090565b600080600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561212157600080fd5b6121373385858461213291906143d7565b612745565b600191505092915050565b600061214f3384846128a2565b6001905092915050565b60036020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16612198611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e59061429a565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361224857600080fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9bc33cbedb7a42664c57f18776a53a203914f24bc418ec98ff073f30cca2b78582826040516122d0929190614590565b60405180910390a15050565b6000700100000000000000000000000000000000601454836122fe9190614349565b6123089190614318565b9050919050565b6000601454700100000000000000000000000000000000836123319190614349565b61233b9190614318565b9050919050565b60076020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16612381611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce9061429a565b60405180910390fd5b60646127106123e69190614318565b8111156123f257600080fd5b80600f819055507f8e6b6d7a8d988561ab8631507fccb15b88a362a07e65f58071b9feb983436802816040516124289190613f77565b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff16612452611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146124a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249f9061429a565b60405180910390fd5b60135481116124b657600080fd5b806013819055507f8ff9dc93846a022986f54e8f219a1fa780225726858e39e850da826852b4042e6013546040516124ee9190613f77565b60405180910390a150565b60026020528060005260406000206000915090505481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60165481565b3373ffffffffffffffffffffffffffffffffffffffff166125bd611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a9061429a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612679906147d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60155481565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361277e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127b757600080fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516128959190613f77565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129089061483e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612977906148aa565b60405180910390fd5b600081116129c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ba90614916565b60405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a645750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612a7957612a748383836131ff565b612a85565b612a84838383613218565b5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612ae29190613f77565b60405180910390a3505050565b6001601b60146101000a81548160ff0219169083151502179055506000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600e5403612b5e5750612d4c565b6000612710600f5460026000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd29190614349565b612bdc9190614318565b905080821015612bfc578215612bf457819050612bfb565b5050612d4c565b5b6000612c066117b1565b612c2a57600e54600d5483612c1b9190614349565b612c259190614318565b612c2d565b60005b905060008183612c3d91906143d7565b90506000600283612c4e9190614318565b905060008282612c5e91906143a3565b905060008103612c7357505050505050612d4c565b612c7c81613711565b60004790506000828483612c909190614349565b612c9a9190614318565b90506000811115612cb057612caf84826139e1565b5b6000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051612cf890614967565b60006040518083038185875af1925050503d8060008114612d35576040519150601f19603f3d011682016040523d82523d6000602084013e612d3a565b606091505b50509050600190505050505050505050505b6000601b60146101000a81548160ff02191690831515021790555050565b6000612d7583611c27565b905080821115612dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db1906149c8565b60405180910390fd5b60008282612dc891906143d7565b9050600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612e895780600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508082612e6c91906143d7565b60186000828254612e7d91906143d7565b92505081905550612f0e565b6000612e948361230f565b90506000612ea18361230f565b905080600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508082612ef391906143d7565b60176000828254612f0491906143d7565b9250508190555050505b50505050565b60006017540315612f625760175470010000000000000000000000000000000082612f3f9190614349565b612f499190614318565b60146000828254612f5a91906143a3565b925050819055505b50565b801515600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503612fc157600080fd5b6000612fcc83611c27565b905081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508115613130576000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050806017600082825461308191906143d7565b925050819055506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816018600082825461312391906143a3565b92505081905550506131fa565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806018600082825461318791906143d7565b9250508190555060006131998261230f565b905080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601760008282546131f191906143a3565b92505081905550505b505050565b6132098382612d6a565b6132138282613b34565b505050565b60165481111561325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490614a34565b60405180910390fd5b60125442101561326c57600080fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600081156133ae576201518060125461332791906143a3565b4210156133a3576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508060125461338091906143a3565b4210156133975761339081613c90565b915061339d565b60095491505b506133a9565b60095490505b6135e0565b82156134f45761012c6012546133c491906143a3565b421015613493576000600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036134925760004261012c60125461342591906143a3565b61342f91906143d7565b905061012c81620151806134439190614349565b61344d9190614318565b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b5b6008549050601554846134a587611c27565b6134af91906143a3565b106134ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e690614aa0565b60405180910390fd5b6135df565b6201518060125461350591906143a3565b421015613581576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508060125461355e91906143a3565b4210156135755761356e81613c90565b915061357b565b600a5491505b50613587565b600a5490505b6015548461359487611c27565b61359e91906143a3565b106135de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d590614aa0565b60405180910390fd5b5b5b601b60149054906101000a900460ff1615801561364b5750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156136645750601160009054906101000a900460ff16155b15613674576136736000612aef565b5b600061271082866136859190614349565b61368f9190614318565b90506000612710600e54836136a49190614349565b6136ae9190614318565b9050600081836136be91906143d7565b90506136ca8988612d6a565b6136df8884896136da91906143d7565b613b34565b60008211156136f3576136f23083613b34565b5b60008111156137065761370581612f14565b5b505050505050505050565b6000600267ffffffffffffffff81111561372e5761372d614ac0565b5b60405190808252806020026020018201604052801561375c5781602001602082028036833780820191505090505b509050308160008151811061377457613773614aef565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561381b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383f9190614b33565b8160018151811061385357613852614aef565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe58360008430426040518663ffffffff1660e01b8152600401613994959493929190614c63565b6000604051808303816000875af11580156139b3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906139dc9190614dd6565b505050565b81600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b8152600401613aeb96959493929190614e1f565b60606040518083038185885af193505050508015613b2757506040513d601f19601f82011682018060405250810190613b249190614e80565b60015b15613b30575050505b5050565b6000613b3f83611c27565b905060008282613b4f91906143a3565b9050600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613c055780600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508260186000828254613bf991906143a3565b92505081905550613c8a565b6000613c108361230f565b90506000613c1d8361230f565b905080600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508181613c6f91906143d7565b60176000828254613c8091906143a3565b9250508190555050505b50505050565b60008060125442613ca191906143d7565b90508281600954612710613cb591906143d7565b613cbf9190614349565b613cc99190614318565b612710613cd691906143d7565b915050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613d0581613cf2565b8114613d1057600080fd5b50565b600081359050613d2281613cfc565b92915050565b60008060008060008060c08789031215613d4557613d44613ce8565b5b6000613d5389828a01613d13565b9650506020613d6489828a01613d13565b9550506040613d7589828a01613d13565b9450506060613d8689828a01613d13565b9350506080613d9789828a01613d13565b92505060a0613da889828a01613d13565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b60005b83811015613def578082015181840152602081019050613dd4565b60008484015250505050565b6000601f19601f8301169050919050565b6000613e1782613db5565b613e218185613dc0565b9350613e31818560208601613dd1565b613e3a81613dfb565b840191505092915050565b60006020820190508181036000830152613e5f8184613e0c565b905092915050565b600060208284031215613e7d57613e7c613ce8565b5b6000613e8b84828501613d13565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ebf82613e94565b9050919050565b613ecf81613eb4565b8114613eda57600080fd5b50565b600081359050613eec81613ec6565b92915050565b60008060408385031215613f0957613f08613ce8565b5b6000613f1785828601613edd565b9250506020613f2885828601613d13565b9150509250929050565b60008115159050919050565b613f4781613f32565b82525050565b6000602082019050613f626000830184613f3e565b92915050565b613f7181613cf2565b82525050565b6000602082019050613f8c6000830184613f68565b92915050565b600060208284031215613fa857613fa7613ce8565b5b6000613fb684828501613edd565b91505092915050565b600080600060608486031215613fd857613fd7613ce8565b5b6000613fe686828701613edd565b9350506020613ff786828701613edd565b925050604061400886828701613d13565b9150509250925092565b600060c0820190506140276000830189613f68565b6140346020830188613f68565b6140416040830187613f68565b61404e6060830186613f68565b61405b6080830185613f68565b61406860a0830184613f68565b979650505050505050565b61407c81613f32565b811461408757600080fd5b50565b60008135905061409981614073565b92915050565b6000602082840312156140b5576140b4613ce8565b5b60006140c38482850161408a565b91505092915050565b600060ff82169050919050565b6140e2816140cc565b82525050565b60006020820190506140fd60008301846140d9565b92915050565b600060c0820190506141186000830189613f68565b6141256020830188613f68565b6141326040830187613f68565b61413f6060830186613f68565b61414c6080830185613f68565b61415960a0830184613f3e565b979650505050505050565b6000806040838503121561417b5761417a613ce8565b5b600061418985828601613edd565b925050602061419a8582860161408a565b9150509250929050565b600080604083850312156141bb576141ba613ce8565b5b60006141c985828601613d13565b92505060206141da85828601613d13565b9150509250929050565b6141ed81613eb4565b82525050565b600060208201905061420860008301846141e4565b92915050565b6000806040838503121561422557614224613ce8565b5b600061423385828601613edd565b925050602061424485828601613edd565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614284602083613dc0565b915061428f8261424e565b602082019050919050565b600060208201905081810360008301526142b381614277565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061432382613cf2565b915061432e83613cf2565b92508261433e5761433d6142ba565b5b828204905092915050565b600061435482613cf2565b915061435f83613cf2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614398576143976142e9565b5b828202905092915050565b60006143ae82613cf2565b91506143b983613cf2565b92508282019050808211156143d1576143d06142e9565b5b92915050565b60006143e282613cf2565b91506143ed83613cf2565b9250828203905081811115614405576144046142e9565b5b92915050565b7f4e6f742079657420756e6c6f636b656400000000000000000000000000000000600082015250565b6000614441601083613dc0565b915061444c8261440b565b602082019050919050565b6000602082019050818103600083015261447081614434565b9050919050565b60008151905061448681613cfc565b92915050565b6000602082840312156144a2576144a1613ce8565b5b60006144b084828501614477565b91505092915050565b60006040820190506144ce60008301856141e4565b6144db6020830184613f68565b9392505050565b6000815190506144f181614073565b92915050565b60006020828403121561450d5761450c613ce8565b5b600061451b848285016144e2565b91505092915050565b7f5472616e73666572206578636565647320616c6c6f77616e6365000000000000600082015250565b600061455a601a83613dc0565b915061456582614524565b602082019050919050565b600060208201905081810360008301526145898161454d565b9050919050565b60006040820190506145a560008301856141e4565b6145b26020830184613f3e565b9392505050565b60008160011c9050919050565b6000808291508390505b6001851115614610578086048111156145ec576145eb6142e9565b5b60018516156145fb5780820291505b8081029050614609856145b9565b94506145d0565b94509492505050565b60008261462957600190506146e5565b8161463757600090506146e5565b816001811461464d576002811461465757614686565b60019150506146e5565b60ff841115614669576146686142e9565b5b8360020a9150848211156146805761467f6142e9565b5b506146e5565b5060208310610133831016604e8410600b84101617156146bb5782820a9050838111156146b6576146b56142e9565b5b6146e5565b6146c884848460016145c6565b925090508184048111156146df576146de6142e9565b5b81810290505b9392505050565b60006146f782613cf2565b9150614702836140cc565b925061472f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614619565b905092915050565b600060408201905061474c6000830185613f68565b6147596020830184613f68565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147bc602683613dc0565b91506147c782614760565b604082019050919050565b600060208201905081810360008301526147eb816147af565b9050919050565b7f7472616e736665722066726f6d207a65726f0000000000000000000000000000600082015250565b6000614828601283613dc0565b9150614833826147f2565b602082019050919050565b600060208201905081810360008301526148578161481b565b9050919050565b7f7472616e7366657220746f207a65726f00000000000000000000000000000000600082015250565b6000614894601083613dc0565b915061489f8261485e565b602082019050919050565b600060208201905081810360008301526148c381614887565b9050919050565b7f616d6f756e74207a65726f000000000000000000000000000000000000000000600082015250565b6000614900600b83613dc0565b915061490b826148ca565b602082019050919050565b6000602082019050818103600083015261492f816148f3565b9050919050565b600081905092915050565b50565b6000614951600083614936565b915061495c82614941565b600082019050919050565b600061497282614944565b9150819050919050565b7f5472616e7366657220657863656564732042616c616e63650000000000000000600082015250565b60006149b2601883613dc0565b91506149bd8261497c565b602082019050919050565b600060208201905081810360008301526149e1816149a5565b9050919050565b7f4d61785458000000000000000000000000000000000000000000000000000000600082015250565b6000614a1e600583613dc0565b9150614a29826149e8565b602082019050919050565b60006020820190508181036000830152614a4d81614a11565b9050919050565b7f6d61782057616c6c657400000000000000000000000000000000000000000000600082015250565b6000614a8a600a83613dc0565b9150614a9582614a54565b602082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614b2d81613ec6565b92915050565b600060208284031215614b4957614b48613ce8565b5b6000614b5784828501614b1e565b91505092915050565b6000819050919050565b6000819050919050565b6000614b8f614b8a614b8584614b60565b614b6a565b613cf2565b9050919050565b614b9f81614b74565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614bda81613eb4565b82525050565b6000614bec8383614bd1565b60208301905092915050565b6000602082019050919050565b6000614c1082614ba5565b614c1a8185614bb0565b9350614c2583614bc1565b8060005b83811015614c56578151614c3d8882614be0565b9750614c4883614bf8565b925050600181019050614c29565b5085935050505092915050565b600060a082019050614c786000830188613f68565b614c856020830187614b96565b8181036040830152614c978186614c05565b9050614ca660608301856141e4565b614cb36080830184613f68565b9695505050505050565b600080fd5b614ccb82613dfb565b810181811067ffffffffffffffff82111715614cea57614ce9614ac0565b5b80604052505050565b6000614cfd613cde565b9050614d098282614cc2565b919050565b600067ffffffffffffffff821115614d2957614d28614ac0565b5b602082029050602081019050919050565b600080fd5b6000614d52614d4d84614d0e565b614cf3565b90508083825260208201905060208402830185811115614d7557614d74614d3a565b5b835b81811015614d9e5780614d8a8882614477565b845260208401935050602081019050614d77565b5050509392505050565b600082601f830112614dbd57614dbc614cbd565b5b8151614dcd848260208601614d3f565b91505092915050565b600060208284031215614dec57614deb613ce8565b5b600082015167ffffffffffffffff811115614e0a57614e09613ced565b5b614e1684828501614da8565b91505092915050565b600060c082019050614e3460008301896141e4565b614e416020830188613f68565b614e4e6040830187614b96565b614e5b6060830186614b96565b614e6860808301856141e4565b614e7560a0830184613f68565b979650505050505050565b600080600060608486031215614e9957614e98613ce8565b5b6000614ea786828701614477565b9350506020614eb886828701614477565b9250506040614ec986828701614477565b915050925092509256fea26469706673582212209a781c1f3b6c72a50b938da79fc7b3e1bed0ea9981590fb3670febbd92f2cf3a64736f6c63430008100033

Deployed ByteCode

0x60806040526004361061028c5760003560e01c80636612e66f1161015a578063a9b434d9116100c1578063d726059f1161007a578063d726059f14610a29578063db2c08b414610a52578063dd62ed3e14610a8f578063ebae7c1c14610acc578063f2fde38b14610af7578063f8b45b0514610b2057610293565b8063a9b434d9146108e3578063a9d3cd8a14610920578063aa45b09c14610949578063ad9200b114610986578063cafcb679146109c3578063cfd1940e14610a0057610293565b8063893d20e811610113578063893d20e8146107bf5780638da5cb5b146107ea5780639515ff2a1461081557806395d89b411461083e578063a457c2d714610869578063a9059cbb146108a657610293565b80636612e66f146106c357806368707c98146106ec57806370a0823114610715578063715018a61461075257806375f0a8741461076957806388d28b771461079457610293565b80632d99812a116101fe578063409d96ae116101b7578063409d96ae146105b057806346e35f03146105d95780635304757b146106045780635a9b0b891461062d5780635c1ed6061461065d5780635d7b47e11461068657610293565b80632d99812a146104a4578063313ce567146104cd5780633227925f146104f8578063324c7bdd1461052157806332955a671461054a578063395093511461057357610293565b806318160ddd1161025057806318160ddd146103695780631b23f762146103945780631d5165cf146103d15780631e743d18146103fa57806323b872dd146104375780632973ef2d1461047457610293565b806304d4c990146102985780630612f39d146102c157806306fdde03146102d85780630918992b14610303578063095ea7b31461032c57610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613d28565b610b4b565b005b3480156102cd57600080fd5b506102d6610cb2565b005b3480156102e457600080fd5b506102ed610ec0565b6040516102fa9190613e45565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613e67565b610efd565b005b34801561033857600080fd5b50610353600480360381019061034e9190613ef2565b610fce565b6040516103609190613f4d565b60405180910390f35b34801561037557600080fd5b5061037e610fe5565b60405161038b9190613f77565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613f92565b611004565b6040516103c89190613f77565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190613f92565b61101c565b005b34801561040657600080fd5b50610421600480360381019061041c9190613f92565b611120565b60405161042e9190613f4d565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613fbf565b611140565b60405161046b9190613f4d565b60405180910390f35b34801561048057600080fd5b50610489611233565b60405161049b96959493929190614012565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c6919061409f565b611262565b005b3480156104d957600080fd5b506104e261132b565b6040516104ef91906140e8565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a9190613e67565b611334565b005b34801561052d57600080fd5b5061054860048036038101906105439190613e67565b6113c0565b005b34801561055657600080fd5b50610571600480360381019061056c9190613e67565b61144c565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613ef2565b611510565b6040516105a79190613f4d565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613f92565b6115ae565b005b3480156105e557600080fd5b506105ee6117b1565b6040516105fb9190613f4d565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190613e67565b61183d565b005b34801561063957600080fd5b506106426118d5565b60405161065496959493929190614103565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f9190613e67565b611911565b005b34801561069257600080fd5b506106ad60048036038101906106a89190613f92565b61198d565b6040516106ba9190613f77565b60405180910390f35b3480156106cf57600080fd5b506106ea60048036038101906106e59190614164565b6119a5565b005b3480156106f857600080fd5b50610713600480360381019061070e91906141a4565b611aef565b005b34801561072157600080fd5b5061073c60048036038101906107379190613f92565b611c27565b6040516107499190613f77565b60405180910390f35b34801561075e57600080fd5b50610767611d12565b005b34801561077557600080fd5b5061077e611e45565b60405161078b91906141f3565b60405180910390f35b3480156107a057600080fd5b506107a9611e6b565b6040516107b69190613f77565b60405180910390f35b3480156107cb57600080fd5b506107d4611e94565b6040516107e191906141f3565b60405180910390f35b3480156107f657600080fd5b506107ff611ea3565b60405161080c91906141f3565b60405180910390f35b34801561082157600080fd5b5061083c60048036038101906108379190614164565b611ecc565b005b34801561084a57600080fd5b50610853612055565b6040516108609190613e45565b60405180910390f35b34801561087557600080fd5b50610890600480360381019061088b9190613ef2565b612092565b60405161089d9190613f4d565b60405180910390f35b3480156108b257600080fd5b506108cd60048036038101906108c89190613ef2565b612142565b6040516108da9190613f4d565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613f92565b612159565b6040516109179190613f4d565b60405180910390f35b34801561092c57600080fd5b5061094760048036038101906109429190614164565b612179565b005b34801561095557600080fd5b50610970600480360381019061096b9190613e67565b6122dc565b60405161097d9190613f77565b60405180910390f35b34801561099257600080fd5b506109ad60048036038101906109a89190613e67565b61230f565b6040516109ba9190613f77565b60405180910390f35b3480156109cf57600080fd5b506109ea60048036038101906109e59190613f92565b612342565b6040516109f79190613f4d565b60405180910390f35b348015610a0c57600080fd5b50610a276004803603810190610a229190613e67565b612362565b005b348015610a3557600080fd5b50610a506004803603810190610a4b9190613e67565b612433565b005b348015610a5e57600080fd5b50610a796004803603810190610a749190613f92565b6124f9565b604051610a869190613f77565b60405180910390f35b348015610a9b57600080fd5b50610ab66004803603810190610ab1919061420e565b612511565b604051610ac39190613f77565b60405180910390f35b348015610ad857600080fd5b50610ae1612598565b604051610aee9190613f77565b60405180910390f35b348015610b0357600080fd5b50610b1e6004803603810190610b199190613f92565b61259e565b005b348015610b2c57600080fd5b50610b3561273f565b604051610b429190613f77565b60405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff16610b6a611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb79061429a565b60405180910390fd5b6000600a6064612710610bd39190614318565b610bdd9190614349565b9050808711158015610bef5750808611155b8015610bfb5750808511155b610c0457600080fd5b612710828486610c1491906143a3565b610c1e91906143a3565b14610c2857600080fd5b866008819055508560098190555084600a8190555083600c8190555082600d8190555081600b81905550600c54612710610c6291906143d7565b600e819055507f95617e149b678679d65360792e6610c8fc9add72efd72fc3c8d94792801ca5c9878787878787604051610ca196959493929190614012565b60405180910390a150505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16610cd1611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e9061429a565b60405180910390fd5b601354421015610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390614457565b60405180910390fd5b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dce91906141f3565b602060405180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f919061448c565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610e4c9291906144b9565b6020604051808303816000875af1158015610e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f91906144f7565b507f28bacca46f5c57fe13623e9d5093cb2fab892814aca9b39384ab86550d9aa67560405160405180910390a15050565b60606040518060400160405280600781526020017f486f74446f676500000000000000000000000000000000000000000000000000815250905090565b3373ffffffffffffffffffffffffffffffffffffffff16610f1c611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f699061429a565b60405180910390fd5b6012544210610f8057600080fd5b42811015610f8d57600080fd5b806012819055507f818d823b27cf035ff2e055a65b6227b854203322ac5dbd674add6aa0d9d657d181604051610fc39190613f77565b60405180910390a150565b6000610fdb338484612745565b6001905092915050565b6000610ff26017546122dc565b601854610fff91906143a3565b905090565b60016020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff1661103b611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110889061429a565b60405180910390fd5b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa84eeda79ee9db5fc195488a69e6981aa457299570e28a92392eb9c84e005d79738660a233a477aaa025e5207fbf32119326ed121b60405161111591906141f3565b60405180910390a150565b60046020528060005260406000206000915054906101000a900460ff1681565b600061114d8484846128a2565b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890614570565b60405180910390fd5b6112278533858461122291906143d7565b612745565b60019150509392505050565b60008060008060008060085495506009549450600a549350600c549250600d549150600b549050909192939495565b3373ffffffffffffffffffffffffffffffffffffffff16611281611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce9061429a565b60405180910390fd5b80601160006101000a81548160ff0219169083151502179055507fa1334f73b4ca3b2391bae4d1db09bf2b9697a0ea492081a8a94206d8ec8384f0816040516113209190613f4d565b60405180910390a150565b60006009905090565b3373ffffffffffffffffffffffffffffffffffffffff16611353611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a09061429a565b60405180910390fd5b6113bd42826113b891906143a3565b612433565b50565b3373ffffffffffffffffffffffffffffffffffffffff166113df611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c9061429a565b60405180910390fd5b611449814261144491906143a3565b610efd565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661146b611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b89061429a565b60405180910390fd5b61271081106114cf57600080fd5b806010819055507fb46c8769af693755739d87a719196ddb7961844f19fc54dbad7b9d97690b7b5e816040516115059190613f77565b60405180910390a150565b60006115a4338484600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461159f91906143a3565b612745565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166115cd611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a9061429a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156116ad5750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6116b657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161170c91906141f3565b602060405180830381865afa158015611729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174d919061448c565b6040518363ffffffff1660e01b815260040161176a9291906144b9565b6020604051808303816000875af1158015611789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad91906144f7565b5050565b60006127106010546117c1610fe5565b6117cb9190614349565b6117d59190614318565b60026000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411905090565b3373ffffffffffffffffffffffffffffffffffffffff1661185c611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a99061429a565b60405180910390fd5b6000600f54905081600f819055506118ca6001612aef565b80600f819055505050565b600080600080600080600f5495506010549450601254935060185491506017549250601160009054906101000a900460ff169050909192939495565b61191b3382612d6a565b61192481612f14565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119829190613f77565b60405180910390a350565b60056020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff166119c4611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a119061429a565b60405180910390fd5b8080611a5257503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611a5b57600080fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe8b454213ef316b3de93adc4e156b9aa662bb0ab7b22bcdae2e2f95b9311da668282604051611ae3929190614590565b60405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff16611b0e611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b9061429a565b60405180910390fd5b678ac7230489e800006009600a611b7b91906146ec565b633b9aca00611b8a9190614349565b611b949190614318565b821015611ba057600080fd5b678ac7230489e800006009600a611bb791906146ec565b633b9aca00611bc69190614349565b611bd09190614318565b811015611bdc57600080fd5b81601581905550806016819055507fc951fd5f6c1738a40b939a6515d5082a37d60fcda98a7003c2cc4665d10219c98183604051611c1b929190614737565b60405180910390a15050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611cc257600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611d0d565b611d0a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122dc565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16611d31611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e9061429a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601354421015611e8c5742601354611e8591906143d7565b9050611e91565b600090505b90565b6000611e9e611ea3565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611eeb611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f389061429a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611fcb5750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611fd457600080fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361200e57600080fd5b6120188282612f65565b7fddf34c728783f45f37f9f67e80e1d3339edb7190424dad8a0a1604c1ed6e45498282604051612049929190614590565b60405180910390a15050565b60606040518060400160405280600781526020017f484f54444f474500000000000000000000000000000000000000000000000000815250905090565b600080600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561212157600080fd5b6121373385858461213291906143d7565b612745565b600191505092915050565b600061214f3384846128a2565b6001905092915050565b60036020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16612198611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e59061429a565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361224857600080fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9bc33cbedb7a42664c57f18776a53a203914f24bc418ec98ff073f30cca2b78582826040516122d0929190614590565b60405180910390a15050565b6000700100000000000000000000000000000000601454836122fe9190614349565b6123089190614318565b9050919050565b6000601454700100000000000000000000000000000000836123319190614349565b61233b9190614318565b9050919050565b60076020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16612381611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce9061429a565b60405180910390fd5b60646127106123e69190614318565b8111156123f257600080fd5b80600f819055507f8e6b6d7a8d988561ab8631507fccb15b88a362a07e65f58071b9feb983436802816040516124289190613f77565b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff16612452611ea3565b73ffffffffffffffffffffffffffffffffffffffff16146124a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249f9061429a565b60405180910390fd5b60135481116124b657600080fd5b806013819055507f8ff9dc93846a022986f54e8f219a1fa780225726858e39e850da826852b4042e6013546040516124ee9190613f77565b60405180910390a150565b60026020528060005260406000206000915090505481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60165481565b3373ffffffffffffffffffffffffffffffffffffffff166125bd611ea3565b73ffffffffffffffffffffffffffffffffffffffff1614612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a9061429a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612679906147d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60155481565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361277e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127b757600080fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516128959190613f77565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129089061483e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612977906148aa565b60405180910390fd5b600081116129c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ba90614916565b60405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a645750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612a7957612a748383836131ff565b612a85565b612a84838383613218565b5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612ae29190613f77565b60405180910390a3505050565b6001601b60146101000a81548160ff0219169083151502179055506000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600e5403612b5e5750612d4c565b6000612710600f5460026000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd29190614349565b612bdc9190614318565b905080821015612bfc578215612bf457819050612bfb565b5050612d4c565b5b6000612c066117b1565b612c2a57600e54600d5483612c1b9190614349565b612c259190614318565b612c2d565b60005b905060008183612c3d91906143d7565b90506000600283612c4e9190614318565b905060008282612c5e91906143a3565b905060008103612c7357505050505050612d4c565b612c7c81613711565b60004790506000828483612c909190614349565b612c9a9190614318565b90506000811115612cb057612caf84826139e1565b5b6000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051612cf890614967565b60006040518083038185875af1925050503d8060008114612d35576040519150601f19603f3d011682016040523d82523d6000602084013e612d3a565b606091505b50509050600190505050505050505050505b6000601b60146101000a81548160ff02191690831515021790555050565b6000612d7583611c27565b905080821115612dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db1906149c8565b60405180910390fd5b60008282612dc891906143d7565b9050600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612e895780600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508082612e6c91906143d7565b60186000828254612e7d91906143d7565b92505081905550612f0e565b6000612e948361230f565b90506000612ea18361230f565b905080600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508082612ef391906143d7565b60176000828254612f0491906143d7565b9250508190555050505b50505050565b60006017540315612f625760175470010000000000000000000000000000000082612f3f9190614349565b612f499190614318565b60146000828254612f5a91906143a3565b925050819055505b50565b801515600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503612fc157600080fd5b6000612fcc83611c27565b905081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508115613130576000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050806017600082825461308191906143d7565b925050819055506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816018600082825461312391906143a3565b92505081905550506131fa565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806018600082825461318791906143d7565b9250508190555060006131998261230f565b905080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601760008282546131f191906143a3565b92505081905550505b505050565b6132098382612d6a565b6132138282613b34565b505050565b60165481111561325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490614a34565b60405180910390fd5b60125442101561326c57600080fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600081156133ae576201518060125461332791906143a3565b4210156133a3576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508060125461338091906143a3565b4210156133975761339081613c90565b915061339d565b60095491505b506133a9565b60095490505b6135e0565b82156134f45761012c6012546133c491906143a3565b421015613493576000600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036134925760004261012c60125461342591906143a3565b61342f91906143d7565b905061012c81620151806134439190614349565b61344d9190614318565b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b5b6008549050601554846134a587611c27565b6134af91906143a3565b106134ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e690614aa0565b60405180910390fd5b6135df565b6201518060125461350591906143a3565b421015613581576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508060125461355e91906143a3565b4210156135755761356e81613c90565b915061357b565b600a5491505b50613587565b600a5490505b6015548461359487611c27565b61359e91906143a3565b106135de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d590614aa0565b60405180910390fd5b5b5b601b60149054906101000a900460ff1615801561364b5750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156136645750601160009054906101000a900460ff16155b15613674576136736000612aef565b5b600061271082866136859190614349565b61368f9190614318565b90506000612710600e54836136a49190614349565b6136ae9190614318565b9050600081836136be91906143d7565b90506136ca8988612d6a565b6136df8884896136da91906143d7565b613b34565b60008211156136f3576136f23083613b34565b5b60008111156137065761370581612f14565b5b505050505050505050565b6000600267ffffffffffffffff81111561372e5761372d614ac0565b5b60405190808252806020026020018201604052801561375c5781602001602082028036833780820191505090505b509050308160008151811061377457613773614aef565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561381b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383f9190614b33565b8160018151811061385357613852614aef565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe58360008430426040518663ffffffff1660e01b8152600401613994959493929190614c63565b6000604051808303816000875af11580156139b3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906139dc9190614dd6565b505050565b81600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b8152600401613aeb96959493929190614e1f565b60606040518083038185885af193505050508015613b2757506040513d601f19601f82011682018060405250810190613b249190614e80565b60015b15613b30575050505b5050565b6000613b3f83611c27565b905060008282613b4f91906143a3565b9050600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613c055780600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508260186000828254613bf991906143a3565b92505081905550613c8a565b6000613c108361230f565b90506000613c1d8361230f565b905080600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508181613c6f91906143d7565b60176000828254613c8091906143a3565b9250508190555050505b50505050565b60008060125442613ca191906143d7565b90508281600954612710613cb591906143d7565b613cbf9190614349565b613cc99190614318565b612710613cd691906143d7565b915050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613d0581613cf2565b8114613d1057600080fd5b50565b600081359050613d2281613cfc565b92915050565b60008060008060008060c08789031215613d4557613d44613ce8565b5b6000613d5389828a01613d13565b9650506020613d6489828a01613d13565b9550506040613d7589828a01613d13565b9450506060613d8689828a01613d13565b9350506080613d9789828a01613d13565b92505060a0613da889828a01613d13565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b60005b83811015613def578082015181840152602081019050613dd4565b60008484015250505050565b6000601f19601f8301169050919050565b6000613e1782613db5565b613e218185613dc0565b9350613e31818560208601613dd1565b613e3a81613dfb565b840191505092915050565b60006020820190508181036000830152613e5f8184613e0c565b905092915050565b600060208284031215613e7d57613e7c613ce8565b5b6000613e8b84828501613d13565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ebf82613e94565b9050919050565b613ecf81613eb4565b8114613eda57600080fd5b50565b600081359050613eec81613ec6565b92915050565b60008060408385031215613f0957613f08613ce8565b5b6000613f1785828601613edd565b9250506020613f2885828601613d13565b9150509250929050565b60008115159050919050565b613f4781613f32565b82525050565b6000602082019050613f626000830184613f3e565b92915050565b613f7181613cf2565b82525050565b6000602082019050613f8c6000830184613f68565b92915050565b600060208284031215613fa857613fa7613ce8565b5b6000613fb684828501613edd565b91505092915050565b600080600060608486031215613fd857613fd7613ce8565b5b6000613fe686828701613edd565b9350506020613ff786828701613edd565b925050604061400886828701613d13565b9150509250925092565b600060c0820190506140276000830189613f68565b6140346020830188613f68565b6140416040830187613f68565b61404e6060830186613f68565b61405b6080830185613f68565b61406860a0830184613f68565b979650505050505050565b61407c81613f32565b811461408757600080fd5b50565b60008135905061409981614073565b92915050565b6000602082840312156140b5576140b4613ce8565b5b60006140c38482850161408a565b91505092915050565b600060ff82169050919050565b6140e2816140cc565b82525050565b60006020820190506140fd60008301846140d9565b92915050565b600060c0820190506141186000830189613f68565b6141256020830188613f68565b6141326040830187613f68565b61413f6060830186613f68565b61414c6080830185613f68565b61415960a0830184613f3e565b979650505050505050565b6000806040838503121561417b5761417a613ce8565b5b600061418985828601613edd565b925050602061419a8582860161408a565b9150509250929050565b600080604083850312156141bb576141ba613ce8565b5b60006141c985828601613d13565b92505060206141da85828601613d13565b9150509250929050565b6141ed81613eb4565b82525050565b600060208201905061420860008301846141e4565b92915050565b6000806040838503121561422557614224613ce8565b5b600061423385828601613edd565b925050602061424485828601613edd565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614284602083613dc0565b915061428f8261424e565b602082019050919050565b600060208201905081810360008301526142b381614277565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061432382613cf2565b915061432e83613cf2565b92508261433e5761433d6142ba565b5b828204905092915050565b600061435482613cf2565b915061435f83613cf2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614398576143976142e9565b5b828202905092915050565b60006143ae82613cf2565b91506143b983613cf2565b92508282019050808211156143d1576143d06142e9565b5b92915050565b60006143e282613cf2565b91506143ed83613cf2565b9250828203905081811115614405576144046142e9565b5b92915050565b7f4e6f742079657420756e6c6f636b656400000000000000000000000000000000600082015250565b6000614441601083613dc0565b915061444c8261440b565b602082019050919050565b6000602082019050818103600083015261447081614434565b9050919050565b60008151905061448681613cfc565b92915050565b6000602082840312156144a2576144a1613ce8565b5b60006144b084828501614477565b91505092915050565b60006040820190506144ce60008301856141e4565b6144db6020830184613f68565b9392505050565b6000815190506144f181614073565b92915050565b60006020828403121561450d5761450c613ce8565b5b600061451b848285016144e2565b91505092915050565b7f5472616e73666572206578636565647320616c6c6f77616e6365000000000000600082015250565b600061455a601a83613dc0565b915061456582614524565b602082019050919050565b600060208201905081810360008301526145898161454d565b9050919050565b60006040820190506145a560008301856141e4565b6145b26020830184613f3e565b9392505050565b60008160011c9050919050565b6000808291508390505b6001851115614610578086048111156145ec576145eb6142e9565b5b60018516156145fb5780820291505b8081029050614609856145b9565b94506145d0565b94509492505050565b60008261462957600190506146e5565b8161463757600090506146e5565b816001811461464d576002811461465757614686565b60019150506146e5565b60ff841115614669576146686142e9565b5b8360020a9150848211156146805761467f6142e9565b5b506146e5565b5060208310610133831016604e8410600b84101617156146bb5782820a9050838111156146b6576146b56142e9565b5b6146e5565b6146c884848460016145c6565b925090508184048111156146df576146de6142e9565b5b81810290505b9392505050565b60006146f782613cf2565b9150614702836140cc565b925061472f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614619565b905092915050565b600060408201905061474c6000830185613f68565b6147596020830184613f68565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147bc602683613dc0565b91506147c782614760565b604082019050919050565b600060208201905081810360008301526147eb816147af565b9050919050565b7f7472616e736665722066726f6d207a65726f0000000000000000000000000000600082015250565b6000614828601283613dc0565b9150614833826147f2565b602082019050919050565b600060208201905081810360008301526148578161481b565b9050919050565b7f7472616e7366657220746f207a65726f00000000000000000000000000000000600082015250565b6000614894601083613dc0565b915061489f8261485e565b602082019050919050565b600060208201905081810360008301526148c381614887565b9050919050565b7f616d6f756e74207a65726f000000000000000000000000000000000000000000600082015250565b6000614900600b83613dc0565b915061490b826148ca565b602082019050919050565b6000602082019050818103600083015261492f816148f3565b9050919050565b600081905092915050565b50565b6000614951600083614936565b915061495c82614941565b600082019050919050565b600061497282614944565b9150819050919050565b7f5472616e7366657220657863656564732042616c616e63650000000000000000600082015250565b60006149b2601883613dc0565b91506149bd8261497c565b602082019050919050565b600060208201905081810360008301526149e1816149a5565b9050919050565b7f4d61785458000000000000000000000000000000000000000000000000000000600082015250565b6000614a1e600583613dc0565b9150614a29826149e8565b602082019050919050565b60006020820190508181036000830152614a4d81614a11565b9050919050565b7f6d61782057616c6c657400000000000000000000000000000000000000000000600082015250565b6000614a8a600a83613dc0565b9150614a9582614a54565b602082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614b2d81613ec6565b92915050565b600060208284031215614b4957614b48613ce8565b5b6000614b5784828501614b1e565b91505092915050565b6000819050919050565b6000819050919050565b6000614b8f614b8a614b8584614b60565b614b6a565b613cf2565b9050919050565b614b9f81614b74565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614bda81613eb4565b82525050565b6000614bec8383614bd1565b60208301905092915050565b6000602082019050919050565b6000614c1082614ba5565b614c1a8185614bb0565b9350614c2583614bc1565b8060005b83811015614c56578151614c3d8882614be0565b9750614c4883614bf8565b925050600181019050614c29565b5085935050505092915050565b600060a082019050614c786000830188613f68565b614c856020830187614b96565b8181036040830152614c978186614c05565b9050614ca660608301856141e4565b614cb36080830184613f68565b9695505050505050565b600080fd5b614ccb82613dfb565b810181811067ffffffffffffffff82111715614cea57614ce9614ac0565b5b80604052505050565b6000614cfd613cde565b9050614d098282614cc2565b919050565b600067ffffffffffffffff821115614d2957614d28614ac0565b5b602082029050602081019050919050565b600080fd5b6000614d52614d4d84614d0e565b614cf3565b90508083825260208201905060208402830185811115614d7557614d74614d3a565b5b835b81811015614d9e5780614d8a8882614477565b845260208401935050602081019050614d77565b5050509392505050565b600082601f830112614dbd57614dbc614cbd565b5b8151614dcd848260208601614d3f565b91505092915050565b600060208284031215614dec57614deb613ce8565b5b600082015167ffffffffffffffff811115614e0a57614e09613ced565b5b614e1684828501614da8565b91505092915050565b600060c082019050614e3460008301896141e4565b614e416020830188613f68565b614e4e6040830187614b96565b614e5b6060830186614b96565b614e6860808301856141e4565b614e7560a0830184613f68565b979650505050505050565b600080600060608486031215614e9957614e98613ce8565b5b6000614ea786828701614477565b9350506020614eb886828701614477565b9250506040614ec986828701614477565b915050925092509256fea26469706673582212209a781c1f3b6c72a50b938da79fc7b3e1bed0ea9981590fb3670febbd92f2cf3a64736f6c63430008100033