@airframes/acars-decoder 1.8.6 → 1.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -36,87 +36,89 @@ __export(index_exports, {
36
36
  module.exports = __toCommonJS(index_exports);
37
37
 
38
38
  // lib/IcaoDecoder.ts
39
- var IcaoDecoder = class {
39
+ var IcaoDecoder = class _IcaoDecoder {
40
40
  name;
41
41
  icao;
42
+ // Military ICAO address ranges (as [start, end] tuples, inclusive)
43
+ static MILITARY_RANGES = [
44
+ [65648, 65679],
45
+ // Egypt
46
+ [671744, 675839],
47
+ // Algeria
48
+ [3407616, 3407871],
49
+ // Italy
50
+ [3473408, 3670015],
51
+ // Spain
52
+ [3842048, 3866623],
53
+ // France 1
54
+ [3895296, 3932159],
55
+ // France 2
56
+ [4104192, 4112383],
57
+ // Germany 1
58
+ [4145152, 4177919],
59
+ // Germany 2
60
+ [4194304, 4194367],
61
+ // UK 1
62
+ [4440064, 4444159],
63
+ // UK 2
64
+ [4472832, 4485119],
65
+ // Austria
66
+ [4517888, 4521983],
67
+ // Belgium
68
+ [4550656, 4554751],
69
+ // Bulgaria
70
+ [4584448, 4584703],
71
+ // Denmark
72
+ [4620288, 4621311],
73
+ // Greece
74
+ [4668416, 4668431],
75
+ // Hungary
76
+ [4686080, 4686335],
77
+ // Norway
78
+ [4718592, 4722687],
79
+ // Netherlands
80
+ [4773888, 4774015],
81
+ // Poland
82
+ [4815872, 4816127],
83
+ // Portugal
84
+ [4817952, 4817967],
85
+ // Czech
86
+ [4943872, 4947967],
87
+ // Switzerland
88
+ [4948480, 4948735],
89
+ // Turkey
90
+ [7389296, 7389311],
91
+ // Oman
92
+ [7406168, 7406223],
93
+ // Saudi 1
94
+ [7406464, 7406495],
95
+ // Saudi 2
96
+ [7571968, 7572223],
97
+ // Israel
98
+ [8189952, 8190719],
99
+ // Australia
100
+ [8389120, 8389375],
101
+ // India
102
+ [11401160, 11534335],
103
+ // USA
104
+ [12713984, 12845055],
105
+ // Canada
106
+ [14942208, 14950399]
107
+ // Brazil
108
+ ];
42
109
  constructor(icao) {
43
110
  this.name = "icao-decoder-typescript";
44
111
  this.icao = icao;
45
112
  }
46
113
  isMilitary() {
47
- let i = this.icao;
48
- return i.match(/^adf[7-9]/) || i.match(/^adf[a-f]/) || i.match(/^a(e|f)/) || i.match(/^0100(7|8)/) || i.match(/^0a4/) || i.match(/^33ff/) || i >= "350000" && i <= "37ffff" || i.match(/^3a(8|9|[a-f])/) || i.match(/^3b/) || i.match(/^3e(a|b)/) || i.match(/^3f([4-9]|[a-b])/) || i.match(/^4000[0-3]/) || i.match(/^43c/) || i.match(/^44[4-7]/) && i != "447ac7" || i.match(/^44f/) || i.match(/^457/) || i.match(/^45f4/) || i.match(/^468[0-3]/) || i.match(/^473c0/) || i.match(/^4781/) || i.match(/^480/) || i.match(/^48d8[0-7]/) || i.match(/^497c/) || i.match(/^49842/) || i.match(/^4b7/) || i.match(/^4b82/) || i.match(/^506f/) || i.match(/^70c07/) || i.match(/^7102[5-8]/) || i.match(/^7103[8-9]/) || i.match(/^738a/) || i.match(/^7c8([2-4]|8)/) || i >= "7c9000" && i <= "7cbfff" || i.match(/^7[d-f]/) || i.match(/^8002/) || i.match(/^c[2-3]/) || i.match(/^e4[0-1]/) || i.match(/^e806/);
49
- }
50
- };
51
-
52
- // lib/DateTimeUtils.ts
53
- var DateTimeUtils = class {
54
- // Expects a four digit UTC time string (HHMM)
55
- static UTCToString(UTCString) {
56
- let utcDate = /* @__PURE__ */ new Date();
57
- utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
58
- return utcDate.toTimeString();
59
- }
60
- // Expects a six digit date string and a four digit UTC time string
61
- // (DDMMYY) (HHMM)
62
- static UTCDateTimeToString(dateString, timeString) {
63
- let utcDate = /* @__PURE__ */ new Date();
64
- utcDate.setUTCDate(+dateString.substr(0, 2));
65
- utcDate.setUTCMonth(+dateString.substr(2, 2));
66
- if (dateString.length === 6) {
67
- utcDate.setUTCFullYear(2e3 + +dateString.substr(4, 2));
68
- }
69
- if (timeString.length === 6) {
70
- utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), +timeString.substr(4, 2));
71
- } else {
72
- utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);
73
- }
74
- return utcDate.toUTCString();
75
- }
76
- /**
77
- *
78
- * @param time HHMMSS or HHMM
79
- * @returns seconds since midnight
80
- */
81
- static convertHHMMSSToTod(time) {
82
- if (time.length === 4) {
83
- time += "00";
84
- }
85
- const h = Number(time.substring(0, 2));
86
- const m = Number(time.substring(2, 4));
87
- const s = Number(time.substring(4, 6));
88
- const tod = h * 3600 + m * 60 + s;
89
- return tod;
90
- }
91
- /**
92
- *
93
- * @param time HHMMSS
94
- * @param date MMDDYY or MMDDYYYY
95
- * @returns seconds since epoch
96
- */
97
- static convertDateTimeToEpoch(time, date) {
98
- if (date.length === 6) {
99
- date = date.substring(0, 4) + `20${date.substring(4, 6)}`;
100
- }
101
- const timestamp = `${date.substring(4, 8)}-${date.substring(0, 2)}-${date.substring(2, 4)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;
102
- const millis = Date.parse(timestamp);
103
- return millis / 1e3;
104
- }
105
- /**
106
- * Converts a timestamp to a string
107
- *
108
- * ISO-8601 format for 'epoch'
109
- * HH:MM:SS for 'tod'
110
- * @param time
111
- * @param format
112
- * @returns
113
- */
114
- static timestampToString(time, format) {
115
- const date = new Date(time * 1e3);
116
- if (format == "tod") {
117
- return date.toISOString().slice(11, 19);
114
+ const i = this.icao;
115
+ const n = parseInt(i, 16);
116
+ for (const [start, end] of _IcaoDecoder.MILITARY_RANGES) {
117
+ if (start <= n && n <= end) {
118
+ return true;
119
+ }
118
120
  }
119
- return date.toISOString().slice(0, -5) + "Z";
121
+ return false;
120
122
  }
121
123
  };
122
124
 
@@ -146,7 +148,9 @@ var DecoderPlugin = class {
146
148
  this.options = options;
147
149
  }
148
150
  id() {
149
- console.log("DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!");
151
+ console.log(
152
+ "DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!"
153
+ );
150
154
  return "abstract_decoder_plugin";
151
155
  }
152
156
  meetsStateRequirements() {
@@ -173,7 +177,7 @@ var CoordinateUtils = class _CoordinateUtils {
173
177
  /**
174
178
  * Decode a string of coordinates into an object with latitude and longitude in millidegrees
175
179
  * @param stringCoords - The string of coordinates to decode
176
- *
180
+ *
177
181
  * @returns An object with latitude and longitude properties
178
182
  */
179
183
  static decodeStringCoordinates(stringCoords) {
@@ -193,11 +197,11 @@ var CoordinateUtils = class _CoordinateUtils {
193
197
  return void 0;
194
198
  }
195
199
  /**
196
- * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
197
- * @param stringCoords - The string of coordinates to decode
198
- *
199
- * @returns An object with latitude and longitude properties
200
- */
200
+ * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
201
+ * @param stringCoords - The string of coordinates to decode
202
+ *
203
+ * @returns An object with latitude and longitude properties
204
+ */
201
205
  static decodeStringCoordinatesDecimalMinutes(stringCoords) {
202
206
  const firstChar = stringCoords.substring(0, 1);
203
207
  let middleChar = stringCoords.substring(6, 7);
@@ -236,6 +240,85 @@ var CoordinateUtils = class _CoordinateUtils {
236
240
  }
237
241
  };
238
242
 
243
+ // lib/DateTimeUtils.ts
244
+ var DateTimeUtils = class {
245
+ // Expects a four digit UTC time string (HHMM)
246
+ static UTCToString(UTCString) {
247
+ let utcDate = /* @__PURE__ */ new Date();
248
+ utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
249
+ return utcDate.toTimeString();
250
+ }
251
+ // Expects a six digit date string and a four digit UTC time string
252
+ // (DDMMYY) (HHMM)
253
+ static UTCDateTimeToString(dateString, timeString) {
254
+ let utcDate = /* @__PURE__ */ new Date();
255
+ utcDate.setUTCDate(+dateString.substr(0, 2));
256
+ utcDate.setUTCMonth(+dateString.substr(2, 2));
257
+ if (dateString.length === 6) {
258
+ utcDate.setUTCFullYear(2e3 + +dateString.substr(4, 2));
259
+ }
260
+ if (timeString.length === 6) {
261
+ utcDate.setUTCHours(
262
+ +timeString.substr(0, 2),
263
+ +timeString.substr(2, 2),
264
+ +timeString.substr(4, 2)
265
+ );
266
+ } else {
267
+ utcDate.setUTCHours(
268
+ +timeString.substr(0, 2),
269
+ +timeString.substr(2, 2),
270
+ 0
271
+ );
272
+ }
273
+ return utcDate.toUTCString();
274
+ }
275
+ /**
276
+ *
277
+ * @param time HHMMSS or HHMM
278
+ * @returns seconds since midnight
279
+ */
280
+ static convertHHMMSSToTod(time) {
281
+ if (time.length === 4) {
282
+ time += "00";
283
+ }
284
+ const h = Number(time.substring(0, 2));
285
+ const m = Number(time.substring(2, 4));
286
+ const s = Number(time.substring(4, 6));
287
+ const tod = h * 3600 + m * 60 + s;
288
+ return tod;
289
+ }
290
+ /**
291
+ *
292
+ * @param time HHMMSS
293
+ * @param date MMDDYY or MMDDYYYY
294
+ * @returns seconds since epoch
295
+ */
296
+ static convertDateTimeToEpoch(time, date) {
297
+ if (date.length === 6) {
298
+ date = date.substring(0, 4) + `20${date.substring(4, 6)}`;
299
+ }
300
+ const timestamp = `${date.substring(4, 8)}-${date.substring(0, 2)}-${date.substring(2, 4)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;
301
+ const millis = Date.parse(timestamp);
302
+ return millis / 1e3;
303
+ }
304
+ /**
305
+ * Converts a timestamp to a string
306
+ *
307
+ * ISO-8601 format for 'epoch'
308
+ * HH:MM:SS for 'tod'
309
+ * @param time
310
+ * @param format
311
+ * @returns
312
+ */
313
+ static timestampToString(time, format) {
314
+ const date = new Date(time * 1e3);
315
+ if (format == "tod") {
316
+ return date.toISOString().slice(11, 19);
317
+ }
318
+ return date.toISOString().slice(0, -5) + "Z";
319
+ }
320
+ };
321
+
239
322
  // lib/utils/route_utils.ts
240
323
  var RouteUtils = class _RouteUtils {
241
324
  static formatFlightState(state) {
@@ -290,20 +373,36 @@ var RouteUtils = class _RouteUtils {
290
373
  static getWaypoint(leg) {
291
374
  const regex = leg.match(/^([A-Z]+)(\d{3})-(\d{4})$/);
292
375
  if (regex?.length == 4) {
293
- return { name: regex[1], offset: { bearing: parseInt(regex[2]), distance: parseInt(regex[3]) / 10 } };
376
+ return {
377
+ name: regex[1],
378
+ offset: {
379
+ bearing: parseInt(regex[2]),
380
+ distance: parseInt(regex[3]) / 10
381
+ }
382
+ };
294
383
  }
295
384
  const waypoint = leg.split(",");
296
385
  if (waypoint.length == 2) {
297
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(waypoint[1]);
386
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
387
+ waypoint[1]
388
+ );
298
389
  if (position) {
299
- return { name: waypoint[0], latitude: position.latitude, longitude: position.longitude };
390
+ return {
391
+ name: waypoint[0],
392
+ latitude: position.latitude,
393
+ longitude: position.longitude
394
+ };
300
395
  }
301
396
  }
302
397
  if (leg.length == 13 || leg.length == 14) {
303
398
  const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);
304
399
  const name = waypoint.length == 2 ? waypoint[0] : "";
305
400
  if (position) {
306
- return { name, latitude: position.latitude, longitude: position.longitude };
401
+ return {
402
+ name,
403
+ latitude: position.latitude,
404
+ longitude: position.longitude
405
+ };
307
406
  }
308
407
  }
309
408
  return { name: leg };
@@ -568,7 +667,9 @@ var ResultFormatter = class {
568
667
  if (value.length === 0) {
569
668
  return;
570
669
  }
571
- decodeResult.raw.outside_air_temperature = Number(value.replace("M", "-").replace("P", "+"));
670
+ decodeResult.raw.outside_air_temperature = Number(
671
+ value.replace("M", "-").replace("P", "+")
672
+ );
572
673
  decodeResult.formatted.items.push({
573
674
  type: "outside_air_temperature",
574
675
  code: "OATEMP",
@@ -785,17 +886,112 @@ var ResultFormatter = class {
785
886
  value: `${decodeResult.raw.sublabel}`
786
887
  });
787
888
  }
889
+ static requestedAltitudes(decodeResult, values) {
890
+ decodeResult.raw.requested_alts = values;
891
+ decodeResult.formatted.items.push({
892
+ type: "requested_altitudes",
893
+ code: "REQ_ALTS",
894
+ label: "Requested Altitudes",
895
+ value: `${decodeResult.raw.requested_alts.join(", ")}`
896
+ });
897
+ }
898
+ static desiredAltitude(decodeResult, value) {
899
+ decodeResult.raw.desired_alt = value;
900
+ decodeResult.formatted.items.push({
901
+ type: "desired_altitude",
902
+ code: "DES_ALT",
903
+ label: "Desired Altitude",
904
+ value: `${decodeResult.raw.desired_alt}`
905
+ });
906
+ }
907
+ static startPoint(decodeResult, value) {
908
+ decodeResult.raw.start_point = value;
909
+ decodeResult.formatted.items.push({
910
+ type: "start_point",
911
+ code: "START",
912
+ label: "Start Point",
913
+ value: `${decodeResult.raw.start_point}`
914
+ });
915
+ }
916
+ static routeNumber(decodeResult, value) {
917
+ decodeResult.raw.route_number = value;
918
+ decodeResult.formatted.items.push({
919
+ type: "route_number",
920
+ code: "RTE_NUM",
921
+ label: "Route Number",
922
+ value: `${decodeResult.raw.route_number}`
923
+ });
924
+ }
925
+ static flightPlan(decodeResult, value) {
926
+ decodeResult.raw.flight_plan = value;
927
+ decodeResult.formatted.items.push({
928
+ type: "flight_plan",
929
+ code: "FPN",
930
+ label: "Flight Plan",
931
+ value: `${decodeResult.raw.flight_plan}`
932
+ });
933
+ }
934
+ static groundAddress(decodeResult, value) {
935
+ decodeResult.raw.ground_address = value;
936
+ decodeResult.formatted.items.push({
937
+ type: "ground_address",
938
+ code: "GND_ADDR",
939
+ label: "Ground Address",
940
+ value: `${decodeResult.raw.ground_address}`
941
+ });
942
+ }
788
943
  static unknown(decodeResult, value, sep = ",") {
789
- if (!decodeResult.remaining.text)
790
- decodeResult.remaining.text = value;
791
- else
792
- decodeResult.remaining.text += sep + value;
944
+ if (!decodeResult.remaining.text) decodeResult.remaining.text = value;
945
+ else decodeResult.remaining.text += sep + value;
793
946
  }
794
947
  static unknownArr(decodeResult, value, sep = ",") {
795
948
  this.unknown(decodeResult, value.join(sep), sep);
796
949
  }
797
950
  };
798
951
 
952
+ // lib/plugins/CBand.ts
953
+ var CBand = class extends DecoderPlugin {
954
+ name = "c-band";
955
+ qualifiers() {
956
+ return {
957
+ labels: ["*"]
958
+ };
959
+ }
960
+ decode(message, options = {}) {
961
+ let decodeResult = this.defaultResult();
962
+ decodeResult.decoder.name = this.name;
963
+ decodeResult.message = message;
964
+ let cband = message.text.match(
965
+ /^(?<msgno>[A-Z]\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/
966
+ );
967
+ if (cband?.groups) {
968
+ const messageText = message.text.substring(10);
969
+ const decoded = this.decoder.decode(
970
+ {
971
+ label: message.label,
972
+ sublabel: message.sublabel,
973
+ text: messageText
974
+ },
975
+ options
976
+ );
977
+ if (decoded.decoded) {
978
+ ResultFormatter.flightNumber(
979
+ decodeResult,
980
+ cband.groups.airline + Number(cband.groups.number)
981
+ );
982
+ decodeResult.decoded = true;
983
+ decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
984
+ decodeResult.decoder.name = this.name + "-" + decoded.decoder.name;
985
+ decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
986
+ decodeResult.formatted.description = decoded.formatted.description;
987
+ decodeResult.formatted.items.push(...decoded.formatted.items);
988
+ decodeResult.remaining = decoded.remaining;
989
+ }
990
+ }
991
+ return decodeResult;
992
+ }
993
+ };
994
+
799
995
  // lib/plugins/Label_5Z_Slash.ts
800
996
  var Label_5Z_Slash = class extends DecoderPlugin {
801
997
  name = "label-5z-slash";
@@ -866,12 +1062,23 @@ var Label_5Z_Slash = class extends DecoderPlugin {
866
1062
  ResultFormatter.departureAirport(decodeResult, info[1]);
867
1063
  ResultFormatter.arrivalAirport(decodeResult, info[2]);
868
1064
  decodeResult.raw.day = Number(info[3]);
869
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));
1065
+ ResultFormatter.time_of_day(
1066
+ decodeResult,
1067
+ DateTimeUtils.convertHHMMSSToTod(info[4])
1068
+ );
870
1069
  ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));
871
1070
  ResultFormatter.unknownArr(decodeResult, data.slice(3), "/");
872
1071
  } else if (type === "B3") {
873
- ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), "IATA");
874
- ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), "IATA");
1072
+ ResultFormatter.departureAirport(
1073
+ decodeResult,
1074
+ header[1].substring(0, 3),
1075
+ "IATA"
1076
+ );
1077
+ ResultFormatter.arrivalAirport(
1078
+ decodeResult,
1079
+ header[1].substring(3),
1080
+ "IATA"
1081
+ );
875
1082
  decodeResult.raw.day = Number(header[2]);
876
1083
  ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));
877
1084
  if (header.length > 4) {
@@ -882,19 +1089,36 @@ var Label_5Z_Slash = class extends DecoderPlugin {
882
1089
  ResultFormatter.departureAirport(decodeResult, info[1]);
883
1090
  ResultFormatter.arrivalAirport(decodeResult, info[2]);
884
1091
  decodeResult.raw.day = Number(info[3]);
885
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));
1092
+ ResultFormatter.time_of_day(
1093
+ decodeResult,
1094
+ DateTimeUtils.convertHHMMSSToTod(info[4])
1095
+ );
886
1096
  ResultFormatter.unknownArr(decodeResult, info.slice(5), " ");
887
1097
  } else if (type === "C3") {
888
- ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), "IATA");
889
- ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), "IATA");
1098
+ ResultFormatter.departureAirport(
1099
+ decodeResult,
1100
+ header[1].substring(0, 3),
1101
+ "IATA"
1102
+ );
1103
+ ResultFormatter.arrivalAirport(
1104
+ decodeResult,
1105
+ header[1].substring(3),
1106
+ "IATA"
1107
+ );
890
1108
  } else if (type === "ET") {
891
1109
  const airports = data[2].split(" ");
892
1110
  ResultFormatter.departureAirport(decodeResult, airports[1]);
893
1111
  ResultFormatter.arrivalAirport(decodeResult, airports[2]);
894
1112
  decodeResult.raw.day = Number(airports[3]);
895
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(airports[4]));
1113
+ ResultFormatter.time_of_day(
1114
+ decodeResult,
1115
+ DateTimeUtils.convertHHMMSSToTod(airports[4])
1116
+ );
896
1117
  const estimates = data[3].split(" ");
897
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1]));
1118
+ ResultFormatter.eta(
1119
+ decodeResult,
1120
+ DateTimeUtils.convertHHMMSSToTod(estimates[1])
1121
+ );
898
1122
  ResultFormatter.unknown(decodeResult, estimates[2]);
899
1123
  } else {
900
1124
  if (options.debug) {
@@ -917,7 +1141,6 @@ var Label_5Z_Slash = class extends DecoderPlugin {
917
1141
 
918
1142
  // lib/plugins/Label_10_LDR.ts
919
1143
  var Label_10_LDR = class extends DecoderPlugin {
920
- // eslint-disable-line camelcase
921
1144
  name = "label-10-ldr";
922
1145
  qualifiers() {
923
1146
  return {
@@ -956,7 +1179,10 @@ var Label_10_LDR = class extends DecoderPlugin {
956
1179
  if (altRwy != "") {
957
1180
  ResultFormatter.alternateRunway(decodeResult, altRwy);
958
1181
  }
959
- ResultFormatter.unknownArr(decodeResult, [...parts.slice(0, 5), ...parts.slice(15)]);
1182
+ ResultFormatter.unknownArr(decodeResult, [
1183
+ ...parts.slice(0, 5),
1184
+ ...parts.slice(15)
1185
+ ]);
960
1186
  decodeResult.decoded = true;
961
1187
  decodeResult.decoder.decodeLevel = "partial";
962
1188
  return decodeResult;
@@ -965,7 +1191,6 @@ var Label_10_LDR = class extends DecoderPlugin {
965
1191
 
966
1192
  // lib/plugins/Label_10_POS.ts
967
1193
  var Label_10_POS = class extends DecoderPlugin {
968
- // eslint-disable-line camelcase
969
1194
  name = "label-10-pos";
970
1195
  qualifiers() {
971
1196
  return {
@@ -996,7 +1221,11 @@ var Label_10_POS = class extends DecoderPlugin {
996
1221
  };
997
1222
  ResultFormatter.position(decodeResult, position);
998
1223
  ResultFormatter.altitude(decodeResult, Number(parts[7]));
999
- ResultFormatter.unknownArr(decodeResult, [parts[0], ...parts.slice(3, 7), ...parts.slice(8)]);
1224
+ ResultFormatter.unknownArr(decodeResult, [
1225
+ parts[0],
1226
+ ...parts.slice(3, 7),
1227
+ ...parts.slice(8)
1228
+ ]);
1000
1229
  decodeResult.decoded = true;
1001
1230
  decodeResult.decoder.decodeLevel = "partial";
1002
1231
  return decodeResult;
@@ -1005,7 +1234,6 @@ var Label_10_POS = class extends DecoderPlugin {
1005
1234
 
1006
1235
  // lib/plugins/Label_10_Slash.ts
1007
1236
  var Label_10_Slash = class extends DecoderPlugin {
1008
- // eslint-disable-line camelcase
1009
1237
  name = "label-10-slash";
1010
1238
  qualifiers() {
1011
1239
  return {
@@ -1038,23 +1266,34 @@ var Label_10_Slash = class extends DecoderPlugin {
1038
1266
  ResultFormatter.heading(decodeResult, Number(parts[5]));
1039
1267
  ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));
1040
1268
  ResultFormatter.arrivalAirport(decodeResult, parts[7]);
1041
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8]));
1042
- const waypoints = [{
1043
- name: parts[11]
1044
- }, {
1045
- name: parts[12],
1046
- time: DateTimeUtils.convertHHMMSSToTod(parts[13]),
1047
- timeFormat: "tod"
1048
- }, {
1049
- name: parts[14],
1050
- time: DateTimeUtils.convertHHMMSSToTod(parts[15]),
1051
- timeFormat: "tod"
1052
- }];
1269
+ ResultFormatter.eta(
1270
+ decodeResult,
1271
+ DateTimeUtils.convertHHMMSSToTod(parts[8])
1272
+ );
1273
+ const waypoints = [
1274
+ {
1275
+ name: parts[11]
1276
+ },
1277
+ {
1278
+ name: parts[12],
1279
+ time: DateTimeUtils.convertHHMMSSToTod(parts[13]),
1280
+ timeFormat: "tod"
1281
+ },
1282
+ {
1283
+ name: parts[14],
1284
+ time: DateTimeUtils.convertHHMMSSToTod(parts[15]),
1285
+ timeFormat: "tod"
1286
+ }
1287
+ ];
1053
1288
  ResultFormatter.route(decodeResult, { waypoints });
1054
1289
  if (parts[16]) {
1055
1290
  ResultFormatter.departureAirport(decodeResult, parts[16]);
1056
1291
  }
1057
- ResultFormatter.unknownArr(decodeResult, [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)], "/");
1292
+ ResultFormatter.unknownArr(
1293
+ decodeResult,
1294
+ [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],
1295
+ "/"
1296
+ );
1058
1297
  decodeResult.decoded = true;
1059
1298
  decodeResult.decoder.decodeLevel = "partial";
1060
1299
  return decodeResult;
@@ -1079,7 +1318,7 @@ var Label_12_N_Space = class extends DecoderPlugin {
1079
1318
  let results = message.text.match(variant1Regex);
1080
1319
  if (results?.groups) {
1081
1320
  if (options.debug) {
1082
- console.log(`Label 12 N : results`);
1321
+ console.log("Label 12 N : results");
1083
1322
  console.log(results);
1084
1323
  }
1085
1324
  ResultFormatter.position(decodeResult, {
@@ -1088,7 +1327,11 @@ var Label_12_N_Space = class extends DecoderPlugin {
1088
1327
  });
1089
1328
  const altitude = results.groups.alt == "GRD" || results.groups.alt == "***" ? 0 : Number(results.groups.alt);
1090
1329
  ResultFormatter.altitude(decodeResult, altitude);
1091
- ResultFormatter.unknownArr(decodeResult, [results.groups.unkwn1, results.groups.unkwn2, results.groups.unkwn3]);
1330
+ ResultFormatter.unknownArr(decodeResult, [
1331
+ results.groups.unkwn1,
1332
+ results.groups.unkwn2,
1333
+ results.groups.unkwn3
1334
+ ]);
1092
1335
  decodeResult.decoded = true;
1093
1336
  decodeResult.decoder.decodeLevel = "partial";
1094
1337
  return decodeResult;
@@ -1130,15 +1373,32 @@ var Label_12_POS = class extends DecoderPlugin {
1130
1373
  const lat = data[0].substring(0, 8);
1131
1374
  const lon = data[0].substring(8);
1132
1375
  ResultFormatter.position(decodeResult, {
1133
- latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lat.substring(1, 4)), Number(lat.substring(4, 6)), Number(lat.substring(6, 8))),
1134
- longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lon.substring(1, 4)), Number(lon.substring(4, 6)), Number(lon.substring(6, 8)))
1376
+ latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(
1377
+ Number(lat.substring(1, 4)),
1378
+ Number(lat.substring(4, 6)),
1379
+ Number(lat.substring(6, 8))
1380
+ ),
1381
+ longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(
1382
+ Number(lon.substring(1, 4)),
1383
+ Number(lon.substring(4, 6)),
1384
+ Number(lon.substring(6, 8))
1385
+ )
1135
1386
  });
1136
1387
  ResultFormatter.unknown(decodeResult, data[1]);
1137
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
1388
+ ResultFormatter.time_of_day(
1389
+ decodeResult,
1390
+ DateTimeUtils.convertHHMMSSToTod(data[2])
1391
+ );
1138
1392
  ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));
1139
1393
  ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));
1140
- ResultFormatter.currentFuel(decodeResult, Number(data[7].substring(3).trim()));
1141
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()));
1394
+ ResultFormatter.currentFuel(
1395
+ decodeResult,
1396
+ Number(data[7].substring(3).trim())
1397
+ );
1398
+ ResultFormatter.eta(
1399
+ decodeResult,
1400
+ DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim())
1401
+ );
1142
1402
  ResultFormatter.departureAirport(decodeResult, data[9]);
1143
1403
  ResultFormatter.arrivalAirport(decodeResult, data[10]);
1144
1404
  ResultFormatter.unknown(decodeResult, data[11]);
@@ -1150,7 +1410,6 @@ var Label_12_POS = class extends DecoderPlugin {
1150
1410
 
1151
1411
  // lib/plugins/Label_13Through18_Slash.ts
1152
1412
  var Label_13Through18_Slash = class extends DecoderPlugin {
1153
- // eslint-disable-line camelcase
1154
1413
  name = "label-13-18-slash";
1155
1414
  qualifiers() {
1156
1415
  return {
@@ -1197,11 +1456,22 @@ var Label_13Through18_Slash = class extends DecoderPlugin {
1197
1456
  const location = lines[i].substring(5).split(",");
1198
1457
  let position;
1199
1458
  if (location[0].startsWith("+") || location[0].startsWith("-")) {
1200
- position = { latitude: Number(location[0]), longitude: Number(location[1]) };
1459
+ position = {
1460
+ latitude: Number(location[0]),
1461
+ longitude: Number(location[1])
1462
+ };
1201
1463
  } else {
1202
1464
  position = {
1203
- latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(Number(location[0].substring(1, 3)), Number(location[0].substring(3, 5)), Number(location[0].substring(5, 7))),
1204
- longitude: CoordinateUtils.getDirection(location[1][0]) * CoordinateUtils.dmsToDecimalDegrees(Number(location[1].substring(1, 4)), Number(location[1].substring(4, 6)), Number(location[1].substring(6, 8)))
1465
+ latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(
1466
+ Number(location[0].substring(1, 3)),
1467
+ Number(location[0].substring(3, 5)),
1468
+ Number(location[0].substring(5, 7))
1469
+ ),
1470
+ longitude: CoordinateUtils.getDirection(location[1][0]) * CoordinateUtils.dmsToDecimalDegrees(
1471
+ Number(location[1].substring(1, 4)),
1472
+ Number(location[1].substring(4, 6)),
1473
+ Number(location[1].substring(6, 8))
1474
+ )
1205
1475
  };
1206
1476
  }
1207
1477
  ResultFormatter.position(decodeResult, position);
@@ -1252,22 +1522,38 @@ var Label_15 = class extends DecoderPlugin {
1252
1522
  decodeResult.message = message;
1253
1523
  if (message.text.startsWith("(2") && message.text.endsWith("(Z")) {
1254
1524
  const between = message.text.substring(2, message.text.length - 2);
1255
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(between.substring(0, 13)));
1525
+ ResultFormatter.position(
1526
+ decodeResult,
1527
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
1528
+ between.substring(0, 13)
1529
+ )
1530
+ );
1256
1531
  if (between.length === 25) {
1257
1532
  ResultFormatter.unknown(decodeResult, between.substring(13, 19));
1258
1533
  const alt = between.substring(19, 22);
1259
1534
  if (alt != "---") {
1260
1535
  ResultFormatter.altitude(decodeResult, 100 * Number(alt));
1261
1536
  }
1262
- ResultFormatter.temperature(decodeResult, between.substring(22).replaceAll(" ", "0"));
1537
+ ResultFormatter.temperature(
1538
+ decodeResult,
1539
+ between.substring(22).replaceAll(" ", "0")
1540
+ );
1263
1541
  } else if (between.substring(13, 16) === "OFF") {
1264
1542
  const ddmmyy = between.substring(16, 22);
1265
1543
  const hhmm = between.substring(22, 26);
1266
1544
  if (ddmmyy != "------") {
1267
1545
  const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);
1268
- ResultFormatter.off(decodeResult, DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy), "epoch");
1546
+ ResultFormatter.off(
1547
+ decodeResult,
1548
+ DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy),
1549
+ "epoch"
1550
+ );
1269
1551
  } else {
1270
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmm), "tod");
1552
+ ResultFormatter.off(
1553
+ decodeResult,
1554
+ DateTimeUtils.convertHHMMSSToTod(hhmm),
1555
+ "tod"
1556
+ );
1271
1557
  }
1272
1558
  ResultFormatter.unknown(decodeResult, between.substring(26));
1273
1559
  } else {
@@ -1312,7 +1598,10 @@ var Label_15_FST = class extends DecoderPlugin {
1312
1598
  const lat = Number(stringCoords.substring(1, 7)) / 1e4 * (firstChar === "S" ? -1 : 1);
1313
1599
  const lon = Number(stringCoords.substring(8, 15)) / 1e4 * (middleChar === "W" ? -1 : 1);
1314
1600
  ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });
1315
- ResultFormatter.altitude(decodeResult, Number(stringCoords.substring(15)) * 100);
1601
+ ResultFormatter.altitude(
1602
+ decodeResult,
1603
+ Number(stringCoords.substring(15)) * 100
1604
+ );
1316
1605
  } else {
1317
1606
  decodeResult.decoded = false;
1318
1607
  decodeResult.decoder.decodeLevel = "none";
@@ -1408,7 +1697,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
1408
1697
  let results = message.text.match(variant1Regex);
1409
1698
  if (results?.groups) {
1410
1699
  if (options.debug) {
1411
- console.log(`Label 16 N : results`);
1700
+ console.log("Label 16 N : results");
1412
1701
  console.log(results);
1413
1702
  }
1414
1703
  let pos = {
@@ -1418,7 +1707,10 @@ var Label_16_N_Space = class extends DecoderPlugin {
1418
1707
  const altitude = results.groups.alt == "GRD" || results.groups.alt == "***" ? 0 : Number(results.groups.alt);
1419
1708
  ResultFormatter.position(decodeResult, pos);
1420
1709
  ResultFormatter.altitude(decodeResult, altitude);
1421
- ResultFormatter.unknownArr(decodeResult, [results.groups.unkwn1, results.groups.unkwn2]);
1710
+ ResultFormatter.unknownArr(decodeResult, [
1711
+ results.groups.unkwn1,
1712
+ results.groups.unkwn2
1713
+ ]);
1422
1714
  decodeResult.decoded = true;
1423
1715
  decodeResult.decoder.decodeLevel = "partial";
1424
1716
  return decodeResult;
@@ -1426,7 +1718,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
1426
1718
  results = message.text.match(variant2Regex);
1427
1719
  if (results?.groups) {
1428
1720
  if (options.debug) {
1429
- console.log(`Label 16 N : results`);
1721
+ console.log("Label 16 N : results");
1430
1722
  console.log(results);
1431
1723
  }
1432
1724
  let pos = {
@@ -1472,17 +1764,22 @@ var Label_16_POSA1 = class extends DecoderPlugin {
1472
1764
  decodeResult.decoder.decodeLevel = "none";
1473
1765
  return decodeResult;
1474
1766
  }
1475
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(5)));
1767
+ ResultFormatter.position(
1768
+ decodeResult,
1769
+ CoordinateUtils.decodeStringCoordinates(fields[0].substring(5))
1770
+ );
1476
1771
  const waypoint = fields[1].trim();
1477
1772
  const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);
1478
1773
  ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);
1479
1774
  const nextWaypoint = fields[4].trim();
1480
1775
  const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);
1481
1776
  ResultFormatter.unknownArr(decodeResult, fields.slice(6), ",");
1482
- ResultFormatter.route(decodeResult, { waypoints: [
1483
- { name: waypoint, time, timeFormat: "tod" },
1484
- { name: nextWaypoint, time: nextTime, timeFormat: "tod" }
1485
- ] });
1777
+ ResultFormatter.route(decodeResult, {
1778
+ waypoints: [
1779
+ { name: waypoint, time, timeFormat: "tod" },
1780
+ { name: nextWaypoint, time: nextTime, timeFormat: "tod" }
1781
+ ]
1782
+ });
1486
1783
  decodeResult.decoded = true;
1487
1784
  decodeResult.decoder.decodeLevel = "partial";
1488
1785
  return decodeResult;
@@ -1517,7 +1814,10 @@ var Label_16_TOD = class extends DecoderPlugin {
1517
1814
  if (fields[1] !== "") {
1518
1815
  ResultFormatter.altitude(decodeResult, Number(fields[1]));
1519
1816
  }
1520
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
1817
+ ResultFormatter.eta(
1818
+ decodeResult,
1819
+ DateTimeUtils.convertHHMMSSToTod(fields[2])
1820
+ );
1521
1821
  ResultFormatter.unknown(decodeResult, fields[3]);
1522
1822
  const temp = fields[4].split("/");
1523
1823
  const posFields = temp[0].split(" ");
@@ -1538,9 +1838,9 @@ var Label_16_TOD = class extends DecoderPlugin {
1538
1838
  var FlightPlanUtils = class _FlightPlanUtils {
1539
1839
  /**
1540
1840
  * Processes flight plan data
1541
- *
1841
+ *
1542
1842
  * Expected format is [header, key1, val1, ... keyN, valN]
1543
- *
1843
+ *
1544
1844
  * @param decodeResult - results
1545
1845
  * @param data - original message split by ':'
1546
1846
  * @returns whether all fields were processed or not
@@ -1572,6 +1872,9 @@ var FlightPlanUtils = class _FlightPlanUtils {
1572
1872
  case "F":
1573
1873
  addRoute(decodeResult, value);
1574
1874
  break;
1875
+ case "FP":
1876
+ ResultFormatter.flightPlan(decodeResult, value.trim());
1877
+ break;
1575
1878
  case "R":
1576
1879
  addRunway(decodeResult, value);
1577
1880
  break;
@@ -1626,6 +1929,14 @@ var FlightPlanUtils = class _FlightPlanUtils {
1626
1929
  label: "Route Status",
1627
1930
  value: "Route Mapped"
1628
1931
  });
1932
+ } else if (header.startsWith("RS")) {
1933
+ decodeResult.raw.route_status = "RS";
1934
+ decodeResult.formatted.items.push({
1935
+ type: "status",
1936
+ code: "ROUTE_STATUS",
1937
+ label: "Route Status",
1938
+ value: "Route Saved"
1939
+ });
1629
1940
  } else {
1630
1941
  decodeResult.remaining.text += header;
1631
1942
  allKnownFields = false;
@@ -1645,7 +1956,7 @@ var FlightPlanUtils = class _FlightPlanUtils {
1645
1956
  decodeResult.raw.procedures.push({ type, route });
1646
1957
  const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);
1647
1958
  decodeResult.formatted.items.push({
1648
- type: `procedure`,
1959
+ type: "procedure",
1649
1960
  code: "proc",
1650
1961
  label: `${procedureName} Procedure`,
1651
1962
  value: RouteUtils.routeToString(route)
@@ -1666,7 +1977,9 @@ function addRunway(decodeResult, value) {
1666
1977
  }
1667
1978
  function addRoute(decodeResult, value) {
1668
1979
  const route = value.split(".");
1669
- ResultFormatter.route(decodeResult, { waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)) });
1980
+ ResultFormatter.route(decodeResult, {
1981
+ waypoints: route.map((leg) => RouteUtils.getWaypoint(leg))
1982
+ });
1670
1983
  }
1671
1984
  function addCompanyRoute(decodeResult, value) {
1672
1985
  const segments = value.split(".");
@@ -1720,15 +2033,27 @@ var H1Helper = class _H1Helper {
1720
2033
  case "AF":
1721
2034
  processAirField(decodeResult, data2.split(","));
1722
2035
  break;
2036
+ case "AK":
2037
+ ResultFormatter.unknown(decodeResult, fields[i], "/");
2038
+ break;
1723
2039
  case "CG":
1724
2040
  processCenterOfGravity(decodeResult, data2.split(","));
1725
2041
  break;
1726
2042
  case "DC":
1727
2043
  processDateCode(decodeResult, data2.split(","));
1728
2044
  break;
2045
+ case "DI":
2046
+ ResultFormatter.unknown(decodeResult, fields[i], "/");
2047
+ break;
1729
2048
  case "DT":
1730
2049
  processDT(decodeResult, data2.split(","));
1731
2050
  break;
2051
+ case "DQ":
2052
+ ResultFormatter.desiredAltitude(
2053
+ decodeResult,
2054
+ parseInt(data2, 10) * 100
2055
+ );
2056
+ break;
1732
2057
  case "ET":
1733
2058
  processETA(data2, decodeResult, fields, i);
1734
2059
  break;
@@ -1741,6 +2066,9 @@ var H1Helper = class _H1Helper {
1741
2066
  case "FX":
1742
2067
  ResultFormatter.freetext(decodeResult, data2);
1743
2068
  break;
2069
+ case "GA":
2070
+ ResultFormatter.groundAddress(decodeResult, data2);
2071
+ break;
1744
2072
  case "ID":
1745
2073
  processIdentification(decodeResult, data2.split(","));
1746
2074
  break;
@@ -1757,11 +2085,18 @@ var H1Helper = class _H1Helper {
1757
2085
  case "RI":
1758
2086
  case "RM":
1759
2087
  case "RP":
2088
+ case "RS":
1760
2089
  FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(":"));
1761
2090
  break;
2091
+ case "RN":
2092
+ ResultFormatter.routeNumber(decodeResult, data2);
2093
+ break;
1762
2094
  case "SN":
1763
2095
  decodeResult.raw.serial_number = data2;
1764
2096
  break;
2097
+ case "SP":
2098
+ ResultFormatter.startPoint(decodeResult, data2);
2099
+ break;
1765
2100
  case "TD":
1766
2101
  processTimeOfDeparture(decodeResult, data2.split(","));
1767
2102
  break;
@@ -1774,6 +2109,9 @@ var H1Helper = class _H1Helper {
1774
2109
  case "WD":
1775
2110
  processWindData(decodeResult, data2);
1776
2111
  break;
2112
+ case "WQ":
2113
+ processWeatherQuery(decodeResult, data2.split(":"));
2114
+ break;
1777
2115
  default:
1778
2116
  ResultFormatter.unknown(decodeResult, fields[i], "/");
1779
2117
  }
@@ -1782,15 +2120,11 @@ var H1Helper = class _H1Helper {
1782
2120
  return true;
1783
2121
  }
1784
2122
  static processPS(decodeResult, data) {
1785
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2123
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
2124
+ data[0]
2125
+ );
1786
2126
  if (position) {
1787
- decodeResult.raw.position = position;
1788
- decodeResult.formatted.items.push({
1789
- type: "aircraft_position",
1790
- code: "POS",
1791
- label: "Aircraft Position",
1792
- value: CoordinateUtils.coordinateString(position)
1793
- });
2127
+ ResultFormatter.position(decodeResult, position);
1794
2128
  }
1795
2129
  if (data.length === 9) {
1796
2130
  processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
@@ -1807,7 +2141,9 @@ var H1Helper = class _H1Helper {
1807
2141
  }
1808
2142
  }
1809
2143
  static processPosition(decodeResult, data) {
1810
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2144
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
2145
+ data[0]
2146
+ );
1811
2147
  if (position) {
1812
2148
  ResultFormatter.position(decodeResult, position);
1813
2149
  }
@@ -1823,7 +2159,15 @@ var H1Helper = class _H1Helper {
1823
2159
  }
1824
2160
  }
1825
2161
  static processTimeStamp(decodeResult, data) {
1826
- let time = DateTimeUtils.convertDateTimeToEpoch(data[0], data[1]);
2162
+ if (data.length > 2) {
2163
+ const positionData = data.slice(1);
2164
+ positionData[0] = positionData[0].substring(6);
2165
+ this.processPosition(decodeResult, positionData);
2166
+ }
2167
+ let time = DateTimeUtils.convertDateTimeToEpoch(
2168
+ data[0],
2169
+ data[1].substring(0, 6)
2170
+ );
1827
2171
  if (Number.isNaN(time)) {
1828
2172
  const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);
1829
2173
  time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);
@@ -1834,10 +2178,16 @@ var H1Helper = class _H1Helper {
1834
2178
  function processETA(data, decodeResult, fields, i) {
1835
2179
  if (data.length === 5) {
1836
2180
  ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));
1837
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data.substring(1)));
2181
+ ResultFormatter.eta(
2182
+ decodeResult,
2183
+ DateTimeUtils.convertHHMMSSToTod(data.substring(1))
2184
+ );
1838
2185
  } else if (data.length === 6) {
1839
2186
  ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));
1840
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data.substring(2)));
2187
+ ResultFormatter.eta(
2188
+ decodeResult,
2189
+ DateTimeUtils.convertHHMMSSToTod(data.substring(2))
2190
+ );
1841
2191
  } else {
1842
2192
  ResultFormatter.unknown(decodeResult, fields[i], "/");
1843
2193
  }
@@ -1892,7 +2242,10 @@ function processDT(decodeResult, data) {
1892
2242
  ResultFormatter.currentFuel(decodeResult, Number(data[2]));
1893
2243
  }
1894
2244
  if (data.length > 3) {
1895
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[3]));
2245
+ ResultFormatter.eta(
2246
+ decodeResult,
2247
+ DateTimeUtils.convertHHMMSSToTod(data[3])
2248
+ );
1896
2249
  }
1897
2250
  if (data.length > 4) {
1898
2251
  ResultFormatter.remainingFuel(decodeResult, Number(data[4]));
@@ -1932,18 +2285,30 @@ function processCenterOfGravity(decodeResult, data) {
1932
2285
  ResultFormatter.unknown(decodeResult, data.join(","));
1933
2286
  }
1934
2287
  }
1935
- function parseMessageType(decodeResult, messageType) {
2288
+ function parseMessageType(decodeResult, messagePart) {
2289
+ const messageParts = messagePart.split(",");
2290
+ const messageType = messageParts[0];
1936
2291
  if (messageType.startsWith("POS")) {
1937
- H1Helper.processPosition(decodeResult, messageType.substring(3).split(","));
2292
+ H1Helper.processPosition(decodeResult, messagePart.substring(3).split(","));
1938
2293
  return processMessageType(decodeResult, "POS");
1939
- } else if (messageType.length === 13) {
1940
- if (processMessageType(decodeResult, messageType.substring(10))) {
1941
- ResultFormatter.unknown(decodeResult, messageType.substring(0, 4));
1942
- ResultFormatter.flightNumber(decodeResult, messageType.slice(4, 10));
1943
- return true;
2294
+ } else if (messageType.length === 6) {
2295
+ const part1 = processMessageType(decodeResult, messageType.substring(0, 3));
2296
+ const description = decodeResult.formatted.description;
2297
+ const part2 = processMessageType(decodeResult, messageType.substring(3, 6));
2298
+ decodeResult.formatted.description = description + " for " + decodeResult.formatted.description;
2299
+ if (messageParts.length > 1) {
2300
+ ResultFormatter.unknown(
2301
+ decodeResult,
2302
+ messageParts.slice(1).join(","),
2303
+ "/"
2304
+ );
1944
2305
  }
2306
+ return part1 && part2;
1945
2307
  }
1946
- return processMessageType(decodeResult, messageType.substring(0, 3));
2308
+ if (messageParts.length > 1) {
2309
+ ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(","), "/");
2310
+ }
2311
+ return processMessageType(decodeResult, messageType);
1947
2312
  }
1948
2313
  function processMessageType(decodeResult, type) {
1949
2314
  if (type === "FPN") {
@@ -1960,6 +2325,12 @@ function processMessageType(decodeResult, type) {
1960
2325
  decodeResult.formatted.description = "Progress Report";
1961
2326
  } else if (type === "PWI") {
1962
2327
  decodeResult.formatted.description = "Pilot Weather Information";
2328
+ } else if (type === "REJ") {
2329
+ decodeResult.formatted.description = "Reject";
2330
+ } else if (type === "REQ") {
2331
+ decodeResult.formatted.description = "Request";
2332
+ } else if (type === "RES") {
2333
+ decodeResult.formatted.description = "Response";
1963
2334
  } else {
1964
2335
  decodeResult.formatted.description = "Unknown H1 Message";
1965
2336
  return false;
@@ -1975,6 +2346,22 @@ function processDateCode(decodeResult, data) {
1975
2346
  decodeResult.raw.message_timestamp = time;
1976
2347
  }
1977
2348
  }
2349
+ function processWeatherQuery(decodeResult, data) {
2350
+ if (data.length !== 2) {
2351
+ ResultFormatter.unknown(decodeResult, data.join(":"), "WQ/");
2352
+ return;
2353
+ }
2354
+ const alts = data[0].split(".");
2355
+ const route = data[1].split(".");
2356
+ ResultFormatter.requestedAltitudes(
2357
+ decodeResult,
2358
+ alts.map((a) => parseInt(a, 10) * 100)
2359
+ );
2360
+ const waypoints = route.map((wp) => {
2361
+ return { name: wp };
2362
+ });
2363
+ ResultFormatter.route(decodeResult, { waypoints });
2364
+ }
1978
2365
  function processRoute(decodeResult, last, time, next, eta, then, date) {
1979
2366
  const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
1980
2367
  const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
@@ -1987,13 +2374,7 @@ function processRoute(decodeResult, last, time, next, eta, then, date) {
1987
2374
  nextWaypoint.timeFormat = timeFormat;
1988
2375
  const thenWaypoint = RouteUtils.getWaypoint(then || "?");
1989
2376
  const waypoints = [lastWaypoint, nextWaypoint, thenWaypoint];
1990
- decodeResult.raw.route = { waypoints };
1991
- decodeResult.formatted.items.push({
1992
- type: "aircraft_route",
1993
- code: "ROUTE",
1994
- label: "Aircraft Route",
1995
- value: RouteUtils.routeToString(decodeResult.raw.route)
1996
- });
2377
+ ResultFormatter.route(decodeResult, { waypoints });
1997
2378
  }
1998
2379
  function processWindData(decodeResult, message) {
1999
2380
  const wind = [];
@@ -2068,7 +2449,10 @@ var Label_1J_2J_FTX = class extends DecoderPlugin {
2068
2449
  const parts = msg.split("/");
2069
2450
  let decoded = false;
2070
2451
  if (parts[0].length > 3) {
2071
- decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length - 3));
2452
+ decoded = H1Helper.decodeH1Message(
2453
+ decodeResult,
2454
+ msg.slice(parts[0].length - 3)
2455
+ );
2072
2456
  decodeResult.remaining.text = parts[0].slice(0, 3) + "/" + decodeResult.remaining.text;
2073
2457
  } else {
2074
2458
  decoded = H1Helper.decodeH1Message(decodeResult, msg);
@@ -2104,16 +2488,26 @@ var Label_1M_Slash = class extends DecoderPlugin {
2104
2488
  const results = message.text.split(/\n|\//).slice(1);
2105
2489
  if (results) {
2106
2490
  if (options.debug) {
2107
- console.log(`Label 1M ETA: results`);
2491
+ console.log("Label 1M ETA: results");
2108
2492
  console.log(results);
2109
2493
  }
2110
2494
  decodeResult.raw.flight_number = results[0];
2111
2495
  ResultFormatter.departureAirport(decodeResult, results[3]);
2112
2496
  ResultFormatter.arrivalAirport(decodeResult, results[4]);
2113
2497
  ResultFormatter.alternateAirport(decodeResult, results[5]);
2114
- ResultFormatter.arrivalRunway(decodeResult, results[8].replace(results[4], ""));
2498
+ ResultFormatter.arrivalRunway(
2499
+ decodeResult,
2500
+ results[8].replace(results[4], "")
2501
+ );
2115
2502
  const yymmdd = results[2];
2116
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertDateTimeToEpoch(results[7] + "00", yymmdd.substring(2, 4) + yymmdd.substring(4, 6) + yymmdd.substring(0, 2)), "epoch");
2503
+ ResultFormatter.eta(
2504
+ decodeResult,
2505
+ DateTimeUtils.convertDateTimeToEpoch(
2506
+ results[7] + "00",
2507
+ yymmdd.substring(2, 4) + yymmdd.substring(4, 6) + yymmdd.substring(0, 2)
2508
+ ),
2509
+ "epoch"
2510
+ );
2117
2511
  }
2118
2512
  decodeResult.decoded = true;
2119
2513
  decodeResult.decoder.decodeLevel = "partial";
@@ -2123,7 +2517,6 @@ var Label_1M_Slash = class extends DecoderPlugin {
2123
2517
 
2124
2518
  // lib/plugins/Label_1L_3-line.ts
2125
2519
  var Label_1L_3Line = class extends DecoderPlugin {
2126
- // eslint-disable-line camelcase
2127
2520
  name = "label-1l-3-line";
2128
2521
  qualifiers() {
2129
2522
  return {
@@ -2211,7 +2604,6 @@ var Label_1L_3Line = class extends DecoderPlugin {
2211
2604
 
2212
2605
  // lib/plugins/Label_1L_070.ts
2213
2606
  var Label_1L_070 = class extends DecoderPlugin {
2214
- // eslint-disable-line camelcase
2215
2607
  name = "label-1l-070";
2216
2608
  qualifiers() {
2217
2609
  return {
@@ -2245,8 +2637,14 @@ var Label_1L_070 = class extends DecoderPlugin {
2245
2637
  }
2246
2638
  ResultFormatter.departureAirport(decodeResult, parts[0]);
2247
2639
  ResultFormatter.arrivalAirport(decodeResult, parts[1]);
2248
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));
2249
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
2640
+ ResultFormatter.time_of_day(
2641
+ decodeResult,
2642
+ DateTimeUtils.convertHHMMSSToTod(parts[2])
2643
+ );
2644
+ ResultFormatter.eta(
2645
+ decodeResult,
2646
+ DateTimeUtils.convertHHMMSSToTod(parts[3])
2647
+ );
2250
2648
  ResultFormatter.position(decodeResult, {
2251
2649
  latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)),
2252
2650
  longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1))
@@ -2260,7 +2658,6 @@ var Label_1L_070 = class extends DecoderPlugin {
2260
2658
 
2261
2659
  // lib/plugins/Label_1L_660.ts
2262
2660
  var Label_1L_660 = class extends DecoderPlugin {
2263
- // eslint-disable-line camelcase
2264
2661
  name = "label-1l-660";
2265
2662
  qualifiers() {
2266
2663
  return {
@@ -2292,12 +2689,17 @@ var Label_1L_660 = class extends DecoderPlugin {
2292
2689
  decodeResult.decoder.decodeLevel = "none";
2293
2690
  return decodeResult;
2294
2691
  }
2295
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(parts[0]);
2692
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
2693
+ parts[0]
2694
+ );
2296
2695
  if (position) {
2297
2696
  ResultFormatter.position(decodeResult, position);
2298
2697
  }
2299
2698
  const hhmmss = parts[1].substring(0, 6);
2300
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmmss));
2699
+ ResultFormatter.time_of_day(
2700
+ decodeResult,
2701
+ DateTimeUtils.convertHHMMSSToTod(hhmmss)
2702
+ );
2301
2703
  const fl = parts[1].substring(6, 9);
2302
2704
  ResultFormatter.altitude(decodeResult, Number(fl) * 100);
2303
2705
  const next = parts[1].substring(9);
@@ -2311,7 +2713,6 @@ var Label_1L_660 = class extends DecoderPlugin {
2311
2713
 
2312
2714
  // lib/plugins/Label_1L_Slash.ts
2313
2715
  var Label_1L_Slash = class extends DecoderPlugin {
2314
- // eslint-disable-line camelcase
2315
2716
  name = "label-1l-1-line";
2316
2717
  qualifiers() {
2317
2718
  return {
@@ -2350,7 +2751,10 @@ var Label_1L_Slash = class extends DecoderPlugin {
2350
2751
  ResultFormatter.position(decodeResult, position);
2351
2752
  const utc = data.get("UTC");
2352
2753
  if (utc) {
2353
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(utc));
2754
+ ResultFormatter.time_of_day(
2755
+ decodeResult,
2756
+ DateTimeUtils.convertHHMMSSToTod(utc)
2757
+ );
2354
2758
  data.delete("UTC");
2355
2759
  }
2356
2760
  const alt = data.get("ALT");
@@ -2401,7 +2805,10 @@ var Label_20_POS = class extends DecoderPlugin {
2401
2805
  console.log(`DEBUG: ${this.name}: Variation 1 detected`);
2402
2806
  }
2403
2807
  const rawCoords = fields[0];
2404
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(rawCoords));
2808
+ ResultFormatter.position(
2809
+ decodeResult,
2810
+ CoordinateUtils.decodeStringCoordinates(rawCoords)
2811
+ );
2405
2812
  decodeResult.decoded = true;
2406
2813
  decodeResult.decoder.decodeLevel = "full";
2407
2814
  } else if (fields.length == 5) {
@@ -2416,7 +2823,9 @@ var Label_20_POS = class extends DecoderPlugin {
2416
2823
  decodeResult.decoder.decodeLevel = "full";
2417
2824
  } else {
2418
2825
  if (options.debug) {
2419
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);
2826
+ console.log(
2827
+ `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`
2828
+ );
2420
2829
  }
2421
2830
  decodeResult.decoded = false;
2422
2831
  decodeResult.decoder.decodeLevel = "none";
@@ -2444,17 +2853,29 @@ var Label_21_POS = class extends DecoderPlugin {
2444
2853
  const fields = content.split(",");
2445
2854
  if (fields.length == 9) {
2446
2855
  processPosition(decodeResult, fields[0].trim());
2447
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
2856
+ ResultFormatter.time_of_day(
2857
+ decodeResult,
2858
+ DateTimeUtils.convertHHMMSSToTod(fields[2])
2859
+ );
2448
2860
  ResultFormatter.altitude(decodeResult, Number(fields[3]));
2449
2861
  ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ""));
2450
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[7]));
2862
+ ResultFormatter.eta(
2863
+ decodeResult,
2864
+ DateTimeUtils.convertHHMMSSToTod(fields[7])
2865
+ );
2451
2866
  ResultFormatter.arrivalAirport(decodeResult, fields[8]);
2452
- ResultFormatter.unknownArr(decodeResult, [fields[1], fields[4], fields[5]]);
2867
+ ResultFormatter.unknownArr(decodeResult, [
2868
+ fields[1],
2869
+ fields[4],
2870
+ fields[5]
2871
+ ]);
2453
2872
  decodeResult.decoded = true;
2454
2873
  decodeResult.decoder.decodeLevel = "partial";
2455
2874
  } else {
2456
2875
  if (options.debug) {
2457
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);
2876
+ console.log(
2877
+ `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`
2878
+ );
2458
2879
  }
2459
2880
  decodeResult.decoded = false;
2460
2881
  decodeResult.decoder.decodeLevel = "none";
@@ -2497,12 +2918,27 @@ var Label_22_OFF = class extends DecoderPlugin {
2497
2918
  return decodeResult;
2498
2919
  }
2499
2920
  ResultFormatter.flightNumber(decodeResult, fields[0]);
2500
- ResultFormatter.departureDay(decodeResult, Number(fields[1].substring(0, 2)));
2501
- ResultFormatter.arrivalDay(decodeResult, Number(fields[1].substring(2, 4)));
2502
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)));
2503
- ResultFormatter.departureAirport(decodeResult, fields[1].substring(8, 12));
2921
+ ResultFormatter.departureDay(
2922
+ decodeResult,
2923
+ Number(fields[1].substring(0, 2))
2924
+ );
2925
+ ResultFormatter.arrivalDay(
2926
+ decodeResult,
2927
+ Number(fields[1].substring(2, 4))
2928
+ );
2929
+ ResultFormatter.time_of_day(
2930
+ decodeResult,
2931
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8))
2932
+ );
2933
+ ResultFormatter.departureAirport(
2934
+ decodeResult,
2935
+ fields[1].substring(8, 12)
2936
+ );
2504
2937
  ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));
2505
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)));
2938
+ ResultFormatter.off(
2939
+ decodeResult,
2940
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22))
2941
+ );
2506
2942
  ResultFormatter.unknown(decodeResult, fields[1].substring(22));
2507
2943
  decodeResult.decoded = true;
2508
2944
  decodeResult.decoder.decodeLevel = "partial";
@@ -2515,7 +2951,10 @@ var Label_22_OFF = class extends DecoderPlugin {
2515
2951
  }
2516
2952
  ResultFormatter.departureAirport(decodeResult, fields[0]);
2517
2953
  ResultFormatter.arrivalAirport(decodeResult, fields[1]);
2518
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
2954
+ ResultFormatter.off(
2955
+ decodeResult,
2956
+ DateTimeUtils.convertHHMMSSToTod(fields[2])
2957
+ );
2519
2958
  ResultFormatter.unknown(decodeResult, fields[3]);
2520
2959
  decodeResult.decoded = true;
2521
2960
  decodeResult.decoder.decodeLevel = "partial";
@@ -2527,17 +2966,31 @@ var Label_22_OFF = class extends DecoderPlugin {
2527
2966
  return decodeResult;
2528
2967
  }
2529
2968
  ResultFormatter.flightNumber(decodeResult, fields[0]);
2530
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(fields[1].substring(0, 14));
2969
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
2970
+ fields[1].substring(0, 14)
2971
+ );
2531
2972
  if (position) {
2532
2973
  ResultFormatter.position(decodeResult, position);
2533
2974
  }
2534
2975
  ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));
2535
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)));
2536
- ResultFormatter.departureAirport(decodeResult, fields[1].substring(20, 24));
2976
+ ResultFormatter.time_of_day(
2977
+ decodeResult,
2978
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20))
2979
+ );
2980
+ ResultFormatter.departureAirport(
2981
+ decodeResult,
2982
+ fields[1].substring(20, 24)
2983
+ );
2537
2984
  ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));
2538
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)));
2985
+ ResultFormatter.off(
2986
+ decodeResult,
2987
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32))
2988
+ );
2539
2989
  ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));
2540
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)));
2990
+ ResultFormatter.eta(
2991
+ decodeResult,
2992
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40))
2993
+ );
2541
2994
  decodeResult.decoded = true;
2542
2995
  decodeResult.decoder.decodeLevel = "partial";
2543
2996
  } else {
@@ -2568,7 +3021,9 @@ var Label_22_POS = class extends DecoderPlugin {
2568
3021
  const fields = message.text.split(",");
2569
3022
  if (fields.length !== 11) {
2570
3023
  if (options.debug) {
2571
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(",")}`);
3024
+ console.log(
3025
+ `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(",")}`
3026
+ );
2572
3027
  }
2573
3028
  decodeResult.decoded = false;
2574
3029
  decodeResult.decoder.decodeLevel = "none";
@@ -2582,7 +3037,10 @@ var Label_22_POS = class extends DecoderPlugin {
2582
3037
  latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,
2583
3038
  longitude: CoordinateUtils.getDirection(fields[0][8]) * lon
2584
3039
  });
2585
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
3040
+ ResultFormatter.time_of_day(
3041
+ decodeResult,
3042
+ DateTimeUtils.convertHHMMSSToTod(fields[2])
3043
+ );
2586
3044
  ResultFormatter.altitude(decodeResult, Number(fields[3]));
2587
3045
  ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);
2588
3046
  decodeResult.decoded = true;
@@ -2618,11 +3076,20 @@ var Label_2P_FM3 = class extends DecoderPlugin {
2618
3076
  ResultFormatter.flightNumber(decodeResult, header[0].substring(4));
2619
3077
  }
2620
3078
  if (header[1].length === 4) {
2621
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));
3079
+ ResultFormatter.time_of_day(
3080
+ decodeResult,
3081
+ DateTimeUtils.convertHHMMSSToTod(header[1])
3082
+ );
2622
3083
  } else {
2623
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));
3084
+ ResultFormatter.time_of_day(
3085
+ decodeResult,
3086
+ DateTimeUtils.convertHHMMSSToTod(header[1])
3087
+ );
2624
3088
  }
2625
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[1]));
3089
+ ResultFormatter.eta(
3090
+ decodeResult,
3091
+ DateTimeUtils.convertHHMMSSToTod(parts[1])
3092
+ );
2626
3093
  const lat = parts[2].replaceAll(" ", "");
2627
3094
  const lon = parts[3].replaceAll(" ", "");
2628
3095
  if (lat[0] === "N" || lat[0] === "S") {
@@ -2631,7 +3098,10 @@ var Label_2P_FM3 = class extends DecoderPlugin {
2631
3098
  longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
2632
3099
  });
2633
3100
  } else {
2634
- ResultFormatter.position(decodeResult, { latitude: Number(lat), longitude: Number(lon) });
3101
+ ResultFormatter.position(decodeResult, {
3102
+ latitude: Number(lat),
3103
+ longitude: Number(lon)
3104
+ });
2635
3105
  }
2636
3106
  ResultFormatter.altitude(decodeResult, Number(parts[4]));
2637
3107
  ResultFormatter.unknown(decodeResult, parts[5]);
@@ -2679,9 +3149,18 @@ var Label_2P_FM4 = class extends DecoderPlugin {
2679
3149
  ResultFormatter.departureAirport(decodeResult, header[1]);
2680
3150
  ResultFormatter.arrivalAirport(decodeResult, parts[1]);
2681
3151
  ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));
2682
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)));
2683
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
2684
- ResultFormatter.position(decodeResult, { latitude: Number(parts[4].replaceAll(" ", "")), longitude: Number(parts[5].replaceAll(" ", "")) });
3152
+ ResultFormatter.time_of_day(
3153
+ decodeResult,
3154
+ DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2))
3155
+ );
3156
+ ResultFormatter.eta(
3157
+ decodeResult,
3158
+ DateTimeUtils.convertHHMMSSToTod(parts[3])
3159
+ );
3160
+ ResultFormatter.position(decodeResult, {
3161
+ latitude: Number(parts[4].replaceAll(" ", "")),
3162
+ longitude: Number(parts[5].replaceAll(" ", ""))
3163
+ });
2685
3164
  ResultFormatter.altitude(decodeResult, Number(parts[6]));
2686
3165
  ResultFormatter.heading(decodeResult, Number(parts[7]));
2687
3166
  ResultFormatter.unknown(decodeResult, parts[8]);
@@ -2724,9 +3203,18 @@ var Label_2P_FM5 = class extends DecoderPlugin {
2724
3203
  }
2725
3204
  ResultFormatter.departureAirport(decodeResult, header[1]);
2726
3205
  ResultFormatter.arrivalAirport(decodeResult, parts[1]);
2727
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));
2728
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
2729
- ResultFormatter.position(decodeResult, { latitude: Number(parts[4].replaceAll(" ", "")), longitude: Number(parts[5].replaceAll(" ", "")) });
3206
+ ResultFormatter.time_of_day(
3207
+ decodeResult,
3208
+ DateTimeUtils.convertHHMMSSToTod(parts[2])
3209
+ );
3210
+ ResultFormatter.eta(
3211
+ decodeResult,
3212
+ DateTimeUtils.convertHHMMSSToTod(parts[3])
3213
+ );
3214
+ ResultFormatter.position(decodeResult, {
3215
+ latitude: Number(parts[4].replaceAll(" ", "")),
3216
+ longitude: Number(parts[5].replaceAll(" ", ""))
3217
+ });
2730
3218
  ResultFormatter.altitude(decodeResult, Number(parts[6]));
2731
3219
  ResultFormatter.unknown(decodeResult, parts[7]);
2732
3220
  ResultFormatter.unknown(decodeResult, parts[8]);
@@ -2763,7 +3251,10 @@ var Label_2P_POS = class extends DecoderPlugin {
2763
3251
  const parts = msg.split("/");
2764
3252
  let decoded = false;
2765
3253
  if (parts[0].length > 3) {
2766
- decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length - 3));
3254
+ decoded = H1Helper.decodeH1Message(
3255
+ decodeResult,
3256
+ msg.slice(parts[0].length - 3)
3257
+ );
2767
3258
  decodeResult.remaining.text = parts[0].slice(0, 3) + "/" + decodeResult.remaining.text;
2768
3259
  } else {
2769
3260
  decoded = H1Helper.decodeH1Message(decodeResult, msg);
@@ -2800,7 +3291,10 @@ var Label_24_Slash = class extends DecoderPlugin {
2800
3291
  if (fields.length == 10 && fields[0] == "" && fields[9] == "") {
2801
3292
  const mmddyy = fields[1].substring(4, 6) + fields[1].substring(2, 4) + fields[1].substring(0, 2);
2802
3293
  const hhmmss = fields[2] + "00";
2803
- decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(hhmmss, mmddyy);
3294
+ decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
3295
+ hhmmss,
3296
+ mmddyy
3297
+ );
2804
3298
  ResultFormatter.flightNumber(decodeResult, fields[3]);
2805
3299
  ResultFormatter.altitude(decodeResult, Number(fields[4]));
2806
3300
  const lat = fields[5];
@@ -2810,13 +3304,18 @@ var Label_24_Slash = class extends DecoderPlugin {
2810
3304
  longitude: (lon[0] === "E" ? 1 : -1) * Number(lon.substring(1))
2811
3305
  };
2812
3306
  ResultFormatter.position(decodeResult, position);
2813
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]));
3307
+ ResultFormatter.eta(
3308
+ decodeResult,
3309
+ DateTimeUtils.convertHHMMSSToTod(fields[8])
3310
+ );
2814
3311
  ResultFormatter.unknown(decodeResult, fields[7]);
2815
3312
  decodeResult.decoded = true;
2816
3313
  decodeResult.decoder.decodeLevel = "partial";
2817
3314
  } else {
2818
3315
  if (options.debug) {
2819
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`);
3316
+ console.log(
3317
+ `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`
3318
+ );
2820
3319
  }
2821
3320
  decodeResult.decoded = false;
2822
3321
  decodeResult.decoder.decodeLevel = "none";
@@ -2842,16 +3341,22 @@ var Label_30_Slash_EA = class extends DecoderPlugin {
2842
3341
  const results = message.text.split(/\n|\//).slice(1);
2843
3342
  if (results) {
2844
3343
  if (options.debug) {
2845
- console.log(`Label 30 EA: results`);
3344
+ console.log("Label 30 EA: results");
2846
3345
  console.log(results);
2847
3346
  }
2848
3347
  }
2849
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)));
3348
+ ResultFormatter.eta(
3349
+ decodeResult,
3350
+ DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4))
3351
+ );
2850
3352
  if (results[1].substring(0, 2) === "DS") {
2851
3353
  ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
2852
3354
  ResultFormatter.unknown(decodeResult, "/".concat(results[2]));
2853
3355
  } else {
2854
- ResultFormatter.unknown(decodeResult, "/".concat(results[1], "/", results[2]));
3356
+ ResultFormatter.unknown(
3357
+ decodeResult,
3358
+ "/".concat(results[1], "/", results[2])
3359
+ );
2855
3360
  }
2856
3361
  decodeResult.decoded = true;
2857
3362
  decodeResult.decoder.decodeLevel = "partial";
@@ -2876,17 +3381,26 @@ var Label_44_ETA = class extends DecoderPlugin {
2876
3381
  const data = message.text.split(",");
2877
3382
  if (data.length >= 9) {
2878
3383
  if (options.debug) {
2879
- console.log(`Label 44 ETA Report: groups`);
3384
+ console.log("Label 44 ETA Report: groups");
2880
3385
  console.log(data);
2881
3386
  }
2882
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
3387
+ ResultFormatter.position(
3388
+ decodeResult,
3389
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
3390
+ );
2883
3391
  ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));
2884
3392
  ResultFormatter.departureAirport(decodeResult, data[3]);
2885
3393
  ResultFormatter.arrivalAirport(decodeResult, data[4]);
2886
3394
  ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));
2887
3395
  ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));
2888
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
2889
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[7]));
3396
+ ResultFormatter.time_of_day(
3397
+ decodeResult,
3398
+ DateTimeUtils.convertHHMMSSToTod(data[6])
3399
+ );
3400
+ ResultFormatter.eta(
3401
+ decodeResult,
3402
+ DateTimeUtils.convertHHMMSSToTod(data[7])
3403
+ );
2890
3404
  const fuel = Number(data[8]);
2891
3405
  if (!isNaN(fuel)) {
2892
3406
  ResultFormatter.remainingFuel(decodeResult, Number(fuel));
@@ -2926,15 +3440,21 @@ var Label_44_IN = class extends DecoderPlugin {
2926
3440
  const data = message.text.split(",");
2927
3441
  if (data.length >= 7) {
2928
3442
  if (options.debug) {
2929
- console.log(`Label 44 In Air Report: groups`);
3443
+ console.log("Label 44 In Air Report: groups");
2930
3444
  console.log(data);
2931
3445
  }
2932
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
3446
+ ResultFormatter.position(
3447
+ decodeResult,
3448
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
3449
+ );
2933
3450
  ResultFormatter.departureAirport(decodeResult, data[2]);
2934
3451
  ResultFormatter.arrivalAirport(decodeResult, data[3]);
2935
3452
  ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2936
3453
  ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2937
- ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
3454
+ ResultFormatter.in(
3455
+ decodeResult,
3456
+ DateTimeUtils.convertHHMMSSToTod(data[5])
3457
+ );
2938
3458
  const fuel = Number(data[6]);
2939
3459
  if (!isNaN(fuel)) {
2940
3460
  ResultFormatter.remainingFuel(decodeResult, Number(fuel));
@@ -2974,16 +3494,25 @@ var Label_44_OFF = class extends DecoderPlugin {
2974
3494
  const data = message.text.split(",");
2975
3495
  if (data.length >= 8) {
2976
3496
  if (options.debug) {
2977
- console.log(`Label 44 Off Runway Report: groups`);
3497
+ console.log("Label 44 Off Runway Report: groups");
2978
3498
  console.log(data);
2979
3499
  }
2980
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
3500
+ ResultFormatter.position(
3501
+ decodeResult,
3502
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
3503
+ );
2981
3504
  ResultFormatter.departureAirport(decodeResult, data[2]);
2982
3505
  ResultFormatter.arrivalAirport(decodeResult, data[3]);
2983
3506
  ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2984
3507
  ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2985
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
2986
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
3508
+ ResultFormatter.off(
3509
+ decodeResult,
3510
+ DateTimeUtils.convertHHMMSSToTod(data[5])
3511
+ );
3512
+ ResultFormatter.eta(
3513
+ decodeResult,
3514
+ DateTimeUtils.convertHHMMSSToTod(data[6])
3515
+ );
2987
3516
  const fuel = Number(data[7]);
2988
3517
  if (!isNaN(fuel)) {
2989
3518
  ResultFormatter.remainingFuel(decodeResult, Number(fuel));
@@ -3023,15 +3552,21 @@ var Label_44_ON = class extends DecoderPlugin {
3023
3552
  const data = message.text.split(",");
3024
3553
  if (data.length >= 7) {
3025
3554
  if (options.debug) {
3026
- console.log(`Label 44 On Runway Report: groups`);
3555
+ console.log("Label 44 On Runway Report: groups");
3027
3556
  console.log(data);
3028
3557
  }
3029
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
3558
+ ResultFormatter.position(
3559
+ decodeResult,
3560
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
3561
+ );
3030
3562
  ResultFormatter.departureAirport(decodeResult, data[2]);
3031
3563
  ResultFormatter.arrivalAirport(decodeResult, data[3]);
3032
3564
  ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
3033
3565
  ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
3034
- ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
3566
+ ResultFormatter.on(
3567
+ decodeResult,
3568
+ DateTimeUtils.convertHHMMSSToTod(data[5])
3569
+ );
3035
3570
  const fuel = Number(data[6]);
3036
3571
  if (!isNaN(fuel)) {
3037
3572
  ResultFormatter.remainingFuel(decodeResult, Number(fuel));
@@ -3072,19 +3607,39 @@ var Label_44_POS = class extends DecoderPlugin {
3072
3607
  const results = message.text.match(regex);
3073
3608
  if (results?.groups) {
3074
3609
  if (options.debug) {
3075
- console.log(`Label 44 Position Report: groups`);
3610
+ console.log("Label 44 Position Report: groups");
3076
3611
  console.log(results.groups);
3077
3612
  }
3078
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));
3613
+ ResultFormatter.position(
3614
+ decodeResult,
3615
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
3616
+ results.groups.unsplit_coords
3617
+ )
3618
+ );
3079
3619
  const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
3080
- ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));
3081
- ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));
3082
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00"));
3083
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00"));
3620
+ ResultFormatter.month(
3621
+ decodeResult,
3622
+ Number(results.groups.current_date.substring(0, 2))
3623
+ );
3624
+ ResultFormatter.day(
3625
+ decodeResult,
3626
+ Number(results.groups.current_date.substring(2, 4))
3627
+ );
3628
+ ResultFormatter.time_of_day(
3629
+ decodeResult,
3630
+ DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00")
3631
+ );
3632
+ ResultFormatter.eta(
3633
+ decodeResult,
3634
+ DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00")
3635
+ );
3084
3636
  if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
3085
3637
  decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
3086
3638
  }
3087
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
3639
+ ResultFormatter.departureAirport(
3640
+ decodeResult,
3641
+ results.groups.departure_icao
3642
+ );
3088
3643
  ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
3089
3644
  ResultFormatter.altitude(decodeResult, flight_level * 100);
3090
3645
  }
@@ -3122,7 +3677,7 @@ var Label_44_Slash = class extends DecoderPlugin {
3122
3677
  const data = fields[3].split(",");
3123
3678
  if (data.length >= 6) {
3124
3679
  if (options.debug) {
3125
- console.log(`Label 44 Slash: groups`);
3680
+ console.log("Label 44 Slash: groups");
3126
3681
  console.log(data);
3127
3682
  }
3128
3683
  ResultFormatter.position(decodeResult, {
@@ -3172,34 +3727,33 @@ var Label_4A = class extends DecoderPlugin {
3172
3727
  decodeResult.decoder.name = this.name;
3173
3728
  decodeResult.message = message;
3174
3729
  decodeResult.formatted.description = "Latest New Format";
3175
- let text = message.text;
3176
- if (text.match(/^M\d{2}A\w{6}/)) {
3177
- ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
3178
- text = text.substring(10);
3179
- }
3180
3730
  decodeResult.decoded = true;
3181
- const fields = text.split(",");
3731
+ const fields = message.text.split(",");
3182
3732
  if (fields.length === 11) {
3183
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
3733
+ ResultFormatter.time_of_day(
3734
+ decodeResult,
3735
+ DateTimeUtils.convertHHMMSSToTod(fields[0])
3736
+ );
3184
3737
  ResultFormatter.tail(decodeResult, fields[2].replace(".", ""));
3185
- if (fields[3])
3186
- ResultFormatter.callsign(decodeResult, fields[3]);
3738
+ if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);
3187
3739
  ResultFormatter.departureAirport(decodeResult, fields[4]);
3188
3740
  ResultFormatter.arrivalAirport(decodeResult, fields[5]);
3189
- const alt = text.substring(48, 51);
3190
- if (alt !== "") {
3191
- ResultFormatter.altitude(decodeResult, Number(alt) * 100);
3192
- }
3193
3741
  ResultFormatter.unknownArr(decodeResult, fields.slice(8));
3194
3742
  } else if (fields.length === 6) {
3195
3743
  if (fields[0].match(/^[NS]/)) {
3196
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)));
3744
+ ResultFormatter.position(
3745
+ decodeResult,
3746
+ CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13))
3747
+ );
3197
3748
  let wp1 = {
3198
3749
  name: fields[0].substring(13).trim(),
3199
3750
  time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),
3200
3751
  timeFormat: "tod"
3201
3752
  };
3202
- ResultFormatter.altitude(decodeResult, Number(fields[1].substring(6, 9)) * 100);
3753
+ ResultFormatter.altitude(
3754
+ decodeResult,
3755
+ Number(fields[1].substring(6, 9)) * 100
3756
+ );
3203
3757
  let wp2 = {
3204
3758
  name: fields[1].substring(9).trim(),
3205
3759
  time: DateTimeUtils.convertHHMMSSToTod(fields[2]),
@@ -3209,21 +3763,31 @@ var Label_4A = class extends DecoderPlugin {
3209
3763
  ResultFormatter.temperature(decodeResult, fields[3]);
3210
3764
  ResultFormatter.unknownArr(decodeResult, fields.slice(4));
3211
3765
  } else {
3212
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
3213
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1]));
3766
+ ResultFormatter.time_of_day(
3767
+ decodeResult,
3768
+ DateTimeUtils.convertHHMMSSToTod(fields[0])
3769
+ );
3770
+ ResultFormatter.eta(
3771
+ decodeResult,
3772
+ DateTimeUtils.convertHHMMSSToTod(fields[1])
3773
+ );
3214
3774
  ResultFormatter.unknown(decodeResult, fields[2]);
3215
3775
  ResultFormatter.altitude(decodeResult, Number(fields[3]));
3216
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates((fields[4] + fields[5]).replace(/[ \.]/g, "")));
3776
+ ResultFormatter.position(
3777
+ decodeResult,
3778
+ CoordinateUtils.decodeStringCoordinates(
3779
+ (fields[4] + fields[5]).replace(/[ \.]/g, "")
3780
+ )
3781
+ );
3217
3782
  }
3218
3783
  } else {
3219
3784
  decodeResult.decoded = false;
3220
- ResultFormatter.unknown(decodeResult, text);
3785
+ ResultFormatter.unknown(decodeResult, message.text);
3221
3786
  }
3222
3787
  if (decodeResult.decoded) {
3223
3788
  if (!decodeResult.remaining.text)
3224
3789
  decodeResult.decoder.decodeLevel = "full";
3225
- else
3226
- decodeResult.decoder.decodeLevel = "partial";
3790
+ else decodeResult.decoder.decodeLevel = "partial";
3227
3791
  } else {
3228
3792
  decodeResult.decoder.decodeLevel = "none";
3229
3793
  }
@@ -3246,11 +3810,16 @@ var Label_4A_01 = class extends DecoderPlugin {
3246
3810
  decodeResult.message = message;
3247
3811
  decodeResult.formatted.description = "Latest New Format";
3248
3812
  decodeResult.decoded = true;
3249
- let rgx = message.text.match(/^01([A-Z]{2})([A-Z]{2})\s*(\w+)\/(\d{6})([A-Z]{4})([A-Z]{4})\r\n([+-]\s*\d+)(\d{3}\.\d)([+-]\s*\d+\.\d)/);
3813
+ let rgx = message.text.match(
3814
+ /^01([A-Z]{2})([A-Z]{2})\s*(\w+)\/(\d{6})([A-Z]{4})([A-Z]{4})\r\n([+-]\s*\d+)(\d{3}\.\d)([+-]\s*\d+\.\d)/
3815
+ );
3250
3816
  if (rgx) {
3251
3817
  ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);
3252
3818
  ResultFormatter.callsign(decodeResult, rgx[3]);
3253
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00"));
3819
+ ResultFormatter.time_of_day(
3820
+ decodeResult,
3821
+ DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00")
3822
+ );
3254
3823
  ResultFormatter.departureAirport(decodeResult, rgx[5]);
3255
3824
  ResultFormatter.arrivalAirport(decodeResult, rgx[6]);
3256
3825
  ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, "")));
@@ -3263,8 +3832,7 @@ var Label_4A_01 = class extends DecoderPlugin {
3263
3832
  if (decodeResult.decoded) {
3264
3833
  if (!decodeResult.remaining.text)
3265
3834
  decodeResult.decoder.decodeLevel = "full";
3266
- else
3267
- decodeResult.decoder.decodeLevel = "partial";
3835
+ else decodeResult.decoder.decodeLevel = "partial";
3268
3836
  } else {
3269
3837
  decodeResult.decoder.decodeLevel = "none";
3270
3838
  }
@@ -3288,14 +3856,16 @@ var Label_4A_DIS = class extends DecoderPlugin {
3288
3856
  decodeResult.formatted.description = "Latest New Format";
3289
3857
  decodeResult.decoded = true;
3290
3858
  const fields = message.text.split(",");
3291
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00"));
3859
+ ResultFormatter.time_of_day(
3860
+ decodeResult,
3861
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00")
3862
+ );
3292
3863
  ResultFormatter.callsign(decodeResult, fields[2]);
3293
3864
  ResultFormatter.freetext(decodeResult, fields.slice(3).join(""));
3294
3865
  if (decodeResult.decoded) {
3295
3866
  if (!decodeResult.remaining.text)
3296
3867
  decodeResult.decoder.decodeLevel = "full";
3297
- else
3298
- decodeResult.decoder.decodeLevel = "partial";
3868
+ else decodeResult.decoder.decodeLevel = "partial";
3299
3869
  } else {
3300
3870
  decodeResult.decoder.decodeLevel = "none";
3301
3871
  }
@@ -3320,8 +3890,15 @@ var Label_4A_DOOR = class extends DecoderPlugin {
3320
3890
  decodeResult.decoded = true;
3321
3891
  const fields = message.text.split(" ");
3322
3892
  if (fields.length === 3) {
3323
- ResultFormatter.door_event(decodeResult, fields[0].split("/")[1], fields[1]);
3324
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + "00"));
3893
+ ResultFormatter.door_event(
3894
+ decodeResult,
3895
+ fields[0].split("/")[1],
3896
+ fields[1]
3897
+ );
3898
+ ResultFormatter.time_of_day(
3899
+ decodeResult,
3900
+ DateTimeUtils.convertHHMMSSToTod(fields[2] + "00")
3901
+ );
3325
3902
  } else {
3326
3903
  decodeResult.decoded = false;
3327
3904
  ResultFormatter.unknown(decodeResult, message.text);
@@ -3329,8 +3906,7 @@ var Label_4A_DOOR = class extends DecoderPlugin {
3329
3906
  if (decodeResult.decoded) {
3330
3907
  if (!decodeResult.remaining.text)
3331
3908
  decodeResult.decoder.decodeLevel = "full";
3332
- else
3333
- decodeResult.decoder.decodeLevel = "partial";
3909
+ else decodeResult.decoder.decodeLevel = "partial";
3334
3910
  } else {
3335
3911
  decodeResult.decoder.decodeLevel = "none";
3336
3912
  }
@@ -3362,8 +3938,7 @@ var Label_4A_Slash_01 = class extends DecoderPlugin {
3362
3938
  if (decodeResult.decoded) {
3363
3939
  if (!decodeResult.remaining.text)
3364
3940
  decodeResult.decoder.decodeLevel = "full";
3365
- else
3366
- decodeResult.decoder.decodeLevel = "partial";
3941
+ else decodeResult.decoder.decodeLevel = "partial";
3367
3942
  } else {
3368
3943
  decodeResult.decoder.decodeLevel = "none";
3369
3944
  }
@@ -3416,24 +3991,35 @@ var Label_4N = class extends DecoderPlugin {
3416
3991
  decodeResult.decoder.name = this.name;
3417
3992
  decodeResult.message = message;
3418
3993
  decodeResult.formatted.description = "Airline Defined";
3419
- let text = message.text;
3420
- if (text.match(/^M\d{2}A\w{6}/)) {
3421
- ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
3422
- text = text.substring(10);
3423
- }
3424
3994
  decodeResult.decoded = true;
3995
+ const text = message.text;
3425
3996
  const fields = text.split(",");
3426
3997
  if (text.length === 51) {
3427
3998
  decodeResult.raw.day = text.substring(0, 2);
3428
3999
  ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));
3429
4000
  ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));
3430
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(30, 45).replace(/^(.)0/, "$1")));
3431
- ResultFormatter.altitude(decodeResult, Number(text.substring(48, 51)) * 100);
3432
- ResultFormatter.unknownArr(decodeResult, [text.substring(2, 4), text.substring(19, 29)], " ");
4001
+ ResultFormatter.position(
4002
+ decodeResult,
4003
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
4004
+ text.substring(30, 45).replace(/^(.)0/, "$1")
4005
+ )
4006
+ );
4007
+ ResultFormatter.altitude(
4008
+ decodeResult,
4009
+ Number(text.substring(48, 51)) * 100
4010
+ );
4011
+ ResultFormatter.unknownArr(
4012
+ decodeResult,
4013
+ [text.substring(2, 4), text.substring(19, 29)],
4014
+ " "
4015
+ );
3433
4016
  } else if (fields.length === 33) {
3434
4017
  decodeResult.raw.date = fields[3];
3435
4018
  if (fields[1] === "B") {
3436
- ResultFormatter.position(decodeResult, { latitude: Number(fields[4]), longitude: Number(fields[5]) });
4019
+ ResultFormatter.position(decodeResult, {
4020
+ latitude: Number(fields[4]),
4021
+ longitude: Number(fields[5])
4022
+ });
3437
4023
  ResultFormatter.altitude(decodeResult, Number(fields[6]));
3438
4024
  }
3439
4025
  ResultFormatter.departureAirport(decodeResult, fields[8]);
@@ -3444,7 +4030,12 @@ var Label_4N = class extends DecoderPlugin {
3444
4030
  ResultFormatter.alternateRunway(decodeResult, fields[12].split("/")[0]);
3445
4031
  }
3446
4032
  ResultFormatter.checksum(decodeResult, fields[32]);
3447
- ResultFormatter.unknownArr(decodeResult, [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter((f) => f != ""));
4033
+ ResultFormatter.unknownArr(
4034
+ decodeResult,
4035
+ [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(
4036
+ (f) => f != ""
4037
+ )
4038
+ );
3448
4039
  } else {
3449
4040
  decodeResult.decoded = false;
3450
4041
  ResultFormatter.unknown(decodeResult, text);
@@ -3452,8 +4043,7 @@ var Label_4N = class extends DecoderPlugin {
3452
4043
  if (decodeResult.decoded) {
3453
4044
  if (!decodeResult.remaining.text)
3454
4045
  decodeResult.decoder.decodeLevel = "full";
3455
- else
3456
- decodeResult.decoder.decodeLevel = "partial";
4046
+ else decodeResult.decoder.decodeLevel = "partial";
3457
4047
  } else {
3458
4048
  decodeResult.decoder.decodeLevel = "none";
3459
4049
  }
@@ -3488,9 +4078,16 @@ var Label_4T_AGFSR = class extends DecoderPlugin {
3488
4078
  ResultFormatter.flightNumber(decodeResult, data[0].trim());
3489
4079
  ResultFormatter.departureDay(decodeResult, Number(data[1]));
3490
4080
  ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
3491
- ResultFormatter.departureAirport(decodeResult, data[3].substring(0, 3), "IATA");
4081
+ ResultFormatter.departureAirport(
4082
+ decodeResult,
4083
+ data[3].substring(0, 3),
4084
+ "IATA"
4085
+ );
3492
4086
  ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
3493
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)));
4087
+ ResultFormatter.time_of_day(
4088
+ decodeResult,
4089
+ DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4))
4090
+ );
3494
4091
  ResultFormatter.unknown(decodeResult, data[5], "/");
3495
4092
  const lat = data[6].substring(0, 7);
3496
4093
  const lon = data[6].substring(7, 15);
@@ -3523,7 +4120,10 @@ var Label_58 = class extends DecoderPlugin {
3523
4120
  if (data.length === 8) {
3524
4121
  ResultFormatter.flightNumber(decodeResult, data[0]);
3525
4122
  ResultFormatter.day(decodeResult, Number(data[1]));
3526
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
4123
+ ResultFormatter.time_of_day(
4124
+ decodeResult,
4125
+ DateTimeUtils.convertHHMMSSToTod(data[2])
4126
+ );
3527
4127
  const lat = data[3];
3528
4128
  const lon = data[4];
3529
4129
  ResultFormatter.position(decodeResult, {
@@ -3577,7 +4177,10 @@ var Label_4T_ETA = class extends DecoderPlugin {
3577
4177
  const etaData = data[2].split(" ");
3578
4178
  ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
3579
4179
  ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
3580
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)));
4180
+ ResultFormatter.eta(
4181
+ decodeResult,
4182
+ DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4))
4183
+ );
3581
4184
  decodeResult.decoded = true;
3582
4185
  decodeResult.decoder.decodeLevel = "full";
3583
4186
  return decodeResult;
@@ -3609,7 +4212,10 @@ var Label_80 = class extends DecoderPlugin {
3609
4212
  this.parseTags(more.trim(), decodeResult);
3610
4213
  }
3611
4214
  }
3612
- this.parseHeader(headerParts[headerParts.length - 1].trim(), decodeResult);
4215
+ this.parseHeader(
4216
+ headerParts[headerParts.length - 1].trim(),
4217
+ decodeResult
4218
+ );
3613
4219
  for (let i = 1; i < lines.length; i++) {
3614
4220
  const line = lines[i];
3615
4221
  const parts = line.split("/");
@@ -3697,10 +4303,16 @@ var Label_80 = class extends DecoderPlugin {
3697
4303
  case "FB":
3698
4304
  break;
3699
4305
  case "FOB":
3700
- ResultFormatter.currentFuel(results, parseInt(val.replace(/\D/g, ""), 10));
4306
+ ResultFormatter.currentFuel(
4307
+ results,
4308
+ parseInt(val.replace(/\D/g, ""), 10)
4309
+ );
3701
4310
  break;
3702
4311
  case "UTC":
3703
- ResultFormatter.time_of_day(results, DateTimeUtils.convertHHMMSSToTod(val));
4312
+ ResultFormatter.time_of_day(
4313
+ results,
4314
+ DateTimeUtils.convertHHMMSSToTod(val)
4315
+ );
3704
4316
  break;
3705
4317
  case "ETA":
3706
4318
  const hhmm = val.split(".")[0].replace(":", "");
@@ -3729,11 +4341,20 @@ var Label_80 = class extends DecoderPlugin {
3729
4341
  const header = csvParts[0].trim().split(/\s+/);
3730
4342
  ResultFormatter.unknown(results, header[0], " ");
3731
4343
  ResultFormatter.unknown(results, header[1], " ");
3732
- ResultFormatter.position(results, CoordinateUtils.decodeStringCoordinates(header[2]));
4344
+ ResultFormatter.position(
4345
+ results,
4346
+ CoordinateUtils.decodeStringCoordinates(header[2])
4347
+ );
3733
4348
  ResultFormatter.unknown(results, csvParts[1]);
3734
- ResultFormatter.time_of_day(results, DateTimeUtils.convertHHMMSSToTod(csvParts[2]));
4349
+ ResultFormatter.time_of_day(
4350
+ results,
4351
+ DateTimeUtils.convertHHMMSSToTod(csvParts[2])
4352
+ );
3735
4353
  ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ",");
3736
- ResultFormatter.temperature(results, ((csvParts[6].charAt(0) === "M" ? -1 : 1) * parseInt(csvParts[6].slice(1), 10)).toString());
4354
+ ResultFormatter.temperature(
4355
+ results,
4356
+ ((csvParts[6].charAt(0) === "M" ? -1 : 1) * parseInt(csvParts[6].slice(1), 10)).toString()
4357
+ );
3737
4358
  ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));
3738
4359
  ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));
3739
4360
  }
@@ -3752,12 +4373,8 @@ var Label_83 = class extends DecoderPlugin {
3752
4373
  decodeResult.decoder.name = this.name;
3753
4374
  decodeResult.message = message;
3754
4375
  decodeResult.formatted.description = "Airline Defined";
3755
- let text = message.text;
3756
- if (text.match(/^M\d{2}A\w{6}/)) {
3757
- ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
3758
- text = text.substring(10);
3759
- }
3760
4376
  decodeResult.decoded = true;
4377
+ const text = message.text;
3761
4378
  if (text.substring(0, 10) === "4DH3 ETAT2") {
3762
4379
  const fields = text.split(/\s+/);
3763
4380
  if (fields[2].length > 5) {
@@ -3768,10 +4385,15 @@ var Label_83 = class extends DecoderPlugin {
3768
4385
  ResultFormatter.departureAirport(decodeResult, subfields[0]);
3769
4386
  ResultFormatter.arrivalAirport(decodeResult, subfields[1]);
3770
4387
  ResultFormatter.tail(decodeResult, fields[4].replace(/\./g, ""));
3771
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[6] + "00"));
4388
+ ResultFormatter.eta(
4389
+ decodeResult,
4390
+ DateTimeUtils.convertHHMMSSToTod(fields[6] + "00")
4391
+ );
3772
4392
  } else if (text.substring(0, 5) === "001PR") {
3773
4393
  decodeResult.raw.day = text.substring(5, 7);
3774
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(13, 28).replace(/\./g, ""));
4394
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
4395
+ text.substring(13, 28).replace(/\./g, "")
4396
+ );
3775
4397
  if (position) {
3776
4398
  ResultFormatter.position(decodeResult, position);
3777
4399
  }
@@ -3784,27 +4406,23 @@ var Label_83 = class extends DecoderPlugin {
3784
4406
  ResultFormatter.arrivalAirport(decodeResult, fields[1]);
3785
4407
  decodeResult.raw.day = fields[2].substring(0, 2);
3786
4408
  decodeResult.raw.time = fields[2].substring(2);
3787
- ResultFormatter.position(
3788
- decodeResult,
3789
- {
3790
- latitude: Number(fields[3].replace(/\s/g, "")),
3791
- longitude: Number(fields[4].replace(/\s/g, ""))
3792
- }
3793
- );
4409
+ ResultFormatter.position(decodeResult, {
4410
+ latitude: Number(fields[3].replace(/\s/g, "")),
4411
+ longitude: Number(fields[4].replace(/\s/g, ""))
4412
+ });
3794
4413
  ResultFormatter.altitude(decodeResult, Number(fields[5]));
3795
4414
  ResultFormatter.groundspeed(decodeResult, Number(fields[6]));
3796
4415
  ResultFormatter.heading(decodeResult, Number(fields[7]));
3797
4416
  ResultFormatter.unknown(decodeResult, fields[8]);
3798
4417
  } else {
3799
4418
  decodeResult.decoded = false;
3800
- ResultFormatter.unknown(decodeResult, message.text);
4419
+ ResultFormatter.unknown(decodeResult, text);
3801
4420
  }
3802
4421
  }
3803
4422
  if (decodeResult.decoded) {
3804
4423
  if (!decodeResult.remaining.text)
3805
4424
  decodeResult.decoder.decodeLevel = "full";
3806
- else
3807
- decodeResult.decoder.decodeLevel = "partial";
4425
+ else decodeResult.decoder.decodeLevel = "partial";
3808
4426
  } else {
3809
4427
  decodeResult.decoder.decodeLevel = "none";
3810
4428
  }
@@ -3829,10 +4447,13 @@ var Label_8E = class extends DecoderPlugin {
3829
4447
  const results = message.text.match(regex);
3830
4448
  if (results?.groups) {
3831
4449
  if (options.debug) {
3832
- console.log(`Label 8E ETA: groups`);
4450
+ console.log("Label 8E ETA: groups");
3833
4451
  console.log(results.groups);
3834
4452
  }
3835
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta));
4453
+ ResultFormatter.eta(
4454
+ decodeResult,
4455
+ DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta)
4456
+ );
3836
4457
  ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
3837
4458
  }
3838
4459
  decodeResult.decoded = true;
@@ -3902,11 +4523,26 @@ var Label_H1 = class extends DecoderPlugin {
3902
4523
  const msg = message.text.replace(/\n|\r/g, "");
3903
4524
  const parts = msg.split("#");
3904
4525
  let decoded = false;
3905
- if (parts.length === 1) {
4526
+ if (msg.startsWith("/")) {
4527
+ const headerData = msg.split(".");
4528
+ const decoded2 = H1Helper.decodeH1Message(
4529
+ decodeResult,
4530
+ headerData.slice(1).join(".")
4531
+ );
4532
+ if (decoded2) {
4533
+ decodeResult.remaining.text = headerData[0] + "." + decodeResult.remaining.text;
4534
+ decodeResult.decoded = decoded2;
4535
+ decodeResult.decoder.decodeLevel = "partial";
4536
+ }
4537
+ return decodeResult;
4538
+ } else if (parts.length === 1) {
3906
4539
  decoded = H1Helper.decodeH1Message(decodeResult, msg);
3907
4540
  } else if (parts.length == 2) {
3908
4541
  const offset = isNaN(parseInt(parts[1][1])) ? 3 : 4;
3909
- decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length + offset));
4542
+ decoded = H1Helper.decodeH1Message(
4543
+ decodeResult,
4544
+ msg.slice(parts[0].length + offset)
4545
+ );
3910
4546
  if (decoded && parts[0].length > 0) {
3911
4547
  ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));
3912
4548
  decodeResult.remaining.text = parts[0].substring(0, 4) + "#" + parts[1].substring(0, offset - 1) + "/" + decodeResult.remaining.text;
@@ -4040,7 +4676,10 @@ var Label_H1_FLR = class extends DecoderPlugin {
4040
4676
  const datetime = data.substring(0, 12);
4041
4677
  const date = datetime.substring(4, 6) + datetime.substring(2, 4) + datetime.substring(0, 2);
4042
4678
  ResultFormatter.unknown(decodeResult, data.substring(12), "/");
4043
- decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);
4679
+ decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
4680
+ datetime.substring(6),
4681
+ date
4682
+ );
4044
4683
  decodeResult.raw.fault_message = msg;
4045
4684
  decodeResult.formatted.items.push({
4046
4685
  type: "fault",
@@ -4120,65 +4759,6 @@ var Label_H1_OHMA = class extends DecoderPlugin {
4120
4759
  }
4121
4760
  };
4122
4761
 
4123
- // lib/plugins/Label_H1_Slash.ts
4124
- var Label_H1_Slash = class extends DecoderPlugin {
4125
- name = "label-h1-slash";
4126
- qualifiers() {
4127
- return {
4128
- labels: ["H1"],
4129
- preambles: ["/"]
4130
- };
4131
- }
4132
- decode(message, options = {}) {
4133
- let decodeResult = this.defaultResult();
4134
- decodeResult.decoder.name = this.name;
4135
- decodeResult.formatted.description = "Position Report";
4136
- decodeResult.message = message;
4137
- const checksum = message.text.slice(-4);
4138
- const data = message.text.slice(0, message.text.length - 4);
4139
- const fields = data.split("/");
4140
- if (fields[0] !== "") {
4141
- ResultFormatter.unknown(decodeResult, message.text);
4142
- decodeResult.decoded = false;
4143
- decodeResult.decoder.decodeLevel = "none";
4144
- return decodeResult;
4145
- }
4146
- const headerData = fields[1].split(".");
4147
- ResultFormatter.unknown(decodeResult, headerData[0]);
4148
- if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
4149
- H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
4150
- } else if (headerData[1] === "POS") {
4151
- } else if (headerData[1].startsWith("POS")) {
4152
- H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
4153
- } else {
4154
- ResultFormatter.unknown(decodeResult, headerData[1], ".");
4155
- }
4156
- for (let i = 2; i < fields.length; i++) {
4157
- const field = fields[i];
4158
- if (field.startsWith("TS")) {
4159
- H1Helper.processTimeStamp(decodeResult, field.substring(2, 15).split(","));
4160
- } else if (field.startsWith("PS")) {
4161
- H1Helper.processPS(decodeResult, field.substring(2).split(","));
4162
- } else {
4163
- ResultFormatter.unknown(decodeResult, field, "/");
4164
- }
4165
- }
4166
- if (decodeResult.formatted.items.length === 0) {
4167
- if (options.debug) {
4168
- console.log(`Decoder: Unknown H1 message: ${message.text}`);
4169
- }
4170
- ResultFormatter.unknown(decodeResult, message.text);
4171
- decodeResult.decoded = false;
4172
- decodeResult.decoder.decodeLevel = "none";
4173
- return decodeResult;
4174
- }
4175
- ResultFormatter.checksum(decodeResult, checksum);
4176
- decodeResult.decoded = true;
4177
- decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
4178
- return decodeResult;
4179
- }
4180
- };
4181
-
4182
4762
  // lib/plugins/Label_H1_StarPOS.ts
4183
4763
  var Label_H1_StarPOS = class extends DecoderPlugin {
4184
4764
  name = "label-h1-star-pos";
@@ -4205,7 +4785,10 @@ var Label_H1_StarPOS = class extends DecoderPlugin {
4205
4785
  }
4206
4786
  ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));
4207
4787
  ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));
4208
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)));
4788
+ ResultFormatter.time_of_day(
4789
+ decodeResult,
4790
+ DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12))
4791
+ );
4209
4792
  ResultFormatter.position(decodeResult, {
4210
4793
  // Deg Min, no sec
4211
4794
  latitude: CoordinateUtils.getDirection(msg.substring(12, 13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),
@@ -4242,7 +4825,10 @@ var Label_H1_WRN = class extends DecoderPlugin {
4242
4825
  const datetime = data.substring(0, 12);
4243
4826
  const date = datetime.substring(4, 6) + datetime.substring(2, 4) + datetime.substring(0, 2);
4244
4827
  ResultFormatter.unknown(decodeResult, data.substring(12), "/");
4245
- decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);
4828
+ decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
4829
+ datetime.substring(6),
4830
+ date
4831
+ );
4246
4832
  decodeResult.raw.warning_message = msg;
4247
4833
  decodeResult.formatted.items.push({
4248
4834
  type: "warning",
@@ -4302,8 +4888,7 @@ var Label_HX = class extends DecoderPlugin {
4302
4888
  if (decodeResult.decoded) {
4303
4889
  if (!decodeResult.remaining.text)
4304
4890
  decodeResult.decoder.decodeLevel = "full";
4305
- else
4306
- decodeResult.decoder.decodeLevel = "partial";
4891
+ else decodeResult.decoder.decodeLevel = "partial";
4307
4892
  } else {
4308
4893
  decodeResult.decoder.decodeLevel = "none";
4309
4894
  }
@@ -4435,10 +5020,16 @@ var MIAMCoreUtils = class {
4435
5020
  }
4436
5021
  },
4437
5022
  ["F" /* FileTransferRequest */]: () => {
4438
- return { decoded: false, error: "File Transfer Request not implemented" };
5023
+ return {
5024
+ decoded: false,
5025
+ error: "File Transfer Request not implemented"
5026
+ };
4439
5027
  },
4440
5028
  ["K" /* FileTransferAccept */]: () => {
4441
- return { decoded: false, error: "File Transfer Accept not implemented" };
5029
+ return {
5030
+ decoded: false,
5031
+ error: "File Transfer Accept not implemented"
5032
+ };
4442
5033
  },
4443
5034
  ["S" /* FileSegment */]: () => {
4444
5035
  return { decoded: false, error: "File Segment not implemented" };
@@ -5020,7 +5611,9 @@ var MIAMCoreUtils = class {
5020
5611
  const msgSize = hdr.length + (body === void 0 ? 0 : body.length);
5021
5612
  if (pduSize > msgSize) {
5022
5613
  pduIsComplete = false;
5023
- pduErrors.push("v1 PDU truncated: expecting " + pduSize + ", got " + msgSize);
5614
+ pduErrors.push(
5615
+ "v1 PDU truncated: expecting " + pduSize + ", got " + msgSize
5616
+ );
5024
5617
  }
5025
5618
  hdr = hdr.subarray(4);
5026
5619
  tail = hdr.subarray(0, 7).toString("ascii");
@@ -5068,7 +5661,9 @@ var MIAMCoreUtils = class {
5068
5661
  }
5069
5662
  hdr = hdr.subarray(crcLen);
5070
5663
  if (body !== void 0 && body.length > 0) {
5071
- if ([1 /* Deflate */, 1 /* Deflate */].indexOf(pduCompression) >= 0) {
5664
+ if ([1 /* Deflate */, 1 /* Deflate */].indexOf(
5665
+ pduCompression
5666
+ ) >= 0) {
5072
5667
  try {
5073
5668
  const decompress = new zlib2.InflateRaw({});
5074
5669
  decompress.write(body);
@@ -5077,10 +5672,14 @@ var MIAMCoreUtils = class {
5077
5672
  } catch (e) {
5078
5673
  pduErrors.push("Inflation failed for body: " + e);
5079
5674
  }
5080
- } else if ([0 /* None */, 0 /* None */].indexOf(pduCompression) >= 0) {
5675
+ } else if ([0 /* None */, 0 /* None */].indexOf(
5676
+ pduCompression
5677
+ ) >= 0) {
5081
5678
  pduData = body;
5082
5679
  } else {
5083
- pduErrors.push("Unsupported v" + version + " compression type: " + pduCompression);
5680
+ pduErrors.push(
5681
+ "Unsupported v" + version + " compression type: " + pduCompression
5682
+ );
5084
5683
  }
5085
5684
  if (pduData !== null) {
5086
5685
  const crcAlgoHandlerByVersion = {
@@ -5100,7 +5699,9 @@ var MIAMCoreUtils = class {
5100
5699
  if (crcCheck === pduCrc) {
5101
5700
  pduCrcIsOk = true;
5102
5701
  } else {
5103
- pduErrors.push("Body failed CRC check: provided=" + pduCrc + ", generated=" + crcCheck);
5702
+ pduErrors.push(
5703
+ "Body failed CRC check: provided=" + pduCrc + ", generated=" + crcCheck
5704
+ );
5104
5705
  }
5105
5706
  }
5106
5707
  } else {
@@ -5143,7 +5744,13 @@ var MIAMCoreUtils = class {
5143
5744
  static VersionPduHandlerTable = {
5144
5745
  [1 /* V1 */]: {
5145
5746
  [0 /* Data */]: (hdr, body) => {
5146
- return this.corePduDataHandler(1 /* V1 */, 20, MIAMCoreV1CRCLength, hdr, body);
5747
+ return this.corePduDataHandler(
5748
+ 1 /* V1 */,
5749
+ 20,
5750
+ MIAMCoreV1CRCLength,
5751
+ hdr,
5752
+ body
5753
+ );
5147
5754
  },
5148
5755
  [1 /* Ack */]: () => {
5149
5756
  return { decoded: false, error: "v1 Ack PDU not implemented" };
@@ -5157,7 +5764,13 @@ var MIAMCoreUtils = class {
5157
5764
  },
5158
5765
  [2 /* V2 */]: {
5159
5766
  [0 /* Data */]: (hdr, body) => {
5160
- return this.corePduDataHandler(2 /* V2 */, 7, MIAMCoreV2CRCLength, hdr, body);
5767
+ return this.corePduDataHandler(
5768
+ 2 /* V2 */,
5769
+ 7,
5770
+ MIAMCoreV2CRCLength,
5771
+ hdr,
5772
+ body
5773
+ );
5161
5774
  },
5162
5775
  [1 /* Ack */]: () => {
5163
5776
  return { decoded: false, error: "v2 Ack PDU not implemented" };
@@ -5189,28 +5802,39 @@ var Label_MA = class extends DecoderPlugin {
5189
5802
  decodeResult.decoded = true;
5190
5803
  ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);
5191
5804
  if (miamResult.message.data.acars.sublabel) {
5192
- ResultFormatter.sublabel(decodeResult, miamResult.message.data.acars.sublabel);
5805
+ ResultFormatter.sublabel(
5806
+ decodeResult,
5807
+ miamResult.message.data.acars.sublabel
5808
+ );
5193
5809
  }
5194
5810
  if (miamResult.message.data.acars.tail) {
5195
- ResultFormatter.tail(decodeResult, miamResult.message.data.acars.tail);
5811
+ ResultFormatter.tail(
5812
+ decodeResult,
5813
+ miamResult.message.data.acars.tail.replace(".", "")
5814
+ );
5196
5815
  }
5197
5816
  const messageText = miamResult.message.data.acars.text;
5198
5817
  if (miamResult.message.data.crcOk && miamResult.message.data.complete && messageText) {
5199
5818
  decodeResult.decoder.decodeLevel = "full";
5200
- const decoded = this.decoder.decode({
5201
- label: miamResult.message.data.acars.label,
5202
- sublabel: miamResult.message.data.acars.sublabel,
5203
- text: messageText
5204
- }, options);
5819
+ const decoded = this.decoder.decode(
5820
+ {
5821
+ label: miamResult.message.data.acars.label,
5822
+ sublabel: miamResult.message.data.acars.sublabel,
5823
+ text: messageText
5824
+ },
5825
+ options
5826
+ );
5205
5827
  if (decoded.decoded) {
5206
5828
  decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
5207
5829
  decodeResult.formatted.items.push(...decoded.formatted.items);
5830
+ decodeResult.remaining = decoded.remaining;
5208
5831
  } else {
5209
5832
  ResultFormatter.text(decodeResult, messageText);
5833
+ decodeResult.remaining = { text: messageText };
5210
5834
  }
5211
5835
  } else if (messageText) {
5212
5836
  decodeResult.decoder.decodeLevel = "partial";
5213
- ResultFormatter.text(decodeResult, messageText);
5837
+ decodeResult.remaining = { text: messageText };
5214
5838
  } else {
5215
5839
  decodeResult.decoder.decodeLevel = "partial";
5216
5840
  }
@@ -5338,15 +5962,19 @@ var Label_QR = class extends DecoderPlugin {
5338
5962
  const decodeResult = this.defaultResult();
5339
5963
  decodeResult.decoder.name = this.name;
5340
5964
  decodeResult.formatted.description = "ON Report";
5341
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5965
+ ResultFormatter.departureAirport(
5966
+ decodeResult,
5967
+ message.text.substring(0, 4)
5968
+ );
5342
5969
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5343
- ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5970
+ ResultFormatter.on(
5971
+ decodeResult,
5972
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
5973
+ );
5344
5974
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
5345
5975
  decodeResult.decoded = true;
5346
- if (!decodeResult.remaining.text)
5347
- decodeResult.decoder.decodeLevel = "full";
5348
- else
5349
- decodeResult.decoder.decodeLevel = "partial";
5976
+ if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
5977
+ else decodeResult.decoder.decodeLevel = "partial";
5350
5978
  return decodeResult;
5351
5979
  }
5352
5980
  };
@@ -5363,15 +5991,19 @@ var Label_QP = class extends DecoderPlugin {
5363
5991
  const decodeResult = this.defaultResult();
5364
5992
  decodeResult.decoder.name = this.name;
5365
5993
  decodeResult.formatted.description = "OUT Report";
5366
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5994
+ ResultFormatter.departureAirport(
5995
+ decodeResult,
5996
+ message.text.substring(0, 4)
5997
+ );
5367
5998
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5368
- ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5999
+ ResultFormatter.out(
6000
+ decodeResult,
6001
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
6002
+ );
5369
6003
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
5370
6004
  decodeResult.decoded = true;
5371
- if (!decodeResult.remaining.text)
5372
- decodeResult.decoder.decodeLevel = "full";
5373
- else
5374
- decodeResult.decoder.decodeLevel = "partial";
6005
+ if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
6006
+ else decodeResult.decoder.decodeLevel = "partial";
5375
6007
  return decodeResult;
5376
6008
  }
5377
6009
  };
@@ -5388,15 +6020,19 @@ var Label_QS = class extends DecoderPlugin {
5388
6020
  const decodeResult = this.defaultResult();
5389
6021
  decodeResult.decoder.name = this.name;
5390
6022
  decodeResult.formatted.description = "IN Report";
5391
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
6023
+ ResultFormatter.departureAirport(
6024
+ decodeResult,
6025
+ message.text.substring(0, 4)
6026
+ );
5392
6027
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5393
- ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
6028
+ ResultFormatter.in(
6029
+ decodeResult,
6030
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
6031
+ );
5394
6032
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
5395
6033
  decodeResult.decoded = true;
5396
- if (!decodeResult.remaining.text)
5397
- decodeResult.decoder.decodeLevel = "full";
5398
- else
5399
- decodeResult.decoder.decodeLevel = "partial";
6034
+ if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
6035
+ else decodeResult.decoder.decodeLevel = "partial";
5400
6036
  return decodeResult;
5401
6037
  }
5402
6038
  };
@@ -5414,11 +6050,17 @@ var Label_QQ = class extends DecoderPlugin {
5414
6050
  decodeResult.decoder.name = this.name;
5415
6051
  decodeResult.message = message;
5416
6052
  decodeResult.formatted.description = "OFF Report";
5417
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
6053
+ ResultFormatter.departureAirport(
6054
+ decodeResult,
6055
+ message.text.substring(0, 4)
6056
+ );
5418
6057
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5419
6058
  if (message.text.substring(12, 19) === "\r\n001FE") {
5420
6059
  decodeResult.raw.day = message.text.substring(19, 21);
5421
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
6060
+ ResultFormatter.off(
6061
+ decodeResult,
6062
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27))
6063
+ );
5422
6064
  let latdir = message.text.substring(27, 28);
5423
6065
  let latdeg = Number(message.text.substring(28, 30));
5424
6066
  let latmin = Number(message.text.substring(30, 34));
@@ -5432,20 +6074,24 @@ var Label_QQ = class extends DecoderPlugin {
5432
6074
  ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
5433
6075
  ResultFormatter.position(decodeResult, pos);
5434
6076
  if (decodeResult.remaining.text !== "---") {
5435
- ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
6077
+ ResultFormatter.groundspeed(
6078
+ decodeResult,
6079
+ Number(message.text.substring(45, 48))
6080
+ );
5436
6081
  } else {
5437
6082
  ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
5438
6083
  }
5439
6084
  ResultFormatter.unknown(decodeResult, message.text.substring(48));
5440
6085
  } else {
5441
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
6086
+ ResultFormatter.off(
6087
+ decodeResult,
6088
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00")
6089
+ );
5442
6090
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
5443
6091
  }
5444
6092
  decodeResult.decoded = true;
5445
- if (!decodeResult.remaining.text)
5446
- decodeResult.decoder.decodeLevel = "full";
5447
- else
5448
- decodeResult.decoder.decodeLevel = "partial";
6093
+ if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
6094
+ else decodeResult.decoder.decodeLevel = "partial";
5449
6095
  return decodeResult;
5450
6096
  }
5451
6097
  };
@@ -5459,6 +6105,7 @@ var MessageDecoder = class {
5459
6105
  this.name = "acars-decoder-typescript";
5460
6106
  this.plugins = [];
5461
6107
  this.debug = false;
6108
+ this.registerPlugin(new CBand(this));
5462
6109
  this.registerPlugin(new Label_ColonComma(this));
5463
6110
  this.registerPlugin(new Label_5Z_Slash(this));
5464
6111
  this.registerPlugin(new Label_10_LDR(this));
@@ -5509,7 +6156,6 @@ var MessageDecoder = class {
5509
6156
  this.registerPlugin(new Label_H1_OHMA(this));
5510
6157
  this.registerPlugin(new Label_H1_WRN(this));
5511
6158
  this.registerPlugin(new Label_H1(this));
5512
- this.registerPlugin(new Label_H1_Slash(this));
5513
6159
  this.registerPlugin(new Label_H1_StarPOS(this));
5514
6160
  this.registerPlugin(new Label_HX(this));
5515
6161
  this.registerPlugin(new Label_58(this));
@@ -5525,14 +6171,13 @@ var MessageDecoder = class {
5525
6171
  this.registerPlugin(new Label_QS(this));
5526
6172
  }
5527
6173
  registerPlugin(plugin) {
5528
- const pluginInstance = plugin;
5529
6174
  this.plugins.push(plugin);
5530
6175
  return true;
5531
6176
  }
5532
6177
  decode(message, options = {}) {
5533
6178
  const usablePlugins = this.plugins.filter((plugin) => {
5534
6179
  const qualifiers = plugin.qualifiers();
5535
- if (qualifiers.labels.includes(message.label)) {
6180
+ if (qualifiers.labels.includes(message.label) || qualifiers.labels.length === 1 && qualifiers.labels[0] === "*") {
5536
6181
  if (qualifiers.preambles && qualifiers.preambles.length > 0) {
5537
6182
  const matching = qualifiers.preambles.filter((preamble) => {
5538
6183
  return message.text.substring(0, preamble.length) === preamble;