@airframes/acars-decoder 1.8.14 → 1.9.0
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/License.md +21 -0
- package/README.md +8 -11
- package/dist/index.d.mts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +272 -161
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +272 -161
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../lib/IcaoDecoder.ts","../lib/utils/coordinate_utils.ts","../lib/DateTimeUtils.ts","../lib/utils/route_utils.ts","../lib/utils/result_formatter.ts","../lib/DecoderPlugin.ts","../lib/plugins/CBand.ts","../lib/utils/flight_plan_utils.ts","../lib/utils/arinc_702_helper.ts","../lib/plugins/ARINC_702.ts","../lib/plugins/Label_5Z_Slash.ts","../lib/plugins/Label_10_LDR.ts","../lib/plugins/Label_10_POS.ts","../lib/plugins/Label_10_Slash.ts","../lib/plugins/Label_12_N_Space.ts","../lib/plugins/Label_12_POS.ts","../lib/plugins/Label_13Through18_Slash.ts","../lib/plugins/Label_15.ts","../lib/plugins/Label_15_FST.ts","../lib/plugins/Label_16_Honeywell.ts","../lib/plugins/Label_16_N_Space.ts","../lib/plugins/Label_16_POSA1.ts","../lib/plugins/Label_16_TOD.ts","../lib/plugins/Label_1M_Slash.ts","../lib/plugins/Label_1L_3-line.ts","../lib/plugins/Label_1L_070.ts","../lib/plugins/Label_1L_660.ts","../lib/plugins/Label_1L_Slash.ts","../lib/plugins/Label_20_POS.ts","../lib/plugins/Label_21_POS.ts","../lib/plugins/Label_22_OFF.ts","../lib/plugins/Label_22_POS.ts","../lib/plugins/Label_2P_FM3.ts","../lib/plugins/Label_2P_FM4.ts","../lib/plugins/Label_2P_FM5.ts","../lib/plugins/Label_24_Slash.ts","../lib/plugins/Label_30_Slash_EA.ts","../lib/plugins/Label_44_ETA.ts","../lib/plugins/Label_44_Base.ts","../lib/plugins/Label_44_IN.ts","../lib/plugins/Label_44_OFF.ts","../lib/plugins/Label_44_ON.ts","../lib/plugins/Label_44_POS.ts","../lib/plugins/Label_44_Slash.ts","../lib/plugins/Label_4A.ts","../lib/plugins/Label_4A_01.ts","../lib/plugins/Label_4A_DIS.ts","../lib/plugins/Label_4A_DOOR.ts","../lib/plugins/Label_4A_Slash_01.ts","../lib/plugins/Label_4N.ts","../lib/plugins/Label_4T_AGFSR.ts","../lib/plugins/Label_58.ts","../lib/plugins/Label_4T_ETA.ts","../lib/plugins/Label_80.ts","../lib/plugins/Label_83.ts","../lib/plugins/Label_8E.ts","../lib/plugins/Label_B6.ts","../lib/plugins/Label_ColonComma.ts","../lib/plugins/Label_H2_02E.ts","../lib/plugins/Label_H1_ATIS.ts","../lib/plugins/Label_H1_EZF.ts","../lib/plugins/Label_H1_FLR.ts","../lib/plugins/Label_H1_M_POS.ts","../lib/plugins/Label_H1_OHMA.ts","../lib/utils/icao_fpl_utils.ts","../lib/plugins/Label_H1_OFP.ts","../lib/plugins/Label_H1_Paren.ts","../lib/plugins/Label_H1_StarPOS.ts","../lib/plugins/Label_H1_WRN.ts","../lib/plugins/Label_HX.ts","../lib/utils/miam.ts","../lib/plugins/Label_MA.ts","../lib/plugins/Label_SQ.ts","../lib/plugins/Label_QR.ts","../lib/plugins/Label_QP.ts","../lib/plugins/Label_QS.ts","../lib/plugins/Label_QQ.ts","../lib/MessageDecoder.ts"],"sourcesContent":["export * from './lib/IcaoDecoder';\nexport * from './lib/MessageDecoder';\n","export class IcaoDecoder {\n name: string;\n icao: string;\n\n // Military ICAO address ranges (as [start, end] tuples, inclusive)\n private static readonly MILITARY_RANGES: Array<[number, number]> = [\n [0x010070, 0x01008f], // Egypt\n [0x0a4000, 0x0a4fff], // Algeria\n [0x33ff00, 0x33ffff], // Italy\n [0x350000, 0x37ffff], // Spain\n [0x3aa000, 0x3affff], // France 1\n [0x3b7000, 0x3bffff], // France 2\n [0x3ea000, 0x3ebfff], // Germany 1\n [0x3f4000, 0x3fbfff], // Germany 2\n [0x400000, 0x40003f], // UK 1\n [0x43c000, 0x43cfff], // UK 2\n [0x444000, 0x446fff], // Austria\n [0x44f000, 0x44ffff], // Belgium\n [0x457000, 0x457fff], // Bulgaria\n [0x45f400, 0x45f4ff], // Denmark\n [0x468000, 0x4683ff], // Greece\n [0x473c00, 0x473c0f], // Hungary\n [0x478100, 0x4781ff], // Norway\n [0x480000, 0x480fff], // Netherlands\n [0x48d800, 0x48d87f], // Poland\n [0x497c00, 0x497cff], // Portugal\n [0x498420, 0x49842f], // Czech\n [0x4b7000, 0x4b7fff], // Switzerland\n [0x4b8200, 0x4b82ff], // Turkey\n [0x70c070, 0x70c07f], // Oman\n [0x710258, 0x71028f], // Saudi 1\n [0x710380, 0x71039f], // Saudi 2\n [0x738a00, 0x738aff], // Israel\n [0x7cf800, 0x7cfaff], // Australia\n [0x800200, 0x8002ff], // India\n [0xadf7c8, 0xafffff], // USA\n [0xc20000, 0xc3ffff], // Canada\n [0xe40000, 0xe41fff], // Brazil\n ];\n\n constructor(icao: string) {\n this.name = 'icao-decoder-typescript';\n this.icao = icao;\n }\n\n isMilitary(): boolean {\n const i = this.icao;\n const n = parseInt(i, 16);\n for (const [start, end] of IcaoDecoder.MILITARY_RANGES) {\n if (start <= n && n <= end) {\n return true;\n }\n }\n return false;\n }\n}\n","export class CoordinateUtils {\n /**\n * Decode a string of coordinates into an object with latitude and longitude in millidegrees\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinates(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar == ' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (Number(stringCoords.substring(1, 6)) / 1000) *\n CoordinateUtils.getDirection(firstChar),\n longitude:\n (Number(longitudeChars) / 1000) *\n CoordinateUtils.getDirection(middleChar),\n };\n }\n\n return undefined;\n }\n\n /**\n * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinatesDecimalMinutes(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar == ' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n const latDeg = Math.trunc(Number(stringCoords.substring(1, 6)) / 1000);\n const latMin = (Number(stringCoords.substring(1, 6)) % 1000) / 10;\n const lonDeg = Math.trunc(Number(longitudeChars) / 1000);\n const lonMin = (Number(longitudeChars) % 1000) / 10;\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (latDeg + latMin / 60) * CoordinateUtils.getDirection(firstChar),\n longitude:\n (lonDeg + lonMin / 60) * CoordinateUtils.getDirection(middleChar),\n };\n }\n return undefined;\n }\n public static coordinateString(coords: {\n latitude: number;\n longitude: number;\n }): string {\n const latDir = coords.latitude > 0 ? 'N' : 'S';\n const lonDir = coords.longitude > 0 ? 'E' : 'W';\n return `${Math.abs(coords.latitude).toFixed(3)} ${latDir}, ${Math.abs(coords.longitude).toFixed(3)} ${lonDir}`;\n }\n\n public static getDirection(coord: string): number {\n if (coord.startsWith('N') || coord.startsWith('E')) {\n return 1;\n } else if (coord.startsWith('S') || coord.startsWith('W')) {\n return -1;\n }\n return NaN;\n }\n\n public static dmsToDecimalDegrees(\n degrees: number,\n minutes: number,\n seconds: number,\n ): number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}\n","export class DateTimeUtils {\n // Expects a four digit UTC time string (HHMM)\n public static UTCToString(UTCString: string) {\n let utcDate = new Date();\n utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);\n return utcDate.toTimeString();\n }\n\n // Expects a six digit date string and a four digit UTC time string\n // (DDMMYY) (HHMM)\n public static UTCDateTimeToString(dateString: string, timeString: string) {\n let utcDate = new Date();\n utcDate.setUTCDate(+dateString.substr(0, 2));\n utcDate.setUTCMonth(+dateString.substr(2, 2));\n if (dateString.length === 6) {\n utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));\n }\n if (timeString.length === 6) {\n utcDate.setUTCHours(\n +timeString.substr(0, 2),\n +timeString.substr(2, 2),\n +timeString.substr(4, 2),\n );\n } else {\n utcDate.setUTCHours(\n +timeString.substr(0, 2),\n +timeString.substr(2, 2),\n 0,\n );\n }\n return utcDate.toUTCString();\n }\n\n /**\n *\n * @param time HHMMSS or HHMM\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number {\n if (time.length === 4) {\n time += '00';\n }\n const h = Number(time.substring(0, 2));\n const m = Number(time.substring(2, 4));\n const s = Number(time.substring(4, 6));\n const tod = h * 3600 + m * 60 + s;\n return tod;\n }\n\n public static convertDayTimeToTod(time: string): number {\n const d = Number(time.substring(0, 2));\n const h = Number(time.substring(2, 4));\n const m = Number(time.substring(4, 6));\n const s = Number(time.substring(6, 8));\n const tod = d * 86400 + h * 3600 + m * 60 + s;\n return tod;\n }\n\n /**\n *\n * @param time HHMMSS\n * @param date DDMMYY or DDMMYYYY\n * @returns seconds since epoch\n */\n public static convertDateTimeToEpoch(time: string, date: string): number {\n //YYYY-MM-DDTHH:mm:ss.sssZ\n if (date.length === 6) {\n date = date.substring(0, 4) + `20${date.substring(4, 6)}`;\n }\n const timestamp = `${date.substring(4, 8)}-${date.substring(2, 4)}-${date.substring(0, 2)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;\n const millis = Date.parse(timestamp);\n return millis / 1000;\n }\n\n /**\n * Converts a timestamp to a string\n *\n * ISO-8601 format for 'epoch'\n * HH:MM:SS for 'tod'\n * @param time\n * @param format\n * @returns\n */\n public static timestampToString(time: number): string {\n const date = new Date(time * 1000);\n\n if (time < 86400) {\n // only time, no date\n return date.toISOString().slice(11, 19);\n }\n if (time < 2678400) {\n // unknown month and date\n return `YYYY-MM-${date.toISOString().slice(8, 19)}`;\n }\n //strip off millis\n return date.toISOString().slice(0, -5) + 'Z';\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { Route } from '../types/route';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from './coordinate_utils';\n\nexport class RouteUtils {\n public static formatFlightState(state: string): string {\n switch (state) {\n case 'TO':\n return 'Takeoff';\n case 'IC':\n return 'Initial Climb';\n case 'CL':\n return 'Climb';\n case 'ER':\n return 'En Route';\n case 'DC':\n return 'Descent';\n case 'AP':\n return 'Approach';\n default:\n return `Unknown ${state}`;\n }\n }\n\n public static routeToString(route: Route): string {\n let str = '';\n if (route.name) {\n str += route.name;\n }\n if (route.runway) {\n str += `(${route.runway})`;\n }\n if (str.length !== 0 && route.waypoints && route.waypoints.length === 1) {\n str += ' starting at ';\n } else if (str.length !== 0 && route.waypoints) {\n str += ': ';\n }\n\n if (route.waypoints) {\n str += RouteUtils.waypointsToString(route.waypoints);\n }\n\n return str;\n }\n\n public static waypointToString(waypoint: Waypoint): string {\n let s = waypoint.name;\n if (waypoint.latitude && waypoint.longitude) {\n s += `(${CoordinateUtils.coordinateString({ latitude: waypoint.latitude, longitude: waypoint.longitude })})`;\n }\n if (waypoint.offset) {\n s += `[${waypoint.offset.bearing}° ${waypoint.offset.distance}nm]`;\n }\n if (waypoint.time) {\n s += `@${DateTimeUtils.timestampToString(waypoint.time)}`;\n }\n return s;\n }\n\n public static getWaypoint(leg: string): Waypoint {\n const regex = leg.match(/^([A-Z]+)(\\d{3})-(\\d{4})$/); // {name}{bearing}-{distance}\n if (regex?.length == 4) {\n return {\n name: regex[1],\n offset: {\n bearing: parseInt(regex[2]),\n distance: parseInt(regex[3]) / 10,\n },\n };\n }\n\n const waypoint = leg.split(',');\n if (waypoint.length == 2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n waypoint[1],\n );\n if (position) {\n return {\n name: waypoint[0],\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n if (leg.length == 13 || leg.length == 14) {\n //looks like coordinates\n const position =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if (position) {\n return {\n name: name,\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n return { name: leg };\n }\n\n private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints\n .map((x) => RouteUtils.waypointToString(x))\n .join(' > ')\n .replaceAll('> >', '>>');\n if (str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { RouteUtils } from './route_utils';\nimport { Route } from '../types/route';\nimport { Wind } from '../types/wind';\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n static route(decodeResult: DecodeResult, route: Route) {\n decodeResult.raw.route = route;\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(route),\n });\n }\n\n static state_change(decodeResult: DecodeResult, from: string, to: string) {\n decodeResult.raw.state_change = {\n from: from,\n to: to,\n };\n from = RouteUtils.formatFlightState(from);\n to = RouteUtils.formatFlightState(to);\n decodeResult.formatted.items.push({\n type: 'state_change',\n code: 'STATE_CHANGE',\n label: 'State Change',\n value: `${from} -> ${to}`,\n });\n }\n\n static door_event(decodeResult: DecodeResult, name: string, state: string) {\n decodeResult.raw.door_event = {\n door: name,\n state: state,\n };\n\n decodeResult.formatted.items.push({\n type: 'door_event',\n code: 'DOOR',\n label: 'Door Event',\n value: `${name} ${state}`,\n });\n }\n\n static position(\n decodeResult: DecodeResult,\n value: { latitude: number; longitude: number } | undefined,\n ) {\n if (!value || isNaN(value.latitude) || isNaN(value.longitude)) {\n return;\n }\n decodeResult.raw.position = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(value),\n });\n }\n\n static altitude(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.altitude = value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n }\n\n static flightNumber(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.flight_number = value;\n decodeResult.formatted.items.push({\n type: 'flight_number',\n code: 'FLIGHT',\n label: 'Flight Number',\n value: decodeResult.raw.flight_number,\n });\n }\n\n static callsign(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.callsign = value;\n decodeResult.formatted.items.push({\n type: 'callsign',\n code: 'CALLSIGN',\n label: 'Callsign',\n value: decodeResult.raw.callsign,\n });\n }\n\n static departureAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n } else {\n decodeResult.raw.departure_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n }\n }\n\n static departureRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'DEPRWY',\n label: 'Departure Runway',\n value: decodeResult.raw.departure_runway,\n });\n }\n\n static arrivalAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n } else {\n decodeResult.raw.arrival_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n }\n }\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n }\n\n static eta(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.eta_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static arrivalRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ARWY',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n }\n\n static alternateRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ALT_ARWY',\n label: 'Alternate Runway',\n value: decodeResult.raw.alternate_runway,\n });\n }\n\n static currentFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_on_board = value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: 'Fuel On Board',\n value: decodeResult.raw.fuel_on_board.toString(),\n });\n }\n\n static burnedFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_burned = value;\n decodeResult.formatted.items.push({\n type: 'fuel_burned',\n code: 'FB',\n label: 'Fuel Burned',\n value: decodeResult.raw.fuel_burned.toString(),\n });\n }\n\n static remainingFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n code: ' FUEL_REM',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n }\n\n static outFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.out_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_OUT',\n label: 'Out of Gate Fuel',\n value: decodeResult.raw.out_fuel.toString() + ' lbs',\n });\n }\n\n static offFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.off_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_OFF',\n label: 'Takeoff Fuel',\n value: decodeResult.raw.off_fuel.toString() + ' lbs',\n });\n }\n\n static onFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.on_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_ON',\n label: 'Landing Fuel',\n value: decodeResult.raw.on_fuel.toString() + ' lbs',\n });\n }\n\n static inFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.in_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_IN',\n label: 'In Gate Fuel',\n value: decodeResult.raw.in_fuel.toString() + ' lbs',\n });\n }\n\n static startFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.start_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_START',\n label: 'Start Fuel',\n value: decodeResult.raw.start_fuel.toString() + ' lbs',\n });\n }\n\n static checksumAlgorithm(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.checksum_algorithm = value;\n // decodeResult.formatted.items.push({\n // type: 'message_checksum_algorithm',\n // code: 'CHECKSUM_ALGO',\n // label: 'Checksum Algorithm',\n // value: decodeResult.raw.checksum_algorithm,\n // });\n }\n\n static checksum(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.checksum = value;\n decodeResult.formatted.items.push({\n type: 'message_checksum',\n code: 'CHECKSUM',\n label: 'Message Checksum',\n value: '0x' + ('0000' + decodeResult.raw.checksum.toString(16)).slice(-4),\n });\n }\n\n static groundspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.groundspeed = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_groundspeed',\n code: 'GSPD',\n label: 'Aircraft Groundspeed',\n value: `${decodeResult.raw.groundspeed} knots`,\n });\n }\n\n static airspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.airspeed = value;\n decodeResult.formatted.items.push({\n type: 'airspeed',\n code: 'ASPD',\n label: 'True Airspeed',\n value: `${decodeResult.raw.airspeed} knots`,\n });\n }\n\n static mach(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.mach = value;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MACH',\n label: 'Mach Number',\n value: `${decodeResult.raw.mach} mach`,\n });\n }\n\n static temperature(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.outside_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'outside_air_temperature',\n code: 'OATEMP',\n label: 'Outside Air Temperature (C)',\n value: `${decodeResult.raw.outside_air_temperature} degrees`,\n });\n }\n\n static totalAirTemp(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.total_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'temperature',\n code: 'TATEMP',\n label: 'Total Air Temperature (C)',\n value: `${decodeResult.raw.total_air_temperature} degrees`,\n });\n }\n\n static heading(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.heading = value;\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: 'Heading',\n value: `${decodeResult.raw.heading}`,\n });\n }\n\n static tail(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.tail = value;\n decodeResult.formatted.items.push({\n type: 'tail',\n code: 'TAIL',\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n }\n\n static out(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.out_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static off(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.off_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.on_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ON',\n label: 'Landing Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.in_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'IN',\n label: 'In Gate Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static engineStart(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.engine_start_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ENG_START',\n label: 'Engine Start Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n static engineStop(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.engine_stop_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ENG_STOP',\n label: 'Engine Stop Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static day(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'MSG_DAY',\n label: 'Day of Month',\n value: `${day}`,\n });\n }\n\n static month(decodeResult: DecodeResult, month: number) {\n decodeResult.raw.month = month;\n decodeResult.formatted.items.push({\n type: 'month',\n code: 'MSG_MON',\n label: 'Month of Year',\n value: `${month}`,\n });\n }\n\n static departureDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.departure_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'DEP_DAY',\n label: 'Departure Day',\n value: `${day}`,\n });\n }\n\n static arrivalDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.arrival_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'ARR_DAY',\n label: 'Arrival Day',\n value: `${day}`,\n });\n }\n\n static text(decodeResult: DecodeResult, text: string) {\n decodeResult.raw.text = text;\n decodeResult.formatted.items.push({\n type: 'text',\n code: 'TEXT',\n label: 'Text Message',\n value: text,\n });\n }\n\n static mac(decodeResult: DecodeResult, mac: number) {\n decodeResult.raw.mac = mac;\n decodeResult.formatted.items.push({\n type: 'mac',\n code: 'MAC',\n label: 'Mean Aerodynamic Chord',\n value: `${mac} %`,\n });\n }\n\n static trim(decodeResult: DecodeResult, trim: number) {\n decodeResult.raw.trim = trim;\n decodeResult.formatted.items.push({\n type: 'trim',\n code: 'TRIM',\n label: 'Trim',\n value: `${trim} units`,\n });\n }\n\n static windData(decodeResult: DecodeResult, windData: Wind[]) {\n decodeResult.raw.wind_data = windData;\n for (const wind of windData) {\n let text = `${RouteUtils.waypointToString(wind.waypoint)} at FL${wind.flightLevel}: ${wind.windDirection}° at ${wind.windSpeed}kt`;\n if (wind.temperature) {\n text += `, ${wind.temperature.degreesC}°C at FL${wind.temperature.flightLevel}`;\n }\n decodeResult.formatted.items.push({\n type: 'wind_data',\n code: 'WIND',\n label: 'Wind Data',\n value: text,\n });\n }\n }\n\n static cg(\n decodeResult: DecodeResult,\n value: number,\n type: 'center' | 'lower' | 'upper' = 'center',\n ) {\n switch (type) {\n case 'center':\n decodeResult.raw.center_of_gravity = value;\n decodeResult.formatted.items.push({\n type: 'center_of_gravity',\n code: 'CG',\n label: 'Center of Gravity',\n value: `${decodeResult.raw.center_of_gravity} %`,\n });\n break;\n case 'lower':\n decodeResult.raw.cg_lower_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_lower_limit',\n code: 'CG_LOWER',\n label: 'Center of Gravity Lower Limit',\n value: `${decodeResult.raw.cg_lower_limit} %`,\n });\n break;\n case 'upper':\n decodeResult.raw.cg_upper_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_upper_limit',\n code: 'CG_UPPER',\n label: 'Center of Gravity Upper Limit',\n value: `${decodeResult.raw.cg_upper_limit} %`,\n });\n break;\n }\n }\n\n static version(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.version = value;\n decodeResult.formatted.items.push({\n type: 'version',\n code: 'VERSION',\n label: 'Message Version',\n value: `v${decodeResult.raw.version.toFixed(1)}`,\n });\n }\n\n static label(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.label = value;\n decodeResult.formatted.items.push({\n type: 'label',\n code: 'LABEL',\n label: 'Message Label',\n value: `${decodeResult.raw.label}`,\n });\n }\n\n static sublabel(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.sublabel = value;\n decodeResult.formatted.items.push({\n type: 'sublabel',\n code: 'SUBLABEL',\n label: 'Message Sublabel',\n value: `${decodeResult.raw.sublabel}`,\n });\n }\n\n static requestedAltitudes(decodeResult: DecodeResult, values: number[]) {\n decodeResult.raw.requested_alts = values;\n decodeResult.formatted.items.push({\n type: 'requested_altitudes',\n code: 'REQ_ALTS',\n label: 'Requested Altitudes',\n value: `${decodeResult.raw.requested_alts.join(', ')}`,\n });\n }\n\n static desiredAltitude(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.desired_alt = value;\n decodeResult.formatted.items.push({\n type: 'desired_altitude',\n code: 'DES_ALT',\n label: 'Desired Altitude',\n value: `${decodeResult.raw.desired_alt}`,\n });\n }\n\n static startPoint(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.start_point = value;\n decodeResult.formatted.items.push({\n type: 'start_point',\n code: 'START',\n label: 'Start Point',\n value: `${decodeResult.raw.start_point}`,\n });\n }\n\n static routeNumber(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.route_number = value;\n decodeResult.formatted.items.push({\n type: 'route_number',\n code: 'RTE_NUM',\n label: 'Route Number',\n value: `${decodeResult.raw.route_number}`,\n });\n }\n\n static flightPlan(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.flight_plan = value;\n decodeResult.formatted.items.push({\n type: 'flight_plan',\n code: 'FPN',\n label: 'Flight Plan',\n value: `${decodeResult.raw.flight_plan}`,\n });\n }\n\n static groundAddress(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.ground_address = value;\n decodeResult.formatted.items.push({\n type: 'ground_address',\n code: 'GND_ADDR',\n label: 'Ground Address',\n value: `${decodeResult.raw.ground_address}`,\n });\n }\n\n static timestamp(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.message_timestamp = value;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'TIMESTAMP',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(value),\n });\n }\n\n static sequenceNumber(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.sequence_number = value;\n decodeResult.formatted.items.push({\n type: 'sequence',\n code: 'SEQ',\n label: 'Sequence Number',\n value: decodeResult.raw.sequence_number,\n });\n }\n\n static sequenceResponse(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.sequence_response = value;\n decodeResult.formatted.items.push({\n type: 'sequence',\n code: 'SEQ_RESP',\n label: 'Sequence Response',\n value: decodeResult.raw.sequence_response,\n });\n }\n\n static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') {\n if (!decodeResult.remaining.text) decodeResult.remaining.text = value;\n else decodeResult.remaining.text += sep + value;\n }\n\n static unknownArr(\n decodeResult: DecodeResult,\n value: string[],\n sep: string = ',',\n ) {\n this.unknown(decodeResult, value.join(sep), sep);\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n Qualifiers,\n} from './DecoderPluginInterface';\nimport { ResultFormatter } from './utils/result_formatter';\nimport { MessageDecoder } from './MessageDecoder';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: MessageDecoder;\n\n name: string = 'unknown';\n\n defaultResult(): DecodeResult {\n return {\n decoded: false,\n decoder: {\n name: 'unknown',\n type: 'pattern-match',\n decodeLevel: 'none',\n },\n formatted: {\n description: 'Unknown',\n items: [],\n },\n raw: {},\n remaining: {},\n };\n }\n\n /**\n * Creates a DecodeResult pre-populated with the plugin name, description, and message.\n * Replaces the common boilerplate at the start of every decode() method.\n */\n protected initResult(message: Message, description: string): DecodeResult {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.formatted.description = description;\n result.message = message;\n return result;\n }\n\n /**\n * Sets the decoded flag and decodeLevel on a result.\n * If decoded is true and no explicit level is given, infers 'full' or 'partial'\n * based on whether remaining.text is set.\n */\n protected setDecodeLevel(\n result: DecodeResult,\n decoded: boolean,\n level?: 'full' | 'partial',\n ): void {\n result.decoded = decoded;\n if (decoded) {\n result.decoder.decodeLevel =\n level ?? (result.remaining.text ? 'partial' : 'full');\n } else {\n result.decoder.decodeLevel = 'none';\n }\n }\n\n /**\n * Logs a debug message prefixed with the plugin name, only if options.debug is true.\n */\n protected debug(options: Options, ...args: unknown[]): void {\n if (options.debug) {\n console.log(`[${this.name}]`, ...args);\n }\n }\n\n /**\n * Marks a result as a failed decode with 'none' level, sets the remaining text\n * as unknown, and logs a debug message. Returns the result for convenient early return.\n */\n protected failUnknown(\n result: DecodeResult,\n text: string,\n options: Options = {},\n ): DecodeResult {\n this.debug(options, `Unknown message: ${text}`);\n ResultFormatter.unknown(result, text);\n result.decoded = false;\n result.decoder.decodeLevel = 'none';\n return result;\n }\n\n options: object;\n\n constructor(decoder: MessageDecoder, options: Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id(): string {\n console.log(\n 'DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!',\n );\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements(): boolean {\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers(): Qualifiers {\n const labels: Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class CBand extends DecoderPlugin {\n name = 'c-band';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n // C-Band puts a 10 char header in front of some message types\n // First 4 chars are some kind of message number\n // Last 6 chars are the flight number\n let cband = message.text.match(\n /^(?<msgno>[A-Z]\\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/,\n );\n if (cband?.groups) {\n const messageText = message.text.substring(10);\n const decoded = this.decoder.decode(\n {\n label: message.label,\n sublabel: message.sublabel,\n text: messageText,\n },\n options,\n );\n if (decoded.decoded) {\n ResultFormatter.flightNumber(\n decodeResult,\n cband.groups.airline + Number(cband.groups.number),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.decoder.name = this.name + '-' + decoded.decoder.name;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.description = decoded.formatted.description;\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n }\n }\n return decodeResult;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\nexport class FlightPlanUtils {\n /**\n * Processes flight plan data\n *\n * Expected format is [header, fpei, val1, ... fpeiN, valN]\n *\n * @see https://atlaske-content.garmin.com/filestorage//email/outbound/attachments/GTN_Flight_Plan_and_User_Waypoint_transfer_Time1712844670119.pdf\n * @param decodeResult - results\n * @param data - original message split by ':'\n * @returns whether all fields were processed or not\n */\n public static processFlightPlan(\n decodeResult: DecodeResult,\n data: string[],\n ): boolean {\n let allKnownFields = FlightPlanUtils.parseHeader(decodeResult, data[0]);\n for (let i = 1; i < data.length; i += 2) {\n const fpei = data[i];\n const value = data[i + 1];\n // TODO: discuss how store commented out bits as both raw and formatted\n switch (fpei) {\n case 'A': // Arrival Procedure (?)\n FlightPlanUtils.addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n FlightPlanUtils.addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n FlightPlanUtils.addProcedure(decodeResult, value, 'departure');\n break;\n case 'DA':\n addDepartureAirport(decodeResult, value);\n break;\n case 'F': // First Waypoint\n addRoute(decodeResult, value);\n break;\n case 'FP':\n ResultFormatter.flightPlan(decodeResult, value.trim());\n break;\n case 'R':\n addRunway(decodeResult, value);\n break;\n // case 'WS': // something about routes, has altitude, so current parsing won't work\n // break;\n default:\n if (allKnownFields) {\n decodeResult.remaining.text = '';\n allKnownFields = false;\n }\n decodeResult.remaining.text += `:${fpei}:${value}`;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return allKnownFields;\n }\n public static parseHeader(\n decodeResult: DecodeResult,\n header: string,\n ): boolean {\n let allKnownFields = true;\n if (header.startsWith('RF')) {\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Filed',\n });\n decodeResult.raw.route_status = 'RF';\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RP')) {\n decodeResult.raw.route_status = 'RP';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Planned',\n });\n decodeResult.raw.route_status = header;\n } else if (header.startsWith('RI')) {\n decodeResult.raw.route_status = 'RI';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Inactive',\n });\n } else if (header.startsWith('RM')) {\n decodeResult.raw.route_status = 'RM';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Mapped',\n });\n } else if (header.startsWith('RS')) {\n decodeResult.raw.route_status = 'RS';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Saved',\n });\n } else {\n decodeResult.remaining.text += header;\n allKnownFields = false;\n }\n return allKnownFields;\n }\n\n public static addProcedure(\n decodeResult: DecodeResult,\n value: string,\n type: string,\n ) {\n if (decodeResult.raw.procedures === undefined) {\n decodeResult.raw.procedures = [];\n }\n const data = value.split('.');\n let waypoints;\n if (data.length > 1) {\n waypoints = data.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n const route = { name: data[0], waypoints: waypoints };\n decodeResult.raw.procedures.push({ type: type, route: route });\n const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);\n decodeResult.formatted.items.push({\n type: 'procedure',\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\n });\n }\n}\n\nfunction addArrivalAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.arrivalAirport(decodeResult, value);\n}\n\nfunction addDepartureAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.departureAirport(decodeResult, value);\n}\n\nfunction addRunway(decodeResult: DecodeResult, value: string) {\n // xxx(yyy) where xxx is the departure runway and yyy is the arrival runway\n if (value.length === 8) {\n ResultFormatter.arrivalRunway(decodeResult, value.substring(4, 7));\n }\n\n ResultFormatter.departureRunway(decodeResult, value.substring(0, 3));\n}\n\nfunction addRoute(decodeResult: DecodeResult, value: string) {\n const route = value.split('.');\n ResultFormatter.route(decodeResult, {\n waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)),\n });\n}\n\nfunction addCompanyRoute(decodeResult: DecodeResult, value: string) {\n const segments = value.split('.');\n const parens_idx = segments[0].indexOf('(');\n let name;\n let runway;\n if (parens_idx === -1) {\n name = segments[0];\n } else {\n name = segments[0].slice(0, parens_idx);\n runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(')'));\n }\n let waypoints;\n if (segments.length > 1) {\n waypoints = segments.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n decodeResult.raw.company_route = {\n name: name,\n runway: runway,\n waypoints: waypoints,\n };\n decodeResult.formatted.items.push({\n type: 'company_route',\n code: 'CR',\n label: 'Company Route',\n value: RouteUtils.routeToString(decodeResult.raw.company_route),\n });\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { FlightPlanUtils } from './flight_plan_utils';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\n/**\n * Helper class for decoding ARINC 702 messages\n * contains core logic for decoding different types of ARINC 702 messages,\n * as well as utility functions for processing common fields\n *\n * Core format:\n * IMI/IEIdata/IEIdata/...checksum\n */\nexport class Arinc702Helper {\n /**\n * Decodes an ARINC 702 message\n *\n * Steps:\n * 1. Check against known checksum algorithms to determine if message is valid\n * 2. Parse the Imbedded Message Identifier (IMI) to determine the type of message\n * 3. Iterate through the Information Elements (IEI) and decode known fields, while storing unknown fields for further analysis\n *\n * @param decodeResult - object to store decoded results in\n * @param message - message to decode\n * @returns boolean indicating if the message was successfully decoded\n */\n public static decodeH1Message(decodeResult: DecodeResult, message: string) {\n decodeResult.remaining.text = '';\n const checksum = parseInt(message.slice(-4), 16);\n const data = message.slice(0, message.length - 4);\n let checksumAlgorithmUsed = '';\n if (crc16IbmSdlcRev(data) === checksum) {\n // ACARS/VDL2/HFDL/Iridium\n checksumAlgorithmUsed = 'IBM-SDLC reversed';\n } else if (crc16Genibus(data) === checksum) {\n // inmarsat\n checksumAlgorithmUsed = 'GENIBUS';\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n const fields = data.split('/');\n const canDecode = parseMessageType(decodeResult, fields[0]);\n if (!canDecode) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n for (let i = 1; i < fields.length; ++i) {\n const iei = fields[i].substring(0, 2);\n const data = fields[i].substring(2);\n switch (iei) {\n case 'AF':\n processAirField(decodeResult, data.split(','));\n break;\n case 'AK':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processAK(decodeResult, data.split(','));\n break;\n case 'CG':\n processCenterOfGravity(decodeResult, data.split(','));\n break;\n case 'DC':\n processDateCode(decodeResult, data.split(','));\n break;\n case 'DI':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processDI(decodeResult, data.split(','));\n break;\n case 'DT': //processDestination?\n processDT(decodeResult, data.split(','));\n break;\n case 'DQ':\n ResultFormatter.desiredAltitude(\n decodeResult,\n parseInt(data, 10) * 100,\n );\n // processDQ(decodeResult, data.split(','));\n break;\n case 'ET':\n processETA(data, decodeResult, fields, i);\n break;\n case 'FB':\n ResultFormatter.currentFuel(decodeResult, parseInt(data, 10));\n break;\n case 'FN':\n decodeResult.raw.flight_number = data;\n break;\n case 'FX':\n ResultFormatter.text(decodeResult, data);\n break;\n case 'GA':\n ResultFormatter.groundAddress(decodeResult, data);\n break;\n case 'ID':\n processIdentification(decodeResult, data.split(','));\n break;\n case 'LR':\n processLandingReport(decodeResult, data.split(','));\n break;\n case 'MR':\n processMessageReference(decodeResult, data.split(','));\n break;\n case 'PR':\n processPerformanceData(decodeResult, data.split(','));\n break;\n //case 'PR':\n // TODO: decode /PR fields\n // ResultFormatter.unknown(decodeResult, fields[i], '/');\n // break;\n case 'PS': // Position\n Arinc702Helper.processPS(decodeResult, data.split(','));\n break;\n case 'RF':\n case 'RI':\n case 'RM':\n case 'RP':\n case 'RS':\n // TODO - use key/data instead of whole message\n FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n break;\n case 'RN':\n ResultFormatter.routeNumber(decodeResult, data);\n break;\n case 'RW':\n processRunway(decodeResult, data.split(':'));\n break;\n case 'SM':\n processSummary(decodeResult, data.split(','));\n break;\n case 'SN':\n decodeResult.raw.serial_number = data;\n break;\n case 'SP':\n ResultFormatter.startPoint(decodeResult, data);\n break;\n case 'TD':\n processTimeOfDeparture(decodeResult, data.split(','));\n break;\n case 'TS':\n Arinc702Helper.processTimeStamp(decodeResult, data.split(','));\n break;\n case 'VR':\n ResultFormatter.version(decodeResult, parseInt(data, 10) / 10);\n break;\n case 'WD':\n processWindData(decodeResult, data);\n break;\n case 'WQ':\n processWeatherQuery(decodeResult, data.split(':'));\n break;\n default:\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n }\n\n ResultFormatter.checksumAlgorithm(decodeResult, checksumAlgorithmUsed);\n ResultFormatter.checksum(decodeResult, checksum);\n\n return true;\n }\n\n public static processPS(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length === 9) {\n // variant 7\n processRoute(decodeResult, data[3], data[1], data[5], data[4], undefined);\n ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);\n ResultFormatter.temperature(decodeResult, data[6]);\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n }\n if (data.length === 14) {\n // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n }\n\n public static processPosition(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length >= 10) {\n // variant 1, short\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n }\n if (data.length >= 14) {\n // variant 2,long\n ResultFormatter.unknownArr(decodeResult, data.slice(10));\n }\n }\n\n public static processTimeStamp(decodeResult: DecodeResult, data: string[]) {\n if (data.length > 2) {\n const positionData = data.slice(1);\n positionData[0] = positionData[0].substring(6); // strip time from position field\n this.processPosition(decodeResult, positionData);\n }\n let time = DateTimeUtils.convertDateTimeToEpoch(\n data[0],\n data[1].substring(0, 6),\n );\n\n if (Number.isNaN(time)) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[1].substring(2, 4) +\n data[1].substring(0, 2) +\n data[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);\n }\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processETA(\n data: string,\n decodeResult: DecodeResult,\n fields: string[],\n i: number,\n) {\n if (data.length === 5) {\n // 1 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(1)),\n );\n } else if (data.length === 6) {\n // 2 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(2)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n}\n\nfunction processAirField(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n ResultFormatter.departureAirport(decodeResult, data[0]);\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), 'AF/');\n }\n}\nfunction processTimeOfDeparture(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n decodeResult.raw.planned_departure_time = data[0]; //DDHHMM - TODO: make int\n decodeResult.formatted.items.push({\n type: 'ptd',\n code: 'ptd',\n label: 'Planned Departure Time',\n value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`,\n });\n\n decodeResult.raw.estimated_departure_time = data[1]; //HHMM - TODO: make int\n decodeResult.formatted.items.push({\n type: 'etd',\n code: 'etd',\n label: 'Estimated Departure Time',\n value: `${data[1].substring(0, 2)}:${data[1].substring(2)}`,\n });\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), '/TD');\n }\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0]);\n if (data.length > 1) {\n ResultFormatter.flightNumber(decodeResult, data[1]);\n }\n if (data.length > 2) {\n //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 9) {\n ResultFormatter.unknown(decodeResult, data[0]);\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[2]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[3], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4]),\n );\n ResultFormatter.unknown(decodeResult, data[5]);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(data[6]),\n );\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n return;\n }\n if (data.length === 4 || data.length === 5) {\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[1]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[2], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[3]),\n );\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n return;\n }\n ResultFormatter.unknownArr(decodeResult, data, ',');\n}\n\nfunction processLandingReport(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 19) {\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.arrivalRunway(decodeResult, data[5]);\n ResultFormatter.unknown(decodeResult, data.slice(6, 19).join(','));\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction processCenterOfGravity(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10);\n }\n } else if (data.length === 3) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center');\n }\n if (data[1] !== undefined && data[1] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower');\n }\n if (data[2] !== undefined && data[2] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper');\n }\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction parseMessageType(\n decodeResult: DecodeResult,\n messagePart: string,\n): boolean {\n const messageParts = messagePart.split(',');\n const messageType = messageParts[0];\n if (messageType.startsWith('POS')) {\n Arinc702Helper.processPosition(\n decodeResult,\n messagePart.substring(3).split(','),\n );\n return processIMI(decodeResult, 'POS');\n } else if (messageType.length === 6) {\n const part1 = processIMI(decodeResult, messageType.substring(0, 3));\n const description = decodeResult.formatted.description;\n const part2 = processIMI(decodeResult, messageType.substring(3, 6));\n decodeResult.formatted.description =\n description + ' for ' + decodeResult.formatted.description;\n if (messageParts.length > 1) {\n // TODO handle REJPWI/REJPOS\n ResultFormatter.unknown(\n decodeResult,\n messageParts.slice(1).join(','),\n '/',\n );\n }\n return part1 && part2;\n }\n\n if (messageParts.length > 1) {\n // TODO handle\n ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(','), '/');\n }\n\n return processIMI(decodeResult, messageType);\n}\n\n/**\n * Processes the Imbedded Message Identifier (IMI)\n * which indicates the type of message and is used to determine what the message type is\n * @param decodeResult\n * @param type\n * @returns\n */\nfunction processIMI(decodeResult: DecodeResult, type: string): boolean {\n if (type === 'FPN') {\n decodeResult.formatted.description = 'Flight Plan';\n } else if (type === 'FTX') {\n decodeResult.formatted.description = 'Free Text';\n } else if (type === 'INI') {\n decodeResult.formatted.description = 'Initial Report';\n } else if (type === 'INR') {\n decodeResult.formatted.description = 'In-Range Report';\n } else if (type === 'LDI') {\n decodeResult.formatted.description = 'Load Distribution Information';\n } else if (type === 'PER') {\n decodeResult.formatted.description = 'Performance Report';\n } else if (type === 'POS') {\n decodeResult.formatted.description = 'Position Report';\n } else if (type === 'PRG') {\n decodeResult.formatted.description = 'Progress Report';\n } else if (type === 'PWI') {\n decodeResult.formatted.description = 'Pilot Weather Information';\n } else if (type === 'WXR') {\n decodeResult.formatted.description = 'Weather Report';\n } else if (type === 'REJ') {\n decodeResult.formatted.description = 'Reject';\n } else if (type === 'REQ') {\n decodeResult.formatted.description = 'Request';\n } else if (type === 'RES') {\n decodeResult.formatted.description = 'Response';\n } else if (type === 'SUM') {\n decodeResult.formatted.description = 'Summary Report';\n } else {\n decodeResult.formatted.description = 'Unknown H1 Message';\n return false;\n }\n return true;\n}\n\nfunction processPerformanceData(decodeResult: DecodeResult, data: string[]) {\n // /PR fields contain performance data\n // Known field positions (12-field short variant and 18-field long variant):\n // [0]: ground speed (knots * 10 or similar)\n // [1]: indicated airspeed or mach-related\n // [2]: altitude in hundreds of feet\n // [3]: fuel-related value\n // [4]: unknown (often empty)\n // [5]: fuel flow or consumption\n // [6]: fuel-related\n // [7]: wind data (DDDSSSS format) or empty\n // [8]: temperature (M=minus, P=plus)\n // [9]: heading or unknown\n\n if (data.length < 3) {\n ResultFormatter.unknownArr(decodeResult, data, ',');\n return;\n }\n\n // Field 2: altitude in hundreds\n if (data[2] !== undefined && data[2] !== '') {\n const alt = Number(data[2]) * 100;\n if (!isNaN(alt) && alt > 0) {\n ResultFormatter.altitude(decodeResult, alt);\n }\n }\n\n // Field 8: temperature (if present)\n if (data.length > 8 && data[8] !== undefined && data[8] !== '') {\n ResultFormatter.temperature(decodeResult, data[8]);\n }\n\n // Collect remaining undecoded fields\n const remaining: string[] = [];\n for (let i = 0; i < data.length; i++) {\n if (\n i === 2 &&\n data[i] !== '' &&\n !isNaN(Number(data[i])) &&\n Number(data[i]) * 100 > 0\n ) {\n continue; // altitude - already decoded\n }\n if (\n i === 8 &&\n data[i] !== '' &&\n (data[i].startsWith('M') ||\n data[i].startsWith('P') ||\n !isNaN(Number(data[i])))\n ) {\n continue; // temperature - already decoded\n }\n remaining.push(data[i]);\n }\n if (remaining.length > 0 && remaining.some((r) => r !== '')) {\n ResultFormatter.unknown(decodeResult, remaining.join(','), '/PR');\n }\n}\n\nfunction processDateCode(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n // noop?\n } else if (data.length === 2) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[0].substring(2, 4) +\n data[0].substring(0, 2) +\n data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processWeatherQuery(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(':'), 'WQ/');\n return;\n }\n\n const alts = data[0].split('.');\n const route = data[1].split('.');\n\n ResultFormatter.requestedAltitudes(\n decodeResult,\n alts.map((a) => parseInt(a, 10) * 100),\n );\n\n const waypoints = route.map((wp) => {\n return { name: wp };\n });\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processRoute(\n decodeResult: DecodeResult,\n last: string,\n time: string,\n next: string,\n eta: string,\n then?: string,\n date?: string,\n) {\n const lastTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(time, date)\n : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(eta, date)\n : DateTimeUtils.convertHHMMSSToTod(eta);\n\n const lastWaypoint = RouteUtils.getWaypoint(last);\n lastWaypoint.time = lastTime;\n\n const nextWaypoint = RouteUtils.getWaypoint(next);\n nextWaypoint.time = nextTime;\n\n const thenWaypoint = RouteUtils.getWaypoint(then || '?');\n\n const waypoints: Waypoint[] = [lastWaypoint, nextWaypoint, thenWaypoint];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processWindData(decodeResult: DecodeResult, message: string) {\n const wind = [] as Wind[];\n\n const flightLevel = Number(message.slice(0, 3));\n const fields = message.slice(4).split('.'); // strip off altitude and comma\n fields.forEach((field) => {\n if (field.length < 4) {\n // probably need a more robust check to determine to skip\n return;\n }\n const data = field.split(',');\n const waypoint = { name: data[0] };\n const windData = data[1];\n const windDirection = parseInt(windData.slice(0, 3), 10);\n const windSpeed = parseInt(windData.slice(3), 10);\n\n if (data.length === 3) {\n const tempData = data[2];\n const tempFlightLevel = Number(tempData.slice(0, 3));\n const tempString = tempData.slice(3);\n const tempDegrees =\n Number(tempString.substring(1)) *\n (tempString.charAt(0) === 'M' ? -1 : 1);\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: tempFlightLevel,\n degreesC: tempDegrees,\n },\n });\n } else {\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n });\n }\n });\n\n ResultFormatter.windData(decodeResult, wind);\n}\n\nfunction processRunway(decodeResult: DecodeResult, data: string[]) {\n //FIXME - figure out names\n const parts = data[0].split('.');\n const more = parts[0].split(',');\n\n ResultFormatter.departureRunway(decodeResult, more[0]);\n ResultFormatter.unknownArr(decodeResult, more.slice(1), ',');\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), '.');\n ResultFormatter.departureAirport(decodeResult, data[1].split(',')[0]);\n ResultFormatter.unknownArr(decodeResult, data[1].split(',').slice(1), ',');\n //ResultFormatter.unknownArr(decodeResult, data.slice(2), ':');\n}\nfunction processSummary(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 11) {\n return ResultFormatter.unknown(decodeResult, data.join(','), 'SM/');\n }\n\n ResultFormatter.engineStart(\n decodeResult,\n DateTimeUtils.convertDayTimeToTod(data[0]),\n );\n ResultFormatter.startFuel(decodeResult, 100 * parseInt(data[1], 10));\n ResultFormatter.engineStop(\n decodeResult,\n DateTimeUtils.convertDayTimeToTod(data[2]),\n );\n ResultFormatter.out(decodeResult, DateTimeUtils.convertDayTimeToTod(data[3]));\n ResultFormatter.outFuel(decodeResult, 100 * parseInt(data[4], 10));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertDayTimeToTod(data[5]));\n ResultFormatter.offFuel(decodeResult, 100 * parseInt(data[6], 10));\n ResultFormatter.on(decodeResult, DateTimeUtils.convertDayTimeToTod(data[7]));\n ResultFormatter.onFuel(decodeResult, 100 * parseInt(data[8], 10));\n ResultFormatter.in(decodeResult, DateTimeUtils.convertDayTimeToTod(data[9]));\n ResultFormatter.inFuel(decodeResult, 100 * parseInt(data[10], 10));\n}\n\n// CRC-16/IBM-SDLC but nibbles are reversed\nfunction crc16IbmSdlcRev(data: string): number {\n let crc = 0xffff;\n const bytes = Buffer.from(data, 'ascii');\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x0001) !== 0) {\n crc = (crc >>> 1) ^ 0x8408;\n } else {\n crc = crc >>> 1;\n }\n }\n }\n crc = (crc ^ 0xffff) & 0xffff;\n\n const nibble1 = (crc >> 12) & 0xf;\n const nibble2 = (crc >> 8) & 0xf;\n const nibble3 = (crc >> 4) & 0xf;\n const nibble4 = crc & 0xf;\n\n return (nibble4 << 12) | (nibble3 << 8) | (nibble2 << 4) | nibble1;\n}\n\n/**\n * Calculates the CRC-16/GENIBUS checksum for a given Uint8Array.\n * @param data The input data as a byte array.\n * @returns The 16-bit checksum as a number.\n */\nfunction crc16Genibus(data: string): number {\n let crc = 0xffff;\n const polynomial = 0x1021;\n\n const bytes = Buffer.from(data, 'ascii');\n\n for (const byte of bytes) {\n crc ^= byte << 8;\n\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x8000) !== 0) {\n crc = ((crc << 1) ^ polynomial) & 0xffff;\n } else {\n crc = (crc << 1) & 0xffff;\n }\n }\n }\n\n return (crc ^ 0xffff) & 0xffff;\n}\nfunction processMessageReference(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(','), '/MR');\n return;\n }\n\n ResultFormatter.sequenceNumber(decodeResult, parseInt(data[0], 10));\n if (data[1] !== '') {\n ResultFormatter.sequenceResponse(decodeResult, parseInt(data[1], 10));\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Arinc702Helper } from '../utils/arinc_702_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// TODO: come up with a better name as this decodes multiple labels\nexport class Arinc702 extends DecoderPlugin {\n name = 'arinc-702';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n\n // try to decode the entire message\n let decoded = false;\n decoded = Arinc702Helper.decodeH1Message(decodeResult, msg);\n if (decoded) {\n return this.processDecodeResult(decodeResult, decoded, options, message);\n }\n\n // try to handle messages like `/HDQDLUA.POS<rest of message>`\n if (msg.startsWith('/')) {\n const headerData = msg.split('.');\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n headerData.slice(1).join('.'),\n );\n\n if (decoded) {\n decodeResult.remaining.text =\n headerData[0] + '.' + decodeResult.remaining.text;\n return this.processDecodeResult(\n decodeResult,\n decoded,\n options,\n message,\n );\n }\n }\n\n // try to handle messages like `F37AMCLL93#M1BPOS<rest of message>`\n const hashParts = msg.split('#');\n if (hashParts.length == 2) {\n // need a better way to figure this out\n const offset =\n hashParts[0] === '- ' || isNaN(parseInt(hashParts[1][1])) ? 3 : 4;\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n msg.slice(hashParts[0].length + offset),\n );\n if (decoded && hashParts[0].length > 0) {\n // ResultFormatter.unknown(decodeResult, hashParts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, hashParts[0].substring(4));\n //ResultFormatter.unknown(decodeResult, hashParts[1].length == 5 ? hashParts[1].substring(0, 2) : hashParts[1].substring(0, 3), '#');\n // hack of the highest degree as we've parsed the rest of the message already but we want the remaining text to be in order\n decodeResult.remaining.text =\n hashParts[0].substring(0, 4) +\n '#' +\n hashParts[1].substring(0, offset - 1) +\n '/' +\n decodeResult.remaining.text;\n }\n if (decoded) {\n return this.processDecodeResult(\n decodeResult,\n decoded,\n options,\n message,\n );\n }\n }\n\n // try to handle messages like `M74AMC4086FTX<rest of message>`\n const slashParts = msg.split('/');\n if (slashParts[0].length > 3) {\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n msg.slice(slashParts[0].length - 3),\n );\n // flight number is already decoded in other fields\n decodeResult.remaining.text =\n slashParts[0].slice(0, 3) + '/' + decodeResult.remaining.text;\n }\n\n return this.processDecodeResult(decodeResult, decoded, options, message);\n }\n\n private processDecodeResult(\n decodeResult: DecodeResult,\n decoded: boolean,\n options: Options,\n message: Message,\n ) {\n decodeResult.decoded = decoded;\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z_Slash extends DecoderPlugin {\n name = 'label-5z-slash';\n\n descriptions: Record<string, string> = {\n B1: 'Request Weight and Balance',\n B3: 'Request Departure Clearance',\n CD: 'Weight and Balance',\n CG: 'Request Pre-departure clearance, PDC',\n CM: 'Crew Scheduling',\n C3: 'Off Message',\n C4: 'Flight Dispatch',\n C5: 'Maintenance Message',\n C6: 'Customer Service',\n 10: 'PIREP',\n C11: 'International PIREP',\n DS: 'Late Message',\n D3: 'Holding Pattern Message',\n D6: 'From-To + Date',\n D7: 'From-To + Alternate + Time',\n EO: 'In Range',\n ET: 'Expected Time',\n PW: 'Position Weather',\n RL: 'Request Release',\n R3: 'Request HOWGOZIT Message',\n R4: 'Request the Latest POSBD',\n TC: 'From-To Fuel',\n WB: 'From-To',\n W1: 'Request Weather for City',\n };\n\n qualifiers() {\n return {\n labels: ['5Z'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const lines = message.text.split('\\r\\n');\n if (lines[0] === '/TXT') {\n // not UA, but starts with `/`\n ResultFormatter.text(decodeResult, lines.slice(1).join('\\r\\n'));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n const data = lines[0].split('/');\n const header = data[1].split(' '); //data[0] is blank\n const type = header[0];\n const typeDescription = this.descriptions[type];\n\n if (typeDescription) {\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: 'airline',\n code: 'AIRLINE',\n label: 'Airline',\n value: 'United Airlines',\n });\n decodeResult.raw.message_type = type;\n decodeResult.formatted.items.push({\n type: 'message_type',\n code: 'MSG_TYPE',\n label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3' && data[1] === 'B3 TO DATA REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));\n ResultFormatter.unknownArr(decodeResult, data.slice(3), '/');\n } else if (type === 'B3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n decodeResult.raw.day = Number(header[2]);\n ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));\n if (header.length > 4) {\n ResultFormatter.unknownArr(decodeResult, header.slice(4), '/');\n }\n } else if (type === 'C3' && data[1] === 'C3 GATE REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.unknownArr(decodeResult, info.slice(5), ' ');\n } else if (type === 'C3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n } else if (type === 'ET') {\n const airports = data[2].split(' ');\n // aiports[0] is blank\n ResultFormatter.departureAirport(decodeResult, airports[1]);\n ResultFormatter.arrivalAirport(decodeResult, airports[2]);\n decodeResult.raw.day = Number(airports[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(airports[4]),\n );\n\n const estimates = data[3].split(' ');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(estimates[1]),\n );\n ResultFormatter.unknown(decodeResult, estimates[2]);\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${message.text}`);\n }\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_LDR extends DecoderPlugin {\n name = 'label-10-ldr';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['LDR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[5];\n const lon = parts[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim()),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim()),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.departureAirport(decodeResult, parts[9]);\n ResultFormatter.arrivalAirport(decodeResult, parts[10]);\n ResultFormatter.alternateAirport(decodeResult, parts[11]);\n ResultFormatter.arrivalRunway(decodeResult, parts[12].split('/')[0]); // TODO: find out if anything comes after `/` sometimes\n const altRwy = [parts[13].split('/')[0], parts[14].split('/')[0]]\n .filter((r) => r != '')\n .join(',');\n if (altRwy != '') {\n ResultFormatter.alternateRunway(decodeResult, altRwy); // TODO: find out if anything comes after `/` sometimes\n }\n ResultFormatter.unknownArr(decodeResult, [\n ...parts.slice(0, 5),\n ...parts.slice(15),\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_POS extends DecoderPlugin {\n name = 'label-10-pos';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const parts = message.text.split(',');\n if (parts.length !== 12) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n //const time = parts[0].substring(3); //DDHHMM\n const lat = parts[1].trim();\n const lon = parts[2].trim();\n const position = {\n latitude:\n ((lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())) / 100,\n longitude:\n ((lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim())) / 100,\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.unknownArr(decodeResult, [\n parts[0],\n ...parts.slice(3, 7),\n ...parts.slice(8),\n ]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_Slash extends DecoderPlugin {\n name = 'label-10-slash';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[1];\n const lon = parts[2];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.heading(decodeResult, Number(parts[5]));\n ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[8]),\n );\n const waypoints: Waypoint[] = [\n {\n name: parts[11],\n },\n {\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]),\n },\n {\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]),\n },\n ];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n\n if (parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n ResultFormatter.unknownArr(\n decodeResult,\n [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],\n '/',\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 12 N : results');\n console.log(results);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n });\n\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n results.groups.unkwn3,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_12_POS extends DecoderPlugin {\n name = 'label-12-pos';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const data = message.text.substring(3).split(',');\n if (!message.text.startsWith('POS') || data.length !== 12) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const lat = data[0].substring(0, 8);\n const lon = data[0].substring(8);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lat.substring(1, 4)),\n Number(lat.substring(4, 6)),\n Number(lat.substring(6, 8)),\n ),\n longitude:\n CoordinateUtils.getDirection(lon[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lon.substring(1, 4)),\n Number(lon.substring(4, 6)),\n Number(lon.substring(6, 8)),\n ),\n });\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));\n ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));\n ResultFormatter.currentFuel(\n decodeResult,\n Number(data[7].substring(3).trim()),\n ); // strip FOB\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()),\n ); // strip ETA\n ResultFormatter.departureAirport(decodeResult, data[9]);\n ResultFormatter.arrivalAirport(decodeResult, data[10]);\n ResultFormatter.unknown(decodeResult, data[11]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_13Through18_Slash extends DecoderPlugin {\n name = 'label-13-18-slash';\n\n qualifiers() {\n return {\n labels: ['13', '14', '15', '16', '17', '18'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n const parts = lines[0].split('/');\n const labelNumber = Number(parts[1].substring(0, 2));\n decodeResult.formatted.description = getMsgType(labelNumber);\n\n // labels 13-17 have 4 parts, label 18 has 7 parts\n if (\n (labelNumber !== 18 && parts.length !== 4) ||\n (labelNumber === 18 && parts.length !== 7)\n ) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // parts[0] === ''\n const data = parts[2].split(' ');\n ResultFormatter.departureAirport(decodeResult, data[1]);\n ResultFormatter.arrivalAirport(decodeResult, data[2]);\n decodeResult.raw.day = Number(data[3]);\n const time = DateTimeUtils.convertHHMMSSToTod(data[4]);\n if (labelNumber === 13) {\n ResultFormatter.out(decodeResult, time);\n } else if (labelNumber === 14) {\n ResultFormatter.off(decodeResult, time);\n } else if (labelNumber === 15) {\n ResultFormatter.on(decodeResult, time);\n } else if (labelNumber === 16) {\n ResultFormatter.in(decodeResult, time);\n }\n\n if (parts.length === 7) {\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), '/');\n }\n\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].startsWith('/LOC')) {\n const location = lines[i].substring(5).split(','); // strip off '/LOC'\n let position;\n if (location[0].startsWith('+') || location[0].startsWith('-')) {\n position = {\n latitude: Number(location[0]),\n longitude: Number(location[1]),\n };\n } else {\n position = {\n latitude:\n CoordinateUtils.getDirection(location[0][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[0].substring(1, 3)),\n Number(location[0].substring(3, 5)),\n Number(location[0].substring(5, 7)),\n ),\n longitude:\n CoordinateUtils.getDirection(location[1][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[1].substring(1, 4)),\n Number(location[1].substring(4, 6)),\n Number(location[1].substring(6, 8)),\n ),\n };\n }\n ResultFormatter.position(decodeResult, position);\n } else {\n ResultFormatter.unknown(decodeResult, lines[i], '\\r\\n');\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n return decodeResult;\n }\n}\n\nfunction getMsgType(labelNumber: number): string {\n if (labelNumber === 13) {\n return 'Out of Gate Report';\n }\n if (labelNumber === 14) {\n return 'Takeoff Report';\n }\n if (labelNumber === 15) {\n return 'On Ground Report';\n }\n if (labelNumber === 16) {\n return 'In Gate Report';\n }\n if (labelNumber === 17) {\n return 'Post Report';\n }\n if (labelNumber === 18) {\n return 'Post Times Report';\n }\n\n return 'Unknown';\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-15';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n if (message.text.startsWith('(2') && message.text.endsWith('(Z')) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(0, 13),\n ),\n );\n if (between.length === 25) {\n // short variant\n ResultFormatter.unknown(decodeResult, between.substring(13, 19));\n const alt = between.substring(19, 22);\n if (alt != '---') {\n ResultFormatter.altitude(decodeResult, 100 * Number(alt));\n }\n ResultFormatter.temperature(\n decodeResult,\n between.substring(22).replaceAll(' ', '0'),\n );\n } else if (between.substring(13, 16) === 'OFF') {\n // off variant\n const ddmmyy = between.substring(16, 22);\n const hhmm = between.substring(22, 26);\n if (ddmmyy != '------') {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(hhmm + '00', ddmmyy),\n );\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmm),\n );\n }\n ResultFormatter.unknown(decodeResult, between.substring(26));\n } else {\n ResultFormatter.unknown(decodeResult, between.substring(26));\n }\n } else {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const parts = message.text.split(' ');\n // FST01KMCOEGKKN505552W00118021\n const header = parts[0];\n\n const stringCoords = header.substring(13);\n // Don't use decodeStringCoordinates here, because of different pos format\n\n const firstChar = stringCoords.substring(0, 1);\n const middleChar = stringCoords.substring(7, 8);\n decodeResult.raw.position = {};\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n const lat =\n (Number(stringCoords.substring(1, 7)) / 10000) *\n (firstChar === 'S' ? -1 : 1);\n const lon =\n (Number(stringCoords.substring(8, 15)) / 10000) *\n (middleChar === 'W' ? -1 : 1);\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n ResultFormatter.altitude(\n decodeResult,\n Number(stringCoords.substring(15)) * 100,\n );\n } else {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), ' ');\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Honeywell Label 16 Position Report\nexport class Label_16_Honeywell extends DecoderPlugin {\n name = 'label-16-honeywell';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (\n message.text.startsWith('(2') &&\n message.text.endsWith('(Z') &&\n message.text.length >= 29\n ) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.unknown(decodeResult, between.substring(0, 4), ''); // Session ID\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(4, 17),\n ),\n );\n if (between.charAt(17) === '-') {\n // Waypoint mode\n const waypoint1 = between.substring(18, 23).trim();\n const waypoint2 = between.substring(23, 28).trim();\n if (waypoint2) {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }, { name: waypoint2 }],\n });\n } else {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }],\n });\n }\n } else {\n // Route mode\n ResultFormatter.departureAirport(\n decodeResult,\n between.substring(17, 21),\n );\n ResultFormatter.arrivalAirport(decodeResult, between.substring(21, 25));\n //ignore the rest (should just be '-')\n }\n /*\n const phases: { [key: string]: string } = {\n '/O': 'En Route',\n '/A': 'Arrival',\n '/D': 'Departure',\n '/P': 'Preflight',\n '/C': 'Climb',\n };\n */\n ResultFormatter.unknown(\n decodeResult,\n between.substring(between.length - 2),\n '',\n );\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 Honeywell message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: N 44.203,W 86.546,31965,6, 290\n let variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*)$/;\n\n // Style: N 28.177/W 96.055\n let variant2Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n\n ResultFormatter.position(decodeResult, pos);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n\n results = message.text.match(variant2Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n\n ResultFormatter.position(decodeResult, pos);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_POSA1 extends DecoderPlugin {\n name = 'label-16-posa1';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['POSA1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const fields = message.text.split(',');\n if (fields.length !== 11 || !fields[0].startsWith('POSA1')) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(5)),\n ); // strip 'POSA1'\n const waypoint = fields[1].trim();\n const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);\n const nextWaypoint = fields[4].trim();\n const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(6), ',');\n ResultFormatter.route(decodeResult, {\n waypoints: [\n { name: waypoint, time: time },\n { name: nextWaypoint, time: nextTime },\n ],\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_TOD extends DecoderPlugin {\n name = 'label-16-tod';\n\n qualifiers() {\n return {\n labels: ['16'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n const time = DateTimeUtils.convertHHMMSSToTod(fields[0]);\n if (fields.length !== 5 || Number.isNaN(time)) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.timestamp(decodeResult, time);\n if (fields[1] !== '') {\n ResultFormatter.altitude(decodeResult, Number(fields[1]));\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n const temp = fields[4].split('/');\n const posFields = temp[0].split(' ');\n if (posFields.length === 4) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(posFields[0]) * Number(posFields[1]),\n longitude:\n CoordinateUtils.getDirection(posFields[2]) * Number(posFields[3]),\n });\n } else if (posFields.length === 2) {\n ResultFormatter.position(decodeResult, {\n latitude:\n (CoordinateUtils.getDirection(posFields[0][0]) *\n Number(posFields[0].slice(1))) /\n 100,\n longitude:\n (CoordinateUtils.getDirection(posFields[1][0]) *\n Number(posFields[1].slice(1))) /\n 100,\n });\n } else {\n // Redacted\n //ResultFormatter.unknown(decodeResult, fields[4]);\n }\n\n if (temp.length > 1) {\n ResultFormatter.flightNumber(decodeResult, temp[1]);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() {\n return {\n labels: ['1M'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 1M ETA: results');\n console.log(results);\n }\n\n decodeResult.raw.flight_number = results[0];\n // results[1]: ETA01 (???)\n // results[2]: 230822 - UTC date of eta\n ResultFormatter.departureAirport(decodeResult, results[3]);\n ResultFormatter.arrivalAirport(decodeResult, results[4]);\n ResultFormatter.alternateAirport(decodeResult, results[5]);\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n ResultFormatter.arrivalRunway(\n decodeResult,\n results[8].replace(results[4], ''),\n ); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n const yymmdd = results[2];\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(\n results[7] + '00',\n yymmdd.substring(4, 6) +\n yymmdd.substring(2, 4) +\n yymmdd.substring(0, 2),\n ),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_3Line extends DecoderPlugin {\n name = 'label-1l-3-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n if (lines.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n const parts = message.text.replaceAll('\\r\\n', '/').split('/');\n const data = new Map<string, string>();\n data.set('', parts[0]);\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const dep = data.get('DEP');\n if (dep) {\n ResultFormatter.departureAirport(decodeResult, dep);\n data.delete('DEP');\n }\n const des = data.get('DES');\n if (des) {\n ResultFormatter.arrivalAirport(decodeResult, des);\n data.delete('DES');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fn = data.get('FN');\n if (fn) {\n ResultFormatter.flightNumber(decodeResult, fn);\n data.delete('FN');\n }\n const day = data.get('DAY');\n const utc = data.get('UTC');\n if (day && utc) {\n decodeResult.raw.message_timestamp =\n Date.parse(day + ' GMT+0000') / 1000 +\n DateTimeUtils.convertHHMMSSToTod(utc);\n data.delete('DAY');\n data.delete('UTC');\n }\n\n const lat = data.get('LAT');\n const lon = data.get('LON');\n if (lat && lon) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n data.delete('LAT');\n data.delete('LON');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n if (key === '') {\n remaining += value;\n } else {\n remaining += `/${key} ${value}`;\n }\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_070 extends DecoderPlugin {\n name = 'label-1l-070';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000070'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000070')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, parts[0]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(parts[4][0]) *\n Number(parts[4].substring(1)),\n longitude:\n CoordinateUtils.getDirection(parts[5][0]) *\n Number(parts[5].substring(1)),\n });\n\n decodeResult.remaining.text = parts[6];\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_660 extends DecoderPlugin {\n name = 'label-1l-660';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000660'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000660')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 5) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n parts[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n const hhmmss = parts[1].substring(0, 6);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmmss),\n );\n const fl = parts[1].substring(6, 9);\n ResultFormatter.altitude(decodeResult, Number(fl) * 100);\n const next = parts[1].substring(9);\n ResultFormatter.route(decodeResult, { waypoints: [{ name: next.trim() }] });\n\n decodeResult.remaining.text = parts.slice(2).join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_Slash extends DecoderPlugin {\n name = 'label-1l-1-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['+', '-'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const data = new Map<string, string>();\n data.set('LAT', parts[0].replaceAll(' ', ''));\n data.set('LON', parts[1].replaceAll(' ', ''));\n for (let i = 2; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const position = {\n latitude: Number(data.get('LAT')),\n longitude: Number(data.get('LON')),\n };\n data.delete('LAT');\n data.delete('LON');\n\n ResultFormatter.position(decodeResult, position);\n const utc = data.get('UTC');\n if (utc) {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(utc),\n );\n data.delete('UTC');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fob = data.get('FOB');\n if (fob) {\n ResultFormatter.currentFuel(decodeResult, Number(fob));\n data.delete('FOB');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n remaining += `/${key} ${value}`;\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() {\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 11) {\n this.debug(options, 'Variation 1 detected');\n const rawCoords = fields[0];\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(rawCoords),\n );\n\n this.setDecodeLevel(decodeResult, true, 'full');\n } else if (fields.length == 5) {\n this.debug(options, 'Variation 2 detected');\n const position = CoordinateUtils.decodeStringCoordinates(fields[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n this.setDecodeLevel(decodeResult, true, 'full');\n } else {\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() {\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 9) {\n // POSN 37.550W 76.436, 98,110800,23961,25820, 65,-23,114212,KRDU\n processPosition(decodeResult, fields[0].trim());\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[7]),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[8]);\n\n ResultFormatter.unknownArr(decodeResult, [\n fields[1],\n fields[4],\n fields[5],\n ]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown!\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string) {\n // N 39.841W 75.790\n if (\n value.length !== 16 &&\n value[0] !== 'N' &&\n value[0] !== 'S' &&\n value[8] !== 'W' &&\n value[8] !== 'E'\n ) {\n return;\n }\n const latDir = value[0] === 'N' ? 1 : -1;\n const lonDir = value[8] === 'E' ? 1 : -1;\n const position = {\n latitude: latDir * Number(value.substring(1, 7)),\n longitude: lonDir * Number(value.substring(9, 15)),\n };\n\n ResultFormatter.position(decodeResult, position);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_OFF extends DecoderPlugin {\n name = 'label-22-off';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['OFF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Takeoff Report');\n\n if (message.text.startsWith('OFF01')) {\n // variant 1\n const fields = message.text.substring(5).split('/');\n\n if (fields.length != 2) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n ResultFormatter.departureDay(\n decodeResult,\n Number(fields[1].substring(0, 2)),\n ); // departure day\n ResultFormatter.arrivalDay(\n decodeResult,\n Number(fields[1].substring(2, 4)),\n ); // arrival day\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(8, 12),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(22));\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else if (message.text.startsWith('OFF02\\r\\n')) {\n // varaint 3\n const fields = message.text.substring(7).split(',');\n if (fields.length != 4) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else if (message.text.startsWith('OFF02')) {\n // varaint 2\n const fields = message.text.substring(5).split('/');\n if (fields.length != 2) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n fields[1].substring(0, 14),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(20, 24),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)),\n );\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n this.debug(options, 'Unknown variation.');\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_POS extends DecoderPlugin {\n name = 'label-22-pos';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['N', 'S'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const fields = message.text.split(',');\n\n if (fields.length !== 11) {\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${fields.join(',')}`,\n );\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n const latStr = fields[0].substring(1, 8);\n const lonStr = fields[0].substring(9);\n const lat = Number(latStr) / 10000;\n const lon = Number(lonStr) / 10000;\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,\n longitude: CoordinateUtils.getDirection(fields[0][8]) * lon,\n });\n\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM3 extends DecoderPlugin {\n name = 'label-2p-fm3';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 7) {\n const header = parts[0].split('FM3 ');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n\n if (header[1].length === 4) {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n } else {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[1]),\n );\n const lat = parts[2].replaceAll(' ', '');\n const lon = parts[3].replaceAll(' ', '');\n if (lat[0] === 'N' || lat[0] === 'S') {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n } else {\n ResultFormatter.position(decodeResult, {\n latitude: Number(lat),\n longitude: Number(lon),\n });\n }\n ResultFormatter.altitude(decodeResult, Number(parts[4]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[5]);\n ResultFormatter.unknown(decodeResult, parts[6]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM4 extends DecoderPlugin {\n name = 'label-2p-fm4';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 10) {\n const header = parts[0].split('FM4');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n ResultFormatter.heading(decodeResult, Number(parts[7]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM5 extends DecoderPlugin {\n name = 'label-2p-fm5';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 12) {\n const header = parts[0].split('FM5 ');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[7]);\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n ResultFormatter.flightNumber(decodeResult, parts[10].trim());\n ResultFormatter.unknown(decodeResult, parts[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_24_Slash extends DecoderPlugin {\n name = 'label-24-slash';\n\n qualifiers() {\n return {\n labels: ['24'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n\n if (fields.length == 10 && fields[0] == '' && fields[9] == '') {\n // begin and ends with `/`\n const ddmmyy =\n fields[1].substring(2, 4) +\n fields[1].substring(4, 6) +\n fields[1].substring(0, 2); // YYDDMM\n const hhmmss = fields[2] + '00';\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n hhmmss,\n ddmmyy,\n );\n ResultFormatter.flightNumber(decodeResult, fields[3]);\n ResultFormatter.altitude(decodeResult, Number(fields[4]));\n const lat = fields[5];\n const lon = fields[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[8]),\n );\n ResultFormatter.unknown(decodeResult, fields[7]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() {\n return {\n labels: ['30'],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /EA1830/DSKSFO/SK24\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 30 EA: results');\n console.log(results);\n }\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)),\n );\n\n if (results[1].substring(0, 2) === 'DS') {\n ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));\n ResultFormatter.unknown(decodeResult, '/'.concat(results[2]));\n } else {\n ResultFormatter.unknown(\n decodeResult,\n '/'.concat(results[1], '/', results[2]),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA Report — has a different field layout from the other Label 44 events\n// (altitude between coords and airports), so it uses DecoderPlugin directly\n// rather than Label_44_Base.\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const result = this.initResult(message, 'ETA Report');\n\n const data = message.text.split(',');\n if (data.length < 9) {\n return this.failUnknown(result, message.text, options);\n }\n\n this.debug(options, 'ETA Report: fields', data);\n\n ResultFormatter.position(\n result,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.altitude(result, 100 * Number(data[2]));\n ResultFormatter.departureAirport(result, data[3]);\n ResultFormatter.arrivalAirport(result, data[4]);\n ResultFormatter.month(result, Number(data[5].substring(0, 2)));\n ResultFormatter.day(result, Number(data[5].substring(2, 4)));\n ResultFormatter.timestamp(\n result,\n DateTimeUtils.convertHHMMSSToTod(data[6]),\n );\n ResultFormatter.eta(result, DateTimeUtils.convertHHMMSSToTod(data[7]));\n\n const fuel = Number(data[8]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(result, fuel);\n }\n\n if (data.length > 9) {\n ResultFormatter.unknownArr(result, data.slice(9));\n }\n\n this.setDecodeLevel(result, true, 'full');\n return result;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n/**\n * Base class for Label 44 event-style decoders (ON, OFF, IN).\n *\n * These all share the same CSV structure:\n * preamble, coordinates, [field(s)...], departure, arrival, date, time(s), fuel\n *\n * Subclasses provide the description, qualifiers, minimum field count,\n * and a hook to decode their specific fields from the CSV data.\n */\nexport abstract class Label_44_Base extends DecoderPlugin {\n /** Human-readable description of this report type (e.g. \"On Runway Report\"). */\n abstract get description(): string;\n\n /** Minimum number of CSV fields required for a valid message. */\n abstract get minFields(): number;\n\n /**\n * Decode the fields that are specific to this report type.\n * The common fields (position, airports, date) are already handled.\n * @param result - The in-progress decode result to populate\n * @param data - The full CSV-split message fields\n * @param options - Decoder options\n */\n abstract decodeEventFields(\n result: DecodeResult,\n data: string[],\n options: Options,\n ): void;\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const result = this.initResult(message, this.description);\n\n const data = message.text.split(',');\n if (data.length < this.minFields) {\n return this.failUnknown(result, message.text, options);\n }\n\n this.debug(options, `${this.description}: fields`, data);\n\n // Common fields shared by all Label 44 event decoders\n ResultFormatter.position(\n result,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(result, data[2]);\n ResultFormatter.arrivalAirport(result, data[3]);\n ResultFormatter.month(result, Number(data[4].substring(0, 2)));\n ResultFormatter.day(result, Number(data[4].substring(2, 4)));\n\n // Subclass-specific fields\n this.decodeEventFields(result, data, options);\n\n this.setDecodeLevel(result, true, 'full');\n return result;\n }\n\n /**\n * Helper to parse a fuel value from a CSV field.\n * Returns undefined if the value is not a valid number.\n */\n protected parseFuel(result: DecodeResult, value: string): void {\n const fuel = Number(value);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(result, fuel);\n }\n }\n\n /**\n * Helper to add any remaining fields as unknown.\n */\n protected addRemainingFields(\n result: DecodeResult,\n data: string[],\n startIndex: number,\n ): void {\n if (data.length > startIndex) {\n ResultFormatter.unknownArr(result, data.slice(startIndex));\n }\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// In Gate Report\nexport class Label_44_IN extends Label_44_Base {\n name = 'label-44-in';\n get description() {\n return 'In Gate Report';\n }\n get minFields() {\n return 7;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.in(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n this.parseFuel(result, data[6]);\n this.addRemainingFields(result, data, 7);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// Off Runway Report\nexport class Label_44_OFF extends Label_44_Base {\n name = 'label-44-off';\n get description() {\n return 'Off Runway Report';\n }\n get minFields() {\n return 8;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00OFF01', '00OFF02', '00OFF03', 'OFF01', 'OFF02', 'OFF03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.off(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n ResultFormatter.eta(result, DateTimeUtils.convertHHMMSSToTod(data[6]));\n this.parseFuel(result, data[7]);\n this.addRemainingFields(result, data, 8);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// On Runway Report\nexport class Label_44_ON extends Label_44_Base {\n name = 'label-44-on';\n get description() {\n return 'On Runway Report';\n }\n get minFields() {\n return 7;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ON01', '00ON02', '00ON03', 'ON01', 'ON02', 'ON03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.on(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n this.parseFuel(result, data[6]);\n this.addRemainingFields(result, data, 7);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00POS01', '00POS02', '00POS03', 'POS01', 'POS02', 'POS03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n // Style: POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1\n // Match: POS02,coords,flight_level_or_ground,departure_icao,arrival_icao,current_date,current_time,eta_time,fuel_in_tons\n const regex =\n /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n this.debug(options, 'Position Report: groups', results.groups);\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n results.groups.unsplit_coords,\n ),\n );\n const flight_level =\n results.groups.flight_level_or_ground == 'GRD' ||\n results.groups.flight_level_or_ground == '***'\n ? 0\n : Number(results.groups.flight_level_or_ground);\n\n ResultFormatter.month(\n decodeResult,\n Number(results.groups.current_date.substring(0, 2)),\n );\n ResultFormatter.day(\n decodeResult,\n Number(results.groups.current_date.substring(2, 4)),\n );\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + '00'),\n );\n\n // TODO: ETA month and Day\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + '00'),\n );\n\n if (\n results.groups.fuel_in_tons != '***' &&\n results.groups.fuel_in_tons != '****'\n ) {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n ResultFormatter.departureAirport(\n decodeResult,\n results.groups.departure_icao,\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n\n this.setDecodeLevel(decodeResult, true, 'full');\n return decodeResult;\n }\n\n return this.failUnknown(decodeResult, message.text, options);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { FlightPlanUtils } from '../utils/flight_plan_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Flight Briefing Report\nexport class Label_44_Slash extends DecoderPlugin {\n name = 'label-44-slash';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: [' /FB'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Briefing';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n if (fields.length !== 4) {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(0, 2), '/'); // 0 is a space\n // 1 is the briefing id\n // 2 is arrival airport, but repeated later\n const data = fields[3].split(',');\n if (data.length >= 6) {\n if (options.debug) {\n console.log('Label 44 Slash: groups');\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n (data[0].charAt(0) === 'S' ? -1 : 1) *\n parseFloat(data[0].slice(1).trim()),\n longitude:\n (data[1].charAt(0) === 'W' ? -1 : 1) *\n parseFloat(data[1].slice(1).trim()),\n });\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.unknown(decodeResult, data[3]); // Status - need more info to decode\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n if (data.length === 18) {\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 8), ','); // 6 is repeated arrival airport\n ResultFormatter.remainingFuel(decodeResult, parseFloat(data[8]));\n ResultFormatter.unknownArr(decodeResult, data.slice(9, 11), ',');\n ResultFormatter.arrivalRunway(decodeResult, data[11]);\n FlightPlanUtils.addProcedure(decodeResult, data[12], 'arrival');\n ResultFormatter.unknownArr(decodeResult, data.slice(13, 18), ',');\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Waypoint } from '../types/waypoint';\n\nexport class Label_4A extends DecoderPlugin {\n name = 'label-4a';\n\n qualifiers() {\n return {\n labels: ['4A'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n if (fields.length === 11) {\n // variant 1\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.tail(decodeResult, fields[2].replace('.', ''));\n if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);\n ResultFormatter.departureAirport(decodeResult, fields[4]);\n ResultFormatter.arrivalAirport(decodeResult, fields[5]);\n // ResultFormatter.altitude(decodeResult, Number(alt) * 100);\n ResultFormatter.unknownArr(decodeResult, fields.slice(8));\n } else if (fields.length === 6) {\n if (fields[0].match(/^[NS]/)) {\n // variant 2\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)),\n );\n let wp1: Waypoint = {\n name: fields[0].substring(13).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),\n };\n ResultFormatter.altitude(\n decodeResult,\n Number(fields[1].substring(6, 9)) * 100,\n );\n let wp2: Waypoint = {\n name: fields[1].substring(9).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[2]),\n };\n ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });\n ResultFormatter.temperature(decodeResult, fields[3]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(4));\n } else {\n // variant 3\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1]),\n );\n ResultFormatter.unknown(decodeResult, fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(\n (fields[4] + fields[5]).replace(/[ \\.]/g, ''),\n ),\n );\n }\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_01 extends DecoderPlugin {\n name = 'label-4a-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n let rgx = message.text.match(\n /^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)/,\n );\n if (rgx) {\n ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);\n ResultFormatter.callsign(decodeResult, rgx[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(rgx[4] + '00'),\n );\n ResultFormatter.departureAirport(decodeResult, rgx[5]);\n ResultFormatter.arrivalAirport(decodeResult, rgx[6]);\n ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, '')));\n ResultFormatter.unknown(decodeResult, rgx[8]);\n ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ''));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DIS extends DecoderPlugin {\n name = 'label-4a-dis';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DIS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + '00'),\n );\n ResultFormatter.callsign(decodeResult, fields[2]);\n ResultFormatter.text(decodeResult, fields.slice(3).join(''));\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DOOR extends DecoderPlugin {\n name = 'label-4a-door';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DOOR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(' ');\n if (fields.length === 3) {\n ResultFormatter.door_event(\n decodeResult,\n fields[0].split('/')[1],\n fields[1],\n );\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2] + '00'),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_Slash_01 extends DecoderPlugin {\n name = 'label-4a-slash-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['/01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n if (message.text.length === 5 && message.text.substring(0, 4) === '/01-') {\n ResultFormatter.unknown(decodeResult, message.text.substring(4));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4N extends DecoderPlugin {\n name = 'label-4n';\n\n qualifiers() {\n return {\n labels: ['4N'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n const fields = text.split(',');\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(30, 45).replace(/^(.)0/, '$1'),\n ),\n );\n ResultFormatter.altitude(\n decodeResult,\n Number(text.substring(48, 51)) * 100,\n );\n ResultFormatter.unknownArr(\n decodeResult,\n [text.substring(2, 4), text.substring(19, 29)],\n ' ',\n );\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === 'B') {\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[4]),\n longitude: Number(fields[5]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[6]));\n }\n ResultFormatter.departureAirport(decodeResult, fields[8]);\n ResultFormatter.arrivalAirport(decodeResult, fields[9]);\n ResultFormatter.alternateAirport(decodeResult, fields[10]);\n ResultFormatter.arrivalRunway(decodeResult, fields[11].split('/')[0]);\n if (fields[12].length > 1) {\n ResultFormatter.alternateRunway(decodeResult, fields[12].split('/')[0]);\n }\n ResultFormatter.checksum(decodeResult, parseInt(fields[32], 16));\n ResultFormatter.unknownArr(\n decodeResult,\n [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(\n (f) => f != '',\n ),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_AGFSR extends DecoderPlugin {\n name = 'label-4t-agfsr';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['AGFSR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(5).split('/');\n\n if (!message.text.startsWith('AGFSR') || data.length !== 20) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n ResultFormatter.arrivalDay(decodeResult, Number(data[2]));\n ResultFormatter.departureAirport(\n decodeResult,\n data[3].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), 'IATA');\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)),\n ); // HHMMZ\n ResultFormatter.unknown(decodeResult, data[5], '/');\n const lat = data[6].substring(0, 7);\n const lon = data[6].substring(7, 15);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) +\n Number(lat.substring(2, 6)) / 60,\n longitude:\n CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) +\n Number(lon.substring(3, 7)) / 60,\n });\n ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));\n // 8 - phase of flight?\n // 11 - temperature?\n ResultFormatter.unknownArr(decodeResult, data.slice(8), '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_58 extends DecoderPlugin {\n name = 'label-58';\n\n qualifiers() {\n return {\n labels: ['58'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.split('/');\n if (data.length === 8) {\n ResultFormatter.flightNumber(decodeResult, data[0]);\n ResultFormatter.day(decodeResult, Number(data[1]));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n const lat = data[3];\n const lon = data[4];\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n ResultFormatter.altitude(decodeResult, Number(data[5]));\n ResultFormatter.unknown(decodeResult, data[6], '/');\n ResultFormatter.unknown(decodeResult, data[7], '/');\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 58 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_ETA extends DecoderPlugin {\n name = 'label-4t-eta';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['ETA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split('/');\n\n if (!message.text.startsWith('ETA') || data.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n const etaData = data[2].split(' ');\n ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));\n ResultFormatter.arrivalAirport(decodeResult, etaData[1], 'IATA');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)),\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n qualifiers() {\n return {\n labels: ['80'],\n preambles: [],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(\n message,\n 'Airline Defined Position Report',\n );\n\n const lines = message.text.split(/\\r?\\n/);\n if (lines.length === 1 && lines[0].includes(',')) {\n this.parseCsvFormat(lines[0], decodeResult);\n } else {\n const header = lines[0].trim();\n const headerParts = header.split(',');\n for (let i = 0; i < headerParts.length - 1; i++) {\n const moreFields = headerParts[i].split('/');\n for (const more of moreFields) {\n this.parseTags(more.trim(), decodeResult);\n }\n }\n\n this.parseHeader(\n headerParts[headerParts.length - 1].trim(),\n decodeResult,\n );\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const parts = line.split('/');\n for (const part of parts) {\n this.parseTags(part.trim(), decodeResult);\n }\n }\n }\n\n if (decodeResult.formatted.items.length > 0) {\n this.setDecodeLevel(decodeResult, true);\n }\n\n return decodeResult;\n }\n\n private parseHeader(header: string, results: DecodeResult) {\n //3N01 POSRPT 0581/27 KIAD/MSLP .N962AV/04H 11:02\n const fields = header.split('/');\n if (fields.length < 3) {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n const msgInfo = fields[0].split(/\\s+/);\n if (msgInfo.length === 3) {\n ResultFormatter.unknownArr(results, msgInfo.slice(0, 2), ' ');\n ResultFormatter.flightNumber(results, msgInfo[2]);\n } else {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n\n const otherInfo1 = fields[1].split(/\\s+/);\n if (otherInfo1.length === 2) {\n ResultFormatter.day(results, parseInt(otherInfo1[0], 10));\n ResultFormatter.departureAirport(results, otherInfo1[1]);\n } else {\n ResultFormatter.unknownArr(results, otherInfo1, ' ');\n }\n\n const otherInfo2 = fields[2].split(/\\s+/);\n if (otherInfo2.length === 2) {\n ResultFormatter.arrivalAirport(results, otherInfo2[0]);\n ResultFormatter.tail(results, otherInfo2[1].replace('.', ''));\n } else {\n ResultFormatter.unknownArr(results, otherInfo2, ' ');\n }\n\n if (fields.length > 3) {\n ResultFormatter.unknownArr(results, fields.slice(3), '/');\n }\n }\n\n private parseTags(part: string, results: DecodeResult) {\n const kvPair = part.split(/\\s+/);\n if (kvPair.length < 2) {\n ResultFormatter.unknown(results, part, '/');\n return;\n }\n const tag = kvPair[0];\n const val = kvPair.slice(1).join(' ');\n\n switch (tag) {\n case 'POS':\n // don't use decodeStringCoordinates because of different position format\n const posRegex = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\n const posResult = val.match(posRegex);\n const lat =\n Number(posResult?.groups?.lat) *\n (posResult?.groups?.latd === 'S' ? -1 : 1);\n const lon =\n Number(posResult?.groups?.lng) *\n (posResult?.groups?.lngd === 'W' ? -1 : 1);\n const position = {\n latitude: Number.isInteger(lat) ? lat / 1000 : lat / 100,\n longitude: Number.isInteger(lon) ? lon / 1000 : lon / 100,\n };\n ResultFormatter.position(results, position);\n break;\n case 'ALT':\n ResultFormatter.altitude(results, parseInt(val.replace('+', ''), 10));\n break;\n case 'FL': // Handle \"FL 360\"\n ResultFormatter.altitude(results, parseInt(val, 10) * 100);\n break;\n case 'MCH':\n ResultFormatter.mach(results, parseInt(val, 10) / 1000);\n break;\n case 'SPD':\n ResultFormatter.groundspeed(results, parseInt(val, 10));\n break;\n case 'TAS':\n ResultFormatter.airspeed(results, parseInt(val, 10));\n break;\n case 'SAT':\n ResultFormatter.temperature(results, val);\n break;\n case 'FB':\n // ignoring, assuming FOB and avoiding duplicates.\n break;\n case 'FOB':\n // Strip non-numeric like 'N' in 'N009414'\n ResultFormatter.currentFuel(\n results,\n parseInt(val.replace(/\\D/g, ''), 10),\n );\n break;\n case 'UTC':\n ResultFormatter.timestamp(\n results,\n DateTimeUtils.convertHHMMSSToTod(val),\n );\n break;\n case 'ETA':\n const hhmm = val.split('.')[0].replace(':', '');\n ResultFormatter.eta(results, DateTimeUtils.convertHHMMSSToTod(hhmm));\n break;\n case 'HDG':\n ResultFormatter.heading(results, parseInt(val, 10));\n break;\n case 'NWYP':\n results.raw.next_waypoint = val;\n break;\n case 'SWN':\n // wind speed, do nothing for\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'DWN':\n // wind direction, do nothing for now\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'AD':\n // do nothing, as it shows in the header\n break;\n default:\n ResultFormatter.unknown(results, part, '/');\n }\n }\n private parseCsvFormat(text: string, results: DecodeResult) {\n const csvParts = text.split(',');\n if (csvParts.length !== 9) {\n return;\n }\n const header = csvParts[0].trim().split(/\\s+/);\n ResultFormatter.unknown(results, header[0], ' ');\n ResultFormatter.unknown(results, header[1], ' ');\n ResultFormatter.position(\n results,\n CoordinateUtils.decodeStringCoordinates(header[2]),\n );\n ResultFormatter.unknown(results, csvParts[1]);\n ResultFormatter.timestamp(\n results,\n DateTimeUtils.convertHHMMSSToTod(csvParts[2]),\n );\n ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ',');\n ResultFormatter.temperature(\n results,\n (\n (csvParts[6].charAt(0) === 'M' ? -1 : 1) *\n parseInt(csvParts[6].slice(1), 10)\n ).toString(),\n );\n ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));\n ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() {\n return {\n labels: ['83'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n if (text.substring(0, 10) === '4DH3 ETAT2') {\n // variant 2\n const fields = text.split(/\\s+/);\n if (fields[2].length > 5) {\n decodeResult.raw.day = fields[2].substring(5);\n }\n ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));\n const subfields = fields[3].split('/');\n ResultFormatter.departureAirport(decodeResult, subfields[0]);\n ResultFormatter.arrivalAirport(decodeResult, subfields[1]);\n ResultFormatter.tail(decodeResult, fields[4].replace(/\\./g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[6] + '00'),\n );\n } else if (text.substring(0, 5) === '001PR') {\n // variant 3\n decodeResult.raw.day = text.substring(5, 7);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(13, 28).replace(/\\./g, ''),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n ResultFormatter.unknown(decodeResult, text.substring(33));\n } else {\n const fields = text.replace(/\\s/g, '').split(',');\n if (fields.length === 9) {\n // variant 1\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n decodeResult.raw.day = fields[2].substring(0, 2);\n decodeResult.raw.time = fields[2].substring(2);\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[3].replace(/\\s/g, '')),\n longitude: Number(fields[4].replace(/\\s/g, '')),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[5]));\n ResultFormatter.groundspeed(decodeResult, Number(fields[6]));\n ResultFormatter.heading(decodeResult, Number(fields[7]));\n ResultFormatter.unknown(decodeResult, fields[8]);\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() {\n return {\n labels: ['8E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: EGSS,1618\n // Match: arrival_icao,arrival_eta\n const regex = /^(?<arrival_icao>\\w{4}),(?<arrival_eta>\\d{4})$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 8E ETA: groups');\n console.log(results.groups);\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta),\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\n// CPDLC\nexport class Label_B6_Forwardslash extends DecoderPlugin {\n name = 'label-b6-forwardslash';\n\n qualifiers() {\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'CPDLC Message';\n decodeResult.message = message;\n\n if (options.debug) {\n console.log('CPDLC: ' + message);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_ColonComma extends DecoderPlugin {\n name = 'label-colon-comma';\n\n qualifiers() {\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description =\n 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n code: 'FREQ',\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H2_02E extends DecoderPlugin {\n name = 'label-h2-02e';\n\n qualifiers() {\n return {\n labels: ['H2'],\n preambles: ['02E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Weather Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n\n if (parts[parts.length - 1] !== 'Q') {\n // not a valid message\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const windData: Wind[] = [];\n decodeResult.remaining.text = '';\n\n const header = parts[0];\n if (header.length === 45) {\n // header.substring(0,3) is '02E'\n ResultFormatter.day(decodeResult, parseInt(header.substring(3, 5), 10));\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n const firstWind = this.parseWeatherReport(header.substring(13));\n if (firstWind) {\n windData.push(firstWind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + header.substring(13);\n }\n }\n\n for (let i = 1; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part[0] !== 'Q') {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n continue;\n }\n const wind = this.parseWeatherReport(part.substring(1));\n if (wind) {\n windData.push(wind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n }\n }\n\n ResultFormatter.windData(decodeResult, windData);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text.length === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n\n private parseWeatherReport(text: string): Wind | null {\n const posString = text.substring(0, 13);\n const pos =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(posString);\n if (text.length !== 32 || !pos) {\n return null;\n }\n const tod = DateTimeUtils.convertHHMMSSToTod(text.substring(13, 17));\n const flightLevel = parseInt(text.substring(17, 20), 10);\n // const altitude = parseInt(text.substring(17,21), 10) * 10; // use FL instead\n const tempSign = text[21] === 'M' ? -1 : 1;\n const tempDegreesRaw = parseInt(text.substring(22, 25), 10);\n const tempDegrees = tempSign * (tempDegreesRaw / 10);\n const windDirection = parseInt(text.substring(25, 28), 10);\n const windSpeed = parseInt(text.substring(28, 31), 10);\n // G?\n if (text[31] !== 'G') {\n return null;\n }\n return {\n waypoint: {\n name: posString,\n latitude: pos.latitude,\n longitude: pos.longitude,\n time: tod,\n },\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: flightLevel,\n degreesC: tempDegrees,\n },\n };\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_H1_ATIS extends DecoderPlugin {\n name = 'label-h1-atis';\n\n qualifiers() {\n return {\n labels: ['H1', '5Z'],\n preambles: ['L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ATIS Subscription';\n decodeResult.message = message;\n\n // Pattern: L[2-digit seq]A[flight]/[facility].TI2/[code][airport][checksum]\n const regex =\n /^L(\\d{2})A([A-Z0-9]+)\\/([A-Z]{4})\\.TI2\\/(\\d{3})([A-Z]{4})([A-F0-9]+)$/;\n const match = message.text.match(regex);\n\n if (!match) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 ATIS message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const seq = match[1];\n const flight = match[2];\n const facility = match[3];\n const code = match[4];\n const airport = match[5];\n const checksum = match[6];\n\n ResultFormatter.flightNumber(decodeResult, flight);\n ResultFormatter.arrivalAirport(decodeResult, facility);\n\n decodeResult.raw.atis_code = code;\n decodeResult.formatted.items.push({\n type: 'atis',\n code: 'ATIS_CODE',\n label: 'ATIS Code',\n value: code,\n });\n\n // The airport in the TI2 section\n if (airport !== facility) {\n decodeResult.raw.atis_airport = airport;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ATIS_ARPT',\n label: 'ATIS Airport',\n value: airport,\n });\n }\n\n // Checksum\n ResultFormatter.checksum(decodeResult, parseInt(checksum, 16));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_EZF extends DecoderPlugin {\n name = 'label-h1-ezf';\n\n qualifiers() {\n return {\n labels: ['H1', '1M'],\n preambles: ['EZF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Load Sheet';\n decodeResult.message = message;\n\n const lines = message.text\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length < 2 || lines[0] !== 'EZF') {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 EZF message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const loadsheet: Record<string, string> = {};\n const unknowns: string[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('-')) {\n const kvMatch = line.match(/^-([^/]+)\\/(.+)$/);\n if (kvMatch) {\n loadsheet[kvMatch[1]] = kvMatch[2];\n } else {\n unknowns.push(line);\n }\n } else if (i === 1) {\n // Second line is the flight identifier, e.g. NO0246/10/EI-NEO\n const idParts = line.split('/');\n if (idParts.length >= 1) {\n ResultFormatter.flightNumber(decodeResult, idParts[0]);\n }\n if (idParts.length >= 3) {\n ResultFormatter.tail(decodeResult, idParts[2]);\n }\n // Remaining parts of identifier line\n if (idParts.length >= 2) {\n // idParts[1] is day or other info - store but don't format\n }\n } else if (i === 2) {\n // Third line typically contains config info, e.g. /C28Y331/3/9\n unknowns.push(line);\n } else {\n unknowns.push(line);\n }\n }\n\n // Extract known fields from loadsheet\n if (loadsheet['SCT']) {\n const route = loadsheet['SCT'].split('-');\n if (route.length === 2) {\n ResultFormatter.departureAirport(decodeResult, route[0], 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, route[1], 'IATA');\n }\n }\n\n // Store all loadsheet data in raw\n decodeResult.raw.loadsheet = loadsheet;\n\n // Format key loadsheet items\n const formatFields: [string, string, string][] = [\n ['STD', 'Scheduled Time of Departure', 'std'],\n ['FLT STATUS', 'Flight Status', 'flight_status'],\n ['UOM', 'Unit of Measure', 'uom'],\n ['ZFW', 'Zero Fuel Weight', 'zfw'],\n ['PAX', 'Passengers', 'pax'],\n ['TOW', 'Takeoff Weight', 'tow'],\n ['DOW', 'Dry Operating Weight', 'dow'],\n ['FWT', 'Fuel Weight', 'fuel_weight'],\n ];\n\n for (const [key, label, code] of formatFields) {\n if (loadsheet[key]) {\n decodeResult.formatted.items.push({\n type: 'loadsheet',\n code: code.toUpperCase(),\n label: label,\n value: loadsheet[key],\n });\n }\n }\n\n if (unknowns.length > 0) {\n ResultFormatter.unknownArr(decodeResult, unknowns, '\\n');\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Fault Log Report');\n\n const parts = message.text.split('/FR');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n for (let i = 1; i < fields.length; i++) {\n const field = fields[i];\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.fault_message = msg;\n decodeResult.formatted.items.push({\n type: 'fault',\n code: 'FR',\n label: 'Fault Report',\n value: decodeResult.raw.fault_message,\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_H1_M_POS extends DecoderPlugin {\n name = 'label-h1-m-pos';\n\n qualifiers() {\n return {\n labels: ['H1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(\n message,\n 'M-Series Periodic Position Report',\n );\n\n // Match M[2-digit seq]A[airline 2-char][flight 4-digit][origin],[dest],[DDHHMM],[lat],[lon],[alt],[hdg],...\n const headerRegex = /^M(\\d{2})A([A-Z]{2})(\\d{4})/;\n const headerMatch = message.text.match(headerRegex);\n\n if (!headerMatch) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const airline = headerMatch[2];\n const flightNum = headerMatch[3];\n const afterHeader = message.text.substring(headerMatch[0].length);\n const fields = afterHeader.split(',');\n\n // We expect at least: origin, dest, DDHHMM, lat, lon, alt, hdg\n if (fields.length < 7) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.flightNumber(decodeResult, `${airline}${flightNum}`);\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n\n // DDHHMM timestamp\n const timestamp = fields[2].trim();\n if (timestamp.length === 6) {\n const day = Number(timestamp.substring(0, 2));\n const tod = DateTimeUtils.convertHHMMSSToTod(\n timestamp.substring(2) + '00',\n );\n ResultFormatter.day(decodeResult, day);\n ResultFormatter.timestamp(decodeResult, tod);\n }\n\n // Latitude and longitude (trim spaces, e.g. \"- 4.9985\")\n const lat = parseFloat(fields[3].replace(/\\s/g, ''));\n const lon = parseFloat(fields[4].replace(/\\s/g, ''));\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n\n // Altitude\n const alt = Number(fields[5]);\n ResultFormatter.altitude(decodeResult, alt);\n\n // Heading\n const hdg = Number(fields[6]);\n ResultFormatter.heading(decodeResult, hdg);\n\n // Remaining fields as unknown\n if (fields.length > 7) {\n ResultFormatter.unknownArr(decodeResult, fields.slice(7));\n }\n\n this.setDecodeLevel(\n decodeResult,\n true,\n fields.length > 7 ? 'partial' : 'full',\n );\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nimport * as zlib from 'minizlib';\nimport { Buffer } from 'node:buffer';\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['OHMA', '/RTNBOCR.OHMA', '#T1B/RTNBOCR.OHMA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n\n const data = message.text.split('OHMA')[1]; // throw out '/RTNOCR.' - even though it means something\n try {\n const compressedBuffer = Buffer.from(data, 'base64');\n const decompress = new zlib.Inflate({});\n decompress.write(compressedBuffer);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n const result = decompress.read();\n const jsonText = result?.toString() || '';\n\n let formattedMsg;\n let jsonMessage;\n try {\n jsonMessage = JSON.parse(jsonText).message;\n } catch {\n jsonMessage = jsonText;\n }\n\n try {\n const ohmaMsg = JSON.parse(jsonMessage);\n formattedMsg = JSON.stringify(ohmaMsg, null, 2);\n } catch {\n formattedMsg = jsonMessage;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.raw.ohma = jsonText;\n decodeResult.formatted.items.push({\n type: 'ohma',\n code: 'OHMA',\n label: 'OHMA Downlink',\n value: formattedMsg,\n });\n } catch (e) {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 OHMA message: ${message.text}`, e);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","/**\n * ICAO Doc 4444 Flight Plan (FPL) parser utility.\n *\n * Parses the standard ICAO FPL format:\n * (FPL-callsign-flightRulesType\n * -aircraftType/wake-equipment/surveillance\n * -departureHHMM\n * -speedLevel route\n * -destinationHHMM alternate1 alternate2\n * -otherInfo)\n */\n\nimport { Route } from '../types/route';\n\nexport interface IcaoFlightPlan {\n callsign: string;\n flightRules: string;\n flightType: string;\n aircraftType: string;\n wakeTurbulence: string;\n equipment: string;\n surveillance: string;\n departure: string;\n departureTime: string;\n cruiseSpeed: string;\n cruiseLevel: string;\n route: Route;\n destination: string;\n eet: string;\n alternates: string[];\n otherInfo: Record<string, string>;\n}\n\nexport function parseIcaoFpl(text: string): IcaoFlightPlan | null {\n // Find the (FPL-...) block\n const fplStart = text.indexOf('(FPL-');\n if (fplStart === -1) {\n return null;\n }\n\n // Find matching closing paren\n const fplEnd = text.indexOf(')', fplStart);\n if (fplEnd === -1) {\n return null;\n }\n\n // Extract inner content after \"(FPL-\"\n const inner = text.substring(fplStart + 5, fplEnd);\n\n // Normalize: collapse all whitespace (newlines, multiple spaces) to single space\n const normalized = inner.replace(/\\s+/g, ' ').trim();\n\n // Split on \" -\" or leading \"-\" to get the field sections.\n // The format is: callsign-rulesType-acft/wake-equip/surv-deptHHMM-speedLevel route-destHHMM alts-other\n // After removing \"(FPL-\", the first field is callsign-rulesType.\n // Subsequent fields are separated by \"-\" that appears after a space or at start of a section line.\n // However, the \"-\" delimiter is tricky: it separates major sections but also appears\n // within equipment strings (e.g. SDE3FGHIJ1...) — those are NOT delimiters.\n //\n // The ICAO FPL has exactly 6 major sections after the callsign section, delimited by \"-\".\n // We need to split carefully. The format after \"(FPL-\" is:\n // section1-section2-section3-section4-section5-section6\n // where section1 = \"callsign-rulesType\" (contains one internal \"-\")\n //\n // Strategy: split on \"-\" and reconstruct based on known patterns.\n\n const parts = normalized.split('-');\n\n // We need at least 7 parts (callsign, rulesType, acftType/wake, equip/surv, dept, speed+route, dest+alts, other...)\n // But the equipment section may contain hyphens too, so we parse positionally.\n\n if (parts.length < 7) {\n return null;\n }\n\n // Section 1: callsign\n const callsign = parts[0].trim();\n if (!callsign) {\n return null;\n }\n\n // Section 2: flight rules + flight type (e.g., \"IS\")\n const rulesType = parts[1].trim();\n if (rulesType.length < 2) {\n return null;\n }\n const flightRules = rulesType[0];\n const flightType = rulesType[1];\n\n // Now we need to find the remaining sections. The challenge is that equipment strings\n // can be long but don't contain \"-\". The aircraft/wake section is \"TYPE/WAKE\".\n // The equipment/surveillance section is \"EQUIP/SURV\".\n // These are separated by \"-\".\n\n // Section 3: aircraft type / wake turbulence category (e.g., \"B77W/H\")\n const acftWake = parts[2].trim();\n const acftSlash = acftWake.indexOf('/');\n if (acftSlash === -1) {\n return null;\n }\n const aircraftType = acftWake.substring(0, acftSlash);\n const wakeTurbulence = acftWake.substring(acftSlash + 1);\n\n // Section 4: equipment / surveillance (e.g., \"SDE3FGHIJ1J2J3J4J5M1P2RWXYZ/LB1D1\")\n const equipSurv = parts[3].trim();\n const equipSlash = equipSurv.indexOf('/');\n if (equipSlash === -1) {\n return null;\n }\n const equipment = equipSurv.substring(0, equipSlash);\n const surveillance = equipSurv.substring(equipSlash + 1);\n\n // Section 5: departure aerodrome + time (e.g., \"VESPA2354\" or \"KSFO0100\")\n const deptField = parts[4].trim();\n // Time is always last 4 digits\n const departureTime = deptField.substring(deptField.length - 4);\n const departure = deptField.substring(0, deptField.length - 4);\n\n // Section 6: cruise speed/level + route (e.g., \"N0482F350 DCT ENI DCT OAK DCT BURGL IRNMN2\")\n const speedRouteField = parts[5].trim();\n // Speed is first token like N0482 or M084, level follows like F350 or S1190\n const speedMatch = speedRouteField.match(\n /^([NKM]\\d{3,4})([FAVMS]\\d{3,4})\\s*(.*)/,\n );\n if (!speedMatch) {\n return null;\n }\n const cruiseSpeed = speedMatch[1];\n const cruiseLevel = speedMatch[2];\n const route = {\n waypoints: speedMatch[3].split(' ').map((s) => ({\n name: s,\n })),\n };\n\n // Section 7: destination + EET + alternates (e.g., \"KLAX0117 KSFO\")\n const destField = parts[6].trim();\n const destParts = destField.split(/\\s+/);\n const destTime = destParts[0];\n // Destination ICAO is first 4 chars, EET is last 4 digits\n const destination = destTime.substring(0, destTime.length - 4);\n const eet = destTime.substring(destTime.length - 4);\n const alternates = destParts.slice(1).filter((s) => s.length > 0);\n\n // Section 8+: other information (remaining parts joined, then parsed as key/value)\n const otherRaw = parts.slice(7).join('-').trim();\n const otherInfo: Record<string, string> = {};\n\n if (otherRaw.length > 0) {\n // Other info is a series of KEY/VALUE pairs separated by spaces\n // e.g., \"PBN/A1B1C1D1L1O2S2T1 NAV/ABAS RNP2 DAT/1FANSE SUR/RSP180 DOF/260310 REG/B2036\"\n // Parse by finding KEY/ patterns\n const otherTokens = otherRaw.split(/\\s+/);\n let currentKey = '';\n let currentValue = '';\n\n for (const token of otherTokens) {\n const kvMatch = token.match(/^([A-Z]{2,})\\/(.*)/);\n if (kvMatch) {\n // Save previous key/value if exists\n if (currentKey) {\n otherInfo[currentKey] = currentValue.trim();\n }\n currentKey = kvMatch[1];\n currentValue = kvMatch[2];\n } else if (currentKey) {\n // Continuation of previous value\n currentValue += ' ' + token;\n }\n }\n // Save last key/value\n if (currentKey) {\n otherInfo[currentKey] = currentValue.trim();\n }\n }\n\n return {\n callsign,\n flightRules,\n flightType,\n aircraftType,\n wakeTurbulence,\n equipment,\n surveillance,\n departure,\n departureTime,\n cruiseSpeed,\n cruiseLevel,\n route,\n destination,\n eet,\n alternates,\n otherInfo,\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { parseIcaoFpl } from '../utils/icao_fpl_utils';\n\nexport class Label_H1_OFP extends DecoderPlugin {\n name = 'label-h1-ofp';\n\n qualifiers() {\n return {\n labels: ['H1', '1M'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Operational Flight Plan';\n\n if (!message.text.includes('(FPL-')) {\n if (options.debug) {\n console.log(`Decoder: No FPL block found in message`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const fpl = parseIcaoFpl(message.text);\n if (!fpl) {\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // Populate decoded results\n ResultFormatter.callsign(decodeResult, fpl.callsign);\n\n decodeResult.formatted.items.push({\n type: 'aircraft_type',\n code: 'ACFT',\n label: 'Aircraft Type',\n value: fpl.aircraftType,\n });\n\n if (fpl.departure) {\n ResultFormatter.departureAirport(decodeResult, fpl.departure);\n }\n\n if (fpl.destination) {\n ResultFormatter.arrivalAirport(decodeResult, fpl.destination);\n }\n\n if (fpl.alternates.length > 0) {\n ResultFormatter.alternateAirport(decodeResult, fpl.alternates[0]);\n }\n\n if (fpl.route) {\n ResultFormatter.route(decodeResult, fpl.route);\n }\n\n if (fpl.otherInfo.REG) {\n ResultFormatter.tail(decodeResult, fpl.otherInfo.REG);\n }\n\n const rulesMap: Record<string, string> = {\n I: 'IFR',\n V: 'VFR',\n Y: 'IFR/VFR',\n Z: 'VFR/IFR',\n };\n const rulesDesc = rulesMap[fpl.flightRules] || fpl.flightRules;\n decodeResult.formatted.items.push({\n type: 'flight_rules',\n code: 'RULES',\n label: 'Flight Rules',\n value: rulesDesc,\n });\n\n decodeResult.formatted.items.push({\n type: 'cruise',\n code: 'CRUISE',\n label: 'Cruise Speed/Level',\n value: `${fpl.cruiseSpeed} ${fpl.cruiseLevel}`,\n });\n\n // Store raw FPL data\n decodeResult.raw.icao_fpl = fpl;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_Paren extends DecoderPlugin {\n name = 'label-h1-paren';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['('],\n };\n }\n\n decode(message: Message): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (!message.text || !message.text.startsWith('(')) {\n decodeResult.decoded = false;\n return decodeResult;\n }\n\n const regex =\n /^\\(POS-(?<flight>\\w+)\\s+(?<lat>-?\\d{4,5}[NS])(?<lon>\\d{5}[EW])\\/(?<timestamp>\\d{6})\\s+F(?<alt>\\d{3})\\r?\\nRMK\\/FUEL\\s+(?<fuel>\\d{2,3}\\.\\d)\\s+M(?<mach>\\d\\.\\d{2})\\)/;\n\n const match = message.text.match(regex);\n if (match && match.groups) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.formatted.description = 'Position Report';\n\n ResultFormatter.flightNumber(decodeResult, match.groups.flight);\n ResultFormatter.position(decodeResult, {\n latitude: parseLat(match.groups.lat),\n longitude: parseLon(match.groups.lon),\n });\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(match.groups.timestamp),\n );\n ResultFormatter.altitude(\n decodeResult,\n parseInt(match.groups.alt, 10) * 100,\n );\n ResultFormatter.currentFuel(decodeResult, parseFloat(match.groups.fuel));\n ResultFormatter.mach(decodeResult, parseFloat(match.groups.mach));\n ResultFormatter.unknown(decodeResult, 'RMK');\n }\n return decodeResult;\n }\n}\n\nfunction parseLat(latStr: string): number {\n const match = latStr.match(/(-?)(\\d{2})(\\d{2})([NS])/);\n if (!match) return NaN;\n let deg = parseInt(match[2]);\n let min = parseInt(match[3]);\n let sign = match[4] === 'S' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n\nfunction parseLon(lonStr: string): number {\n const match = lonStr.match(/(\\d{3})(\\d{2})([EW])/);\n if (!match) return NaN;\n let deg = parseInt(match[1]);\n let min = parseInt(match[2]);\n let sign = match[3] === 'W' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_StarPOS extends DecoderPlugin {\n name = 'label-h1-star-pos';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['*POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const msg = message.text;\n // assuming fixed length until other variants found\n if (msg.length !== 43 || !msg.startsWith('*POS')) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${msg}`);\n }\n ResultFormatter.unknown(decodeResult, msg);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));\n ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)),\n );\n ResultFormatter.position(decodeResult, {\n // Deg Min, no sec\n latitude:\n CoordinateUtils.getDirection(msg.substring(12, 13)) *\n (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),\n longitude:\n CoordinateUtils.getDirection(msg.substring(17, 18)) *\n (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23)) / 60),\n });\n ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));\n ResultFormatter.unknown(decodeResult, msg.substring(28));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Warning Message');\n\n const parts = message.text.split('/WN');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n ResultFormatter.unknownArr(decodeResult, fields.slice(1), '/');\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.warning_message = msg;\n decodeResult.formatted.items.push({\n type: 'warning',\n code: 'WRN',\n label: 'Warning Message',\n value: decodeResult.raw.warning_message,\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() {\n return {\n labels: ['HX'],\n preambles: ['RA FMT LOCATION', 'RA FMT 43'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Undelivered Uplink Report';\n\n const parts = message.text.split(' ');\n\n decodeResult.decoded = true;\n if (parts[2] === 'LOCATION') {\n let latdir = parts[3].substring(0, 1);\n let latdeg = Number(parts[3].substring(1, 3));\n let latmin = Number(parts[3].substring(3, 7));\n let londir = parts[4].substring(0, 1);\n let londeg = Number(parts[4].substring(1, 4));\n let lonmin = Number(parts[4].substring(4, 8));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknownArr(decodeResult, parts.slice(5), ' ');\n ResultFormatter.position(decodeResult, pos);\n } else if (parts[2] === '43') {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), ' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import * as Base85 from 'base85';\nimport * as zlib from 'minizlib';\nimport { Buffer } from 'node:buffer';\n\nenum MIAMVersion {\n V1 = 1,\n V2 = 2,\n}\n\nenum MIAMFid {\n SingleTransfer = 'T',\n FileTransferRequest = 'F',\n FileTransferAccept = 'K',\n FileSegment = 'S',\n FileTransferAbort = 'A',\n XOFFIndication = 'Y',\n XONIndication = 'X',\n}\n\nenum MIAMCorePdu {\n Data = 0,\n Ack = 1,\n Aloha = 2,\n AlohaReply = 3,\n}\n\nenum MIAMCoreApp {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nexport enum MIAMCoreV1Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nexport enum MIAMCoreV2Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nconst MIAMCoreV1CRCLength = 4;\nconst MIAMCoreV2CRCLength = 2;\n\ninterface PduACARSData {\n tail?: string;\n label: string;\n sublabel?: string;\n mfi?: string;\n text?: string;\n}\n\ninterface PduNonACARSData {\n appId?: string;\n text?: string;\n}\n\ninterface Pdu {\n version: MIAMVersion;\n crc: number;\n crcOk: boolean;\n complete: boolean;\n compression: number;\n encoding: number;\n msgNum: number;\n ackOptions: number;\n acars?: PduACARSData;\n non_acars?: PduNonACARSData;\n}\nconst isMIAMVersion = (x: number): x is MIAMVersion =>\n Object.values(MIAMVersion).includes(x as MIAMVersion);\nconst isMIAMFid = (x: string): x is MIAMFid =>\n Object.values(MIAMFid).includes(x as MIAMFid);\nconst isMIAMCoreApp = (x: number): x is MIAMCoreApp =>\n Object.values(MIAMCoreApp).includes(x as MIAMCoreApp);\nconst isMIAMCorePdu = (x: number): x is MIAMCorePdu =>\n Object.values(MIAMCorePdu).includes(x as MIAMCorePdu);\n\ninterface PduDecodingSuccess {\n decoded: true;\n message: {\n data: Pdu;\n };\n}\n\ninterface PduDecodingFailure {\n decoded: false;\n error: string;\n}\n\ntype PduDecodingResult = PduDecodingSuccess | PduDecodingFailure;\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: Record<\n MIAMVersion,\n Record<MIAMCoreApp, number>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n [MIAMVersion.V2]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n };\n\n static FidHandlerTable: Record<MIAMFid, (txt: string) => PduDecodingResult> =\n {\n [MIAMFid.SingleTransfer]: (txt: string) => {\n if (txt.length < 3) {\n return {\n decoded: false,\n error: 'Raw MIAM message too short (' + txt.length + ' < 3) ',\n };\n }\n\n let bpad = txt[0];\n\n if ('0123-.'.indexOf(bpad) === -1) {\n return {\n decoded: false,\n error: \"Invalid body padding value: '\" + bpad + \"'\",\n };\n }\n\n if ('0123'.indexOf(txt[1]) === -1) {\n return {\n decoded: false,\n error: \"Invalid header padding value: '\" + txt[1] + \"'\",\n };\n }\n\n const hpad = parseInt(txt[1]);\n\n const delimIdx = txt.indexOf('|');\n if (delimIdx === -1) {\n return {\n decoded: false,\n error: 'Raw MIAM message missing header-body delimiter',\n };\n }\n\n const rawHdr = txt.substring(2, delimIdx);\n if (rawHdr.length === 0) {\n return {\n decoded: false,\n error: 'Empty MIAM message header',\n };\n }\n\n let hdr = Base85.decode('<~' + rawHdr + '~>', 'ascii85');\n if (!hdr || hdr.length < hpad) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message header',\n };\n }\n\n let body: Buffer | undefined = undefined;\n\n const rawBody = txt.substring(delimIdx + 1);\n if (rawBody.length > 0) {\n if ('0123'.indexOf(bpad) >= 0) {\n const bpadValue = parseInt(bpad);\n\n body = Base85.decode('<~' + rawBody + '~>', 'ascii85') || undefined;\n if (body && body.length >= bpadValue) {\n body = body.subarray(0, body.length - bpadValue);\n }\n } else if (bpad === '-') {\n body = Buffer.from(rawBody);\n }\n }\n\n hdr = hdr.subarray(0, hdr.length - hpad);\n\n const version = hdr.readUInt8(0) & 0xf;\n const pduType = (hdr.readUInt8(0) >> 4) & 0xf;\n\n if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {\n const versionPduHandler =\n this.VersionPduHandlerTable[version][pduType];\n return versionPduHandler(hdr, body);\n } else {\n return {\n decoded: false,\n error:\n 'Invalid version and PDU type combination: v=' +\n version +\n ', pdu=' +\n pduType,\n };\n }\n },\n [MIAMFid.FileTransferRequest]: () => {\n return {\n decoded: false,\n error: 'File Transfer Request not implemented',\n };\n },\n [MIAMFid.FileTransferAccept]: () => {\n return {\n decoded: false,\n error: 'File Transfer Accept not implemented',\n };\n },\n [MIAMFid.FileSegment]: () => {\n return { decoded: false, error: 'File Segment not implemented' };\n },\n [MIAMFid.FileTransferAbort]: () => {\n return { decoded: false, error: 'File Transfer Abort not implemented' };\n },\n [MIAMFid.XOFFIndication]: () => {\n return { decoded: false, error: 'XOFF Indication not implemented' };\n },\n [MIAMFid.XONIndication]: () => {\n return { decoded: false, error: 'XON Indication not implemented' };\n },\n };\n\n private static arincCrc16(buf: Buffer, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,\n 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,\n 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,\n 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,\n 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,\n 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,\n 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,\n 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,\n 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,\n 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,\n 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,\n 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,\n 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[(((crc >>> 8) ^ buf.readUInt8(i)) >>> 0) & 0xff]) >>>\n 0;\n }\n\n return crc & 0xffff;\n }\n\n private static arinc665Crc32(buf: Buffer, seed?: number) {\n const crctable = [\n 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,\n 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,\n 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,\n 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,\n 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,\n 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,\n 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,\n 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,\n 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,\n 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,\n 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,\n 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,\n 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,\n 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,\n 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,\n 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,\n 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,\n 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,\n 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,\n 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,\n 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,\n 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,\n 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,\n 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,\n 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,\n 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,\n 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,\n 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,\n 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,\n 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,\n 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,\n 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,\n 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,\n 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,\n 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,\n 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,\n 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,\n 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,\n 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,\n 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,\n 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,\n 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,\n 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,\n ];\n\n let crc = seed || 0;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[((crc >>> 24) ^ buf.readUInt8(i)) >>> 0]) >>>\n 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string): PduDecodingResult {\n const fidType = txt[0];\n\n if (isMIAMFid(fidType)) {\n const handler = this.FidHandlerTable[fidType];\n return handler(txt.substring(1));\n } else {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n }\n\n private static corePduDataHandler(\n version: MIAMVersion,\n minHdrSize: number,\n crcLen: number,\n hdr: Buffer,\n body?: Buffer,\n ): PduDecodingResult {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error:\n 'v' +\n version +\n ' header size too short; expected >= ' +\n minHdrSize +\n ', got ' +\n hdr.length,\n };\n }\n\n let pduSize: number | undefined = undefined;\n let pduCompression: number = 0;\n let pduEncoding: number = 0;\n let pduAppType: number = 0;\n let pduAppId: string = '';\n let pduCrc: number = 0;\n let pduData: Buffer | null = null;\n let pduCrcIsOk: boolean = false;\n let pduIsComplete: boolean = true;\n\n let pduErrors: string[] = [];\n\n let tail: string | undefined = undefined;\n let msgNum: number = 0;\n let ackOptions: number = 0;\n\n if (version === MIAMVersion.V1) {\n pduSize =\n (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | hdr.readUInt8(3);\n\n const msgSize = hdr.length + (body === undefined ? 0 : body.length);\n if (pduSize > msgSize) {\n pduIsComplete = false;\n pduErrors.push(\n 'v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize,\n );\n }\n hdr = hdr.subarray(4);\n\n tail = hdr.subarray(0, 7).toString('ascii');\n hdr = hdr.subarray(7);\n } else if (version === MIAMVersion.V2) {\n hdr = hdr.subarray(1);\n }\n\n msgNum = (hdr.readUInt8(0) >> 1) & 0x7f;\n ackOptions = hdr.readUInt8(0) & 1;\n hdr = hdr.subarray(1);\n\n pduCompression =\n ((hdr.readUInt8(0) << 2) | ((hdr.readUInt8(1) >> 6) & 0x3)) & 0x7;\n pduEncoding = (hdr.readUInt8(1) >> 4) & 0x3;\n pduAppType = hdr.readUInt8(1) & 0xf;\n hdr = hdr.subarray(2);\n\n let appIdLen;\n if (isMIAMCoreApp(pduAppType)) {\n appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];\n } else {\n if (\n version === MIAMVersion.V2 &&\n (pduAppType & 0x8) !== 0 &&\n pduAppType !== 0xd\n ) {\n appIdLen = (pduAppType & 0x7) + 1;\n } else {\n return {\n decoded: false,\n error: 'Invalid v' + version + ' appType: ' + pduAppType,\n };\n }\n }\n\n const pduIsACARS =\n [\n MIAMCoreApp.ACARS2Char,\n MIAMCoreApp.ACARS4Char,\n MIAMCoreApp.ACARS6Char,\n ].indexOf(pduAppType) >= 0;\n\n if (hdr.length < appIdLen + crcLen) {\n return {\n decoded: false,\n error: 'Header too short for v' + version + ' appType: ' + pduAppType,\n };\n }\n\n pduAppId = hdr.subarray(0, appIdLen).toString('ascii');\n hdr = hdr.subarray(appIdLen);\n\n if (crcLen === 4) {\n pduCrc =\n (hdr.readUInt8(0) << 24) |\n (hdr.readUInt8(1) << 16) |\n (hdr.readUInt8(2) << 8) |\n hdr.readUInt8(3); // crc\n } else if (crcLen === 2) {\n pduCrc = (hdr.readUInt8(0) << 8) | hdr.readUInt8(1); // crc\n }\n hdr = hdr.subarray(crcLen);\n\n if (body !== undefined && body.length > 0) {\n if (\n [MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(\n pduCompression,\n ) >= 0\n ) {\n try {\n const decompress = new zlib.InflateRaw({});\n decompress.write(body);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n pduData = decompress.read();\n } catch (e) {\n pduErrors.push('Inflation failed for body: ' + e);\n }\n } else if (\n [MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(\n pduCompression,\n ) >= 0\n ) {\n pduData = body;\n } else {\n pduErrors.push(\n 'Unsupported v' + version + ' compression type: ' + pduCompression,\n );\n }\n\n if (pduData !== null) {\n const crcAlgoHandlerByVersion: Record<\n MIAMVersion,\n (buf: Buffer, seed?: number) => number\n > = {\n [MIAMVersion.V1]: (buf: Buffer, seed?: number) => {\n return ~this.arinc665Crc32(buf, seed);\n },\n [MIAMVersion.V2]: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n error: 'No CRC handler for v' + version,\n };\n }\n\n const crcCheck = crcAlgoHandler(pduData, 0xffffffff);\n if (crcCheck === pduCrc) {\n pduCrcIsOk = true;\n } else {\n pduErrors.push(\n 'Body failed CRC check: provided=' +\n pduCrc +\n ', generated=' +\n crcCheck,\n );\n }\n }\n } else {\n // No PDU body means we can't verify CRC checksum; however, the message should still be valid...\n pduCrcIsOk = true;\n }\n\n let pdu: Pdu = {\n version,\n crc: pduCrc,\n crcOk: pduCrcIsOk,\n complete: pduIsComplete,\n compression: pduCompression,\n encoding: pduEncoding,\n msgNum,\n ackOptions,\n };\n\n if (pduIsACARS) {\n const label = pduAppId.substring(0, 2);\n const sublabel = appIdLen >= 4 ? pduAppId.substring(2, 4) : undefined;\n const mfi = appIdLen >= 6 ? pduAppId.substring(4, 6) : undefined;\n\n pdu.acars = {\n ...(tail ? { tail } : {}),\n label,\n ...(sublabel ? { sublabel } : {}),\n ...(mfi ? { mfi } : {}),\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n };\n } else {\n pdu.non_acars = {\n appId: pduAppId,\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n };\n }\n\n return {\n decoded: true,\n message: {\n data: pdu,\n },\n };\n }\n\n static VersionPduHandlerTable: Record<\n MIAMVersion,\n Record<MIAMCorePdu, (hdr: Buffer, body?: Buffer) => PduDecodingResult>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => {\n return this.corePduDataHandler(\n MIAMVersion.V1,\n 20,\n MIAMCoreV1CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v1 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v1 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v1 AlohaReply PDU not implemented' };\n },\n },\n [MIAMVersion.V2]: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => {\n return this.corePduDataHandler(\n MIAMVersion.V2,\n 7,\n MIAMCoreV2CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v2 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v2 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v2 Aloha reply PDU not implemented' };\n },\n },\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_MA extends DecoderPlugin {\n name = 'label-ma';\n qualifiers() {\n return {\n labels: ['MA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const miamResult = MIAMCoreUtils.parse(message.text);\n if (\n miamResult.decoded &&\n miamResult.message.data &&\n miamResult.message.data.acars\n ) {\n decodeResult.decoded = true;\n ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);\n if (miamResult.message.data.acars.sublabel) {\n ResultFormatter.sublabel(\n decodeResult,\n miamResult.message.data.acars.sublabel,\n );\n }\n if (miamResult.message.data.acars.tail) {\n ResultFormatter.tail(\n decodeResult,\n miamResult.message.data.acars.tail.replace('.', ''),\n );\n }\n\n const messageText = miamResult.message.data.acars.text;\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (\n miamResult.message.data.crcOk &&\n miamResult.message.data.complete &&\n messageText\n ) {\n decodeResult.decoder.decodeLevel = 'full';\n const decoded = this.decoder.decode(\n {\n label: miamResult.message.data.acars.label,\n sublabel: miamResult.message.data.acars.sublabel,\n text: messageText,\n },\n options,\n );\n\n if (decoded.decoded) {\n // decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n } else {\n ResultFormatter.text(decodeResult, messageText);\n decodeResult.remaining = { text: messageText };\n }\n } else if (messageText) {\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.remaining = { text: messageText };\n } else {\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_SQ extends DecoderPlugin {\n name = 'label-sq';\n\n qualifiers() {\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Ground Station Squitter');\n\n decodeResult.raw.preamble = message.text.substring(0, 4);\n decodeResult.raw.version = Number(message.text.substring(1, 2));\n decodeResult.raw.network = message.text.substring(3, 4);\n\n if (decodeResult.raw.version === 2) {\n const regex =\n /0(\\d)X(?<org>\\w)(?<iata>\\w\\w\\w)(?<icao>\\w\\w\\w\\w)(?<station>\\d)(?<lat>\\d+)(?<latd>[NS])(?<lng>\\d+)(?<lngd>[EW])V(?<vfreq>\\d+)\\/.*/;\n const result = message.text.match(regex);\n\n if (result?.groups && result.length >= 8) {\n decodeResult.raw.groundStation = {\n number: result.groups.station,\n iataCode: result.groups.iata,\n icaoCode: result.groups.icao,\n coordinates: {\n latitude:\n (Number(result.groups.lat) / 100) *\n (result.groups.latd === 'S' ? -1 : 1),\n longitude:\n (Number(result.groups.lng) / 100) *\n (result.groups.lngd === 'W' ? -1 : 1),\n },\n };\n decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1000.0;\n }\n }\n\n var formattedNetwork = 'Unknown';\n if (decodeResult.raw.network == 'A') {\n formattedNetwork = 'ARINC';\n } else if (decodeResult.raw.network == 'S') {\n formattedNetwork = 'SITA';\n }\n decodeResult.formatted.items = [\n {\n type: 'network',\n code: 'NETT',\n label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n code: 'VER',\n label: 'Version',\n value: String(decodeResult.raw.version),\n },\n ];\n\n if (decodeResult.raw.groundStation) {\n if (\n decodeResult.raw.groundStation.icaoCode &&\n decodeResult.raw.groundStation.number\n ) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\n code: 'GNDSTN',\n label: 'Ground Station',\n value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,\n });\n }\n if (decodeResult.raw.groundStation.iataCode) {\n decodeResult.formatted.items.push({\n type: 'iataCode',\n code: 'IATA',\n label: 'IATA',\n value: decodeResult.raw.groundStation.iataCode,\n });\n }\n if (decodeResult.raw.groundStation.icaoCode) {\n decodeResult.formatted.items.push({\n type: 'icaoCode',\n code: 'ICAO',\n label: 'ICAO',\n value: decodeResult.raw.groundStation.icaoCode,\n });\n }\n if (decodeResult.raw.groundStation.coordinates.latitude) {\n decodeResult.formatted.items.push({\n type: 'coordinates',\n code: 'COORD',\n label: 'Ground Station Location',\n value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,\n });\n }\n if (decodeResult.raw.groundStation.airport) {\n decodeResult.formatted.items.push({\n type: 'airport',\n code: 'APT',\n label: 'Airport',\n value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,\n });\n }\n }\n\n if (decodeResult.raw.vdlFrequency) {\n decodeResult.formatted.items.push({\n type: 'vdlFrequency',\n code: 'VDLFRQ',\n label: 'VDL Frequency',\n value: `${decodeResult.raw.vdlFrequency} MHz`,\n });\n }\n this.setDecodeLevel(decodeResult, true, 'full');\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() {\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ON Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.on(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() {\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OUT Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.out(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() {\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'IN Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.in(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() {\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'OFF Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n if (message.text.substring(12, 19) === '\\r\\n001FE') {\n decodeResult.raw.day = message.text.substring(19, 21);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)),\n );\n let latdir = message.text.substring(27, 28);\n let latdeg = Number(message.text.substring(28, 30));\n let latmin = Number(message.text.substring(30, 34));\n let londir = message.text.substring(34, 35);\n let londeg = Number(message.text.substring(35, 38));\n let lonmin = Number(message.text.substring(38, 42));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));\n ResultFormatter.position(decodeResult, pos);\n\n if (decodeResult.remaining.text !== '---') {\n ResultFormatter.groundspeed(\n decodeResult,\n Number(message.text.substring(45, 48)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + '00'),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n }\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n} from './DecoderPluginInterface';\n\nimport * as Plugins from './plugins/official';\n\n/**\n * Ordered list of plugin constructors. Order matters — plugins are tried\n * sequentially until one returns decoded: true.\n */\nconst pluginClasses = [\n Plugins.CBand, // first, for now, so it can wrap other plugins\n Plugins.Arinc702,\n Plugins.Label_ColonComma,\n Plugins.Label_5Z_Slash,\n Plugins.Label_10_LDR,\n Plugins.Label_10_POS,\n Plugins.Label_10_Slash,\n Plugins.Label_12_N_Space,\n Plugins.Label_12_POS,\n Plugins.Label_13Through18_Slash,\n Plugins.Label_15,\n Plugins.Label_15_FST,\n Plugins.Label_16_Honeywell,\n Plugins.Label_16_N_Space,\n Plugins.Label_16_POSA1,\n Plugins.Label_16_TOD,\n Plugins.Label_1L_3Line,\n Plugins.Label_1L_070,\n Plugins.Label_1L_660,\n Plugins.Label_1L_Slash,\n Plugins.Label_20_POS,\n Plugins.Label_21_POS,\n Plugins.Label_22_OFF,\n Plugins.Label_22_POS,\n Plugins.Label_24_Slash,\n Plugins.Label_2P_FM3,\n Plugins.Label_2P_FM4,\n Plugins.Label_2P_FM5,\n Plugins.Label_30_Slash_EA,\n Plugins.Label_44_ETA,\n Plugins.Label_44_IN,\n Plugins.Label_44_OFF,\n Plugins.Label_44_ON,\n Plugins.Label_44_POS,\n Plugins.Label_44_Slash,\n Plugins.Label_4A,\n Plugins.Label_4A_01,\n Plugins.Label_4A_DIS,\n Plugins.Label_4A_DOOR,\n Plugins.Label_4A_Slash_01,\n Plugins.Label_4N,\n Plugins.Label_4T_AGFSR,\n Plugins.Label_4T_ETA,\n Plugins.Label_B6_Forwardslash,\n Plugins.Label_H2_02E,\n Plugins.Label_H1_ATIS,\n Plugins.Label_H1_EZF,\n Plugins.Label_H1_FLR,\n Plugins.Label_H1_M_POS,\n Plugins.Label_H1_OHMA,\n Plugins.Label_H1_OFP,\n Plugins.Label_H1_Paren,\n Plugins.Label_H1_WRN,\n Plugins.Label_H1_StarPOS,\n Plugins.Label_HX,\n Plugins.Label_58,\n Plugins.Label_80,\n Plugins.Label_83,\n Plugins.Label_8E,\n Plugins.Label_1M_Slash,\n Plugins.Label_MA,\n Plugins.Label_SQ,\n Plugins.Label_QP,\n Plugins.Label_QQ,\n Plugins.Label_QR,\n Plugins.Label_QS,\n];\n\nexport class MessageDecoder {\n name: string;\n plugins: Array<DecoderPluginInterface>;\n debug: boolean;\n\n /** Maps a label string to the plugins registered for it, preserving registration order. */\n private labelIndex: Map<string, DecoderPluginInterface[]> = new Map();\n /** Plugins that match all labels (qualifier label '*'). */\n private wildcardPlugins: DecoderPluginInterface[] = [];\n\n constructor() {\n this.name = 'acars-decoder-typescript';\n this.plugins = [];\n this.debug = false;\n\n for (const PluginClass of pluginClasses) {\n this.registerPlugin(new PluginClass(this));\n }\n }\n\n registerPlugin(plugin: DecoderPluginInterface): boolean {\n this.plugins.push(plugin);\n\n const qualifiers = plugin.qualifiers();\n for (const label of qualifiers.labels) {\n if (label === '*') {\n this.wildcardPlugins.push(plugin);\n } else {\n let bucket = this.labelIndex.get(label);\n if (!bucket) {\n bucket = [];\n this.labelIndex.set(label, bucket);\n }\n bucket.push(plugin);\n }\n }\n\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n // Build candidate list: wildcard plugins first (e.g. CBand wrapper),\n // then label-specific plugins, preserving registration order.\n // Use a Set to prevent duplicate execution if a plugin registers both '*' and a specific label.\n const labelPlugins = this.labelIndex.get(message.label) ?? [];\n const seen = new Set<DecoderPluginInterface>();\n const candidates: DecoderPluginInterface[] = [];\n for (const plugin of [...this.wildcardPlugins, ...labelPlugins]) {\n if (!seen.has(plugin)) {\n seen.add(plugin);\n candidates.push(plugin);\n }\n }\n\n const usablePlugins = candidates.filter((plugin) => {\n const preambles = plugin.qualifiers().preambles;\n if (!preambles || preambles.length === 0) {\n return true;\n }\n return preambles.some((p: string) => message.text.startsWith(p));\n });\n\n if (options.debug) {\n console.log('Usable plugins');\n console.log(usablePlugins);\n }\n\n let result: DecodeResult = {\n decoded: false,\n error: 'No known decoder plugin for this message',\n decoder: {\n name: 'none',\n type: 'none',\n decodeLevel: 'none',\n },\n message: message,\n remaining: {\n text: message.text,\n },\n raw: {},\n formatted: {\n description: 'Not Decoded',\n items: [],\n },\n };\n\n for (let i = 0; i < usablePlugins.length; i++) {\n const plugin = usablePlugins[i];\n result = plugin.decode(message, options);\n if (result.decoded) {\n break;\n }\n }\n\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n}\n"],"mappings":"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Q;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1B;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aACK,OAAO,MAAO,IACf,UAAY,QAAQ,IAAK,IAAI,UAAU,CAAC,OAAO,IAAK,GAAI,OAC1D;AAAA,IACJ;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAa,MAAe;AACvD,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,M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","names":["data","zlib","import_node_buffer","MIAMVersion","MIAMFid","MIAMCorePdu","MIAMCoreApp"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../lib/IcaoDecoder.ts","../lib/utils/coordinate_utils.ts","../lib/DateTimeUtils.ts","../lib/utils/route_utils.ts","../lib/utils/result_formatter.ts","../lib/DecoderPlugin.ts","../lib/plugins/CBand.ts","../lib/utils/flight_plan_utils.ts","../lib/utils/arinc_702_helper.ts","../lib/plugins/ARINC_702.ts","../lib/plugins/Label_5Z_Slash.ts","../lib/plugins/Label_10_LDR.ts","../lib/plugins/Label_10_POS.ts","../lib/plugins/Label_10_Slash.ts","../lib/plugins/Label_12_N_Space.ts","../lib/plugins/Label_12_POS.ts","../lib/plugins/Label_13Through18_Slash.ts","../lib/plugins/Label_15.ts","../lib/plugins/Label_15_FST.ts","../lib/plugins/Label_16_Honeywell.ts","../lib/plugins/Label_16_N_Space.ts","../lib/plugins/Label_16_POSA1.ts","../lib/plugins/Label_16_TOD.ts","../lib/plugins/Label_1M_Slash.ts","../lib/plugins/Label_1L_3-line.ts","../lib/plugins/Label_1L_070.ts","../lib/plugins/Label_1L_660.ts","../lib/plugins/Label_1L_Slash.ts","../lib/plugins/Label_20_POS.ts","../lib/plugins/Label_21_POS.ts","../lib/plugins/Label_22_OFF.ts","../lib/plugins/Label_22_POS.ts","../lib/plugins/Label_2P_FM3.ts","../lib/plugins/Label_2P_FM4.ts","../lib/plugins/Label_2P_FM5.ts","../lib/plugins/Label_24_Slash.ts","../lib/plugins/Label_30_Slash_EA.ts","../lib/plugins/Label_44_ETA.ts","../lib/plugins/Label_44_Base.ts","../lib/plugins/Label_44_IN.ts","../lib/plugins/Label_44_OFF.ts","../lib/plugins/Label_44_ON.ts","../lib/plugins/Label_44_POS.ts","../lib/plugins/Label_44_Slash.ts","../lib/plugins/Label_4A.ts","../lib/plugins/Label_4A_01.ts","../lib/plugins/Label_4A_DIS.ts","../lib/plugins/Label_4A_DOOR.ts","../lib/plugins/Label_4A_Slash_01.ts","../lib/plugins/Label_4N.ts","../lib/plugins/Label_4T_AGFSR.ts","../lib/plugins/Label_58.ts","../lib/plugins/Label_4T_ETA.ts","../lib/plugins/Label_80.ts","../lib/plugins/Label_83.ts","../lib/plugins/Label_8E.ts","../lib/plugins/Label_B6.ts","../lib/plugins/Label_ColonComma.ts","../lib/plugins/Label_H2_02E.ts","../lib/plugins/Label_H1_ATIS.ts","../lib/plugins/Label_H1_EZF.ts","../lib/plugins/Label_H1_FLR.ts","../lib/plugins/Label_H1_M_POS.ts","../lib/utils/compression.ts","../lib/plugins/Label_H1_OHMA.ts","../lib/utils/icao_fpl_utils.ts","../lib/plugins/Label_H1_OFP.ts","../lib/plugins/Label_H1_Paren.ts","../lib/plugins/Label_H1_StarPOS.ts","../lib/plugins/Label_H1_WRN.ts","../lib/plugins/Label_HX.ts","../lib/utils/ascii85.ts","../lib/utils/miam.ts","../lib/plugins/Label_MA.ts","../lib/plugins/Label_SQ.ts","../lib/plugins/Label_QR.ts","../lib/plugins/Label_QP.ts","../lib/plugins/Label_QS.ts","../lib/plugins/Label_QQ.ts","../lib/MessageDecoder.ts"],"sourcesContent":["export * from './lib/IcaoDecoder';\nexport * from './lib/MessageDecoder';\n","export class IcaoDecoder {\n name: string;\n icao: string;\n\n // Military ICAO address ranges (as [start, end] tuples, inclusive)\n private static readonly MILITARY_RANGES: Array<[number, number]> = [\n [0x010070, 0x01008f], // Egypt\n [0x0a4000, 0x0a4fff], // Algeria\n [0x33ff00, 0x33ffff], // Italy\n [0x350000, 0x37ffff], // Spain\n [0x3aa000, 0x3affff], // France 1\n [0x3b7000, 0x3bffff], // France 2\n [0x3ea000, 0x3ebfff], // Germany 1\n [0x3f4000, 0x3fbfff], // Germany 2\n [0x400000, 0x40003f], // UK 1\n [0x43c000, 0x43cfff], // UK 2\n [0x444000, 0x446fff], // Austria\n [0x44f000, 0x44ffff], // Belgium\n [0x457000, 0x457fff], // Bulgaria\n [0x45f400, 0x45f4ff], // Denmark\n [0x468000, 0x4683ff], // Greece\n [0x473c00, 0x473c0f], // Hungary\n [0x478100, 0x4781ff], // Norway\n [0x480000, 0x480fff], // Netherlands\n [0x48d800, 0x48d87f], // Poland\n [0x497c00, 0x497cff], // Portugal\n [0x498420, 0x49842f], // Czech\n [0x4b7000, 0x4b7fff], // Switzerland\n [0x4b8200, 0x4b82ff], // Turkey\n [0x70c070, 0x70c07f], // Oman\n [0x710258, 0x71028f], // Saudi 1\n [0x710380, 0x71039f], // Saudi 2\n [0x738a00, 0x738aff], // Israel\n [0x7cf800, 0x7cfaff], // Australia\n [0x800200, 0x8002ff], // India\n [0xadf7c8, 0xafffff], // USA\n [0xc20000, 0xc3ffff], // Canada\n [0xe40000, 0xe41fff], // Brazil\n ];\n\n constructor(icao: string) {\n this.name = 'icao-decoder-typescript';\n this.icao = icao;\n }\n\n isMilitary(): boolean {\n const i = this.icao;\n const n = parseInt(i, 16);\n for (const [start, end] of IcaoDecoder.MILITARY_RANGES) {\n if (start <= n && n <= end) {\n return true;\n }\n }\n return false;\n }\n}\n","export class CoordinateUtils {\n /**\n * Decode a string of coordinates into an object with latitude and longitude in millidegrees\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinates(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.charAt(0);\n let middleChar = stringCoords.charAt(6);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar === ' ') {\n middleChar = stringCoords.charAt(7);\n longitudeChars = stringCoords.substring(8, 14);\n }\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (Number(stringCoords.substring(1, 6)) / 1000) *\n CoordinateUtils.getDirection(firstChar),\n longitude:\n (Number(longitudeChars) / 1000) *\n CoordinateUtils.getDirection(middleChar),\n };\n }\n\n return undefined;\n }\n\n /**\n * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinatesDecimalMinutes(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.charAt(0);\n let middleChar = stringCoords.charAt(6);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar === ' ') {\n middleChar = stringCoords.charAt(7);\n longitudeChars = stringCoords.substring(8, 14);\n }\n\n if (\n (firstChar !== 'N' && firstChar !== 'S') ||\n (middleChar !== 'W' && middleChar !== 'E')\n ) {\n return undefined;\n }\n\n const latRaw = Number(stringCoords.substring(1, 6));\n const lonRaw = Number(longitudeChars);\n const latDeg = Math.trunc(latRaw / 1000);\n const latMin = (latRaw % 1000) / 10;\n const lonDeg = Math.trunc(lonRaw / 1000);\n const lonMin = (lonRaw % 1000) / 10;\n\n return {\n latitude:\n (latDeg + latMin / 60) * CoordinateUtils.getDirection(firstChar),\n longitude:\n (lonDeg + lonMin / 60) * CoordinateUtils.getDirection(middleChar),\n };\n }\n public static coordinateString(coords: {\n latitude: number;\n longitude: number;\n }): string {\n const latDir = coords.latitude > 0 ? 'N' : 'S';\n const lonDir = coords.longitude > 0 ? 'E' : 'W';\n return `${Math.abs(coords.latitude).toFixed(3)} ${latDir}, ${Math.abs(coords.longitude).toFixed(3)} ${lonDir}`;\n }\n\n public static getDirection(coord: string): number {\n if (coord.startsWith('N') || coord.startsWith('E')) {\n return 1;\n } else if (coord.startsWith('S') || coord.startsWith('W')) {\n return -1;\n }\n return NaN;\n }\n\n public static dmsToDecimalDegrees(\n degrees: number,\n minutes: number,\n seconds: number,\n ): number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}\n","export class DateTimeUtils {\n // Expects a four digit UTC time string (HHMM)\n public static UTCToString(UTCString: string) {\n let utcDate = new Date();\n utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);\n return utcDate.toTimeString();\n }\n\n // Expects a six digit date string and a four digit UTC time string\n // (DDMMYY) (HHMM)\n public static UTCDateTimeToString(dateString: string, timeString: string) {\n const day = +dateString.substr(0, 2);\n // ACARS month is 1-12; JS Date months are 0-11, so subtract one.\n const month = +dateString.substr(2, 2) - 1;\n const year =\n dateString.length === 6\n ? 2000 + +dateString.substr(4, 2)\n : new Date().getUTCFullYear();\n const hours = +timeString.substr(0, 2);\n const minutes = +timeString.substr(2, 2);\n const seconds = timeString.length === 6 ? +timeString.substr(4, 2) : 0;\n // Build the date in one call so an incremental setUTC* on a Date that\n // was initialised to \"now\" can't roll the month forward when the\n // current real-world day is later than the last day of the target.\n const utcDate = new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n return utcDate.toUTCString();\n }\n\n /**\n *\n * @param time HHMMSS or HHMM\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number {\n if (time.length === 4) {\n time += '00';\n }\n const h = Number(time.substring(0, 2));\n const m = Number(time.substring(2, 4));\n const s = Number(time.substring(4, 6));\n const tod = h * 3600 + m * 60 + s;\n return tod;\n }\n\n public static convertDayTimeToTod(time: string): number {\n const d = Number(time.substring(0, 2));\n const h = Number(time.substring(2, 4));\n const m = Number(time.substring(4, 6));\n const s = Number(time.substring(6, 8));\n const tod = d * 86400 + h * 3600 + m * 60 + s;\n return tod;\n }\n\n /**\n *\n * @param time HHMMSS\n * @param date DDMMYY or DDMMYYYY\n * @returns seconds since epoch\n */\n public static convertDateTimeToEpoch(time: string, date: string): number {\n //YYYY-MM-DDTHH:mm:ss.sssZ\n if (date.length === 6) {\n date = date.substring(0, 4) + `20${date.substring(4, 6)}`;\n }\n const timestamp = `${date.substring(4, 8)}-${date.substring(2, 4)}-${date.substring(0, 2)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;\n const millis = Date.parse(timestamp);\n return millis / 1000;\n }\n\n /**\n * Converts a timestamp to a string\n *\n * ISO-8601 format for 'epoch'\n * HH:MM:SS for 'tod'\n * @param time\n * @param format\n * @returns\n */\n public static timestampToString(time: number): string {\n const date = new Date(time * 1000);\n\n if (time < 86400) {\n // only time, no date\n return date.toISOString().slice(11, 19);\n }\n if (time < 2678400) {\n // unknown month and date\n return `YYYY-MM-${date.toISOString().slice(8, 19)}`;\n }\n //strip off millis\n return date.toISOString().slice(0, -5) + 'Z';\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { Route } from '../types/route';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from './coordinate_utils';\n\nexport class RouteUtils {\n public static formatFlightState(state: string): string {\n switch (state) {\n case 'TO':\n return 'Takeoff';\n case 'IC':\n return 'Initial Climb';\n case 'CL':\n return 'Climb';\n case 'ER':\n return 'En Route';\n case 'DC':\n return 'Descent';\n case 'AP':\n return 'Approach';\n default:\n return `Unknown ${state}`;\n }\n }\n\n public static routeToString(route: Route): string {\n let str = '';\n if (route.name) {\n str += route.name;\n }\n if (route.runway) {\n str += `(${route.runway})`;\n }\n if (str.length !== 0 && route.waypoints && route.waypoints.length === 1) {\n str += ' starting at ';\n } else if (str.length !== 0 && route.waypoints) {\n str += ': ';\n }\n\n if (route.waypoints) {\n str += RouteUtils.waypointsToString(route.waypoints);\n }\n\n return str;\n }\n\n public static waypointToString(waypoint: Waypoint): string {\n let s = waypoint.name;\n if (waypoint.latitude && waypoint.longitude) {\n s += `(${CoordinateUtils.coordinateString({ latitude: waypoint.latitude, longitude: waypoint.longitude })})`;\n }\n if (waypoint.offset) {\n s += `[${waypoint.offset.bearing}° ${waypoint.offset.distance}nm]`;\n }\n if (waypoint.time) {\n s += `@${DateTimeUtils.timestampToString(waypoint.time)}`;\n }\n return s;\n }\n\n public static getWaypoint(leg: string): Waypoint {\n const regex = leg.match(/^([A-Z]+)(\\d{3})-(\\d{4})$/); // {name}{bearing}-{distance}\n if (regex?.length == 4) {\n return {\n name: regex[1],\n offset: {\n bearing: parseInt(regex[2]),\n distance: parseInt(regex[3]) / 10,\n },\n };\n }\n\n const waypoint = leg.split(',');\n if (waypoint.length == 2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n waypoint[1],\n );\n if (position) {\n return {\n name: waypoint[0],\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n if (leg.length == 13 || leg.length == 14) {\n //looks like coordinates\n const position =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if (position) {\n return {\n name: name,\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n return { name: leg };\n }\n\n private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints\n .map((x) => RouteUtils.waypointToString(x))\n .join(' > ')\n .replaceAll('> >', '>>');\n if (str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { RouteUtils } from './route_utils';\nimport { Route } from '../types/route';\nimport { Wind } from '../types/wind';\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n static route(decodeResult: DecodeResult, route: Route) {\n decodeResult.raw.route = route;\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(route),\n });\n }\n\n static state_change(decodeResult: DecodeResult, from: string, to: string) {\n decodeResult.raw.state_change = {\n from: from,\n to: to,\n };\n from = RouteUtils.formatFlightState(from);\n to = RouteUtils.formatFlightState(to);\n decodeResult.formatted.items.push({\n type: 'state_change',\n code: 'STATE_CHANGE',\n label: 'State Change',\n value: `${from} -> ${to}`,\n });\n }\n\n static door_event(decodeResult: DecodeResult, name: string, state: string) {\n decodeResult.raw.door_event = {\n door: name,\n state: state,\n };\n\n decodeResult.formatted.items.push({\n type: 'door_event',\n code: 'DOOR',\n label: 'Door Event',\n value: `${name} ${state}`,\n });\n }\n\n static position(\n decodeResult: DecodeResult,\n value: { latitude: number; longitude: number } | undefined,\n ) {\n if (!value || isNaN(value.latitude) || isNaN(value.longitude)) {\n return;\n }\n decodeResult.raw.position = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(value),\n });\n }\n\n static altitude(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.altitude = value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n }\n\n static flightNumber(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.flight_number = value;\n decodeResult.formatted.items.push({\n type: 'flight_number',\n code: 'FLIGHT',\n label: 'Flight Number',\n value: decodeResult.raw.flight_number,\n });\n }\n\n static callsign(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.callsign = value;\n decodeResult.formatted.items.push({\n type: 'callsign',\n code: 'CALLSIGN',\n label: 'Callsign',\n value: decodeResult.raw.callsign,\n });\n }\n\n static departureAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n } else {\n decodeResult.raw.departure_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n }\n }\n\n static departureRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'DEPRWY',\n label: 'Departure Runway',\n value: decodeResult.raw.departure_runway,\n });\n }\n\n static arrivalAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n } else {\n decodeResult.raw.arrival_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n }\n }\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n }\n\n static eta(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.eta_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static arrivalRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ARWY',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n }\n\n static alternateRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ALT_ARWY',\n label: 'Alternate Runway',\n value: decodeResult.raw.alternate_runway,\n });\n }\n\n static currentFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_on_board = value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: 'Fuel On Board',\n value: decodeResult.raw.fuel_on_board.toString(),\n });\n }\n\n static burnedFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_burned = value;\n decodeResult.formatted.items.push({\n type: 'fuel_burned',\n code: 'FB',\n label: 'Fuel Burned',\n value: decodeResult.raw.fuel_burned.toString(),\n });\n }\n\n static remainingFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n code: 'FUEL_REM',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n }\n\n static outFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.out_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_OUT',\n label: 'Out of Gate Fuel',\n value: decodeResult.raw.out_fuel.toString() + ' lbs',\n });\n }\n\n static offFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.off_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_OFF',\n label: 'Takeoff Fuel',\n value: decodeResult.raw.off_fuel.toString() + ' lbs',\n });\n }\n\n static onFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.on_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_ON',\n label: 'Landing Fuel',\n value: decodeResult.raw.on_fuel.toString() + ' lbs',\n });\n }\n\n static inFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.in_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_IN',\n label: 'In Gate Fuel',\n value: decodeResult.raw.in_fuel.toString() + ' lbs',\n });\n }\n\n static startFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.start_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_START',\n label: 'Start Fuel',\n value: decodeResult.raw.start_fuel.toString() + ' lbs',\n });\n }\n\n static checksumAlgorithm(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.checksum_algorithm = value;\n // decodeResult.formatted.items.push({\n // type: 'message_checksum_algorithm',\n // code: 'CHECKSUM_ALGO',\n // label: 'Checksum Algorithm',\n // value: decodeResult.raw.checksum_algorithm,\n // });\n }\n\n static checksum(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.checksum = value;\n decodeResult.formatted.items.push({\n type: 'message_checksum',\n code: 'CHECKSUM',\n label: 'Message Checksum',\n value: '0x' + ('0000' + decodeResult.raw.checksum.toString(16)).slice(-4),\n });\n }\n\n static groundspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.groundspeed = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_groundspeed',\n code: 'GSPD',\n label: 'Aircraft Groundspeed',\n value: `${decodeResult.raw.groundspeed} knots`,\n });\n }\n\n static airspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.airspeed = value;\n decodeResult.formatted.items.push({\n type: 'airspeed',\n code: 'ASPD',\n label: 'True Airspeed',\n value: `${decodeResult.raw.airspeed} knots`,\n });\n }\n\n static mach(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.mach = value;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MACH',\n label: 'Mach Number',\n value: `${decodeResult.raw.mach} mach`,\n });\n }\n\n static temperature(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.outside_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'outside_air_temperature',\n code: 'OATEMP',\n label: 'Outside Air Temperature (C)',\n value: `${decodeResult.raw.outside_air_temperature} degrees`,\n });\n }\n\n static totalAirTemp(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.total_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'temperature',\n code: 'TATEMP',\n label: 'Total Air Temperature (C)',\n value: `${decodeResult.raw.total_air_temperature} degrees`,\n });\n }\n\n static heading(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.heading = value;\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: 'Heading',\n value: `${decodeResult.raw.heading}`,\n });\n }\n\n static tail(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.tail = value;\n decodeResult.formatted.items.push({\n type: 'tail',\n code: 'TAIL',\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n }\n\n static out(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.out_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static off(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.off_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.on_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ON',\n label: 'Landing Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.in_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'IN',\n label: 'In Gate Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static engineStart(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.engine_start_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ENG_START',\n label: 'Engine Start Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n static engineStop(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.engine_stop_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ENG_STOP',\n label: 'Engine Stop Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static day(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'MSG_DAY',\n label: 'Day of Month',\n value: `${day}`,\n });\n }\n\n static month(decodeResult: DecodeResult, month: number) {\n decodeResult.raw.month = month;\n decodeResult.formatted.items.push({\n type: 'month',\n code: 'MSG_MON',\n label: 'Month of Year',\n value: `${month}`,\n });\n }\n\n static departureDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.departure_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'DEP_DAY',\n label: 'Departure Day',\n value: `${day}`,\n });\n }\n\n static arrivalDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.arrival_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'ARR_DAY',\n label: 'Arrival Day',\n value: `${day}`,\n });\n }\n\n static text(decodeResult: DecodeResult, text: string) {\n decodeResult.raw.text = text;\n decodeResult.formatted.items.push({\n type: 'text',\n code: 'TEXT',\n label: 'Text Message',\n value: text,\n });\n }\n\n static mac(decodeResult: DecodeResult, mac: number) {\n decodeResult.raw.mac = mac;\n decodeResult.formatted.items.push({\n type: 'mac',\n code: 'MAC',\n label: 'Mean Aerodynamic Chord',\n value: `${mac} %`,\n });\n }\n\n static trim(decodeResult: DecodeResult, trim: number) {\n decodeResult.raw.trim = trim;\n decodeResult.formatted.items.push({\n type: 'trim',\n code: 'TRIM',\n label: 'Trim',\n value: `${trim} units`,\n });\n }\n\n static windData(decodeResult: DecodeResult, windData: Wind[]) {\n decodeResult.raw.wind_data = windData;\n for (const wind of windData) {\n let text = `${RouteUtils.waypointToString(wind.waypoint)} at FL${wind.flightLevel}: ${wind.windDirection}° at ${wind.windSpeed}kt`;\n if (wind.temperature) {\n text += `, ${wind.temperature.degreesC}°C at FL${wind.temperature.flightLevel}`;\n }\n decodeResult.formatted.items.push({\n type: 'wind_data',\n code: 'WIND',\n label: 'Wind Data',\n value: text,\n });\n }\n }\n\n static cg(\n decodeResult: DecodeResult,\n value: number,\n type: 'center' | 'lower' | 'upper' = 'center',\n ) {\n switch (type) {\n case 'center':\n decodeResult.raw.center_of_gravity = value;\n decodeResult.formatted.items.push({\n type: 'center_of_gravity',\n code: 'CG',\n label: 'Center of Gravity',\n value: `${decodeResult.raw.center_of_gravity} %`,\n });\n break;\n case 'lower':\n decodeResult.raw.cg_lower_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_lower_limit',\n code: 'CG_LOWER',\n label: 'Center of Gravity Lower Limit',\n value: `${decodeResult.raw.cg_lower_limit} %`,\n });\n break;\n case 'upper':\n decodeResult.raw.cg_upper_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_upper_limit',\n code: 'CG_UPPER',\n label: 'Center of Gravity Upper Limit',\n value: `${decodeResult.raw.cg_upper_limit} %`,\n });\n break;\n }\n }\n\n static version(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.version = value;\n decodeResult.formatted.items.push({\n type: 'version',\n code: 'VERSION',\n label: 'Message Version',\n value: `v${decodeResult.raw.version.toFixed(1)}`,\n });\n }\n\n static label(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.label = value;\n decodeResult.formatted.items.push({\n type: 'label',\n code: 'LABEL',\n label: 'Message Label',\n value: `${decodeResult.raw.label}`,\n });\n }\n\n static sublabel(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.sublabel = value;\n decodeResult.formatted.items.push({\n type: 'sublabel',\n code: 'SUBLABEL',\n label: 'Message Sublabel',\n value: `${decodeResult.raw.sublabel}`,\n });\n }\n\n static requestedAltitudes(decodeResult: DecodeResult, values: number[]) {\n decodeResult.raw.requested_alts = values;\n decodeResult.formatted.items.push({\n type: 'requested_altitudes',\n code: 'REQ_ALTS',\n label: 'Requested Altitudes',\n value: `${decodeResult.raw.requested_alts.join(', ')}`,\n });\n }\n\n static desiredAltitude(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.desired_alt = value;\n decodeResult.formatted.items.push({\n type: 'desired_altitude',\n code: 'DES_ALT',\n label: 'Desired Altitude',\n value: `${decodeResult.raw.desired_alt}`,\n });\n }\n\n static startPoint(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.start_point = value;\n decodeResult.formatted.items.push({\n type: 'start_point',\n code: 'START',\n label: 'Start Point',\n value: `${decodeResult.raw.start_point}`,\n });\n }\n\n static routeNumber(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.route_number = value;\n decodeResult.formatted.items.push({\n type: 'route_number',\n code: 'RTE_NUM',\n label: 'Route Number',\n value: `${decodeResult.raw.route_number}`,\n });\n }\n\n static flightPlan(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.flight_plan = value;\n decodeResult.formatted.items.push({\n type: 'flight_plan',\n code: 'FPN',\n label: 'Flight Plan',\n value: `${decodeResult.raw.flight_plan}`,\n });\n }\n\n static groundAddress(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.ground_address = value;\n decodeResult.formatted.items.push({\n type: 'ground_address',\n code: 'GND_ADDR',\n label: 'Ground Address',\n value: `${decodeResult.raw.ground_address}`,\n });\n }\n\n static timestamp(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.message_timestamp = value;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'TIMESTAMP',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(value),\n });\n }\n\n static sequenceNumber(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.sequence_number = value;\n decodeResult.formatted.items.push({\n type: 'sequence',\n code: 'SEQ',\n label: 'Sequence Number',\n value: decodeResult.raw.sequence_number.toString(),\n });\n }\n\n static sequenceResponse(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.sequence_response = value;\n decodeResult.formatted.items.push({\n type: 'sequence',\n code: 'SEQ_RESP',\n label: 'Sequence Response',\n value: decodeResult.raw.sequence_response.toString(),\n });\n }\n\n static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') {\n if (!decodeResult.remaining.text) decodeResult.remaining.text = value;\n else decodeResult.remaining.text += sep + value;\n }\n\n static unknownArr(\n decodeResult: DecodeResult,\n value: string[],\n sep: string = ',',\n ) {\n this.unknown(decodeResult, value.join(sep), sep);\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n Qualifiers,\n} from './DecoderPluginInterface';\nimport { ResultFormatter } from './utils/result_formatter';\nimport { MessageDecoder } from './MessageDecoder';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: MessageDecoder;\n\n name: string = 'unknown';\n\n defaultResult(): DecodeResult {\n return {\n decoded: false,\n decoder: {\n name: 'unknown',\n type: 'pattern-match',\n decodeLevel: 'none',\n },\n formatted: {\n description: 'Unknown',\n items: [],\n },\n raw: {},\n remaining: {},\n };\n }\n\n /**\n * Creates a DecodeResult pre-populated with the plugin name, description, and message.\n * Replaces the common boilerplate at the start of every decode() method.\n */\n protected initResult(message: Message, description: string): DecodeResult {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.formatted.description = description;\n result.message = message;\n return result;\n }\n\n /**\n * Sets the decoded flag and decodeLevel on a result.\n * If decoded is true and no explicit level is given, infers 'full' or 'partial'\n * based on whether remaining.text is set.\n */\n protected setDecodeLevel(\n result: DecodeResult,\n decoded: boolean,\n level?: 'full' | 'partial',\n ): void {\n result.decoded = decoded;\n if (decoded) {\n result.decoder.decodeLevel =\n level ?? (result.remaining.text ? 'partial' : 'full');\n } else {\n result.decoder.decodeLevel = 'none';\n }\n }\n\n /**\n * Logs a debug message prefixed with the plugin name, only if options.debug is true.\n */\n protected debug(options: Options, ...args: unknown[]): void {\n if (options.debug) {\n console.log(`[${this.name}]`, ...args);\n }\n }\n\n /**\n * Marks a result as a failed decode with 'none' level, sets the remaining text\n * as unknown, and logs a debug message. Returns the result for convenient early return.\n */\n protected failUnknown(\n result: DecodeResult,\n text: string,\n options: Options = {},\n ): DecodeResult {\n this.debug(options, `Unknown message: ${text}`);\n ResultFormatter.unknown(result, text);\n result.decoded = false;\n result.decoder.decodeLevel = 'none';\n return result;\n }\n\n options: object;\n\n constructor(decoder: MessageDecoder, options: Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id(): string {\n console.log(\n 'DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!',\n );\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements(): boolean {\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers(): Qualifiers {\n const labels: Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// C-Band puts a 10 char header in front of some message types:\n// chars 0-3: message number ([A-Z]\\d{2}[A-Z])\n// chars 4-5: airline code ([A-Z0-9]{2})\n// chars 6-9: flight number ([0-9]{4})\n// Hoisted to module scope so the pattern is allocated once instead of on\n// every wildcard decode invocation.\nconst CBAND_HEADER =\n /^(?<msgno>[A-Z]\\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/;\n\nexport class CBand extends DecoderPlugin {\n name = 'c-band';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const text = message.text;\n // Cheap length check before running the regex — a C-Band header is\n // exactly 10 chars and is followed by the wrapped payload.\n if (text.length < 10) {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.message = message;\n return result;\n }\n\n const cband = CBAND_HEADER.exec(text);\n if (!cband?.groups) {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.message = message;\n return result;\n }\n\n const decoded = this.decoder.decode(\n {\n label: message.label,\n sublabel: message.sublabel,\n text: text.substring(10),\n },\n options,\n );\n\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (decoded.decoded) {\n ResultFormatter.flightNumber(\n decodeResult,\n cband.groups.airline + Number(cband.groups.number),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.decoder.name = this.name + '-' + decoded.decoder.name;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.description = decoded.formatted.description;\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n }\n return decodeResult;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\nexport class FlightPlanUtils {\n /**\n * Processes flight plan data\n *\n * Expected format is [header, fpei, val1, ... fpeiN, valN]\n *\n * @see https://atlaske-content.garmin.com/filestorage//email/outbound/attachments/GTN_Flight_Plan_and_User_Waypoint_transfer_Time1712844670119.pdf\n * @param decodeResult - results\n * @param data - original message split by ':'\n * @returns whether all fields were processed or not\n */\n public static processFlightPlan(\n decodeResult: DecodeResult,\n data: string[],\n ): boolean {\n let allKnownFields = FlightPlanUtils.parseHeader(decodeResult, data[0]);\n for (let i = 1; i < data.length; i += 2) {\n const fpei = data[i];\n const value = data[i + 1];\n // TODO: discuss how store commented out bits as both raw and formatted\n switch (fpei) {\n case 'A': // Arrival Procedure (?)\n FlightPlanUtils.addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n FlightPlanUtils.addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n FlightPlanUtils.addProcedure(decodeResult, value, 'departure');\n break;\n case 'DA':\n addDepartureAirport(decodeResult, value);\n break;\n case 'F': // First Waypoint\n addRoute(decodeResult, value);\n break;\n case 'FP':\n ResultFormatter.flightPlan(decodeResult, value.trim());\n break;\n case 'R':\n addRunway(decodeResult, value);\n break;\n // case 'WS': // something about routes, has altitude, so current parsing won't work\n // break;\n default:\n if (allKnownFields) {\n decodeResult.remaining.text = '';\n allKnownFields = false;\n }\n decodeResult.remaining.text += `:${fpei}:${value}`;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return allKnownFields;\n }\n public static parseHeader(\n decodeResult: DecodeResult,\n header: string,\n ): boolean {\n let allKnownFields = true;\n if (header.startsWith('RF')) {\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Filed',\n });\n decodeResult.raw.route_status = 'RF';\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RP')) {\n decodeResult.raw.route_status = 'RP';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Planned',\n });\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RI')) {\n decodeResult.raw.route_status = 'RI';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Inactive',\n });\n } else if (header.startsWith('RM')) {\n decodeResult.raw.route_status = 'RM';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Mapped',\n });\n } else if (header.startsWith('RS')) {\n decodeResult.raw.route_status = 'RS';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Saved',\n });\n } else {\n decodeResult.remaining.text += header;\n allKnownFields = false;\n }\n return allKnownFields;\n }\n\n public static addProcedure(\n decodeResult: DecodeResult,\n value: string,\n type: string,\n ) {\n if (decodeResult.raw.procedures === undefined) {\n decodeResult.raw.procedures = [];\n }\n const data = value.split('.');\n let waypoints;\n if (data.length > 1) {\n waypoints = data.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n const route = { name: data[0], waypoints: waypoints };\n decodeResult.raw.procedures.push({ type: type, route: route });\n const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);\n decodeResult.formatted.items.push({\n type: 'procedure',\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\n });\n }\n}\n\nfunction addArrivalAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.arrivalAirport(decodeResult, value);\n}\n\nfunction addDepartureAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.departureAirport(decodeResult, value);\n}\n\nfunction addRunway(decodeResult: DecodeResult, value: string) {\n // xxx(yyy) where xxx is the departure runway and yyy is the arrival runway\n if (value.length === 8) {\n ResultFormatter.arrivalRunway(decodeResult, value.substring(4, 7));\n }\n\n ResultFormatter.departureRunway(decodeResult, value.substring(0, 3));\n}\n\nfunction addRoute(decodeResult: DecodeResult, value: string) {\n const route = value.split('.');\n ResultFormatter.route(decodeResult, {\n waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)),\n });\n}\n\nfunction addCompanyRoute(decodeResult: DecodeResult, value: string) {\n const segments = value.split('.');\n const parens_idx = segments[0].indexOf('(');\n let name;\n let runway;\n if (parens_idx === -1) {\n name = segments[0];\n } else {\n name = segments[0].slice(0, parens_idx);\n runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(')'));\n }\n let waypoints;\n if (segments.length > 1) {\n waypoints = segments.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n decodeResult.raw.company_route = {\n name: name,\n runway: runway,\n waypoints: waypoints,\n };\n decodeResult.formatted.items.push({\n type: 'company_route',\n code: 'CR',\n label: 'Company Route',\n value: RouteUtils.routeToString(decodeResult.raw.company_route),\n });\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { FlightPlanUtils } from './flight_plan_utils';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\n// One byte per ASCII char — replaces the Buffer.from(data, 'ascii') idiom so\n// the CRC helpers run in browser / Deno / Bun / edge runtimes without Node\n// polyfills. Matches the broader Web APIs migration in c78b720.\nfunction asciiStringToBytes(data: string): Uint8Array {\n const bytes = new Uint8Array(data.length);\n for (let i = 0; i < data.length; i++) bytes[i] = data.charCodeAt(i) & 0xff;\n return bytes;\n}\n\n/**\n * Helper class for decoding ARINC 702 messages\n * contains core logic for decoding different types of ARINC 702 messages,\n * as well as utility functions for processing common fields\n *\n * Core format:\n * IMI/IEIdata/IEIdata/...checksum\n */\nexport class Arinc702Helper {\n /**\n * Decodes an ARINC 702 message\n *\n * Steps:\n * 1. Check against known checksum algorithms to determine if message is valid\n * 2. Parse the Imbedded Message Identifier (IMI) to determine the type of message\n * 3. Iterate through the Information Elements (IEI) and decode known fields, while storing unknown fields for further analysis\n *\n * @param decodeResult - object to store decoded results in\n * @param message - message to decode\n * @returns boolean indicating if the message was successfully decoded\n */\n public static decodeH1Message(decodeResult: DecodeResult, message: string) {\n decodeResult.remaining.text = '';\n const checksum = parseInt(message.slice(-4), 16);\n const data = message.slice(0, message.length - 4);\n let checksumAlgorithmUsed = '';\n if (crc16IbmSdlcRev(data) === checksum) {\n // ACARS/VDL2/HFDL/Iridium\n checksumAlgorithmUsed = 'IBM-SDLC reversed';\n } else if (crc16Genibus(data) === checksum) {\n // inmarsat\n checksumAlgorithmUsed = 'GENIBUS';\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n const fields = data.split('/');\n const canDecode = parseMessageType(decodeResult, fields[0]);\n if (!canDecode) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n for (let i = 1; i < fields.length; ++i) {\n const iei = fields[i].substring(0, 2);\n const data = fields[i].substring(2);\n switch (iei) {\n case 'AF':\n processAirField(decodeResult, data.split(','));\n break;\n case 'AK':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processAK(decodeResult, data.split(','));\n break;\n case 'CG':\n processCenterOfGravity(decodeResult, data.split(','));\n break;\n case 'DC':\n processDateCode(decodeResult, data.split(','));\n break;\n case 'DI':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processDI(decodeResult, data.split(','));\n break;\n case 'DT': //processDestination?\n processDT(decodeResult, data.split(','));\n break;\n case 'DQ':\n ResultFormatter.desiredAltitude(\n decodeResult,\n parseInt(data, 10) * 100,\n );\n // processDQ(decodeResult, data.split(','));\n break;\n case 'ET':\n processETA(data, decodeResult, fields, i);\n break;\n case 'FB':\n ResultFormatter.currentFuel(decodeResult, parseInt(data, 10));\n break;\n case 'FN':\n decodeResult.raw.flight_number = data;\n break;\n case 'FX':\n ResultFormatter.text(decodeResult, data);\n break;\n case 'GA':\n ResultFormatter.groundAddress(decodeResult, data);\n break;\n case 'ID':\n processIdentification(decodeResult, data.split(','));\n break;\n case 'LR':\n processLandingReport(decodeResult, data.split(','));\n break;\n case 'MR':\n processMessageReference(decodeResult, data.split(','));\n break;\n case 'PR':\n processPerformanceData(decodeResult, data.split(','));\n break;\n //case 'PR':\n // TODO: decode /PR fields\n // ResultFormatter.unknown(decodeResult, fields[i], '/');\n // break;\n case 'PS': // Position\n Arinc702Helper.processPS(decodeResult, data.split(','));\n break;\n case 'RF':\n case 'RI':\n case 'RM':\n case 'RP':\n case 'RS':\n // TODO - use key/data instead of whole message\n FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n break;\n case 'RN':\n ResultFormatter.routeNumber(decodeResult, data);\n break;\n case 'RW':\n processRunway(decodeResult, data.split(':'));\n break;\n case 'SM':\n processSummary(decodeResult, data.split(','));\n break;\n case 'SN':\n decodeResult.raw.serial_number = data;\n break;\n case 'SP':\n ResultFormatter.startPoint(decodeResult, data);\n break;\n case 'TD':\n processTimeOfDeparture(decodeResult, data.split(','));\n break;\n case 'TS':\n Arinc702Helper.processTimeStamp(decodeResult, data.split(','));\n break;\n case 'VR':\n ResultFormatter.version(decodeResult, parseInt(data, 10) / 10);\n break;\n case 'WD':\n processWindData(decodeResult, data);\n break;\n case 'WQ':\n processWeatherQuery(decodeResult, data.split(':'));\n break;\n default:\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n }\n\n ResultFormatter.checksumAlgorithm(decodeResult, checksumAlgorithmUsed);\n ResultFormatter.checksum(decodeResult, checksum);\n\n return true;\n }\n\n public static processPS(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length === 9) {\n // variant 7\n processRoute(decodeResult, data[3], data[1], data[5], data[4], undefined);\n ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);\n ResultFormatter.temperature(decodeResult, data[6]);\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n }\n if (data.length === 14) {\n // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n }\n\n public static processPosition(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length >= 10) {\n // variant 1, short\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n }\n if (data.length >= 14) {\n // variant 2,long\n ResultFormatter.unknownArr(decodeResult, data.slice(10));\n }\n }\n\n public static processTimeStamp(decodeResult: DecodeResult, data: string[]) {\n if (data.length > 2) {\n const positionData = data.slice(1);\n positionData[0] = positionData[0].substring(6); // strip time from position field\n this.processPosition(decodeResult, positionData);\n }\n let time = DateTimeUtils.convertDateTimeToEpoch(\n data[0],\n data[1].substring(0, 6),\n );\n\n if (Number.isNaN(time)) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[1].substring(2, 4) +\n data[1].substring(0, 2) +\n data[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);\n }\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processETA(\n data: string,\n decodeResult: DecodeResult,\n fields: string[],\n i: number,\n) {\n if (data.length === 5) {\n // 1 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(1)),\n );\n } else if (data.length === 6) {\n // 2 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(2)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n}\n\nfunction processAirField(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n ResultFormatter.departureAirport(decodeResult, data[0]);\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), 'AF/');\n }\n}\nfunction processTimeOfDeparture(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n decodeResult.raw.planned_departure_time = data[0]; //DDHHMM - TODO: make int\n decodeResult.formatted.items.push({\n type: 'ptd',\n code: 'ptd',\n label: 'Planned Departure Time',\n value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`,\n });\n\n decodeResult.raw.estimated_departure_time = data[1]; //HHMM - TODO: make int\n decodeResult.formatted.items.push({\n type: 'etd',\n code: 'etd',\n label: 'Estimated Departure Time',\n value: `${data[1].substring(0, 2)}:${data[1].substring(2)}`,\n });\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), '/TD');\n }\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0]);\n if (data.length > 1) {\n ResultFormatter.flightNumber(decodeResult, data[1]);\n }\n if (data.length > 2) {\n //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 9) {\n ResultFormatter.unknown(decodeResult, data[0]);\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[2]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[3], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4]),\n );\n ResultFormatter.unknown(decodeResult, data[5]);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(data[6]),\n );\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n return;\n }\n if (data.length === 4 || data.length === 5) {\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[1]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[2], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[3]),\n );\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n return;\n }\n ResultFormatter.unknownArr(decodeResult, data, ',');\n}\n\nfunction processLandingReport(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 19) {\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.arrivalRunway(decodeResult, data[5]);\n ResultFormatter.unknown(decodeResult, data.slice(6, 19).join(','));\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction processCenterOfGravity(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10);\n }\n } else if (data.length === 3) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center');\n }\n if (data[1] !== undefined && data[1] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower');\n }\n if (data[2] !== undefined && data[2] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper');\n }\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction parseMessageType(\n decodeResult: DecodeResult,\n messagePart: string,\n): boolean {\n const messageParts = messagePart.split(',');\n const messageType = messageParts[0];\n if (messageType.startsWith('POS')) {\n Arinc702Helper.processPosition(\n decodeResult,\n messagePart.substring(3).split(','),\n );\n return processIMI(decodeResult, 'POS');\n } else if (messageType.length === 6) {\n const part1 = processIMI(decodeResult, messageType.substring(0, 3));\n const description = decodeResult.formatted.description;\n const part2 = processIMI(decodeResult, messageType.substring(3, 6));\n decodeResult.formatted.description =\n description + ' for ' + decodeResult.formatted.description;\n if (messageParts.length > 1) {\n // TODO handle REJPWI/REJPOS\n ResultFormatter.unknown(\n decodeResult,\n messageParts.slice(1).join(','),\n '/',\n );\n }\n return part1 && part2;\n }\n\n if (messageParts.length > 1) {\n // TODO handle\n ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(','), '/');\n }\n\n return processIMI(decodeResult, messageType);\n}\n\n/**\n * Processes the Imbedded Message Identifier (IMI)\n * which indicates the type of message and is used to determine what the message type is\n * @param decodeResult\n * @param type\n * @returns\n */\nfunction processIMI(decodeResult: DecodeResult, type: string): boolean {\n if (type === 'FPN') {\n decodeResult.formatted.description = 'Flight Plan';\n } else if (type === 'FTX') {\n decodeResult.formatted.description = 'Free Text';\n } else if (type === 'INI') {\n decodeResult.formatted.description = 'Initial Report';\n } else if (type === 'INR') {\n decodeResult.formatted.description = 'In-Range Report';\n } else if (type === 'LDI') {\n decodeResult.formatted.description = 'Load Distribution Information';\n } else if (type === 'PER') {\n decodeResult.formatted.description = 'Performance Report';\n } else if (type === 'POS') {\n decodeResult.formatted.description = 'Position Report';\n } else if (type === 'PRG') {\n decodeResult.formatted.description = 'Progress Report';\n } else if (type === 'PWI') {\n decodeResult.formatted.description = 'Pilot Weather Information';\n } else if (type === 'WXR') {\n decodeResult.formatted.description = 'Weather Report';\n } else if (type === 'REJ') {\n decodeResult.formatted.description = 'Reject';\n } else if (type === 'REQ') {\n decodeResult.formatted.description = 'Request';\n } else if (type === 'RES') {\n decodeResult.formatted.description = 'Response';\n } else if (type === 'SUM') {\n decodeResult.formatted.description = 'Summary Report';\n } else {\n decodeResult.formatted.description = 'Unknown H1 Message';\n return false;\n }\n return true;\n}\n\nfunction processPerformanceData(decodeResult: DecodeResult, data: string[]) {\n // /PR fields contain performance data\n // Known field positions (12-field short variant and 18-field long variant):\n // [0]: ground speed (knots * 10 or similar)\n // [1]: indicated airspeed or mach-related\n // [2]: altitude in hundreds of feet\n // [3]: fuel-related value\n // [4]: unknown (often empty)\n // [5]: fuel flow or consumption\n // [6]: fuel-related\n // [7]: wind data (DDDSSSS format) or empty\n // [8]: temperature (M=minus, P=plus)\n // [9]: heading or unknown\n\n if (data.length < 3) {\n ResultFormatter.unknownArr(decodeResult, data, ',');\n return;\n }\n\n // Field 2: altitude in hundreds\n if (data[2] !== undefined && data[2] !== '') {\n const alt = Number(data[2]) * 100;\n if (!isNaN(alt) && alt > 0) {\n ResultFormatter.altitude(decodeResult, alt);\n }\n }\n\n // Field 8: temperature (if present)\n if (data.length > 8 && data[8] !== undefined && data[8] !== '') {\n ResultFormatter.temperature(decodeResult, data[8]);\n }\n\n // Collect remaining undecoded fields\n const remaining: string[] = [];\n for (let i = 0; i < data.length; i++) {\n if (\n i === 2 &&\n data[i] !== '' &&\n !isNaN(Number(data[i])) &&\n Number(data[i]) * 100 > 0\n ) {\n continue; // altitude - already decoded\n }\n if (\n i === 8 &&\n data[i] !== '' &&\n (data[i].startsWith('M') ||\n data[i].startsWith('P') ||\n !isNaN(Number(data[i])))\n ) {\n continue; // temperature - already decoded\n }\n remaining.push(data[i]);\n }\n if (remaining.length > 0 && remaining.some((r) => r !== '')) {\n ResultFormatter.unknown(decodeResult, remaining.join(','), '/PR');\n }\n}\n\nfunction processDateCode(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n // noop?\n } else if (data.length === 2) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[0].substring(2, 4) +\n data[0].substring(0, 2) +\n data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processWeatherQuery(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(':'), 'WQ/');\n return;\n }\n\n const alts = data[0].split('.');\n const route = data[1].split('.');\n\n ResultFormatter.requestedAltitudes(\n decodeResult,\n alts.map((a) => parseInt(a, 10) * 100),\n );\n\n const waypoints = route.map((wp) => {\n return { name: wp };\n });\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processRoute(\n decodeResult: DecodeResult,\n last: string,\n time: string,\n next: string,\n eta: string,\n then?: string,\n date?: string,\n) {\n const lastTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(time, date)\n : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(eta, date)\n : DateTimeUtils.convertHHMMSSToTod(eta);\n\n const lastWaypoint = RouteUtils.getWaypoint(last);\n lastWaypoint.time = lastTime;\n\n const nextWaypoint = RouteUtils.getWaypoint(next);\n nextWaypoint.time = nextTime;\n\n const thenWaypoint = RouteUtils.getWaypoint(then || '?');\n\n const waypoints: Waypoint[] = [lastWaypoint, nextWaypoint, thenWaypoint];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processWindData(decodeResult: DecodeResult, message: string) {\n const wind = [] as Wind[];\n\n const flightLevel = Number(message.slice(0, 3));\n const fields = message.slice(4).split('.'); // strip off altitude and comma\n fields.forEach((field) => {\n if (field.length < 4) {\n // probably need a more robust check to determine to skip\n return;\n }\n const data = field.split(',');\n const waypoint = { name: data[0] };\n const windData = data[1];\n const windDirection = parseInt(windData.slice(0, 3), 10);\n const windSpeed = parseInt(windData.slice(3), 10);\n\n if (data.length === 3) {\n const tempData = data[2];\n const tempFlightLevel = Number(tempData.slice(0, 3));\n const tempString = tempData.slice(3);\n const tempDegrees =\n Number(tempString.substring(1)) *\n (tempString.charAt(0) === 'M' ? -1 : 1);\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: tempFlightLevel,\n degreesC: tempDegrees,\n },\n });\n } else {\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n });\n }\n });\n\n ResultFormatter.windData(decodeResult, wind);\n}\n\nfunction processRunway(decodeResult: DecodeResult, data: string[]) {\n //FIXME - figure out names\n const parts = data[0].split('.');\n const more = parts[0].split(',');\n\n ResultFormatter.departureRunway(decodeResult, more[0]);\n ResultFormatter.unknownArr(decodeResult, more.slice(1), ',');\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), '.');\n ResultFormatter.departureAirport(decodeResult, data[1].split(',')[0]);\n ResultFormatter.unknownArr(decodeResult, data[1].split(',').slice(1), ',');\n //ResultFormatter.unknownArr(decodeResult, data.slice(2), ':');\n}\nfunction processSummary(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 11) {\n return ResultFormatter.unknown(decodeResult, data.join(','), 'SM/');\n }\n\n ResultFormatter.engineStart(\n decodeResult,\n DateTimeUtils.convertDayTimeToTod(data[0]),\n );\n ResultFormatter.startFuel(decodeResult, 100 * parseInt(data[1], 10));\n ResultFormatter.engineStop(\n decodeResult,\n DateTimeUtils.convertDayTimeToTod(data[2]),\n );\n ResultFormatter.out(decodeResult, DateTimeUtils.convertDayTimeToTod(data[3]));\n ResultFormatter.outFuel(decodeResult, 100 * parseInt(data[4], 10));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertDayTimeToTod(data[5]));\n ResultFormatter.offFuel(decodeResult, 100 * parseInt(data[6], 10));\n ResultFormatter.on(decodeResult, DateTimeUtils.convertDayTimeToTod(data[7]));\n ResultFormatter.onFuel(decodeResult, 100 * parseInt(data[8], 10));\n ResultFormatter.in(decodeResult, DateTimeUtils.convertDayTimeToTod(data[9]));\n ResultFormatter.inFuel(decodeResult, 100 * parseInt(data[10], 10));\n}\n\n// CRC-16/IBM-SDLC but nibbles are reversed\nfunction crc16IbmSdlcRev(data: string): number {\n let crc = 0xffff;\n const bytes = asciiStringToBytes(data);\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x0001) !== 0) {\n crc = (crc >>> 1) ^ 0x8408;\n } else {\n crc = crc >>> 1;\n }\n }\n }\n crc = (crc ^ 0xffff) & 0xffff;\n\n const nibble1 = (crc >> 12) & 0xf;\n const nibble2 = (crc >> 8) & 0xf;\n const nibble3 = (crc >> 4) & 0xf;\n const nibble4 = crc & 0xf;\n\n return (nibble4 << 12) | (nibble3 << 8) | (nibble2 << 4) | nibble1;\n}\n\n/**\n * Calculates the CRC-16/GENIBUS checksum for a given Uint8Array.\n * @param data The input data as a byte array.\n * @returns The 16-bit checksum as a number.\n */\nfunction crc16Genibus(data: string): number {\n let crc = 0xffff;\n const polynomial = 0x1021;\n\n const bytes = asciiStringToBytes(data);\n\n for (const byte of bytes) {\n crc ^= byte << 8;\n\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x8000) !== 0) {\n crc = ((crc << 1) ^ polynomial) & 0xffff;\n } else {\n crc = (crc << 1) & 0xffff;\n }\n }\n }\n\n return (crc ^ 0xffff) & 0xffff;\n}\nfunction processMessageReference(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(','), '/MR');\n return;\n }\n\n ResultFormatter.sequenceNumber(decodeResult, parseInt(data[0], 10));\n if (data[1] !== '') {\n ResultFormatter.sequenceResponse(decodeResult, parseInt(data[1], 10));\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Arinc702Helper } from '../utils/arinc_702_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Hoisted to module scope so the wildcard decode() doesn't recompile the\n// pattern for every incoming message.\nconst NEWLINE_REGEX = /[\\n\\r]/g;\n\n// TODO: come up with a better name as this decodes multiple labels\nexport class Arinc702 extends DecoderPlugin {\n name = 'arinc-702';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(NEWLINE_REGEX, '');\n\n // try to decode the entire message\n let decoded = false;\n decoded = Arinc702Helper.decodeH1Message(decodeResult, msg);\n if (decoded) {\n return this.processDecodeResult(decodeResult, decoded, options, message);\n }\n\n // try to handle messages like `/HDQDLUA.POS<rest of message>`\n if (msg.startsWith('/')) {\n const headerData = msg.split('.');\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n headerData.slice(1).join('.'),\n );\n\n if (decoded) {\n decodeResult.remaining.text =\n headerData[0] + '.' + decodeResult.remaining.text;\n return this.processDecodeResult(\n decodeResult,\n decoded,\n options,\n message,\n );\n }\n }\n\n // try to handle messages like `F37AMCLL93#M1BPOS<rest of message>`\n const hashParts = msg.split('#');\n if (hashParts.length == 2) {\n // need a better way to figure this out\n const offset =\n hashParts[0] === '- ' || isNaN(parseInt(hashParts[1][1])) ? 3 : 4;\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n msg.slice(hashParts[0].length + offset),\n );\n if (decoded && hashParts[0].length > 0) {\n // ResultFormatter.unknown(decodeResult, hashParts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, hashParts[0].substring(4));\n //ResultFormatter.unknown(decodeResult, hashParts[1].length == 5 ? hashParts[1].substring(0, 2) : hashParts[1].substring(0, 3), '#');\n // hack of the highest degree as we've parsed the rest of the message already but we want the remaining text to be in order\n decodeResult.remaining.text =\n hashParts[0].substring(0, 4) +\n '#' +\n hashParts[1].substring(0, offset - 1) +\n '/' +\n decodeResult.remaining.text;\n }\n if (decoded) {\n return this.processDecodeResult(\n decodeResult,\n decoded,\n options,\n message,\n );\n }\n }\n\n // try to handle messages like `M74AMC4086FTX<rest of message>`\n const slashParts = msg.split('/');\n if (slashParts[0].length > 3) {\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n msg.slice(slashParts[0].length - 3),\n );\n // flight number is already decoded in other fields\n decodeResult.remaining.text =\n slashParts[0].slice(0, 3) + '/' + decodeResult.remaining.text;\n }\n\n return this.processDecodeResult(decodeResult, decoded, options, message);\n }\n\n private processDecodeResult(\n decodeResult: DecodeResult,\n decoded: boolean,\n options: Options,\n message: Message,\n ) {\n decodeResult.decoded = decoded;\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z_Slash extends DecoderPlugin {\n name = 'label-5z-slash';\n\n descriptions: Record<string, string> = {\n B1: 'Request Weight and Balance',\n B3: 'Request Departure Clearance',\n CD: 'Weight and Balance',\n CG: 'Request Pre-departure clearance, PDC',\n CM: 'Crew Scheduling',\n C3: 'Off Message',\n C4: 'Flight Dispatch',\n C5: 'Maintenance Message',\n C6: 'Customer Service',\n 10: 'PIREP',\n C11: 'International PIREP',\n DS: 'Late Message',\n D3: 'Holding Pattern Message',\n D6: 'From-To + Date',\n D7: 'From-To + Alternate + Time',\n EO: 'In Range',\n ET: 'Expected Time',\n PW: 'Position Weather',\n RL: 'Request Release',\n R3: 'Request HOWGOZIT Message',\n R4: 'Request the Latest POSBD',\n TC: 'From-To Fuel',\n WB: 'From-To',\n W1: 'Request Weather for City',\n };\n\n qualifiers() {\n return {\n labels: ['5Z'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const lines = message.text.split('\\r\\n');\n if (lines[0] === '/TXT') {\n // not UA, but starts with `/`\n ResultFormatter.text(decodeResult, lines.slice(1).join('\\r\\n'));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n const data = lines[0].split('/');\n const header = data[1].split(' '); //data[0] is blank\n const type = header[0];\n const typeDescription = this.descriptions[type];\n\n if (typeDescription) {\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: 'airline',\n code: 'AIRLINE',\n label: 'Airline',\n value: 'United Airlines',\n });\n decodeResult.raw.message_type = type;\n decodeResult.formatted.items.push({\n type: 'message_type',\n code: 'MSG_TYPE',\n label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3' && data[1] === 'B3 TO DATA REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));\n ResultFormatter.unknownArr(decodeResult, data.slice(3), '/');\n } else if (type === 'B3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n decodeResult.raw.day = Number(header[2]);\n ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));\n if (header.length > 4) {\n ResultFormatter.unknownArr(decodeResult, header.slice(4), '/');\n }\n } else if (type === 'C3' && data[1] === 'C3 GATE REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.unknownArr(decodeResult, info.slice(5), ' ');\n } else if (type === 'C3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n } else if (type === 'ET') {\n const airports = data[2].split(' ');\n // aiports[0] is blank\n ResultFormatter.departureAirport(decodeResult, airports[1]);\n ResultFormatter.arrivalAirport(decodeResult, airports[2]);\n decodeResult.raw.day = Number(airports[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(airports[4]),\n );\n\n const estimates = data[3].split(' ');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(estimates[1]),\n );\n ResultFormatter.unknown(decodeResult, estimates[2]);\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${message.text}`);\n }\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_LDR extends DecoderPlugin {\n name = 'label-10-ldr';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['LDR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[5];\n const lon = parts[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim()),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim()),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.departureAirport(decodeResult, parts[9]);\n ResultFormatter.arrivalAirport(decodeResult, parts[10]);\n ResultFormatter.alternateAirport(decodeResult, parts[11]);\n ResultFormatter.arrivalRunway(decodeResult, parts[12].split('/')[0]); // TODO: find out if anything comes after `/` sometimes\n const altRwy = [parts[13].split('/')[0], parts[14].split('/')[0]]\n .filter((r) => r != '')\n .join(',');\n if (altRwy != '') {\n ResultFormatter.alternateRunway(decodeResult, altRwy); // TODO: find out if anything comes after `/` sometimes\n }\n ResultFormatter.unknownArr(decodeResult, [\n ...parts.slice(0, 5),\n ...parts.slice(15),\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_POS extends DecoderPlugin {\n name = 'label-10-pos';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const parts = message.text.split(',');\n if (parts.length !== 12) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n //const time = parts[0].substring(3); //DDHHMM\n const lat = parts[1].trim();\n const lon = parts[2].trim();\n const position = {\n latitude:\n ((lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())) / 100,\n longitude:\n ((lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim())) / 100,\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.unknownArr(decodeResult, [\n parts[0],\n ...parts.slice(3, 7),\n ...parts.slice(8),\n ]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_Slash extends DecoderPlugin {\n name = 'label-10-slash';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[1];\n const lon = parts[2];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.heading(decodeResult, Number(parts[5]));\n ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[8]),\n );\n const waypoints: Waypoint[] = [\n {\n name: parts[11],\n },\n {\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]),\n },\n {\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]),\n },\n ];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n\n if (parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n ResultFormatter.unknownArr(\n decodeResult,\n [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],\n '/',\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 12 N : results');\n console.log(results);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n });\n\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n results.groups.unkwn3,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_12_POS extends DecoderPlugin {\n name = 'label-12-pos';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const data = message.text.substring(3).split(',');\n if (!message.text.startsWith('POS') || data.length !== 12) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const lat = data[0].substring(0, 8);\n const lon = data[0].substring(8);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lat.substring(1, 4)),\n Number(lat.substring(4, 6)),\n Number(lat.substring(6, 8)),\n ),\n longitude:\n CoordinateUtils.getDirection(lon[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lon.substring(1, 4)),\n Number(lon.substring(4, 6)),\n Number(lon.substring(6, 8)),\n ),\n });\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));\n ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));\n ResultFormatter.currentFuel(\n decodeResult,\n Number(data[7].substring(3).trim()),\n ); // strip FOB\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()),\n ); // strip ETA\n ResultFormatter.departureAirport(decodeResult, data[9]);\n ResultFormatter.arrivalAirport(decodeResult, data[10]);\n ResultFormatter.unknown(decodeResult, data[11]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_13Through18_Slash extends DecoderPlugin {\n name = 'label-13-18-slash';\n\n qualifiers() {\n return {\n labels: ['13', '14', '15', '16', '17', '18'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n const parts = lines[0].split('/');\n const labelNumber = Number(parts[1].substring(0, 2));\n decodeResult.formatted.description = getMsgType(labelNumber);\n\n // labels 13-17 have 4 parts, label 18 has 7 parts\n if (\n (labelNumber !== 18 && parts.length !== 4) ||\n (labelNumber === 18 && parts.length !== 7)\n ) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // parts[0] === ''\n const data = parts[2].split(' ');\n ResultFormatter.departureAirport(decodeResult, data[1]);\n ResultFormatter.arrivalAirport(decodeResult, data[2]);\n decodeResult.raw.day = Number(data[3]);\n const time = DateTimeUtils.convertHHMMSSToTod(data[4]);\n if (labelNumber === 13) {\n ResultFormatter.out(decodeResult, time);\n } else if (labelNumber === 14) {\n ResultFormatter.off(decodeResult, time);\n } else if (labelNumber === 15) {\n ResultFormatter.on(decodeResult, time);\n } else if (labelNumber === 16) {\n ResultFormatter.in(decodeResult, time);\n }\n\n if (parts.length === 7) {\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), '/');\n }\n\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].startsWith('/LOC')) {\n const location = lines[i].substring(5).split(','); // strip off '/LOC'\n let position;\n if (location[0].startsWith('+') || location[0].startsWith('-')) {\n position = {\n latitude: Number(location[0]),\n longitude: Number(location[1]),\n };\n } else {\n position = {\n latitude:\n CoordinateUtils.getDirection(location[0][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[0].substring(1, 3)),\n Number(location[0].substring(3, 5)),\n Number(location[0].substring(5, 7)),\n ),\n longitude:\n CoordinateUtils.getDirection(location[1][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[1].substring(1, 4)),\n Number(location[1].substring(4, 6)),\n Number(location[1].substring(6, 8)),\n ),\n };\n }\n ResultFormatter.position(decodeResult, position);\n } else {\n ResultFormatter.unknown(decodeResult, lines[i], '\\r\\n');\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n return decodeResult;\n }\n}\n\nfunction getMsgType(labelNumber: number): string {\n if (labelNumber === 13) {\n return 'Out of Gate Report';\n }\n if (labelNumber === 14) {\n return 'Takeoff Report';\n }\n if (labelNumber === 15) {\n return 'On Ground Report';\n }\n if (labelNumber === 16) {\n return 'In Gate Report';\n }\n if (labelNumber === 17) {\n return 'Post Report';\n }\n if (labelNumber === 18) {\n return 'Post Times Report';\n }\n\n return 'Unknown';\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-15';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n if (message.text.startsWith('(2') && message.text.endsWith('(Z')) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(0, 13),\n ),\n );\n if (between.length === 25) {\n // short variant\n ResultFormatter.unknown(decodeResult, between.substring(13, 19));\n const alt = between.substring(19, 22);\n if (alt != '---') {\n ResultFormatter.altitude(decodeResult, 100 * Number(alt));\n }\n ResultFormatter.temperature(\n decodeResult,\n between.substring(22).replaceAll(' ', '0'),\n );\n } else if (between.substring(13, 16) === 'OFF') {\n // off variant\n const ddmmyy = between.substring(16, 22);\n const hhmm = between.substring(22, 26);\n if (ddmmyy != '------') {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(hhmm + '00', ddmmyy),\n );\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmm),\n );\n }\n ResultFormatter.unknown(decodeResult, between.substring(26));\n } else {\n ResultFormatter.unknown(decodeResult, between.substring(26));\n }\n } else {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const parts = message.text.split(' ');\n // FST01KMCOEGKKN505552W00118021\n const header = parts[0];\n\n const stringCoords = header.substring(13);\n // Don't use decodeStringCoordinates here, because of different pos format\n\n const firstChar = stringCoords.substring(0, 1);\n const middleChar = stringCoords.substring(7, 8);\n decodeResult.raw.position = {};\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n const lat =\n (Number(stringCoords.substring(1, 7)) / 10000) *\n (firstChar === 'S' ? -1 : 1);\n const lon =\n (Number(stringCoords.substring(8, 15)) / 10000) *\n (middleChar === 'W' ? -1 : 1);\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n ResultFormatter.altitude(\n decodeResult,\n Number(stringCoords.substring(15)) * 100,\n );\n } else {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), ' ');\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Honeywell Label 16 Position Report\nexport class Label_16_Honeywell extends DecoderPlugin {\n name = 'label-16-honeywell';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (\n message.text.startsWith('(2') &&\n message.text.endsWith('(Z') &&\n message.text.length >= 29\n ) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.unknown(decodeResult, between.substring(0, 4), ''); // Session ID\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(4, 17),\n ),\n );\n if (between.charAt(17) === '-') {\n // Waypoint mode\n const waypoint1 = between.substring(18, 23).trim();\n const waypoint2 = between.substring(23, 28).trim();\n if (waypoint2) {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }, { name: waypoint2 }],\n });\n } else {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }],\n });\n }\n } else {\n // Route mode\n ResultFormatter.departureAirport(\n decodeResult,\n between.substring(17, 21),\n );\n ResultFormatter.arrivalAirport(decodeResult, between.substring(21, 25));\n //ignore the rest (should just be '-')\n }\n /*\n const phases: { [key: string]: string } = {\n '/O': 'En Route',\n '/A': 'Arrival',\n '/D': 'Departure',\n '/P': 'Preflight',\n '/C': 'Climb',\n };\n */\n ResultFormatter.unknown(\n decodeResult,\n between.substring(between.length - 2),\n '',\n );\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 Honeywell message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: N 44.203,W 86.546,31965,6, 290\n let variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*)$/;\n\n // Style: N 28.177/W 96.055\n let variant2Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n\n ResultFormatter.position(decodeResult, pos);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n\n results = message.text.match(variant2Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n\n ResultFormatter.position(decodeResult, pos);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_POSA1 extends DecoderPlugin {\n name = 'label-16-posa1';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['POSA1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const fields = message.text.split(',');\n if (fields.length !== 11 || !fields[0].startsWith('POSA1')) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(5)),\n ); // strip 'POSA1'\n const waypoint = fields[1].trim();\n const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);\n const nextWaypoint = fields[4].trim();\n const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(6), ',');\n ResultFormatter.route(decodeResult, {\n waypoints: [\n { name: waypoint, time: time },\n { name: nextWaypoint, time: nextTime },\n ],\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_TOD extends DecoderPlugin {\n name = 'label-16-tod';\n\n qualifiers() {\n return {\n labels: ['16'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n const time = DateTimeUtils.convertHHMMSSToTod(fields[0]);\n if (fields.length !== 5 || Number.isNaN(time)) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.timestamp(decodeResult, time);\n if (fields[1] !== '') {\n ResultFormatter.altitude(decodeResult, Number(fields[1]));\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n const temp = fields[4].split('/');\n const posFields = temp[0].split(' ');\n if (posFields.length === 4) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(posFields[0]) * Number(posFields[1]),\n longitude:\n CoordinateUtils.getDirection(posFields[2]) * Number(posFields[3]),\n });\n } else if (posFields.length === 2) {\n ResultFormatter.position(decodeResult, {\n latitude:\n (CoordinateUtils.getDirection(posFields[0][0]) *\n Number(posFields[0].slice(1))) /\n 100,\n longitude:\n (CoordinateUtils.getDirection(posFields[1][0]) *\n Number(posFields[1].slice(1))) /\n 100,\n });\n } else {\n // Redacted\n //ResultFormatter.unknown(decodeResult, fields[4]);\n }\n\n if (temp.length > 1) {\n ResultFormatter.flightNumber(decodeResult, temp[1]);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() {\n return {\n labels: ['1M'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 1M ETA: results');\n console.log(results);\n }\n\n decodeResult.raw.flight_number = results[0];\n // results[1]: ETA01 (???)\n // results[2]: 230822 - UTC date of eta\n ResultFormatter.departureAirport(decodeResult, results[3]);\n ResultFormatter.arrivalAirport(decodeResult, results[4]);\n ResultFormatter.alternateAirport(decodeResult, results[5]);\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n ResultFormatter.arrivalRunway(\n decodeResult,\n results[8].replace(results[4], ''),\n ); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n const yymmdd = results[2];\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(\n results[7] + '00',\n yymmdd.substring(4, 6) +\n yymmdd.substring(2, 4) +\n yymmdd.substring(0, 2),\n ),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_3Line extends DecoderPlugin {\n name = 'label-1l-3-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n if (lines.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n const parts = message.text.replaceAll('\\r\\n', '/').split('/');\n const data = new Map<string, string>();\n data.set('', parts[0]);\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const dep = data.get('DEP');\n if (dep) {\n ResultFormatter.departureAirport(decodeResult, dep);\n data.delete('DEP');\n }\n const des = data.get('DES');\n if (des) {\n ResultFormatter.arrivalAirport(decodeResult, des);\n data.delete('DES');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fn = data.get('FN');\n if (fn) {\n ResultFormatter.flightNumber(decodeResult, fn);\n data.delete('FN');\n }\n const day = data.get('DAY');\n const utc = data.get('UTC');\n if (day && utc) {\n decodeResult.raw.message_timestamp =\n Date.parse(day + ' GMT+0000') / 1000 +\n DateTimeUtils.convertHHMMSSToTod(utc);\n data.delete('DAY');\n data.delete('UTC');\n }\n\n const lat = data.get('LAT');\n const lon = data.get('LON');\n if (lat && lon) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n data.delete('LAT');\n data.delete('LON');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n if (key === '') {\n remaining += value;\n } else {\n remaining += `/${key} ${value}`;\n }\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_070 extends DecoderPlugin {\n name = 'label-1l-070';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000070'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000070')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, parts[0]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(parts[4][0]) *\n Number(parts[4].substring(1)),\n longitude:\n CoordinateUtils.getDirection(parts[5][0]) *\n Number(parts[5].substring(1)),\n });\n\n decodeResult.remaining.text = parts[6];\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_660 extends DecoderPlugin {\n name = 'label-1l-660';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000660'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000660')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 5) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n parts[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n const hhmmss = parts[1].substring(0, 6);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmmss),\n );\n const fl = parts[1].substring(6, 9);\n ResultFormatter.altitude(decodeResult, Number(fl) * 100);\n const next = parts[1].substring(9);\n ResultFormatter.route(decodeResult, { waypoints: [{ name: next.trim() }] });\n\n decodeResult.remaining.text = parts.slice(2).join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_Slash extends DecoderPlugin {\n name = 'label-1l-1-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['+', '-'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const data = new Map<string, string>();\n data.set('LAT', parts[0].replaceAll(' ', ''));\n data.set('LON', parts[1].replaceAll(' ', ''));\n for (let i = 2; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const position = {\n latitude: Number(data.get('LAT')),\n longitude: Number(data.get('LON')),\n };\n data.delete('LAT');\n data.delete('LON');\n\n ResultFormatter.position(decodeResult, position);\n const utc = data.get('UTC');\n if (utc) {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(utc),\n );\n data.delete('UTC');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fob = data.get('FOB');\n if (fob) {\n ResultFormatter.currentFuel(decodeResult, Number(fob));\n data.delete('FOB');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n remaining += `/${key} ${value}`;\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() {\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 11) {\n this.debug(options, 'Variation 1 detected');\n const rawCoords = fields[0];\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(rawCoords),\n );\n\n this.setDecodeLevel(decodeResult, true, 'full');\n } else if (fields.length == 5) {\n this.debug(options, 'Variation 2 detected');\n const position = CoordinateUtils.decodeStringCoordinates(fields[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n this.setDecodeLevel(decodeResult, true, 'full');\n } else {\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() {\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 9) {\n // POSN 37.550W 76.436, 98,110800,23961,25820, 65,-23,114212,KRDU\n processPosition(decodeResult, fields[0].trim());\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[7]),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[8]);\n\n ResultFormatter.unknownArr(decodeResult, [\n fields[1],\n fields[4],\n fields[5],\n ]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown!\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string) {\n // N 39.841W 75.790\n if (\n value.length !== 16 &&\n value[0] !== 'N' &&\n value[0] !== 'S' &&\n value[8] !== 'W' &&\n value[8] !== 'E'\n ) {\n return;\n }\n const latDir = value[0] === 'N' ? 1 : -1;\n const lonDir = value[8] === 'E' ? 1 : -1;\n const position = {\n latitude: latDir * Number(value.substring(1, 7)),\n longitude: lonDir * Number(value.substring(9, 15)),\n };\n\n ResultFormatter.position(decodeResult, position);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_OFF extends DecoderPlugin {\n name = 'label-22-off';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['OFF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Takeoff Report');\n\n if (message.text.startsWith('OFF01')) {\n // variant 1\n const fields = message.text.substring(5).split('/');\n\n if (fields.length != 2) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n ResultFormatter.departureDay(\n decodeResult,\n Number(fields[1].substring(0, 2)),\n ); // departure day\n ResultFormatter.arrivalDay(\n decodeResult,\n Number(fields[1].substring(2, 4)),\n ); // arrival day\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(8, 12),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(22));\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else if (message.text.startsWith('OFF02\\r\\n')) {\n // varaint 3\n const fields = message.text.substring(7).split(',');\n if (fields.length != 4) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else if (message.text.startsWith('OFF02')) {\n // varaint 2\n const fields = message.text.substring(5).split('/');\n if (fields.length != 2) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n fields[1].substring(0, 14),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(20, 24),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)),\n );\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n this.debug(options, 'Unknown variation.');\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_POS extends DecoderPlugin {\n name = 'label-22-pos';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['N', 'S'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const fields = message.text.split(',');\n\n if (fields.length !== 11) {\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${fields.join(',')}`,\n );\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n const latStr = fields[0].substring(1, 8);\n const lonStr = fields[0].substring(9);\n const lat = Number(latStr) / 10000;\n const lon = Number(lonStr) / 10000;\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,\n longitude: CoordinateUtils.getDirection(fields[0][8]) * lon,\n });\n\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM3 extends DecoderPlugin {\n name = 'label-2p-fm3';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 7) {\n const header = parts[0].split('FM3 ');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n\n if (header[1].length === 4) {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n } else {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[1]),\n );\n const lat = parts[2].replaceAll(' ', '');\n const lon = parts[3].replaceAll(' ', '');\n if (lat[0] === 'N' || lat[0] === 'S') {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n } else {\n ResultFormatter.position(decodeResult, {\n latitude: Number(lat),\n longitude: Number(lon),\n });\n }\n ResultFormatter.altitude(decodeResult, Number(parts[4]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[5]);\n ResultFormatter.unknown(decodeResult, parts[6]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM4 extends DecoderPlugin {\n name = 'label-2p-fm4';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 10) {\n const header = parts[0].split('FM4');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n ResultFormatter.heading(decodeResult, Number(parts[7]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM5 extends DecoderPlugin {\n name = 'label-2p-fm5';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 12) {\n const header = parts[0].split('FM5 ');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[7]);\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n ResultFormatter.flightNumber(decodeResult, parts[10].trim());\n ResultFormatter.unknown(decodeResult, parts[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_24_Slash extends DecoderPlugin {\n name = 'label-24-slash';\n\n qualifiers() {\n return {\n labels: ['24'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n\n if (fields.length == 10 && fields[0] == '' && fields[9] == '') {\n // begin and ends with `/`\n const ddmmyy =\n fields[1].substring(2, 4) +\n fields[1].substring(4, 6) +\n fields[1].substring(0, 2); // YYDDMM\n const hhmmss = fields[2] + '00';\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n hhmmss,\n ddmmyy,\n );\n ResultFormatter.flightNumber(decodeResult, fields[3]);\n ResultFormatter.altitude(decodeResult, Number(fields[4]));\n const lat = fields[5];\n const lon = fields[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[8]),\n );\n ResultFormatter.unknown(decodeResult, fields[7]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() {\n return {\n labels: ['30'],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /EA1830/DSKSFO/SK24\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 30 EA: results');\n console.log(results);\n }\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)),\n );\n\n if (results[1].substring(0, 2) === 'DS') {\n ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));\n ResultFormatter.unknown(decodeResult, '/'.concat(results[2]));\n } else {\n ResultFormatter.unknown(\n decodeResult,\n '/'.concat(results[1], '/', results[2]),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA Report — has a different field layout from the other Label 44 events\n// (altitude between coords and airports), so it uses DecoderPlugin directly\n// rather than Label_44_Base.\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const result = this.initResult(message, 'ETA Report');\n\n const data = message.text.split(',');\n if (data.length < 9) {\n return this.failUnknown(result, message.text, options);\n }\n\n this.debug(options, 'ETA Report: fields', data);\n\n ResultFormatter.position(\n result,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.altitude(result, 100 * Number(data[2]));\n ResultFormatter.departureAirport(result, data[3]);\n ResultFormatter.arrivalAirport(result, data[4]);\n ResultFormatter.month(result, Number(data[5].substring(0, 2)));\n ResultFormatter.day(result, Number(data[5].substring(2, 4)));\n ResultFormatter.timestamp(\n result,\n DateTimeUtils.convertHHMMSSToTod(data[6]),\n );\n ResultFormatter.eta(result, DateTimeUtils.convertHHMMSSToTod(data[7]));\n\n const fuel = Number(data[8]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(result, fuel);\n }\n\n if (data.length > 9) {\n ResultFormatter.unknownArr(result, data.slice(9));\n }\n\n this.setDecodeLevel(result, true, 'full');\n return result;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n/**\n * Base class for Label 44 event-style decoders (ON, OFF, IN).\n *\n * These all share the same CSV structure:\n * preamble, coordinates, [field(s)...], departure, arrival, date, time(s), fuel\n *\n * Subclasses provide the description, qualifiers, minimum field count,\n * and a hook to decode their specific fields from the CSV data.\n */\nexport abstract class Label_44_Base extends DecoderPlugin {\n /** Human-readable description of this report type (e.g. \"On Runway Report\"). */\n abstract get description(): string;\n\n /** Minimum number of CSV fields required for a valid message. */\n abstract get minFields(): number;\n\n /**\n * Decode the fields that are specific to this report type.\n * The common fields (position, airports, date) are already handled.\n * @param result - The in-progress decode result to populate\n * @param data - The full CSV-split message fields\n * @param options - Decoder options\n */\n abstract decodeEventFields(\n result: DecodeResult,\n data: string[],\n options: Options,\n ): void;\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const result = this.initResult(message, this.description);\n\n const data = message.text.split(',');\n if (data.length < this.minFields) {\n return this.failUnknown(result, message.text, options);\n }\n\n this.debug(options, `${this.description}: fields`, data);\n\n // Common fields shared by all Label 44 event decoders\n ResultFormatter.position(\n result,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(result, data[2]);\n ResultFormatter.arrivalAirport(result, data[3]);\n ResultFormatter.month(result, Number(data[4].substring(0, 2)));\n ResultFormatter.day(result, Number(data[4].substring(2, 4)));\n\n // Subclass-specific fields\n this.decodeEventFields(result, data, options);\n\n this.setDecodeLevel(result, true, 'full');\n return result;\n }\n\n /**\n * Helper to parse a fuel value from a CSV field.\n * Returns undefined if the value is not a valid number.\n */\n protected parseFuel(result: DecodeResult, value: string): void {\n const fuel = Number(value);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(result, fuel);\n }\n }\n\n /**\n * Helper to add any remaining fields as unknown.\n */\n protected addRemainingFields(\n result: DecodeResult,\n data: string[],\n startIndex: number,\n ): void {\n if (data.length > startIndex) {\n ResultFormatter.unknownArr(result, data.slice(startIndex));\n }\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// In Gate Report\nexport class Label_44_IN extends Label_44_Base {\n name = 'label-44-in';\n get description() {\n return 'In Gate Report';\n }\n get minFields() {\n return 7;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.in(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n this.parseFuel(result, data[6]);\n this.addRemainingFields(result, data, 7);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// Off Runway Report\nexport class Label_44_OFF extends Label_44_Base {\n name = 'label-44-off';\n get description() {\n return 'Off Runway Report';\n }\n get minFields() {\n return 8;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00OFF01', '00OFF02', '00OFF03', 'OFF01', 'OFF02', 'OFF03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.off(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n ResultFormatter.eta(result, DateTimeUtils.convertHHMMSSToTod(data[6]));\n this.parseFuel(result, data[7]);\n this.addRemainingFields(result, data, 8);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// On Runway Report\nexport class Label_44_ON extends Label_44_Base {\n name = 'label-44-on';\n get description() {\n return 'On Runway Report';\n }\n get minFields() {\n return 7;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ON01', '00ON02', '00ON03', 'ON01', 'ON02', 'ON03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.on(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n this.parseFuel(result, data[6]);\n this.addRemainingFields(result, data, 7);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00POS01', '00POS02', '00POS03', 'POS01', 'POS02', 'POS03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n // Style: POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1\n // Match: POS02,coords,flight_level_or_ground,departure_icao,arrival_icao,current_date,current_time,eta_time,fuel_in_tons\n const regex =\n /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n this.debug(options, 'Position Report: groups', results.groups);\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n results.groups.unsplit_coords,\n ),\n );\n const flight_level =\n results.groups.flight_level_or_ground == 'GRD' ||\n results.groups.flight_level_or_ground == '***'\n ? 0\n : Number(results.groups.flight_level_or_ground);\n\n ResultFormatter.month(\n decodeResult,\n Number(results.groups.current_date.substring(0, 2)),\n );\n ResultFormatter.day(\n decodeResult,\n Number(results.groups.current_date.substring(2, 4)),\n );\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + '00'),\n );\n\n // TODO: ETA month and Day\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + '00'),\n );\n\n if (\n results.groups.fuel_in_tons != '***' &&\n results.groups.fuel_in_tons != '****'\n ) {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n ResultFormatter.departureAirport(\n decodeResult,\n results.groups.departure_icao,\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n\n this.setDecodeLevel(decodeResult, true, 'full');\n return decodeResult;\n }\n\n return this.failUnknown(decodeResult, message.text, options);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { FlightPlanUtils } from '../utils/flight_plan_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Flight Briefing Report\nexport class Label_44_Slash extends DecoderPlugin {\n name = 'label-44-slash';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: [' /FB'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Briefing';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n if (fields.length !== 4) {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(0, 2), '/'); // 0 is a space\n // 1 is the briefing id\n // 2 is arrival airport, but repeated later\n const data = fields[3].split(',');\n if (data.length >= 6) {\n if (options.debug) {\n console.log('Label 44 Slash: groups');\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n (data[0].charAt(0) === 'S' ? -1 : 1) *\n parseFloat(data[0].slice(1).trim()),\n longitude:\n (data[1].charAt(0) === 'W' ? -1 : 1) *\n parseFloat(data[1].slice(1).trim()),\n });\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.unknown(decodeResult, data[3]); // Status - need more info to decode\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n if (data.length === 18) {\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 8), ','); // 6 is repeated arrival airport\n ResultFormatter.remainingFuel(decodeResult, parseFloat(data[8]));\n ResultFormatter.unknownArr(decodeResult, data.slice(9, 11), ',');\n ResultFormatter.arrivalRunway(decodeResult, data[11]);\n FlightPlanUtils.addProcedure(decodeResult, data[12], 'arrival');\n ResultFormatter.unknownArr(decodeResult, data.slice(13, 18), ',');\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Waypoint } from '../types/waypoint';\n\nexport class Label_4A extends DecoderPlugin {\n name = 'label-4a';\n\n qualifiers() {\n return {\n labels: ['4A'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n if (fields.length === 11) {\n // variant 1\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.tail(decodeResult, fields[2].replace('.', ''));\n if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);\n ResultFormatter.departureAirport(decodeResult, fields[4]);\n ResultFormatter.arrivalAirport(decodeResult, fields[5]);\n // ResultFormatter.altitude(decodeResult, Number(alt) * 100);\n ResultFormatter.unknownArr(decodeResult, fields.slice(8));\n } else if (fields.length === 6) {\n const f0 = fields[0];\n if (f0.length > 0 && (f0[0] === 'N' || f0[0] === 'S')) {\n // variant 2\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)),\n );\n let wp1: Waypoint = {\n name: fields[0].substring(13).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),\n };\n ResultFormatter.altitude(\n decodeResult,\n Number(fields[1].substring(6, 9)) * 100,\n );\n let wp2: Waypoint = {\n name: fields[1].substring(9).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[2]),\n };\n ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });\n ResultFormatter.temperature(decodeResult, fields[3]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(4));\n } else {\n // variant 3\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1]),\n );\n ResultFormatter.unknown(decodeResult, fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(\n (fields[4] + fields[5]).replace(/[ \\.]/g, ''),\n ),\n );\n }\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_01 extends DecoderPlugin {\n name = 'label-4a-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n let rgx = message.text.match(\n /^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)/,\n );\n if (rgx) {\n ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);\n ResultFormatter.callsign(decodeResult, rgx[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(rgx[4] + '00'),\n );\n ResultFormatter.departureAirport(decodeResult, rgx[5]);\n ResultFormatter.arrivalAirport(decodeResult, rgx[6]);\n ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, '')));\n ResultFormatter.unknown(decodeResult, rgx[8]);\n ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ''));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DIS extends DecoderPlugin {\n name = 'label-4a-dis';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DIS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + '00'),\n );\n ResultFormatter.callsign(decodeResult, fields[2]);\n ResultFormatter.text(decodeResult, fields.slice(3).join(''));\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DOOR extends DecoderPlugin {\n name = 'label-4a-door';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DOOR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(' ');\n if (fields.length === 3) {\n ResultFormatter.door_event(\n decodeResult,\n fields[0].split('/')[1],\n fields[1],\n );\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2] + '00'),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_Slash_01 extends DecoderPlugin {\n name = 'label-4a-slash-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['/01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n if (message.text.length === 5 && message.text.substring(0, 4) === '/01-') {\n ResultFormatter.unknown(decodeResult, message.text.substring(4));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4N extends DecoderPlugin {\n name = 'label-4n';\n\n qualifiers() {\n return {\n labels: ['4N'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n const fields = text.split(',');\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(30, 45).replace(/^(.)0/, '$1'),\n ),\n );\n ResultFormatter.altitude(\n decodeResult,\n Number(text.substring(48, 51)) * 100,\n );\n ResultFormatter.unknownArr(\n decodeResult,\n [text.substring(2, 4), text.substring(19, 29)],\n ' ',\n );\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === 'B') {\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[4]),\n longitude: Number(fields[5]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[6]));\n }\n ResultFormatter.departureAirport(decodeResult, fields[8]);\n ResultFormatter.arrivalAirport(decodeResult, fields[9]);\n ResultFormatter.alternateAirport(decodeResult, fields[10]);\n ResultFormatter.arrivalRunway(decodeResult, fields[11].split('/')[0]);\n if (fields[12].length > 1) {\n ResultFormatter.alternateRunway(decodeResult, fields[12].split('/')[0]);\n }\n ResultFormatter.checksum(decodeResult, parseInt(fields[32], 16));\n ResultFormatter.unknownArr(\n decodeResult,\n [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(\n (f) => f != '',\n ),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_AGFSR extends DecoderPlugin {\n name = 'label-4t-agfsr';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['AGFSR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(5).split('/');\n\n if (!message.text.startsWith('AGFSR') || data.length !== 20) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n ResultFormatter.arrivalDay(decodeResult, Number(data[2]));\n ResultFormatter.departureAirport(\n decodeResult,\n data[3].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), 'IATA');\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)),\n ); // HHMMZ\n ResultFormatter.unknown(decodeResult, data[5], '/');\n const lat = data[6].substring(0, 7);\n const lon = data[6].substring(7, 15);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) +\n Number(lat.substring(2, 6)) / 60,\n longitude:\n CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) +\n Number(lon.substring(3, 7)) / 60,\n });\n ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));\n // 8 - phase of flight?\n // 11 - temperature?\n ResultFormatter.unknownArr(decodeResult, data.slice(8), '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_58 extends DecoderPlugin {\n name = 'label-58';\n\n qualifiers() {\n return {\n labels: ['58'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.split('/');\n if (data.length === 8) {\n ResultFormatter.flightNumber(decodeResult, data[0]);\n ResultFormatter.day(decodeResult, Number(data[1]));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n const lat = data[3];\n const lon = data[4];\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n ResultFormatter.altitude(decodeResult, Number(data[5]));\n ResultFormatter.unknown(decodeResult, data[6], '/');\n ResultFormatter.unknown(decodeResult, data[7], '/');\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 58 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_ETA extends DecoderPlugin {\n name = 'label-4t-eta';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['ETA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split('/');\n\n if (!message.text.startsWith('ETA') || data.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n const etaData = data[2].split(' ');\n ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));\n ResultFormatter.arrivalAirport(decodeResult, etaData[1], 'IATA');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)),\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nconst POS_REGEX = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\nconst WS_REGEX = /\\s+/;\nconst NEWLINE_REGEX = /\\r?\\n/;\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n qualifiers() {\n return {\n labels: ['80'],\n preambles: [],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(\n message,\n 'Airline Defined Position Report',\n );\n\n const lines = message.text.split(NEWLINE_REGEX);\n if (lines.length === 1 && lines[0].includes(',')) {\n this.parseCsvFormat(lines[0], decodeResult);\n } else {\n const header = lines[0].trim();\n const headerParts = header.split(',');\n for (let i = 0; i < headerParts.length - 1; i++) {\n const moreFields = headerParts[i].split('/');\n for (const more of moreFields) {\n this.parseTags(more.trim(), decodeResult);\n }\n }\n\n this.parseHeader(\n headerParts[headerParts.length - 1].trim(),\n decodeResult,\n );\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const parts = line.split('/');\n for (const part of parts) {\n this.parseTags(part.trim(), decodeResult);\n }\n }\n }\n\n if (decodeResult.formatted.items.length > 0) {\n this.setDecodeLevel(decodeResult, true);\n }\n\n return decodeResult;\n }\n\n private parseHeader(header: string, results: DecodeResult) {\n //3N01 POSRPT 0581/27 KIAD/MSLP .N962AV/04H 11:02\n const fields = header.split('/');\n if (fields.length < 3) {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n const msgInfo = fields[0].split(WS_REGEX);\n if (msgInfo.length === 3) {\n ResultFormatter.unknownArr(results, msgInfo.slice(0, 2), ' ');\n ResultFormatter.flightNumber(results, msgInfo[2]);\n } else {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n\n const otherInfo1 = fields[1].split(WS_REGEX);\n if (otherInfo1.length === 2) {\n ResultFormatter.day(results, parseInt(otherInfo1[0], 10));\n ResultFormatter.departureAirport(results, otherInfo1[1]);\n } else {\n ResultFormatter.unknownArr(results, otherInfo1, ' ');\n }\n\n const otherInfo2 = fields[2].split(WS_REGEX);\n if (otherInfo2.length === 2) {\n ResultFormatter.arrivalAirport(results, otherInfo2[0]);\n ResultFormatter.tail(results, otherInfo2[1].replace('.', ''));\n } else {\n ResultFormatter.unknownArr(results, otherInfo2, ' ');\n }\n\n if (fields.length > 3) {\n ResultFormatter.unknownArr(results, fields.slice(3), '/');\n }\n }\n\n private parseTags(part: string, results: DecodeResult) {\n const kvPair = part.split(WS_REGEX);\n if (kvPair.length < 2) {\n ResultFormatter.unknown(results, part, '/');\n return;\n }\n const tag = kvPair[0];\n const val = kvPair.slice(1).join(' ');\n\n switch (tag) {\n case 'POS': {\n // don't use decodeStringCoordinates because of different position format\n const posResult = POS_REGEX.exec(val);\n const lat =\n Number(posResult?.groups?.lat) *\n (posResult?.groups?.latd === 'S' ? -1 : 1);\n const lon =\n Number(posResult?.groups?.lng) *\n (posResult?.groups?.lngd === 'W' ? -1 : 1);\n const position = {\n latitude: Number.isInteger(lat) ? lat / 1000 : lat / 100,\n longitude: Number.isInteger(lon) ? lon / 1000 : lon / 100,\n };\n ResultFormatter.position(results, position);\n break;\n }\n case 'ALT':\n ResultFormatter.altitude(results, parseInt(val.replace('+', ''), 10));\n break;\n case 'FL': // Handle \"FL 360\"\n ResultFormatter.altitude(results, parseInt(val, 10) * 100);\n break;\n case 'MCH':\n ResultFormatter.mach(results, parseInt(val, 10) / 1000);\n break;\n case 'SPD':\n ResultFormatter.groundspeed(results, parseInt(val, 10));\n break;\n case 'TAS':\n ResultFormatter.airspeed(results, parseInt(val, 10));\n break;\n case 'SAT':\n ResultFormatter.temperature(results, val);\n break;\n case 'FB':\n // ignoring, assuming FOB and avoiding duplicates.\n break;\n case 'FOB':\n // Strip non-numeric like 'N' in 'N009414'\n ResultFormatter.currentFuel(\n results,\n parseInt(val.replace(/\\D/g, ''), 10),\n );\n break;\n case 'UTC':\n ResultFormatter.timestamp(\n results,\n DateTimeUtils.convertHHMMSSToTod(val),\n );\n break;\n case 'ETA': {\n const hhmm = val.split('.')[0].replace(':', '');\n ResultFormatter.eta(results, DateTimeUtils.convertHHMMSSToTod(hhmm));\n break;\n }\n case 'HDG':\n ResultFormatter.heading(results, parseInt(val, 10));\n break;\n case 'NWYP':\n results.raw.next_waypoint = val;\n break;\n case 'SWN':\n // wind speed, do nothing for\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'DWN':\n // wind direction, do nothing for now\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'AD':\n // do nothing, as it shows in the header\n break;\n default:\n ResultFormatter.unknown(results, part, '/');\n }\n }\n private parseCsvFormat(text: string, results: DecodeResult) {\n const csvParts = text.split(',');\n if (csvParts.length !== 9) {\n return;\n }\n const header = csvParts[0].trim().split(WS_REGEX);\n ResultFormatter.unknown(results, header[0], ' ');\n ResultFormatter.unknown(results, header[1], ' ');\n ResultFormatter.position(\n results,\n CoordinateUtils.decodeStringCoordinates(header[2]),\n );\n ResultFormatter.unknown(results, csvParts[1]);\n ResultFormatter.timestamp(\n results,\n DateTimeUtils.convertHHMMSSToTod(csvParts[2]),\n );\n ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ',');\n ResultFormatter.temperature(\n results,\n (\n (csvParts[6].charAt(0) === 'M' ? -1 : 1) *\n parseInt(csvParts[6].slice(1), 10)\n ).toString(),\n );\n ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));\n ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nconst WS_REGEX = /\\s+/;\nconst ALL_WS_REGEX = /\\s/g;\nconst ALL_DOTS_REGEX = /\\./g;\n\nexport class Label_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() {\n return {\n labels: ['83'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n if (text.startsWith('4DH3 ETAT2')) {\n // variant 2\n const fields = text.split(WS_REGEX);\n if (fields[2].length > 5) {\n decodeResult.raw.day = fields[2].substring(5);\n }\n ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));\n const subfields = fields[3].split('/');\n ResultFormatter.departureAirport(decodeResult, subfields[0]);\n ResultFormatter.arrivalAirport(decodeResult, subfields[1]);\n ResultFormatter.tail(decodeResult, fields[4].replace(ALL_DOTS_REGEX, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[6] + '00'),\n );\n } else if (text.startsWith('001PR')) {\n // variant 3\n decodeResult.raw.day = text.substring(5, 7);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(13, 28).replace(ALL_DOTS_REGEX, ''),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n ResultFormatter.unknown(decodeResult, text.substring(33));\n } else {\n const fields = text.replace(ALL_WS_REGEX, '').split(',');\n if (fields.length === 9) {\n // variant 1\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n decodeResult.raw.day = fields[2].substring(0, 2);\n decodeResult.raw.time = fields[2].substring(2);\n // text was already whitespace-stripped above so the per-field\n // .replace(/\\s/g, '') is redundant.\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[3]),\n longitude: Number(fields[4]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[5]));\n ResultFormatter.groundspeed(decodeResult, Number(fields[6]));\n ResultFormatter.heading(decodeResult, Number(fields[7]));\n ResultFormatter.unknown(decodeResult, fields[8]);\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() {\n return {\n labels: ['8E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: EGSS,1618\n // Match: arrival_icao,arrival_eta\n const regex = /^(?<arrival_icao>\\w{4}),(?<arrival_eta>\\d{4})$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 8E ETA: groups');\n console.log(results.groups);\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta),\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// CPDLC\nexport class Label_B6_Forwardslash extends DecoderPlugin {\n name = 'label-b6-forwardslash';\n\n qualifiers() {\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'CPDLC Message');\n\n // Full ATN/PM-CPDLC parsing isn't implemented yet, but the body\n // (everything after the leading \"/\") is at least preserved in the\n // decoded output so consumers don't lose it.\n const body = message.text.substring(1);\n if (body.length > 0) {\n ResultFormatter.text(decodeResult, body);\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n this.setDecodeLevel(decodeResult, false);\n }\n\n this.debug(options, 'CPDLC body:', body);\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_ColonComma extends DecoderPlugin {\n name = 'label-colon-comma';\n\n qualifiers() {\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description =\n 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n code: 'FREQ',\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H2_02E extends DecoderPlugin {\n name = 'label-h2-02e';\n\n qualifiers() {\n return {\n labels: ['H2'],\n preambles: ['02E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Weather Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n\n if (parts[parts.length - 1] !== 'Q') {\n // not a valid message\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const windData: Wind[] = [];\n decodeResult.remaining.text = '';\n\n const header = parts[0];\n if (header.length === 45) {\n // header.substring(0,3) is '02E'\n ResultFormatter.day(decodeResult, parseInt(header.substring(3, 5), 10));\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n const firstWind = this.parseWeatherReport(header.substring(13));\n if (firstWind) {\n windData.push(firstWind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + header.substring(13);\n }\n }\n\n for (let i = 1; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part[0] !== 'Q') {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n continue;\n }\n const wind = this.parseWeatherReport(part.substring(1));\n if (wind) {\n windData.push(wind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n }\n }\n\n ResultFormatter.windData(decodeResult, windData);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text.length === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n\n private parseWeatherReport(text: string): Wind | null {\n const posString = text.substring(0, 13);\n const pos =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(posString);\n if (text.length !== 32 || !pos) {\n return null;\n }\n const tod = DateTimeUtils.convertHHMMSSToTod(text.substring(13, 17));\n const flightLevel = parseInt(text.substring(17, 20), 10);\n // const altitude = parseInt(text.substring(17,21), 10) * 10; // use FL instead\n const tempSign = text[21] === 'M' ? -1 : 1;\n const tempDegreesRaw = parseInt(text.substring(22, 25), 10);\n const tempDegrees = tempSign * (tempDegreesRaw / 10);\n const windDirection = parseInt(text.substring(25, 28), 10);\n const windSpeed = parseInt(text.substring(28, 31), 10);\n // G?\n if (text[31] !== 'G') {\n return null;\n }\n return {\n waypoint: {\n name: posString,\n latitude: pos.latitude,\n longitude: pos.longitude,\n time: tod,\n },\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: flightLevel,\n degreesC: tempDegrees,\n },\n };\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_H1_ATIS extends DecoderPlugin {\n name = 'label-h1-atis';\n\n qualifiers() {\n return {\n labels: ['H1', '5Z'],\n preambles: ['L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ATIS Subscription';\n decodeResult.message = message;\n\n // Pattern: L[2-digit seq]A[flight]/[facility].TI2/[code][airport][checksum]\n const regex =\n /^L(\\d{2})A([A-Z0-9]+)\\/([A-Z]{4})\\.TI2\\/(\\d{3})([A-Z]{4})([A-F0-9]+)$/;\n const match = message.text.match(regex);\n\n if (!match) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 ATIS message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const seq = match[1];\n const flight = match[2];\n const facility = match[3];\n const code = match[4];\n const airport = match[5];\n const checksum = match[6];\n\n ResultFormatter.flightNumber(decodeResult, flight);\n ResultFormatter.arrivalAirport(decodeResult, facility);\n\n decodeResult.raw.atis_code = code;\n decodeResult.formatted.items.push({\n type: 'atis',\n code: 'ATIS_CODE',\n label: 'ATIS Code',\n value: code,\n });\n\n // The airport in the TI2 section\n if (airport !== facility) {\n decodeResult.raw.atis_airport = airport;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ATIS_ARPT',\n label: 'ATIS Airport',\n value: airport,\n });\n }\n\n // Checksum\n ResultFormatter.checksum(decodeResult, parseInt(checksum, 16));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_EZF extends DecoderPlugin {\n name = 'label-h1-ezf';\n\n qualifiers() {\n return {\n labels: ['H1', '1M'],\n preambles: ['EZF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Load Sheet';\n decodeResult.message = message;\n\n const lines = message.text\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length < 2 || lines[0] !== 'EZF') {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 EZF message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const loadsheet: Record<string, string> = {};\n const unknowns: string[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('-')) {\n const kvMatch = line.match(/^-([^/]+)\\/(.+)$/);\n if (kvMatch) {\n loadsheet[kvMatch[1]] = kvMatch[2];\n } else {\n unknowns.push(line);\n }\n } else if (i === 1) {\n // Second line is the flight identifier, e.g. NO0246/10/EI-NEO\n const idParts = line.split('/');\n if (idParts.length >= 1) {\n ResultFormatter.flightNumber(decodeResult, idParts[0]);\n }\n if (idParts.length >= 3) {\n ResultFormatter.tail(decodeResult, idParts[2]);\n }\n // Remaining parts of identifier line\n if (idParts.length >= 2) {\n // idParts[1] is day or other info - store but don't format\n }\n } else if (i === 2) {\n // Third line typically contains config info, e.g. /C28Y331/3/9\n unknowns.push(line);\n } else {\n unknowns.push(line);\n }\n }\n\n // Extract known fields from loadsheet\n if (loadsheet['SCT']) {\n const route = loadsheet['SCT'].split('-');\n if (route.length === 2) {\n ResultFormatter.departureAirport(decodeResult, route[0], 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, route[1], 'IATA');\n }\n }\n\n // Store all loadsheet data in raw\n decodeResult.raw.loadsheet = loadsheet;\n\n // Format key loadsheet items\n const formatFields: [string, string, string][] = [\n ['STD', 'Scheduled Time of Departure', 'std'],\n ['FLT STATUS', 'Flight Status', 'flight_status'],\n ['UOM', 'Unit of Measure', 'uom'],\n ['ZFW', 'Zero Fuel Weight', 'zfw'],\n ['PAX', 'Passengers', 'pax'],\n ['TOW', 'Takeoff Weight', 'tow'],\n ['DOW', 'Dry Operating Weight', 'dow'],\n ['FWT', 'Fuel Weight', 'fuel_weight'],\n ];\n\n for (const [key, label, code] of formatFields) {\n if (loadsheet[key]) {\n decodeResult.formatted.items.push({\n type: 'loadsheet',\n code: code.toUpperCase(),\n label: label,\n value: loadsheet[key],\n });\n }\n }\n\n if (unknowns.length > 0) {\n ResultFormatter.unknownArr(decodeResult, unknowns, '\\n');\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Fault Log Report');\n\n const parts = message.text.split('/FR');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n for (let i = 1; i < fields.length; i++) {\n const field = fields[i];\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.fault_message = msg;\n decodeResult.formatted.items.push({\n type: 'fault',\n code: 'FR',\n label: 'Fault Report',\n value: decodeResult.raw.fault_message,\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_H1_M_POS extends DecoderPlugin {\n name = 'label-h1-m-pos';\n\n qualifiers() {\n return {\n labels: ['H1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(\n message,\n 'M-Series Periodic Position Report',\n );\n\n // Match M[2-digit seq]A[airline 2-char][flight 4-digit][origin],[dest],[DDHHMM],[lat],[lon],[alt],[hdg],...\n const headerRegex = /^M(\\d{2})A([A-Z]{2})(\\d{4})/;\n const headerMatch = message.text.match(headerRegex);\n\n if (!headerMatch) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const airline = headerMatch[2];\n const flightNum = headerMatch[3];\n const afterHeader = message.text.substring(headerMatch[0].length);\n const fields = afterHeader.split(',');\n\n // We expect at least: origin, dest, DDHHMM, lat, lon, alt, hdg\n if (fields.length < 7) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.flightNumber(decodeResult, `${airline}${flightNum}`);\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n\n // DDHHMM timestamp\n const timestamp = fields[2].trim();\n if (timestamp.length === 6) {\n const day = Number(timestamp.substring(0, 2));\n const tod = DateTimeUtils.convertHHMMSSToTod(\n timestamp.substring(2) + '00',\n );\n ResultFormatter.day(decodeResult, day);\n ResultFormatter.timestamp(decodeResult, tod);\n }\n\n // Latitude and longitude (trim spaces, e.g. \"- 4.9985\")\n const lat = parseFloat(fields[3].replace(/\\s/g, ''));\n const lon = parseFloat(fields[4].replace(/\\s/g, ''));\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n\n // Altitude\n const alt = Number(fields[5]);\n ResultFormatter.altitude(decodeResult, alt);\n\n // Heading\n const hdg = Number(fields[6]);\n ResultFormatter.heading(decodeResult, hdg);\n\n // Remaining fields as unknown\n if (fields.length > 7) {\n ResultFormatter.unknownArr(decodeResult, fields.slice(7));\n }\n\n this.setDecodeLevel(\n decodeResult,\n true,\n fields.length > 7 ? 'partial' : 'full',\n );\n\n return decodeResult;\n }\n}\n","import * as pako from 'pako';\n\n/**\n * Inflate compressed data with support for partial/truncated streams.\n * Uses Z_SYNC_FLUSH to extract as much data as possible, even from\n * incomplete deflate streams. Captures output via onData callback.\n *\n * @param data - The compressed input bytes\n * @param raw - If true, use raw deflate (no zlib header); if false, expect zlib header\n * @returns The decompressed bytes, or undefined if no output was produced\n */\nexport function inflateData(\n data: Uint8Array,\n raw: boolean,\n): Uint8Array | undefined {\n const chunks: Uint8Array[] = [];\n const inflator = new pako.Inflate({ windowBits: raw ? -15 : 15 });\n inflator.onData = (chunk: Uint8Array) => {\n chunks.push(chunk);\n };\n inflator.push(data, 2); // Z_SYNC_FLUSH\n\n if (chunks.length === 0) return undefined;\n if (chunks.length === 1) return chunks[0];\n\n const totalLen = chunks.reduce((sum, c) => sum + c.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n/**\n * Decode a base64 or base64url string to Uint8Array.\n * Handles missing padding and converts base64url chars (- and _) to\n * standard base64 chars (+ and /), matching Buffer.from(str, 'base64') behavior.\n *\n * @param base64 - The base64 or base64url encoded string\n * @returns The decoded bytes\n */\nexport function base64ToUint8Array(base64: string): Uint8Array {\n const cleaned = base64\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n .replace(/[^A-Za-z0-9+/]/g, '');\n const padded = cleaned + '='.repeat((4 - (cleaned.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { base64ToUint8Array, inflateData } from '../utils/compression';\n\nconst textDecoder = new TextDecoder();\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['OHMA', '/RTNBOCR.OHMA', '#T1B/RTNBOCR.OHMA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n\n const data = message.text.split('OHMA')[1]; // throw out '/RTNOCR.' - even though it means something\n try {\n const compressedBuffer = base64ToUint8Array(data);\n const result = inflateData(compressedBuffer, false);\n if (!result || result.length === 0) {\n throw new Error('Decompression produced no output');\n }\n const jsonText = textDecoder.decode(result);\n\n let formattedMsg;\n let jsonMessage;\n try {\n jsonMessage = JSON.parse(jsonText).message;\n } catch {\n jsonMessage = jsonText;\n }\n\n try {\n const ohmaMsg = JSON.parse(jsonMessage);\n formattedMsg = JSON.stringify(ohmaMsg, null, 2);\n } catch {\n formattedMsg = jsonMessage;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.raw.ohma = jsonText;\n decodeResult.formatted.items.push({\n type: 'ohma',\n code: 'OHMA',\n label: 'OHMA Downlink',\n value: formattedMsg,\n });\n } catch (e) {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 OHMA message: ${message.text}`, e);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","/**\n * ICAO Doc 4444 Flight Plan (FPL) parser utility.\n *\n * Parses the standard ICAO FPL format:\n * (FPL-callsign-flightRulesType\n * -aircraftType/wake-equipment/surveillance\n * -departureHHMM\n * -speedLevel route\n * -destinationHHMM alternate1 alternate2\n * -otherInfo)\n */\n\nimport { Route } from '../types/route';\n\nexport interface IcaoFlightPlan {\n callsign: string;\n flightRules: string;\n flightType: string;\n aircraftType: string;\n wakeTurbulence: string;\n equipment: string;\n surveillance: string;\n departure: string;\n departureTime: string;\n cruiseSpeed: string;\n cruiseLevel: string;\n route: Route;\n destination: string;\n eet: string;\n alternates: string[];\n otherInfo: Record<string, string>;\n}\n\nexport function parseIcaoFpl(text: string): IcaoFlightPlan | null {\n // Find the (FPL-...) block\n const fplStart = text.indexOf('(FPL-');\n if (fplStart === -1) {\n return null;\n }\n\n // Find matching closing paren\n const fplEnd = text.indexOf(')', fplStart);\n if (fplEnd === -1) {\n return null;\n }\n\n // Extract inner content after \"(FPL-\"\n const inner = text.substring(fplStart + 5, fplEnd);\n\n // Normalize: collapse all whitespace (newlines, multiple spaces) to single space\n const normalized = inner.replace(/\\s+/g, ' ').trim();\n\n // Split on \" -\" or leading \"-\" to get the field sections.\n // The format is: callsign-rulesType-acft/wake-equip/surv-deptHHMM-speedLevel route-destHHMM alts-other\n // After removing \"(FPL-\", the first field is callsign-rulesType.\n // Subsequent fields are separated by \"-\" that appears after a space or at start of a section line.\n // However, the \"-\" delimiter is tricky: it separates major sections but also appears\n // within equipment strings (e.g. SDE3FGHIJ1...) — those are NOT delimiters.\n //\n // The ICAO FPL has exactly 6 major sections after the callsign section, delimited by \"-\".\n // We need to split carefully. The format after \"(FPL-\" is:\n // section1-section2-section3-section4-section5-section6\n // where section1 = \"callsign-rulesType\" (contains one internal \"-\")\n //\n // Strategy: split on \"-\" and reconstruct based on known patterns.\n\n const parts = normalized.split('-');\n\n // We need at least 7 parts (callsign, rulesType, acftType/wake, equip/surv, dept, speed+route, dest+alts, other...)\n // But the equipment section may contain hyphens too, so we parse positionally.\n\n if (parts.length < 7) {\n return null;\n }\n\n // Section 1: callsign\n const callsign = parts[0].trim();\n if (!callsign) {\n return null;\n }\n\n // Section 2: flight rules + flight type (e.g., \"IS\")\n const rulesType = parts[1].trim();\n if (rulesType.length < 2) {\n return null;\n }\n const flightRules = rulesType[0];\n const flightType = rulesType[1];\n\n // Now we need to find the remaining sections. The challenge is that equipment strings\n // can be long but don't contain \"-\". The aircraft/wake section is \"TYPE/WAKE\".\n // The equipment/surveillance section is \"EQUIP/SURV\".\n // These are separated by \"-\".\n\n // Section 3: aircraft type / wake turbulence category (e.g., \"B77W/H\")\n const acftWake = parts[2].trim();\n const acftSlash = acftWake.indexOf('/');\n if (acftSlash === -1) {\n return null;\n }\n const aircraftType = acftWake.substring(0, acftSlash);\n const wakeTurbulence = acftWake.substring(acftSlash + 1);\n\n // Section 4: equipment / surveillance (e.g., \"SDE3FGHIJ1J2J3J4J5M1P2RWXYZ/LB1D1\")\n const equipSurv = parts[3].trim();\n const equipSlash = equipSurv.indexOf('/');\n if (equipSlash === -1) {\n return null;\n }\n const equipment = equipSurv.substring(0, equipSlash);\n const surveillance = equipSurv.substring(equipSlash + 1);\n\n // Section 5: departure aerodrome + time (e.g., \"VESPA2354\" or \"KSFO0100\")\n const deptField = parts[4].trim();\n // Time is always last 4 digits\n const departureTime = deptField.substring(deptField.length - 4);\n const departure = deptField.substring(0, deptField.length - 4);\n\n // Section 6: cruise speed/level + route (e.g., \"N0482F350 DCT ENI DCT OAK DCT BURGL IRNMN2\")\n const speedRouteField = parts[5].trim();\n // Speed is first token like N0482 or M084, level follows like F350 or S1190\n const speedMatch = speedRouteField.match(\n /^([NKM]\\d{3,4})([FAVMS]\\d{3,4})\\s*(.*)/,\n );\n if (!speedMatch) {\n return null;\n }\n const cruiseSpeed = speedMatch[1];\n const cruiseLevel = speedMatch[2];\n const route = {\n waypoints: speedMatch[3].split(' ').map((s) => ({\n name: s,\n })),\n };\n\n // Section 7: destination + EET + alternates (e.g., \"KLAX0117 KSFO\")\n const destField = parts[6].trim();\n const destParts = destField.split(/\\s+/);\n const destTime = destParts[0];\n // Destination ICAO is first 4 chars, EET is last 4 digits\n const destination = destTime.substring(0, destTime.length - 4);\n const eet = destTime.substring(destTime.length - 4);\n const alternates = destParts.slice(1).filter((s) => s.length > 0);\n\n // Section 8+: other information (remaining parts joined, then parsed as key/value)\n const otherRaw = parts.slice(7).join('-').trim();\n const otherInfo: Record<string, string> = {};\n\n if (otherRaw.length > 0) {\n // Other info is a series of KEY/VALUE pairs separated by spaces\n // e.g., \"PBN/A1B1C1D1L1O2S2T1 NAV/ABAS RNP2 DAT/1FANSE SUR/RSP180 DOF/260310 REG/B2036\"\n // Parse by finding KEY/ patterns\n const otherTokens = otherRaw.split(/\\s+/);\n let currentKey = '';\n let currentValue = '';\n\n for (const token of otherTokens) {\n const kvMatch = token.match(/^([A-Z]{2,})\\/(.*)/);\n if (kvMatch) {\n // Save previous key/value if exists\n if (currentKey) {\n otherInfo[currentKey] = currentValue.trim();\n }\n currentKey = kvMatch[1];\n currentValue = kvMatch[2];\n } else if (currentKey) {\n // Continuation of previous value\n currentValue += ' ' + token;\n }\n }\n // Save last key/value\n if (currentKey) {\n otherInfo[currentKey] = currentValue.trim();\n }\n }\n\n return {\n callsign,\n flightRules,\n flightType,\n aircraftType,\n wakeTurbulence,\n equipment,\n surveillance,\n departure,\n departureTime,\n cruiseSpeed,\n cruiseLevel,\n route,\n destination,\n eet,\n alternates,\n otherInfo,\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { parseIcaoFpl } from '../utils/icao_fpl_utils';\n\nexport class Label_H1_OFP extends DecoderPlugin {\n name = 'label-h1-ofp';\n\n qualifiers() {\n return {\n labels: ['H1', '1M'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Operational Flight Plan';\n\n if (!message.text.includes('(FPL-')) {\n if (options.debug) {\n console.log(`Decoder: No FPL block found in message`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const fpl = parseIcaoFpl(message.text);\n if (!fpl) {\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // Populate decoded results\n ResultFormatter.callsign(decodeResult, fpl.callsign);\n\n decodeResult.formatted.items.push({\n type: 'aircraft_type',\n code: 'ACFT',\n label: 'Aircraft Type',\n value: fpl.aircraftType,\n });\n\n if (fpl.departure) {\n ResultFormatter.departureAirport(decodeResult, fpl.departure);\n }\n\n if (fpl.destination) {\n ResultFormatter.arrivalAirport(decodeResult, fpl.destination);\n }\n\n if (fpl.alternates.length > 0) {\n ResultFormatter.alternateAirport(decodeResult, fpl.alternates[0]);\n }\n\n if (fpl.route) {\n ResultFormatter.route(decodeResult, fpl.route);\n }\n\n if (fpl.otherInfo.REG) {\n ResultFormatter.tail(decodeResult, fpl.otherInfo.REG);\n }\n\n const rulesMap: Record<string, string> = {\n I: 'IFR',\n V: 'VFR',\n Y: 'IFR/VFR',\n Z: 'VFR/IFR',\n };\n const rulesDesc = rulesMap[fpl.flightRules] || fpl.flightRules;\n decodeResult.formatted.items.push({\n type: 'flight_rules',\n code: 'RULES',\n label: 'Flight Rules',\n value: rulesDesc,\n });\n\n decodeResult.formatted.items.push({\n type: 'cruise',\n code: 'CRUISE',\n label: 'Cruise Speed/Level',\n value: `${fpl.cruiseSpeed} ${fpl.cruiseLevel}`,\n });\n\n // Store raw FPL data\n decodeResult.raw.icao_fpl = fpl;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_Paren extends DecoderPlugin {\n name = 'label-h1-paren';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['('],\n };\n }\n\n decode(message: Message): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (!message.text || !message.text.startsWith('(')) {\n decodeResult.decoded = false;\n return decodeResult;\n }\n\n const regex =\n /^\\(POS-(?<flight>\\w+)\\s+(?<lat>-?\\d{4,5}[NS])(?<lon>\\d{5}[EW])\\/(?<timestamp>\\d{6})\\s+F(?<alt>\\d{3})\\r?\\nRMK\\/FUEL\\s+(?<fuel>\\d{2,3}\\.\\d)\\s+M(?<mach>\\d\\.\\d{2})\\)/;\n\n const match = message.text.match(regex);\n if (match && match.groups) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.formatted.description = 'Position Report';\n\n ResultFormatter.flightNumber(decodeResult, match.groups.flight);\n ResultFormatter.position(decodeResult, {\n latitude: parseLat(match.groups.lat),\n longitude: parseLon(match.groups.lon),\n });\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(match.groups.timestamp),\n );\n ResultFormatter.altitude(\n decodeResult,\n parseInt(match.groups.alt, 10) * 100,\n );\n ResultFormatter.currentFuel(decodeResult, parseFloat(match.groups.fuel));\n ResultFormatter.mach(decodeResult, parseFloat(match.groups.mach));\n ResultFormatter.unknown(decodeResult, 'RMK');\n }\n return decodeResult;\n }\n}\n\nfunction parseLat(latStr: string): number {\n const match = latStr.match(/(-?)(\\d{2})(\\d{2})([NS])/);\n if (!match) return NaN;\n let deg = parseInt(match[2]);\n let min = parseInt(match[3]);\n let sign = match[4] === 'S' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n\nfunction parseLon(lonStr: string): number {\n const match = lonStr.match(/(\\d{3})(\\d{2})([EW])/);\n if (!match) return NaN;\n let deg = parseInt(match[1]);\n let min = parseInt(match[2]);\n let sign = match[3] === 'W' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_StarPOS extends DecoderPlugin {\n name = 'label-h1-star-pos';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['*POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const msg = message.text;\n // assuming fixed length until other variants found\n if (msg.length !== 43 || !msg.startsWith('*POS')) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${msg}`);\n }\n ResultFormatter.unknown(decodeResult, msg);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));\n ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)),\n );\n ResultFormatter.position(decodeResult, {\n // Deg Min, no sec\n latitude:\n CoordinateUtils.getDirection(msg.substring(12, 13)) *\n (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),\n longitude:\n CoordinateUtils.getDirection(msg.substring(17, 18)) *\n (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23)) / 60),\n });\n ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));\n ResultFormatter.unknown(decodeResult, msg.substring(28));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Warning Message');\n\n const parts = message.text.split('/WN');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n ResultFormatter.unknownArr(decodeResult, fields.slice(1), '/');\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.warning_message = msg;\n decodeResult.formatted.items.push({\n type: 'warning',\n code: 'WRN',\n label: 'Warning Message',\n value: decodeResult.raw.warning_message,\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() {\n return {\n labels: ['HX'],\n preambles: ['RA FMT LOCATION', 'RA FMT 43'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Undelivered Uplink Report';\n\n const parts = message.text.split(' ');\n\n decodeResult.decoded = true;\n if (parts[2] === 'LOCATION') {\n let latdir = parts[3].substring(0, 1);\n let latdeg = Number(parts[3].substring(1, 3));\n let latmin = Number(parts[3].substring(3, 7));\n let londir = parts[4].substring(0, 1);\n let londeg = Number(parts[4].substring(1, 4));\n let lonmin = Number(parts[4].substring(4, 8));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknownArr(decodeResult, parts.slice(5), ' ');\n ResultFormatter.position(decodeResult, pos);\n } else if (parts[2] === '43') {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), ' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","/**\n * Pure JavaScript ASCII85 (Adobe variant) decoder.\n * Replaces the `base85` npm package to eliminate Node.js Buffer dependency.\n * Works in browsers, Node.js 18+, Deno, Bun, and edge runtimes.\n */\nexport function ascii85Decode(input: string): Uint8Array | null {\n let str = input;\n if (str.startsWith('<~')) str = str.slice(2);\n if (str.endsWith('~>')) str = str.slice(0, -2);\n str = str.replace(/\\s/g, '');\n if (str.length === 0) return new Uint8Array(0);\n\n const output: number[] = [];\n let i = 0;\n\n while (i < str.length) {\n if (str[i] === 'z') {\n output.push(0, 0, 0, 0);\n i++;\n continue;\n }\n\n const remaining = str.length - i;\n const chunkLen = Math.min(5, remaining);\n if (chunkLen === 1) break; // trailing single char from truncated input; ignore it\n\n let padded = str.slice(i, i + chunkLen);\n while (padded.length < 5) padded += 'u';\n\n let value = 0;\n for (let j = 0; j < 5; j++) {\n const digit = padded.charCodeAt(j) - 33;\n if (digit < 0 || digit > 84) return null;\n value = value * 85 + digit;\n }\n\n if (chunkLen === 5 && value > 0xffffffff) return null;\n\n // Use >>> 0 to simulate uint32 overflow for padded groups\n const v = value >>> 0;\n const numBytes = chunkLen === 5 ? 4 : chunkLen - 1;\n if (numBytes >= 1) output.push((v >>> 24) & 0xff);\n if (numBytes >= 2) output.push((v >>> 16) & 0xff);\n if (numBytes >= 3) output.push((v >>> 8) & 0xff);\n if (numBytes >= 4) output.push(v & 0xff);\n\n i += chunkLen;\n }\n\n return new Uint8Array(output);\n}\n","import { ascii85Decode } from './ascii85';\nimport { inflateData } from './compression';\n\nconst textDecoder = new TextDecoder();\nconst textEncoder = new TextEncoder();\n\nenum MIAMVersion {\n V1 = 1,\n V2 = 2,\n}\n\nenum MIAMFid {\n SingleTransfer = 'T',\n FileTransferRequest = 'F',\n FileTransferAccept = 'K',\n FileSegment = 'S',\n FileTransferAbort = 'A',\n XOFFIndication = 'Y',\n XONIndication = 'X',\n}\n\nenum MIAMCorePdu {\n Data = 0,\n Ack = 1,\n Aloha = 2,\n AlohaReply = 3,\n}\n\nenum MIAMCoreApp {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nexport enum MIAMCoreV1Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nexport enum MIAMCoreV2Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nconst MIAMCoreV1CRCLength = 4;\nconst MIAMCoreV2CRCLength = 2;\n\ninterface PduACARSData {\n tail?: string;\n label: string;\n sublabel?: string;\n mfi?: string;\n text?: string;\n}\n\ninterface PduNonACARSData {\n appId?: string;\n text?: string;\n}\n\ninterface Pdu {\n version: MIAMVersion;\n crc: number;\n crcOk: boolean;\n complete: boolean;\n compression: number;\n encoding: number;\n msgNum: number;\n ackOptions: number;\n acars?: PduACARSData;\n non_acars?: PduNonACARSData;\n}\nconst isMIAMVersion = (x: number): x is MIAMVersion =>\n Object.values(MIAMVersion).includes(x as MIAMVersion);\nconst isMIAMFid = (x: string): x is MIAMFid =>\n Object.values(MIAMFid).includes(x as MIAMFid);\nconst isMIAMCoreApp = (x: number): x is MIAMCoreApp =>\n Object.values(MIAMCoreApp).includes(x as MIAMCoreApp);\nconst isMIAMCorePdu = (x: number): x is MIAMCorePdu =>\n Object.values(MIAMCorePdu).includes(x as MIAMCorePdu);\n\ninterface PduDecodingSuccess {\n decoded: true;\n message: {\n data: Pdu;\n };\n}\n\ninterface PduDecodingFailure {\n decoded: false;\n error: string;\n}\n\ntype PduDecodingResult = PduDecodingSuccess | PduDecodingFailure;\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: Record<\n MIAMVersion,\n Record<MIAMCoreApp, number>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n [MIAMVersion.V2]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n };\n\n static FidHandlerTable: Record<MIAMFid, (txt: string) => PduDecodingResult> =\n {\n [MIAMFid.SingleTransfer]: (txt: string) => {\n if (txt.length < 3) {\n return {\n decoded: false,\n error: 'Raw MIAM message too short (' + txt.length + ' < 3) ',\n };\n }\n\n let bpad = txt[0];\n\n if ('0123-.'.indexOf(bpad) === -1) {\n return {\n decoded: false,\n error: \"Invalid body padding value: '\" + bpad + \"'\",\n };\n }\n\n if ('0123'.indexOf(txt[1]) === -1) {\n return {\n decoded: false,\n error: \"Invalid header padding value: '\" + txt[1] + \"'\",\n };\n }\n\n const hpad = parseInt(txt[1]);\n\n const delimIdx = txt.indexOf('|');\n if (delimIdx === -1) {\n return {\n decoded: false,\n error: 'Raw MIAM message missing header-body delimiter',\n };\n }\n\n const rawHdr = txt.substring(2, delimIdx);\n if (rawHdr.length === 0) {\n return {\n decoded: false,\n error: 'Empty MIAM message header',\n };\n }\n\n let hdr = ascii85Decode('<~' + rawHdr + '~>');\n if (!hdr || hdr.length < hpad) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message header',\n };\n }\n\n let body: Uint8Array | undefined = undefined;\n\n const rawBody = txt.substring(delimIdx + 1);\n if (rawBody.length > 0) {\n if ('0123'.indexOf(bpad) >= 0) {\n const bpadValue = parseInt(bpad);\n\n const decoded = ascii85Decode('<~' + rawBody + '~>');\n if (decoded === null) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message body',\n };\n }\n body = decoded;\n if (body.length >= bpadValue) {\n body = body.subarray(0, body.length - bpadValue);\n }\n } else if (bpad === '-') {\n body = textEncoder.encode(rawBody);\n }\n }\n\n hdr = hdr.subarray(0, hdr.length - hpad);\n\n const version = hdr[0] & 0xf;\n const pduType = (hdr[0] >> 4) & 0xf;\n\n if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {\n const versionPduHandler =\n this.VersionPduHandlerTable[version][pduType];\n return versionPduHandler(hdr, body);\n } else {\n return {\n decoded: false,\n error:\n 'Invalid version and PDU type combination: v=' +\n version +\n ', pdu=' +\n pduType,\n };\n }\n },\n [MIAMFid.FileTransferRequest]: () => {\n return {\n decoded: false,\n error: 'File Transfer Request not implemented',\n };\n },\n [MIAMFid.FileTransferAccept]: () => {\n return {\n decoded: false,\n error: 'File Transfer Accept not implemented',\n };\n },\n [MIAMFid.FileSegment]: () => {\n return { decoded: false, error: 'File Segment not implemented' };\n },\n [MIAMFid.FileTransferAbort]: () => {\n return { decoded: false, error: 'File Transfer Abort not implemented' };\n },\n [MIAMFid.XOFFIndication]: () => {\n return { decoded: false, error: 'XOFF Indication not implemented' };\n },\n [MIAMFid.XONIndication]: () => {\n return { decoded: false, error: 'XON Indication not implemented' };\n },\n };\n\n private static arincCrc16(buf: Uint8Array, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,\n 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,\n 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,\n 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,\n 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,\n 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,\n 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,\n 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,\n 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,\n 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,\n 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,\n 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,\n 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[(((crc >>> 8) ^ buf[i]) >>> 0) & 0xff]) >>>\n 0;\n }\n\n return crc & 0xffff;\n }\n\n private static arinc665Crc32(buf: Uint8Array, seed?: number) {\n const crctable = [\n 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,\n 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,\n 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,\n 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,\n 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,\n 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,\n 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,\n 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,\n 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,\n 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,\n 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,\n 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,\n 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,\n 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,\n 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,\n 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,\n 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,\n 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,\n 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,\n 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,\n 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,\n 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,\n 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,\n 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,\n 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,\n 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,\n 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,\n 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,\n 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,\n 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,\n 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,\n 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,\n 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,\n 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,\n 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,\n 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,\n 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,\n 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,\n 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,\n 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,\n 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,\n 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,\n 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,\n ];\n\n let crc = seed || 0;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^ crctable[((crc >>> 24) ^ buf[i]) >>> 0]) >>> 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string): PduDecodingResult {\n const fidType = txt[0];\n\n if (isMIAMFid(fidType)) {\n const handler = this.FidHandlerTable[fidType];\n return handler(txt.substring(1));\n } else {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n }\n\n private static corePduDataHandler(\n version: MIAMVersion,\n minHdrSize: number,\n crcLen: number,\n hdr: Uint8Array,\n body?: Uint8Array,\n ): PduDecodingResult {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error:\n 'v' +\n version +\n ' header size too short; expected >= ' +\n minHdrSize +\n ', got ' +\n hdr.length,\n };\n }\n\n let pduSize: number | undefined = undefined;\n let pduCompression: number = 0;\n let pduEncoding: number = 0;\n let pduAppType: number = 0;\n let pduAppId: string = '';\n let pduCrc: number = 0;\n let pduData: Uint8Array | null = null;\n let pduCrcIsOk: boolean = false;\n let pduIsComplete: boolean = true;\n\n let pduErrors: string[] = [];\n\n let tail: string | undefined = undefined;\n let msgNum: number = 0;\n let ackOptions: number = 0;\n\n if (version === MIAMVersion.V1) {\n pduSize = (hdr[1] << 16) | (hdr[2] << 8) | hdr[3];\n\n const msgSize = hdr.length + (body === undefined ? 0 : body.length);\n if (pduSize > msgSize) {\n pduIsComplete = false;\n pduErrors.push(\n 'v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize,\n );\n }\n hdr = hdr.subarray(4);\n\n tail = textDecoder.decode(hdr.subarray(0, 7));\n hdr = hdr.subarray(7);\n } else if (version === MIAMVersion.V2) {\n hdr = hdr.subarray(1);\n }\n\n msgNum = (hdr[0] >> 1) & 0x7f;\n ackOptions = hdr[0] & 1;\n hdr = hdr.subarray(1);\n\n pduCompression = ((hdr[0] << 2) | ((hdr[1] >> 6) & 0x3)) & 0x7;\n pduEncoding = (hdr[1] >> 4) & 0x3;\n pduAppType = hdr[1] & 0xf;\n hdr = hdr.subarray(2);\n\n let appIdLen;\n if (isMIAMCoreApp(pduAppType)) {\n appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];\n } else {\n if (\n version === MIAMVersion.V2 &&\n (pduAppType & 0x8) !== 0 &&\n pduAppType !== 0xd\n ) {\n appIdLen = (pduAppType & 0x7) + 1;\n } else {\n return {\n decoded: false,\n error: 'Invalid v' + version + ' appType: ' + pduAppType,\n };\n }\n }\n\n const pduIsACARS =\n [\n MIAMCoreApp.ACARS2Char,\n MIAMCoreApp.ACARS4Char,\n MIAMCoreApp.ACARS6Char,\n ].indexOf(pduAppType) >= 0;\n\n if (hdr.length < appIdLen + crcLen) {\n return {\n decoded: false,\n error: 'Header too short for v' + version + ' appType: ' + pduAppType,\n };\n }\n\n pduAppId = textDecoder.decode(hdr.subarray(0, appIdLen));\n hdr = hdr.subarray(appIdLen);\n\n if (crcLen === 4) {\n pduCrc = (hdr[0] << 24) | (hdr[1] << 16) | (hdr[2] << 8) | hdr[3]; // crc\n } else if (crcLen === 2) {\n pduCrc = (hdr[0] << 8) | hdr[1]; // crc\n }\n hdr = hdr.subarray(crcLen);\n\n if (body !== undefined && body.length > 0) {\n if (\n [MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(\n pduCompression,\n ) >= 0\n ) {\n try {\n const inflated = inflateData(body, true);\n if (inflated === undefined) {\n pduErrors.push('Inflation produced no output for body');\n } else {\n pduData = inflated;\n }\n } catch (e) {\n pduErrors.push('Inflation failed for body: ' + e);\n }\n } else if (\n [MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(\n pduCompression,\n ) >= 0\n ) {\n pduData = body;\n } else {\n pduErrors.push(\n 'Unsupported v' + version + ' compression type: ' + pduCompression,\n );\n }\n\n if (pduData !== null) {\n const crcAlgoHandlerByVersion: Record<\n MIAMVersion,\n (buf: Uint8Array, seed?: number) => number\n > = {\n [MIAMVersion.V1]: (buf: Uint8Array, seed?: number) => {\n return ~this.arinc665Crc32(buf, seed);\n },\n [MIAMVersion.V2]: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n error: 'No CRC handler for v' + version,\n };\n }\n\n const crcCheck = crcAlgoHandler(pduData, 0xffffffff);\n if (crcCheck === pduCrc) {\n pduCrcIsOk = true;\n } else {\n pduErrors.push(\n 'Body failed CRC check: provided=' +\n pduCrc +\n ', generated=' +\n crcCheck,\n );\n }\n }\n } else {\n // No PDU body means we can't verify CRC checksum; however, the message should still be valid...\n pduCrcIsOk = true;\n }\n\n let pdu: Pdu = {\n version,\n crc: pduCrc,\n crcOk: pduCrcIsOk,\n complete: pduIsComplete,\n compression: pduCompression,\n encoding: pduEncoding,\n msgNum,\n ackOptions,\n };\n\n if (pduIsACARS) {\n const label = pduAppId.substring(0, 2);\n const sublabel = appIdLen >= 4 ? pduAppId.substring(2, 4) : undefined;\n const mfi = appIdLen >= 6 ? pduAppId.substring(4, 6) : undefined;\n\n pdu.acars = {\n ...(tail ? { tail } : {}),\n label,\n ...(sublabel ? { sublabel } : {}),\n ...(mfi ? { mfi } : {}),\n ...(pduData ? { text: textDecoder.decode(pduData) } : {}),\n };\n } else {\n pdu.non_acars = {\n appId: pduAppId,\n ...(pduData ? { text: textDecoder.decode(pduData) } : {}),\n };\n }\n\n return {\n decoded: true,\n message: {\n data: pdu,\n },\n };\n }\n\n static VersionPduHandlerTable: Record<\n MIAMVersion,\n Record<\n MIAMCorePdu,\n (hdr: Uint8Array, body?: Uint8Array) => PduDecodingResult\n >\n > = {\n [MIAMVersion.V1]: {\n [MIAMCorePdu.Data]: (hdr: Uint8Array, body?: Uint8Array) => {\n return this.corePduDataHandler(\n MIAMVersion.V1,\n 20,\n MIAMCoreV1CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v1 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v1 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v1 AlohaReply PDU not implemented' };\n },\n },\n [MIAMVersion.V2]: {\n [MIAMCorePdu.Data]: (hdr: Uint8Array, body?: Uint8Array) => {\n return this.corePduDataHandler(\n MIAMVersion.V2,\n 7,\n MIAMCoreV2CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v2 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v2 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v2 Aloha reply PDU not implemented' };\n },\n },\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_MA extends DecoderPlugin {\n name = 'label-ma';\n qualifiers() {\n return {\n labels: ['MA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const miamResult = MIAMCoreUtils.parse(message.text);\n if (\n miamResult.decoded &&\n miamResult.message.data &&\n miamResult.message.data.acars\n ) {\n decodeResult.decoded = true;\n ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);\n if (miamResult.message.data.acars.sublabel) {\n ResultFormatter.sublabel(\n decodeResult,\n miamResult.message.data.acars.sublabel,\n );\n }\n if (miamResult.message.data.acars.tail) {\n ResultFormatter.tail(\n decodeResult,\n miamResult.message.data.acars.tail.replace('.', ''),\n );\n }\n\n const messageText = miamResult.message.data.acars.text;\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (\n miamResult.message.data.crcOk &&\n miamResult.message.data.complete &&\n messageText\n ) {\n decodeResult.decoder.decodeLevel = 'full';\n const decoded = this.decoder.decode(\n {\n label: miamResult.message.data.acars.label,\n sublabel: miamResult.message.data.acars.sublabel,\n text: messageText,\n },\n options,\n );\n\n if (decoded.decoded) {\n // decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n } else {\n ResultFormatter.text(decodeResult, messageText);\n decodeResult.remaining = { text: messageText };\n }\n } else if (messageText) {\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.remaining = { text: messageText };\n } else {\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_SQ extends DecoderPlugin {\n name = 'label-sq';\n\n qualifiers() {\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Ground Station Squitter');\n\n decodeResult.raw.preamble = message.text.substring(0, 4);\n decodeResult.raw.version = Number(message.text.substring(1, 2));\n decodeResult.raw.network = message.text.substring(3, 4);\n\n if (decodeResult.raw.version === 2) {\n const regex =\n /0(\\d)X(?<org>\\w)(?<iata>\\w\\w\\w)(?<icao>\\w\\w\\w\\w)(?<station>\\d)(?<lat>\\d+)(?<latd>[NS])(?<lng>\\d+)(?<lngd>[EW])V(?<vfreq>\\d+)\\/.*/;\n const result = message.text.match(regex);\n\n if (result?.groups && result.length >= 8) {\n decodeResult.raw.groundStation = {\n number: result.groups.station,\n iataCode: result.groups.iata,\n icaoCode: result.groups.icao,\n coordinates: {\n latitude:\n (Number(result.groups.lat) / 100) *\n (result.groups.latd === 'S' ? -1 : 1),\n longitude:\n (Number(result.groups.lng) / 100) *\n (result.groups.lngd === 'W' ? -1 : 1),\n },\n };\n decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1000.0;\n }\n }\n\n var formattedNetwork = 'Unknown';\n if (decodeResult.raw.network == 'A') {\n formattedNetwork = 'ARINC';\n } else if (decodeResult.raw.network == 'S') {\n formattedNetwork = 'SITA';\n }\n decodeResult.formatted.items = [\n {\n type: 'network',\n code: 'NETT',\n label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n code: 'VER',\n label: 'Version',\n value: String(decodeResult.raw.version),\n },\n ];\n\n if (decodeResult.raw.groundStation) {\n if (\n decodeResult.raw.groundStation.icaoCode &&\n decodeResult.raw.groundStation.number\n ) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\n code: 'GNDSTN',\n label: 'Ground Station',\n value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,\n });\n }\n if (decodeResult.raw.groundStation.iataCode) {\n decodeResult.formatted.items.push({\n type: 'iataCode',\n code: 'IATA',\n label: 'IATA',\n value: decodeResult.raw.groundStation.iataCode,\n });\n }\n if (decodeResult.raw.groundStation.icaoCode) {\n decodeResult.formatted.items.push({\n type: 'icaoCode',\n code: 'ICAO',\n label: 'ICAO',\n value: decodeResult.raw.groundStation.icaoCode,\n });\n }\n if (decodeResult.raw.groundStation.coordinates.latitude) {\n decodeResult.formatted.items.push({\n type: 'coordinates',\n code: 'COORD',\n label: 'Ground Station Location',\n value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,\n });\n }\n if (decodeResult.raw.groundStation.airport) {\n decodeResult.formatted.items.push({\n type: 'airport',\n code: 'APT',\n label: 'Airport',\n value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,\n });\n }\n }\n\n if (decodeResult.raw.vdlFrequency) {\n decodeResult.formatted.items.push({\n type: 'vdlFrequency',\n code: 'VDLFRQ',\n label: 'VDL Frequency',\n value: `${decodeResult.raw.vdlFrequency} MHz`,\n });\n }\n this.setDecodeLevel(decodeResult, true, 'full');\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() {\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ON Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.on(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() {\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OUT Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.out(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() {\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'IN Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.in(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() {\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'OFF Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n if (message.text.substring(12, 19) === '\\r\\n001FE') {\n decodeResult.raw.day = message.text.substring(19, 21);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)),\n );\n let latdir = message.text.substring(27, 28);\n let latdeg = Number(message.text.substring(28, 30));\n let latmin = Number(message.text.substring(30, 34));\n let londir = message.text.substring(34, 35);\n let londeg = Number(message.text.substring(35, 38));\n let lonmin = Number(message.text.substring(38, 42));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));\n ResultFormatter.position(decodeResult, pos);\n\n if (decodeResult.remaining.text !== '---') {\n ResultFormatter.groundspeed(\n decodeResult,\n Number(message.text.substring(45, 48)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + '00'),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n }\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n} from './DecoderPluginInterface';\n\nimport * as Plugins from './plugins/official';\n\n/**\n * Ordered list of plugin constructors. Order matters — plugins are tried\n * sequentially until one returns decoded: true.\n */\nconst pluginClasses = [\n Plugins.CBand, // first, for now, so it can wrap other plugins\n Plugins.Arinc702,\n Plugins.Label_ColonComma,\n Plugins.Label_5Z_Slash,\n Plugins.Label_10_LDR,\n Plugins.Label_10_POS,\n Plugins.Label_10_Slash,\n Plugins.Label_12_N_Space,\n Plugins.Label_12_POS,\n Plugins.Label_13Through18_Slash,\n Plugins.Label_15,\n Plugins.Label_15_FST,\n Plugins.Label_16_Honeywell,\n Plugins.Label_16_N_Space,\n Plugins.Label_16_POSA1,\n Plugins.Label_16_TOD,\n Plugins.Label_1L_3Line,\n Plugins.Label_1L_070,\n Plugins.Label_1L_660,\n Plugins.Label_1L_Slash,\n Plugins.Label_20_POS,\n Plugins.Label_21_POS,\n Plugins.Label_22_OFF,\n Plugins.Label_22_POS,\n Plugins.Label_24_Slash,\n Plugins.Label_2P_FM3,\n Plugins.Label_2P_FM4,\n Plugins.Label_2P_FM5,\n Plugins.Label_30_Slash_EA,\n Plugins.Label_44_ETA,\n Plugins.Label_44_IN,\n Plugins.Label_44_OFF,\n Plugins.Label_44_ON,\n Plugins.Label_44_POS,\n Plugins.Label_44_Slash,\n Plugins.Label_4A,\n Plugins.Label_4A_01,\n Plugins.Label_4A_DIS,\n Plugins.Label_4A_DOOR,\n Plugins.Label_4A_Slash_01,\n Plugins.Label_4N,\n Plugins.Label_4T_AGFSR,\n Plugins.Label_4T_ETA,\n Plugins.Label_B6_Forwardslash,\n Plugins.Label_H2_02E,\n Plugins.Label_H1_ATIS,\n Plugins.Label_H1_EZF,\n Plugins.Label_H1_FLR,\n Plugins.Label_H1_M_POS,\n Plugins.Label_H1_OHMA,\n Plugins.Label_H1_OFP,\n Plugins.Label_H1_Paren,\n Plugins.Label_H1_WRN,\n Plugins.Label_H1_StarPOS,\n Plugins.Label_HX,\n Plugins.Label_58,\n Plugins.Label_80,\n Plugins.Label_83,\n Plugins.Label_8E,\n Plugins.Label_1M_Slash,\n Plugins.Label_MA,\n Plugins.Label_SQ,\n Plugins.Label_QP,\n Plugins.Label_QQ,\n Plugins.Label_QR,\n Plugins.Label_QS,\n];\n\n/**\n * Per-plugin metadata captured at registration time so that decode() can\n * avoid re-invoking plugin.qualifiers() (and re-allocating its arrays) on\n * every message.\n */\ninterface PluginEntry {\n plugin: DecoderPluginInterface;\n preambles: string[] | undefined;\n}\n\nexport class MessageDecoder {\n name: string;\n plugins: Array<DecoderPluginInterface>;\n debug: boolean;\n\n /** Maps a label string to the candidate entries (wildcard + label-specific) in registration order. */\n private candidatesByLabel: Map<string, PluginEntry[]> = new Map();\n /** Wildcard entries (plugins that register the '*' label). */\n private wildcardEntries: PluginEntry[] = [];\n /** Membership set for wildcard entries to dedupe when a plugin also registers a specific label. */\n private wildcardSet: Set<DecoderPluginInterface> = new Set();\n\n constructor() {\n this.name = 'acars-decoder-typescript';\n this.plugins = [];\n this.debug = false;\n\n for (const PluginClass of pluginClasses) {\n this.registerPlugin(new PluginClass(this));\n }\n }\n\n registerPlugin(plugin: DecoderPluginInterface): boolean {\n this.plugins.push(plugin);\n\n const qualifiers = plugin.qualifiers();\n const entry: PluginEntry = {\n plugin,\n preambles:\n qualifiers.preambles && qualifiers.preambles.length > 0\n ? qualifiers.preambles\n : undefined,\n };\n\n for (const label of qualifiers.labels) {\n if (label === '*') {\n if (!this.wildcardSet.has(plugin)) {\n this.wildcardEntries.push(entry);\n this.wildcardSet.add(plugin);\n // Insert the new wildcard at the end of the wildcard section\n // in every existing label bucket so that wildcard plugins are\n // still tried before label-specific ones while preserving\n // registration order among wildcard plugins (matching how new\n // buckets are seeded via wildcardEntries.slice() below).\n const wildcardInsertIndex = this.wildcardEntries.length - 1;\n for (const bucket of this.candidatesByLabel.values()) {\n bucket.splice(wildcardInsertIndex, 0, entry);\n }\n }\n } else {\n let bucket = this.candidatesByLabel.get(label);\n if (!bucket) {\n // Seed new bucket with all wildcard entries (in registration order)\n // so they remain ahead of label-specific plugins.\n bucket = this.wildcardEntries.slice();\n this.candidatesByLabel.set(label, bucket);\n }\n // Skip if this plugin is a wildcard plugin already in the bucket.\n if (!this.wildcardSet.has(plugin)) {\n bucket.push(entry);\n }\n }\n }\n\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const text = message.text;\n const candidates =\n this.candidatesByLabel.get(message.label) ?? this.wildcardEntries;\n\n if (options.debug) {\n console.log('Usable plugins');\n console.log(\n candidates\n .filter((e) => this.matchesPreambles(text, e.preambles))\n .map((e) => e.plugin),\n );\n }\n\n let result: DecodeResult = {\n decoded: false,\n error: 'No known decoder plugin for this message',\n decoder: {\n name: 'none',\n type: 'none',\n decodeLevel: 'none',\n },\n message: message,\n remaining: {\n text: text,\n },\n raw: {},\n formatted: {\n description: 'Not Decoded',\n items: [],\n },\n };\n\n for (let i = 0; i < candidates.length; i++) {\n const entry = candidates[i];\n if (!this.matchesPreambles(text, entry.preambles)) {\n continue;\n }\n const pluginResult = entry.plugin.decode(message, options);\n if (pluginResult.decoded) {\n result = pluginResult;\n break;\n }\n }\n\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n\n private matchesPreambles(\n text: string,\n preambles: string[] | undefined,\n ): boolean {\n if (!preambles) {\n return true;\n }\n for (let i = 0; i < preambles.length; i++) {\n if (text.startsWith(preambles[i])) {\n return true;\n }\n }\n return false;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,cAAN,MAAM,aAAY;AAAA,EACvB;AAAA,EACA;AAAA;AAAA,EAGA,OAAwB,kBAA2C;AAAA,IACjE,CAAC,OAAU,KAAQ;AAAA;AAAA,IACnB,CAAC,QAAU,MAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,SAAU,OAAQ;AAAA;AAAA,IACnB,CAAC,UAAU,QAAQ;AAAA;AAAA,IACnB,CAAC,UAAU,QAAQ;AAAA;AAAA,IACnB,CAAC,UAAU,QAAQ;AAAA;AAAA,EACrB;AAAA,EAEA,YAAY,MAAc;AACxB,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,aAAsB;AACpB,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,SAAS,GAAG,EAAE;AACxB,eAAW,CAAC,OAAO,GAAG,KAAK,aAAY,iBAAiB;AACtD,UAAI,SAAS,KAAK,KAAK,KAAK;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ACvDO,IAAM,kBAAN,MAAM,iBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3B,OAAc,wBACZ,cACqD;AAErD,UAAM,YAAY,aAAa,OAAO,CAAC;AACvC,QAAI,aAAa,aAAa,OAAO,CAAC;AACtC,QAAI,iBAAiB,aAAa,UAAU,GAAG,EAAE;AACjD,QAAI,eAAe,KAAK;AACtB,mBAAa,aAAa,OAAO,CAAC;AAClC,uBAAiB,aAAa,UAAU,GAAG,EAAE;AAAA,IAC/C;AACA,SACG,cAAc,OAAO,cAAc,SACnC,eAAe,OAAO,eAAe,MACtC;AACA,aAAO;AAAA,QACL,UACG,OAAO,aAAa,UAAU,GAAG,CAAC,CAAC,IAAI,MACxC,iBAAgB,aAAa,SAAS;AAAA,QACxC,WACG,OAAO,cAAc,IAAI,MAC1B,iBAAgB,aAAa,UAAU;AAAA,MAC3C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAc,sCACZ,cACqD;AAErD,UAAM,YAAY,aAAa,OAAO,CAAC;AACvC,QAAI,aAAa,aAAa,OAAO,CAAC;AACtC,QAAI,iBAAiB,aAAa,UAAU,GAAG,EAAE;AACjD,QAAI,eAAe,KAAK;AACtB,mBAAa,aAAa,OAAO,CAAC;AAClC,uBAAiB,aAAa,UAAU,GAAG,EAAE;AAAA,IAC/C;AAEA,QACG,cAAc,OAAO,cAAc,OACnC,eAAe,OAAO,eAAe,KACtC;AACA,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,OAAO,aAAa,UAAU,GAAG,CAAC,CAAC;AAClD,UAAM,SAAS,OAAO,cAAc;AACpC,UAAM,SAAS,KAAK,MAAM,SAAS,GAAI;AACvC,UAAM,SAAU,SAAS,MAAQ;AACjC,UAAM,SAAS,KAAK,MAAM,SAAS,GAAI;AACvC,UAAM,SAAU,SAAS,MAAQ;AAEjC,WAAO;AAAA,MACL,WACG,SAAS,SAAS,MAAM,iBAAgB,aAAa,SAAS;AAAA,MACjE,YACG,SAAS,SAAS,MAAM,iBAAgB,aAAa,UAAU;AAAA,IACpE;AAAA,EACF;AAAA,EACA,OAAc,iBAAiB,QAGpB;AACT,UAAM,SAAS,OAAO,WAAW,IAAI,MAAM;AAC3C,UAAM,SAAS,OAAO,YAAY,IAAI,MAAM;AAC5C,WAAO,GAAG,KAAK,IAAI,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,MAAM;AAAA,EAC9G;AAAA,EAEA,OAAc,aAAa,OAAuB;AAChD,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AAClD,aAAO;AAAA,IACT,WAAW,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AACzD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAc,oBACZ,SACA,SACA,SACQ;AACR,WAAO,UAAU,UAAU,KAAK,UAAU;AAAA,EAC5C;AACF;;;ACnGO,IAAM,gBAAN,MAAoB;AAAA;AAAA,EAEzB,OAAc,YAAY,WAAmB;AAC3C,QAAI,UAAU,oBAAI,KAAK;AACvB,YAAQ,YAAY,CAAC,UAAU,OAAO,GAAG,CAAC,GAAG,CAAC,UAAU,OAAO,GAAG,CAAC,GAAG,CAAC;AACvE,WAAO,QAAQ,aAAa;AAAA,EAC9B;AAAA;AAAA;AAAA,EAIA,OAAc,oBAAoB,YAAoB,YAAoB;AACxE,UAAM,MAAM,CAAC,WAAW,OAAO,GAAG,CAAC;AAEnC,UAAM,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC,IAAI;AACzC,UAAM,OACJ,WAAW,WAAW,IAClB,MAAO,CAAC,WAAW,OAAO,GAAG,CAAC,KAC9B,oBAAI,KAAK,GAAE,eAAe;AAChC,UAAM,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AACrC,UAAM,UAAU,CAAC,WAAW,OAAO,GAAG,CAAC;AACvC,UAAM,UAAU,WAAW,WAAW,IAAI,CAAC,WAAW,OAAO,GAAG,CAAC,IAAI;AAIrE,UAAM,UAAU,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,KAAK,OAAO,SAAS,OAAO,CAAC;AAC5E,WAAO,QAAQ,YAAY;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,mBAAmB,MAAsB;AACrD,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ;AAAA,IACV;AACA,UAAM,IAAI,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC;AACrC,UAAM,IAAI,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC;AACrC,UAAM,IAAI,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC;AACrC,UAAM,MAAM,IAAI,OAAO,IAAI,KAAK;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,OAAc,oBAAoB,MAAsB;AACtD,UAAM,IAAI,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC;AACrC,UAAM,IAAI,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC;AACrC,UAAM,IAAI,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC;AACrC,UAAM,IAAI,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC;AACrC,UAAM,MAAM,IAAI,QAAQ,IAAI,OAAO,IAAI,KAAK;AAC5C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAc,uBAAuB,MAAc,MAAsB;AAEvE,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,KAAK,UAAU,GAAG,CAAC,IAAI,KAAK,KAAK,UAAU,GAAG,CAAC,CAAC;AAAA,IACzD;AACA,UAAM,YAAY,GAAG,KAAK,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,GAAG,CAAC,CAAC;AACjK,UAAM,SAAS,KAAK,MAAM,SAAS;AACnC,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAc,kBAAkB,MAAsB;AACpD,UAAM,OAAO,IAAI,KAAK,OAAO,GAAI;AAEjC,QAAI,OAAO,OAAO;AAEhB,aAAO,KAAK,YAAY,EAAE,MAAM,IAAI,EAAE;AAAA,IACxC;AACA,QAAI,OAAO,SAAS;AAElB,aAAO,WAAW,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IACnD;AAEA,WAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AAAA,EAC3C;AACF;;;ACvFO,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAc,kBAAkB,OAAuB;AACrD,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,WAAW,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,OAAc,cAAc,OAAsB;AAChD,QAAI,MAAM;AACV,QAAI,MAAM,MAAM;AACd,aAAO,MAAM;AAAA,IACf;AACA,QAAI,MAAM,QAAQ;AAChB,aAAO,IAAI,MAAM,MAAM;AAAA,IACzB;AACA,QAAI,IAAI,WAAW,KAAK,MAAM,aAAa,MAAM,UAAU,WAAW,GAAG;AACvE,aAAO;AAAA,IACT,WAAW,IAAI,WAAW,KAAK,MAAM,WAAW;AAC9C,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,WAAW;AACnB,aAAO,YAAW,kBAAkB,MAAM,SAAS;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAc,iBAAiB,UAA4B;AACzD,QAAI,IAAI,SAAS;AACjB,QAAI,SAAS,YAAY,SAAS,WAAW;AAC3C,WAAK,IAAI,gBAAgB,iBAAiB,EAAE,UAAU,SAAS,UAAU,WAAW,SAAS,UAAU,CAAC,CAAC;AAAA,IAC3G;AACA,QAAI,SAAS,QAAQ;AACnB,WAAK,IAAI,SAAS,OAAO,OAAO,QAAK,SAAS,OAAO,QAAQ;AAAA,IAC/D;AACA,QAAI,SAAS,MAAM;AACjB,WAAK,IAAI,cAAc,kBAAkB,SAAS,IAAI,CAAC;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAc,YAAY,KAAuB;AAC/C,UAAM,QAAQ,IAAI,MAAM,2BAA2B;AACnD,QAAI,OAAO,UAAU,GAAG;AACtB,aAAO;AAAA,QACL,MAAM,MAAM,CAAC;AAAA,QACb,QAAQ;AAAA,UACN,SAAS,SAAS,MAAM,CAAC,CAAC;AAAA,UAC1B,UAAU,SAAS,MAAM,CAAC,CAAC,IAAI;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,MAAM,GAAG;AAC9B,QAAI,SAAS,UAAU,GAAG;AACxB,YAAM,WAAW,gBAAgB;AAAA,QAC/B,SAAS,CAAC;AAAA,MACZ;AACA,UAAI,UAAU;AACZ,eAAO;AAAA,UACL,MAAM,SAAS,CAAC;AAAA,UAChB,UAAU,SAAS;AAAA,UACnB,WAAW,SAAS;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,UAAU,MAAM,IAAI,UAAU,IAAI;AAExC,YAAM,WACJ,gBAAgB,sCAAsC,GAAG;AAC3D,YAAM,OAAO,SAAS,UAAU,IAAI,SAAS,CAAC,IAAI;AAClD,UAAI,UAAU;AACZ,eAAO;AAAA,UACL;AAAA,UACA,UAAU,SAAS;AAAA,UACnB,WAAW,SAAS;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,MAAM,IAAI;AAAA,EACrB;AAAA,EAEA,OAAe,kBAAkB,WAA+B;AAC9D,QAAI,MAAM,UACP,IAAI,CAAC,MAAM,YAAW,iBAAiB,CAAC,CAAC,EACzC,KAAK,KAAK,EACV,WAAW,QAAQ,IAAI;AAC1B,QAAI,IAAI,WAAW,KAAK,GAAG;AACzB,YAAM,OAAO,IAAI,MAAM,CAAC;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AACF;;;ACrGO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,MAAM,cAA4B,OAAc;AACrD,iBAAa,IAAI,QAAQ;AACzB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,WAAW,cAAc,KAAK;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,aAAa,cAA4B,MAAc,IAAY;AACxE,iBAAa,IAAI,eAAe;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AACA,WAAO,WAAW,kBAAkB,IAAI;AACxC,SAAK,WAAW,kBAAkB,EAAE;AACpC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,IAAI,OAAO,EAAE;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,WAAW,cAA4B,MAAc,OAAe;AACzE,iBAAa,IAAI,aAAa;AAAA,MAC5B,MAAM;AAAA,MACN;AAAA,IACF;AAEA,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,IAAI,IAAI,KAAK;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,SACL,cACA,OACA;AACA,QAAI,CAAC,SAAS,MAAM,MAAM,QAAQ,KAAK,MAAM,MAAM,SAAS,GAAG;AAC7D;AAAA,IACF;AACA,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,gBAAgB,iBAAiB,KAAK;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,SAAS,cAA4B,OAAe;AACzD,QAAI,MAAM,KAAK,GAAG;AAChB;AAAA,IACF;AACA,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,QAAQ;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,aAAa,cAA4B,OAAe;AAC7D,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AACA,iBAAa,IAAI,gBAAgB;AACjC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,SAAS,cAA4B,OAAe;AACzD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,iBACL,cACA,OACA,OAAwB,QACxB;AACA,QAAI,SAAS,QAAQ;AACnB,mBAAa,IAAI,iBAAiB;AAClC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,IAAI,iBAAiB;AAClC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,gBAAgB,cAA4B,OAAe;AAChE,iBAAa,IAAI,mBAAmB;AACpC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,eACL,cACA,OACA,OAAwB,QACxB;AACA,QAAI,SAAS,QAAQ;AACnB,mBAAa,IAAI,eAAe;AAChC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,IAAI,eAAe;AAChC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,iBAAiB,cAA4B,OAAe;AACjE,iBAAa,IAAI,iBAAiB;AAClC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,IAAI,cAA4B,MAAc;AACnD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,cAAc,kBAAkB,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,cAAc,cAA4B,OAAe;AAC9D,iBAAa,IAAI,iBAAiB;AAClC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,gBAAgB,cAA4B,OAAe;AAChE,iBAAa,IAAI,mBAAmB;AACpC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,YAAY,cAA4B,OAAe;AAC5D,iBAAa,IAAI,gBAAgB;AACjC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,cAAc,SAAS;AAAA,IACjD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,WAAW,cAA4B,OAAe;AAC3D,iBAAa,IAAI,cAAc;AAC/B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,YAAY,SAAS;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,cAAc,cAA4B,OAAe;AAC9D,iBAAa,IAAI,iBAAiB;AAClC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,eAAe,SAAS;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ,cAA4B,OAAe;AACxD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,SAAS,SAAS,IAAI;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ,cAA4B,OAAe;AACxD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,SAAS,SAAS,IAAI;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,OAAO,cAA4B,OAAe;AACvD,iBAAa,IAAI,UAAU;AAC3B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,QAAQ,SAAS,IAAI;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,OAAO,cAA4B,OAAe;AACvD,iBAAa,IAAI,UAAU;AAC3B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,QAAQ,SAAS,IAAI;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,UAAU,cAA4B,OAAe;AAC1D,iBAAa,IAAI,aAAa;AAC9B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,WAAW,SAAS,IAAI;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,kBAAkB,cAA4B,OAAe;AAClE,iBAAa,IAAI,qBAAqB;AAAA,EAOxC;AAAA,EAEA,OAAO,SAAS,cAA4B,OAAe;AACzD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,QAAQ,SAAS,aAAa,IAAI,SAAS,SAAS,EAAE,GAAG,MAAM,EAAE;AAAA,IAC1E,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,YAAY,cAA4B,OAAe;AAC5D,iBAAa,IAAI,cAAc;AAC/B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,WAAW;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,SAAS,cAA4B,OAAe;AACzD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,QAAQ;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,KAAK,cAA4B,OAAe;AACrD,iBAAa,IAAI,OAAO;AACxB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,IAAI;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,YAAY,cAA4B,OAAe;AAC5D,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AACA,iBAAa,IAAI,0BAA0B;AAAA,MACzC,MAAM,QAAQ,KAAK,GAAG,EAAE,QAAQ,KAAK,GAAG;AAAA,IAC1C;AACA,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,uBAAuB;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,aAAa,cAA4B,OAAe;AAC7D,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AACA,iBAAa,IAAI,wBAAwB;AAAA,MACvC,MAAM,QAAQ,KAAK,GAAG,EAAE,QAAQ,KAAK,GAAG;AAAA,IAC1C;AACA,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,qBAAqB;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ,cAA4B,OAAe;AACxD,iBAAa,IAAI,UAAU;AAC3B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,OAAO;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,KAAK,cAA4B,OAAe;AACrD,iBAAa,IAAI,OAAO;AACxB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,IAAI,cAA4B,MAAc;AACnD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,cAAc,kBAAkB,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,IAAI,cAA4B,MAAc;AACnD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,cAAc,kBAAkB,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,GAAG,cAA4B,MAAc;AAClD,iBAAa,IAAI,UAAU;AAC3B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,cAAc,kBAAkB,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,GAAG,cAA4B,MAAc;AAClD,iBAAa,IAAI,UAAU;AAC3B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,cAAc,kBAAkB,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,YAAY,cAA4B,MAAc;AAC3D,iBAAa,IAAI,oBAAoB;AACrC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,cAAc,kBAAkB,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EACA,OAAO,WAAW,cAA4B,MAAc;AAC1D,iBAAa,IAAI,mBAAmB;AACpC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,cAAc,kBAAkB,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,IAAI,cAA4B,KAAa;AAClD,iBAAa,IAAI,MAAM;AACvB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,GAAG;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAM,cAA4B,OAAe;AACtD,iBAAa,IAAI,QAAQ;AACzB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,KAAK;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,aAAa,cAA4B,KAAa;AAC3D,iBAAa,IAAI,gBAAgB;AACjC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,GAAG;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,WAAW,cAA4B,KAAa;AACzD,iBAAa,IAAI,cAAc;AAC/B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,GAAG;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,KAAK,cAA4B,MAAc;AACpD,iBAAa,IAAI,OAAO;AACxB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,IAAI,cAA4B,KAAa;AAClD,iBAAa,IAAI,MAAM;AACvB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,GAAG;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,KAAK,cAA4B,MAAc;AACpD,iBAAa,IAAI,OAAO;AACxB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,IAAI;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,SAAS,cAA4B,UAAkB;AAC5D,iBAAa,IAAI,YAAY;AAC7B,eAAW,QAAQ,UAAU;AAC3B,UAAI,OAAO,GAAG,WAAW,iBAAiB,KAAK,QAAQ,CAAC,SAAS,KAAK,WAAW,KAAK,KAAK,aAAa,WAAQ,KAAK,SAAS;AAC9H,UAAI,KAAK,aAAa;AACpB,gBAAQ,KAAK,KAAK,YAAY,QAAQ,cAAW,KAAK,YAAY,WAAW;AAAA,MAC/E;AACA,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,GACL,cACA,OACA,OAAqC,UACrC;AACA,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,qBAAa,IAAI,oBAAoB;AACrC,qBAAa,UAAU,MAAM,KAAK;AAAA,UAChC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO,GAAG,aAAa,IAAI,iBAAiB;AAAA,QAC9C,CAAC;AACD;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,iBAAiB;AAClC,qBAAa,UAAU,MAAM,KAAK;AAAA,UAChC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO,GAAG,aAAa,IAAI,cAAc;AAAA,QAC3C,CAAC;AACD;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,iBAAiB;AAClC,qBAAa,UAAU,MAAM,KAAK;AAAA,UAChC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO,GAAG,aAAa,IAAI,cAAc;AAAA,QAC3C,CAAC;AACD;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,cAA4B,OAAe;AACxD,iBAAa,IAAI,UAAU;AAC3B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,IAAI,aAAa,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAM,cAA4B,OAAe;AACtD,iBAAa,IAAI,QAAQ;AACzB,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,KAAK;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,SAAS,cAA4B,OAAe;AACzD,iBAAa,IAAI,WAAW;AAC5B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,QAAQ;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,mBAAmB,cAA4B,QAAkB;AACtE,iBAAa,IAAI,iBAAiB;AAClC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,eAAe,KAAK,IAAI,CAAC;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,gBAAgB,cAA4B,OAAe;AAChE,iBAAa,IAAI,cAAc;AAC/B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,WAAW;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,WAAW,cAA4B,OAAe;AAC3D,iBAAa,IAAI,cAAc;AAC/B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,WAAW;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,YAAY,cAA4B,OAAe;AAC5D,iBAAa,IAAI,eAAe;AAChC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,YAAY;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,WAAW,cAA4B,OAAe;AAC3D,iBAAa,IAAI,cAAc;AAC/B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,WAAW;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,cAAc,cAA4B,OAAe;AAC9D,iBAAa,IAAI,iBAAiB;AAClC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,cAAc;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,UAAU,cAA4B,OAAe;AAC1D,iBAAa,IAAI,oBAAoB;AACrC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,cAAc,kBAAkB,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,eAAe,cAA4B,OAAe;AAC/D,iBAAa,IAAI,kBAAkB;AACnC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,gBAAgB,SAAS;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,iBAAiB,cAA4B,OAAe;AACjE,iBAAa,IAAI,oBAAoB;AACrC,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,kBAAkB,SAAS;AAAA,IACrD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ,cAA4B,OAAe,MAAc,KAAK;AAC3E,QAAI,CAAC,aAAa,UAAU,KAAM,cAAa,UAAU,OAAO;AAAA,QAC3D,cAAa,UAAU,QAAQ,MAAM;AAAA,EAC5C;AAAA,EAEA,OAAO,WACL,cACA,OACA,MAAc,KACd;AACA,SAAK,QAAQ,cAAc,MAAM,KAAK,GAAG,GAAG,GAAG;AAAA,EACjD;AACF;;;AC3qBO,IAAe,gBAAf,MAA+D;AAAA,EACpE;AAAA,EAEA,OAAe;AAAA,EAEf,gBAA8B;AAC5B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,aAAa;AAAA,QACb,OAAO,CAAC;AAAA,MACV;AAAA,MACA,KAAK,CAAC;AAAA,MACN,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,WAAW,SAAkB,aAAmC;AACxE,UAAM,SAAS,KAAK,cAAc;AAClC,WAAO,QAAQ,OAAO,KAAK;AAC3B,WAAO,UAAU,cAAc;AAC/B,WAAO,UAAU;AACjB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,eACR,QACA,SACA,OACM;AACN,WAAO,UAAU;AACjB,QAAI,SAAS;AACX,aAAO,QAAQ,cACb,UAAU,OAAO,UAAU,OAAO,YAAY;AAAA,IAClD,OAAO;AACL,aAAO,QAAQ,cAAc;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,MAAM,YAAqB,MAAuB;AAC1D,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,YACR,QACA,MACA,UAAmB,CAAC,GACN;AACd,SAAK,MAAM,SAAS,oBAAoB,IAAI,EAAE;AAC9C,oBAAgB,QAAQ,QAAQ,IAAI;AACpC,WAAO,UAAU;AACjB,WAAO,QAAQ,cAAc;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA;AAAA,EAEA,YAAY,SAAyB,UAAmB,CAAC,GAAG;AAC1D,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,KAAa;AACX,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,yBAAkC;AAChC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,aAAyB;AACvB,UAAM,SAAwB,CAAC;AAE/B,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,UAAU,OAAO,QAAQ;AACtC,WAAO;AAAA,EACT;AACF;;;AChHA,IAAM,eACJ;AAEK,IAAM,QAAN,cAAoB,cAAc;AAAA,EACvC,OAAO;AAAA,EACP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,GAAG;AAAA,IACd;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,OAAO,QAAQ;AAGrB,QAAI,KAAK,SAAS,IAAI;AACpB,YAAM,SAAS,KAAK,cAAc;AAClC,aAAO,QAAQ,OAAO,KAAK;AAC3B,aAAO,UAAU;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,aAAa,KAAK,IAAI;AACpC,QAAI,CAAC,OAAO,QAAQ;AAClB,YAAM,SAAS,KAAK,cAAc;AAClC,aAAO,QAAQ,OAAO,KAAK;AAC3B,aAAO,UAAU;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,QAAQ;AAAA,MAC3B;AAAA,QACE,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ;AAAA,QAClB,MAAM,KAAK,UAAU,EAAE;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AAEvB,QAAI,QAAQ,SAAS;AACnB,sBAAgB;AAAA,QACd;AAAA,QACA,MAAM,OAAO,UAAU,OAAO,MAAM,OAAO,MAAM;AAAA,MACnD;AACA,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc,QAAQ,QAAQ;AACnD,mBAAa,QAAQ,OAAO,KAAK,OAAO,MAAM,QAAQ,QAAQ;AAC9D,mBAAa,MAAM,EAAE,GAAG,aAAa,KAAK,GAAG,QAAQ,IAAI;AACzD,mBAAa,UAAU,cAAc,QAAQ,UAAU;AACvD,mBAAa,UAAU,MAAM,KAAK,GAAG,QAAQ,UAAU,KAAK;AAC5D,mBAAa,YAAY,QAAQ;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AACF;;;ACjEO,IAAM,kBAAN,MAAM,iBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW3B,OAAc,kBACZ,cACA,MACS;AACT,QAAI,iBAAiB,iBAAgB,YAAY,cAAc,KAAK,CAAC,CAAC;AACtE,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,YAAM,OAAO,KAAK,CAAC;AACnB,YAAM,QAAQ,KAAK,IAAI,CAAC;AAExB,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,2BAAgB,aAAa,cAAc,OAAO,SAAS;AAC3D;AAAA,QACF,KAAK;AACH,4BAAkB,cAAc,KAAK;AACrC;AAAA,QACF,KAAK;AACH,2BAAgB,aAAa,cAAc,OAAO,UAAU;AAC5D;AAAA,QACF,KAAK;AACH,0BAAgB,cAAc,KAAK;AACnC;AAAA,QACF,KAAK;AACH,2BAAgB,aAAa,cAAc,OAAO,WAAW;AAC7D;AAAA,QACF,KAAK;AACH,8BAAoB,cAAc,KAAK;AACvC;AAAA,QACF,KAAK;AACH,mBAAS,cAAc,KAAK;AAC5B;AAAA,QACF,KAAK;AACH,0BAAgB,WAAW,cAAc,MAAM,KAAK,CAAC;AACrD;AAAA,QACF,KAAK;AACH,oBAAU,cAAc,KAAK;AAC7B;AAAA;AAAA;AAAA,QAGF;AACE,cAAI,gBAAgB;AAClB,yBAAa,UAAU,OAAO;AAC9B,6BAAiB;AAAA,UACnB;AACA,uBAAa,UAAU,QAAQ,IAAI,IAAI,IAAI,KAAK;AAChD,uBAAa,QAAQ,cAAc;AAAA,MACvC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,OAAc,YACZ,cACA,QACS;AACT,QAAI,iBAAiB;AACrB,QAAI,OAAO,WAAW,IAAI,GAAG;AAC3B,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AACD,mBAAa,IAAI,eAAe;AAChC,UAAI,OAAO,SAAS,GAAG;AACrB,iBAAS,cAAc,OAAO,UAAU,CAAC,CAAC;AAAA,MAC5C;AAAA,IACF,WAAW,OAAO,WAAW,IAAI,GAAG;AAClC,mBAAa,IAAI,eAAe;AAChC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AACD,UAAI,OAAO,SAAS,GAAG;AACrB,iBAAS,cAAc,OAAO,UAAU,CAAC,CAAC;AAAA,MAC5C;AAAA,IACF,WAAW,OAAO,WAAW,IAAI,GAAG;AAClC,mBAAa,IAAI,eAAe;AAChC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,IACH,WAAW,OAAO,WAAW,IAAI,GAAG;AAClC,mBAAa,IAAI,eAAe;AAChC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,IACH,WAAW,OAAO,WAAW,IAAI,GAAG;AAClC,mBAAa,IAAI,eAAe;AAChC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,UAAU,QAAQ;AAC/B,uBAAiB;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAc,aACZ,cACA,OACA,MACA;AACA,QAAI,aAAa,IAAI,eAAe,QAAW;AAC7C,mBAAa,IAAI,aAAa,CAAC;AAAA,IACjC;AACA,UAAM,OAAO,MAAM,MAAM,GAAG;AAC5B,QAAI;AACJ,QAAI,KAAK,SAAS,GAAG;AACnB,kBAAY,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,WAAW,YAAY,GAAG,CAAC;AAAA,IACpE;AACA,UAAM,QAAQ,EAAE,MAAM,KAAK,CAAC,GAAG,UAAqB;AACpD,iBAAa,IAAI,WAAW,KAAK,EAAE,MAAY,MAAa,CAAC;AAC7D,UAAM,gBAAgB,KAAK,UAAU,GAAG,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AACvE,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,GAAG,aAAa;AAAA,MACvB,OAAO,WAAW,cAAc,KAAK;AAAA,IACvC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,kBAAkB,cAA4B,OAAe;AACpE,kBAAgB,eAAe,cAAc,KAAK;AACpD;AAEA,SAAS,oBAAoB,cAA4B,OAAe;AACtE,kBAAgB,iBAAiB,cAAc,KAAK;AACtD;AAEA,SAAS,UAAU,cAA4B,OAAe;AAE5D,MAAI,MAAM,WAAW,GAAG;AACtB,oBAAgB,cAAc,cAAc,MAAM,UAAU,GAAG,CAAC,CAAC;AAAA,EACnE;AAEA,kBAAgB,gBAAgB,cAAc,MAAM,UAAU,GAAG,CAAC,CAAC;AACrE;AAEA,SAAS,SAAS,cAA4B,OAAe;AAC3D,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,kBAAgB,MAAM,cAAc;AAAA,IAClC,WAAW,MAAM,IAAI,CAAC,QAAQ,WAAW,YAAY,GAAG,CAAC;AAAA,EAC3D,CAAC;AACH;AAEA,SAAS,gBAAgB,cAA4B,OAAe;AAClE,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAM,aAAa,SAAS,CAAC,EAAE,QAAQ,GAAG;AAC1C,MAAI;AACJ,MAAI;AACJ,MAAI,eAAe,IAAI;AACrB,WAAO,SAAS,CAAC;AAAA,EACnB,OAAO;AACL,WAAO,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU;AACtC,aAAS,SAAS,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC,EAAE,QAAQ,GAAG,CAAC;AAAA,EACrE;AACA,MAAI;AACJ,MAAI,SAAS,SAAS,GAAG;AACvB,gBAAY,SAAS,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,WAAW,YAAY,GAAG,CAAC;AAAA,EACxE;AACA,eAAa,IAAI,gBAAgB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,eAAa,UAAU,MAAM,KAAK;AAAA,IAChC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO,WAAW,cAAc,aAAa,IAAI,aAAa;AAAA,EAChE,CAAC;AACH;;;AC1LA,SAAS,mBAAmB,MAA0B;AACpD,QAAM,QAAQ,IAAI,WAAW,KAAK,MAAM;AACxC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,OAAM,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI;AACtE,SAAO;AACT;AAUO,IAAM,iBAAN,MAAM,gBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa1B,OAAc,gBAAgB,cAA4B,SAAiB;AACzE,iBAAa,UAAU,OAAO;AAC9B,UAAM,WAAW,SAAS,QAAQ,MAAM,EAAE,GAAG,EAAE;AAC/C,UAAM,OAAO,QAAQ,MAAM,GAAG,QAAQ,SAAS,CAAC;AAChD,QAAI,wBAAwB;AAC5B,QAAI,gBAAgB,IAAI,MAAM,UAAU;AAEtC,8BAAwB;AAAA,IAC1B,WAAW,aAAa,IAAI,MAAM,UAAU;AAE1C,8BAAwB;AAAA,IAC1B,OAAO;AACL,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,YAAY,iBAAiB,cAAc,OAAO,CAAC,CAAC;AAC1D,QAAI,CAAC,WAAW;AACd,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AACA,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;AACtC,YAAM,MAAM,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC;AACpC,YAAMA,QAAO,OAAO,CAAC,EAAE,UAAU,CAAC;AAClC,cAAQ,KAAK;AAAA,QACX,KAAK;AACH,0BAAgB,cAAcA,MAAK,MAAM,GAAG,CAAC;AAC7C;AAAA,QACF,KAAK;AACH,0BAAgB,QAAQ,cAAc,OAAO,CAAC,GAAG,GAAG;AAEpD;AAAA,QACF,KAAK;AACH,iCAAuB,cAAcA,MAAK,MAAM,GAAG,CAAC;AACpD;AAAA,QACF,KAAK;AACH,0BAAgB,cAAcA,MAAK,MAAM,GAAG,CAAC;AAC7C;AAAA,QACF,KAAK;AACH,0BAAgB,QAAQ,cAAc,OAAO,CAAC,GAAG,GAAG;AAEpD;AAAA,QACF,KAAK;AACH,oBAAU,cAAcA,MAAK,MAAM,GAAG,CAAC;AACvC;AAAA,QACF,KAAK;AACH,0BAAgB;AAAA,YACd;AAAA,YACA,SAASA,OAAM,EAAE,IAAI;AAAA,UACvB;AAEA;AAAA,QACF,KAAK;AACH,qBAAWA,OAAM,cAAc,QAAQ,CAAC;AACxC;AAAA,QACF,KAAK;AACH,0BAAgB,YAAY,cAAc,SAASA,OAAM,EAAE,CAAC;AAC5D;AAAA,QACF,KAAK;AACH,uBAAa,IAAI,gBAAgBA;AACjC;AAAA,QACF,KAAK;AACH,0BAAgB,KAAK,cAAcA,KAAI;AACvC;AAAA,QACF,KAAK;AACH,0BAAgB,cAAc,cAAcA,KAAI;AAChD;AAAA,QACF,KAAK;AACH,gCAAsB,cAAcA,MAAK,MAAM,GAAG,CAAC;AACnD;AAAA,QACF,KAAK;AACH,+BAAqB,cAAcA,MAAK,MAAM,GAAG,CAAC;AAClD;AAAA,QACF,KAAK;AACH,kCAAwB,cAAcA,MAAK,MAAM,GAAG,CAAC;AACrD;AAAA,QACF,KAAK;AACH,iCAAuB,cAAcA,MAAK,MAAM,GAAG,CAAC;AACpD;AAAA;AAAA;AAAA;AAAA;AAAA,QAKF,KAAK;AACH,0BAAe,UAAU,cAAcA,MAAK,MAAM,GAAG,CAAC;AACtD;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAEH,0BAAgB,kBAAkB,cAAc,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC;AACpE;AAAA,QACF,KAAK;AACH,0BAAgB,YAAY,cAAcA,KAAI;AAC9C;AAAA,QACF,KAAK;AACH,wBAAc,cAAcA,MAAK,MAAM,GAAG,CAAC;AAC3C;AAAA,QACF,KAAK;AACH,yBAAe,cAAcA,MAAK,MAAM,GAAG,CAAC;AAC5C;AAAA,QACF,KAAK;AACH,uBAAa,IAAI,gBAAgBA;AACjC;AAAA,QACF,KAAK;AACH,0BAAgB,WAAW,cAAcA,KAAI;AAC7C;AAAA,QACF,KAAK;AACH,iCAAuB,cAAcA,MAAK,MAAM,GAAG,CAAC;AACpD;AAAA,QACF,KAAK;AACH,0BAAe,iBAAiB,cAAcA,MAAK,MAAM,GAAG,CAAC;AAC7D;AAAA,QACF,KAAK;AACH,0BAAgB,QAAQ,cAAc,SAASA,OAAM,EAAE,IAAI,EAAE;AAC7D;AAAA,QACF,KAAK;AACH,0BAAgB,cAAcA,KAAI;AAClC;AAAA,QACF,KAAK;AACH,8BAAoB,cAAcA,MAAK,MAAM,GAAG,CAAC;AACjD;AAAA,QACF;AACE,0BAAgB,QAAQ,cAAc,OAAO,CAAC,GAAG,GAAG;AAAA,MACxD;AAAA,IACF;AAEA,oBAAgB,kBAAkB,cAAc,qBAAqB;AACrE,oBAAgB,SAAS,cAAc,QAAQ;AAE/C,WAAO;AAAA,EACT;AAAA,EAEA,OAAc,UAAU,cAA4B,MAAgB;AAClE,UAAM,WAAW,gBAAgB;AAAA,MAC/B,KAAK,CAAC;AAAA,IACR;AACA,QAAI,UAAU;AACZ,sBAAgB,SAAS,cAAc,QAAQ;AAAA,IACjD;AACA,QAAI,KAAK,WAAW,GAAG;AAErB,mBAAa,cAAc,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,MAAS;AACxE,sBAAgB,SAAS,cAAc,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG;AAC5D,sBAAgB,YAAY,cAAc,KAAK,CAAC,CAAC;AACjD,sBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C,sBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAAA,IAC/C;AACA,QAAI,KAAK,WAAW,IAAI;AAEtB,sBAAgB,SAAS,cAAc,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG;AAC5D,mBAAa,cAAc,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACtE,sBAAgB,YAAY,cAAc,KAAK,CAAC,CAAC;AACjD,sBAAgB,WAAW,cAAc,KAAK,MAAM,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,OAAc,gBAAgB,cAA4B,MAAgB;AACxE,UAAM,WAAW,gBAAgB;AAAA,MAC/B,KAAK,CAAC;AAAA,IACR;AACA,QAAI,UAAU;AACZ,sBAAgB,SAAS,cAAc,QAAQ;AAAA,IACjD;AACA,QAAI,KAAK,UAAU,IAAI;AAErB,sBAAgB,SAAS,cAAc,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG;AAC5D,mBAAa,cAAc,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACtE,sBAAgB,YAAY,cAAc,KAAK,CAAC,CAAC;AACjD,sBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C,sBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAAA,IAC/C;AACA,QAAI,KAAK,UAAU,IAAI;AAErB,sBAAgB,WAAW,cAAc,KAAK,MAAM,EAAE,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,OAAc,iBAAiB,cAA4B,MAAgB;AACzE,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,eAAe,KAAK,MAAM,CAAC;AACjC,mBAAa,CAAC,IAAI,aAAa,CAAC,EAAE,UAAU,CAAC;AAC7C,WAAK,gBAAgB,cAAc,YAAY;AAAA,IACjD;AACA,QAAI,OAAO,cAAc;AAAA,MACvB,KAAK,CAAC;AAAA,MACN,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC;AAAA,IACxB;AAEA,QAAI,OAAO,MAAM,IAAI,GAAG;AAEtB,YAAM,OACJ,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,IACtB,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,IACtB,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC;AACxB,aAAO,cAAc,uBAAuB,KAAK,CAAC,GAAG,IAAI;AAAA,IAC3D;AACA,iBAAa,IAAI,oBAAoB;AAAA,EACvC;AACF;AAEA,SAAS,WACP,MACA,cACA,QACA,GACA;AACA,MAAI,KAAK,WAAW,GAAG;AAErB,oBAAgB,IAAI,cAAc,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC;AAC9D,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,KAAK,UAAU,CAAC,CAAC;AAAA,IACpD;AAAA,EACF,WAAW,KAAK,WAAW,GAAG;AAE5B,oBAAgB,IAAI,cAAc,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC;AAC9D,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,KAAK,UAAU,CAAC,CAAC;AAAA,IACpD;AAAA,EACF,OAAO;AACL,oBAAgB,QAAQ,cAAc,OAAO,CAAC,GAAG,GAAG;AAAA,EACtD;AACF;AAEA,SAAS,gBAAgB,cAA4B,MAAgB;AACnE,MAAI,KAAK,WAAW,GAAG;AACrB,oBAAgB,iBAAiB,cAAc,KAAK,CAAC,CAAC;AACtD,oBAAgB,eAAe,cAAc,KAAK,CAAC,CAAC;AAAA,EACtD,OAAO;AACL,oBAAgB,QAAQ,cAAc,KAAK,KAAK,GAAG,GAAG,KAAK;AAAA,EAC7D;AACF;AACA,SAAS,uBAAuB,cAA4B,MAAgB;AAC1E,MAAI,KAAK,WAAW,GAAG;AACrB,iBAAa,IAAI,yBAAyB,KAAK,CAAC;AAChD,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,WAAW,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,IAC9F,CAAC;AAED,iBAAa,IAAI,2BAA2B,KAAK,CAAC;AAClD,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH,OAAO;AACL,oBAAgB,QAAQ,cAAc,KAAK,KAAK,GAAG,GAAG,KAAK;AAAA,EAC7D;AACF;AAEA,SAAS,sBAAsB,cAA4B,MAAgB;AACzE,kBAAgB,KAAK,cAAc,KAAK,CAAC,CAAC;AAC1C,MAAI,KAAK,SAAS,GAAG;AACnB,oBAAgB,aAAa,cAAc,KAAK,CAAC,CAAC;AAAA,EACpD;AACA,MAAI,KAAK,SAAS,GAAG;AAEnB,iBAAa,IAAI,iBAAiB,KAAK,CAAC;AAAA,EAC1C;AACF;AAEA,SAAS,UAAU,cAA4B,MAAgB;AAC7D,MAAI,KAAK,WAAW,GAAG;AACrB,oBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C,QAAI,CAAC,aAAa,IAAI,cAAc;AAClC,sBAAgB,eAAe,cAAc,KAAK,CAAC,CAAC;AAAA,IACtD;AACA,oBAAgB,cAAc,cAAc,KAAK,CAAC,CAAC;AACnD,oBAAgB,YAAY,cAAc,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AAC/D,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,KAAK,CAAC,CAAC;AAAA,IAC1C;AACA,oBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C,oBAAgB;AAAA,MACd;AAAA,MACA,gBAAgB,wBAAwB,KAAK,CAAC,CAAC;AAAA,IACjD;AACA,oBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C,oBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C;AAAA,EACF;AACA,MAAI,KAAK,WAAW,KAAK,KAAK,WAAW,GAAG;AAC1C,QAAI,CAAC,aAAa,IAAI,cAAc;AAClC,sBAAgB,eAAe,cAAc,KAAK,CAAC,CAAC;AAAA,IACtD;AACA,oBAAgB,cAAc,cAAc,KAAK,CAAC,CAAC;AACnD,oBAAgB,YAAY,cAAc,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AAC/D,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,KAAK,CAAC,CAAC;AAAA,IAC1C;AACA,QAAI,KAAK,SAAS,GAAG;AACnB,sBAAgB,cAAc,cAAc,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,IAC7D;AACA;AAAA,EACF;AACA,kBAAgB,WAAW,cAAc,MAAM,GAAG;AACpD;AAEA,SAAS,qBAAqB,cAA4B,MAAgB;AACxE,MAAI,KAAK,WAAW,IAAI;AACtB,oBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C,oBAAgB,aAAa,cAAc,KAAK,CAAC,CAAC;AAClD,oBAAgB,iBAAiB,cAAc,KAAK,CAAC,CAAC;AACtD,oBAAgB,eAAe,cAAc,KAAK,CAAC,CAAC;AACpD,oBAAgB,cAAc,cAAc,KAAK,CAAC,CAAC;AACnD,oBAAgB,QAAQ,cAAc,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,EACnE,OAAO;AACL,oBAAgB,QAAQ,cAAc,KAAK,KAAK,GAAG,CAAC;AAAA,EACtD;AACF;AAEA,SAAS,uBAAuB,cAA4B,MAAgB;AAC1E,MAAI,KAAK,WAAW,GAAG;AACrB,QAAI,KAAK,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,IAAI;AAC3C,sBAAgB,GAAG,cAAc,SAAS,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;AAAA,IAC7D;AAAA,EACF,WAAW,KAAK,WAAW,GAAG;AAC5B,QAAI,KAAK,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,IAAI;AAC3C,sBAAgB,GAAG,cAAc,SAAS,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,QAAQ;AAAA,IACvE;AACA,QAAI,KAAK,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,IAAI;AAC3C,sBAAgB,GAAG,cAAc,SAAS,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,OAAO;AAAA,IACtE;AACA,QAAI,KAAK,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,IAAI;AAC3C,sBAAgB,GAAG,cAAc,SAAS,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,OAAO;AAAA,IACtE;AAAA,EACF,OAAO;AACL,oBAAgB,QAAQ,cAAc,KAAK,KAAK,GAAG,CAAC;AAAA,EACtD;AACF;AAEA,SAAS,iBACP,cACA,aACS;AACT,QAAM,eAAe,YAAY,MAAM,GAAG;AAC1C,QAAM,cAAc,aAAa,CAAC;AAClC,MAAI,YAAY,WAAW,KAAK,GAAG;AACjC,mBAAe;AAAA,MACb;AAAA,MACA,YAAY,UAAU,CAAC,EAAE,MAAM,GAAG;AAAA,IACpC;AACA,WAAO,WAAW,cAAc,KAAK;AAAA,EACvC,WAAW,YAAY,WAAW,GAAG;AACnC,UAAM,QAAQ,WAAW,cAAc,YAAY,UAAU,GAAG,CAAC,CAAC;AAClE,UAAM,cAAc,aAAa,UAAU;AAC3C,UAAM,QAAQ,WAAW,cAAc,YAAY,UAAU,GAAG,CAAC,CAAC;AAClE,iBAAa,UAAU,cACrB,cAAc,UAAU,aAAa,UAAU;AACjD,QAAI,aAAa,SAAS,GAAG;AAE3B,sBAAgB;AAAA,QACd;AAAA,QACA,aAAa,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,aAAa,SAAS,GAAG;AAE3B,oBAAgB,QAAQ,cAAc,aAAa,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,GAAG;AAAA,EAC5E;AAEA,SAAO,WAAW,cAAc,WAAW;AAC7C;AASA,SAAS,WAAW,cAA4B,MAAuB;AACrE,MAAI,SAAS,OAAO;AAClB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,WAAW,SAAS,OAAO;AACzB,iBAAa,UAAU,cAAc;AAAA,EACvC,OAAO;AACL,iBAAa,UAAU,cAAc;AACrC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,cAA4B,MAAgB;AAc1E,MAAI,KAAK,SAAS,GAAG;AACnB,oBAAgB,WAAW,cAAc,MAAM,GAAG;AAClD;AAAA,EACF;AAGA,MAAI,KAAK,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,IAAI;AAC3C,UAAM,MAAM,OAAO,KAAK,CAAC,CAAC,IAAI;AAC9B,QAAI,CAAC,MAAM,GAAG,KAAK,MAAM,GAAG;AAC1B,sBAAgB,SAAS,cAAc,GAAG;AAAA,IAC5C;AAAA,EACF;AAGA,MAAI,KAAK,SAAS,KAAK,KAAK,CAAC,MAAM,UAAa,KAAK,CAAC,MAAM,IAAI;AAC9D,oBAAgB,YAAY,cAAc,KAAK,CAAC,CAAC;AAAA,EACnD;AAGA,QAAM,YAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QACE,MAAM,KACN,KAAK,CAAC,MAAM,MACZ,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,KACtB,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,GACxB;AACA;AAAA,IACF;AACA,QACE,MAAM,KACN,KAAK,CAAC,MAAM,OACX,KAAK,CAAC,EAAE,WAAW,GAAG,KACrB,KAAK,CAAC,EAAE,WAAW,GAAG,KACtB,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,IACxB;AACA;AAAA,IACF;AACA,cAAU,KAAK,KAAK,CAAC,CAAC;AAAA,EACxB;AACA,MAAI,UAAU,SAAS,KAAK,UAAU,KAAK,CAAC,MAAM,MAAM,EAAE,GAAG;AAC3D,oBAAgB,QAAQ,cAAc,UAAU,KAAK,GAAG,GAAG,KAAK;AAAA,EAClE;AACF;AAEA,SAAS,gBAAgB,cAA4B,MAAgB;AACnE,MAAI,KAAK,WAAW,GAAG;AAAA,EAEvB,WAAW,KAAK,WAAW,GAAG;AAE5B,UAAM,OACJ,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,IACtB,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,IACtB,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC;AACxB,UAAM,OAAO,cAAc,uBAAuB,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAElE,iBAAa,IAAI,oBAAoB;AAAA,EACvC;AACF;AAEA,SAAS,oBAAoB,cAA4B,MAAgB;AACvE,MAAI,KAAK,WAAW,GAAG;AACrB,oBAAgB,QAAQ,cAAc,KAAK,KAAK,GAAG,GAAG,KAAK;AAC3D;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,CAAC,EAAE,MAAM,GAAG;AAC9B,QAAM,QAAQ,KAAK,CAAC,EAAE,MAAM,GAAG;AAE/B,kBAAgB;AAAA,IACd;AAAA,IACA,KAAK,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,IAAI,GAAG;AAAA,EACvC;AAEA,QAAM,YAAY,MAAM,IAAI,CAAC,OAAO;AAClC,WAAO,EAAE,MAAM,GAAG;AAAA,EACpB,CAAC;AACD,kBAAgB,MAAM,cAAc,EAAE,UAAqB,CAAC;AAC9D;AAEA,SAAS,aACP,cACA,MACA,MACA,MACA,KACA,MACA,MACA;AACA,QAAM,WAAW,OACb,cAAc,uBAAuB,MAAM,IAAI,IAC/C,cAAc,mBAAmB,IAAI;AACzC,QAAM,WAAW,OACb,cAAc,uBAAuB,KAAK,IAAI,IAC9C,cAAc,mBAAmB,GAAG;AAExC,QAAM,eAAe,WAAW,YAAY,IAAI;AAChD,eAAa,OAAO;AAEpB,QAAM,eAAe,WAAW,YAAY,IAAI;AAChD,eAAa,OAAO;AAEpB,QAAM,eAAe,WAAW,YAAY,QAAQ,GAAG;AAEvD,QAAM,YAAwB,CAAC,cAAc,cAAc,YAAY;AACvE,kBAAgB,MAAM,cAAc,EAAE,UAAqB,CAAC;AAC9D;AAEA,SAAS,gBAAgB,cAA4B,SAAiB;AACpE,QAAM,OAAO,CAAC;AAEd,QAAM,cAAc,OAAO,QAAQ,MAAM,GAAG,CAAC,CAAC;AAC9C,QAAM,SAAS,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG;AACzC,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,MAAM,SAAS,GAAG;AAEpB;AAAA,IACF;AACA,UAAM,OAAO,MAAM,MAAM,GAAG;AAC5B,UAAM,WAAW,EAAE,MAAM,KAAK,CAAC,EAAE;AACjC,UAAM,WAAW,KAAK,CAAC;AACvB,UAAM,gBAAgB,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,EAAE;AACvD,UAAM,YAAY,SAAS,SAAS,MAAM,CAAC,GAAG,EAAE;AAEhD,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,WAAW,KAAK,CAAC;AACvB,YAAM,kBAAkB,OAAO,SAAS,MAAM,GAAG,CAAC,CAAC;AACnD,YAAM,aAAa,SAAS,MAAM,CAAC;AACnC,YAAM,cACJ,OAAO,WAAW,UAAU,CAAC,CAAC,KAC7B,WAAW,OAAO,CAAC,MAAM,MAAM,KAAK;AACvC,WAAK,KAAK;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,UACX,aAAa;AAAA,UACb,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,WAAK,KAAK;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,kBAAgB,SAAS,cAAc,IAAI;AAC7C;AAEA,SAAS,cAAc,cAA4B,MAAgB;AAEjE,QAAM,QAAQ,KAAK,CAAC,EAAE,MAAM,GAAG;AAC/B,QAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG;AAE/B,kBAAgB,gBAAgB,cAAc,KAAK,CAAC,CAAC;AACrD,kBAAgB,WAAW,cAAc,KAAK,MAAM,CAAC,GAAG,GAAG;AAC3D,kBAAgB,WAAW,cAAc,MAAM,MAAM,CAAC,GAAG,GAAG;AAC5D,kBAAgB,iBAAiB,cAAc,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACpE,kBAAgB,WAAW,cAAc,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG;AAE3E;AACA,SAAS,eAAe,cAA4B,MAAgB;AAClE,MAAI,KAAK,WAAW,IAAI;AACtB,WAAO,gBAAgB,QAAQ,cAAc,KAAK,KAAK,GAAG,GAAG,KAAK;AAAA,EACpE;AAEA,kBAAgB;AAAA,IACd;AAAA,IACA,cAAc,oBAAoB,KAAK,CAAC,CAAC;AAAA,EAC3C;AACA,kBAAgB,UAAU,cAAc,MAAM,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AACnE,kBAAgB;AAAA,IACd;AAAA,IACA,cAAc,oBAAoB,KAAK,CAAC,CAAC;AAAA,EAC3C;AACA,kBAAgB,IAAI,cAAc,cAAc,oBAAoB,KAAK,CAAC,CAAC,CAAC;AAC5E,kBAAgB,QAAQ,cAAc,MAAM,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AACjE,kBAAgB,IAAI,cAAc,cAAc,oBAAoB,KAAK,CAAC,CAAC,CAAC;AAC5E,kBAAgB,QAAQ,cAAc,MAAM,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AACjE,kBAAgB,GAAG,cAAc,cAAc,oBAAoB,KAAK,CAAC,CAAC,CAAC;AAC3E,kBAAgB,OAAO,cAAc,MAAM,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AAChE,kBAAgB,GAAG,cAAc,cAAc,oBAAoB,KAAK,CAAC,CAAC,CAAC;AAC3E,kBAAgB,OAAO,cAAc,MAAM,SAAS,KAAK,EAAE,GAAG,EAAE,CAAC;AACnE;AAGA,SAAS,gBAAgB,MAAsB;AAC7C,MAAI,MAAM;AACV,QAAM,QAAQ,mBAAmB,IAAI;AAErC,aAAW,QAAQ,OAAO;AACxB,WAAO;AACP,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,WAAK,MAAM,OAAY,GAAG;AACxB,cAAO,QAAQ,IAAK;AAAA,MACtB,OAAO;AACL,cAAM,QAAQ;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,SAAU;AAEvB,QAAM,UAAW,OAAO,KAAM;AAC9B,QAAM,UAAW,OAAO,IAAK;AAC7B,QAAM,UAAW,OAAO,IAAK;AAC7B,QAAM,UAAU,MAAM;AAEtB,SAAQ,WAAW,KAAO,WAAW,IAAM,WAAW,IAAK;AAC7D;AAOA,SAAS,aAAa,MAAsB;AAC1C,MAAI,MAAM;AACV,QAAM,aAAa;AAEnB,QAAM,QAAQ,mBAAmB,IAAI;AAErC,aAAW,QAAQ,OAAO;AACxB,WAAO,QAAQ;AAEf,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,WAAK,MAAM,WAAY,GAAG;AACxB,eAAQ,OAAO,IAAK,cAAc;AAAA,MACpC,OAAO;AACL,cAAO,OAAO,IAAK;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,MAAM,SAAU;AAC1B;AACA,SAAS,wBAAwB,cAA4B,MAAgB;AAC3E,MAAI,KAAK,WAAW,GAAG;AACrB,oBAAgB,QAAQ,cAAc,KAAK,KAAK,GAAG,GAAG,KAAK;AAC3D;AAAA,EACF;AAEA,kBAAgB,eAAe,cAAc,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AAClE,MAAI,KAAK,CAAC,MAAM,IAAI;AAClB,oBAAgB,iBAAiB,cAAc,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AAAA,EACtE;AACF;;;AC/sBA,IAAM,gBAAgB;AAGf,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EACP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,GAAG;AAAA,IACd;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AAEvB,UAAM,MAAM,QAAQ,KAAK,QAAQ,eAAe,EAAE;AAGlD,QAAI,UAAU;AACd,cAAU,eAAe,gBAAgB,cAAc,GAAG;AAC1D,QAAI,SAAS;AACX,aAAO,KAAK,oBAAoB,cAAc,SAAS,SAAS,OAAO;AAAA,IACzE;AAGA,QAAI,IAAI,WAAW,GAAG,GAAG;AACvB,YAAM,aAAa,IAAI,MAAM,GAAG;AAChC,gBAAU,eAAe;AAAA,QACvB;AAAA,QACA,WAAW,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,MAC9B;AAEA,UAAI,SAAS;AACX,qBAAa,UAAU,OACrB,WAAW,CAAC,IAAI,MAAM,aAAa,UAAU;AAC/C,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,YAAY,IAAI,MAAM,GAAG;AAC/B,QAAI,UAAU,UAAU,GAAG;AAEzB,YAAM,SACJ,UAAU,CAAC,MAAM,QAAQ,MAAM,SAAS,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;AAClE,gBAAU,eAAe;AAAA,QACvB;AAAA,QACA,IAAI,MAAM,UAAU,CAAC,EAAE,SAAS,MAAM;AAAA,MACxC;AACA,UAAI,WAAW,UAAU,CAAC,EAAE,SAAS,GAAG;AAEtC,wBAAgB,aAAa,cAAc,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;AAGpE,qBAAa,UAAU,OACrB,UAAU,CAAC,EAAE,UAAU,GAAG,CAAC,IAC3B,MACA,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,IACpC,MACA,aAAa,UAAU;AAAA,MAC3B;AACA,UAAI,SAAS;AACX,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,MAAM,GAAG;AAChC,QAAI,WAAW,CAAC,EAAE,SAAS,GAAG;AAC5B,gBAAU,eAAe;AAAA,QACvB;AAAA,QACA,IAAI,MAAM,WAAW,CAAC,EAAE,SAAS,CAAC;AAAA,MACpC;AAEA,mBAAa,UAAU,OACrB,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,MAAM,aAAa,UAAU;AAAA,IAC7D;AAEA,WAAO,KAAK,oBAAoB,cAAc,SAAS,SAAS,OAAO;AAAA,EACzE;AAAA,EAEQ,oBACN,cACA,SACA,SACA,SACA;AACA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc,CAAC,aAAa,UAAU,OACvD,SACA;AACJ,QAAI,aAAa,UAAU,MAAM,WAAW,GAAG;AAC7C,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACF;;;AClHO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,eAAuC;AAAA,IACrC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EAEA,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AAEjC,iBAAa,UAAU,cAAc;AAErC,UAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM;AACvC,QAAI,MAAM,CAAC,MAAM,QAAQ;AAEvB,sBAAgB,KAAK,cAAc,MAAM,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC;AAC9D,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG;AAC/B,UAAM,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG;AAChC,UAAM,OAAO,OAAO,CAAC;AACrB,UAAM,kBAAkB,KAAK,aAAa,IAAI;AAE9C,QAAI,iBAAiB;AACnB,mBAAa,IAAI,UAAU;AAC3B,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AACD,mBAAa,IAAI,eAAe;AAChC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,GAAG,eAAe,KAAK,IAAI;AAAA,MACpC,CAAC;AAED,UAAI,SAAS,QAAQ,KAAK,CAAC,MAAM,sBAAsB;AACrD,cAAM,OAAO,KAAK,CAAC,EAAE,MAAM,GAAG;AAE9B,wBAAgB,iBAAiB,cAAc,KAAK,CAAC,CAAC;AACtD,wBAAgB,eAAe,cAAc,KAAK,CAAC,CAAC;AACpD,qBAAa,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACrC,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,KAAK,CAAC,CAAC;AAAA,QAC1C;AACA,wBAAgB,cAAc,cAAc,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5D,wBAAgB,WAAW,cAAc,KAAK,MAAM,CAAC,GAAG,GAAG;AAAA,MAC7D,WAAW,SAAS,MAAM;AACxB,wBAAgB;AAAA,UACd;AAAA,UACA,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC;AAAA,UACxB;AAAA,QACF;AACA,wBAAgB;AAAA,UACd;AAAA,UACA,OAAO,CAAC,EAAE,UAAU,CAAC;AAAA,UACrB;AAAA,QACF;AACA,qBAAa,IAAI,MAAM,OAAO,OAAO,CAAC,CAAC;AACvC,wBAAgB,cAAc,cAAc,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9D,YAAI,OAAO,SAAS,GAAG;AACrB,0BAAgB,WAAW,cAAc,OAAO,MAAM,CAAC,GAAG,GAAG;AAAA,QAC/D;AAAA,MACF,WAAW,SAAS,QAAQ,KAAK,CAAC,MAAM,sBAAsB;AAC5D,cAAM,OAAO,KAAK,CAAC,EAAE,MAAM,GAAG;AAE9B,wBAAgB,iBAAiB,cAAc,KAAK,CAAC,CAAC;AACtD,wBAAgB,eAAe,cAAc,KAAK,CAAC,CAAC;AACpD,qBAAa,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACrC,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,KAAK,CAAC,CAAC;AAAA,QAC1C;AACA,wBAAgB,WAAW,cAAc,KAAK,MAAM,CAAC,GAAG,GAAG;AAAA,MAC7D,WAAW,SAAS,MAAM;AACxB,wBAAgB;AAAA,UACd;AAAA,UACA,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC;AAAA,UACxB;AAAA,QACF;AACA,wBAAgB;AAAA,UACd;AAAA,UACA,OAAO,CAAC,EAAE,UAAU,CAAC;AAAA,UACrB;AAAA,QACF;AAAA,MACF,WAAW,SAAS,MAAM;AACxB,cAAM,WAAW,KAAK,CAAC,EAAE,MAAM,GAAG;AAElC,wBAAgB,iBAAiB,cAAc,SAAS,CAAC,CAAC;AAC1D,wBAAgB,eAAe,cAAc,SAAS,CAAC,CAAC;AACxD,qBAAa,IAAI,MAAM,OAAO,SAAS,CAAC,CAAC;AACzC,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,SAAS,CAAC,CAAC;AAAA,QAC9C;AAEA,cAAM,YAAY,KAAK,CAAC,EAAE,MAAM,GAAG;AACnC,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,UAAU,CAAC,CAAC;AAAA,QAC/C;AACA,wBAAgB,QAAQ,cAAc,UAAU,CAAC,CAAC;AAAA,MACpD,OAAO;AACL,YAAI,QAAQ,OAAO;AACjB,kBAAQ,IAAI,kCAAkC,QAAQ,IAAI,EAAE;AAAA,QAC9D;AAAA,MACF;AACA,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc,aAAa,UAAU,OACtD,YACA;AAAA,IACN,OAAO;AAEL,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AClKO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AACpC,QAAI,MAAM,SAAS,IAAI;AACrB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,WAAW;AAAA,MACf,WAAW,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,CAAC;AAAA,MACpE,YAAY,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,CAAC;AAAA,IACvE;AACA,oBAAgB,SAAS,cAAc,QAAQ;AAC/C,oBAAgB,SAAS,cAAc,OAAO,MAAM,CAAC,CAAC,CAAC;AACvD,oBAAgB,iBAAiB,cAAc,MAAM,CAAC,CAAC;AACvD,oBAAgB,eAAe,cAAc,MAAM,EAAE,CAAC;AACtD,oBAAgB,iBAAiB,cAAc,MAAM,EAAE,CAAC;AACxD,oBAAgB,cAAc,cAAc,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACnE,UAAM,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAC7D,OAAO,CAAC,MAAM,KAAK,EAAE,EACrB,KAAK,GAAG;AACX,QAAI,UAAU,IAAI;AAChB,sBAAgB,gBAAgB,cAAc,MAAM;AAAA,IACtD;AACA,oBAAgB,WAAW,cAAc;AAAA,MACvC,GAAG,MAAM,MAAM,GAAG,CAAC;AAAA,MACnB,GAAG,MAAM,MAAM,EAAE;AAAA,IACnB,CAAC;AAED,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;ACtDO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AACpC,QAAI,MAAM,WAAW,IAAI;AACvB,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAGA,UAAM,MAAM,MAAM,CAAC,EAAE,KAAK;AAC1B,UAAM,MAAM,MAAM,CAAC,EAAE,KAAK;AAC1B,UAAM,WAAW;AAAA,MACf,WACI,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,CAAC,IAAK;AAAA,MAClE,YACI,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,CAAC,IAAK;AAAA,IACpE;AACA,oBAAgB,SAAS,cAAc,QAAQ;AAC/C,oBAAgB,SAAS,cAAc,OAAO,MAAM,CAAC,CAAC,CAAC;AACvD,oBAAgB,WAAW,cAAc;AAAA,MACvC,MAAM,CAAC;AAAA,MACP,GAAG,MAAM,MAAM,GAAG,CAAC;AAAA,MACnB,GAAG,MAAM,MAAM,CAAC;AAAA,IAClB,CAAC;AAED,SAAK,eAAe,cAAc,MAAM,SAAS;AACjD,WAAO;AAAA,EACT;AACF;;;ACpCO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AACpC,QAAI,MAAM,SAAS,IAAI;AACrB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,WAAW;AAAA,MACf,WAAW,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,MAC7D,YAAY,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,IAChE;AACA,oBAAgB,SAAS,cAAc,QAAQ;AAC/C,oBAAgB,QAAQ,cAAc,OAAO,MAAM,CAAC,CAAC,CAAC;AACtD,oBAAgB,SAAS,cAAc,MAAM,OAAO,MAAM,CAAC,CAAC,CAAC;AAC7D,oBAAgB,eAAe,cAAc,MAAM,CAAC,CAAC;AACrD,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,MAAM,CAAC,CAAC;AAAA,IAC3C;AACA,UAAM,YAAwB;AAAA,MAC5B;AAAA,QACE,MAAM,MAAM,EAAE;AAAA,MAChB;AAAA,MACA;AAAA,QACE,MAAM,MAAM,EAAE;AAAA,QACd,MAAM,cAAc,mBAAmB,MAAM,EAAE,CAAC;AAAA,MAClD;AAAA,MACA;AAAA,QACE,MAAM,MAAM,EAAE;AAAA,QACd,MAAM,cAAc,mBAAmB,MAAM,EAAE,CAAC;AAAA,MAClD;AAAA,IACF;AACA,oBAAgB,MAAM,cAAc,EAAE,UAAqB,CAAC;AAE5D,QAAI,MAAM,EAAE,GAAG;AACb,sBAAgB,iBAAiB,cAAc,MAAM,EAAE,CAAC;AAAA,IAC1D;AAEA,oBAAgB;AAAA,MACd;AAAA,MACA,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;ACxEO,IAAM,mBAAN,cAA+B,cAAc;AAAA,EAClD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,MAAM,IAAI;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,gBACJ;AAEF,QAAI,UAAU,QAAQ,KAAK,MAAM,aAAa;AAC9C,QAAI,SAAS,QAAQ;AACnB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,sBAAsB;AAClC,gBAAQ,IAAI,OAAO;AAAA,MACrB;AAEA,sBAAgB,SAAS,cAAc;AAAA,QACrC,UACE,OAAO,QAAQ,OAAO,SAAS,KAC9B,QAAQ,OAAO,OAAO,MAAM,IAAI;AAAA,QACnC,WACE,OAAO,QAAQ,OAAO,UAAU,KAC/B,QAAQ,OAAO,QAAQ,MAAM,IAAI;AAAA,MACtC,CAAC;AAED,YAAM,WACJ,QAAQ,OAAO,OAAO,SAAS,QAAQ,OAAO,OAAO,QACjD,IACA,OAAO,QAAQ,OAAO,GAAG;AAC/B,sBAAgB,SAAS,cAAc,QAAQ;AAE/C,sBAAgB,WAAW,cAAc;AAAA,QACvC,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,MACjB,CAAC;AACD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,IAC5D;AACA,oBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;AC1DO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,UAAM,OAAO,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AAChD,QAAI,CAAC,QAAQ,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,IAAI;AACzD,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAEA,UAAM,MAAM,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC;AAClC,UAAM,MAAM,KAAK,CAAC,EAAE,UAAU,CAAC;AAC/B,oBAAgB,SAAS,cAAc;AAAA,MACrC,UACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IACnC,gBAAgB;AAAA,QACd,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC;AAAA,QAC1B,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC;AAAA,QAC1B,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC;AAAA,MAC5B;AAAA,MACF,WACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IACnC,gBAAgB;AAAA,QACd,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC;AAAA,QAC1B,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC;AAAA,QAC1B,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC;AAAA,MAC5B;AAAA,IACJ,CAAC;AACD,oBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,KAAK,CAAC,CAAC;AAAA,IAC1C;AACA,oBAAgB,SAAS,cAAc,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;AAC3D,oBAAgB,WAAW,cAAc,KAAK,MAAM,GAAG,CAAC,CAAC;AACzD,oBAAgB;AAAA,MACd;AAAA,MACA,OAAO,KAAK,CAAC,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC;AAAA,IACpC;AACA,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,KAAK,CAAC,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC;AAAA,IAC9D;AACA,oBAAgB,iBAAiB,cAAc,KAAK,CAAC,CAAC;AACtD,oBAAgB,eAAe,cAAc,KAAK,EAAE,CAAC;AACrD,oBAAgB,QAAQ,cAAc,KAAK,EAAE,CAAC;AAE9C,SAAK,eAAe,cAAc,MAAM,SAAS;AACjD,WAAO;AAAA,EACT;AACF;;;AC3DO,IAAM,0BAAN,cAAsC,cAAc;AAAA,EACzD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MAC3C,WAAW,CAAC,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM;AACvC,UAAM,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG;AAChC,UAAM,cAAc,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AACnD,iBAAa,UAAU,cAAc,WAAW,WAAW;AAG3D,QACG,gBAAgB,MAAM,MAAM,WAAW,KACvC,gBAAgB,MAAM,MAAM,WAAW,GACxC;AACA,UAAI,SAAS,OAAO;AAClB,gBAAQ,IAAI,kCAAkC,QAAQ,IAAI,EAAE;AAAA,MAC9D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAGA,UAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG;AAC/B,oBAAgB,iBAAiB,cAAc,KAAK,CAAC,CAAC;AACtD,oBAAgB,eAAe,cAAc,KAAK,CAAC,CAAC;AACpD,iBAAa,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACrC,UAAM,OAAO,cAAc,mBAAmB,KAAK,CAAC,CAAC;AACrD,QAAI,gBAAgB,IAAI;AACtB,sBAAgB,IAAI,cAAc,IAAI;AAAA,IACxC,WAAW,gBAAgB,IAAI;AAC7B,sBAAgB,IAAI,cAAc,IAAI;AAAA,IACxC,WAAW,gBAAgB,IAAI;AAC7B,sBAAgB,GAAG,cAAc,IAAI;AAAA,IACvC,WAAW,gBAAgB,IAAI;AAC7B,sBAAgB,GAAG,cAAc,IAAI;AAAA,IACvC;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,sBAAgB,WAAW,cAAc,MAAM,MAAM,CAAC,GAAG,GAAG;AAAA,IAC9D;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,MAAM,CAAC,EAAE,WAAW,MAAM,GAAG;AAC/B,cAAM,WAAW,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG;AAChD,YAAI;AACJ,YAAI,SAAS,CAAC,EAAE,WAAW,GAAG,KAAK,SAAS,CAAC,EAAE,WAAW,GAAG,GAAG;AAC9D,qBAAW;AAAA,YACT,UAAU,OAAO,SAAS,CAAC,CAAC;AAAA,YAC5B,WAAW,OAAO,SAAS,CAAC,CAAC;AAAA,UAC/B;AAAA,QACF,OAAO;AACL,qBAAW;AAAA,YACT,UACE,gBAAgB,aAAa,SAAS,CAAC,EAAE,CAAC,CAAC,IAC3C,gBAAgB;AAAA,cACd,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,cAClC,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,cAClC,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,YACpC;AAAA,YACF,WACE,gBAAgB,aAAa,SAAS,CAAC,EAAE,CAAC,CAAC,IAC3C,gBAAgB;AAAA,cACd,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,cAClC,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,cAClC,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,YACpC;AAAA,UACJ;AAAA,QACF;AACA,wBAAgB,SAAS,cAAc,QAAQ;AAAA,MACjD,OAAO;AACL,wBAAgB,QAAQ,cAAc,MAAM,CAAC,GAAG,MAAM;AAAA,MACxD;AAAA,IACF;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc,aAAa,UAAU,OACtD,YACA;AACJ,WAAO;AAAA,EACT;AACF;AAEA,SAAS,WAAW,aAA6B;AAC/C,MAAI,gBAAgB,IAAI;AACtB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,IAAI;AACtB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,IAAI;AACtB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,IAAI;AACtB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,IAAI;AACtB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACnHO,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,IAAI;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,QAAI,QAAQ,KAAK,WAAW,IAAI,KAAK,QAAQ,KAAK,SAAS,IAAI,GAAG;AAChE,YAAM,UAAU,QAAQ,KAAK,UAAU,GAAG,QAAQ,KAAK,SAAS,CAAC;AACjE,sBAAgB;AAAA,QACd;AAAA,QACA,gBAAgB;AAAA,UACd,QAAQ,UAAU,GAAG,EAAE;AAAA,QACzB;AAAA,MACF;AACA,UAAI,QAAQ,WAAW,IAAI;AAEzB,wBAAgB,QAAQ,cAAc,QAAQ,UAAU,IAAI,EAAE,CAAC;AAC/D,cAAM,MAAM,QAAQ,UAAU,IAAI,EAAE;AACpC,YAAI,OAAO,OAAO;AAChB,0BAAgB,SAAS,cAAc,MAAM,OAAO,GAAG,CAAC;AAAA,QAC1D;AACA,wBAAgB;AAAA,UACd;AAAA,UACA,QAAQ,UAAU,EAAE,EAAE,WAAW,KAAK,GAAG;AAAA,QAC3C;AAAA,MACF,WAAW,QAAQ,UAAU,IAAI,EAAE,MAAM,OAAO;AAE9C,cAAM,SAAS,QAAQ,UAAU,IAAI,EAAE;AACvC,cAAM,OAAO,QAAQ,UAAU,IAAI,EAAE;AACrC,YAAI,UAAU,UAAU;AACtB,0BAAgB;AAAA,YACd;AAAA,YACA,cAAc,uBAAuB,OAAO,MAAM,MAAM;AAAA,UAC1D;AAAA,QACF,OAAO;AACL,0BAAgB;AAAA,YACd;AAAA,YACA,cAAc,mBAAmB,IAAI;AAAA,UACvC;AAAA,QACF;AACA,wBAAgB,QAAQ,cAAc,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC7D,OAAO;AACL,wBAAgB,QAAQ,cAAc,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF,OAAO;AACL,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAEA,SAAK,eAAe,cAAc,MAAM,SAAS;AACjD,WAAO;AAAA,EACT;AACF;;;AC5DO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AAEpC,UAAM,SAAS,MAAM,CAAC;AAEtB,UAAM,eAAe,OAAO,UAAU,EAAE;AAGxC,UAAM,YAAY,aAAa,UAAU,GAAG,CAAC;AAC7C,UAAM,aAAa,aAAa,UAAU,GAAG,CAAC;AAC9C,iBAAa,IAAI,WAAW,CAAC;AAE7B,SACG,cAAc,OAAO,cAAc,SACnC,eAAe,OAAO,eAAe,MACtC;AACA,YAAM,MACH,OAAO,aAAa,UAAU,GAAG,CAAC,CAAC,IAAI,OACvC,cAAc,MAAM,KAAK;AAC5B,YAAM,MACH,OAAO,aAAa,UAAU,GAAG,EAAE,CAAC,IAAI,OACxC,eAAe,MAAM,KAAK;AAC7B,sBAAgB,SAAS,cAAc,EAAE,UAAU,KAAK,WAAW,IAAI,CAAC;AACxE,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,aAAa,UAAU,EAAE,CAAC,IAAI;AAAA,MACvC;AAAA,IACF,OAAO;AACL,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAEA,oBAAgB,iBAAiB,cAAc,OAAO,UAAU,GAAG,CAAC,CAAC;AACrE,oBAAgB,eAAe,cAAc,OAAO,UAAU,GAAG,EAAE,CAAC;AAEpE,oBAAgB,WAAW,cAAc,MAAM,MAAM,CAAC,GAAG,GAAG;AAE5D,SAAK,eAAe,cAAc,MAAM,SAAS;AACjD,WAAO;AAAA,EACT;AACF;;;AClDO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,IAAI;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,QACE,QAAQ,KAAK,WAAW,IAAI,KAC5B,QAAQ,KAAK,SAAS,IAAI,KAC1B,QAAQ,KAAK,UAAU,IACvB;AACA,YAAM,UAAU,QAAQ,KAAK,UAAU,GAAG,QAAQ,KAAK,SAAS,CAAC;AACjE,sBAAgB,QAAQ,cAAc,QAAQ,UAAU,GAAG,CAAC,GAAG,EAAE;AACjE,sBAAgB;AAAA,QACd;AAAA,QACA,gBAAgB;AAAA,UACd,QAAQ,UAAU,GAAG,EAAE;AAAA,QACzB;AAAA,MACF;AACA,UAAI,QAAQ,OAAO,EAAE,MAAM,KAAK;AAE9B,cAAM,YAAY,QAAQ,UAAU,IAAI,EAAE,EAAE,KAAK;AACjD,cAAM,YAAY,QAAQ,UAAU,IAAI,EAAE,EAAE,KAAK;AACjD,YAAI,WAAW;AACb,0BAAgB,MAAM,cAAc;AAAA,YAClC,WAAW,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC;AAAA,UACtD,CAAC;AAAA,QACH,OAAO;AACL,0BAAgB,MAAM,cAAc;AAAA,YAClC,WAAW,CAAC,EAAE,MAAM,UAAU,CAAC;AAAA,UACjC,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AAEL,wBAAgB;AAAA,UACd;AAAA,UACA,QAAQ,UAAU,IAAI,EAAE;AAAA,QAC1B;AACA,wBAAgB,eAAe,cAAc,QAAQ,UAAU,IAAI,EAAE,CAAC;AAAA,MAExE;AAUA,sBAAgB;AAAA,QACd;AAAA,QACA,QAAQ,UAAU,QAAQ,SAAS,CAAC;AAAA,QACpC;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,0CAA0C,QAAQ,IAAI,EAAE;AAAA,MACtE;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;ACjFO,IAAM,mBAAN,cAA+B,cAAc;AAAA,EAClD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,MAAM,IAAI;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAGvB,QAAI,gBACF;AAGF,QAAI,gBACF;AAEF,QAAI,UAAU,QAAQ,KAAK,MAAM,aAAa;AAC9C,QAAI,SAAS,QAAQ;AACnB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,sBAAsB;AAClC,gBAAQ,IAAI,OAAO;AAAA,MACrB;AAEA,UAAI,MAAM;AAAA,QACR,UACE,OAAO,QAAQ,OAAO,SAAS,KAC9B,QAAQ,OAAO,OAAO,MAAM,IAAI;AAAA,QACnC,WACE,OAAO,QAAQ,OAAO,UAAU,KAC/B,QAAQ,OAAO,QAAQ,MAAM,IAAI;AAAA,MACtC;AACA,YAAM,WACJ,QAAQ,OAAO,OAAO,SAAS,QAAQ,OAAO,OAAO,QACjD,IACA,OAAO,QAAQ,OAAO,GAAG;AAE/B,sBAAgB,SAAS,cAAc,GAAG;AAC1C,sBAAgB,SAAS,cAAc,QAAQ;AAE/C,sBAAgB,WAAW,cAAc;AAAA,QACvC,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,MACjB,CAAC;AACD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAEnC,aAAO;AAAA,IACT;AAEA,cAAU,QAAQ,KAAK,MAAM,aAAa;AAC1C,QAAI,SAAS,QAAQ;AACnB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,sBAAsB;AAClC,gBAAQ,IAAI,OAAO;AAAA,MACrB;AAEA,UAAI,MAAM;AAAA,QACR,UACE,OAAO,QAAQ,OAAO,SAAS,KAC9B,QAAQ,OAAO,OAAO,MAAM,IAAI;AAAA,QACnC,WACE,OAAO,QAAQ,OAAO,UAAU,KAC/B,QAAQ,OAAO,QAAQ,MAAM,IAAI;AAAA,MACtC;AAEA,sBAAgB,SAAS,cAAc,GAAG;AAE1C,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,IAC5D;AACA,oBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;ACxFO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,UAAM,SAAS,QAAQ,KAAK,MAAM,GAAG;AACrC,QAAI,OAAO,WAAW,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,OAAO,GAAG;AAC1D,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAEA,oBAAgB;AAAA,MACd;AAAA,MACA,gBAAgB,wBAAwB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,IAChE;AACA,UAAM,WAAW,OAAO,CAAC,EAAE,KAAK;AAChC,UAAM,OAAO,cAAc,mBAAmB,OAAO,CAAC,CAAC;AACvD,oBAAgB,SAAS,cAAc,OAAO,OAAO,CAAC,CAAC,IAAI,GAAG;AAC9D,UAAM,eAAe,OAAO,CAAC,EAAE,KAAK;AACpC,UAAM,WAAW,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAC3D,oBAAgB,WAAW,cAAc,OAAO,MAAM,CAAC,GAAG,GAAG;AAC7D,oBAAgB,MAAM,cAAc;AAAA,MAClC,WAAW;AAAA,QACT,EAAE,MAAM,UAAU,KAAW;AAAA,QAC7B,EAAE,MAAM,cAAc,MAAM,SAAS;AAAA,MACvC;AAAA,IACF,CAAC;AACD,SAAK,eAAe,cAAc,MAAM,SAAS;AAEjD,WAAO;AAAA,EACT;AACF;;;ACtCO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,SAAS,QAAQ,KAAK,MAAM,GAAG;AACrC,UAAM,OAAO,cAAc,mBAAmB,OAAO,CAAC,CAAC;AACvD,QAAI,OAAO,WAAW,KAAK,OAAO,MAAM,IAAI,GAAG;AAC7C,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,mBAAa,UAAU,OAAO,QAAQ;AACtC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,oBAAgB,UAAU,cAAc,IAAI;AAC5C,QAAI,OAAO,CAAC,MAAM,IAAI;AACpB,sBAAgB,SAAS,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AAAA,IAC1D;AACA,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,IAC5C;AACA,oBAAgB,QAAQ,cAAc,OAAO,CAAC,CAAC;AAC/C,UAAM,OAAO,OAAO,CAAC,EAAE,MAAM,GAAG;AAChC,UAAM,YAAY,KAAK,CAAC,EAAE,MAAM,GAAG;AACnC,QAAI,UAAU,WAAW,GAAG;AAC1B,sBAAgB,SAAS,cAAc;AAAA,QACrC,UACE,gBAAgB,aAAa,UAAU,CAAC,CAAC,IAAI,OAAO,UAAU,CAAC,CAAC;AAAA,QAClE,WACE,gBAAgB,aAAa,UAAU,CAAC,CAAC,IAAI,OAAO,UAAU,CAAC,CAAC;AAAA,MACpE,CAAC;AAAA,IACH,WAAW,UAAU,WAAW,GAAG;AACjC,sBAAgB,SAAS,cAAc;AAAA,QACrC,UACG,gBAAgB,aAAa,UAAU,CAAC,EAAE,CAAC,CAAC,IAC3C,OAAO,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,IAC9B;AAAA,QACF,WACG,gBAAgB,aAAa,UAAU,CAAC,EAAE,CAAC,CAAC,IAC3C,OAAO,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,IAC9B;AAAA,MACJ,CAAC;AAAA,IACH,OAAO;AAAA,IAGP;AAEA,QAAI,KAAK,SAAS,GAAG;AACnB,sBAAgB,aAAa,cAAc,KAAK,CAAC,CAAC;AAAA,IACpD;AACA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;ACtEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAGvB,UAAM,UAAU,QAAQ,KAAK,MAAM,OAAO,EAAE,MAAM,CAAC;AAEnD,QAAI,SAAS;AACX,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,uBAAuB;AACnC,gBAAQ,IAAI,OAAO;AAAA,MACrB;AAEA,mBAAa,IAAI,gBAAgB,QAAQ,CAAC;AAG1C,sBAAgB,iBAAiB,cAAc,QAAQ,CAAC,CAAC;AACzD,sBAAgB,eAAe,cAAc,QAAQ,CAAC,CAAC;AACvD,sBAAgB,iBAAiB,cAAc,QAAQ,CAAC,CAAC;AAGzD,sBAAgB;AAAA,QACd;AAAA,QACA,QAAQ,CAAC,EAAE,QAAQ,QAAQ,CAAC,GAAG,EAAE;AAAA,MACnC;AAGA,YAAM,SAAS,QAAQ,CAAC;AACxB,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc;AAAA,UACZ,QAAQ,CAAC,IAAI;AAAA,UACb,OAAO,UAAU,GAAG,CAAC,IACnB,OAAO,UAAU,GAAG,CAAC,IACrB,OAAO,UAAU,GAAG,CAAC;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;ACvDO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM;AACvC,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,mBAAa,UAAU,OAAO,QAAQ;AACtC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,QAAQ,KAAK,WAAW,QAAQ,GAAG,EAAE,MAAM,GAAG;AAC5D,UAAM,OAAO,oBAAI,IAAoB;AACrC,SAAK,IAAI,IAAI,MAAM,CAAC,CAAC;AACrB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG;AAC/B,WAAK,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IAC3C;AAEA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,KAAK;AACP,sBAAgB,iBAAiB,cAAc,GAAG;AAClD,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,KAAK;AACP,sBAAgB,eAAe,cAAc,GAAG;AAChD,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,KAAK;AACP,sBAAgB,IAAI,cAAc,cAAc,mBAAmB,GAAG,CAAC;AACvE,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,KAAK;AACP,sBAAgB,SAAS,cAAc,OAAO,GAAG,CAAC;AAClD,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,QAAI,IAAI;AACN,sBAAgB,aAAa,cAAc,EAAE;AAC7C,WAAK,OAAO,IAAI;AAAA,IAClB;AACA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,OAAO,KAAK;AACd,mBAAa,IAAI,oBACf,KAAK,MAAM,MAAM,WAAW,IAAI,MAChC,cAAc,mBAAmB,GAAG;AACtC,WAAK,OAAO,KAAK;AACjB,WAAK,OAAO,KAAK;AAAA,IACnB;AAEA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,OAAO,KAAK;AACd,sBAAgB,SAAS,cAAc;AAAA,QACrC,UACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,QAChE,WACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,MAClE,CAAC;AACD,WAAK,OAAO,KAAK;AACjB,WAAK,OAAO,KAAK;AAAA,IACnB;AAEA,QAAI,YAAY;AAChB,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAI,QAAQ,IAAI;AACd,qBAAa;AAAA,MACf,OAAO;AACL,qBAAa,IAAI,GAAG,IAAI,KAAK;AAAA,MAC/B;AAAA,IACF;AACA,iBAAa,UAAU,OAAO;AAE9B,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;AC/FO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,QAAI,CAAC,QAAQ,KAAK,WAAW,WAAW,GAAG;AACzC,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,mBAAa,UAAU,OAAO,QAAQ;AACtC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AAEjD,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,mBAAa,UAAU,OAAO,QAAQ;AACtC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,oBAAgB,iBAAiB,cAAc,MAAM,CAAC,CAAC;AACvD,oBAAgB,eAAe,cAAc,MAAM,CAAC,CAAC;AACrD,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,MAAM,CAAC,CAAC;AAAA,IAC3C;AACA,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,MAAM,CAAC,CAAC;AAAA,IAC3C;AACA,oBAAgB,SAAS,cAAc;AAAA,MACrC,UACE,gBAAgB,aAAa,MAAM,CAAC,EAAE,CAAC,CAAC,IACxC,OAAO,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,MAC9B,WACE,gBAAgB,aAAa,MAAM,CAAC,EAAE,CAAC,CAAC,IACxC,OAAO,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,IAChC,CAAC;AAED,iBAAa,UAAU,OAAO,MAAM,CAAC;AAErC,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;AC/DO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,QAAI,CAAC,QAAQ,KAAK,WAAW,WAAW,GAAG;AACzC,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,mBAAa,UAAU,OAAO,QAAQ;AACtC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AAEjD,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,mBAAa,UAAU,OAAO,QAAQ;AACtC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,gBAAgB;AAAA,MAC/B,MAAM,CAAC;AAAA,IACT;AACA,QAAI,UAAU;AACZ,sBAAgB,SAAS,cAAc,QAAQ;AAAA,IACjD;AACA,UAAM,SAAS,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC;AACtC,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,MAAM;AAAA,IACzC;AACA,UAAM,KAAK,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC;AAClC,oBAAgB,SAAS,cAAc,OAAO,EAAE,IAAI,GAAG;AACvD,UAAM,OAAO,MAAM,CAAC,EAAE,UAAU,CAAC;AACjC,oBAAgB,MAAM,cAAc,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC;AAE1E,iBAAa,UAAU,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAErD,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;AC7DO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AAEpC,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,mBAAa,UAAU,OAAO,QAAQ;AACtC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,oBAAI,IAAoB;AACrC,SAAK,IAAI,OAAO,MAAM,CAAC,EAAE,WAAW,KAAK,EAAE,CAAC;AAC5C,SAAK,IAAI,OAAO,MAAM,CAAC,EAAE,WAAW,KAAK,EAAE,CAAC;AAC5C,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG;AAC/B,WAAK,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IAC3C;AAEA,UAAM,WAAW;AAAA,MACf,UAAU,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,MAChC,WAAW,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,IACnC;AACA,SAAK,OAAO,KAAK;AACjB,SAAK,OAAO,KAAK;AAEjB,oBAAgB,SAAS,cAAc,QAAQ;AAC/C,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,KAAK;AACP,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,GAAG;AAAA,MACtC;AACA,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,KAAK;AACP,sBAAgB,SAAS,cAAc,OAAO,GAAG,CAAC;AAClD,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,KAAK;AACP,sBAAgB,YAAY,cAAc,OAAO,GAAG,CAAC;AACrD,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,KAAK;AACP,sBAAgB,IAAI,cAAc,cAAc,mBAAmB,GAAG,CAAC;AACvE,WAAK,OAAO,KAAK;AAAA,IACnB;AAEA,QAAI,YAAY;AAChB,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,mBAAa,IAAI,GAAG,IAAI,KAAK;AAAA,IAC/B;AACA,iBAAa,UAAU,OAAO;AAE9B,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;AC7EO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,iBAAa,IAAI,WAAW,QAAQ,KAAK,UAAU,GAAG,CAAC;AAEvD,UAAM,UAAU,QAAQ,KAAK,UAAU,CAAC;AACxC,UAAM,SAAS,QAAQ,MAAM,GAAG;AAEhC,QAAI,OAAO,UAAU,IAAI;AACvB,WAAK,MAAM,SAAS,sBAAsB;AAC1C,YAAM,YAAY,OAAO,CAAC;AAC1B,sBAAgB;AAAA,QACd;AAAA,QACA,gBAAgB,wBAAwB,SAAS;AAAA,MACnD;AAEA,WAAK,eAAe,cAAc,MAAM,MAAM;AAAA,IAChD,WAAW,OAAO,UAAU,GAAG;AAC7B,WAAK,MAAM,SAAS,sBAAsB;AAC1C,YAAM,WAAW,gBAAgB,wBAAwB,OAAO,CAAC,CAAC;AAClE,UAAI,UAAU;AACZ,wBAAgB,SAAS,cAAc,QAAQ;AAAA,MACjD;AACA,WAAK,eAAe,cAAc,MAAM,MAAM;AAAA,IAChD,OAAO;AACL,WAAK;AAAA,QACH;AAAA,QACA,mCAAmC,OAAO,MAAM,cAAc,OAAO;AAAA,MACvE;AACA,WAAK,eAAe,cAAc,KAAK;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AACF;;;AC3CO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,iBAAa,IAAI,WAAW,QAAQ,KAAK,UAAU,GAAG,CAAC;AAEvD,UAAM,UAAU,QAAQ,KAAK,UAAU,CAAC;AACxC,UAAM,SAAS,QAAQ,MAAM,GAAG;AAEhC,QAAI,OAAO,UAAU,GAAG;AAEtB,sBAAgB,cAAc,OAAO,CAAC,EAAE,KAAK,CAAC;AAC9C,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,MAC5C;AACA,sBAAgB,SAAS,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AACxD,sBAAgB,YAAY,cAAc,OAAO,CAAC,EAAE,QAAQ,MAAM,EAAE,CAAC;AACrE,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,MAC5C;AACA,sBAAgB,eAAe,cAAc,OAAO,CAAC,CAAC;AAEtD,sBAAgB,WAAW,cAAc;AAAA,QACvC,OAAO,CAAC;AAAA,QACR,OAAO,CAAC;AAAA,QACR,OAAO,CAAC;AAAA,MACV,CAAC;AAED,WAAK,eAAe,cAAc,MAAM,SAAS;AAAA,IACnD,OAAO;AAEL,WAAK;AAAA,QACH;AAAA,QACA,mCAAmC,OAAO,MAAM,cAAc,OAAO;AAAA,MACvE;AACA,WAAK,eAAe,cAAc,KAAK;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AACF;AACA,SAAS,gBAAgB,cAA4B,OAAe;AAElE,MACE,MAAM,WAAW,MACjB,MAAM,CAAC,MAAM,OACb,MAAM,CAAC,MAAM,OACb,MAAM,CAAC,MAAM,OACb,MAAM,CAAC,MAAM,KACb;AACA;AAAA,EACF;AACA,QAAM,SAAS,MAAM,CAAC,MAAM,MAAM,IAAI;AACtC,QAAM,SAAS,MAAM,CAAC,MAAM,MAAM,IAAI;AACtC,QAAM,WAAW;AAAA,IACf,UAAU,SAAS,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC;AAAA,IAC/C,WAAW,SAAS,OAAO,MAAM,UAAU,GAAG,EAAE,CAAC;AAAA,EACnD;AAEA,kBAAgB,SAAS,cAAc,QAAQ;AACjD;;;ACrEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,gBAAgB;AAE9D,QAAI,QAAQ,KAAK,WAAW,OAAO,GAAG;AAEpC,YAAM,SAAS,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AAElD,UAAI,OAAO,UAAU,GAAG;AACtB,aAAK,eAAe,cAAc,KAAK;AACvC,eAAO;AAAA,MACT;AAEA,sBAAgB,aAAa,cAAc,OAAO,CAAC,CAAC;AACpD,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,MAClC;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,MAClC;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,MAC5D;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,CAAC,EAAE,UAAU,GAAG,EAAE;AAAA,MAC3B;AACA,sBAAgB,eAAe,cAAc,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AACxE,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AAAA,MAC9D;AACA,sBAAgB,QAAQ,cAAc,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;AAE7D,WAAK,eAAe,cAAc,MAAM,SAAS;AAAA,IACnD,WAAW,QAAQ,KAAK,WAAW,WAAW,GAAG;AAE/C,YAAM,SAAS,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AAClD,UAAI,OAAO,UAAU,GAAG;AACtB,aAAK,eAAe,cAAc,KAAK;AACvC,eAAO;AAAA,MACT;AAEA,sBAAgB,iBAAiB,cAAc,OAAO,CAAC,CAAC;AACxD,sBAAgB,eAAe,cAAc,OAAO,CAAC,CAAC;AACtD,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,MAC5C;AACA,sBAAgB,QAAQ,cAAc,OAAO,CAAC,CAAC;AAE/C,WAAK,eAAe,cAAc,MAAM,SAAS;AAAA,IACnD,WAAW,QAAQ,KAAK,WAAW,OAAO,GAAG;AAE3C,YAAM,SAAS,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AAClD,UAAI,OAAO,UAAU,GAAG;AACtB,aAAK,eAAe,cAAc,KAAK;AACvC,eAAO;AAAA,MACT;AAEA,sBAAgB,aAAa,cAAc,OAAO,CAAC,CAAC;AACpD,YAAM,WAAW,gBAAgB;AAAA,QAC/B,OAAO,CAAC,EAAE,UAAU,GAAG,EAAE;AAAA,MAC3B;AACA,UAAI,UAAU;AACZ,wBAAgB,SAAS,cAAc,QAAQ;AAAA,MACjD;AACA,sBAAgB,IAAI,cAAc,OAAO,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;AACrE,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AAAA,MAC9D;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE;AAAA,MAC5B;AACA,sBAAgB,eAAe,cAAc,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AACxE,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AAAA,MAC9D;AACA,sBAAgB,QAAQ,cAAc,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AACjE,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AAAA,MAC9D;AACA,WAAK,eAAe,cAAc,MAAM,SAAS;AAAA,IACnD,OAAO;AACL,WAAK,MAAM,SAAS,oBAAoB;AACxC,WAAK,eAAe,cAAc,KAAK;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AACF;;;ACzGO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,UAAM,SAAS,QAAQ,KAAK,MAAM,GAAG;AAErC,QAAI,OAAO,WAAW,IAAI;AACxB,WAAK;AAAA,QACH;AAAA,QACA,mCAAmC,OAAO,MAAM,cAAc,OAAO,KAAK,GAAG,CAAC;AAAA,MAChF;AACA,WAAK,eAAe,cAAc,KAAK;AACvC,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC;AACvC,UAAM,SAAS,OAAO,CAAC,EAAE,UAAU,CAAC;AACpC,UAAM,MAAM,OAAO,MAAM,IAAI;AAC7B,UAAM,MAAM,OAAO,MAAM,IAAI;AAC7B,oBAAgB,SAAS,cAAc;AAAA,MACrC,UAAU,gBAAgB,aAAa,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI;AAAA,MACvD,WAAW,gBAAgB,aAAa,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI;AAAA,IAC1D,CAAC;AAED,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,IAC5C;AACA,oBAAgB,SAAS,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AAExD,oBAAgB,WAAW,cAAc,CAAC,OAAO,CAAC,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC;AAExE,SAAK,eAAe,cAAc,MAAM,SAAS;AACjD,WAAO;AAAA,EACT;AACF;;;AC7CO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AAEpC,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,SAAS,MAAM,CAAC,EAAE,MAAM,MAAM;AACpC,UAAI,OAAO,UAAU,GAAG;AAGtB,wBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,qBAAa,UAAU;AACvB,qBAAa,QAAQ,cAAc;AACnC,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,CAAC,EAAE,SAAS,GAAG;AACxB,wBAAgB,QAAQ,cAAc,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAC/D,wBAAgB,aAAa,cAAc,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,MACnE;AAEA,UAAI,OAAO,CAAC,EAAE,WAAW,GAAG;AAC1B,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,QAC5C;AAAA,MACF,OAAO;AACL,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,QAC5C;AAAA,MACF;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,MAAM,CAAC,CAAC;AAAA,MAC3C;AACA,YAAM,MAAM,MAAM,CAAC,EAAE,WAAW,KAAK,EAAE;AACvC,YAAM,MAAM,MAAM,CAAC,EAAE,WAAW,KAAK,EAAE;AACvC,UAAI,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK;AACpC,wBAAgB,SAAS,cAAc;AAAA,UACrC,UACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,UAChE,WACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,QAClE,CAAC;AAAA,MACH,OAAO;AACL,wBAAgB,SAAS,cAAc;AAAA,UACrC,UAAU,OAAO,GAAG;AAAA,UACpB,WAAW,OAAO,GAAG;AAAA,QACvB,CAAC;AAAA,MACH;AACA,sBAAgB,SAAS,cAAc,OAAO,MAAM,CAAC,CAAC,CAAC;AAEvD,sBAAgB,QAAQ,cAAc,MAAM,CAAC,CAAC;AAC9C,sBAAgB,QAAQ,cAAc,MAAM,CAAC,CAAC;AAE9C,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC,OAAO;AAEL,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;ACnFO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AAEpC,QAAI,MAAM,WAAW,IAAI;AACvB,YAAM,SAAS,MAAM,CAAC,EAAE,MAAM,KAAK;AACnC,UAAI,OAAO,UAAU,GAAG;AAGtB,wBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,qBAAa,UAAU;AACvB,qBAAa,QAAQ,cAAc;AACnC,eAAO;AAAA,MACT;AACA,UAAI,OAAO,CAAC,EAAE,SAAS,GAAG;AACxB,wBAAgB,QAAQ,cAAc,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAC/D,wBAAgB,aAAa,cAAc,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,MACnE;AACA,sBAAgB,iBAAiB,cAAc,OAAO,CAAC,CAAC;AACxD,sBAAgB,eAAe,cAAc,MAAM,CAAC,CAAC;AACrD,sBAAgB,IAAI,cAAc,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;AAClE,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,MACxD;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,MAAM,CAAC,CAAC;AAAA,MAC3C;AACA,sBAAgB,SAAS,cAAc;AAAA,QACrC,UAAU,OAAO,MAAM,CAAC,EAAE,WAAW,KAAK,EAAE,CAAC;AAAA,QAC7C,WAAW,OAAO,MAAM,CAAC,EAAE,WAAW,KAAK,EAAE,CAAC;AAAA,MAChD,CAAC;AACD,sBAAgB,SAAS,cAAc,OAAO,MAAM,CAAC,CAAC,CAAC;AACvD,sBAAgB,QAAQ,cAAc,OAAO,MAAM,CAAC,CAAC,CAAC;AAEtD,sBAAgB,QAAQ,cAAc,MAAM,CAAC,CAAC;AAC9C,sBAAgB,QAAQ,cAAc,MAAM,CAAC,CAAC;AAE9C,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC,OAAO;AAEL,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AClEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AAEpC,QAAI,MAAM,WAAW,IAAI;AACvB,YAAM,SAAS,MAAM,CAAC,EAAE,MAAM,MAAM;AACpC,UAAI,OAAO,UAAU,GAAG;AAGtB,wBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,qBAAa,UAAU;AACvB,qBAAa,QAAQ,cAAc;AACnC,eAAO;AAAA,MACT;AAEA,sBAAgB,iBAAiB,cAAc,OAAO,CAAC,CAAC;AACxD,sBAAgB,eAAe,cAAc,MAAM,CAAC,CAAC;AACrD,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,MAAM,CAAC,CAAC;AAAA,MAC3C;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,MAAM,CAAC,CAAC;AAAA,MAC3C;AACA,sBAAgB,SAAS,cAAc;AAAA,QACrC,UAAU,OAAO,MAAM,CAAC,EAAE,WAAW,KAAK,EAAE,CAAC;AAAA,QAC7C,WAAW,OAAO,MAAM,CAAC,EAAE,WAAW,KAAK,EAAE,CAAC;AAAA,MAChD,CAAC;AACD,sBAAgB,SAAS,cAAc,OAAO,MAAM,CAAC,CAAC,CAAC;AAEvD,sBAAgB,QAAQ,cAAc,MAAM,CAAC,CAAC;AAC9C,sBAAgB,QAAQ,cAAc,MAAM,CAAC,CAAC;AAC9C,sBAAgB,QAAQ,cAAc,MAAM,CAAC,CAAC;AAC9C,sBAAgB,aAAa,cAAc,MAAM,EAAE,EAAE,KAAK,CAAC;AAC3D,sBAAgB,QAAQ,cAAc,MAAM,EAAE,CAAC;AAE/C,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC,OAAO;AAEL,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AC/DO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,SAAS,QAAQ,KAAK,MAAM,GAAG;AAErC,QAAI,OAAO,UAAU,MAAM,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,KAAK,IAAI;AAE7D,YAAM,SACJ,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,IACxB,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,IACxB,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC;AAC1B,YAAM,SAAS,OAAO,CAAC,IAAI;AAC3B,mBAAa,IAAI,oBAAoB,cAAc;AAAA,QACjD;AAAA,QACA;AAAA,MACF;AACA,sBAAgB,aAAa,cAAc,OAAO,CAAC,CAAC;AACpD,sBAAgB,SAAS,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AACxD,YAAM,MAAM,OAAO,CAAC;AACpB,YAAM,MAAM,OAAO,CAAC;AACpB,YAAM,WAAW;AAAA,QACf,WAAW,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,QAC7D,YAAY,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,MAChE;AACA,sBAAgB,SAAS,cAAc,QAAQ;AAC/C,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,MAC5C;AACA,sBAAgB,QAAQ,cAAc,OAAO,CAAC,CAAC;AAE/C,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC,OAAO;AAEL,UAAI,QAAQ,OAAO;AACjB,gBAAQ;AAAA,UACN,UAAU,KAAK,IAAI,qCAAqC,OAAO,MAAM,cAAc,QAAQ,IAAI;AAAA,QACjG;AAAA,MACF;AACA,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACF;;;AC3DO,IAAM,oBAAN,cAAgC,cAAc;AAAA,EACnD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAGvB,UAAM,UAAU,QAAQ,KAAK,MAAM,OAAO,EAAE,MAAM,CAAC;AAEnD,QAAI,SAAS;AACX,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,sBAAsB;AAClC,gBAAQ,IAAI,OAAO;AAAA,MACrB;AAAA,IACF;AAEA,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IAC1D;AAEA,QAAI,QAAQ,CAAC,EAAE,UAAU,GAAG,CAAC,MAAM,MAAM;AACvC,sBAAgB,eAAe,cAAc,QAAQ,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AACvE,sBAAgB,QAAQ,cAAc,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,IAC9D,OAAO;AACL,sBAAgB;AAAA,QACd;AAAA,QACA,IAAI,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;AAAA,MACxC;AAAA,IACF;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;AC1CO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,WAAW,WAAW,WAAW,SAAS,SAAS,OAAO;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,SAAS,KAAK,WAAW,SAAS,YAAY;AAEpD,UAAM,OAAO,QAAQ,KAAK,MAAM,GAAG;AACnC,QAAI,KAAK,SAAS,GAAG;AACnB,aAAO,KAAK,YAAY,QAAQ,QAAQ,MAAM,OAAO;AAAA,IACvD;AAEA,SAAK,MAAM,SAAS,sBAAsB,IAAI;AAE9C,oBAAgB;AAAA,MACd;AAAA,MACA,gBAAgB,sCAAsC,KAAK,CAAC,CAAC;AAAA,IAC/D;AACA,oBAAgB,SAAS,QAAQ,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC;AACtD,oBAAgB,iBAAiB,QAAQ,KAAK,CAAC,CAAC;AAChD,oBAAgB,eAAe,QAAQ,KAAK,CAAC,CAAC;AAC9C,oBAAgB,MAAM,QAAQ,OAAO,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;AAC7D,oBAAgB,IAAI,QAAQ,OAAO,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;AAC3D,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,KAAK,CAAC,CAAC;AAAA,IAC1C;AACA,oBAAgB,IAAI,QAAQ,cAAc,mBAAmB,KAAK,CAAC,CAAC,CAAC;AAErE,UAAM,OAAO,OAAO,KAAK,CAAC,CAAC;AAC3B,QAAI,CAAC,MAAM,IAAI,GAAG;AAChB,sBAAgB,cAAc,QAAQ,IAAI;AAAA,IAC5C;AAEA,QAAI,KAAK,SAAS,GAAG;AACnB,sBAAgB,WAAW,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,IAClD;AAEA,SAAK,eAAe,QAAQ,MAAM,MAAM;AACxC,WAAO;AAAA,EACT;AACF;;;AC1CO,IAAe,gBAAf,cAAqC,cAAc;AAAA,EAoBxD,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,SAAS,KAAK,WAAW,SAAS,KAAK,WAAW;AAExD,UAAM,OAAO,QAAQ,KAAK,MAAM,GAAG;AACnC,QAAI,KAAK,SAAS,KAAK,WAAW;AAChC,aAAO,KAAK,YAAY,QAAQ,QAAQ,MAAM,OAAO;AAAA,IACvD;AAEA,SAAK,MAAM,SAAS,GAAG,KAAK,WAAW,YAAY,IAAI;AAGvD,oBAAgB;AAAA,MACd;AAAA,MACA,gBAAgB,sCAAsC,KAAK,CAAC,CAAC;AAAA,IAC/D;AACA,oBAAgB,iBAAiB,QAAQ,KAAK,CAAC,CAAC;AAChD,oBAAgB,eAAe,QAAQ,KAAK,CAAC,CAAC;AAC9C,oBAAgB,MAAM,QAAQ,OAAO,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;AAC7D,oBAAgB,IAAI,QAAQ,OAAO,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;AAG3D,SAAK,kBAAkB,QAAQ,MAAM,OAAO;AAE5C,SAAK,eAAe,QAAQ,MAAM,MAAM;AACxC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,UAAU,QAAsB,OAAqB;AAC7D,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI,CAAC,MAAM,IAAI,GAAG;AAChB,sBAAgB,cAAc,QAAQ,IAAI;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,mBACR,QACA,MACA,YACM;AACN,QAAI,KAAK,SAAS,YAAY;AAC5B,sBAAgB,WAAW,QAAQ,KAAK,MAAM,UAAU,CAAC;AAAA,IAC3D;AAAA,EACF;AACF;;;AC9EO,IAAM,cAAN,cAA0B,cAAc;AAAA,EAC7C,OAAO;AAAA,EACP,IAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAAA,EACA,IAAI,YAAY;AACd,WAAO;AAAA,EACT;AAAA,EAEA,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,UAAU,UAAU,UAAU,QAAQ,QAAQ,MAAM;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,kBACE,QACA,MACA,UACM;AACN,oBAAgB,GAAG,QAAQ,cAAc,mBAAmB,KAAK,CAAC,CAAC,CAAC;AACpE,SAAK,UAAU,QAAQ,KAAK,CAAC,CAAC;AAC9B,SAAK,mBAAmB,QAAQ,MAAM,CAAC;AAAA,EACzC;AACF;;;ACzBO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EACP,IAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAAA,EACA,IAAI,YAAY;AACd,WAAO;AAAA,EACT;AAAA,EAEA,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,WAAW,WAAW,WAAW,SAAS,SAAS,OAAO;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,kBACE,QACA,MACA,UACM;AACN,oBAAgB,IAAI,QAAQ,cAAc,mBAAmB,KAAK,CAAC,CAAC,CAAC;AACrE,oBAAgB,IAAI,QAAQ,cAAc,mBAAmB,KAAK,CAAC,CAAC,CAAC;AACrE,SAAK,UAAU,QAAQ,KAAK,CAAC,CAAC;AAC9B,SAAK,mBAAmB,QAAQ,MAAM,CAAC;AAAA,EACzC;AACF;;;AC1BO,IAAM,cAAN,cAA0B,cAAc;AAAA,EAC7C,OAAO;AAAA,EACP,IAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAAA,EACA,IAAI,YAAY;AACd,WAAO;AAAA,EACT;AAAA,EAEA,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,UAAU,UAAU,UAAU,QAAQ,QAAQ,MAAM;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,kBACE,QACA,MACA,UACM;AACN,oBAAgB,GAAG,QAAQ,cAAc,mBAAmB,KAAK,CAAC,CAAC,CAAC;AACpE,SAAK,UAAU,QAAQ,KAAK,CAAC,CAAC;AAC9B,SAAK,mBAAmB,QAAQ,MAAM,CAAC;AAAA,EACzC;AACF;;;ACxBO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,WAAW,WAAW,WAAW,SAAS,SAAS,OAAO;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAI/D,UAAM,QACJ;AACF,UAAM,UAAU,QAAQ,KAAK,MAAM,KAAK;AACxC,QAAI,SAAS,QAAQ;AACnB,WAAK,MAAM,SAAS,2BAA2B,QAAQ,MAAM;AAE7D,sBAAgB;AAAA,QACd;AAAA,QACA,gBAAgB;AAAA,UACd,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AACA,YAAM,eACJ,QAAQ,OAAO,0BAA0B,SACzC,QAAQ,OAAO,0BAA0B,QACrC,IACA,OAAO,QAAQ,OAAO,sBAAsB;AAElD,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,QAAQ,OAAO,aAAa,UAAU,GAAG,CAAC,CAAC;AAAA,MACpD;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,QAAQ,OAAO,aAAa,UAAU,GAAG,CAAC,CAAC;AAAA,MACpD;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,QAAQ,OAAO,eAAe,IAAI;AAAA,MACrE;AAGA,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,QAAQ,OAAO,WAAW,IAAI;AAAA,MACjE;AAEA,UACE,QAAQ,OAAO,gBAAgB,SAC/B,QAAQ,OAAO,gBAAgB,QAC/B;AACA,qBAAa,IAAI,eAAe,OAAO,QAAQ,OAAO,YAAY;AAAA,MACpE;AAEA,sBAAgB;AAAA,QACd;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AACA,sBAAgB,eAAe,cAAc,QAAQ,OAAO,YAAY;AACxE,sBAAgB,SAAS,cAAc,eAAe,GAAG;AAEzD,WAAK,eAAe,cAAc,MAAM,MAAM;AAC9C,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,EAC7D;AACF;;;ACxEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,SAAS,QAAQ,KAAK,MAAM,GAAG;AACrC,QAAI,OAAO,WAAW,GAAG;AACvB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AACA,oBAAgB,WAAW,cAAc,OAAO,MAAM,GAAG,CAAC,GAAG,GAAG;AAGhE,UAAM,OAAO,OAAO,CAAC,EAAE,MAAM,GAAG;AAChC,QAAI,KAAK,UAAU,GAAG;AACpB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,wBAAwB;AACpC,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAEA,sBAAgB,SAAS,cAAc;AAAA,QACrC,WACG,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,KAAK,KAClC,WAAW,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;AAAA,QACpC,YACG,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,KAAK,KAClC,WAAW,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;AAAA,MACtC,CAAC;AACD,sBAAgB,aAAa,cAAc,KAAK,CAAC,CAAC;AAClD,sBAAgB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAC7C,sBAAgB,eAAe,cAAc,KAAK,CAAC,CAAC;AACpD,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,KAAK,CAAC,CAAC;AAAA,MAC1C;AACA,UAAI,KAAK,WAAW,IAAI;AACtB,wBAAgB,WAAW,cAAc,KAAK,MAAM,GAAG,CAAC,GAAG,GAAG;AAC9D,wBAAgB,cAAc,cAAc,WAAW,KAAK,CAAC,CAAC,CAAC;AAC/D,wBAAgB,WAAW,cAAc,KAAK,MAAM,GAAG,EAAE,GAAG,GAAG;AAC/D,wBAAgB,cAAc,cAAc,KAAK,EAAE,CAAC;AACpD,wBAAgB,aAAa,cAAc,KAAK,EAAE,GAAG,SAAS;AAC9D,wBAAgB,WAAW,cAAc,KAAK,MAAM,IAAI,EAAE,GAAG,GAAG;AAAA,MAClE;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;AC1EO,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,mBAAmB;AAEjE,iBAAa,UAAU;AACvB,UAAM,SAAS,QAAQ,KAAK,MAAM,GAAG;AACrC,QAAI,OAAO,WAAW,IAAI;AAExB,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,MAC5C;AACA,sBAAgB,KAAK,cAAc,OAAO,CAAC,EAAE,QAAQ,KAAK,EAAE,CAAC;AAC7D,UAAI,OAAO,CAAC,EAAG,iBAAgB,SAAS,cAAc,OAAO,CAAC,CAAC;AAC/D,sBAAgB,iBAAiB,cAAc,OAAO,CAAC,CAAC;AACxD,sBAAgB,eAAe,cAAc,OAAO,CAAC,CAAC;AAEtD,sBAAgB,WAAW,cAAc,OAAO,MAAM,CAAC,CAAC;AAAA,IAC1D,WAAW,OAAO,WAAW,GAAG;AAC9B,YAAM,KAAK,OAAO,CAAC;AACnB,UAAI,GAAG,SAAS,MAAM,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM;AAErD,wBAAgB;AAAA,UACd;AAAA,UACA,gBAAgB,wBAAwB,OAAO,CAAC,EAAE,UAAU,GAAG,EAAE,CAAC;AAAA,QACpE;AACA,YAAI,MAAgB;AAAA,UAClB,MAAM,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK;AAAA,UACnC,MAAM,cAAc,mBAAmB,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,QAClE;AACA,wBAAgB;AAAA,UACd;AAAA,UACA,OAAO,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,IAAI;AAAA,QACtC;AACA,YAAI,MAAgB;AAAA,UAClB,MAAM,OAAO,CAAC,EAAE,UAAU,CAAC,EAAE,KAAK;AAAA,UAClC,MAAM,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,QAClD;AACA,wBAAgB,MAAM,cAAc,EAAE,WAAW,CAAC,KAAK,GAAG,EAAE,CAAC;AAC7D,wBAAgB,YAAY,cAAc,OAAO,CAAC,CAAC;AACnD,wBAAgB,WAAW,cAAc,OAAO,MAAM,CAAC,CAAC;AAAA,MAC1D,OAAO;AAEL,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,QAC5C;AACA,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,OAAO,CAAC,CAAC;AAAA,QAC5C;AACA,wBAAgB,QAAQ,cAAc,OAAO,CAAC,CAAC;AAC/C,wBAAgB,SAAS,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AACxD,wBAAgB;AAAA,UACd;AAAA,UACA,gBAAgB;AAAA,aACb,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,QAAQ,UAAU,EAAE;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,mBAAa,UAAU;AACvB,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAAA,IACpD;AAEA,SAAK,eAAe,cAAc,aAAa,OAAO;AAEtD,WAAO;AAAA,EACT;AACF;;;AC/EO,IAAM,cAAN,cAA0B,cAAc;AAAA,EAC7C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,IAAI;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,mBAAmB;AAEjE,iBAAa,UAAU;AACvB,QAAI,MAAM,QAAQ,KAAK;AAAA,MACrB;AAAA,IACF;AACA,QAAI,KAAK;AACP,sBAAgB,aAAa,cAAc,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACzD,sBAAgB,SAAS,cAAc,IAAI,CAAC,CAAC;AAC7C,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,IAAI,CAAC,IAAI,IAAI;AAAA,MAChD;AACA,sBAAgB,iBAAiB,cAAc,IAAI,CAAC,CAAC;AACrD,sBAAgB,eAAe,cAAc,IAAI,CAAC,CAAC;AACnD,sBAAgB,SAAS,cAAc,OAAO,IAAI,CAAC,EAAE,QAAQ,MAAM,EAAE,CAAC,CAAC;AACvE,sBAAgB,QAAQ,cAAc,IAAI,CAAC,CAAC;AAC5C,sBAAgB,YAAY,cAAc,IAAI,CAAC,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,IACpE,OAAO;AACL,mBAAa,UAAU;AACvB,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAAA,IACpD;AAEA,SAAK,eAAe,cAAc,aAAa,OAAO;AAEtD,WAAO;AAAA,EACT;AACF;;;ACtCO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,mBAAmB;AAEjE,iBAAa,UAAU;AACvB,UAAM,SAAS,QAAQ,KAAK,MAAM,GAAG;AACrC,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,OAAO,CAAC,EAAE,UAAU,CAAC,IAAI,IAAI;AAAA,IAChE;AACA,oBAAgB,SAAS,cAAc,OAAO,CAAC,CAAC;AAChD,oBAAgB,KAAK,cAAc,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;AAE3D,SAAK,eAAe,cAAc,aAAa,OAAO;AAEtD,WAAO;AAAA,EACT;AACF;;;AC1BO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC/C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,mBAAmB;AAEjE,iBAAa,UAAU;AACvB,UAAM,SAAS,QAAQ,KAAK,MAAM,GAAG;AACrC,QAAI,OAAO,WAAW,GAAG;AACvB,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,QACtB,OAAO,CAAC;AAAA,MACV;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,IAAI,IAAI;AAAA,MACnD;AAAA,IACF,OAAO;AACL,mBAAa,UAAU;AACvB,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAAA,IACpD;AACA,SAAK,eAAe,cAAc,aAAa,OAAO;AAEtD,WAAO;AAAA,EACT;AACF;;;AClCO,IAAM,oBAAN,cAAgC,cAAc;AAAA,EACnD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AACvB,iBAAa,UAAU,cAAc;AAErC,iBAAa,UAAU;AACvB,QAAI,QAAQ,KAAK,WAAW,KAAK,QAAQ,KAAK,UAAU,GAAG,CAAC,MAAM,QAAQ;AACxE,sBAAgB,QAAQ,cAAc,QAAQ,KAAK,UAAU,CAAC,CAAC;AAAA,IACjE,OAAO;AACL,mBAAa,UAAU;AACvB,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAAA,IACpD;AAEA,QAAI,aAAa,SAAS;AACxB,UAAI,CAAC,aAAa,UAAU;AAC1B,qBAAa,QAAQ,cAAc;AAAA,UAChC,cAAa,QAAQ,cAAc;AAAA,IAC1C,OAAO;AACL,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;ACjCO,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AACvB,iBAAa,UAAU,cAAc;AAErC,iBAAa,UAAU;AACvB,UAAM,OAAO,QAAQ;AACrB,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,KAAK,WAAW,IAAI;AAEtB,mBAAa,IAAI,MAAM,KAAK,UAAU,GAAG,CAAC;AAC1C,sBAAgB,iBAAiB,cAAc,KAAK,UAAU,GAAG,EAAE,CAAC;AACpE,sBAAgB,eAAe,cAAc,KAAK,UAAU,IAAI,EAAE,CAAC;AACnE,sBAAgB;AAAA,QACd;AAAA,QACA,gBAAgB;AAAA,UACd,KAAK,UAAU,IAAI,EAAE,EAAE,QAAQ,SAAS,IAAI;AAAA,QAC9C;AAAA,MACF;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC,IAAI;AAAA,MACnC;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,CAAC,KAAK,UAAU,GAAG,CAAC,GAAG,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF,WAAW,OAAO,WAAW,IAAI;AAE/B,mBAAa,IAAI,OAAO,OAAO,CAAC;AAChC,UAAI,OAAO,CAAC,MAAM,KAAK;AACrB,wBAAgB,SAAS,cAAc;AAAA,UACrC,UAAU,OAAO,OAAO,CAAC,CAAC;AAAA,UAC1B,WAAW,OAAO,OAAO,CAAC,CAAC;AAAA,QAC7B,CAAC;AACD,wBAAgB,SAAS,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AAAA,MAC1D;AACA,sBAAgB,iBAAiB,cAAc,OAAO,CAAC,CAAC;AACxD,sBAAgB,eAAe,cAAc,OAAO,CAAC,CAAC;AACtD,sBAAgB,iBAAiB,cAAc,OAAO,EAAE,CAAC;AACzD,sBAAgB,cAAc,cAAc,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACpE,UAAI,OAAO,EAAE,EAAE,SAAS,GAAG;AACzB,wBAAgB,gBAAgB,cAAc,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MACxE;AACA,sBAAgB,SAAS,cAAc,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC;AAC/D,sBAAgB;AAAA,QACd;AAAA,QACA,CAAC,GAAG,OAAO,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,MAAM,IAAI,EAAE,CAAC,EAAE;AAAA,UAC1D,CAAC,MAAM,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF,OAAO;AACL,mBAAa,UAAU;AACvB,sBAAgB,QAAQ,cAAc,IAAI;AAAA,IAC5C;AAEA,QAAI,aAAa,SAAS;AACxB,UAAI,CAAC,aAAa,UAAU;AAC1B,qBAAa,QAAQ,cAAc;AAAA,UAChC,cAAa,QAAQ,cAAc;AAAA,IAC1C,OAAO;AACL,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AC3EO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,OAAO,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AAEhD,QAAI,CAAC,QAAQ,KAAK,WAAW,OAAO,KAAK,KAAK,WAAW,IAAI;AAC3D,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,oBAAgB,aAAa,cAAc,KAAK,CAAC,EAAE,KAAK,CAAC;AACzD,oBAAgB,aAAa,cAAc,OAAO,KAAK,CAAC,CAAC,CAAC;AAC1D,oBAAgB,WAAW,cAAc,OAAO,KAAK,CAAC,CAAC,CAAC;AACxD,oBAAgB;AAAA,MACd;AAAA,MACA,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC;AAAA,MACtB;AAAA,IACF;AACA,oBAAgB,eAAe,cAAc,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,MAAM;AACzE,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,IAC1D;AACA,oBAAgB,QAAQ,cAAc,KAAK,CAAC,GAAG,GAAG;AAClD,UAAM,MAAM,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC;AAClC,UAAM,MAAM,KAAK,CAAC,EAAE,UAAU,GAAG,EAAE;AACnC,oBAAgB,SAAS,cAAc;AAAA,MACrC,UACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC,IACjE,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC,IAAI;AAAA,MAChC,WACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC,IACjE,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC,IAAI;AAAA,IAClC,CAAC;AACD,oBAAgB,SAAS,cAAc,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC;AAG5D,oBAAgB,WAAW,cAAc,KAAK,MAAM,CAAC,GAAG,GAAG;AAE3D,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;AC9DO,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,OAAO,QAAQ,KAAK,MAAM,GAAG;AACnC,QAAI,KAAK,WAAW,GAAG;AACrB,sBAAgB,aAAa,cAAc,KAAK,CAAC,CAAC;AAClD,sBAAgB,IAAI,cAAc,OAAO,KAAK,CAAC,CAAC,CAAC;AACjD,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,KAAK,CAAC,CAAC;AAAA,MAC1C;AACA,YAAM,MAAM,KAAK,CAAC;AAClB,YAAM,MAAM,KAAK,CAAC;AAClB,sBAAgB,SAAS,cAAc;AAAA,QACrC,UACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,QAChE,WACE,gBAAgB,aAAa,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;AAAA,MAClE,CAAC;AACD,sBAAgB,SAAS,cAAc,OAAO,KAAK,CAAC,CAAC,CAAC;AACtD,sBAAgB,QAAQ,cAAc,KAAK,CAAC,GAAG,GAAG;AAClD,sBAAgB,QAAQ,cAAc,KAAK,CAAC,GAAG,GAAG;AAAA,IACpD,OAAO;AACL,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;ACjDO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,OAAO,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AAEhD,QAAI,CAAC,QAAQ,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,GAAG;AACxD,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAAA,MAC5D;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,oBAAgB,aAAa,cAAc,KAAK,CAAC,EAAE,KAAK,CAAC;AACzD,oBAAgB,aAAa,cAAc,OAAO,KAAK,CAAC,CAAC,CAAC;AAC1D,UAAM,UAAU,KAAK,CAAC,EAAE,MAAM,GAAG;AACjC,oBAAgB,WAAW,cAAc,OAAO,QAAQ,CAAC,CAAC,CAAC;AAC3D,oBAAgB,eAAe,cAAc,QAAQ,CAAC,GAAG,MAAM;AAC/D,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,QAAQ,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,IAC7D;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;AC3CA,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAMC,iBAAgB;AAIf,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,KAAK,MAAMA,cAAa;AAC9C,QAAI,MAAM,WAAW,KAAK,MAAM,CAAC,EAAE,SAAS,GAAG,GAAG;AAChD,WAAK,eAAe,MAAM,CAAC,GAAG,YAAY;AAAA,IAC5C,OAAO;AACL,YAAM,SAAS,MAAM,CAAC,EAAE,KAAK;AAC7B,YAAM,cAAc,OAAO,MAAM,GAAG;AACpC,eAAS,IAAI,GAAG,IAAI,YAAY,SAAS,GAAG,KAAK;AAC/C,cAAM,aAAa,YAAY,CAAC,EAAE,MAAM,GAAG;AAC3C,mBAAW,QAAQ,YAAY;AAC7B,eAAK,UAAU,KAAK,KAAK,GAAG,YAAY;AAAA,QAC1C;AAAA,MACF;AAEA,WAAK;AAAA,QACH,YAAY,YAAY,SAAS,CAAC,EAAE,KAAK;AAAA,QACzC;AAAA,MACF;AAEA,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,OAAO,MAAM,CAAC;AACpB,cAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,mBAAW,QAAQ,OAAO;AACxB,eAAK,UAAU,KAAK,KAAK,GAAG,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,UAAU,MAAM,SAAS,GAAG;AAC3C,WAAK,eAAe,cAAc,IAAI;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,QAAgB,SAAuB;AAEzD,UAAM,SAAS,OAAO,MAAM,GAAG;AAC/B,QAAI,OAAO,SAAS,GAAG;AACrB,sBAAgB,QAAQ,SAAS,QAAQ,GAAG;AAC5C;AAAA,IACF;AACA,UAAM,UAAU,OAAO,CAAC,EAAE,MAAM,QAAQ;AACxC,QAAI,QAAQ,WAAW,GAAG;AACxB,sBAAgB,WAAW,SAAS,QAAQ,MAAM,GAAG,CAAC,GAAG,GAAG;AAC5D,sBAAgB,aAAa,SAAS,QAAQ,CAAC,CAAC;AAAA,IAClD,OAAO;AACL,sBAAgB,QAAQ,SAAS,QAAQ,GAAG;AAC5C;AAAA,IACF;AAEA,UAAM,aAAa,OAAO,CAAC,EAAE,MAAM,QAAQ;AAC3C,QAAI,WAAW,WAAW,GAAG;AAC3B,sBAAgB,IAAI,SAAS,SAAS,WAAW,CAAC,GAAG,EAAE,CAAC;AACxD,sBAAgB,iBAAiB,SAAS,WAAW,CAAC,CAAC;AAAA,IACzD,OAAO;AACL,sBAAgB,WAAW,SAAS,YAAY,GAAG;AAAA,IACrD;AAEA,UAAM,aAAa,OAAO,CAAC,EAAE,MAAM,QAAQ;AAC3C,QAAI,WAAW,WAAW,GAAG;AAC3B,sBAAgB,eAAe,SAAS,WAAW,CAAC,CAAC;AACrD,sBAAgB,KAAK,SAAS,WAAW,CAAC,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,IAC9D,OAAO;AACL,sBAAgB,WAAW,SAAS,YAAY,GAAG;AAAA,IACrD;AAEA,QAAI,OAAO,SAAS,GAAG;AACrB,sBAAgB,WAAW,SAAS,OAAO,MAAM,CAAC,GAAG,GAAG;AAAA,IAC1D;AAAA,EACF;AAAA,EAEQ,UAAU,MAAc,SAAuB;AACrD,UAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,QAAI,OAAO,SAAS,GAAG;AACrB,sBAAgB,QAAQ,SAAS,MAAM,GAAG;AAC1C;AAAA,IACF;AACA,UAAM,MAAM,OAAO,CAAC;AACpB,UAAM,MAAM,OAAO,MAAM,CAAC,EAAE,KAAK,GAAG;AAEpC,YAAQ,KAAK;AAAA,MACX,KAAK,OAAO;AAEV,cAAM,YAAY,UAAU,KAAK,GAAG;AACpC,cAAM,MACJ,OAAO,WAAW,QAAQ,GAAG,KAC5B,WAAW,QAAQ,SAAS,MAAM,KAAK;AAC1C,cAAM,MACJ,OAAO,WAAW,QAAQ,GAAG,KAC5B,WAAW,QAAQ,SAAS,MAAM,KAAK;AAC1C,cAAM,WAAW;AAAA,UACf,UAAU,OAAO,UAAU,GAAG,IAAI,MAAM,MAAO,MAAM;AAAA,UACrD,WAAW,OAAO,UAAU,GAAG,IAAI,MAAM,MAAO,MAAM;AAAA,QACxD;AACA,wBAAgB,SAAS,SAAS,QAAQ;AAC1C;AAAA,MACF;AAAA,MACA,KAAK;AACH,wBAAgB,SAAS,SAAS,SAAS,IAAI,QAAQ,KAAK,EAAE,GAAG,EAAE,CAAC;AACpE;AAAA,MACF,KAAK;AACH,wBAAgB,SAAS,SAAS,SAAS,KAAK,EAAE,IAAI,GAAG;AACzD;AAAA,MACF,KAAK;AACH,wBAAgB,KAAK,SAAS,SAAS,KAAK,EAAE,IAAI,GAAI;AACtD;AAAA,MACF,KAAK;AACH,wBAAgB,YAAY,SAAS,SAAS,KAAK,EAAE,CAAC;AACtD;AAAA,MACF,KAAK;AACH,wBAAgB,SAAS,SAAS,SAAS,KAAK,EAAE,CAAC;AACnD;AAAA,MACF,KAAK;AACH,wBAAgB,YAAY,SAAS,GAAG;AACxC;AAAA,MACF,KAAK;AAEH;AAAA,MACF,KAAK;AAEH,wBAAgB;AAAA,UACd;AAAA,UACA,SAAS,IAAI,QAAQ,OAAO,EAAE,GAAG,EAAE;AAAA,QACrC;AACA;AAAA,MACF,KAAK;AACH,wBAAgB;AAAA,UACd;AAAA,UACA,cAAc,mBAAmB,GAAG;AAAA,QACtC;AACA;AAAA,MACF,KAAK,OAAO;AACV,cAAM,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,KAAK,EAAE;AAC9C,wBAAgB,IAAI,SAAS,cAAc,mBAAmB,IAAI,CAAC;AACnE;AAAA,MACF;AAAA,MACA,KAAK;AACH,wBAAgB,QAAQ,SAAS,SAAS,KAAK,EAAE,CAAC;AAClD;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,gBAAgB;AAC5B;AAAA,MACF,KAAK;AAEH,wBAAgB,QAAQ,SAAS,MAAM,GAAG;AAC1C;AAAA,MACF,KAAK;AAEH,wBAAgB,QAAQ,SAAS,MAAM,GAAG;AAC1C;AAAA,MACF,KAAK;AAEH;AAAA,MACF;AACE,wBAAgB,QAAQ,SAAS,MAAM,GAAG;AAAA,IAC9C;AAAA,EACF;AAAA,EACQ,eAAe,MAAc,SAAuB;AAC1D,UAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,QAAI,SAAS,WAAW,GAAG;AACzB;AAAA,IACF;AACA,UAAM,SAAS,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,QAAQ;AAChD,oBAAgB,QAAQ,SAAS,OAAO,CAAC,GAAG,GAAG;AAC/C,oBAAgB,QAAQ,SAAS,OAAO,CAAC,GAAG,GAAG;AAC/C,oBAAgB;AAAA,MACd;AAAA,MACA,gBAAgB,wBAAwB,OAAO,CAAC,CAAC;AAAA,IACnD;AACA,oBAAgB,QAAQ,SAAS,SAAS,CAAC,CAAC;AAC5C,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,SAAS,CAAC,CAAC;AAAA,IAC9C;AACA,oBAAgB,WAAW,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,GAAG;AAC7D,oBAAgB;AAAA,MACd;AAAA,QAEG,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,KAAK,KACtC,SAAS,SAAS,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,GACjC,SAAS;AAAA,IACb;AACA,oBAAgB,SAAS,SAAS,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC;AAC3D,oBAAgB,YAAY,SAAS,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC;AAAA,EAChE;AACF;;;AC/MA,IAAMC,YAAW;AACjB,IAAM,eAAe;AACrB,IAAM,iBAAiB;AAEhB,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AACvB,iBAAa,UAAU,cAAc;AAErC,iBAAa,UAAU;AACvB,UAAM,OAAO,QAAQ;AACrB,QAAI,KAAK,WAAW,YAAY,GAAG;AAEjC,YAAM,SAAS,KAAK,MAAMA,SAAQ;AAClC,UAAI,OAAO,CAAC,EAAE,SAAS,GAAG;AACxB,qBAAa,IAAI,MAAM,OAAO,CAAC,EAAE,UAAU,CAAC;AAAA,MAC9C;AACA,sBAAgB,QAAQ,cAAc,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAC/D,YAAM,YAAY,OAAO,CAAC,EAAE,MAAM,GAAG;AACrC,sBAAgB,iBAAiB,cAAc,UAAU,CAAC,CAAC;AAC3D,sBAAgB,eAAe,cAAc,UAAU,CAAC,CAAC;AACzD,sBAAgB,KAAK,cAAc,OAAO,CAAC,EAAE,QAAQ,gBAAgB,EAAE,CAAC;AACxE,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,OAAO,CAAC,IAAI,IAAI;AAAA,MACnD;AAAA,IACF,WAAW,KAAK,WAAW,OAAO,GAAG;AAEnC,mBAAa,IAAI,MAAM,KAAK,UAAU,GAAG,CAAC;AAC1C,YAAM,WAAW,gBAAgB;AAAA,QAC/B,KAAK,UAAU,IAAI,EAAE,EAAE,QAAQ,gBAAgB,EAAE;AAAA,MACnD;AACA,UAAI,UAAU;AACZ,wBAAgB,SAAS,cAAc,QAAQ;AAAA,MACjD;AACA,sBAAgB,SAAS,cAAc,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC,CAAC;AACrE,sBAAgB,QAAQ,cAAc,KAAK,UAAU,EAAE,CAAC;AAAA,IAC1D,OAAO;AACL,YAAM,SAAS,KAAK,QAAQ,cAAc,EAAE,EAAE,MAAM,GAAG;AACvD,UAAI,OAAO,WAAW,GAAG;AAEvB,wBAAgB,iBAAiB,cAAc,OAAO,CAAC,CAAC;AACxD,wBAAgB,eAAe,cAAc,OAAO,CAAC,CAAC;AACtD,qBAAa,IAAI,MAAM,OAAO,CAAC,EAAE,UAAU,GAAG,CAAC;AAC/C,qBAAa,IAAI,OAAO,OAAO,CAAC,EAAE,UAAU,CAAC;AAG7C,wBAAgB,SAAS,cAAc;AAAA,UACrC,UAAU,OAAO,OAAO,CAAC,CAAC;AAAA,UAC1B,WAAW,OAAO,OAAO,CAAC,CAAC;AAAA,QAC7B,CAAC;AACD,wBAAgB,SAAS,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AACxD,wBAAgB,YAAY,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AAC3D,wBAAgB,QAAQ,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AACvD,wBAAgB,QAAQ,cAAc,OAAO,CAAC,CAAC;AAAA,MACjD,OAAO;AACL,qBAAa,UAAU;AACvB,wBAAgB,QAAQ,cAAc,IAAI;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,aAAa,SAAS;AACxB,UAAI,CAAC,aAAa,UAAU;AAC1B,qBAAa,QAAQ,cAAc;AAAA,UAChC,cAAa,QAAQ,cAAc;AAAA,IAC1C,OAAO;AACL,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;ACjFO,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAIvB,UAAM,QAAQ;AACd,UAAM,UAAU,QAAQ,KAAK,MAAM,KAAK;AACxC,QAAI,SAAS,QAAQ;AACnB,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,sBAAsB;AAClC,gBAAQ,IAAI,QAAQ,MAAM;AAAA,MAC5B;AAEA,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,QAAQ,OAAO,WAAW;AAAA,MAC7D;AACA,sBAAgB,eAAe,cAAc,QAAQ,OAAO,YAAY;AAAA,IAC1E;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;ACtCO,IAAM,wBAAN,cAAoC,cAAc;AAAA,EACvD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,eAAe;AAK7D,UAAM,OAAO,QAAQ,KAAK,UAAU,CAAC;AACrC,QAAI,KAAK,SAAS,GAAG;AACnB,sBAAgB,KAAK,cAAc,IAAI;AACvC,WAAK,eAAe,cAAc,MAAM,SAAS;AAAA,IACnD,OAAO;AACL,WAAK,eAAe,cAAc,KAAK;AAAA,IACzC;AAEA,SAAK,MAAM,SAAS,eAAe,IAAI;AACvC,WAAO;AAAA,EACT;AACF;;;AC7BO,IAAM,mBAAN,cAA+B,cAAc;AAAA,EAClD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AAEjC,iBAAa,IAAI,YAAY,OAAO,QAAQ,IAAI,IAAI;AAEpD,iBAAa,UAAU,cACrB;AACF,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,aAAa,IAAI,SAAS;AAAA,MACpC,MAAM;AAAA,IACR,CAAC;AAED,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;ACzBO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AAEpC,QAAI,MAAM,MAAM,SAAS,CAAC,MAAM,KAAK;AAEnC,mBAAa,UAAU,OAAO,QAAQ;AACtC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,WAAmB,CAAC;AAC1B,iBAAa,UAAU,OAAO;AAE9B,UAAM,SAAS,MAAM,CAAC;AACtB,QAAI,OAAO,WAAW,IAAI;AAExB,sBAAgB,IAAI,cAAc,SAAS,OAAO,UAAU,GAAG,CAAC,GAAG,EAAE,CAAC;AACtE,sBAAgB,iBAAiB,cAAc,OAAO,UAAU,GAAG,CAAC,CAAC;AACrE,sBAAgB,eAAe,cAAc,OAAO,UAAU,GAAG,EAAE,CAAC;AACpE,YAAM,YAAY,KAAK,mBAAmB,OAAO,UAAU,EAAE,CAAC;AAC9D,UAAI,WAAW;AACb,iBAAS,KAAK,SAAS;AAAA,MACzB,OAAO;AACL,qBAAa,UAAU,SACpB,aAAa,UAAU,OAAO,MAAM,MAAM,OAAO,UAAU,EAAE;AAAA,MAClE;AAAA,IACF;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,KAAK,CAAC,MAAM,KAAK;AACnB,qBAAa,UAAU,SACpB,aAAa,UAAU,OAAO,MAAM,MAAM;AAC7C;AAAA,MACF;AACA,YAAM,OAAO,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACtD,UAAI,MAAM;AACR,iBAAS,KAAK,IAAI;AAAA,MACpB,OAAO;AACL,qBAAa,UAAU,SACpB,aAAa,UAAU,OAAO,MAAM,MAAM;AAAA,MAC/C;AAAA,IACF;AAEA,oBAAgB,SAAS,cAAc,QAAQ;AAC/C,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cACnB,aAAa,UAAU,KAAK,WAAW,IAAI,SAAS;AACtD,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,MAA2B;AACpD,UAAM,YAAY,KAAK,UAAU,GAAG,EAAE;AACtC,UAAM,MACJ,gBAAgB,sCAAsC,SAAS;AACjE,QAAI,KAAK,WAAW,MAAM,CAAC,KAAK;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,MAAM,cAAc,mBAAmB,KAAK,UAAU,IAAI,EAAE,CAAC;AACnE,UAAM,cAAc,SAAS,KAAK,UAAU,IAAI,EAAE,GAAG,EAAE;AAEvD,UAAM,WAAW,KAAK,EAAE,MAAM,MAAM,KAAK;AACzC,UAAM,iBAAiB,SAAS,KAAK,UAAU,IAAI,EAAE,GAAG,EAAE;AAC1D,UAAM,cAAc,YAAY,iBAAiB;AACjD,UAAM,gBAAgB,SAAS,KAAK,UAAU,IAAI,EAAE,GAAG,EAAE;AACzD,UAAM,YAAY,SAAS,KAAK,UAAU,IAAI,EAAE,GAAG,EAAE;AAErD,QAAI,KAAK,EAAE,MAAM,KAAK;AACpB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,UAAU;AAAA,QACR,MAAM;AAAA,QACN,UAAU,IAAI;AAAA,QACd,WAAW,IAAI;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACX;AAAA,QACA,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;;;ACxGO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC/C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,MAAM,IAAI;AAAA,MACnB,WAAW,CAAC,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAGvB,UAAM,QACJ;AACF,UAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK;AAEtC,QAAI,CAAC,OAAO;AACV,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,qCAAqC,QAAQ,IAAI,EAAE;AAAA,MACjE;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,SAAS,MAAM,CAAC;AACtB,UAAM,WAAW,MAAM,CAAC;AACxB,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,WAAW,MAAM,CAAC;AAExB,oBAAgB,aAAa,cAAc,MAAM;AACjD,oBAAgB,eAAe,cAAc,QAAQ;AAErD,iBAAa,IAAI,YAAY;AAC7B,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAGD,QAAI,YAAY,UAAU;AACxB,mBAAa,IAAI,eAAe;AAChC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAGA,oBAAgB,SAAS,cAAc,SAAS,UAAU,EAAE,CAAC;AAE7D,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;ACrEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,MAAM,IAAI;AAAA,MACnB,WAAW,CAAC,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,QAAQ,QAAQ,KACnB,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,QAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,OAAO;AAC1C,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,oCAAoC,QAAQ,IAAI,EAAE;AAAA,MAChE;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,YAAoC,CAAC;AAC3C,UAAM,WAAqB,CAAC;AAE5B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,KAAK,WAAW,GAAG,GAAG;AACxB,cAAM,UAAU,KAAK,MAAM,kBAAkB;AAC7C,YAAI,SAAS;AACX,oBAAU,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC;AAAA,QACnC,OAAO;AACL,mBAAS,KAAK,IAAI;AAAA,QACpB;AAAA,MACF,WAAW,MAAM,GAAG;AAElB,cAAM,UAAU,KAAK,MAAM,GAAG;AAC9B,YAAI,QAAQ,UAAU,GAAG;AACvB,0BAAgB,aAAa,cAAc,QAAQ,CAAC,CAAC;AAAA,QACvD;AACA,YAAI,QAAQ,UAAU,GAAG;AACvB,0BAAgB,KAAK,cAAc,QAAQ,CAAC,CAAC;AAAA,QAC/C;AAEA,YAAI,QAAQ,UAAU,GAAG;AAAA,QAEzB;AAAA,MACF,WAAW,MAAM,GAAG;AAElB,iBAAS,KAAK,IAAI;AAAA,MACpB,OAAO;AACL,iBAAS,KAAK,IAAI;AAAA,MACpB;AAAA,IACF;AAGA,QAAI,UAAU,KAAK,GAAG;AACpB,YAAM,QAAQ,UAAU,KAAK,EAAE,MAAM,GAAG;AACxC,UAAI,MAAM,WAAW,GAAG;AACtB,wBAAgB,iBAAiB,cAAc,MAAM,CAAC,GAAG,MAAM;AAC/D,wBAAgB,eAAe,cAAc,MAAM,CAAC,GAAG,MAAM;AAAA,MAC/D;AAAA,IACF;AAGA,iBAAa,IAAI,YAAY;AAG7B,UAAM,eAA2C;AAAA,MAC/C,CAAC,OAAO,+BAA+B,KAAK;AAAA,MAC5C,CAAC,cAAc,iBAAiB,eAAe;AAAA,MAC/C,CAAC,OAAO,mBAAmB,KAAK;AAAA,MAChC,CAAC,OAAO,oBAAoB,KAAK;AAAA,MACjC,CAAC,OAAO,cAAc,KAAK;AAAA,MAC3B,CAAC,OAAO,kBAAkB,KAAK;AAAA,MAC/B,CAAC,OAAO,wBAAwB,KAAK;AAAA,MACrC,CAAC,OAAO,eAAe,aAAa;AAAA,IACtC;AAEA,eAAW,CAAC,KAAK,OAAO,IAAI,KAAK,cAAc;AAC7C,UAAI,UAAU,GAAG,GAAG;AAClB,qBAAa,UAAU,MAAM,KAAK;AAAA,UAChC,MAAM;AAAA,UACN,MAAM,KAAK,YAAY;AAAA,UACvB;AAAA,UACA,OAAO,UAAU,GAAG;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,sBAAgB,WAAW,cAAc,UAAU,IAAI;AAAA,IACzD;AAEA,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;AC3GO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,OAAO,SAAS;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,kBAAkB;AAEhE,UAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK;AAEtC,QAAI,MAAM,SAAS,GAAG;AAGpB,YAAM,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG;AAEjC,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAM,QAAQ,OAAO,CAAC;AACtB,wBAAgB,QAAQ,cAAc,OAAO,GAAG;AAAA,MAClD;AAEA,YAAM,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,EAAE;AACrC,YAAM,MAAM,MAAM,CAAC,EAAE,UAAU,EAAE;AACjC,YAAM,WAAW,KAAK,UAAU,GAAG,EAAE;AACrC,YAAM,OACJ,SAAS,UAAU,GAAG,CAAC,IACvB,SAAS,UAAU,GAAG,CAAC,IACvB,SAAS,UAAU,GAAG,CAAC;AAEzB,sBAAgB,QAAQ,cAAc,KAAK,UAAU,EAAE,GAAG,GAAG;AAC7D,mBAAa,IAAI,oBAAoB,cAAc;AAAA,QACjD,SAAS,UAAU,CAAC;AAAA,QACpB;AAAA,MACF;AAEA,mBAAa,IAAI,gBAAgB;AACjC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,aAAa,IAAI;AAAA,MAC1B,CAAC;AACD,WAAK,eAAe,cAAc,MAAM,SAAS;AAAA,IACnD,OAAO;AAEL,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAEA,WAAO;AAAA,EACT;AACF;;;ACtDO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAGA,UAAM,cAAc;AACpB,UAAM,cAAc,QAAQ,KAAK,MAAM,WAAW;AAElD,QAAI,CAAC,aAAa;AAChB,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAEA,UAAM,UAAU,YAAY,CAAC;AAC7B,UAAM,YAAY,YAAY,CAAC;AAC/B,UAAM,cAAc,QAAQ,KAAK,UAAU,YAAY,CAAC,EAAE,MAAM;AAChE,UAAM,SAAS,YAAY,MAAM,GAAG;AAGpC,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAEA,oBAAgB,aAAa,cAAc,GAAG,OAAO,GAAG,SAAS,EAAE;AACnE,oBAAgB,iBAAiB,cAAc,OAAO,CAAC,CAAC;AACxD,oBAAgB,eAAe,cAAc,OAAO,CAAC,CAAC;AAGtD,UAAM,YAAY,OAAO,CAAC,EAAE,KAAK;AACjC,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,MAAM,OAAO,UAAU,UAAU,GAAG,CAAC,CAAC;AAC5C,YAAM,MAAM,cAAc;AAAA,QACxB,UAAU,UAAU,CAAC,IAAI;AAAA,MAC3B;AACA,sBAAgB,IAAI,cAAc,GAAG;AACrC,sBAAgB,UAAU,cAAc,GAAG;AAAA,IAC7C;AAGA,UAAM,MAAM,WAAW,OAAO,CAAC,EAAE,QAAQ,OAAO,EAAE,CAAC;AACnD,UAAM,MAAM,WAAW,OAAO,CAAC,EAAE,QAAQ,OAAO,EAAE,CAAC;AACnD,oBAAgB,SAAS,cAAc,EAAE,UAAU,KAAK,WAAW,IAAI,CAAC;AAGxE,UAAM,MAAM,OAAO,OAAO,CAAC,CAAC;AAC5B,oBAAgB,SAAS,cAAc,GAAG;AAG1C,UAAM,MAAM,OAAO,OAAO,CAAC,CAAC;AAC5B,oBAAgB,QAAQ,cAAc,GAAG;AAGzC,QAAI,OAAO,SAAS,GAAG;AACrB,sBAAgB,WAAW,cAAc,OAAO,MAAM,CAAC,CAAC;AAAA,IAC1D;AAEA,SAAK;AAAA,MACH;AAAA,MACA;AAAA,MACA,OAAO,SAAS,IAAI,YAAY;AAAA,IAClC;AAEA,WAAO;AAAA,EACT;AACF;;;AC/EA,WAAsB;AAWf,SAAS,YACd,MACA,KACwB;AACxB,QAAM,SAAuB,CAAC;AAC9B,QAAM,WAAW,IAAS,aAAQ,EAAE,YAAY,MAAM,MAAM,GAAG,CAAC;AAChE,WAAS,SAAS,CAAC,UAAsB;AACvC,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,WAAS,KAAK,MAAM,CAAC;AAErB,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,OAAO,WAAW,EAAG,QAAO,OAAO,CAAC;AAExC,QAAM,WAAW,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAC5D,QAAM,SAAS,IAAI,WAAW,QAAQ;AACtC,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,WAAO,IAAI,OAAO,MAAM;AACxB,cAAU,MAAM;AAAA,EAClB;AACA,SAAO;AACT;AAUO,SAAS,mBAAmB,QAA4B;AAC7D,QAAM,UAAU,OACb,QAAQ,MAAM,GAAG,EACjB,QAAQ,MAAM,GAAG,EACjB,QAAQ,mBAAmB,EAAE;AAChC,QAAM,SAAS,UAAU,IAAI,QAAQ,IAAK,QAAQ,SAAS,KAAM,CAAC;AAClE,QAAM,SAAS,KAAK,MAAM;AAC1B,QAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,EAChC;AACA,SAAO;AACT;;;AClDA,IAAM,cAAc,IAAI,YAAY;AAE7B,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC/C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,QAAQ,iBAAiB,mBAAmB;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,EAAE,CAAC;AACzC,QAAI;AACF,YAAM,mBAAmB,mBAAmB,IAAI;AAChD,YAAM,SAAS,YAAY,kBAAkB,KAAK;AAClD,UAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AACA,YAAM,WAAW,YAAY,OAAO,MAAM;AAE1C,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,sBAAc,KAAK,MAAM,QAAQ,EAAE;AAAA,MACrC,QAAQ;AACN,sBAAc;AAAA,MAChB;AAEA,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,WAAW;AACtC,uBAAe,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,MAChD,QAAQ;AACN,uBAAe;AAAA,MACjB;AACA,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,mBAAa,IAAI,OAAO;AACxB,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,IACH,SAAS,GAAG;AAEV,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,qCAAqC,QAAQ,IAAI,IAAI,CAAC;AAAA,MACpE;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AClCO,SAAS,aAAa,MAAqC;AAEhE,QAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,MAAI,aAAa,IAAI;AACnB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ;AACzC,MAAI,WAAW,IAAI;AACjB,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,KAAK,UAAU,WAAW,GAAG,MAAM;AAGjD,QAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAgBnD,QAAM,QAAQ,WAAW,MAAM,GAAG;AAKlC,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,MAAM,CAAC,EAAE,KAAK;AAC/B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,MAAM,CAAC,EAAE,KAAK;AAChC,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,UAAU,CAAC;AAC/B,QAAM,aAAa,UAAU,CAAC;AAQ9B,QAAM,WAAW,MAAM,CAAC,EAAE,KAAK;AAC/B,QAAM,YAAY,SAAS,QAAQ,GAAG;AACtC,MAAI,cAAc,IAAI;AACpB,WAAO;AAAA,EACT;AACA,QAAM,eAAe,SAAS,UAAU,GAAG,SAAS;AACpD,QAAM,iBAAiB,SAAS,UAAU,YAAY,CAAC;AAGvD,QAAM,YAAY,MAAM,CAAC,EAAE,KAAK;AAChC,QAAM,aAAa,UAAU,QAAQ,GAAG;AACxC,MAAI,eAAe,IAAI;AACrB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,UAAU,UAAU,GAAG,UAAU;AACnD,QAAM,eAAe,UAAU,UAAU,aAAa,CAAC;AAGvD,QAAM,YAAY,MAAM,CAAC,EAAE,KAAK;AAEhC,QAAM,gBAAgB,UAAU,UAAU,UAAU,SAAS,CAAC;AAC9D,QAAM,YAAY,UAAU,UAAU,GAAG,UAAU,SAAS,CAAC;AAG7D,QAAM,kBAAkB,MAAM,CAAC,EAAE,KAAK;AAEtC,QAAM,aAAa,gBAAgB;AAAA,IACjC;AAAA,EACF;AACA,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,QAAM,cAAc,WAAW,CAAC;AAChC,QAAM,cAAc,WAAW,CAAC;AAChC,QAAM,QAAQ;AAAA,IACZ,WAAW,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO;AAAA,MAC9C,MAAM;AAAA,IACR,EAAE;AAAA,EACJ;AAGA,QAAM,YAAY,MAAM,CAAC,EAAE,KAAK;AAChC,QAAM,YAAY,UAAU,MAAM,KAAK;AACvC,QAAM,WAAW,UAAU,CAAC;AAE5B,QAAM,cAAc,SAAS,UAAU,GAAG,SAAS,SAAS,CAAC;AAC7D,QAAM,MAAM,SAAS,UAAU,SAAS,SAAS,CAAC;AAClD,QAAM,aAAa,UAAU,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAGhE,QAAM,WAAW,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAC/C,QAAM,YAAoC,CAAC;AAE3C,MAAI,SAAS,SAAS,GAAG;AAIvB,UAAM,cAAc,SAAS,MAAM,KAAK;AACxC,QAAI,aAAa;AACjB,QAAI,eAAe;AAEnB,eAAW,SAAS,aAAa;AAC/B,YAAM,UAAU,MAAM,MAAM,oBAAoB;AAChD,UAAI,SAAS;AAEX,YAAI,YAAY;AACd,oBAAU,UAAU,IAAI,aAAa,KAAK;AAAA,QAC5C;AACA,qBAAa,QAAQ,CAAC;AACtB,uBAAe,QAAQ,CAAC;AAAA,MAC1B,WAAW,YAAY;AAErB,wBAAgB,MAAM;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,YAAY;AACd,gBAAU,UAAU,IAAI,aAAa,KAAK;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7LO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,MAAM,IAAI;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AACvB,iBAAa,UAAU,cAAc;AAErC,QAAI,CAAC,QAAQ,KAAK,SAAS,OAAO,GAAG;AACnC,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,wCAAwC;AAAA,MACtD;AACA,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,aAAa,QAAQ,IAAI;AACrC,QAAI,CAAC,KAAK;AACR,sBAAgB,QAAQ,cAAc,QAAQ,IAAI;AAClD,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAGA,oBAAgB,SAAS,cAAc,IAAI,QAAQ;AAEnD,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,IAAI;AAAA,IACb,CAAC;AAED,QAAI,IAAI,WAAW;AACjB,sBAAgB,iBAAiB,cAAc,IAAI,SAAS;AAAA,IAC9D;AAEA,QAAI,IAAI,aAAa;AACnB,sBAAgB,eAAe,cAAc,IAAI,WAAW;AAAA,IAC9D;AAEA,QAAI,IAAI,WAAW,SAAS,GAAG;AAC7B,sBAAgB,iBAAiB,cAAc,IAAI,WAAW,CAAC,CAAC;AAAA,IAClE;AAEA,QAAI,IAAI,OAAO;AACb,sBAAgB,MAAM,cAAc,IAAI,KAAK;AAAA,IAC/C;AAEA,QAAI,IAAI,UAAU,KAAK;AACrB,sBAAgB,KAAK,cAAc,IAAI,UAAU,GAAG;AAAA,IACtD;AAEA,UAAM,WAAmC;AAAA,MACvC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AACA,UAAM,YAAY,SAAS,IAAI,WAAW,KAAK,IAAI;AACnD,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAED,iBAAa,UAAU,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,GAAG,IAAI,WAAW,IAAI,IAAI,WAAW;AAAA,IAC9C,CAAC;AAGD,iBAAa,IAAI,WAAW;AAE5B,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AAEnC,WAAO;AAAA,EACT;AACF;;;AC5FO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,OAAO;AAAA,EACP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,SAAgC;AACrC,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AAEvB,QAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,KAAK,WAAW,GAAG,GAAG;AAClD,mBAAa,UAAU;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,QACJ;AAEF,UAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK;AACtC,QAAI,SAAS,MAAM,QAAQ;AACzB,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,mBAAa,UAAU,cAAc;AAErC,sBAAgB,aAAa,cAAc,MAAM,OAAO,MAAM;AAC9D,sBAAgB,SAAS,cAAc;AAAA,QACrC,UAAU,SAAS,MAAM,OAAO,GAAG;AAAA,QACnC,WAAW,SAAS,MAAM,OAAO,GAAG;AAAA,MACtC,CAAC;AACD,sBAAgB;AAAA,QACd;AAAA,QACA,cAAc,mBAAmB,MAAM,OAAO,SAAS;AAAA,MACzD;AACA,sBAAgB;AAAA,QACd;AAAA,QACA,SAAS,MAAM,OAAO,KAAK,EAAE,IAAI;AAAA,MACnC;AACA,sBAAgB,YAAY,cAAc,WAAW,MAAM,OAAO,IAAI,CAAC;AACvE,sBAAgB,KAAK,cAAc,WAAW,MAAM,OAAO,IAAI,CAAC;AAChE,sBAAgB,QAAQ,cAAc,KAAK;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,QAAwB;AACxC,QAAM,QAAQ,OAAO,MAAM,0BAA0B;AACrD,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,SAAS,MAAM,CAAC,CAAC;AAC3B,MAAI,MAAM,SAAS,MAAM,CAAC,CAAC;AAC3B,MAAI,OAAO,MAAM,CAAC,MAAM,MAAM,KAAK;AACnC,SAAO,QAAQ,MAAM,MAAM;AAC7B;AAEA,SAAS,SAAS,QAAwB;AACxC,QAAM,QAAQ,OAAO,MAAM,sBAAsB;AACjD,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,SAAS,MAAM,CAAC,CAAC;AAC3B,MAAI,MAAM,SAAS,MAAM,CAAC,CAAC;AAC3B,MAAI,OAAO,MAAM,CAAC,MAAM,MAAM,KAAK;AACnC,SAAO,QAAQ,MAAM,MAAM;AAC7B;;;AChEO,IAAM,mBAAN,cAA+B,cAAc;AAAA,EAClD,OAAO;AAAA,EACP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,QAAI,eAAe,KAAK,cAAc;AACtC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU,cAAc;AACrC,iBAAa,UAAU;AAEvB,UAAM,MAAM,QAAQ;AAEpB,QAAI,IAAI,WAAW,MAAM,CAAC,IAAI,WAAW,MAAM,GAAG;AAChD,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,gCAAgC,GAAG,EAAE;AAAA,MACnD;AACA,sBAAgB,QAAQ,cAAc,GAAG;AACzC,mBAAa,UAAU;AACvB,mBAAa,QAAQ,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,oBAAgB,MAAM,cAAc,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;AAC/D,oBAAgB,IAAI,cAAc,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;AAC7D,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,mBAAmB,IAAI,UAAU,GAAG,EAAE,CAAC;AAAA,IACvD;AACA,oBAAgB,SAAS,cAAc;AAAA;AAAA,MAErC,UACE,gBAAgB,aAAa,IAAI,UAAU,IAAI,EAAE,CAAC,KACjD,OAAO,IAAI,UAAU,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,UAAU,IAAI,EAAE,CAAC,IAAI;AAAA,MACnE,WACE,gBAAgB,aAAa,IAAI,UAAU,IAAI,EAAE,CAAC,KACjD,OAAO,IAAI,UAAU,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,UAAU,IAAI,EAAE,CAAC,IAAI;AAAA,IACrE,CAAC;AACD,oBAAgB,SAAS,cAAc,OAAO,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC;AACpE,oBAAgB,QAAQ,cAAc,IAAI,UAAU,EAAE,CAAC;AACvD,iBAAa,UAAU;AACvB,iBAAa,QAAQ,cAAc;AACnC,WAAO;AAAA,EACT;AACF;;;ACjDO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,OAAO,SAAS;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,WAAW,SAAS,iBAAiB;AAE/D,UAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK;AAEtC,QAAI,MAAM,SAAS,GAAG;AAGpB,YAAM,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG;AAEjC,sBAAgB,WAAW,cAAc,OAAO,MAAM,CAAC,GAAG,GAAG;AAE7D,YAAM,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,EAAE;AACrC,YAAM,MAAM,MAAM,CAAC,EAAE,UAAU,EAAE;AACjC,YAAM,WAAW,KAAK,UAAU,GAAG,EAAE;AACrC,YAAM,OACJ,SAAS,UAAU,GAAG,CAAC,IACvB,SAAS,UAAU,GAAG,CAAC,IACvB,SAAS,UAAU,GAAG,CAAC;AAEzB,sBAAgB,QAAQ,cAAc,KAAK,UAAU,EAAE,GAAG,GAAG;AAC7D,mBAAa,IAAI,oBAAoB,cAAc;AAAA,QACjD,SAAS,UAAU,CAAC;AAAA,QACpB;AAAA,MACF;AAEA,mBAAa,IAAI,kBAAkB;AACnC,mBAAa,UAAU,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,aAAa,IAAI;AAAA,MAC1B,CAAC;AACD,WAAK,eAAe,cAAc,MAAM,SAAS;AAAA,IACnD,OAAO;AAEL,aAAO,KAAK,YAAY,cAAc,QAAQ,MAAM,OAAO;AAAA,IAC7D;AAEA,WAAO;AAAA,EACT;AACF;;;ACpDO,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,OAAO;AAAA,EAEP,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,CAAC,IAAI;AAAA,MACb,WAAW,CAAC,mBAAmB,WAAW;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,OAAO,SAAkB,UAAmB,CAAC,GAAiB;AAC5D,UAAM,eAAe,KAAK,cAAc;AACxC,iBAAa,QAAQ,OAAO,KAAK;AACjC,iBAAa,UAAU;AACvB,iBAAa,UAAU,cAAc;AAErC,UAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG;AAEpC,iBAAa,UAAU;AACvB,QAAI,MAAM,CAAC,MAAM,YAAY;AAC3B,UAAI,SAAS,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC;AACpC,UAAI,SAAS,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAC5C,UAAI,SAAS,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAC5C,UAAI,SAAS,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC;AACpC,UAAI,SAAS,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAC5C,UAAI,SAAS,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAC5C,UAAI,MAAM;AAAA,QACR,WAAW,SAAS,SAAS,OAAO,WAAW,MAAM,IAAI;AAAA,QACzD,YAAY,SAAS,SAAS,OAAO,WAAW,MAAM,IAAI;AAAA,MAC5D;AACA,sBAAgB,WAAW,cAAc,MAAM,MAAM,CAAC,GAAG,GAAG;AAC5D,sBAAgB,SAAS,cAAc,GAAG;AAAA,IAC5C,WAAW,MAAM,CAAC,MAAM,MAAM;AAC5B,sBAAgB,iBAAiB,cAAc,MAAM,CAAC,CAAC;AACvD,sBAAgB,WAAW,cAAc,MAAM,MAAM,CAAC,GAAG,GAAG;AAAA,IAC9D,OAAO;AACL,mBAAa,UAAU;AAAA,IACzB;AAEA,QAAI,aAAa,SAAS;AACxB,UAAI,CAAC,aAAa,UAAU;AAC1B,qBAAa,QAAQ,cAAc;AAAA,UAChC,cAAa,QAAQ,cAAc;AAAA,IAC1C,OAAO;AACL,mBAAa,QAAQ,cAAc;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AChDO,SAAS,cAAc,OAAkC;AAC9D,MAAI,MAAM;AACV,MAAI,IAAI,WAAW,IAAI,EAAG,OAAM,IAAI,MAAM,CAAC;AAC3C,MAAI,IAAI,SAAS,IAAI,EAAG,OAAM,IAAI,MAAM,GAAG,EAAE;AAC7C,QAAM,IAAI,QAAQ,OAAO,EAAE;AAC3B,MAAI,IAAI,WAAW,EAAG,QAAO,IAAI,WAAW,CAAC;AAE7C,QAAM,SAAmB,CAAC;AAC1B,MAAI,IAAI;AAER,SAAO,IAAI,IAAI,QAAQ;AACrB,QAAI,IAAI,CAAC,MAAM,KAAK;AAClB,aAAO,KAAK,GAAG,GAAG,GAAG,CAAC;AACtB;AACA;AAAA,IACF;AAEA,UAAM,YAAY,IAAI,SAAS;AAC/B,UAAM,WAAW,KAAK,IAAI,GAAG,SAAS;AACtC,QAAI,aAAa,EAAG;AAEpB,QAAI,SAAS,IAAI,MAAM,GAAG,IAAI,QAAQ;AACtC,WAAO,OAAO,SAAS,EAAG,WAAU;AAEpC,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,QAAQ,OAAO,WAAW,CAAC,IAAI;AACrC,UAAI,QAAQ,KAAK,QAAQ,GAAI,QAAO;AACpC,cAAQ,QAAQ,KAAK;AAAA,IACvB;AAEA,QAAI,aAAa,KAAK,QAAQ,WAAY,QAAO;AAGjD,UAAM,IAAI,UAAU;AACpB,UAAM,WAAW,aAAa,IAAI,IAAI,WAAW;AACjD,QAAI,YAAY,EAAG,QAAO,KAAM,MAAM,KAAM,GAAI;AAChD,QAAI,YAAY,EAAG,QAAO,KAAM,MAAM,KAAM,GAAI;AAChD,QAAI,YAAY,EAAG,QAAO,KAAM,MAAM,IAAK,GAAI;AAC/C,QAAI,YAAY,EAAG,QAAO,KAAK,IAAI,GAAI;AAEvC,SAAK;AAAA,EACP;AAEA,SAAO,IAAI,WAAW,MAAM;AAC9B;;;AC/CA,IAAMC,eAAc,IAAI,YAAY;AACpC,IAAM,cAAc,IAAI,YAAY;AAEpC,IAAK,cAAL,kBAAKC,iBAAL;AACE,EAAAA,0BAAA,QAAK,KAAL;AACA,EAAAA,0BAAA,QAAK,KAAL;AAFG,SAAAA;AAAA,GAAA;AAKL,IAAK,UAAL,kBAAKC,aAAL;AACE,EAAAA,SAAA,oBAAiB;AACjB,EAAAA,SAAA,yBAAsB;AACtB,EAAAA,SAAA,wBAAqB;AACrB,EAAAA,SAAA,iBAAc;AACd,EAAAA,SAAA,uBAAoB;AACpB,EAAAA,SAAA,oBAAiB;AACjB,EAAAA,SAAA,mBAAgB;AAPb,SAAAA;AAAA,GAAA;AAUL,IAAK,cAAL,kBAAKC,iBAAL;AACE,EAAAA,0BAAA,UAAO,KAAP;AACA,EAAAA,0BAAA,SAAM,KAAN;AACA,EAAAA,0BAAA,WAAQ,KAAR;AACA,EAAAA,0BAAA,gBAAa,KAAb;AAJG,SAAAA;AAAA,GAAA;AAOL,IAAK,cAAL,kBAAKC,iBAAL;AACE,EAAAA,0BAAA,gBAAa,KAAb;AACA,EAAAA,0BAAA,gBAAa,KAAb;AACA,EAAAA,0BAAA,gBAAa,KAAb;AACA,EAAAA,0BAAA,mBAAgB,KAAhB;AAJG,SAAAA;AAAA,GAAA;AAiBL,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AA2B5B,IAAM,gBAAgB,CAAC,MACrB,OAAO,OAAO,WAAW,EAAE,SAAS,CAAgB;AACtD,IAAM,YAAY,CAAC,MACjB,OAAO,OAAO,OAAO,EAAE,SAAS,CAAY;AAC9C,IAAM,gBAAgB,CAAC,MACrB,OAAO,OAAO,WAAW,EAAE,SAAS,CAAgB;AACtD,IAAM,gBAAgB,CAAC,MACrB,OAAO,OAAO,WAAW,EAAE,SAAS,CAAgB;AAgB/C,IAAM,gBAAN,MAAoB;AAAA,EACzB,OAAO,yBAGH;AAAA,IACF,CAAC,UAAc,GAAG;AAAA,MAChB,CAAC,kBAAsB,GAAG;AAAA,MAC1B,CAAC,kBAAsB,GAAG;AAAA,MAC1B,CAAC,kBAAsB,GAAG;AAAA,MAC1B,CAAC,qBAAyB,GAAG;AAAA,IAC/B;AAAA,IACA,CAAC,UAAc,GAAG;AAAA,MAChB,CAAC,kBAAsB,GAAG;AAAA,MAC1B,CAAC,kBAAsB,GAAG;AAAA,MAC1B,CAAC,kBAAsB,GAAG;AAAA,MAC1B,CAAC,qBAAyB,GAAG;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,OAAO,kBACL;AAAA,IACE,CAAC,wBAAsB,GAAG,CAAC,QAAgB;AACzC,UAAI,IAAI,SAAS,GAAG;AAClB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,iCAAiC,IAAI,SAAS;AAAA,QACvD;AAAA,MACF;AAEA,UAAI,OAAO,IAAI,CAAC;AAEhB,UAAI,SAAS,QAAQ,IAAI,MAAM,IAAI;AACjC,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,kCAAkC,OAAO;AAAA,QAClD;AAAA,MACF;AAEA,UAAI,OAAO,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI;AACjC,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,oCAAoC,IAAI,CAAC,IAAI;AAAA,QACtD;AAAA,MACF;AAEA,YAAM,OAAO,SAAS,IAAI,CAAC,CAAC;AAE5B,YAAM,WAAW,IAAI,QAAQ,GAAG;AAChC,UAAI,aAAa,IAAI;AACnB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,SAAS,IAAI,UAAU,GAAG,QAAQ;AACxC,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,MAAM,cAAc,OAAO,SAAS,IAAI;AAC5C,UAAI,CAAC,OAAO,IAAI,SAAS,MAAM;AAC7B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,OAA+B;AAEnC,YAAM,UAAU,IAAI,UAAU,WAAW,CAAC;AAC1C,UAAI,QAAQ,SAAS,GAAG;AACtB,YAAI,OAAO,QAAQ,IAAI,KAAK,GAAG;AAC7B,gBAAM,YAAY,SAAS,IAAI;AAE/B,gBAAM,UAAU,cAAc,OAAO,UAAU,IAAI;AACnD,cAAI,YAAY,MAAM;AACpB,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,OAAO;AAAA,YACT;AAAA,UACF;AACA,iBAAO;AACP,cAAI,KAAK,UAAU,WAAW;AAC5B,mBAAO,KAAK,SAAS,GAAG,KAAK,SAAS,SAAS;AAAA,UACjD;AAAA,QACF,WAAW,SAAS,KAAK;AACvB,iBAAO,YAAY,OAAO,OAAO;AAAA,QACnC;AAAA,MACF;AAEA,YAAM,IAAI,SAAS,GAAG,IAAI,SAAS,IAAI;AAEvC,YAAM,UAAU,IAAI,CAAC,IAAI;AACzB,YAAM,UAAW,IAAI,CAAC,KAAK,IAAK;AAEhC,UAAI,cAAc,OAAO,KAAK,cAAc,OAAO,GAAG;AACpD,cAAM,oBACJ,KAAK,uBAAuB,OAAO,EAAE,OAAO;AAC9C,eAAO,kBAAkB,KAAK,IAAI;AAAA,MACpC,OAAO;AACL,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OACE,iDACA,UACA,WACA;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,6BAA2B,GAAG,MAAM;AACnC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,4BAA0B,GAAG,MAAM;AAClC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,qBAAmB,GAAG,MAAM;AAC3B,aAAO,EAAE,SAAS,OAAO,OAAO,+BAA+B;AAAA,IACjE;AAAA,IACA,CAAC,2BAAyB,GAAG,MAAM;AACjC,aAAO,EAAE,SAAS,OAAO,OAAO,sCAAsC;AAAA,IACxE;AAAA,IACA,CAAC,wBAAsB,GAAG,MAAM;AAC9B,aAAO,EAAE,SAAS,OAAO,OAAO,kCAAkC;AAAA,IACpE;AAAA,IACA,CAAC,uBAAqB,GAAG,MAAM;AAC7B,aAAO,EAAE,SAAS,OAAO,OAAO,iCAAiC;AAAA,IACnE;AAAA,EACF;AAAA,EAEF,OAAe,WAAW,KAAiB,MAAe;AACxD,UAAM,WAAW;AAAA,MACf;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1B;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aACK,OAAO,MAAO,IACf,UAAY,QAAQ,IAAK,IAAI,CAAC,OAAO,IAAK,GAAI,OAChD;AAAA,IACJ;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAiB,MAAe;AAC3D,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY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","names":["data","NEWLINE_REGEX","WS_REGEX","textDecoder","MIAMVersion","MIAMFid","MIAMCorePdu","MIAMCoreApp","textDecoder"]}
|