function checkUpkeep(
    bytes calldata checkData
)
    external
    view
    override
    returns (bool upkeepNeeded, bytes memory performData)
{
    uint256 _tokenId = abi.decode(checkData, (uint256));
    if (_ownerOf(_tokenId) == address(0)) {
        upkeepNeeded = false;
    }
    else {
        upkeepNeeded = (block.timestamp >= s_weatherNftInfo[_tokenId].lastFulfilledAt + s_weatherNftInfo[_tokenId].heartbeat);
        if (upkeepNeeded) {
            performData = checkData;
        }
    }
}
// Add a mapping to track paused NFTs
mapping(uint256 => bool) private s_pausedUpkeep;
// Function to pause upkeep for a specific NFT
function pauseUpkeep(uint256 tokenId) external {
    require(_ownerOf(tokenId) == msg.sender, "WeatherNft__NotOwner");
    s_pausedUpkeep[tokenId] = true;
    emit UpkeepPaused(tokenId);
}
// Function to resume upkeep for a specific NFT
function resumeUpkeep(uint256 tokenId) external {
    require(_ownerOf(tokenId) == msg.sender, "WeatherNft__NotOwner");
    s_pausedUpkeep[tokenId] = false;
    emit UpkeepResumed(tokenId);
}
update checkUpKeep
function checkUpkeep(
    bytes calldata checkData
)
    external
    view
    override
    returns (bool upkeepNeeded, bytes memory performData)
{
    uint256 _tokenId = abi.decode(checkData, (uint256));
    if (_ownerOf(_tokenId) == address(0) || s_pausedUpkeep[_tokenId]) {
        upkeepNeeded = false;
    }
    else {
        upkeepNeeded = (block.timestamp >= s_weatherNftInfo[_tokenId].lastFulfilledAt + s_weatherNftInfo[_tokenId].heartbeat);
        if (upkeepNeeded) {
            performData = checkData;
        }
    }
}
update performUpKeep
function performUpkeep(bytes calldata performData) external override {
    uint256 _tokenId = abi.decode(performData, (uint256));
    require(!s_pausedUpkeep[_tokenId], "WeatherNft__UpkeepPaused");
    uint256 upkeepId = s_weatherNftInfo[_tokenId].upkeepId;
    s_weatherNftInfo[_tokenId].lastFulfilledAt = block.timestamp;
    // Make functions request
    string memory pincode = s_weatherNftInfo[_tokenId].pincode;
    string memory isoCode = s_weatherNftInfo[_tokenId].isoCode;
    bytes32 _reqId = _sendFunctionsWeatherFetchRequest(pincode, isoCode);
    s_funcReqIdToTokenIdUpdate[_reqId] = _tokenId;
    emit NftWeatherUpdateRequestSend(_tokenId, _reqId, upkeepId);
}