docs: def parse(station: str, txt: str) -> TafData:
      """
      Returns TafData and Units dataclasses with parsed data and their associated units
      """
      core.valid_station(station)
      while len(txt) > 3 and txt[:4] in ('TAF ', 'AMD ', 'COR '):
          txt = txt[4:]
      _, station, time = core.get_station_and_time(txt[:20].split(' '))
      retwx = {
          'end_time': None,
          'raw': txt,
          'remarks': None,
          'start_time': None,
          'station': station,
          'time': core.make_timestamp(time)
      }
      txt = txt.replace(station, '')
      txt = txt.replace(time, '').strip()
      if core.uses_na_format(station):
          use_na = True
          units = Units(**NA_UNITS)  # type: ignore
      else:
          use_na = False
          units = Units(**IN_UNITS)  # type: ignore
      # Find and remove remarks
      txt, retwx['remarks'] = core.get_taf_remarks(txt)
      # Split and parse each line
      lines = core.split_taf(txt)
      parsed_lines = parse_lines(lines, units, use_na)
      # Perform additional info extract and corrections
      if parsed_lines:
          parsed_lines[-1]['other'], retwx['max_temp'], retwx['min_temp'] \
              = core.get_temp_min_and_max(parsed_lines[-1]['other'])
          if not (retwx['max_temp'] or retwx['min_temp']):
              parsed_lines[0]['other'], retwx['max_temp'], retwx['min_temp'] \
                  = core.get_temp_min_and_max(parsed_lines[0]['other'])
          # Set start and end times based on the first line
          start, end = parsed_lines[0]['start_time'], parsed_lines[0]['end_time']
          parsed_lines[0]['end_time'] = None
          retwx['start_time'], retwx['end_time'] = start, end
          parsed_lines = core.find_missing_taf_times(parsed_lines, start, end)
          parsed_lines = core.get_taf_flight_rules(parsed_lines)
      # Extract Oceania-specific data
      if retwx['station'][0] == 'A':  # type: ignore
          parsed_lines[-1]['other'], retwx['alts'], retwx['temps'] \
              = core.get_oceania_temp_and_alt(parsed_lines[-1]['other'])
      # Convert to dataclass
      retwx['forecast'] = [TafLineData(**line) for line in parsed_lines]  # type: ignore
      return TafData(**retwx), units