Contract 0x51101D96c0b0c6338f5ECCe28c5b098D4223C31d

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xe4ff608ca2b609f3672bdcb6c79da8d1cb9588d23e220cdaeaa1130f08ebd4daTransfer102819842021-08-23 14:24:54106 days 21 hrs ago0x63fb6cf7b4d8a49b957b36296a3afee903630579 IN  0x51101d96c0b0c6338f5ecce28c5b098d4223c31d0 BNB0.00011524
0xa1d45640e96eb929a85c833451d52cdc38026cf663e33817abda87f8acd3bc570x60806040101108982021-08-17 15:02:01112 days 20 hrs ago0x72f10e14fb20f15d495082866ffb37acddc40144 IN  Contract Creation0 BNB0.039044135
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ARMADA

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-08-17
*/

/**
 * SPDX-License-Identifier: MIT
 */ 
pragma solidity ^0.8.6;

/*                                >  Armada  <
*
*                  Introducing The Time Designed Smart Contract
*
*    A HYPER-DEFLATIONARY, WARCHEST POWERED CRYPTOCURRENCY WITH LIQUID FEES
*
*                           https://armadacrypto.com
*                           https://t.me/armadatoken
*
*                  This is the FINAL CONTRACT VERSION for ARMD
*
//                       AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//                       AAAAAAAAAAAAAA  AAAAAAAAAAAAA
//                       AAAAAAAAAAAAA    AAAAAAAAAAAA
//                       AAAAAAAAAAAA      AAAAAAAAAAA
//                       AAAAAAAAAAA        AAAAAAAAAA
//                       AAAAAAAAAA          AAAAAAAAA
//                       AAAAAAAAA     AA     AAAAAAAA
//                       AAAAAAAA     AAAA     AAAAAAA
//                       AAAAAAA     AAAAAA     AAAAAA
//                       AAAAAA     AAAAAAAA    AAAAAA
//                       AAAAA     AAAAAAAAAA    AAAAA
//                       AAAA     AAAAAAAAAAAA    AAAA
//                       AAA     AAAAAAAAAAAAAA    AAA
//                       AAA    AAAAAAAAAAAAAAAA   AAA
//                       AAA   MMMMMMMMMMMMMMMMM   AAA
//                       AAA   MMMMMMMMMMMMMMMMM   AAA
//                       AAA   MMMMMMMM  MMMMMMM   AAA
//                       AAA   MMMMMMM    MMMMMM   AAA
//                       AAA   MMMMM       MMMMM   AAA
//                       AAA   MMMM   MMMM  MMMM   AAA
//                       AAA   MM   MMMMMMM   MM   AAA
//                       AAA      MMMMMMMMMMM      AAA
//                       AAA     MMMMMMMMMMMMMM    AAA
//                       AAA   MMMMMMMMMMMMMMMMM   AAA
//                       AAAMMMMMMMMMMMMMMMMMMMMMMMAAA

*                            -  Time is Currency  -
*                           - Armada is on a Voyage -

*/library SafeMath {

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }


    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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


    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }


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

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

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {return msg.sender;}
    function _msgData() internal view virtual returns (bytes calldata) {this; return msg.data;}
}

library Address {
    function isContract(address account) internal view returns (bool) { 
        uint256 size; assembly { size := extcodesize(account) } return size > 0;
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");(bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
        
    }
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
        
    }
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
        
    }
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) { return returndata; } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {revert(errorMessage);}
        }
    }
}

abstract contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

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

    function owner() public view returns (address) {
        return _owner;
    }   
    
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }
    
    function getTime() public view returns (uint256) {
        return block.timestamp;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime , "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

interface IPancakeV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IPancakeV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

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

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

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

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


abstract contract DepreciatingFees {
    using SafeMath for uint256;
    
    struct FeeStruct {
        uint256 FleetRewardsFee;
        uint256 WarChestFee;
        uint256 MarketingChestFee;
        uint256 MuntinyFee;
        bool exist;
        uint256 lastUpdated;
        uint256 nextReductionTime;
        uint256 amount;
    }
    
    mapping(address => FeeStruct) public fees;
    address[] feeholders;
    mapping (address => uint256) feeholdersIndexes;
    
    event LogNewFeeHolder(address indexed _userAddress, uint256 _FleetRewardsFee, uint256 _WarChestFee, 
    uint256 _MarketingChestFee, uint256 _MuntinyFee, uint256 _amount);
    
    event LogUpdateFeeHolder(address indexed _userAddress, uint256 _FleetRewardsFee, uint256 _WarChestFee, 
    uint256 _MarketingChestFee, uint256 _MuntinyFee, uint256 _amount, uint256 _lastUpdated, uint256 _nextReductionTime);
    

    uint256 internal reductionPerSec = 39; //0.00000039 per second
    uint256 internal reductionDivisor = 10**8; // reduction multiplier
    uint256 internal updateFeeTime = 1; // every second
    uint256 internal FEES_DIVISOR = 10**10; // gives you the true percentage
    
    uint256 public FleetRewardsFee = 2;
    uint256 public WarChestFee = 12;
    uint256 public MarketingChestFee = 2;
    uint256 public MuntinyFee = 14;
    
    uint256 internal FleetRewardsFee_ = FleetRewardsFee * reductionDivisor;
    uint256 internal WarChestFee_ = WarChestFee * reductionDivisor;
    uint256 internal MarketingChestFee_ = MarketingChestFee * reductionDivisor;
    uint256 internal MuntinyFee_ = MuntinyFee * reductionDivisor;
    
    uint256 internal baseTotalFees = WarChestFee_.add(FleetRewardsFee_).add(MarketingChestFee_);
    uint256 internal baseSellerTotalFees = baseTotalFees.add(MuntinyFee_);
    
    
    function _getHolderFees (address _userAddress, bool feeReduction) internal view returns 
    (uint256, uint256, uint256, uint256, uint256) {
        
        (uint256 _estimatedFleetRewardsFee, uint256 _estimatedWarChestFee, uint256 _estimatedMarketingChestFee, 
            uint256 _estimatedMuntinyFee, uint256 _estimatedAccruedFees) = getEstimatedFee(_userAddress);

        // if it's user's first time use the default fee else use the estimate
        uint256 getFleetRewardsFee = !feeReduction ? FleetRewardsFee_ : _estimatedFleetRewardsFee;
        uint256 getWarChestFee = !feeReduction ? WarChestFee_ : _estimatedWarChestFee;
        uint256 getMarketingChestFee = !feeReduction ? MarketingChestFee_ : _estimatedMarketingChestFee;

        uint256 getMuntinyFee = !feeReduction ? MuntinyFee_ :  _estimatedMuntinyFee;
        uint256 getReducedFee  = !feeReduction ? reductionPerSec : _estimatedAccruedFees;
        
        return (
           getFleetRewardsFee,
           getWarChestFee,
           getMarketingChestFee,
           getMuntinyFee,
           getReducedFee
            );
        
    }
    
    function setFeeHolder(address _userAddress, uint256 _amount) internal {
        uint256 fee = _amount.mul(baseTotalFees).div(FEES_DIVISOR);
        _amount = _amount.sub(fee);
        addFeeHolder(
            _userAddress, 
            FleetRewardsFee_, 
            WarChestFee_, 
            MarketingChestFee_, 
            MuntinyFee_, 
            block.timestamp, 
            block.timestamp + 1,
            _amount
            ); 
    }

    function getEstimatedFee (address _userAddress) public view returns(uint256 reduceFleetRewardsFee, uint256 reduceWarChestFee, 
    uint256 reduceMarketingChestFee, uint256 reduceMuntinyFee, uint256 estimatedAccruedFees) {
        
         // grab the fees that has accrued since last transaction
        uint256 accruedTime = block.timestamp - fees[_userAddress].lastUpdated;
        uint256 accruedFees = accruedTime.mul(reductionPerSec);
        
        return (
            fees[_userAddress].FleetRewardsFee <= accruedFees ? 0 : fees[_userAddress].FleetRewardsFee.sub(accruedFees),
            fees[_userAddress].WarChestFee <= accruedFees ? 0 : fees[_userAddress].WarChestFee.sub(accruedFees),
            fees[_userAddress].MarketingChestFee <= accruedFees ? 0 : fees[_userAddress].MarketingChestFee.sub(accruedFees),
            fees[_userAddress].MuntinyFee <= accruedFees ? 0 : fees[_userAddress].MuntinyFee.sub(accruedFees),
            accruedFees
            );
        }
    
    /*
    * The reAdjustFees takes into consideration the type of transaction
    * if the token holder is selling it uses the reduced fees.
    * if the holder wants to buy more tokens, the readjustment rate is lower.
    * It basically reduces the accruedFees gotten from getEstimatedFee based on buy
    */
    function calculateBuyingReadjustment(address _userAddress, uint256 _amount, uint256 accruedFees, uint256 _FleetRewardsFee, uint256 _WarChestFee,
    uint256 _MarketingChestFee, uint256 _MuntinyFee) internal view returns (uint256, uint256, uint256, uint256) {
        
        uint256 estimatedTotal = _FleetRewardsFee.add(_MarketingChestFee).add(_WarChestFee).add(_MuntinyFee);
        uint256 previousAmount = fees[_userAddress].amount;
        
        (uint256 newAccruedFees) = getNewAccruedFees(accruedFees, previousAmount, _amount, estimatedTotal);
        
        uint256 getFleetRewardsFee = _FleetRewardsFee.add(newAccruedFees);
        uint256 getWarChestFee = _WarChestFee.add(newAccruedFees);
        uint256 getMarketingChestFee = _MarketingChestFee.add(newAccruedFees);
        uint256 getMuntinyFee =  _MuntinyFee.add(newAccruedFees);
        
        return (
            getFleetRewardsFee,
            getWarChestFee,
            getMarketingChestFee,
            getMuntinyFee
            );
        
    }
    
    function getNewAccruedFees(uint256 accruedFees, uint256 previousAmount, uint256 _amount, uint256 estimatedTotal) 
    private view returns(uint256){
        uint256 nominalAmount = previousAmount.add(_amount);
        nominalAmount = nominalAmount >= previousAmount ? nominalAmount.sub(previousAmount) : previousAmount.sub(nominalAmount);
        nominalAmount = nominalAmount.div(10**18); // divide with decimals of token
        
        uint256 newAccruedFees;
        
        if(accruedFees > nominalAmount) {
            newAccruedFees = accruedFees.sub(nominalAmount);
        }
        else if(nominalAmount > accruedFees) {
            newAccruedFees = nominalAmount.sub(accruedFees);
        }
        else if(accruedFees == nominalAmount) {
            newAccruedFees = accruedFees > 100 ? accruedFees.sub(10**2) : accruedFees;
        }
        
        // new accruedFees cannot be greater than the previous accrued Fee
        if(newAccruedFees > accruedFees) {
            newAccruedFees = accruedFees.sub(10**2);
        }
            
        // when readjusted it cannot be greater than the sum of the default fees
        // what the default readjusts to, when completed
        if(estimatedTotal.add(accruedFees.mul(4)) > baseSellerTotalFees) {
            newAccruedFees = accruedFees > 100 ? accruedFees.sub(10**2) : accruedFees;
        }
        
        return newAccruedFees;
    }
    
    function reAdjustFees(address userAddress, uint256 _amount, uint256 accruedFees, uint256 _FleetRewardsFee, uint256 _WarChestFee,  uint256 _MarketingChestFee, 
         uint256 _MuntinyFee, bool isBuying) internal {
             
        (uint256 _newFleetRewardsFee, uint256 _newMarketingChestFee, uint256 _newWarChestFee, uint256 _newMuntinyFee) = 
            calculateBuyingReadjustment (userAddress, _amount, accruedFees, _FleetRewardsFee, _MarketingChestFee, _WarChestFee, _MuntinyFee);
         
         // new amount after readjustment   
        (uint256 __amount) = removeFeesFromAmount(userAddress, _amount, isBuying);
        
         bool _isBuying = isBuying;
         address _userAddress = userAddress;
         uint256 _accruedFees = accruedFees;
         uint256 __FleetRewardsFee = _FleetRewardsFee;
         uint256 __MarketingChestFee = _MarketingChestFee;
         uint256 __WarChestFee = _WarChestFee;
         uint256 __MuntinyFee = _MuntinyFee;
         
        updateFeeHolder( 
            _userAddress, 
            _isBuying ? _newFleetRewardsFee : __FleetRewardsFee.add(_accruedFees), 
            _isBuying ? _newWarChestFee : __WarChestFee.add(_accruedFees), 
            _isBuying ? _newMarketingChestFee : __MarketingChestFee.add(_accruedFees),  
            _isBuying ? _newMuntinyFee : __MuntinyFee.add(_accruedFees),
            _isBuying ? fees[_userAddress].amount.add(__amount) : fees[_userAddress].amount.sub(__amount),
            block.timestamp, 
            block.timestamp + updateFeeTime
            );
    }
    
  
    
    function removeFeesFromAmount(address _userAddress, uint256 _amount, bool isBuying) internal view returns(uint256){
        
      (uint256 _estimatedFleetRewardsFee, uint256 _estimatedWarChestFee, uint256 _estimatedMarketingChestFee, 
            uint256 _estimatedMuntinyFee,) = getEstimatedFee(_userAddress);
            
            // calculate the new amount (minus fees)
         // take fee
         uint256 estimatedFeeTotal = _estimatedFleetRewardsFee.add(_estimatedWarChestFee).add(_estimatedMarketingChestFee);
         estimatedFeeTotal = !isBuying ? estimatedFeeTotal.add(_estimatedMuntinyFee) : estimatedFeeTotal;
         
         uint256 fee = _amount.mul(estimatedFeeTotal).div(FEES_DIVISOR);
        _amount = _amount.sub(fee);
        return _amount;
    }

    function addFeeHolder(address _userAddress, uint256 _FleetRewardsFee, uint256 _WarChestFee, 
        uint256 _MarketingChestFee, uint256 _MuntinyFee, uint256 _lastUpdated, uint256 _nextReductionTime, uint256 _amount) internal {
        require(!isFeeHolder(_userAddress), "Fee Holder already exist!");
        feeholdersIndexes[_userAddress] = feeholders.length;
        feeholders.push(_userAddress);
        
        fees[_userAddress].FleetRewardsFee = _FleetRewardsFee; 
        fees[_userAddress].WarChestFee = _WarChestFee; 
        fees[_userAddress].MarketingChestFee = _MarketingChestFee;
        fees[_userAddress].MuntinyFee = _MuntinyFee;
        fees[_userAddress].exist = true;
        fees[_userAddress].lastUpdated = _lastUpdated; 
        fees[_userAddress].nextReductionTime = _nextReductionTime;
        fees[_userAddress].amount = _amount; 
        
        emit LogNewFeeHolder(
            _userAddress, 
            _FleetRewardsFee, 
            _WarChestFee,
            _MarketingChestFee,
            _MuntinyFee,
            _amount
            );
      }
      
    function updateFeeHolder(address _userAddress, uint256 _FleetRewardsFee, uint256 _WarChestFee, 
        uint256 _MarketingChestFee, uint256 _MuntinyFee, uint256 _lastUpdated, uint256 _nextReductionTime, uint256 _amount) internal {
        
        require(isFeeHolder(_userAddress), "Fee Holder does not exist!");
        fees[_userAddress].FleetRewardsFee = _FleetRewardsFee; 
        fees[_userAddress].WarChestFee = _WarChestFee; 
        fees[_userAddress].MarketingChestFee = _MarketingChestFee;
        fees[_userAddress].MuntinyFee = _MuntinyFee;
        fees[_userAddress].amount = _amount; 
        fees[_userAddress].lastUpdated = _lastUpdated; 
        fees[_userAddress].nextReductionTime = _nextReductionTime;
        
        
        emit LogUpdateFeeHolder(
            _userAddress, 
            _FleetRewardsFee, 
            _WarChestFee,
            _MarketingChestFee,
            _MuntinyFee,
            _amount,
            _lastUpdated,
            _nextReductionTime
           
          );
      }
    
    function isFeeHolder(address userAddress) public view returns(bool isIndeed) {
        if(feeholders.length == 0) return false;
        return (fees[userAddress].exist);
    }
    
    function getFeeholder(address _userAddress) public view returns(uint256 _FleetRewardsFee, uint256 _WarChestFee, 
        uint256 _MarketingChestFee, uint256 _MuntinyFee, uint256 _lastUpdated, uint256 _nextReductionTime, uint256 _amount)
      {
        return(
          fees[_userAddress].FleetRewardsFee, 
          fees[_userAddress].WarChestFee,
          fees[_userAddress].MarketingChestFee,
          fees[_userAddress].MuntinyFee,
          fees[_userAddress].lastUpdated,
          fees[_userAddress].nextReductionTime,
          fees[_userAddress].amount
          );
    }
    
    function getFeeHoldersCount() public view returns(uint256 count) {
        return feeholders.length;
    }
 
    
}

contract ARMADA is IERC20Metadata, DepreciatingFees, Ownable {
    using SafeMath for uint256;
    using Address for address;
    
    address public MarketingChestAddress = 0x53Ca5b603903c2f7c3953d1Db8741C6bda036278; // MarketingChest Address
    address internal deadAddress = 0x000000000000000000000000000000000000dEaD;
    address public presaleAddress = address(0);
    
    string constant _name = "Armada";
    string constant _symbol = "ARMD";
    uint8 constant _decimals = 18;
    
    uint256 private constant MAX = ~uint256(0);
    uint256 internal constant _totalSupply = 1000000000000 * 10**18;
    uint256 internal _reflectedSupply = (MAX - (MAX % _totalSupply));
    
    uint256 public collectedFeeTotal;
  
    uint256 public maxTxAmount = _totalSupply / 1000; // 0.5% of the total supply
    uint256 public maxWalletBalance = _totalSupply / 50; // 2% of the total supply
    
    bool public autoWarChestEnabled = true;
    uint256 public autoWarChestAmount = 1 * 10**18;
    bool public takeFeeEnabled = true;
    bool public isInPresale = false;
    
    uint256 public MarketingChestDivisor = MarketingChestFee;
    
    bool private swapping;
    bool public swapEnabled = true;
    uint256 public swapTokensAtAmount = 2000000 * (10**18);
    
    IPancakeV2Router public router;
    address public pair;
    
    mapping (address => uint256) internal _reflectedBalances;
    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowances;
    
    mapping (address => bool) internal _isExcludedFromFee;
    mapping (address => bool) internal _isExcludedFromRewards;
    address[] private _excluded;
    
    event UpdatePancakeswapRouter(address indexed newAddress, address indexed oldAddress);
    event WarChestEnabledUpdated(bool enabled);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event MarketingChestWalletUpdated(address indexed newMarketingChestWallet, address indexed oldMarketingChestWallet);
    
    event SwapETHForTokens(
        uint256 amountIn,
        address[] path
    );
    
    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );
    
    constructor () {
        _reflectedBalances[owner()] = _reflectedSupply;
        
        IPancakeV2Router _newPancakeRouter = IPancakeV2Router(0x10ED43C718714eb63d5aA57B78B54704E256024E);
        pair = IPancakeV2Factory(_newPancakeRouter.factory()).createPair(address(this), _newPancakeRouter.WETH());
        router = _newPancakeRouter;
        
        // exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        // exclude the owner and this contract from rewards
        _exclude(owner());
        _exclude(address(this));
        
        // exclude the pair address from rewards - we don't want to redistribute
        _exclude(pair);
        _exclude(deadAddress);
        
        _approve(owner(), address(router), ~uint256(0));
        
        emit Transfer(address(0), owner(), _totalSupply);
    }
    
    receive() external payable { }
    
    function name() external pure override returns (string memory) {
        return _name;
    }

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

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

    function totalSupply() external pure override returns (uint256) {
        return _totalSupply;
    }
    
    function balanceOf(address account) public view override returns (uint256){
        if (_isExcludedFromRewards[account]) return _balances[account];
        return tokenFromReflection(_reflectedBalances[account]);
        }
        
    function transfer(address recipient, uint256 amount) external override returns (bool){
        _transfer(_msgSender(), recipient, amount);
        return true;
        }
        
    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(_msgSender(), spender, amount);
        return true;
        }
        
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool){
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
        }
        
    function burn(uint256 amount) external {

        address sender = _msgSender();
        require(sender != address(0), "ERC20: burn from the zero address");
        require(sender != address(deadAddress), "ERC20: burn from the burn address");

        uint256 balance = balanceOf(sender);
        require(balance >= amount, "ERC20: burn amount exceeds balance");

        uint256 reflectedAmount = amount.mul(_getCurrentRate());

        // remove the amount from the sender's balance first
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(reflectedAmount);
        if (_isExcludedFromRewards[sender])
            _balances[sender] = _balances[sender].sub(amount);

        _burnTokens( sender, amount, reflectedAmount );
    }
    
    /**
     * @dev "Soft" burns the specified amount of tokens by sending them 
     * to the burn address
     */
    function _burnTokens(address sender, uint256 tBurn, uint256 rBurn) internal {

        /**
         * @dev Do not reduce _totalSupply and/or _reflectedSupply. (soft) burning by sending
         * tokens to the burn address (which should be excluded from rewards) is sufficient
         * in FleetRewards
         */ 
        _reflectedBalances[deadAddress] = _reflectedBalances[deadAddress].add(rBurn);
        if (_isExcludedFromRewards[deadAddress])
            _balances[deadAddress] = _balances[deadAddress].add(tBurn);

        /**
         * @dev Emit the event so that the burn address balance is updated (on bscscan)
         */
        emit Transfer(sender, deadAddress, tBurn);
    }
    
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "BaseFleetRewardsToken: approve from the zero address");
        require(spender != address(0), "BaseFleetRewardsToken: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    
    
     /**
     * @dev Calculates and returns the reflected amount for the given amount with or without 
     * the transfer fees (deductTransferFee true/false)
     */
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee, bool isBuying) external view returns(uint256) {
        require(tAmount <= _totalSupply, "Amount must be less than supply");
        uint256 feesSum;
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount,0);
            return rAmount;
        } else {
            feesSum = isBuying ? baseTotalFees : baseSellerTotalFees;
            (,uint256 rTransferAmount,,,) = _getValues(tAmount, feesSum);
            return rTransferAmount;
        }
    }

    /**
     * @dev Calculates and returns the amount of tokens corresponding to the given reflected amount.
     */
    function tokenFromReflection(uint256 rAmount) internal view returns(uint256) {
        require(rAmount <= _reflectedSupply, "Amount must be less than total reflections");
        uint256 currentRate = _getCurrentRate();
        return rAmount.div(currentRate);
    }
    
    function excludeFromReward(address account) external onlyOwner() {
        require(!_isExcludedFromRewards[account], "Account is not included");
        _exclude(account);
    }
    
    function _exclude(address account) internal {
        if(_reflectedBalances[account] > 0) {
            _balances[account] = tokenFromReflection(_reflectedBalances[account]);
        }
        _isExcludedFromRewards[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcludedFromRewards[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _balances[account] = 0;
                _isExcludedFromRewards[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
    
    function setExcludedFromFee(address account, bool value) external onlyOwner { 
        _isExcludedFromFee[account] = value; 
        
    }

    function _getValues(uint256 tAmount, uint256 feesSum) internal view returns (uint256, uint256, uint256, uint256, uint256) {
        
        uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR);
        uint256 tTransferAmount = tAmount.sub(tTotalFees);
        uint256 currentRate = _getCurrentRate();
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rTotalFees = tTotalFees.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rTotalFees);
        
        return (rAmount, rTransferAmount, tAmount, tTransferAmount, currentRate);
    }
    
    function _getCurrentRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }
    
    function _getCurrentSupply() internal view returns(uint256, uint256) {
        uint256 rSupply = _reflectedSupply;
        uint256 tSupply = _totalSupply;

        /**
         * The code below removes balances of addresses excluded from rewards from
         * rSupply and tSupply, which effectively increases the % of transaction fees
         * delivered to non-excluded holders
         */    
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_reflectedBalances[_excluded[i]] > rSupply || _balances[_excluded[i]] > tSupply)
            return (_reflectedSupply, _totalSupply);
            rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]);
            tSupply = tSupply.sub(_balances[_excluded[i]]);
        }
        if (tSupply == 0 || rSupply < _reflectedSupply.div(_totalSupply)) return (_reflectedSupply, _totalSupply);
        return (rSupply, tSupply);
    }
    
    
    /**
     * @dev Redistributes the specified amount among the current holders via the reflect.finance
     * algorithm, i.e. by updating the _reflectedSupply (_rSupply) which ultimately adjusts the
     * current rate used by `tokenFromReflection` and, in turn, the value returns from `balanceOf`. 
     * 
     */
    function _redistribute(uint256 amount, uint256 currentRate, uint256 fee) internal {
        uint256 tFee = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rFee = tFee.mul(currentRate);

        _reflectedSupply = _reflectedSupply.sub(rFee);
        
        collectedFeeTotal = collectedFeeTotal.add(tFee);
    }
    // views
    function minimumTokensBeforeSwapAmount() external view returns (uint256) {
        return swapTokensAtAmount;
    }
    
    function getAutoWarChestAmount() external view returns (uint256) {
        return autoWarChestAmount;
    }
    
    
    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcludedFromRewards[account];
    }
    
    function isExcludedFromFee(address account) public view returns(bool) { 
        return _isExcludedFromFee[account]; 
    }
    
     function totalCollectedFees() external view returns (uint256) {
        return collectedFeeTotal;
    }
    
    function beAFeeHolder(address userAddress) external {
        uint256 userBalance = balanceOf(address(userAddress));
        require(userBalance > 0, "You are not an Armada Token Holder");
        
         // create a new fee holder
        if(!isFeeHolder(userAddress)) {
          setFeeHolder(userAddress, userBalance);
        }
        
    }
    
    function whitelistDxSale(address _presaleAddress, address _routerAddress) external onlyOwner {
  	    presaleAddress = _presaleAddress;
  	    
        _exclude(_presaleAddress);
        _isExcludedFromFee[_presaleAddress] = true;

        _exclude(_routerAddress);
        _isExcludedFromFee[_routerAddress] = true;
  	}
    
    function prepareForPreSale() external onlyOwner {
        takeFeeEnabled = false;
        swapEnabled = false;
        isInPresale = true;
        WarChestFee = 0;
        MarketingChestFee = 0;
        FleetRewardsFee = 0;
        MuntinyFee = 0;
        maxTxAmount = 1000000000000 * (10**18);
        maxWalletBalance = 1000000000000 * (10**18);
    }
    
    function afterPreSale() external onlyOwner {
        takeFeeEnabled = true;
        swapEnabled = true;
        isInPresale = false;
        WarChestFee = 12;
        MarketingChestFee = 2;
        FleetRewardsFee = 2;
        MuntinyFee = 14;
        maxTxAmount = 2000000000 * (10**18);
        maxWalletBalance = 200000000000 * (10**18);
    }
    
    function setWarChestEnabled(bool _enabled) external onlyOwner {
        autoWarChestEnabled = _enabled;
        emit WarChestEnabledUpdated(_enabled);
    }
    
    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled  = _enabled;
    }
    
    function triggerWarChest(uint256 amount) public onlyOwner {
        uint256 contractBalance = address(this).balance;
        require(!swapping, "ARMADA: A swapping process is currently running, wait till that is complete");
        require(contractBalance >= amount, "ARMADA: Insufficient Funds");
    
        WarChestTokens(amount);
    }
    
    function updateAutoWarChestAmount(uint256 amount) external onlyOwner () {
        autoWarChestAmount = amount;
    }
    
    function updateSwapTokensAt(uint256 _swaptokens) external onlyOwner {
        swapTokensAtAmount = _swaptokens * (10**18);
    }
    
    function updateWalletMax(uint256 _walletMax) external onlyOwner {
        maxWalletBalance = _walletMax * (10**18);
    }
    
    function updateTransactionMax(uint256 _txMax) external onlyOwner {
        maxTxAmount = _txMax * (10**18);
    }
    
    function updateMarketingChestFee(uint256 newFee) external onlyOwner {
        MarketingChestFee = newFee;
    }
    
    function updateWarChestFee(uint256 newFee) external onlyOwner {
        WarChestFee = newFee;
    }
    
    function updateFleetRewardsFee(uint256 newFee) external onlyOwner {
        FleetRewardsFee = newFee;
    }
    
    function updateMuntinyFee(uint256 newFee) external onlyOwner {
        MuntinyFee = newFee;
    }
    
    function updateMarketingChestWallet(address newMarketingChestWallet) external onlyOwner {
        require(newMarketingChestWallet != MarketingChestAddress, "The MarketingChest wallet is already this address");
        emit MarketingChestWalletUpdated(newMarketingChestWallet, MarketingChestAddress);
        MarketingChestAddress = newMarketingChestWallet;
    }
    
    function setMarketingChestDivisor(uint256 divisor) external onlyOwner() {
        MarketingChestDivisor = divisor;
    }
    
    function setReductionPerSec(uint256 persec) external onlyOwner() {
        reductionPerSec = persec;
    }
    
    function setReductionDivisor(uint256 divisor) external onlyOwner() {
        reductionDivisor = divisor;
    }
    
    function setUpdateFeeTime(uint256 feeTime) external onlyOwner() {
        updateFeeTime = feeTime;
    }
    
    function setFeesDivisor(uint256 divisor) external onlyOwner() {
        FEES_DIVISOR = divisor;
    }
    
    function updateRouterAddress(address newAddress) external onlyOwner {
        require(newAddress != address(router), "The router already has that address");
        router = IPancakeV2Router(newAddress);
        emit UpdatePancakeswapRouter(newAddress, address(router));
    }
    
    
    function _transferTokens(address sender, address recipient, uint256 amount, bool takeFee, bool feeReduction, address userAddress) private {
       
        // grab the estimated reduced fees
            (uint256 reduceFleetRewardsFee, uint256 reduceWarChestFee, uint256 reduceMarketingChestFee,  
        uint256 reduceMuntinyFee, uint256 estimatedAccruedFees) = _getHolderFees(userAddress, feeReduction);

        
         uint256 sumOfFees = isInPresale ? 0 : reduceFleetRewardsFee.add(reduceMarketingChestFee).add(reduceWarChestFee);
         
         bool isBuying = true;
         
        if(recipient == pair) {
            sumOfFees = isInPresale ? 0 : sumOfFees.add(reduceMuntinyFee);
            isBuying  = false;
        }
        
        if(feeReduction) {
            // Adjust the Fee struct to reflect the new transaction
            reAdjustFees(userAddress, amount, estimatedAccruedFees, reduceFleetRewardsFee, reduceWarChestFee, reduceMarketingChestFee, reduceMuntinyFee, isBuying);
        }
       
        if ( !takeFee ){ sumOfFees = 0; }
        
        processReflectedBal(sender, recipient, amount, sumOfFees, isBuying, reduceFleetRewardsFee, reduceWarChestFee, reduceMarketingChestFee, reduceMuntinyFee);
       
    }
    
    function processReflectedBal (address sender, address recipient, uint256 amount, uint256 sumOfFees, bool isBuying, 
    uint256 reduceFleetRewardsFee, uint256 reduceWarChestFee, uint256 reduceMarketingChestFee, uint256 reduceMuntinyFee) internal {
        
        (uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, 
        uint256 tTransferAmount, uint256 currentRate ) = _getValues(amount, sumOfFees);
        bool _isBuying = isBuying;
         
        theReflection(sender, recipient, rAmount, rTransferAmount, tAmount, tTransferAmount); 
        
        _takeFees(amount, currentRate, sumOfFees, reduceFleetRewardsFee, reduceWarChestFee, reduceMarketingChestFee, reduceMuntinyFee, _isBuying);
        
        emit Transfer(sender, recipient, tTransferAmount);    
    }
    
    function theReflection(address sender, address recipient, uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, 
        uint256 tTransferAmount) private {
            
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount);
        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rTransferAmount);
        
        /**
         * Update the true/nominal balances for excluded accounts
         */        
        if (_isExcludedFromRewards[sender]) { _balances[sender] = _balances[sender].sub(tAmount); }
        if (_isExcludedFromRewards[recipient] ) { _balances[recipient] = _balances[recipient].add(tTransferAmount); }
    }
    
    
    function _takeFees(uint256 amount, uint256 currentRate, uint256 sumOfFees, uint256 reduceFleetRewardsFee, uint256 reduceWarChestFee, 
    uint256 reduceMarketingChestFee,  uint256 reduceMuntinyFee, bool isBuying) private {
        if ( sumOfFees > 0 && !isInPresale ){
            _redistribute( amount, currentRate, reduceFleetRewardsFee);  // redistribute to holders
            _takeFee( amount, currentRate, reduceWarChestFee, address(this)); // buy back fee
            _takeFee( amount, currentRate, reduceMarketingChestFee, address(this)); // MarketingChest fee
            
            if(!isBuying) {
                _takeFee( amount, currentRate, reduceMuntinyFee, address(this));
                }
        }
    }
    
    function _takeFee(uint256 amount, uint256 currentRate, uint256 fee, address recipient) private {
        uint256 tAmount = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rAmount = tAmount.mul(currentRate);

        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rAmount);
        if(_isExcludedFromRewards[recipient])
            _balances[recipient] = _balances[recipient].add(tAmount);

        collectedFeeTotal = collectedFeeTotal.add(tAmount);
    }
    
    function _beforeTokenTransfer() private {
        // also adjust fees - add later
        
        if ( !isInPresale ){
            uint256 contractTokenBalance = balanceOf(address(this));
            // swap
            bool canSwap = contractTokenBalance >= swapTokensAtAmount;
            
            if (!swapping && canSwap && swapEnabled) {
                swapping = true;
                swapTokens(contractTokenBalance);
                swapping = false;
            }
            
            uint256 WarChestBalance = address(this).balance;
            // auto buy back
            if(autoWarChestEnabled && WarChestBalance >= autoWarChestAmount && !swapping) {
                WarChestBalance = autoWarChestAmount;
                
                WarChestTokens(WarChestBalance.div(100));
            }
        }
    }
   
    
    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "Token: transfer from the zero address");
        require(recipient != address(0), "Token: transfer to the zero address");
        require(sender != address(deadAddress), "Token: transfer from the burn address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        if (
            sender != address(router) && //router -> pair is removing liquidity which shouldn't have max
            !_isExcludedFromFee[recipient] && //no max for those excluded from fees
            !_isExcludedFromFee[sender] 
        ) {
            require(amount <= maxTxAmount, "Transfer amount exceeds the Max Transaction Amount.");
            
        }
        
        if ( maxWalletBalance > 0 && !_isExcludedFromFee[recipient] && !_isExcludedFromFee[sender] && recipient != address(pair) ) {
                uint256 recipientBalance = balanceOf(recipient);
                require(recipientBalance + amount <= maxWalletBalance, "New balance would exceed the maxWalletBalance");
            }
            
         // indicates whether or not feee should be deducted from the transfer
        bool _isTakeFee = takeFeeEnabled;
        if ( isInPresale ){ _isTakeFee = false; }
        
         // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) { 
            _isTakeFee = false; 
        }
        
         bool feeReduction = true;
         address userAddress = recipient == pair ? sender : sender == pair ? recipient : msg.sender; 
         
         if(!isInPresale) {
           // create a new fee holder
            if(!isFeeHolder(userAddress)) {
               setFeeHolder(userAddress, amount); // create a new fee holder
               feeReduction = false;
            } 
         }
         // if contract is in presale, then there should be no fee reduction
        if(isInPresale){ feeReduction = false; }
        
        _beforeTokenTransfer();
        _transferTokens(sender, recipient, amount, _isTakeFee, feeReduction, userAddress );
        
    }
    
    
    function swapTokens(uint256 contractTokenBalance) private {
       
        uint256 initialBalance = address(this).balance;
        swapTokensForBNB(contractTokenBalance);
        uint256 transferredBalance = address(this).balance.sub(initialBalance);

        //Send to MarketingChest address
        transferToAddressBNB(payable(MarketingChestAddress), transferredBalance.div(10**2).mul(MarketingChestDivisor));
        
    }
    
    function WarChestTokens(uint256 amount) private {
    	if (amount > 0) {
    	    swapBNBForTokens(amount);
	    }
    }
    
    function swapTokensForBNB(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

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

        // make the swap
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
        emit SwapTokensForETH(tokenAmount, path);
    }
    
    function swapBNBForTokens(uint256 amount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(this);

      // make the swap
        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0, // accept any amount of Tokens
            path,
            deadAddress, // Burn address
            block.timestamp
        );
        
        emit SwapETHForTokens(amount, path);
    }
    
    function transferToAddressBNB(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }
    
}

//       d8888 8888888b.  888b     d888        d8888 8888888b.        d8888
//      d88888 888   Y88b 8888b   d8888       d88888 888  "Y88b      d88888
//     d88P888 888    888 88888b.d88888      d88P888 888    888     d88P888
//    d88P 888 888   d88P 888Y88888P888     d88P 888 888    888    d88P 888
//   d88P  888 8888888P"  888 Y888P 888    d88P  888 888    888   d88P  888
//  d88P   888 888 T88b   888  Y8P  888   d88P   888 888    888  d88P   888
// d8888888888 888  T88b  888   "   888  d8888888888 888  .d88P d8888888888
//d88P     888 888   T88b 888       888 d88P     888 8888888P" d88P     888

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_FleetRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_WarChestFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_MarketingChestFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_MuntinyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"LogNewFeeHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_FleetRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_WarChestFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_MarketingChestFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_MuntinyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_lastUpdated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nextReductionTime","type":"uint256"}],"name":"LogUpdateFeeHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingChestWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingChestWallet","type":"address"}],"name":"MarketingChestWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdatePancakeswapRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"WarChestEnabledUpdated","type":"event"},{"inputs":[],"name":"FleetRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MarketingChestAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MarketingChestDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MarketingChestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MuntinyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WarChestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"afterPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoWarChestAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoWarChestEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"beAFeeHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectedFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"FleetRewardsFee","type":"uint256"},{"internalType":"uint256","name":"WarChestFee","type":"uint256"},{"internalType":"uint256","name":"MarketingChestFee","type":"uint256"},{"internalType":"uint256","name":"MuntinyFee","type":"uint256"},{"internalType":"bool","name":"exist","type":"bool"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"uint256","name":"nextReductionTime","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutoWarChestAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"}],"name":"getEstimatedFee","outputs":[{"internalType":"uint256","name":"reduceFleetRewardsFee","type":"uint256"},{"internalType":"uint256","name":"reduceWarChestFee","type":"uint256"},{"internalType":"uint256","name":"reduceMarketingChestFee","type":"uint256"},{"internalType":"uint256","name":"reduceMuntinyFee","type":"uint256"},{"internalType":"uint256","name":"estimatedAccruedFees","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeHoldersCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"}],"name":"getFeeholder","outputs":[{"internalType":"uint256","name":"_FleetRewardsFee","type":"uint256"},{"internalType":"uint256","name":"_WarChestFee","type":"uint256"},{"internalType":"uint256","name":"_MarketingChestFee","type":"uint256"},{"internalType":"uint256","name":"_MuntinyFee","type":"uint256"},{"internalType":"uint256","name":"_lastUpdated","type":"uint256"},{"internalType":"uint256","name":"_nextReductionTime","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"isFeeHolder","outputs":[{"internalType":"bool","name":"isIndeed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prepareForPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"},{"internalType":"bool","name":"isBuying","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IPancakeV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setFeesDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMarketingChestDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setReductionDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"persec","type":"uint256"}],"name":"setReductionPerSec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeTime","type":"uint256"}],"name":"setUpdateFeeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setWarChestEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"takeFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCollectedFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"triggerWarChest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateAutoWarChestAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"updateFleetRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"updateMarketingChestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingChestWallet","type":"address"}],"name":"updateMarketingChestWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"updateMuntinyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swaptokens","type":"uint256"}],"name":"updateSwapTokensAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txMax","type":"uint256"}],"name":"updateTransactionMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletMax","type":"uint256"}],"name":"updateWalletMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"updateWarChestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_presaleAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"whitelistDxSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260276003556305f5e10060045560016005556402540be4006006556002600755600c6008556002600955600e600a5560045460075462000045919062000bb6565b600b556004546008546200005a919062000bb6565b600c556004546009546200006f919062000bb6565b600d55600454600a5462000084919062000bb6565b600e55620000c0600d54620000ac600b54600c546200055f60201b620021db1790919060201c565b6200055f60201b620021db1790919060201c565b600f55620000e1600e54600f546200055f60201b620021db1790919060201c565b601055601480546001600160a01b03199081167353ca5b603903c2f7c3953d1db8741c6bda0362781790915560158054821661dead1790556016805490911690556200013d6c0c9f2c9cd04674edea4000000060001962000c10565b6200014b9060001962000bd8565b601755620001696103e86c0c9f2c9cd04674edea4000000062000b9f565b6019556200018660326c0c9f2c9cd04674edea4000000062000b9f565b601a55601b805460ff19166001908117909155670de0b6b3a7640000601c55601d805461ffff19169091179055600954601e55601f805461ff0019166101001790556a01a784379d99db42000000602055348015620001e457600080fd5b50601180546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060175460236000620002426011546001600160a01b031690565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555060007310ed43c718714eb63d5aa57b78b54704e256024e9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620002b957600080fd5b505afa158015620002ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f4919062000b59565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200033d57600080fd5b505afa15801562000352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000378919062000b59565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620003c157600080fd5b505af1158015620003d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fc919062000b59565b602280546001600160a01b03199081166001600160a01b039384161790915560218054909116918316919091179055600160266000620004446011546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526026909252902080549091166001179055620004a16200049b6011546001600160a01b031690565b620005cd565b620004ac30620005cd565b602254620004c3906001600160a01b0316620005cd565b601554620004da906001600160a01b0316620005cd565b62000506620004f16011546001600160a01b031690565b6021546001600160a01b031660001962000690565b6011546040516c0c9f2c9cd04674edea4000000081526001600160a01b03909116906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35062000c69565b6000806200056e838562000b84565b905083811015620005c65760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b038116600090815260236020526040902054156200062a576001600160a01b0381166000908152602360205260409020546200061090620007e2565b6001600160a01b0382166000908152602460205260409020555b6001600160a01b03166000818152602760205260408120805460ff191660019081179091556028805491820181559091527fe16da923a2d88192e5070f37b4571d58682c0d66212ec634d495f33de3f77ab50180546001600160a01b0319169091179055565b6001600160a01b0383166200070e5760405162461bcd60e51b815260206004820152603460248201527f42617365466c65657452657761726473546f6b656e3a20617070726f7665206660448201527f726f6d20746865207a65726f20616464726573730000000000000000000000006064820152608401620005bd565b6001600160a01b038216620007815760405162461bcd60e51b815260206004820152603260248201527f42617365466c65657452657761726473546f6b656e3a20617070726f766520746044820152716f20746865207a65726f206164647265737360701b6064820152608401620005bd565b6001600160a01b0383811660008181526025602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006017548211156200084b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620005bd565b60006200085762000873565b9050620005c68184620008a660201b6200223a1790919060201c565b600080806200088162000905565b915091506200089f8183620008a660201b6200223a1790919060201c565b9250505090565b6000808211620008f95760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401620005bd565b620005c6828462000b9f565b60175460009081906c0c9f2c9cd04674edea40000000825b60285481101562000a9a5782602360006028848154811062000943576200094362000c53565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180620009b257508160246000602884815481106200098b576200098b62000c53565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15620009d3575050601754936c0c9f2c9cd04674edea400000009350915050565b62000a2a6023600060288481548110620009f157620009f162000c53565b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205485916200229562000af9821b17901c565b925062000a83602460006028848154811062000a4a5762000a4a62000c53565b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205484916200229562000af9821b17901c565b91508062000a918162000bf2565b9150506200091d565b5080158062000ad0575062000acd6c0c9f2c9cd04674edea40000000601754620008a660201b6200223a1790919060201c565b82105b1562000af0575050601754926c0c9f2c9cd04674edea4000000092509050565b90939092509050565b60008282111562000b4d5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401620005bd565b620005c6828462000bd8565b60006020828403121562000b6c57600080fd5b81516001600160a01b0381168114620005c657600080fd5b6000821982111562000b9a5762000b9a62000c27565b500190565b60008262000bb15762000bb162000c3d565b500490565b600081600019048311821515161562000bd35762000bd362000c27565b500290565b60008282101562000bed5762000bed62000c27565b500390565b600060001982141562000c095762000c0962000c27565b5060010190565b60008262000c225762000c2262000c3d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6140e88062000c796000396000f3fe6080604052600436106104295760003560e01c80636ddd171311610229578063a9059cbb1161012e578063dd467064116100b6578063e85d0b091161007a578063e85d0b0914610cae578063f2fde38b14610d44578063f887ea4014610d64578063faaebd2114610d84578063ff976d3c14610e2357600080fd5b8063dd46706414610bf2578063dd62ed3e14610c12578063e01af92c14610c58578063e2f4560514610c78578063e304e52e14610c8e57600080fd5b8063bd246615116100fd578063bd24661514610b5d578063ca8646db14610b7d578063d412e1b814610b9d578063d4cdeb3c14610bbd578063d938e00914610bdc57600080fd5b8063a9059cbb14610ae7578063b225d4b714610b07578063b7298bab14610b27578063bbde77c114610b4757600080fd5b806391053d94116101b1578063a338df1d11610180578063a338df1d14610a5d578063a457c2d714610a7d578063a53b034b14610a9d578063a69df4b514610ab2578063a8aa1b3114610ac757600080fd5b806391053d94146109e657806395d89b4114610a0657806396bd072c14610a33578063a073d37f14610a4857600080fd5b80637d8dbe24116101f85780637d8dbe241461094357806385b23a3b1461096357806388f82020146109795780638c0b5e22146109b25780638da5cb5b146109c857600080fd5b80636ddd1713146108cf57806370a08231146108ee578063715018a61461090e57806374b2a0031461092357600080fd5b80633e9200991161032f5780635342acb4116102b7578063602bc62b11610286578063602bc62b1461083a5780636612e66f1461084f5780636a7105cc1461086f5780636a84df351461088f5780636c70e006146108af57600080fd5b80635342acb4146107b85780635540b1ec146107f1578063557ed1ba14610811578063589d89dc1461082457600080fd5b806349b18a65116102fe57806349b18a65146106fb5780634e83ff6f1461071b5780635134f6ab1461073b57806351a8d3761461075057806352390c021461079857600080fd5b80633e920099146106815780633f63d40f146106a157806342966c68146106c1578063450dde46146106e157600080fd5b806323b872dd116103b2578063313ce56711610381578063313ce567146105ef5780633685d4191461060b57806338f7b2b41461062b57806339509351146106415780633b1f75281461066157600080fd5b806323b872dd1461057f578063246c609e1461059f57806329ccf86a146105b957806329dc95ff146105cf57600080fd5b8063095ea7b3116103f9578063095ea7b3146104cd5780630f853433146104fd578063122fe6851461051357806318160ddd1461054b578063228b915c1461056a57600080fd5b8062e6be7b14610435578063026fe6371461045757806306fdde031461048057806307efbfdc146104b857600080fd5b3661043057005b600080fd5b34801561044157600080fd5b50610455610450366004613c86565b610e43565b005b34801561046357600080fd5b5061046d601c5481565b6040519081526020015b60405180910390f35b34801561048c57600080fd5b5060408051808201909152600681526541726d61646160d01b60208201525b6040516104779190613e84565b3480156104c457600080fd5b50610455610f2c565b3480156104d957600080fd5b506104ed6104e8366004613d6f565b610faa565b6040519015158152602001610477565b34801561050957600080fd5b5061046d60085481565b34801561051f57600080fd5b50601654610533906001600160a01b031681565b6040516001600160a01b039091168152602001610477565b34801561055757600080fd5b5068327cb2734119d3b7a9601e1b61046d565b34801561057657600080fd5b50601c5461046d565b34801561058b57600080fd5b506104ed61059a366004613cf9565b610fc1565b3480156105ab57600080fd5b50601b546104ed9060ff1681565b3480156105c557600080fd5b5061046d60075481565b3480156105db57600080fd5b506104556105ea366004613db6565b61102b565b3480156105fb57600080fd5b5060405160128152602001610477565b34801561061757600080fd5b50610455610626366004613c86565b611141565b34801561063757600080fd5b5061046d601e5481565b34801561064d57600080fd5b506104ed61065c366004613d6f565b6112f4565b34801561066d57600080fd5b5061045561067c366004613db6565b61132a565b34801561068d57600080fd5b5061045561069c366004613db6565b611359565b3480156106ad57600080fd5b5061046d6106bc366004613dcf565b611388565b3480156106cd57600080fd5b506104556106dc366004613db6565b611437565b3480156106ed57600080fd5b50601d546104ed9060ff1681565b34801561070757600080fd5b50601454610533906001600160a01b031681565b34801561072757600080fd5b50610455610736366004613cc0565b611614565b34801561074757600080fd5b506104556116b3565b34801561075c57600080fd5b5061077061076b366004613c86565b611722565b604080519586526020860194909452928401919091526060830152608082015260a001610477565b3480156107a457600080fd5b506104556107b3366004613c86565b6118bf565b3480156107c457600080fd5b506104ed6107d3366004613c86565b6001600160a01b031660009081526026602052604090205460ff1690565b3480156107fd57600080fd5b5061045561080c366004613db6565b61195e565b34801561081d57600080fd5b504261046d565b34801561083057600080fd5b5061046d60185481565b34801561084657600080fd5b5060135461046d565b34801561085b57600080fd5b5061045561086a366004613d3a565b61198d565b34801561087b57600080fd5b5061045561088a366004613d9b565b6119e2565b34801561089b57600080fd5b506104ed6108aa366004613c86565b611a53565b3480156108bb57600080fd5b506104556108ca366004613c86565b611a87565b3480156108db57600080fd5b50601f546104ed90610100900460ff1681565b3480156108fa57600080fd5b5061046d610909366004613c86565b611b06565b34801561091a57600080fd5b50610455611b65565b34801561092f57600080fd5b5061045561093e366004613db6565b611bc7565b34801561094f57600080fd5b5061045561095e366004613db6565b611bf6565b34801561096f57600080fd5b5061046d60095481565b34801561098557600080fd5b506104ed610994366004613c86565b6001600160a01b031660009081526027602052604090205460ff1690565b3480156109be57600080fd5b5061046d60195481565b3480156109d457600080fd5b506011546001600160a01b0316610533565b3480156109f257600080fd5b50610455610a01366004613db6565b611c38565b348015610a1257600080fd5b506040805180820190915260048152631054935160e21b60208201526104ab565b348015610a3f57600080fd5b5060185461046d565b348015610a5457600080fd5b5060205461046d565b348015610a6957600080fd5b50610455610a78366004613c86565b611c7a565b348015610a8957600080fd5b506104ed610a98366004613d6f565b611d79565b348015610aa957600080fd5b5060015461046d565b348015610abe57600080fd5b50610455611dc8565b348015610ad357600080fd5b50602254610533906001600160a01b031681565b348015610af357600080fd5b506104ed610b02366004613d6f565b611ed0565b348015610b1357600080fd5b50610455610b22366004613db6565b611edd565b348015610b3357600080fd5b50610455610b42366004613db6565b611f1f565b348015610b5357600080fd5b5061046d601a5481565b348015610b6957600080fd5b50610455610b78366004613db6565b611f4e565b348015610b8957600080fd5b50610455610b98366004613db6565b611f7d565b348015610ba957600080fd5b50610455610bb8366004613db6565b611fac565b348015610bc957600080fd5b50601d546104ed90610100900460ff1681565b348015610be857600080fd5b5061046d600a5481565b348015610bfe57600080fd5b50610455610c0d366004613db6565b611fdb565b348015610c1e57600080fd5b5061046d610c2d366004613cc0565b6001600160a01b03918216600090815260256020908152604080832093909416825291909152205490565b348015610c6457600080fd5b50610455610c73366004613d9b565b612060565b348015610c8457600080fd5b5061046d60205481565b348015610c9a57600080fd5b50610455610ca9366004613db6565b6120a4565b348015610cba57600080fd5b50610d0f610cc9366004613c86565b6001600160a01b03166000908152602081905260409020805460018201546002830154600384015460058501546006860154600790960154949693959294919390929190565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610477565b348015610d5057600080fd5b50610455610d5f366004613c86565b6120d3565b348015610d7057600080fd5b50602154610533906001600160a01b031681565b348015610d9057600080fd5b50610de6610d9f366004613c86565b60006020819052908152604090208054600182015460028301546003840154600485015460058601546006870154600790970154959694959394929360ff90921692909188565b6040805198895260208901979097529587019490945260608601929092521515608085015260a084015260c083015260e082015261010001610477565b348015610e2f57600080fd5b50610455610e3e366004613db6565b6121ac565b6011546001600160a01b03163314610e765760405162461bcd60e51b8152600401610e6d90613ed9565b60405180910390fd5b6021546001600160a01b0382811691161415610ee05760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e6d565b602180546001600160a01b0319166001600160a01b03831690811790915560405181907fc4382ee892d64a85fffb798adefd9dd8fcdeb2b1ababe74b46cdae7fe88da4e090600090a350565b6011546001600160a01b03163314610f565760405162461bcd60e51b8152600401610e6d90613ed9565b601d8054601f805461ff00191661010017905561ffff19166001179055600c60085560026009819055600755600e600a556b06765c793fa10079d00000006019556c02863c1f5cdae42f9540000000601a55565b6000610fb73384846122f1565b5060015b92915050565b6000610fce848484612437565b611020843361101b85604051806060016040528060288152602001614046602891396001600160a01b038a1660009081526025602090815260408083203384529091529020549190612889565b6122f1565b5060015b9392505050565b6011546001600160a01b031633146110555760405162461bcd60e51b8152600401610e6d90613ed9565b601f54479060ff16156110e45760405162461bcd60e51b815260206004820152604b60248201527f41524d4144413a2041207377617070696e672070726f6365737320697320637560448201527f7272656e746c792072756e6e696e672c20776169742074696c6c20746861742060648201526a697320636f6d706c65746560a81b608482015260a401610e6d565b818110156111345760405162461bcd60e51b815260206004820152601a60248201527f41524d4144413a20496e73756666696369656e742046756e64730000000000006044820152606401610e6d565b61113d826128c0565b5050565b6011546001600160a01b0316331461116b5760405162461bcd60e51b8152600401610e6d90613ed9565b6001600160a01b03811660009081526027602052604090205460ff166111d35760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610e6d565b60005b60285481101561113d57816001600160a01b0316602882815481106111fd576111fd61401a565b6000918252602090912001546001600160a01b031614156112e2576028805461122890600190613fbc565b815481106112385761123861401a565b600091825260209091200154602880546001600160a01b0390921691839081106112645761126461401a565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152602482526040808220829055602790925220805460ff1916905560288054806112bc576112bc614004565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806112ec81613fd3565b9150506111d6565b3360008181526025602090815260408083206001600160a01b03871684529091528120549091610fb791859061101b90866121db565b6011546001600160a01b031633146113545760405162461bcd60e51b8152600401610e6d90613ed9565b600555565b6011546001600160a01b031633146113835760405162461bcd60e51b8152600401610e6d90613ed9565b600355565b600068327cb2734119d3b7a9601e1b8411156113e65760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610e6d565b6000836114095760006113fa8660006128cf565b50929550611024945050505050565b826114165760105461141a565b600f545b9050600061142886836128cf565b50919550611024945050505050565b338061148f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610e6d565b6015546001600160a01b03828116911614156114f75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865206275726e206164647265736044820152607360f81b6064820152608401610e6d565b600061150282611b06565b90508281101561155f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610e6d565b600061157361156c612950565b8590612973565b6001600160a01b0384166000908152602360205260409020549091506115999082612295565b6001600160a01b03841660009081526023602090815260408083209390935560279052205460ff1615611603576001600160a01b0383166000908152602460205260409020546115e99085612295565b6001600160a01b0384166000908152602460205260409020555b61160e8385836129f2565b50505050565b6011546001600160a01b0316331461163e5760405162461bcd60e51b8152600401610e6d90613ed9565b601680546001600160a01b0319166001600160a01b03841617905561166282612ad4565b6001600160a01b0382166000908152602660205260409020805460ff1916600117905561168e81612ad4565b6001600160a01b03166000908152602660205260409020805460ff1916600117905550565b6011546001600160a01b031633146116dd5760405162461bcd60e51b8152600401610e6d90613ed9565b601d8054601f805461ff001916905561ffff19166101001790556000600881905560098190556007819055600a5568327cb2734119d3b7a9601e1b6019819055601a55565b6001600160a01b038116600090815260208190526040812060050154819081908190819081906117529042613fbc565b9050600061176b6003548361297390919063ffffffff16565b6001600160a01b0389166000908152602081905260409020549091508110156117b6576001600160a01b0388166000908152602081905260409020546117b19082612295565b6117b9565b60005b6001600160a01b038916600090815260208190526040902060010154821015611807576001600160a01b0389166000908152602081905260409020600101546118029083612295565b61180a565b60005b6001600160a01b038a16600090815260208190526040902060020154831015611858576001600160a01b038a166000908152602081905260409020600201546118539084612295565b61185b565b60005b6001600160a01b038b166000908152602081905260409020600301548410156118a9576001600160a01b038b166000908152602081905260409020600301546118a49085612295565b6118ac565b60005b929b919a50985090965090945092505050565b6011546001600160a01b031633146118e95760405162461bcd60e51b8152600401610e6d90613ed9565b6001600160a01b03811660009081526027602052604090205460ff16156119525760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c756465640000000000000000006044820152606401610e6d565b61195b81612ad4565b50565b6011546001600160a01b031633146119885760405162461bcd60e51b8152600401610e6d90613ed9565b600955565b6011546001600160a01b031633146119b75760405162461bcd60e51b8152600401610e6d90613ed9565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6011546001600160a01b03163314611a0c5760405162461bcd60e51b8152600401610e6d90613ed9565b601b805460ff19168215159081179091556040519081527ffebf323fa0f3f2090220869a8028b158ae13447ed5b3e6ac930bc283c14372669060200160405180910390a150565b600154600090611a6557506000919050565b506001600160a01b031660009081526020819052604090206004015460ff1690565b6000611a9282611b06565b905060008111611aef5760405162461bcd60e51b815260206004820152602260248201527f596f7520617265206e6f7420616e2041726d61646120546f6b656e20486f6c6460448201526132b960f11b6064820152608401610e6d565b611af882611a53565b61113d5761113d8282612b94565b6001600160a01b03811660009081526027602052604081205460ff1615611b4357506001600160a01b031660009081526024602052604090205490565b6001600160a01b038216600090815260236020526040902054610fbb90612be8565b6011546001600160a01b03163314611b8f5760405162461bcd60e51b8152600401610e6d90613ed9565b6011546040516000916001600160a01b03169060008051602061406e833981519152908390a3601180546001600160a01b0319169055565b6011546001600160a01b03163314611bf15760405162461bcd60e51b8152600401610e6d90613ed9565b601c55565b6011546001600160a01b03163314611c205760405162461bcd60e51b8152600401610e6d90613ed9565b611c3281670de0b6b3a7640000613f9d565b60195550565b6011546001600160a01b03163314611c625760405162461bcd60e51b8152600401610e6d90613ed9565b611c7481670de0b6b3a7640000613f9d565b601a5550565b6011546001600160a01b03163314611ca45760405162461bcd60e51b8152600401610e6d90613ed9565b6014546001600160a01b0382811691161415611d1c5760405162461bcd60e51b815260206004820152603160248201527f546865204d61726b6574696e6743686573742077616c6c657420697320616c72604482015270656164792074686973206164647265737360781b6064820152608401610e6d565b6014546040516001600160a01b03918216918316907fde7b888c37fc3afd45aa0c78c484d12adc7c4ed7073f63580880ef358d15ac2390600090a3601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000610fb7338461101b8560405180606001604052806025815260200161408e602591393360009081526025602090815260408083206001600160a01b038d1684529091529020549190612889565b6012546001600160a01b03163314611e2e5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610e6d565b6013544211611e7f5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610e6d565b6012546011546040516001600160a01b03928316929091169060008051602061406e83398151915290600090a3601254601180546001600160a01b0319166001600160a01b03909216919091179055565b6000610fb7338484612437565b6011546001600160a01b03163314611f075760405162461bcd60e51b8152600401610e6d90613ed9565b611f1981670de0b6b3a7640000613f9d565b60205550565b6011546001600160a01b03163314611f495760405162461bcd60e51b8152600401610e6d90613ed9565b600755565b6011546001600160a01b03163314611f785760405162461bcd60e51b8152600401610e6d90613ed9565b600655565b6011546001600160a01b03163314611fa75760405162461bcd60e51b8152600401610e6d90613ed9565b600a55565b6011546001600160a01b03163314611fd65760405162461bcd60e51b8152600401610e6d90613ed9565b600455565b6011546001600160a01b031633146120055760405162461bcd60e51b8152600401610e6d90613ed9565b60118054601280546001600160a01b03199081166001600160a01b038416179091551690556120348142613f63565b6013556011546040516000916001600160a01b03169060008051602061406e833981519152908390a350565b6011546001600160a01b0316331461208a5760405162461bcd60e51b8152600401610e6d90613ed9565b601f80549115156101000261ff0019909216919091179055565b6011546001600160a01b031633146120ce5760405162461bcd60e51b8152600401610e6d90613ed9565b600855565b6011546001600160a01b031633146120fd5760405162461bcd60e51b8152600401610e6d90613ed9565b6001600160a01b0381166121625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6d565b6011546040516001600160a01b0380841692169060008051602061406e83398151915290600090a3601180546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031633146121d65760405162461bcd60e51b8152600401610e6d90613ed9565b601e55565b6000806121e88385613f63565b9050838110156110245760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e6d565b600080821161228b5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610e6d565b6110248284613f7b565b6000828211156122e75760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610e6d565b6110248284613fbc565b6001600160a01b0383166123645760405162461bcd60e51b815260206004820152603460248201527f42617365466c65657452657761726473546f6b656e3a20617070726f76652066604482015273726f6d20746865207a65726f206164647265737360601b6064820152608401610e6d565b6001600160a01b0382166123d55760405162461bcd60e51b815260206004820152603260248201527f42617365466c65657452657761726473546f6b656e3a20617070726f766520746044820152716f20746865207a65726f206164647265737360701b6064820152608401610e6d565b6001600160a01b0383811660008181526025602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661249b5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e3a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e6d565b6001600160a01b0382166124fd5760405162461bcd60e51b815260206004820152602360248201527f546f6b656e3a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e6d565b6015546001600160a01b03848116911614156125695760405162461bcd60e51b815260206004820152602560248201527f546f6b656e3a207472616e736665722066726f6d20746865206275726e206164604482015264647265737360d81b6064820152608401610e6d565b600081116125cb5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e6d565b6021546001600160a01b0384811691161480159061260257506001600160a01b03821660009081526026602052604090205460ff16155b801561262757506001600160a01b03831660009081526026602052604090205460ff16155b1561269a5760195481111561269a5760405162461bcd60e51b815260206004820152603360248201527f5472616e7366657220616d6f756e74206578636565647320746865204d6178206044820152722a3930b739b0b1ba34b7b71020b6b7bab73a1760691b6064820152608401610e6d565b6000601a541180156126c557506001600160a01b03821660009081526026602052604090205460ff16155b80156126ea57506001600160a01b03831660009081526026602052604090205460ff16155b801561270457506022546001600160a01b03838116911614155b1561278a57600061271483611b06565b601a549091506127248383613f63565b11156127885760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b6064820152608401610e6d565b505b601d5460ff80821691610100900416156127a2575060005b6001600160a01b03841660009081526026602052604090205460ff16806127e157506001600160a01b03831660009081526026602052604090205460ff165b156127ea575060005b6022546001906000906001600160a01b03868116911614612826576022546001600160a01b038781169116146128205733612828565b84612828565b855b601d54909150610100900460ff166128565761284381611a53565b612856576128518185612b94565b600091505b601d54610100900460ff161561286b57600091505b612873612c65565b612881868686868686612d15565b505050505050565b600081848411156128ad5760405162461bcd60e51b8152600401610e6d9190613e84565b506128b88385613fbc565b949350505050565b801561195b5761195b81612de7565b6000806000806000806128f76006546128f1898b61297390919063ffffffff16565b9061223a565b905060006129058983612295565b90506000612911612950565b9050600061291f8b83612973565b9050600061292d8584612973565b9050600061293b8383612295565b929d929c9b5093995091975095505050505050565b600080600061295d612f86565b909250905061296c828261223a565b9250505090565b60008261298257506000610fbb565b600061298e8385613f9d565b90508261299b8583613f7b565b146110245760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e6d565b6015546001600160a01b0316600090815260236020526040902054612a1790826121db565b601580546001600160a01b03908116600090815260236020908152604080832095909555925490911681526027909152205460ff1615612a92576015546001600160a01b0316600090815260246020526040902054612a7690836121db565b6015546001600160a01b03166000908152602460205260409020555b6015546040518381526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161242a565b6001600160a01b03811660009081526023602052604090205415612b2e576001600160a01b038116600090815260236020526040902054612b1490612be8565b6001600160a01b0382166000908152602460205260409020555b6001600160a01b03166000818152602760205260408120805460ff191660019081179091556028805491820181559091527fe16da923a2d88192e5070f37b4571d58682c0d66212ec634d495f33de3f77ab50180546001600160a01b0319169091179055565b6000612bb16006546128f1600f548561297390919063ffffffff16565b9050612bbd8282612295565b9150612be383600b54600c54600d54600e5442426001612bdd9190613f63565b89613137565b505050565b6000601754821115612c4f5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610e6d565b6000612c59612950565b9050611024838261223a565b601d54610100900460ff16612d13576000612c7f30611b06565b602054601f549192508210159060ff16158015612c995750805b8015612cac5750601f54610100900460ff165b15612cd257601f805460ff19166001179055612cc782613283565b601f805460ff191690555b601b54479060ff168015612ce85750601c548110155b8015612cf75750601f5460ff16155b15612be35750601c54612be3612d0e82606461223a565b6128c0565b565b6000806000806000612d2786886132cc565b945094509450945094506000601d60019054906101000a900460ff16612d6057612d5b85612d5588876121db565b906121db565b612d63565b60005b6022549091506001906001600160a01b038d811691161415612da757601d54610100900460ff16612d9d57612d9882856121db565b612da0565b60005b9150600090505b8815612dbd57612dbd888c858a8a8a8a8861336e565b89612dc757600091505b612dd88d8d8d85858c8c8c8c61347d565b50505050505050505050505050565b6040805160028082526060820183526000926020830190803683375050602154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015612e4c57600080fd5b505afa158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e849190613ca3565b81600081518110612e9757612e9761401a565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612ecb57612ecb61401a565b6001600160a01b03928316602091820292909201015260215460155460405163b6f9de9560e01b81529183169263b6f9de95928692612f17926000928892909116904290600401613e4f565b6000604051808303818588803b158015612f3057600080fd5b505af1158015612f44573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a96248282604051612f7a929190613f0e565b60405180910390a15050565b601754600090819068327cb2734119d3b7a9601e1b825b6028548110156130eb57826023600060288481548110612fbf57612fbf61401a565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061302a57508160246000602884815481106130035761300361401a565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156130495750506017549368327cb2734119d3b7a9601e1b9350915050565b61308f60236000602884815481106130635761306361401a565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612295565b92506130d760246000602884815481106130ab576130ab61401a565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612295565b9150806130e381613fd3565b915050612f9d565b50801580613110575060175461310d9068327cb2734119d3b7a9601e1b61223a565b82105b1561312e5750506017549268327cb2734119d3b7a9601e1b92509050565b90939092509050565b61314088611a53565b1561318d5760405162461bcd60e51b815260206004820152601960248201527f46656520486f6c64657220616c726561647920657869737421000000000000006044820152606401610e6d565b600180546001600160a01b038a16600081815260026020818152604080842086905585870187557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690950180546001600160a01b03191685179055828152918490208c81558086018c90559081018a90556003810189905560048101805460ff19169095179094556005840187905560068401869055600790930184905581518a81529283018990529082018790526060820186905260808201839052907f1c71bbe8b377fe2e3bb3c128f38a774a91cc06d82ad9c4f2199aaec8409b3f109060a0015b60405180910390a25050505050505050565b4761328d82613518565b60006132994783612295565b601454601e54919250612be3916001600160a01b03909116906132c7906132c185606461223a565b90612973565b6136ae565b6000806000806000806000806000806132e48c611722565b9450945094509450945060008b156132fc5785613300565b600b545b905060008c156133105785613314565b600c545b905060008d156133245785613328565b600d545b905060008e15613338578561333c565b600e545b905060008f1561334c5785613350565b6003545b949e50929c50909a5098509096505050505050509295509295909350565b6000806000806133838c8c8c8c8b8d8c6136e4565b935093509350935060006133988d8d8861377a565b9050858d8c8c8b8d8c61346786886133b9576133b486886121db565b6133bb565b8d5b896133cf576133ca85896121db565b6133d1565b8c5b8a6133e5576133e0878a6121db565b6133e7565b8e5b8b6133fb576133f6868b6121db565b6133fd565b8d5b8c61342d576001600160a01b038c16600090815260208190526040902060070154613428908f612295565b613453565b6001600160a01b038c16600090815260208190526040902060070154613453908f6121db565b42600554426134629190613f63565b6137f5565b5050505050505050505050505050505050505050565b600080600080600061348f8c8c6128cf565b939850919650945092509050896134aa8f8f888888886138e7565b6134ba8d838e8d8d8d8d88613a0f565b8d6001600160a01b03168f6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516134ff91815260200190565b60405180910390a3505050505050505050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061354d5761354d61401a565b6001600160a01b03928316602091820292909201810191909152602154604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156135a157600080fd5b505afa1580156135b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d99190613ca3565b816001815181106135ec576135ec61401a565b6001600160a01b03928316602091820292909201015260215461361291309116846122f1565b60215460405163791ac94760e01b81526001600160a01b039091169063791ac9479061364b908590600090869030904290600401613f27565b600060405180830381600087803b15801561366557600080fd5b505af1158015613679573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612f7a929190613f0e565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612be3573d6000803e3d6000fd5b6000808080806136fa86612d558a818d8c6121db565b6001600160a01b038d166000908152602081905260408120600701549192506137258c838f86613a6a565b905060006137338c836121db565b905060006137418c846121db565b9050600061374f8c856121db565b9050600061375d8c866121db565b939a50919850965090945050505050975097509750979350505050565b600080600080600061378b88611722565b509296509094509250905060006137a683612d5587876121db565b905086156137b457806137be565b6137be81836121db565b905060006137db6006546128f1848c61297390919063ffffffff16565b90506137e78982612295565b9a9950505050505050505050565b6137fe88611a53565b61384a5760405162461bcd60e51b815260206004820152601a60248201527f46656520486f6c64657220646f6573206e6f74206578697374210000000000006044820152606401610e6d565b6001600160a01b038816600081815260208181526040918290208a8155600181018a90556002810189905560038101889055600781018590556005810187905560060185905581518a8152908101899052908101879052606081018690526080810183905260a0810185905260c081018490527ffe09e7a02d10e2a3bf320e918a69fe6b5957c461207f0a7f5198ddf3fb3a3f659060e001613271565b6001600160a01b03861660009081526023602052604090205461390a9085612295565b6001600160a01b03808816600090815260236020526040808220939093559087168152205461393990846121db565b6001600160a01b0380871660009081526023602090815260408083209490945591891681526027909152205460ff16156139aa576001600160a01b0386166000908152602460205260409020546139909083612295565b6001600160a01b0387166000908152602460205260409020555b6001600160a01b03851660009081526027602052604090205460ff1615612881576001600160a01b0385166000908152602460205260409020546139ee90826121db565b6001600160a01b038616600090815260246020526040902055505050505050565b600086118015613a275750601d54610100900460ff16155b15613a6057613a37888887613b5b565b613a4388888630613ba7565b613a4f88888530613ba7565b80613a6057613a6088888430613ba7565b5050505050505050565b600080613a7785856121db565b905084811015613a9057613a8b8582612295565b613a9a565b613a9a8186612295565b9050613aae81670de0b6b3a764000061223a565b9050600081871115613acb57613ac48783612295565b9050613b01565b86821115613add57613ac48288612295565b81871415613b015760648711613af35786613afe565b613afe876064612295565b90505b86811115613b1757613b14876064612295565b90505b601054613b2f613b28896004612973565b86906121db565b1115613b515760648711613b435786613b4e565b613b4e876064612295565b90505b9695505050505050565b600654600090613b6f906128f18685612973565b90506000613b7d8285612973565b601754909150613b8d9082612295565b601755601854613b9d90836121db565b6018555050505050565b600654600090613bbb906128f18786612973565b90506000613bc98286612973565b6001600160a01b038416600090815260236020526040902054909150613bef90826121db565b6001600160a01b03841660009081526023602090815260408083209390935560279052205460ff1615613c59576001600160a01b038316600090815260246020526040902054613c3f90836121db565b6001600160a01b0384166000908152602460205260409020555b601854613c6690836121db565b601855505050505050565b80358015158114613c8157600080fd5b919050565b600060208284031215613c9857600080fd5b813561102481614030565b600060208284031215613cb557600080fd5b815161102481614030565b60008060408385031215613cd357600080fd5b8235613cde81614030565b91506020830135613cee81614030565b809150509250929050565b600080600060608486031215613d0e57600080fd5b8335613d1981614030565b92506020840135613d2981614030565b929592945050506040919091013590565b60008060408385031215613d4d57600080fd5b8235613d5881614030565b9150613d6660208401613c71565b90509250929050565b60008060408385031215613d8257600080fd5b8235613d8d81614030565b946020939093013593505050565b600060208284031215613dad57600080fd5b61102482613c71565b600060208284031215613dc857600080fd5b5035919050565b600080600060608486031215613de457600080fd5b83359250613df460208501613c71565b9150613e0260408501613c71565b90509250925092565b600081518084526020808501945080840160005b83811015613e445781516001600160a01b031687529582019590820190600101613e1f565b509495945050505050565b848152608060208201526000613e686080830186613e0b565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015613eb157858101830151858201604001528201613e95565b81811115613ec3576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006128b86040830184613e0b565b85815284602082015260a060408201526000613f4660a0830186613e0b565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613f7657613f76613fee565b500190565b600082613f9857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613fb757613fb7613fee565b500290565b600082821015613fce57613fce613fee565b500390565b6000600019821415613fe757613fe7613fee565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461195b57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204531a20b19b4355baf42c99e950c58f36d1f4693d6a13a32bb63cc68896b9b6c64736f6c63430008060033

Deployed ByteCode Sourcemap

24938:26181:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41716:280;;;;;;;;;;-1:-1:-1;41716:280:0;;;;;:::i;:::-;;:::i;:::-;;25903:46;;;;;;;;;;;;;;;;;;;16993:25:1;;;16981:2;16966:18;25903:46:0;;;;;;;;28265:94;;;;;;;;;;-1:-1:-1;28346:5:0;;;;;;;;;;;;-1:-1:-1;;;28346:5:0;;;;28265:94;;;;;;;:::i;38714:356::-;;;;;;;;;;;;;:::i;29278:167::-;;;;;;;;;;-1:-1:-1;29278:167:0;;;;;:::i;:::-;;:::i;:::-;;;3711:14:1;;3704:22;3686:41;;3674:2;3659:18;29278:167:0;3641:92:1;13373:31:0;;;;;;;;;;;;;;;;25271:42;;;;;;;;;;-1:-1:-1;25271:42:0;;;;-1:-1:-1;;;;;25271:42:0;;;;;;-1:-1:-1;;;;;3502:32:1;;;3484:51;;3472:2;3457:18;25271:42:0;3439:102:1;28575::0;;;;;;;;;;-1:-1:-1;;;;28575:102:0;;37101:109;;;;;;;;;;-1:-1:-1;37184:18:0;;37101:109;;29461:318;;;;;;;;;;-1:-1:-1;29461:318:0;;;;;:::i;:::-;;:::i;25858:38::-;;;;;;;;;;-1:-1:-1;25858:38:0;;;;;;;;13332:34;;;;;;;;;;;;;;;;39365:346;;;;;;;;;;-1:-1:-1;39365:346:0;;;;;:::i;:::-;;:::i;28473:94::-;;;;;;;;;;-1:-1:-1;28473:94:0;;25431:2;19869:36:1;;19857:2;19842:18;28473:94:0;19824:87:1;33931:499:0;;;;;;;;;;-1:-1:-1;33931:499:0;;;;;:::i;:::-;;:::i;26040:56::-;;;;;;;;;;;;;;;;31410:218;;;;;;;;;;-1:-1:-1;31410:218:0;;;;;:::i;:::-;;:::i;41483:106::-;;;;;;;;;;-1:-1:-1;41483:106:0;;;;;:::i;:::-;;:::i;41239:108::-;;;;;;;;;;-1:-1:-1;41239:108:0;;;;;:::i;:::-;;:::i;32480:564::-;;;;;;;;;;-1:-1:-1;32480:564:0;;;;;:::i;:::-;;:::i;29795:763::-;;;;;;;;;;-1:-1:-1;29795:763:0;;;;;:::i;:::-;;:::i;25956:33::-;;;;;;;;;;-1:-1:-1;25956:33:0;;;;;;;;25077:81;;;;;;;;;;-1:-1:-1;25077:81:0;;;;-1:-1:-1;;;;;25077:81:0;;;37997:329;;;;;;;;;;-1:-1:-1;37997:329:0;;;;;:::i;:::-;;:::i;38338:364::-;;;;;;;;;;;;;:::i;15597:999::-;;;;;;;;;;-1:-1:-1;15597:999:0;;;;;:::i;:::-;;:::i;:::-;;;;18906:25:1;;;18962:2;18947:18;;18940:34;;;;18990:18;;;18983:34;;;;19048:2;19033:18;;19026:34;19091:3;19076:19;;19069:35;18893:3;18878:19;15597:999:0;18860:250:1;33454:180:0;;;;;;;;;;-1:-1:-1;33454:180:0;;;;;:::i;:::-;;:::i;37373:125::-;;;;;;;;;;-1:-1:-1;37373:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;37462:27:0;37437:4;37462:27;;;:18;:27;;;;;;;;;37373:125;40257:113;;;;;;;;;;-1:-1:-1;40257:113:0;;;;;:::i;:::-;;:::i;9902:90::-;;;;;;;;;;-1:-1:-1;9969:15:0;9902:90;;25642:32;;;;;;;;;;;;;;;;9800:90;;;;;;;;;;-1:-1:-1;9873:9:0;;9800:90;;34442:142;;;;;;;;;;-1:-1:-1;34442:142:0;;;;;:::i;:::-;;:::i;39082:159::-;;;;;;;;;;-1:-1:-1;39082:159:0;;;;;:::i;:::-;;:::i;24017:178::-;;;;;;;;;;-1:-1:-1;24017:178:0;;;;;:::i;:::-;;:::i;37628:357::-;;;;;;;;;;-1:-1:-1;37628:357:0;;;;;:::i;:::-;;:::i;26137:30::-;;;;;;;;;;-1:-1:-1;26137:30:0;;;;;;;;;;;28689:225;;;;;;;;;;-1:-1:-1;28689:225:0;;;;;:::i;:::-;;:::i;9392:148::-;;;;;;;;;;;;;:::i;39723:118::-;;;;;;;;;;-1:-1:-1;39723:118:0;;;;;:::i;:::-;;:::i;40130:115::-;;;;;;;;;;-1:-1:-1;40130:115:0;;;;;:::i;:::-;;:::i;13411:36::-;;;;;;;;;;;;;;;;37228:133;;;;;;;;;;-1:-1:-1;37228:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;37322:31:0;37298:4;37322:31;;;:22;:31;;;;;;;;;37228:133;25685:48;;;;;;;;;;;;;;;;9167:79;;;;;;;;;;-1:-1:-1;9232:6:0;;-1:-1:-1;;;;;9232:6:0;9167:79;;39995:123;;;;;;;;;;-1:-1:-1;39995:123:0;;;;;:::i;:::-;;:::i;28367:98::-;;;;;;;;;;-1:-1:-1;28450:7:0;;;;;;;;;;;;-1:-1:-1;;;28450:7:0;;;;28367:98;;37511:105;;;;;;;;;;-1:-1:-1;37591:17:0;;37511:105;;36972:117;;;;;;;;;;-1:-1:-1;37063:18:0;;36972:117;;40727:366;;;;;;;;;;-1:-1:-1;40727:366:0;;;;;:::i;:::-;;:::i;31640:269::-;;;;;;;;;;-1:-1:-1;31640:269:0;;;;;:::i;:::-;;:::i;24814:108::-;;;;;;;;;;-1:-1:-1;24897:10:0;:17;24814:108;;10238:305;;;;;;;;;;;;;:::i;26278:19::-;;;;;;;;;;-1:-1:-1;26278:19:0;;;;-1:-1:-1;;;;;26278:19:0;;;28930:172;;;;;;;;;;-1:-1:-1;28930:172:0;;;;;:::i;:::-;;:::i;39853:130::-;;;;;;;;;;-1:-1:-1;39853:130:0;;;;;:::i;:::-;;:::i;40495:109::-;;;;;;;;;;-1:-1:-1;40495:109:0;;;;;:::i;:::-;;:::i;25768:51::-;;;;;;;;;;;;;;;;41601:103;;;;;;;;;;-1:-1:-1;41601:103:0;;;;;:::i;:::-;;:::i;40616:99::-;;;;;;;;;;-1:-1:-1;40616:99:0;;;;;:::i;:::-;;:::i;41359:112::-;;;;;;;;;;-1:-1:-1;41359:112:0;;;;;:::i;:::-;;:::i;25996:31::-;;;;;;;;;;-1:-1:-1;25996:31:0;;;;;;;;;;;13454:30;;;;;;;;;;;;;;;;10000:226;;;;;;;;;;-1:-1:-1;10000:226:0;;;;;:::i;:::-;;:::i;29118:148::-;;;;;;;;;;-1:-1:-1;29118:148:0;;;;;:::i;:::-;-1:-1:-1;;;;;29227:18:0;;;29201:7;29227:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;29118:148;39253:100;;;;;;;;;;-1:-1:-1;39253:100:0;;;;;:::i;:::-;;:::i;26174:54::-;;;;;;;;;;;;;;;;40382:101;;;;;;;;;;-1:-1:-1;40382:101:0;;;;;:::i;:::-;;:::i;24207:595::-;;;;;;;;;;-1:-1:-1;24207:595:0;;;;;:::i;:::-;-1:-1:-1;;;;;24482:18:0;24271:24;24482:18;;;;;;;;;;:34;;24530:30;;;;24573:36;;;;24622:29;;;;24664:30;;;;24707:36;;;;24756:25;;;;;24482:34;;24530:30;;24573:36;;24622:29;;24664:30;;24707:36;24756:25;24207:595;;;;;19430:25:1;;;19486:2;19471:18;;19464:34;;;;19514:18;;;19507:34;;;;19572:2;19557:18;;19550:34;;;;19615:3;19600:19;;19593:35;19659:3;19644:19;;19637:35;19703:3;19688:19;;19681:35;19417:3;19402:19;24207:595:0;19384:338:1;9548:244:0;;;;;;;;;;-1:-1:-1;9548:244:0;;;;;:::i;:::-;;:::i;26241:30::-;;;;;;;;;;-1:-1:-1;26241:30:0;;;;-1:-1:-1;;;;;26241:30:0;;;12494:41;;;;;;;;;;-1:-1:-1;12494:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18290:25:1;;;18346:2;18331:18;;18324:34;;;;18374:18;;;18367:34;;;;18432:2;18417:18;;18410:34;;;;18488:14;18481:22;18475:3;18460:19;;18453:51;18535:3;18520:19;;18513:35;18579:3;18564:19;;18557:35;18623:3;18608:19;;18601:35;18277:3;18262:19;12494:41:0;18244:398:1;41105:122:0;;;;;;;;;;-1:-1:-1;41105:122:0;;;;;:::i;:::-;;:::i;41716:280::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;;;;;;;;;41825:6:::1;::::0;-1:-1:-1;;;;;41803:29:0;;::::1;41825:6:::0;::::1;41803:29;;41795:77;;;::::0;-1:-1:-1;;;41795:77:0;;8176:2:1;41795:77:0::1;::::0;::::1;8158:21:1::0;8215:2;8195:18;;;8188:30;8254:34;8234:18;;;8227:62;-1:-1:-1;;;8305:18:1;;;8298:33;8348:19;;41795:77:0::1;8148:225:1::0;41795:77:0::1;41883:6;:37:::0;;-1:-1:-1;;;;;;41883:37:0::1;-1:-1:-1::0;;;;;41883:37:0;::::1;::::0;;::::1;::::0;;;41936:52:::1;::::0;41883:37;;41936:52:::1;::::0;-1:-1:-1;;41936:52:0::1;41716:280:::0;:::o;38714:356::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;38768:14:::1;:21:::0;;38800:11:::1;:18:::0;;-1:-1:-1;;38800:18:0::1;38768:21;38800:18;::::0;;-1:-1:-1;;38829:19:0;38785:4:::1;38829:19:::0;;;38873:2:::1;38859:11;:16:::0;-1:-1:-1;38886:17:0::1;:21:::0;;;38918:15:::1;:19:::0;38961:2:::1;38948:10;:15:::0;38988:21:::1;38974:11;:35:::0;39039:23:::1;39020:16;:42:::0;38714:356::o;29278:167::-;29355:4;29372:39;5424:10;29395:7;29404:6;29372:8;:39::i;:::-;-1:-1:-1;29429:4:0;29278:167;;;;;:::o;29461:318::-;29561:4;29577:36;29587:6;29595:9;29606:6;29577:9;:36::i;:::-;29624:121;29633:6;5424:10;29655:89;29693:6;29655:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29655:19:0;;;;;;:11;:19;;;;;;;;5424:10;29655:33;;;;;;;;;;:37;:89::i;:::-;29624:8;:121::i;:::-;-1:-1:-1;29763:4:0;29461:318;;;;;;:::o;39365:346::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;39501:8:::1;::::0;39460:21:::1;::::0;39501:8:::1;;39500:9;39492:97;;;::::0;-1:-1:-1;;;39492:97:0;;7692:2:1;39492:97:0::1;::::0;::::1;7674:21:1::0;7731:2;7711:18;;;7704:30;7770:34;7750:18;;;7743:62;7841:34;7821:18;;;7814:62;-1:-1:-1;;;7892:19:1;;;7885:42;7944:19;;39492:97:0::1;7664:305:1::0;39492:97:0::1;39627:6;39608:15;:25;;39600:64;;;::::0;-1:-1:-1;;;39600:64:0;;14338:2:1;39600:64:0::1;::::0;::::1;14320:21:1::0;14377:2;14357:18;;;14350:30;14416:28;14396:18;;;14389:56;14462:18;;39600:64:0::1;14310:176:1::0;39600:64:0::1;39681:22;39696:6;39681:14;:22::i;:::-;39423:288;39365:346:::0;:::o;33931:499::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34013:31:0;::::1;;::::0;;;:22:::1;:31;::::0;;;;;::::1;;34005:67;;;::::0;-1:-1:-1;;;34005:67:0;;9291:2:1;34005:67:0::1;::::0;::::1;9273:21:1::0;9330:2;9310:18;;;9303:30;9369:25;9349:18;;;9342:53;9412:18;;34005:67:0::1;9263:173:1::0;34005:67:0::1;34088:9;34083:340;34107:9;:16:::0;34103:20;::::1;34083:340;;;34165:7;-1:-1:-1::0;;;;;34149:23:0::1;:9;34159:1;34149:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;34149:12:0::1;:23;34145:267;;;34208:9;34218:16:::0;;:20:::1;::::0;34237:1:::1;::::0;34218:20:::1;:::i;:::-;34208:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;34193:9:::1;:12:::0;;-1:-1:-1;;;;;34208:31:0;;::::1;::::0;34203:1;;34193:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;34193:46:0::1;-1:-1:-1::0;;;;;34193:46:0;;::::1;;::::0;;34258:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:22;;;34299::::1;:31:::0;;;;:39;;-1:-1:-1;;34299:39:0::1;::::0;;34357:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;34357:15:0;;;;;-1:-1:-1;;;;;;34357:15:0::1;::::0;;;;;39423:288:::1;39365:346:::0;:::o;34145:267::-:1;34125:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34083:340;;31410:218:::0;5424:10;31498:4;31547:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;31547:34:0;;;;;;;;;;31498:4;;31515:83;;31538:7;;31547:50;;31586:10;31547:38;:50::i;41483:106::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;41558:13:::1;:23:::0;41483:106::o;41239:108::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;41315:15:::1;:24:::0;41239:108::o;32480:564::-;32587:7;-1:-1:-1;;;32615:7:0;:23;;32607:67;;;;-1:-1:-1;;;32607:67:0;;11577:2:1;32607:67:0;;;11559:21:1;11616:2;11596:18;;;11589:30;11655:33;11635:18;;;11628:61;11706:18;;32607:67:0;11549:181:1;32607:67:0;32685:15;32716:17;32711:326;;32751:15;32774:21;32785:7;32793:1;32774:10;:21::i;:::-;-1:-1:-1;32750:45:0;;-1:-1:-1;32810:14:0;;-1:-1:-1;;;;;32810:14:0;32711:326;32867:8;:46;;32894:19;;32867:46;;;32878:13;;32867:46;32857:56;;32930:23;32960:28;32971:7;32980;32960:10;:28::i;:::-;-1:-1:-1;32928:60:0;;-1:-1:-1;33003:22:0;;-1:-1:-1;;;;;33003:22:0;29795:763;5424:10;;29887:66;;;;-1:-1:-1;;;29887:66:0;;14693:2:1;29887:66:0;;;14675:21:1;14732:2;14712:18;;;14705:30;14771:34;14751:18;;;14744:62;-1:-1:-1;;;14822:18:1;;;14815:31;14863:19;;29887:66:0;14665:223:1;29887:66:0;29990:11;;-1:-1:-1;;;;;29972:30:0;;;29990:11;;29972:30;;29964:76;;;;-1:-1:-1;;;29964:76:0;;13120:2:1;29964:76:0;;;13102:21:1;13159:2;13139:18;;;13132:30;13198:34;13178:18;;;13171:62;-1:-1:-1;;;13249:18:1;;;13242:31;13290:19;;29964:76:0;13092:223:1;29964:76:0;30053:15;30071:17;30081:6;30071:9;:17::i;:::-;30053:35;;30118:6;30107:7;:17;;30099:64;;;;-1:-1:-1;;;30099:64:0;;5696:2:1;30099:64:0;;;5678:21:1;5735:2;5715:18;;;5708:30;5774:34;5754:18;;;5747:62;-1:-1:-1;;;5825:18:1;;;5818:32;5867:19;;30099:64:0;5668:224:1;30099:64:0;30176:23;30202:29;30213:17;:15;:17::i;:::-;30202:6;;:10;:29::i;:::-;-1:-1:-1;;;;;30335:26:0;;;;;;:18;:26;;;;;;30176:55;;-1:-1:-1;30335:47:0;;30176:55;30335:30;:47::i;:::-;-1:-1:-1;;;;;30306:26:0;;;;;;:18;:26;;;;;;;;:76;;;;30397:22;:30;;;;;;30393:98;;;-1:-1:-1;;;;;30462:17:0;;;;;;:9;:17;;;;;;:29;;30484:6;30462:21;:29::i;:::-;-1:-1:-1;;;;;30442:17:0;;;;;;:9;:17;;;;;:49;30393:98;30504:46;30517:6;30525;30533:15;30504:11;:46::i;:::-;29834:724;;;29795:763;:::o;37997:329::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;38100:14:::1;:32:::0;;-1:-1:-1;;;;;;38100:32:0::1;-1:-1:-1::0;;;;;38100:32:0;::::1;;::::0;;38152:25:::1;38100:32:::0;38152:8:::1;:25::i;:::-;-1:-1:-1::0;;;;;38188:35:0;::::1;;::::0;;;:18:::1;:35;::::0;;;;:42;;-1:-1:-1;;38188:42:0::1;38226:4;38188:42;::::0;;38243:24:::1;38252:14:::0;38243:8:::1;:24::i;:::-;-1:-1:-1::0;;;;;38278:34:0::1;;::::0;;;:18:::1;:34;::::0;;;;:41;;-1:-1:-1;;38278:41:0::1;38315:4;38278:41;::::0;;-1:-1:-1;37997:329:0:o;38338:364::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;38397:14:::1;:22:::0;;38430:11:::1;:19:::0;;-1:-1:-1;;38430:19:0::1;::::0;;-1:-1:-1;;38460:18:0;38397:22:::1;38460:18;::::0;;38414:5:::1;38489:11;:15:::0;;;38515:17:::1;:21:::0;;;38547:15:::1;:19:::0;;;38577:10:::1;:14:::0;-1:-1:-1;;;38602:11:0::1;:38:::0;;;38651:16:::1;:43:::0;38338:364::o;15597:999::-;-1:-1:-1;;;;;15946:18:0;;15665:29;15946:18;;;;;;;;;;:30;;;15665:29;;;;;;;;;;15928:48;;:15;:48;:::i;:::-;15906:70;;15987:19;16009:32;16025:15;;16009:11;:15;;:32;;;;:::i;:::-;-1:-1:-1;;;;;16084:18:0;;:4;:18;;;;;;;;;;:34;15987:54;;-1:-1:-1;16084:49:0;-1:-1:-1;16084:49:0;:107;;-1:-1:-1;;;;;16140:18:0;;:4;:18;;;;;;;;;;:34;:51;;16179:11;16140:38;:51::i;:::-;16084:107;;;16136:1;16084:107;-1:-1:-1;;;;;16206:18:0;;:4;:18;;;;;;;;;;:30;;;:45;-1:-1:-1;16206:45:0;:99;;-1:-1:-1;;;;;16258:18:0;;:4;:18;;;;;;;;;;:30;;;:47;;16293:11;16258:34;:47::i;:::-;16206:99;;;16254:1;16206:99;-1:-1:-1;;;;;16320:18:0;;:4;:18;;;;;;;;;;:36;;;:51;-1:-1:-1;16320:51:0;:111;;-1:-1:-1;;;;;16378:18:0;;:4;:18;;;;;;;;;;:36;;;:53;;16419:11;16378:40;:53::i;:::-;16320:111;;;16374:1;16320:111;-1:-1:-1;;;;;16446:18:0;;:4;:18;;;;;;;;;;:29;;;:44;-1:-1:-1;16446:44:0;:97;;-1:-1:-1;;;;;16497:18:0;;:4;:18;;;;;;;;;;:29;;;:46;;16531:11;16497:33;:46::i;:::-;16446:97;;;16493:1;16446:97;16062:522;;;;-1:-1:-1;16062:522:0;-1:-1:-1;16062:522:0;;-1:-1:-1;16558:11:0;;-1:-1:-1;15597:999:0;-1:-1:-1;;;15597:999:0:o;33454:180::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33539:31:0;::::1;;::::0;;;:22:::1;:31;::::0;;;;;::::1;;33538:32;33530:68;;;::::0;-1:-1:-1;;;33530:68:0;;8580:2:1;33530:68:0::1;::::0;::::1;8562:21:1::0;8619:2;8599:18;;;8592:30;8658:25;8638:18;;;8631:53;8701:18;;33530:68:0::1;8552:173:1::0;33530:68:0::1;33609:17;33618:7;33609:8;:17::i;:::-;33454:180:::0;:::o;40257:113::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;40336:17:::1;:26:::0;40257:113::o;34442:142::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34530:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;34530:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34442:142::o;39082:159::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;39155:19:::1;:30:::0;;-1:-1:-1;;39155:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39201:32:::1;::::0;3686:41:1;;;39201:32:0::1;::::0;3674:2:1;3659:18;39201:32:0::1;;;;;;;39082:159:::0;:::o;24017:178::-;24108:10;:17;24079:13;;24105:39;;-1:-1:-1;24139:5:0;;24017:178;-1:-1:-1;24017:178:0:o;24105:39::-;-1:-1:-1;;;;;;24163:17:0;:4;:17;;;;;;;;;;:23;;;;;;24017:178::o;37628:357::-;37691:19;37713:31;37731:11;37713:9;:31::i;:::-;37691:53;;37777:1;37763:11;:15;37755:62;;;;-1:-1:-1;;;37755:62:0;;10820:2:1;37755:62:0;;;10802:21:1;10859:2;10839:18;;;10832:30;10898:34;10878:18;;;10871:62;-1:-1:-1;;;10949:18:1;;;10942:32;10991:19;;37755:62:0;10792:224:1;37755:62:0;37879:24;37891:11;37879;:24::i;:::-;37875:93;;37918:38;37931:11;37944;37918:12;:38::i;28689:225::-;-1:-1:-1;;;;;28778:31:0;;28755:7;28778:31;;;:22;:31;;;;;;;;28774:62;;;-1:-1:-1;;;;;;28818:18:0;;;;;:9;:18;;;;;;;28689:225::o;28774:62::-;-1:-1:-1;;;;;28874:27:0;;;;;;:18;:27;;;;;;28854:48;;:19;:48::i;9392:148::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;9483:6:::1;::::0;9462:40:::1;::::0;9499:1:::1;::::0;-1:-1:-1;;;;;9483:6:0::1;::::0;-1:-1:-1;;;;;;;;;;;9462:40:0;9499:1;;9462:40:::1;9513:6;:19:::0;;-1:-1:-1;;;;;;9513:19:0::1;::::0;;9392:148::o;39723:118::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;39806:18:::1;:27:::0;39723:118::o;40130:115::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;40220:17:::1;:6:::0;40230::::1;40220:17;:::i;:::-;40206:11;:31:::0;-1:-1:-1;40130:115:0:o;39995:123::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;40089:21:::1;:10:::0;40103:6:::1;40089:21;:::i;:::-;40070:16;:40:::0;-1:-1:-1;39995:123:0:o;40727:366::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;40861:21:::1;::::0;-1:-1:-1;;;;;40834:48:0;;::::1;40861:21:::0;::::1;40834:48;;40826:110;;;::::0;-1:-1:-1;;;40826:110:0;;9643:2:1;40826:110:0::1;::::0;::::1;9625:21:1::0;9682:2;9662:18;;;9655:30;9721:34;9701:18;;;9694:62;-1:-1:-1;;;9772:18:1;;;9765:47;9829:19;;40826:110:0::1;9615:239:1::0;40826:110:0::1;41005:21;::::0;40952:75:::1;::::0;-1:-1:-1;;;;;41005:21:0;;::::1;::::0;40952:75;::::1;::::0;::::1;::::0;41005:21:::1;::::0;40952:75:::1;41038:21;:47:::0;;-1:-1:-1;;;;;;41038:47:0::1;-1:-1:-1::0;;;;;41038:47:0;;;::::1;::::0;;;::::1;::::0;;40727:366::o;31640:269::-;31733:4;31750:129;5424:10;31773:7;31782:96;31821:15;31782:96;;;;;;;;;;;;;;;;;5424:10;31782:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;31782:34:0;;;;;;;;;;;;:38;:96::i;10238:305::-;10290:14;;-1:-1:-1;;;;;10290:14:0;10308:10;10290:28;10282:76;;;;-1:-1:-1;;;10282:76:0;;16645:2:1;10282:76:0;;;16627:21:1;16684:2;16664:18;;;16657:30;16723:34;16703:18;;;16696:62;-1:-1:-1;;;16774:18:1;;;16767:33;16817:19;;10282:76:0;16617:225:1;10282:76:0;10395:9;;10377:15;:27;10369:72;;;;-1:-1:-1;;;10369:72:0;;16285:2:1;10369:72:0;;;16267:21:1;16324:2;16304:18;;;16297:30;16363:33;16343:18;;;16336:61;16414:18;;10369:72:0;16257:181:1;10369:72:0;10486:14;;10478:6;;10457:44;;-1:-1:-1;;;;;10486:14:0;;;;10478:6;;;;-1:-1:-1;;;;;;;;;;;10457:44:0;10486:14;;10457:44;10521:14;;10512:6;:23;;-1:-1:-1;;;;;;10512:23:0;-1:-1:-1;;;;;10521:14:0;;;10512:23;;;;;;10238:305::o;28930:172::-;29010:4;29026:42;5424:10;29050:9;29061:6;29026:9;:42::i;39853:130::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;39953:22:::1;:11:::0;39968:6:::1;39953:22;:::i;:::-;39932:18;:43:::0;-1:-1:-1;39853:130:0:o;40495:109::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;40572:15:::1;:24:::0;40495:109::o;41601:103::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;41674:12:::1;:22:::0;41601:103::o;40616:99::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;40688:10:::1;:19:::0;40616:99::o;41359:112::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;41437:16:::1;:26:::0;41359:112::o;10000:226::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;10081:6:::1;::::0;;10064:14:::1;:23:::0;;-1:-1:-1;;;;;;10064:23:0;;::::1;-1:-1:-1::0;;;;;10081:6:0;::::1;10064:23;::::0;;;10098:19:::1;::::0;;10140:22:::1;10158:4:::0;10140:15:::1;:22;:::i;:::-;10128:9;:34:::0;10199:6:::1;::::0;10178:40:::1;::::0;10215:1:::1;::::0;-1:-1:-1;;;;;10199:6:0::1;::::0;-1:-1:-1;;;;;;;;;;;10178:40:0;10215:1;;10178:40:::1;10000:226:::0;:::o;39253:100::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;39322:11:::1;:23:::0;;;::::1;;;;-1:-1:-1::0;;39322:23:0;;::::1;::::0;;;::::1;::::0;;39253:100::o;40382:101::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;40455:11:::1;:20:::0;40382:101::o;9548:244::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9637:22:0;::::1;9629:73;;;::::0;-1:-1:-1;;;9629:73:0;;6510:2:1;9629:73:0::1;::::0;::::1;6492:21:1::0;6549:2;6529:18;;;6522:30;6588:34;6568:18;;;6561:62;-1:-1:-1;;;6639:18:1;;;6632:36;6685:19;;9629:73:0::1;6482:228:1::0;9629:73:0::1;9739:6;::::0;9718:38:::1;::::0;-1:-1:-1;;;;;9718:38:0;;::::1;::::0;9739:6:::1;::::0;-1:-1:-1;;;;;;;;;;;9718:38:0;9739:6:::1;::::0;9718:38:::1;9767:6;:17:::0;;-1:-1:-1;;;;;;9767:17:0::1;-1:-1:-1::0;;;;;9767:17:0;;;::::1;::::0;;;::::1;::::0;;9548:244::o;41105:122::-;9301:6;;-1:-1:-1;;;;;9301:6:0;5424:10;9301:22;9293:67;;;;-1:-1:-1;;;9293:67:0;;;;;;;:::i;:::-;41188:21:::1;:31:::0;41105:122::o;2894:179::-;2952:7;;2984:5;2988:1;2984;:5;:::i;:::-;2972:17;;3013:1;3008;:6;;3000:46;;;;-1:-1:-1;;;3000:46:0;;6917:2:1;3000:46:0;;;6899:21:1;6956:2;6936:18;;;6929:30;6995:29;6975:18;;;6968:57;7042:18;;3000:46:0;6889:177:1;3477:153:0;3535:7;3567:1;3563;:5;3555:44;;;;-1:-1:-1;;;3555:44:0;;10465:2:1;3555:44:0;;;10447:21:1;10504:2;10484:18;;;10477:30;10543:28;10523:18;;;10516:56;10589:18;;3555:44:0;10437:176:1;3555:44:0;3617:5;3621:1;3617;:5;:::i;3081:158::-;3139:7;3172:1;3167;:6;;3159:49;;;;-1:-1:-1;;;3159:49:0;;8932:2:1;3159:49:0;;;8914:21:1;8971:2;8951:18;;;8944:30;9010:32;8990:18;;;8983:60;9060:18;;3159:49:0;8904:180:1;3159:49:0;3226:5;3230:1;3226;:5;:::i;31921:370::-;-1:-1:-1;;;;;32015:19:0;;32007:84;;;;-1:-1:-1;;;32007:84:0;;15095:2:1;32007:84:0;;;15077:21:1;15134:2;15114:18;;;15107:30;15173:34;15153:18;;;15146:62;-1:-1:-1;;;15224:18:1;;;15217:50;15284:19;;32007:84:0;15067:242:1;32007:84:0;-1:-1:-1;;;;;32110:21:0;;32102:84;;;;-1:-1:-1;;;32102:84:0;;7273:2:1;32102:84:0;;;7255:21:1;7312:2;7292:18;;;7285:30;7351:34;7331:18;;;7324:62;-1:-1:-1;;;7402:18:1;;;7395:48;7460:19;;32102:84:0;7245:240:1;32102:84:0;-1:-1:-1;;;;;32199:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;32251:32;;16993:25:1;;;32251:32:0;;16966:18:1;32251:32:0;;;;;;;;31921:370;;;:::o;46930:2253::-;-1:-1:-1;;;;;47027:20:0;;47019:70;;;;-1:-1:-1;;;47019:70:0;;5290:2:1;47019:70:0;;;5272:21:1;5329:2;5309:18;;;5302:30;5368:34;5348:18;;;5341:62;-1:-1:-1;;;5419:18:1;;;5412:35;5464:19;;47019:70:0;5262:227:1;47019:70:0;-1:-1:-1;;;;;47108:23:0;;47100:71;;;;-1:-1:-1;;;47100:71:0;;10061:2:1;47100:71:0;;;10043:21:1;10100:2;10080:18;;;10073:30;10139:34;10119:18;;;10112:62;-1:-1:-1;;;10190:18:1;;;10183:33;10233:19;;47100:71:0;10033:225:1;47100:71:0;47208:11;;-1:-1:-1;;;;;47190:30:0;;;47208:11;;47190:30;;47182:80;;;;-1:-1:-1;;;47182:80:0;;13932:2:1;47182:80:0;;;13914:21:1;13971:2;13951:18;;;13944:30;14010:34;13990:18;;;13983:62;-1:-1:-1;;;14061:18:1;;;14054:35;14106:19;;47182:80:0;13904:227:1;47182:80:0;47290:1;47281:6;:10;47273:64;;;;-1:-1:-1;;;47273:64:0;;13522:2:1;47273:64:0;;;13504:21:1;13561:2;13541:18;;;13534:30;13600:34;13580:18;;;13573:62;-1:-1:-1;;;13651:18:1;;;13644:39;13700:19;;47273:64:0;13494:231:1;47273:64:0;47394:6;;-1:-1:-1;;;;;47376:25:0;;;47394:6;;47376:25;;;;:136;;-1:-1:-1;;;;;;47483:29:0;;;;;;:18;:29;;;;;;;;47482:30;47376:136;:218;;;;-1:-1:-1;;;;;;47568:26:0;;;;;;:18;:26;;;;;;;;47567:27;47376:218;47358:375;;;47640:11;;47630:6;:21;;47622:85;;;;-1:-1:-1;;;47622:85:0;;11937:2:1;47622:85:0;;;11919:21:1;11976:2;11956:18;;;11949:30;12015:34;11995:18;;;11988:62;-1:-1:-1;;;12066:18:1;;;12059:49;12125:19;;47622:85:0;11909:241:1;47622:85:0;47777:1;47758:16;;:20;:54;;;;-1:-1:-1;;;;;;47783:29:0;;;;;;:18;:29;;;;;;;;47782:30;47758:54;:85;;;;-1:-1:-1;;;;;;47817:26:0;;;;;;:18;:26;;;;;;;;47816:27;47758:85;:115;;;;-1:-1:-1;47868:4:0;;-1:-1:-1;;;;;47847:26:0;;;47868:4;;47847:26;;47758:115;47753:327;;;47895:24;47922:20;47932:9;47922;:20::i;:::-;47998:16;;47895:47;;-1:-1:-1;47969:25:0;47988:6;47895:47;47969:25;:::i;:::-;:45;;47961:103;;;;-1:-1:-1;;;47961:103:0;;15516:2:1;47961:103:0;;;15498:21:1;15555:2;15535:18;;;15528:30;15594:34;15574:18;;;15567:62;-1:-1:-1;;;15645:18:1;;;15638:43;15698:19;;47961:103:0;15488:235:1;47961:103:0;47876:204;47753:327;48202:14;;;;;;;;48232:11;;;48227:41;;;-1:-1:-1;48260:5:0;48227:41;-1:-1:-1;;;;;48377:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;48407:29:0;;;;;;:18;:29;;;;;;;;48377:59;48374:111;;;-1:-1:-1;48467:5:0;48374:111;48577:4;;48526;;48506:17;;-1:-1:-1;;;;;48564:17:0;;;48577:4;;48564:17;:68;;48603:4;;-1:-1:-1;;;;;48593:14:0;;;48603:4;;48593:14;:39;;48622:10;48564:68;;48593:39;48610:9;48564:68;;;48584:6;48564:68;48660:11;;48542:90;;-1:-1:-1;48660:11:0;;;;;48656:246;;48731:24;48743:11;48731;:24::i;:::-;48727:162;;48775:33;48788:11;48801:6;48775:12;:33::i;:::-;48868:5;48853:20;;48727:162;48993:11;;;;;;;48990:40;;;49022:5;49007:20;;48990:40;49050:22;:20;:22::i;:::-;49083:82;49099:6;49107:9;49118:6;49126:10;49138:12;49152:11;49083:15;:82::i;:::-;47008:2175;;;46930:2253;;;:::o;3799:200::-;3919:7;3955:12;3947:6;;;;3939:29;;;;-1:-1:-1;;;3939:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3986:5:0;3990:1;3986;:5;:::i;:::-;3979:12;3799:200;-1:-1:-1;;;;3799:200:0:o;49650:124::-;49710:10;;49706:61;;49734:24;49751:6;49734:16;:24::i;34592:585::-;34669:7;34678;34687;34696;34705;34735:18;34756:38;34781:12;;34756:20;34768:7;34756;:11;;:20;;;;:::i;:::-;:24;;:38::i;:::-;34735:59;-1:-1:-1;34805:23:0;34831;:7;34735:59;34831:11;:23::i;:::-;34805:49;;34865:19;34887:17;:15;:17::i;:::-;34865:39;-1:-1:-1;34915:15:0;34933:24;:7;34865:39;34933:11;:24::i;:::-;34915:42;-1:-1:-1;34968:18:0;34989:27;:10;35004:11;34989:14;:27::i;:::-;34968:48;-1:-1:-1;35027:23:0;35053;:7;34968:48;35053:11;:23::i;:::-;35105:7;;;;35131;-1:-1:-1;35140:15:0;;-1:-1:-1;35157:11:0;;-1:-1:-1;34592:585:0;-1:-1:-1;;;;;;34592:585:0:o;35189:171::-;35238:7;35259:15;35276;35295:19;:17;:19::i;:::-;35258:56;;-1:-1:-1;35258:56:0;-1:-1:-1;35332:20:0;35258:56;;35332:11;:20::i;:::-;35325:27;;;;35189:171;:::o;3249:220::-;3307:7;3331:6;3327:20;;-1:-1:-1;3346:1:0;3339:8;;3327:20;3358:9;3370:5;3374:1;3370;:5;:::i;:::-;3358:17;-1:-1:-1;3403:1:0;3394:5;3398:1;3358:17;3394:5;:::i;:::-;:10;3386:56;;;;-1:-1:-1;;;3386:56:0;;12357:2:1;3386:56:0;;;12339:21:1;12396:2;12376:18;;;12369:30;12435:34;12415:18;;;12408:62;-1:-1:-1;;;12486:18:1;;;12479:31;12527:19;;3386:56:0;12329:223:1;30690:708:0;31075:11;;-1:-1:-1;;;;;31075:11:0;31056:31;;;;:18;:31;;;;;;:42;;31092:5;31056:35;:42::i;:::-;31041:11;;;-1:-1:-1;;;;;31041:11:0;;;31022:31;;;;:18;:31;;;;;;;;:76;;;;31136:11;;;;;31113:35;;:22;:35;;;;;;;31109:112;;;31198:11;;-1:-1:-1;;;;;31198:11:0;31188:22;;;;:9;:22;;;;;;:33;;31215:5;31188:26;:33::i;:::-;31173:11;;-1:-1:-1;;;;;31173:11:0;31163:22;;;;:9;:22;;;;;:58;31109:112;31371:11;;31354:36;;16993:25:1;;;-1:-1:-1;;;;;31371:11:0;;;;31354:36;;;;;16981:2:1;16966:18;31354:36:0;16948:76:1;33646:277:0;-1:-1:-1;;;;;33704:27:0;;33734:1;33704:27;;;:18;:27;;;;;;:31;33701:132;;-1:-1:-1;;;;;33793:27:0;;;;;;:18;:27;;;;;;33773:48;;:19;:48::i;:::-;-1:-1:-1;;;;;33752:18:0;;;;;;:9;:18;;;;;:69;33701:132;-1:-1:-1;;;;;33843:31:0;;;;;:22;:31;;;;;:38;;-1:-1:-1;;33843:38:0;33877:4;33843:38;;;;;;33892:9;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;;33892:23:0;;;;;;33646:277::o;15130:459::-;15211:11;15225:44;15256:12;;15225:26;15237:13;;15225:7;:11;;:26;;;;:::i;:44::-;15211:58;-1:-1:-1;15290:16:0;:7;15211:58;15290:11;:16::i;:::-;15280:26;;15317:263;15344:12;15372:16;;15404:12;;15432:18;;15466:11;;15493:15;15524;15542:1;15524:19;;;;:::i;:::-;15558:7;15317:12;:263::i;:::-;15200:389;15130:459;;:::o;33172:270::-;33240:7;33279:16;;33268:7;:27;;33260:82;;;;-1:-1:-1;;;33260:82:0;;6099:2:1;33260:82:0;;;6081:21:1;6138:2;6118:18;;;6111:30;6177:34;6157:18;;;6150:62;-1:-1:-1;;;6228:18:1;;;6221:40;6278:19;;33260:82:0;6071:232:1;33260:82:0;33353:19;33375:17;:15;:17::i;:::-;33353:39;-1:-1:-1;33410:24:0;:7;33353:39;33410:11;:24::i;46059:854::-;46167:11;;;;;;;46161:745;;46195:28;46226:24;46244:4;46226:9;:24::i;:::-;46325:18;;46377:8;;46195:55;;-1:-1:-1;46301:42:0;;;;46377:8;;46376:9;:20;;;;;46389:7;46376:20;:35;;;;-1:-1:-1;46400:11:0;;;;;;;46376:35;46372:177;;;46432:8;:15;;-1:-1:-1;;46432:15:0;46443:4;46432:15;;;46466:32;46477:20;46466:10;:32::i;:::-;46517:8;:16;;-1:-1:-1;;46517:16:0;;;46372:177;46672:19;;46603:21;;46672:19;;:60;;;;;46714:18;;46695:15;:37;;46672:60;:73;;;;-1:-1:-1;46737:8:0;;;;46736:9;46672:73;46669:226;;;-1:-1:-1;46784:18:0;;46839:40;46854:24;46784:18;46874:3;46854:19;:24::i;:::-;46839:14;:40::i;46161:745::-;46059:854::o;42014:1274::-;42221:29;42252:25;42279:31;42323:24;42349:28;42381:41;42396:11;42409:12;42381:14;:41::i;:::-;42220:202;;;;;;;;;;42446:17;42466:11;;;;;;;;;;;:91;;42484:73;42539:17;42484:50;:21;42510:23;42484:25;:50::i;:::-;:54;;:73::i;:::-;42466:91;;;42480:1;42466:91;42638:4;;42446:111;;-1:-1:-1;42596:4:0;;-1:-1:-1;;;;;42625:17:0;;;42638:4;;42625:17;42622:142;;;42671:11;;;;;;;:49;;42689:31;:9;42703:16;42689:13;:31::i;:::-;42671:49;;;42685:1;42671:49;42659:61;;42747:5;42735:17;;42622:142;42787:12;42784:263;;;42885:150;42898:11;42911:6;42919:20;42941:21;42964:17;42983:23;43008:16;43026:8;42885:12;:150::i;:::-;43072:7;43066:33;;43095:1;43083:13;;43066:33;43119:152;43139:6;43147:9;43158:6;43166:9;43177:8;43187:21;43210:17;43229:23;43254:16;43119:19;:152::i;:::-;42152:1136;;;;;;;42014:1274;;;;;;:::o;50421:551::-;50566:16;;;50580:1;50566:16;;;;;;;;50542:21;;50566:16;;;;;;;;-1:-1:-1;;50603:6:0;;:13;;;-1:-1:-1;;;50603:13:0;;;;50542:40;;-1:-1:-1;;;;;;50603:6:0;;;;:11;;-1:-1:-1;50603:13:0;;;;;;;;;;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50593:4;50598:1;50593:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;50593:23:0;;;-1:-1:-1;;;;;50593:23:0;;;;;50645:4;50627;50632:1;50627:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50627:23:0;;;:7;;;;;;;;;:23;50687:6;;50840:11;;50687:221;;-1:-1:-1;;;50687:221:0;;:6;;;;:57;;50752:6;;50687:221;;:6;;50821:4;;50840:11;;;;50882:15;;50687:221;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50934:30;50951:6;50959:4;50934:30;;;;;;;:::i;:::-;;;;;;;;50471:501;50421:551;:::o;35372:916::-;35470:16;;35423:7;;;;-1:-1:-1;;;35423:7:0;35787:342;35811:9;:16;35807:20;;35787:342;;;35888:7;35853:18;:32;35872:9;35882:1;35872:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35872:12:0;35853:32;;;;;;;;;;;;;:42;;:79;;;35925:7;35899:9;:23;35909:9;35919:1;35909:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35909:12:0;35899:23;;;;;;;;;;;;;:33;35853:79;35849:137;;;-1:-1:-1;;35955:16:0;;;-1:-1:-1;;;25536:22:0;-1:-1:-1;35372:916:0;-1:-1:-1;;35372:916:0:o;35849:137::-;36011:45;36023:18;:32;36042:9;36052:1;36042:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36042:12:0;36023:32;;;;;;;;;;;;;36011:7;;:11;:45::i;:::-;36001:55;;36081:36;36093:9;:23;36103:9;36113:1;36103:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36103:12:0;36093:23;;;;;;;;;;;;;36081:7;;:11;:36::i;:::-;36071:46;-1:-1:-1;35829:3:0;;;;:::i;:::-;;;;35787:342;;;-1:-1:-1;36143:12:0;;;:60;;-1:-1:-1;36169:16:0;;:34;;-1:-1:-1;;;36169:20:0;:34::i;:::-;36159:7;:44;36143:60;36139:105;;;-1:-1:-1;;36213:16:0;;;-1:-1:-1;;;25536:22:0;-1:-1:-1;35372:916:0;-1:-1:-1;35372:916:0:o;36139:105::-;36263:7;;36272;;-1:-1:-1;35372:916:0;-1:-1:-1;35372:916:0:o;21836:1106::-;22083:25;22095:12;22083:11;:25::i;:::-;22082:26;22074:64;;;;-1:-1:-1;;;22074:64:0;;11223:2:1;22074:64:0;;;11205:21:1;11262:2;11242:18;;;11235:30;11301:27;11281:18;;;11274:55;11346:18;;22074:64:0;11195:175:1;22074:64:0;22183:10;:17;;-1:-1:-1;;;;;22149:31:0;;;;;;:17;:31;;;;;;;;:51;;;22211:29;;;;;;;;;;;-1:-1:-1;;;;;;22211:29:0;;;;;22261:18;;;;;;;:53;;;22326:30;;;:45;;;22383:36;;;:57;;;22451:29;;;:43;;;22505:24;;;:31;;-1:-1:-1;;22505:31:0;;;;;;;22547:30;;;:45;;;22604:36;;;:57;;;22672:25;;;;:35;;;22734:198;;18906:25:1;;;18947:18;;;18940:34;;;18990:18;;;18983:34;;;19048:2;19033:18;;19026:34;;;19091:3;19076:19;;19069:35;;;22149:31:0;22734:198;;18893:3:1;18878:19;22734:198:0;;;;;;;;21836:1106;;;;;;;;:::o;49201:437::-;49304:21;49336:38;49353:20;49336:16;:38::i;:::-;49385:26;49414:41;:21;49440:14;49414:25;:41::i;:::-;49539:21;;49597;;49385:70;;-1:-1:-1;49510:110:0;;-1:-1:-1;;;;;49539:21:0;;;;49563:56;;:29;49385:70;49586:5;49563:22;:29::i;:::-;:33;;:56::i;:::-;49510:20;:110::i;13983:1135::-;14078:7;14087;14096;14105;14114;14145:33;14180:29;14211:35;14262:28;14292:29;14325;14341:12;14325:15;:29::i;:::-;14144:210;;;;;;;;;;14447:26;14477:12;14476:13;:60;;14511:25;14476:60;;;14492:16;;14476:60;14447:89;;14547:22;14573:12;14572:13;:52;;14603:21;14572:52;;;14588:12;;14572:52;14547:77;;14635:28;14667:12;14666:13;:64;;14703:27;14666:64;;;14682:18;;14666:64;14635:95;;14743:21;14768:12;14767:13;:51;;14798:20;14767:51;;;14783:11;;14767:51;14743:75;;14829:21;14855:12;14854:13;:55;;14888:21;14854:55;;;14870:15;;14854:55;14951:18;;-1:-1:-1;14983:14:0;;-1:-1:-1;15011:20:0;;-1:-1:-1;15045:13:0;-1:-1:-1;14829:80:0;;-1:-1:-1;;;;;;;13983:1135:0;;;;;;;;:::o;19432:1584::-;19673:27;19702:29;19733:23;19758:22;19798:128;19827:11;19840:7;19849:11;19862:16;19880:18;19900:12;19914:11;19798:27;:128::i;:::-;19672:254;;;;;;;;19995:16;20015:52;20036:11;20049:7;20058:8;20015:20;:52::i;:::-;19994:73;-1:-1:-1;20106:8:0;20149:11;20195;20246:16;20304:18;20358:12;20405:11;20438:570;20149:11;20106:8;20497:69;;20531:35;:17;20553:12;20531:21;:35::i;:::-;20497:69;;;20509:19;20497:69;20582:9;:61;;20612:31;:13;20630:12;20612:17;:31::i;:::-;20582:61;;;20594:15;20582:61;20659:9;:73;;20695:37;:19;20719:12;20695:23;:37::i;:::-;20659:73;;;20671:21;20659:73;20749:9;:59;;20778:30;:12;20795;20778:16;:30::i;:::-;20749:59;;;20761:14;20749:59;20823:9;:93;;-1:-1:-1;;;;;20877:18:0;;:4;:18;;;;;;;;;;:25;;;:39;;20907:8;20877:29;:39::i;:::-;20823:93;;;-1:-1:-1;;;;;20835:18:0;;:4;:18;;;;;;;;;;:25;;;:39;;20865:8;20835:29;:39::i;:::-;20931:15;20980:13;;20962:15;:31;;;;:::i;:::-;20438:15;:570::i;:::-;19646:1370;;;;;;;;;;;;19432:1584;;;;;;;;:::o;43300:799::-;43569:15;43586:23;43611:15;43638:23;43663:19;43687:29;43698:6;43706:9;43687:10;:29::i;:::-;43568:148;;-1:-1:-1;43568:148:0;;-1:-1:-1;43568:148:0;-1:-1:-1;43568:148:0;-1:-1:-1;43568:148:0;-1:-1:-1;43744:8:0;43774:84;43788:6;43796:9;43568:148;;;;43774:13;:84::i;:::-;43880:137;43890:6;43898:11;43911:9;43922:21;43945:17;43964:23;43989:16;44007:9;43880;:137::i;:::-;44060:9;-1:-1:-1;;;;;44043:44:0;44052:6;-1:-1:-1;;;;;44043:44:0;;44071:15;44043:44;;;;16993:25:1;;16981:2;16966:18;;16948:76;44043:44:0;;;;;;;;43547:552;;;;;;43300:799;;;;;;;;;:::o;49786:623::-;49936:16;;;49950:1;49936:16;;;;;;;;49912:21;;49936:16;;;;;;;;;;-1:-1:-1;49936:16:0;49912:40;;49981:4;49963;49968:1;49963:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49963:23:0;;;:7;;;;;;;;;;:23;;;;50007:6;;:13;;;-1:-1:-1;;;50007:13:0;;;;:6;;;;;:11;;:13;;;;;49963:7;;50007:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49997:4;50002:1;49997:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49997:23:0;;;:7;;;;;;;;;:23;50065:6;;50033:53;;50050:4;;50065:6;50074:11;50033:8;:53::i;:::-;50125:6;;:215;;-1:-1:-1;;;50125:215:0;;-1:-1:-1;;;;;50125:6:0;;;;:57;;:215;;50197:11;;50125:6;;50267:4;;50294;;50314:15;;50125:215;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50366:35;50383:11;50396:4;50366:35;;;;;;;:::i;50984:126::-;51076:26;;-1:-1:-1;;;;;51076:18:0;;;:26;;;;;51095:6;;51076:26;;;;51095:6;51076:18;:26;;;;;;;;;;;;;;;;;;;16925:1046;17147:7;;;;;17229:75;17292:11;17229:58;17274:12;17229:58;:16;17250:18;17229:20;:40::i;:75::-;-1:-1:-1;;;;;17340:18:0;;17315:22;17340:18;;;;;;;;;;:25;;;17204:100;;-1:-1:-1;17413:71:0;17431:11;17340:25;17460:7;17204:100;17413:17;:71::i;:::-;17386:98;-1:-1:-1;17505:26:0;17534:36;:16;17386:98;17534:20;:36::i;:::-;17505:65;-1:-1:-1;17581:22:0;17606:32;:12;17623:14;17606:16;:32::i;:::-;17581:57;-1:-1:-1;17649:28:0;17680:38;:18;17703:14;17680:22;:38::i;:::-;17649:69;-1:-1:-1;17729:21:0;17754:31;:11;17770:14;17754:15;:31::i;:::-;17828:18;;-1:-1:-1;17861:14:0;;-1:-1:-1;17890:20:0;-1:-1:-1;17729:56:0;;-1:-1:-1;;;;;16925:1046:0;;;;;;;;;;;;:::o;21038:790::-;21144:7;21172:33;21207:29;21238:35;21289:28;21322:29;21338:12;21322:15;:29::i;:::-;-1:-1:-1;21171:180:0;;-1:-1:-1;21171:180:0;;-1:-1:-1;21171:180:0;-1:-1:-1;21171:180:0;-1:-1:-1;21453:25:0;21481:85;21171:180;21481:52;21171:180;;21481:29;:52::i;:85::-;21453:113;;21599:8;21598:9;:75;;21656:17;21598:75;;;21610:43;:17;21632:20;21610:21;:43::i;:::-;21578:95;;21696:11;21710:48;21745:12;;21710:30;21722:17;21710:7;:11;;:30;;;;:::i;:48::-;21696:62;-1:-1:-1;21779:16:0;:7;21696:62;21779:11;:16::i;:::-;21769:26;21038:790;-1:-1:-1;;;;;;;;;;21038:790:0:o;22956:1049::-;23215:25;23227:12;23215:11;:25::i;:::-;23207:64;;;;-1:-1:-1;;;23207:64:0;;15930:2:1;23207:64:0;;;15912:21:1;15969:2;15949:18;;;15942:30;16008:28;15988:18;;;15981:56;16054:18;;23207:64:0;15902:176:1;23207:64:0;-1:-1:-1;;;;;23282:18:0;;:4;:18;;;;;;;;;;;;:53;;;23347:30;;;:45;;;23404:36;;;:57;;;23472:29;;;:43;;;23526:25;;;:35;;;23573:30;;;:45;;;23630:36;;:57;;;23723:272;;19430:25:1;;;19471:18;;;19464:34;;;19514:18;;;19507:34;;;19572:2;19557:18;;19550:34;;;19615:3;19600:19;;19593:35;;;19659:3;19644:19;;19637:35;;;19703:3;19688:19;;19681:35;;;23723:272:0;;19417:3:1;19402:19;23723:272:0;19384:338:1;44111:685:0;-1:-1:-1;;;;;44325:26:0;;;;;;:18;:26;;;;;;:39;;44356:7;44325:30;:39::i;:::-;-1:-1:-1;;;;;44296:26:0;;;;;;;:18;:26;;;;;;:68;;;;44407:29;;;;;;;:50;;44441:15;44407:33;:50::i;:::-;-1:-1:-1;;;;;44375:29:0;;;;;;;:18;:29;;;;;;;;:82;;;;44583:30;;;;;:22;:30;;;;;;;44579:91;;;-1:-1:-1;;;;;44637:17:0;;;;;;:9;:17;;;;;;:30;;44659:7;44637:21;:30::i;:::-;-1:-1:-1;;;;;44617:17:0;;;;;;:9;:17;;;;;:50;44579:91;-1:-1:-1;;;;;44684:33:0;;;;;;:22;:33;;;;;;;;44680:109;;;-1:-1:-1;;;;;44745:20:0;;;;;;:9;:20;;;;;;:41;;44770:15;44745:24;:41::i;:::-;-1:-1:-1;;;;;44722:20:0;;;;;;:9;:20;;;;;:64;44111:685;;;;;;:::o;44814:735::-;45064:1;45052:9;:13;:29;;;;-1:-1:-1;45070:11:0;;;;;;;45069:12;45052:29;45047:495;;;45098:58;45113:6;45121:11;45134:21;45098:13;:58::i;:::-;45199:64;45209:6;45217:11;45230:17;45257:4;45199:8;:64::i;:::-;45294:70;45304:6;45312:11;45325:23;45358:4;45294:8;:70::i;:::-;45419:8;45415:116;;45448:63;45458:6;45466:11;45479:16;45505:4;45448:8;:63::i;:::-;44814:735;;;;;;;;:::o;17983:1437::-;18123:7;;18166:27;:14;18185:7;18166:18;:27::i;:::-;18142:51;;18237:14;18220:13;:31;;:103;;18290:33;:14;18309:13;18290:18;:33::i;:::-;18220:103;;;18254:33;:13;18272:14;18254:17;:33::i;:::-;18204:119;-1:-1:-1;18350:25:0;18204:119;18368:6;18350:17;:25::i;:::-;18334:41;;18429:22;18489:13;18475:11;:27;18472:375;;;18536:30;:11;18552:13;18536:15;:30::i;:::-;18519:47;;18472:375;;;18612:11;18596:13;:27;18593:254;;;18657:30;:13;18675:11;18657:17;:30::i;18593:254::-;18732:13;18717:11;:28;18714:133;;;18793:3;18779:11;:17;:56;;18824:11;18779:56;;;18799:22;:11;18815:5;18799:15;:22::i;:::-;18762:73;;18714:133;18963:11;18946:14;:28;18943:99;;;19008:22;:11;19024:5;19008:15;:22::i;:::-;18991:39;;18943:99;19250:19;;19209:38;19228:18;:11;19244:1;19228:15;:18::i;:::-;19209:14;;:18;:38::i;:::-;:60;19206:165;;;19317:3;19303:11;:17;:56;;19348:11;19303:56;;;19323:22;:11;19339:5;19323:15;:22::i;:::-;19286:73;;19206:165;19398:14;17983:1437;-1:-1:-1;;;;;;17983:1437:0:o;36630:322::-;36758:12;;36723;;36738:33;;:15;:6;36749:3;36738:10;:15::i;:33::-;36723:48;-1:-1:-1;36782:12:0;36797:21;36723:48;36806:11;36797:8;:21::i;:::-;36850:16;;36782:36;;-1:-1:-1;36850:26:0;;36782:36;36850:20;:26::i;:::-;36831:16;:45;36917:17;;:27;;36939:4;36917:21;:27::i;:::-;36897:17;:47;-1:-1:-1;;;;;36630:322:0:o;45561:486::-;45705:12;;45667:15;;45685:33;;:15;:6;45696:3;45685:10;:15::i;:33::-;45667:51;-1:-1:-1;45729:15:0;45747:24;45667:51;45759:11;45747;:24::i;:::-;-1:-1:-1;;;;;45816:29:0;;;;;;:18;:29;;;;;;45729:42;;-1:-1:-1;45816:42:0;;45729;45816:33;:42::i;:::-;-1:-1:-1;;;;;45784:29:0;;;;;;:18;:29;;;;;;;;:74;;;;45872:22;:33;;;;;;45869:107;;;-1:-1:-1;;;;;45943:20:0;;;;;;:9;:20;;;;;;:33;;45968:7;45943:24;:33::i;:::-;-1:-1:-1;;;;;45920:20:0;;;;;;:9;:20;;;;;:56;45869:107;46009:17;;:30;;46031:7;46009:21;:30::i;:::-;45989:17;:50;-1:-1:-1;;;;;;45561:486:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;307:1;304;297:12;259:2;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:2;;;570:1;567;560:12;522:2;602:9;596:16;621:31;646:5;621:31;:::i;687:388::-;755:6;763;816:2;804:9;795:7;791:23;787:32;784:2;;;832:1;829;822:12;784:2;871:9;858:23;890:31;915:5;890:31;:::i;:::-;940:5;-1:-1:-1;997:2:1;982:18;;969:32;1010:33;969:32;1010:33;:::i;:::-;1062:7;1052:17;;;774:301;;;;;:::o;1080:456::-;1157:6;1165;1173;1226:2;1214:9;1205:7;1201:23;1197:32;1194:2;;;1242:1;1239;1232:12;1194:2;1281:9;1268:23;1300:31;1325:5;1300:31;:::i;:::-;1350:5;-1:-1:-1;1407:2:1;1392:18;;1379:32;1420:33;1379:32;1420:33;:::i;:::-;1184:352;;1472:7;;-1:-1:-1;;;1526:2:1;1511:18;;;;1498:32;;1184:352::o;1541:315::-;1606:6;1614;1667:2;1655:9;1646:7;1642:23;1638:32;1635:2;;;1683:1;1680;1673:12;1635:2;1722:9;1709:23;1741:31;1766:5;1741:31;:::i;:::-;1791:5;-1:-1:-1;1815:35:1;1846:2;1831:18;;1815:35;:::i;:::-;1805:45;;1625:231;;;;;:::o;1861:315::-;1929:6;1937;1990:2;1978:9;1969:7;1965:23;1961:32;1958:2;;;2006:1;2003;1996:12;1958:2;2045:9;2032:23;2064:31;2089:5;2064:31;:::i;:::-;2114:5;2166:2;2151:18;;;;2138:32;;-1:-1:-1;;;1948:228:1:o;2181:180::-;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:2;;;2306:1;2303;2296:12;2258:2;2329:26;2345:9;2329:26;:::i;2366:180::-;2425:6;2478:2;2466:9;2457:7;2453:23;2449:32;2446:2;;;2494:1;2491;2484:12;2446:2;-1:-1:-1;2517:23:1;;2436:110;-1:-1:-1;2436:110:1:o;2551:316::-;2622:6;2630;2638;2691:2;2679:9;2670:7;2666:23;2662:32;2659:2;;;2707:1;2704;2697:12;2659:2;2743:9;2730:23;2720:33;;2772:35;2803:2;2792:9;2788:18;2772:35;:::i;:::-;2762:45;;2826:35;2857:2;2846:9;2842:18;2826:35;:::i;:::-;2816:45;;2649:218;;;;;:::o;2872:461::-;2925:3;2963:5;2957:12;2990:6;2985:3;2978:19;3016:4;3045:2;3040:3;3036:12;3029:19;;3082:2;3075:5;3071:14;3103:1;3113:195;3127:6;3124:1;3121:13;3113:195;;;3192:13;;-1:-1:-1;;;;;3188:39:1;3176:52;;3248:12;;;;3283:15;;;;3224:1;3142:9;3113:195;;;-1:-1:-1;3324:3:1;;2933:400;-1:-1:-1;;;;;2933:400:1:o;3971:510::-;4242:6;4231:9;4224:25;4285:3;4280:2;4269:9;4265:18;4258:31;4205:4;4306:57;4358:3;4347:9;4343:19;4335:6;4306:57;:::i;:::-;-1:-1:-1;;;;;4399:32:1;;;;4394:2;4379:18;;4372:60;-1:-1:-1;4463:2:1;4448:18;4441:34;4298:65;4214:267;-1:-1:-1;;4214:267:1:o;4486:597::-;4598:4;4627:2;4656;4645:9;4638:21;4688:6;4682:13;4731:6;4726:2;4715:9;4711:18;4704:34;4756:1;4766:140;4780:6;4777:1;4774:13;4766:140;;;4875:14;;;4871:23;;4865:30;4841:17;;;4860:2;4837:26;4830:66;4795:10;;4766:140;;;4924:6;4921:1;4918:13;4915:2;;;4994:1;4989:2;4980:6;4969:9;4965:22;4961:31;4954:42;4915:2;-1:-1:-1;5067:2:1;5046:15;-1:-1:-1;;5042:29:1;5027:45;;;;5074:2;5023:54;;4607:476;-1:-1:-1;;;4607:476:1:o;12557:356::-;12759:2;12741:21;;;12778:18;;;12771:30;12837:34;12832:2;12817:18;;12810:62;12904:2;12889:18;;12731:182::o;17029:332::-;17236:6;17225:9;17218:25;17279:2;17274;17263:9;17259:18;17252:30;17199:4;17299:56;17351:2;17340:9;17336:18;17328:6;17299:56;:::i;17366:582::-;17665:6;17654:9;17647:25;17708:6;17703:2;17692:9;17688:18;17681:34;17751:3;17746:2;17735:9;17731:18;17724:31;17628:4;17772:57;17824:3;17813:9;17809:19;17801:6;17772:57;:::i;:::-;-1:-1:-1;;;;;17865:32:1;;;;17860:2;17845:18;;17838:60;-1:-1:-1;17929:3:1;17914:19;17907:35;17764:65;17637:311;-1:-1:-1;;;17637:311:1:o;19916:128::-;19956:3;19987:1;19983:6;19980:1;19977:13;19974:2;;;19993:18;;:::i;:::-;-1:-1:-1;20029:9:1;;19964:80::o;20049:217::-;20089:1;20115;20105:2;;20159:10;20154:3;20150:20;20147:1;20140:31;20194:4;20191:1;20184:15;20222:4;20219:1;20212:15;20105:2;-1:-1:-1;20251:9:1;;20095:171::o;20271:168::-;20311:7;20377:1;20373;20369:6;20365:14;20362:1;20359:21;20354:1;20347:9;20340:17;20336:45;20333:2;;;20384:18;;:::i;:::-;-1:-1:-1;20424:9:1;;20323:116::o;20444:125::-;20484:4;20512:1;20509;20506:8;20503:2;;;20517:18;;:::i;:::-;-1:-1:-1;20554:9:1;;20493:76::o;20574:135::-;20613:3;-1:-1:-1;;20634:17:1;;20631:2;;;20654:18;;:::i;:::-;-1:-1:-1;20701:1:1;20690:13;;20621:88::o;20714:127::-;20775:10;20770:3;20766:20;20763:1;20756:31;20806:4;20803:1;20796:15;20830:4;20827:1;20820:15;20846:127;20907:10;20902:3;20898:20;20895:1;20888:31;20938:4;20935:1;20928:15;20962:4;20959:1;20952:15;20978:127;21039:10;21034:3;21030:20;21027:1;21020:31;21070:4;21067:1;21060:15;21094:4;21091:1;21084:15;21242:131;-1:-1:-1;;;;;21317:31:1;;21307:42;;21297:2;;21363:1;21360;21353:12

Swarm Source

ipfs://4531a20b19b4355baf42c99e950c58f36d1f4693d6a13a32bb63cc68896b9b6c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.