This commit is contained in:
commit
bbfdd45cc3
4
Makefile
4
Makefile
|
@ -28,10 +28,10 @@ all: dump1090 view1090
|
|||
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
|
||||
|
||||
dump1090: dump1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o crc.o demod_2400.o stats.o cpr.o icao_filter.o track.o util.o convert.o $(COMPAT)
|
||||
$(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) $(LIBS_RTLSDR)
|
||||
$(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) $(LIBS_RTLSDR) -lncurses
|
||||
|
||||
view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o crc.o stats.o cpr.o icao_filter.o track.o util.o $(COMPAT)
|
||||
$(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS)
|
||||
$(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) -lncurses
|
||||
|
||||
faup1090: faup1090.o anet.o mode_ac.o mode_s.o net_io.o crc.o stats.o cpr.o icao_filter.o track.o util.o $(COMPAT)
|
||||
$(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS)
|
||||
|
|
99
convert.c
99
convert.c
|
@ -30,11 +30,13 @@ static void convert_uc8_nodc(void *iq_data,
|
|||
uint16_t *mag_data,
|
||||
unsigned nsamples,
|
||||
struct converter_state *state,
|
||||
double *out_power)
|
||||
double *out_mean_level,
|
||||
double *out_mean_power)
|
||||
{
|
||||
uint16_t *in = iq_data;
|
||||
unsigned i;
|
||||
uint64_t power = 0;
|
||||
uint64_t sum_level = 0;
|
||||
uint64_t sum_power = 0;
|
||||
uint16_t mag;
|
||||
|
||||
MODES_NOTUSED(state);
|
||||
|
@ -43,45 +45,58 @@ static void convert_uc8_nodc(void *iq_data,
|
|||
for (i = 0; i < (nsamples>>3); ++i) {
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
}
|
||||
|
||||
for (i = 0; i < (nsamples&7); ++i) {
|
||||
mag = Modes.maglut[*in++];
|
||||
*mag_data++ = mag;
|
||||
power += (uint32_t)mag * (uint32_t)mag;
|
||||
sum_level += mag;
|
||||
sum_power += (uint32_t)mag * (uint32_t)mag;
|
||||
}
|
||||
|
||||
if (out_power) {
|
||||
*out_power = power / 65535.0 / 65535.0;
|
||||
if (out_mean_level) {
|
||||
*out_mean_level = sum_level / 65536.0 / nsamples;
|
||||
}
|
||||
|
||||
if (out_mean_power) {
|
||||
*out_mean_power = sum_power / 65535.0 / 65535.0 / nsamples;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,10 +104,10 @@ static void convert_uc8_generic(void *iq_data,
|
|||
uint16_t *mag_data,
|
||||
unsigned nsamples,
|
||||
struct converter_state *state,
|
||||
double *out_power)
|
||||
double *out_mean_level,
|
||||
double *out_mean_power)
|
||||
{
|
||||
uint8_t *in = iq_data;
|
||||
float power = 0.0;
|
||||
float z1_I = state->z1_I;
|
||||
float z1_Q = state->z1_Q;
|
||||
const float dc_a = state->dc_a;
|
||||
|
@ -101,6 +116,7 @@ static void convert_uc8_generic(void *iq_data,
|
|||
unsigned i;
|
||||
uint8_t I, Q;
|
||||
float fI, fQ, magsq;
|
||||
float sum_level = 0, sum_power = 0;
|
||||
|
||||
for (i = 0; i < nsamples; ++i) {
|
||||
I = *in++;
|
||||
|
@ -118,25 +134,32 @@ static void convert_uc8_generic(void *iq_data,
|
|||
if (magsq > 1)
|
||||
magsq = 1;
|
||||
|
||||
power += magsq;
|
||||
*mag_data++ = (uint16_t)(sqrtf(magsq) * 65535.0 + 0.5);
|
||||
float mag = sqrtf(magsq);
|
||||
sum_power += magsq;
|
||||
sum_level += mag;
|
||||
*mag_data++ = (uint16_t)(mag * 65535.0 + 0.5);
|
||||
}
|
||||
|
||||
state->z1_I = z1_I;
|
||||
state->z1_Q = z1_Q;
|
||||
|
||||
if (out_power)
|
||||
*out_power = power;
|
||||
if (out_mean_level) {
|
||||
*out_mean_level = sum_level / nsamples;
|
||||
}
|
||||
|
||||
if (out_mean_power) {
|
||||
*out_mean_power = sum_power / nsamples;
|
||||
}
|
||||
}
|
||||
|
||||
static void convert_sc16_generic(void *iq_data,
|
||||
uint16_t *mag_data,
|
||||
unsigned nsamples,
|
||||
struct converter_state *state,
|
||||
double *out_power)
|
||||
double *out_mean_level,
|
||||
double *out_mean_power)
|
||||
{
|
||||
uint16_t *in = iq_data;
|
||||
float power = 0.0;
|
||||
float z1_I = state->z1_I;
|
||||
float z1_Q = state->z1_Q;
|
||||
const float dc_a = state->dc_a;
|
||||
|
@ -145,6 +168,7 @@ static void convert_sc16_generic(void *iq_data,
|
|||
unsigned i;
|
||||
int16_t I, Q;
|
||||
float fI, fQ, magsq;
|
||||
float sum_level = 0, sum_power = 0;
|
||||
|
||||
for (i = 0; i < nsamples; ++i) {
|
||||
I = (int16_t)le16toh(*in++);
|
||||
|
@ -162,25 +186,32 @@ static void convert_sc16_generic(void *iq_data,
|
|||
if (magsq > 1)
|
||||
magsq = 1;
|
||||
|
||||
power += magsq;
|
||||
*mag_data++ = (uint16_t)(sqrtf(magsq) * 65535.0 + 0.5);
|
||||
float mag = sqrtf(magsq);
|
||||
sum_power += magsq;
|
||||
sum_level += mag;
|
||||
*mag_data++ = (uint16_t)(mag * 65535.0 + 0.5);
|
||||
}
|
||||
|
||||
state->z1_I = z1_I;
|
||||
state->z1_Q = z1_Q;
|
||||
|
||||
if (out_power)
|
||||
*out_power = power;
|
||||
if (out_mean_level) {
|
||||
*out_mean_level = sum_level / nsamples;
|
||||
}
|
||||
|
||||
if (out_mean_power) {
|
||||
*out_mean_power = sum_power / nsamples;
|
||||
}
|
||||
}
|
||||
|
||||
static void convert_sc16q11_generic(void *iq_data,
|
||||
uint16_t *mag_data,
|
||||
unsigned nsamples,
|
||||
struct converter_state *state,
|
||||
double *out_power)
|
||||
double *out_mean_level,
|
||||
double *out_mean_power)
|
||||
{
|
||||
uint16_t *in = iq_data;
|
||||
float power = 0.0;
|
||||
float z1_I = state->z1_I;
|
||||
float z1_Q = state->z1_Q;
|
||||
const float dc_a = state->dc_a;
|
||||
|
@ -189,6 +220,7 @@ static void convert_sc16q11_generic(void *iq_data,
|
|||
unsigned i;
|
||||
int16_t I, Q;
|
||||
float fI, fQ, magsq;
|
||||
float sum_level = 0, sum_power = 0;
|
||||
|
||||
for (i = 0; i < nsamples; ++i) {
|
||||
I = (int16_t)le16toh(*in++);
|
||||
|
@ -206,15 +238,22 @@ static void convert_sc16q11_generic(void *iq_data,
|
|||
if (magsq > 1)
|
||||
magsq = 1;
|
||||
|
||||
power += magsq;
|
||||
float mag = sqrtf(magsq);
|
||||
sum_power += magsq;
|
||||
sum_level += mag;
|
||||
*mag_data++ = (uint16_t)(sqrtf(magsq) * 65535.0 + 0.5);
|
||||
}
|
||||
|
||||
state->z1_I = z1_I;
|
||||
state->z1_Q = z1_Q;
|
||||
|
||||
if (out_power)
|
||||
*out_power = power;
|
||||
if (out_mean_level) {
|
||||
*out_mean_level = sum_level / nsamples;
|
||||
}
|
||||
|
||||
if (out_mean_power) {
|
||||
*out_mean_power = sum_power / nsamples;
|
||||
}
|
||||
}
|
||||
|
||||
static struct {
|
||||
|
|
|
@ -27,7 +27,8 @@ typedef void (*iq_convert_fn)(void *iq_data,
|
|||
uint16_t *mag_data,
|
||||
unsigned nsamples,
|
||||
struct converter_state *state,
|
||||
double *out_power);
|
||||
double *out_mean_level,
|
||||
double *out_mean_power);
|
||||
|
||||
iq_convert_fn init_converter(input_format_t format,
|
||||
double sample_rate,
|
||||
|
|
|
@ -2,7 +2,7 @@ Source: dump1090-fa
|
|||
Section: embedded
|
||||
Priority: extra
|
||||
Maintainer: Oliver Jowett <oliver@mutability.co.uk>
|
||||
Build-Depends: debhelper(>=9), libusb-1.0-0-dev, pkg-config, cmake
|
||||
Build-Depends: debhelper(>=9), libusb-1.0-0-dev, pkg-config, cmake, libncurses5-dev
|
||||
Standards-Version: 3.9.3
|
||||
Homepage: https://github.com/mutability/dump1090
|
||||
Vcs-Git: https://github.com/mutability/dump1090.git
|
||||
|
|
39
debian/changelog
vendored
39
debian/changelog
vendored
|
@ -1,3 +1,42 @@
|
|||
dump1090-fa (3.3.0) stable; urgency=medium
|
||||
|
||||
* Improvements to the Mode A/C demodulator.
|
||||
* Automatically enable Mode A/C if a Beast command requesting it is received.
|
||||
(disable with --no-modeac-auto)
|
||||
* Process the radarcape position message, emit it from faup1090.
|
||||
* If view1090 is started with --modeac, request Mode A/C data from dump1090.
|
||||
* Remove the last traces of the internal webserver.
|
||||
* Updated the FlightAware aircraft data export.
|
||||
* Updated the default package-based maximum range to 360NM to match what
|
||||
piaware-support configured for sdcard installs.
|
||||
* Remove internal webserver code entirely (previously, it was just disabled
|
||||
at compile time).
|
||||
* Tweak the timing reported for Mode S and Mode A/C messages to match how
|
||||
the Beast/Radarcape does it. This affects the interval between Mode S
|
||||
and Mode A/C messages only; intervals between Mode S messages and other
|
||||
Mode S messages, or A/C and other A/C, are unchanged.
|
||||
|
||||
-- Oliver Jowett <oliver@mutability.co.uk> Sun, 15 Jan 2017 13:35:56 +0000
|
||||
|
||||
dump1090-fa (3.2.0) stable; urgency=medium
|
||||
|
||||
* Fix a stray extra comma in port 30003 output if only GNSS altitude
|
||||
was available
|
||||
* Track CPR encoding type directly rather than inferring it from airground;
|
||||
using airground meant some position messages that should be usable were
|
||||
not used
|
||||
* Mode A/C aircraft association tuning, allows dump1090 to handle much
|
||||
higher A/C rates without chewing tons of CPU
|
||||
* Map: Decrease the maximum marker size shown
|
||||
* Map: Show additional datasource information (TIS-B etc) in table mode
|
||||
* Map: Move the datablock so it doesn't overlap the zoom control
|
||||
* Map: Allow skipping the history load by adding a #nohistory fragment
|
||||
to the URL (e.g. for high latency connections)
|
||||
* view1090-fa: Use ncurses to reduce flicker on remote connections
|
||||
* view1090-fa: Fix knots -> km/h conversion in interactive mode
|
||||
|
||||
-- Oliver Jowett <oliver@mutability.co.uk> Tue, 25 Oct 2016 23:40:01 +0100
|
||||
|
||||
dump1090-fa (3.1.0) stable; urgency=medium
|
||||
|
||||
* Update to latest dump1090-mutability master
|
||||
|
|
2
debian/control
vendored
2
debian/control
vendored
|
@ -2,7 +2,7 @@ Source: dump1090-fa
|
|||
Section: embedded
|
||||
Priority: extra
|
||||
Maintainer: Oliver Jowett <oliver@mutability.co.uk>
|
||||
Build-Depends: debhelper(>=9), librtlsdr-dev, libusb-1.0-0-dev, pkg-config, dh-systemd
|
||||
Build-Depends: debhelper(>=9), librtlsdr-dev, libusb-1.0-0-dev, pkg-config, dh-systemd, libncurses5-dev
|
||||
Standards-Version: 3.9.3
|
||||
Homepage: https://github.com/mutability/dump1090
|
||||
Vcs-Git: https://github.com/mutability/dump1090.git
|
||||
|
|
2
debian/dump1090-fa.default
vendored
2
debian/dump1090-fa.default
vendored
|
@ -7,6 +7,6 @@
|
|||
# file will be lost.
|
||||
|
||||
RECEIVER_OPTIONS="--device-index 0 --gain -10 --ppm 0 --net-bo-port 30005"
|
||||
DECODER_OPTIONS="--max-range 300"
|
||||
DECODER_OPTIONS="--max-range 360"
|
||||
NET_OPTIONS="--net --net-heartbeat 60 --net-ro-size 1000 --net-ro-interval 1 --net-ri-port 0 --net-ro-port 30002 --net-sbs-port 30003 --net-bi-port 30004,30104 --net-bo-port 30005"
|
||||
JSON_OPTIONS="--json-location-accuracy 1"
|
||||
|
|
291
demod_2400.c
291
demod_2400.c
|
@ -19,6 +19,12 @@
|
|||
|
||||
#include "dump1090.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef MODEAC_DEBUG
|
||||
#include <gd.h>
|
||||
#endif
|
||||
|
||||
// 2.4MHz sampling rate version
|
||||
//
|
||||
// When sampling at 2.4MHz we have exactly 6 samples per 5 symbols.
|
||||
|
@ -298,7 +304,11 @@ void demodulate2400(struct mag_buf *mag)
|
|||
|
||||
// Set initial mm structure details
|
||||
mm = zeroMessage;
|
||||
mm.timestampMsg = mag->sampleTimestamp + (j*5) + bestphase;
|
||||
|
||||
// For consistency with how the Beast / Radarcape does it,
|
||||
// we report the timestamp at the end of bit 56 (even if
|
||||
// the frame is a 112-bit frame)
|
||||
mm.timestampMsg = mag->sampleTimestamp + j*5 + (8 + 56) * 12 + bestphase;
|
||||
|
||||
// compute message receive time as block-start-time + difference in the 12MHz clock
|
||||
mm.sysTimestampMsg = mag->sysTimestamp; // start of block time
|
||||
|
@ -360,12 +370,91 @@ void demodulate2400(struct mag_buf *mag)
|
|||
/* update noise power */
|
||||
{
|
||||
double sum_signal_power = sum_scaled_signal_power / 65535.0 / 65535.0;
|
||||
Modes.stats_current.noise_power_sum += (mag->total_power - sum_signal_power);
|
||||
Modes.stats_current.noise_power_sum += (mag->mean_power * mag->length - sum_signal_power);
|
||||
Modes.stats_current.noise_power_count += mag->length;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef MODEAC_DEBUG
|
||||
|
||||
static int yscale(unsigned signal)
|
||||
{
|
||||
return (int) (299 - 299.0 * signal / 65536.0);
|
||||
}
|
||||
|
||||
static void draw_modeac(uint16_t *m, unsigned modeac, unsigned f1_clock, unsigned noise_threshold, unsigned signal_threshold, unsigned bits, unsigned noisy_bits, unsigned uncertain_bits)
|
||||
{
|
||||
// 25 bits at 87*60MHz
|
||||
// use 1 pixel = 30MHz = 1087 pixels
|
||||
|
||||
gdImagePtr im = gdImageCreate(1088, 300);
|
||||
int red = gdImageColorAllocate(im, 255, 0, 0);
|
||||
int brightgreen = gdImageColorAllocate(im, 0, 255, 0);
|
||||
int darkgreen = gdImageColorAllocate(im, 0, 180, 0);
|
||||
int blue = gdImageColorAllocate(im, 0, 0, 255);
|
||||
int grey = gdImageColorAllocate(im, 200, 200, 200);
|
||||
int white = gdImageColorAllocate(im, 255, 255, 255);
|
||||
int black = gdImageColorAllocate(im, 0, 0, 0);
|
||||
|
||||
gdImageFilledRectangle(im, 0, 0, 1087, 299, white);
|
||||
|
||||
// draw samples
|
||||
for (unsigned pixel = 0; pixel < 1088; ++pixel) {
|
||||
int clock_offset = (pixel - 150) * 2;
|
||||
int bit = clock_offset / 87;
|
||||
int sample = (f1_clock + clock_offset) / 25;
|
||||
int bitoffset = clock_offset % 87;
|
||||
int color;
|
||||
|
||||
if (sample < 0)
|
||||
continue;
|
||||
|
||||
if (clock_offset < 0 || bit >= 20) {
|
||||
color = grey;
|
||||
} else if (bitoffset < 27 && (uncertain_bits & (1 << (19-bit)))) {
|
||||
color = red;
|
||||
} else if (bitoffset >= 27 && (noisy_bits & (1 << (19-bit)))) {
|
||||
color = red;
|
||||
} else if (bitoffset >= 27) {
|
||||
color = grey;
|
||||
} else if (bits & (1 << (19-bit))) {
|
||||
color = brightgreen;
|
||||
} else {
|
||||
color = darkgreen;
|
||||
}
|
||||
|
||||
gdImageLine(im, pixel, 299, pixel, yscale(m[sample]), color);
|
||||
}
|
||||
|
||||
// draw bit boundaries
|
||||
for (unsigned bit = 0; bit < 20; ++bit) {
|
||||
unsigned clock = 87 * bit;
|
||||
unsigned pixel0 = clock / 2 + 150;
|
||||
unsigned pixel1 = (clock + 27) / 2 + 150;
|
||||
|
||||
gdImageLine(im, pixel0, 0, pixel0, 299, (bit == 0 || bit == 14) ? black : grey);
|
||||
gdImageLine(im, pixel1, 0, pixel1, 299, (bit == 0 || bit == 14) ? black : grey);
|
||||
}
|
||||
|
||||
// draw thresholds
|
||||
gdImageLine(im, 0, yscale(noise_threshold), 1087, yscale(noise_threshold), blue);
|
||||
gdImageLine(im, 0, yscale(signal_threshold), 1087, yscale(signal_threshold), blue);
|
||||
|
||||
// save it
|
||||
|
||||
static int file_counter;
|
||||
char filename[PATH_MAX];
|
||||
sprintf(filename, "modeac_%04X_%04d.png", modeac, ++file_counter);
|
||||
fprintf(stderr, "writing %s\n", filename);
|
||||
|
||||
FILE *pngout = fopen(filename, "wb");
|
||||
gdImagePng(im, pngout);
|
||||
fclose(pngout);
|
||||
gdImageDestroy(im);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//////////
|
||||
////////// MODE A/C
|
||||
|
@ -389,6 +478,9 @@ void demodulate2400AC(struct mag_buf *mag)
|
|||
|
||||
memset(&mm, 0, sizeof(mm));
|
||||
|
||||
double noise_stddev = sqrt(mag->mean_power - mag->mean_level * mag->mean_level); // Var(X) = E[(X-E[X])^2] = E[X^2] - (E[X])^2
|
||||
unsigned noise_level = (unsigned) ((mag->mean_power + noise_stddev) * 65535 + 0.5);
|
||||
|
||||
for (f1_sample = 1; f1_sample < mlen; ++f1_sample) {
|
||||
// Mode A/C messages should match this bit sequence:
|
||||
|
||||
|
@ -414,10 +506,6 @@ void demodulate2400AC(struct mag_buf *mag)
|
|||
// 17 SPI
|
||||
// 18 0 quiet zone (X4)
|
||||
// 19 0 quiet zone (X5)
|
||||
// 20 0 quiet zone (X6)
|
||||
// 21 0 quiet zone (X7)
|
||||
// 22 0 quiet zone (X8)
|
||||
// 23 0 quiet zone (X9)
|
||||
|
||||
// Look for a F1 and F2 pair,
|
||||
// with F1 starting at offset f1_sample.
|
||||
|
@ -447,26 +535,26 @@ void demodulate2400AC(struct mag_buf *mag)
|
|||
if (m[f1_sample+2] > m[f1_sample+0] || m[f1_sample+2] > m[f1_sample+1])
|
||||
continue; // quiet part of bit wasn't sufficiently quiet
|
||||
|
||||
unsigned f1_noise = (m[f1_sample-1] + m[f1_sample+2]) / 2;
|
||||
unsigned f1_signal = (m[f1_sample+0] + m[f1_sample+1]) / 2;
|
||||
unsigned f1_level = (m[f1_sample+0] + m[f1_sample+1]) / 2;
|
||||
|
||||
if (f1_noise * 4 > f1_signal) {
|
||||
// require 12dB SNR
|
||||
if (noise_level * 2 > f1_level) {
|
||||
// require 6dB above noise
|
||||
continue;
|
||||
}
|
||||
|
||||
// estimate initial clock phase based on the amount of power
|
||||
// that ended up in the second sample
|
||||
unsigned f1_clock = 25 * f1_sample;
|
||||
if (m[f1_sample+1] > f1_noise) {
|
||||
f1_clock += 25 * (m[f1_sample+1] - f1_noise) / (2*(f1_signal - f1_noise));
|
||||
}
|
||||
|
||||
float f1a_power = (float)m[f1_sample] * m[f1_sample];
|
||||
float f1b_power = (float)m[f1_sample+1] * m[f1_sample+1];
|
||||
float fraction = f1b_power / (f1a_power + f1b_power);
|
||||
unsigned f1_clock = (unsigned) (25 * (f1_sample + fraction * fraction) + 0.5);
|
||||
|
||||
// same again for F2
|
||||
// F2 is 20.3us / 14 bit periods after F1
|
||||
|
||||
unsigned f2_clock = f1_clock + (87 * 14);
|
||||
unsigned f2_sample = f2_clock / 25;
|
||||
assert(f2_sample < mlen + Modes.trailing_samples);
|
||||
|
||||
if (!(m[f2_sample-1] < m[f2_sample+0]))
|
||||
continue;
|
||||
|
@ -474,179 +562,90 @@ void demodulate2400AC(struct mag_buf *mag)
|
|||
if (m[f2_sample+2] > m[f2_sample+0] || m[f2_sample+2] > m[f2_sample+1])
|
||||
continue; // quiet part of bit wasn't sufficiently quiet
|
||||
|
||||
unsigned f2_noise = (m[f2_sample-1] + m[f2_sample+2]) / 2;
|
||||
unsigned f2_signal = (m[f2_sample+0] + m[f2_sample+1]) / 2;
|
||||
unsigned f2_level = (m[f2_sample+0] + m[f2_sample+1]) / 2;
|
||||
|
||||
if (f2_noise * 4 > f2_signal) {
|
||||
// require 12dB SNR
|
||||
if (noise_level * 2 > f2_level) {
|
||||
// require 6dB above noise
|
||||
continue;
|
||||
}
|
||||
|
||||
unsigned f1f2_signal = (f1_signal + f2_signal) / 2;
|
||||
unsigned f1f2_level = (f1_level > f2_level ? f1_level : f2_level);
|
||||
|
||||
// look at X1, X2, X3 which should be quiet
|
||||
// (sample 0 may have part of the previous bit, but
|
||||
// it always covers the quiet part of it)
|
||||
unsigned x1_clock = f1_clock + (87 * 7);
|
||||
unsigned x1_sample = x1_clock / 25;
|
||||
unsigned x1_noise = (m[x1_sample + 0] + m[x1_sample + 1] + m[x1_sample + 2]) / 3;
|
||||
if (x1_noise * 4 >= f1f2_signal)
|
||||
continue;
|
||||
|
||||
unsigned x2_clock = f1_clock + (87 * 15);
|
||||
unsigned x2_sample = x2_clock / 25;
|
||||
unsigned x2_noise = (m[x2_sample + 0] + m[x2_sample + 1] + m[x2_sample + 2]) / 3;
|
||||
if (x2_noise * 4 >= f1f2_signal)
|
||||
continue;
|
||||
|
||||
unsigned x3_clock = f1_clock + (87 * 16);
|
||||
unsigned x3_sample = x3_clock / 25;
|
||||
unsigned x3_noise = (m[x3_sample + 0] + m[x3_sample + 1] + m[x3_sample + 2]) / 3;
|
||||
if (x3_noise * 4 >= f1f2_signal)
|
||||
continue;
|
||||
|
||||
unsigned x1x2x3_noise = (x1_noise + x2_noise + x3_noise) / 3;
|
||||
if (x1x2x3_noise * 4 >= f1f2_signal) // require 12dB separation
|
||||
continue;
|
||||
|
||||
// ----- F1/F2 average signal
|
||||
// ^
|
||||
// | at least 3dB
|
||||
// v
|
||||
// ----- minimum signal level we accept as "on"
|
||||
// ^
|
||||
// | 3dB
|
||||
// v
|
||||
// ---- midpoint between F1/F2 and X1/X2/X3
|
||||
// ^
|
||||
// | 3dB
|
||||
// v
|
||||
// ----- maximum signal level we accept as "off"
|
||||
// ^
|
||||
// | at least 3dB
|
||||
// v
|
||||
// ----- X1/X2/X3 average noise
|
||||
|
||||
float midpoint = sqrtf(x1x2x3_noise * f1f2_signal); // so that signal/midpoint == midpoint/noise
|
||||
unsigned quiet_threshold = (unsigned) midpoint;
|
||||
unsigned noise_threshold = (unsigned) (midpoint * 0.707107 + 0.5); // -3dB from midpoint
|
||||
unsigned signal_threshold = (unsigned) (midpoint * 1.414214 + 0.5); // +3dB from midpoint
|
||||
|
||||
#if 0
|
||||
fprintf(stderr, "f1f2 %u x1x2x3 %u midpoint %.0f noise_threshold %u signal_threshold %u\n",
|
||||
f1f2_signal, x1x2x3_noise, midpoint, noise_threshold, signal_threshold);
|
||||
|
||||
fprintf(stderr, "f1 %u f2 %u x1 %u x2 %u x3 %u\n",
|
||||
f1_signal, f2_signal, x1_noise, x2_noise, x3_noise);
|
||||
#endif
|
||||
|
||||
// recheck F/X bits just in case
|
||||
if (f1_signal < signal_threshold)
|
||||
continue;
|
||||
if (f2_signal < signal_threshold)
|
||||
continue;
|
||||
if (x1_noise > noise_threshold)
|
||||
continue;
|
||||
if (x2_noise > noise_threshold)
|
||||
continue;
|
||||
if (x3_noise > noise_threshold)
|
||||
continue;
|
||||
float midpoint = sqrtf(noise_level * f1f2_level); // geometric mean of the two levels
|
||||
unsigned signal_threshold = (unsigned) (midpoint * M_SQRT2 + 0.5); // +3dB
|
||||
unsigned noise_threshold = (unsigned) (midpoint / M_SQRT2 + 0.5); // -3dB
|
||||
|
||||
// Looks like a real signal. Demodulate all the bits.
|
||||
unsigned uncertain_bits = 0;
|
||||
unsigned noisy_bits = 0;
|
||||
unsigned bits = 0;
|
||||
unsigned bit;
|
||||
unsigned clock;
|
||||
for (bit = 0, clock = f1_clock; bit < 24; ++bit, clock += 87) {
|
||||
for (bit = 0, clock = f1_clock; bit < 20; ++bit, clock += 87) {
|
||||
unsigned sample = clock / 25;
|
||||
|
||||
bits <<= 1;
|
||||
noisy_bits <<= 1;
|
||||
uncertain_bits <<= 1;
|
||||
|
||||
// check for excessive noise in the quiet period
|
||||
if (m[sample+2] >= quiet_threshold) {
|
||||
//fprintf(stderr, "bit %u was not quiet (%u > %u)\n", bit, m[sample+2], quiet_threshold);
|
||||
if (m[sample+2] >= signal_threshold) {
|
||||
noisy_bits |= 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
// decide if this bit is on or off
|
||||
unsigned bit_signal = (m[sample+0] + m[sample+1]) / 2;
|
||||
if (bit_signal >= signal_threshold) {
|
||||
if (m[sample+0] >= signal_threshold || m[sample+1] >= signal_threshold) {
|
||||
bits |= 1;
|
||||
} else if (bit_signal > noise_threshold) {
|
||||
} else if (m[sample+0] > noise_threshold && m[sample+1] > noise_threshold) {
|
||||
/* not certain about this bit */
|
||||
//fprintf(stderr, "bit %u was uncertain (%u < %u < %u)\n", bit, noise_threshold, bit_signal, signal_threshold);
|
||||
noisy_bits |= 1;
|
||||
uncertain_bits |= 1;
|
||||
} else {
|
||||
/* this bit is off */
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
fprintf(stderr, "bits: %06X noisy: %06X\n", bits, noisy_bits);
|
||||
|
||||
unsigned j, sample;
|
||||
static const char *names[24] = {
|
||||
"F1", "C1", "A1", "C2",
|
||||
"A2", "C4", "A4", "X1",
|
||||
"B1", "D1", "B2", "D2",
|
||||
"B4", "D4", "F2", "X2",
|
||||
"X3", "SPI", "X4", "X5",
|
||||
"X6", "X7", "X8", "X9"
|
||||
};
|
||||
|
||||
fprintf(stderr, "-1 ... %6u\n", m[f1_sample-1]);
|
||||
for (j = 0; j < 24; ++j) {
|
||||
clock = f1_clock + 87 * j;
|
||||
sample = clock / 25;
|
||||
fprintf(stderr, "%2u %-3s %6u %6u %6u %6u ", j, names[j], m[sample+0], m[sample+1], m[sample+2], m[sample+3]);
|
||||
if ((m[sample+0] + m[sample+1])/2 >= signal_threshold) {
|
||||
fprintf(stderr, "ON\n");
|
||||
} else if ((m[sample+0] + m[sample+1])/2 <= noise_threshold) {
|
||||
fprintf(stderr, "OFF\n");
|
||||
} else {
|
||||
fprintf(stderr, "UNCERTAIN\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (noisy_bits) {
|
||||
/* XX debug */
|
||||
continue;
|
||||
}
|
||||
|
||||
// framing bits must be on
|
||||
if ((bits & 0x800200) != 0x800200) {
|
||||
if ((bits & 0x80020) != 0x80020) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// quiet bits must be off
|
||||
if ((bits & 0x0101BF) != 0) {
|
||||
if ((bits & 0x0101B) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (noisy_bits || uncertain_bits) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Convert to the form that we use elsewhere:
|
||||
// 00 A4 A2 A1 00 B4 B2 B1 SPI C4 C2 C1 00 D4 D2 D1
|
||||
unsigned modeac =
|
||||
((bits & 0x400000) ? 0x0010 : 0) | // C1
|
||||
((bits & 0x200000) ? 0x1000 : 0) | // A1
|
||||
((bits & 0x100000) ? 0x0020 : 0) | // C2
|
||||
((bits & 0x080000) ? 0x2000 : 0) | // A2
|
||||
((bits & 0x040000) ? 0x0040 : 0) | // C4
|
||||
((bits & 0x020000) ? 0x4000 : 0) | // A4
|
||||
((bits & 0x008000) ? 0x0100 : 0) | // B1
|
||||
((bits & 0x004000) ? 0x0001 : 0) | // D1
|
||||
((bits & 0x002000) ? 0x0200 : 0) | // B2
|
||||
((bits & 0x001000) ? 0x0002 : 0) | // D2
|
||||
((bits & 0x000800) ? 0x0400 : 0) | // B4
|
||||
((bits & 0x000400) ? 0x0004 : 0) | // D4
|
||||
((bits & 0x000040) ? 0x0080 : 0); // SPI
|
||||
((bits & 0x40000) ? 0x0010 : 0) | // C1
|
||||
((bits & 0x20000) ? 0x1000 : 0) | // A1
|
||||
((bits & 0x10000) ? 0x0020 : 0) | // C2
|
||||
((bits & 0x08000) ? 0x2000 : 0) | // A2
|
||||
((bits & 0x04000) ? 0x0040 : 0) | // C4
|
||||
((bits & 0x02000) ? 0x4000 : 0) | // A4
|
||||
((bits & 0x00800) ? 0x0100 : 0) | // B1
|
||||
((bits & 0x00400) ? 0x0001 : 0) | // D1
|
||||
((bits & 0x00200) ? 0x0200 : 0) | // B2
|
||||
((bits & 0x00100) ? 0x0002 : 0) | // D2
|
||||
((bits & 0x00080) ? 0x0400 : 0) | // B4
|
||||
((bits & 0x00040) ? 0x0004 : 0) | // D4
|
||||
((bits & 0x00004) ? 0x0080 : 0); // SPI
|
||||
|
||||
#ifdef MODEAC_DEBUG
|
||||
draw_modeac(m, modeac, f1_clock, noise_threshold, signal_threshold, bits, noisy_bits, uncertain_bits);
|
||||
#endif
|
||||
|
||||
// This message looks good, submit it
|
||||
|
||||
// For consistency with how the Beast / Radarcape does it,
|
||||
// we report the timestamp at the second framing pulse (F2)
|
||||
mm.timestampMsg = mag->sampleTimestamp + f2_clock / 5; // 60MHz -> 12MHz
|
||||
|
||||
// compute message receive time as block-start-time + difference in the 12MHz clock
|
||||
mm.timestampMsg = mag->sampleTimestamp + f1_clock / 5; // 60MHz -> 12MHz
|
||||
mm.sysTimestampMsg = mag->sysTimestamp; // start of block time
|
||||
mm.sysTimestampMsg.tv_nsec += receiveclock_ns_elapsed(mag->sampleTimestamp, mm.timestampMsg);
|
||||
normalize_timespec(&mm.sysTimestampMsg);
|
||||
|
@ -656,7 +655,7 @@ void demodulate2400AC(struct mag_buf *mag)
|
|||
// Pass data to the next layer
|
||||
useModesMessage(&mm);
|
||||
|
||||
f1_sample += (24*87 / 25);
|
||||
f1_sample += (20*87 / 25);
|
||||
Modes.stats_current.demod_modeac++;
|
||||
}
|
||||
}
|
||||
|
|
70
dump1090.c
70
dump1090.c
|
@ -95,27 +95,6 @@ static void sigtermHandler(int dummy) {
|
|||
Modes.exit = 1; // Signal to threads that we are done
|
||||
log_with_timestamp("Caught SIGTERM, shutting down..\n");
|
||||
}
|
||||
//
|
||||
// =============================== Terminal handling ========================
|
||||
//
|
||||
#ifndef _WIN32
|
||||
// Get the number of rows after the terminal changes size.
|
||||
int getTermRows() {
|
||||
struct winsize w;
|
||||
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
|
||||
return (w.ws_row);
|
||||
}
|
||||
|
||||
// Handle resizing terminal
|
||||
void sigWinchCallback() {
|
||||
signal(SIGWINCH, SIG_IGN);
|
||||
Modes.interactive_rows = getTermRows();
|
||||
interactiveShowData();
|
||||
signal(SIGWINCH, sigWinchCallback);
|
||||
}
|
||||
#else
|
||||
int getTermRows() { return MODES_INTERACTIVE_ROWS;}
|
||||
#endif
|
||||
|
||||
static void start_cpu_timing(struct timespec *start_time)
|
||||
{
|
||||
|
@ -132,6 +111,13 @@ static void end_cpu_timing(const struct timespec *start_time, struct timespec *a
|
|||
add_to->tv_nsec = add_to->tv_nsec % 1000000000L;
|
||||
}
|
||||
|
||||
void receiverPositionChanged(float lat, float lon, float alt)
|
||||
{
|
||||
log_with_timestamp("Autodetected receiver location: %.5f, %.5f at %.0fm AMSL", lat, lon, alt);
|
||||
writeJsonToFile("receiver.json", generateReceiverJson); // location changed
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// =============================== Initialization ===========================
|
||||
//
|
||||
|
@ -150,15 +136,12 @@ void modesInitConfig(void) {
|
|||
Modes.net_output_sbs_ports = strdup("30003");
|
||||
Modes.net_input_beast_ports = strdup("30004,30104");
|
||||
Modes.net_output_beast_ports = strdup("30005");
|
||||
#ifdef ENABLE_WEBSERVER
|
||||
Modes.net_http_ports = strdup("8080");
|
||||
#endif
|
||||
Modes.interactive_rows = getTermRows();
|
||||
Modes.interactive_display_ttl = MODES_INTERACTIVE_DISPLAY_TTL;
|
||||
Modes.html_dir = HTMLPATH;
|
||||
Modes.json_interval = 1000;
|
||||
Modes.json_location_accuracy = 1;
|
||||
Modes.maxRange = 1852 * 300; // 300NM default max range
|
||||
Modes.mode_ac_auto = 1;
|
||||
}
|
||||
//
|
||||
//=========================================================================
|
||||
|
@ -243,6 +226,8 @@ void modesInit(void) {
|
|||
// Prepare error correction tables
|
||||
modesChecksumInit(Modes.nfix_crc);
|
||||
icaoFilterInit();
|
||||
modeACInit();
|
||||
interactiveInit();
|
||||
|
||||
if (Modes.show_only)
|
||||
icaoFilterAdd(Modes.show_only);
|
||||
|
@ -266,9 +251,10 @@ void modesInit(void) {
|
|||
static void convert_samples(void *iq,
|
||||
uint16_t *mag,
|
||||
unsigned nsamples,
|
||||
double *power)
|
||||
double *mean_level,
|
||||
double *mean_power)
|
||||
{
|
||||
Modes.converter_function(iq, mag, nsamples, Modes.converter_state, power);
|
||||
Modes.converter_function(iq, mag, nsamples, Modes.converter_state, mean_level, mean_power);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -465,7 +451,7 @@ void rtlsdrCallback(unsigned char *buf, uint32_t len, void *ctx) {
|
|||
|
||||
// Convert the new data
|
||||
outbuf->length = slen;
|
||||
convert_samples(buf, &outbuf->data[Modes.trailing_samples], slen, &outbuf->total_power);
|
||||
convert_samples(buf, &outbuf->data[Modes.trailing_samples], slen, &outbuf->mean_level, &outbuf->mean_power);
|
||||
|
||||
// Push the new data to the demodulation thread
|
||||
pthread_mutex_lock(&Modes.data_mutex);
|
||||
|
@ -558,7 +544,7 @@ void readDataFromFile(void) {
|
|||
slen = outbuf->length = MODES_MAG_BUF_SAMPLES - toread/bytes_per_sample;
|
||||
|
||||
// Convert the new data
|
||||
convert_samples(readbuf, &outbuf->data[Modes.trailing_samples], slen, &outbuf->total_power);
|
||||
convert_samples(readbuf, &outbuf->data[Modes.trailing_samples], slen, &outbuf->mean_level, &outbuf->mean_power);
|
||||
|
||||
if (Modes.throttle) {
|
||||
// Wait until we are allowed to release this buffer to the main thread
|
||||
|
@ -674,17 +660,13 @@ void showHelp(void) {
|
|||
"--iformat <format> Sample format for --ifile: UC8 (default), SC16, or SC16Q11\n"
|
||||
"--throttle When reading from a file, play back in realtime, not at max speed\n"
|
||||
"--interactive Interactive mode refreshing data on screen. Implies --throttle\n"
|
||||
"--interactive-rows <num> Max number of rows in interactive mode (default: 15)\n"
|
||||
"--interactive-ttl <sec> Remove from list if idle for <sec> (default: 60)\n"
|
||||
"--interactive-rtl1090 Display flight table in RTL1090 format\n"
|
||||
"--raw Show only messages hex values\n"
|
||||
"--net Enable networking\n"
|
||||
"--modeac Enable decoding of SSR Modes 3/A & 3/C\n"
|
||||
"--no-modeac-auto Don't enable Mode A/C if requested by a Beast connection\n"
|
||||
"--net-only Enable just networking, no RTL device or file used\n"
|
||||
"--net-bind-address <ip> IP address to bind to (default: Any; Use 127.0.0.1 for private)\n"
|
||||
#ifdef ENABLE_WEBSERVER
|
||||
"--net-http-port <ports> HTTP server ports (default: 8080)\n"
|
||||
#endif
|
||||
"--net-ri-port <ports> TCP raw input listen ports (default: 30001)\n"
|
||||
"--net-ro-port <ports> TCP raw output listen ports (default: 30002)\n"
|
||||
"--net-sbs-port <ports> TCP BaseStation output listen ports (default: 30003)\n"
|
||||
|
@ -968,6 +950,9 @@ int main(int argc, char **argv) {
|
|||
Modes.net = 1;
|
||||
} else if (!strcmp(argv[j],"--modeac")) {
|
||||
Modes.mode_ac = 1;
|
||||
Modes.mode_ac_auto = 0;
|
||||
} else if (!strcmp(argv[j],"--no-modeac-auto")) {
|
||||
Modes.mode_ac_auto = 0;
|
||||
} else if (!strcmp(argv[j],"--net-beast")) {
|
||||
fprintf(stderr, "--net-beast ignored, use --net-bo-port to control where Beast output is generated\n");
|
||||
} else if (!strcmp(argv[j],"--net-only")) {
|
||||
|
@ -997,14 +982,9 @@ int main(int argc, char **argv) {
|
|||
free(Modes.net_bind_address);
|
||||
Modes.net_bind_address = strdup(argv[++j]);
|
||||
} else if (!strcmp(argv[j],"--net-http-port") && more) {
|
||||
#ifdef ENABLE_WEBSERVER
|
||||
free(Modes.net_http_ports);
|
||||
Modes.net_http_ports = strdup(argv[++j]);
|
||||
#else
|
||||
if (strcmp(argv[++j], "0")) {
|
||||
fprintf(stderr, "warning: --net-http-port not supported in this build, option ignored.\n");
|
||||
}
|
||||
#endif
|
||||
} else if (!strcmp(argv[j],"--net-sbs-port") && more) {
|
||||
free(Modes.net_output_sbs_ports);
|
||||
Modes.net_output_sbs_ports = strdup(argv[++j]);
|
||||
|
@ -1030,8 +1010,6 @@ int main(int argc, char **argv) {
|
|||
Modes.interactive = Modes.throttle = 1;
|
||||
} else if (!strcmp(argv[j],"--throttle")) {
|
||||
Modes.throttle = 1;
|
||||
} else if (!strcmp(argv[j],"--interactive-rows") && more) {
|
||||
Modes.interactive_rows = atoi(argv[++j]);
|
||||
} else if (!strcmp(argv[j],"--interactive-ttl") && more) {
|
||||
Modes.interactive_display_ttl = (uint64_t)(1000 * atof(argv[++j]));
|
||||
} else if (!strcmp(argv[j],"--lat") && more) {
|
||||
|
@ -1079,9 +1057,6 @@ int main(int argc, char **argv) {
|
|||
Modes.show_only = (uint32_t) strtoul(argv[++j], NULL, 16);
|
||||
} else if (!strcmp(argv[j],"--mlat")) {
|
||||
Modes.mlat = 1;
|
||||
} else if (!strcmp(argv[j],"--interactive-rtl1090")) {
|
||||
Modes.interactive = 1;
|
||||
Modes.interactive_rtl1090 = 1;
|
||||
} else if (!strcmp(argv[j],"--oversample")) {
|
||||
// Ignored
|
||||
} else if (!strcmp(argv[j], "--html-dir") && more) {
|
||||
|
@ -1110,11 +1085,6 @@ int main(int argc, char **argv) {
|
|||
if (!Modes.quiet) {showCopyright();}
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
// Setup for SIGWINCH for handling lines
|
||||
if (Modes.interactive) {signal(SIGWINCH, sigWinchCallback);}
|
||||
#endif
|
||||
|
||||
// Initialization
|
||||
log_with_timestamp("%s %s starting up.", MODES_DUMP1090_VARIANT, MODES_DUMP1090_VERSION);
|
||||
modesInit();
|
||||
|
@ -1251,6 +1221,8 @@ int main(int argc, char **argv) {
|
|||
pthread_mutex_destroy(&Modes.data_mutex);
|
||||
}
|
||||
|
||||
interactiveCleanup();
|
||||
|
||||
// If --stats were given, print statistics
|
||||
if (Modes.stats) {
|
||||
display_total_stats();
|
||||
|
|
33
dump1090.h
33
dump1090.h
|
@ -105,12 +105,6 @@ typedef struct rtlsdr_dev rtlsdr_dev_t;
|
|||
#define MODEAC_MSG_SAMPLES (25 * 2) // include up to the SPI bit
|
||||
#define MODEAC_MSG_BYTES 2
|
||||
#define MODEAC_MSG_SQUELCH_LEVEL 0x07FF // Average signal strength limit
|
||||
#define MODEAC_MSG_FLAG (1<<0)
|
||||
#define MODEAC_MSG_MODES_HIT (1<<1)
|
||||
#define MODEAC_MSG_MODEA_HIT (1<<2)
|
||||
#define MODEAC_MSG_MODEC_HIT (1<<3)
|
||||
#define MODEAC_MSG_MODEA_ONLY (1<<4)
|
||||
#define MODEAC_MSG_MODEC_OLD (1<<5)
|
||||
|
||||
#define MODES_PREAMBLE_US 8 // microseconds = bits
|
||||
#define MODES_PREAMBLE_SAMPLES (MODES_PREAMBLE_US * 2)
|
||||
|
@ -142,6 +136,7 @@ typedef struct rtlsdr_dev rtlsdr_dev_t;
|
|||
/* Where did a bit of data arrive from? In order of increasing priority */
|
||||
typedef enum {
|
||||
SOURCE_INVALID, /* data is not valid */
|
||||
SOURCE_MODE_AC, /* A/C message */
|
||||
SOURCE_MLAT, /* derived from mlat */
|
||||
SOURCE_MODE_S, /* data from a Mode S message, no full CRC */
|
||||
SOURCE_MODE_S_CHECKED, /* data from a Mode S message with full CRC */
|
||||
|
@ -163,6 +158,8 @@ typedef enum {
|
|||
ADDR_TISB_TRACKFILE, /* TIS-B, Mode A code + track file number */
|
||||
ADDR_TISB_OTHER, /* TIS-B, other address format */
|
||||
|
||||
ADDR_MODE_A, /* Mode A */
|
||||
|
||||
ADDR_UNKNOWN /* unknown address format */
|
||||
} addrtype_t;
|
||||
|
||||
|
@ -198,6 +195,10 @@ typedef enum {
|
|||
SIL_PER_SAMPLE, SIL_PER_HOUR
|
||||
} sil_type_t;
|
||||
|
||||
typedef enum {
|
||||
CPR_SURFACE, CPR_AIRBORNE, CPR_COARSE
|
||||
} cpr_type_t;
|
||||
|
||||
#define MODES_NON_ICAO_ADDRESS (1<<24) // Set on addresses to indicate they are not ICAO addresses
|
||||
|
||||
#define MODES_DEBUG_DEMOD (1<<0)
|
||||
|
@ -213,7 +214,6 @@ typedef enum {
|
|||
#define MODES_DEBUG_NOPREAMBLE_LEVEL 25
|
||||
|
||||
#define MODES_INTERACTIVE_REFRESH_TIME 250 // Milliseconds
|
||||
#define MODES_INTERACTIVE_ROWS 22 // Rows on screen
|
||||
#define MODES_INTERACTIVE_DISPLAY_TTL 60000 // Delete from display after 60 seconds
|
||||
|
||||
#define MODES_NET_HEARTBEAT_INTERVAL 60000 // milliseconds
|
||||
|
@ -255,7 +255,8 @@ struct mag_buf {
|
|||
uint64_t sampleTimestamp; // Clock timestamp of the start of this block, 12MHz clock
|
||||
struct timespec sysTimestamp; // Estimated system time at start of block
|
||||
uint32_t dropped; // Number of dropped samples preceding this buffer
|
||||
double total_power; // Sum of per-sample input power (in the range [0.0,1.0] per sample), or 0 if not measured
|
||||
double mean_level; // Mean of normalized (0..1) signal level
|
||||
double mean_power; // Mean of normalized (0..1) power level
|
||||
};
|
||||
|
||||
// Program global state
|
||||
|
@ -312,6 +313,7 @@ struct { // Internal state
|
|||
int check_crc; // Only display messages with good CRC
|
||||
int raw; // Raw output format
|
||||
int mode_ac; // Enable decoding of SSR Modes A & C
|
||||
int mode_ac_auto; // allow toggling of A/C by Beast commands
|
||||
int debug; // Debugging mode
|
||||
int net; // Enable networking
|
||||
int net_only; // Enable just networking
|
||||
|
@ -323,9 +325,6 @@ struct { // Internal state
|
|||
char *net_output_sbs_ports; // List of SBS output TCP ports
|
||||
char *net_input_beast_ports; // List of Beast input TCP ports
|
||||
char *net_output_beast_ports; // List of Beast output TCP ports
|
||||
#ifdef ENABLE_WEBSERVER
|
||||
char *net_http_ports; // List of HTTP ports
|
||||
#endif
|
||||
char *net_bind_address; // Bind address
|
||||
int net_sndbuf_size; // TCP output buffer size (64Kb * 2^n)
|
||||
int net_verbatim; // if true, send the original message, not the CRC-corrected one
|
||||
|
@ -333,7 +332,6 @@ struct { // Internal state
|
|||
int quiet; // Suppress stdout
|
||||
uint32_t show_only; // Only show messages from this ICAO
|
||||
int interactive; // Interactive mode
|
||||
int interactive_rows; // Interactive mode: max number of rows
|
||||
uint64_t interactive_display_ttl;// Interactive mode: TTL display
|
||||
uint64_t stats; // Interval (millis) between stats dumps,
|
||||
int stats_range_histo; // Collect/show a range histogram?
|
||||
|
@ -341,7 +339,6 @@ struct { // Internal state
|
|||
int metric; // Use metric units
|
||||
int use_gnss; // Use GNSS altitudes with H suffix ("HAE", though it isn't always) when available
|
||||
int mlat; // Use Beast ascii format for raw data output, i.e. @...; iso *...;
|
||||
int interactive_rtl1090; // flight table in interactive mode is formatted like RTL1090
|
||||
char *json_dir; // Path to json base directory, or NULL not to write json.
|
||||
uint64_t json_interval; // Interval between rewriting the json aircraft file, in milliseconds; also the advertised map refresh interval
|
||||
char *html_dir; // Path to www base directory.
|
||||
|
@ -461,6 +458,7 @@ struct modesMessage {
|
|||
// valid if category_valid
|
||||
unsigned category; // A0 - D7 encoded as a single hex byte
|
||||
// valid if cpr_valid
|
||||
cpr_type_t cpr_type; // The encoding type used (surface, airborne, coarse TIS-B)
|
||||
unsigned cpr_lat; // Non decoded latitude.
|
||||
unsigned cpr_lon; // Non decoded longitude.
|
||||
unsigned cpr_nucp; // NUCp/NIC value implied by message type
|
||||
|
@ -547,7 +545,9 @@ extern "C" {
|
|||
//
|
||||
int detectModeA (uint16_t *m, struct modesMessage *mm);
|
||||
void decodeModeAMessage(struct modesMessage *mm, int ModeA);
|
||||
int ModeAToModeC (unsigned int ModeA);
|
||||
void modeACInit();
|
||||
int modeAToModeC (unsigned int modeA);
|
||||
unsigned modeCToModeA (int modeC);
|
||||
|
||||
//
|
||||
// Functions exported from mode_s.c
|
||||
|
@ -560,7 +560,12 @@ void useModesMessage (struct modesMessage *mm);
|
|||
//
|
||||
// Functions exported from interactive.c
|
||||
//
|
||||
void interactiveInit(void);
|
||||
void interactiveShowData(void);
|
||||
void interactiveCleanup(void);
|
||||
|
||||
// Provided by dump1090.c / view1090.c / faup1090.c
|
||||
void receiverPositionChanged(float lat, float lon, float alt);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
28
faup1090.c
28
faup1090.c
|
@ -51,6 +51,14 @@
|
|||
|
||||
#include <stdarg.h>
|
||||
|
||||
void receiverPositionChanged(float lat, float lon, float alt)
|
||||
{
|
||||
/* nothing */
|
||||
(void) lat;
|
||||
(void) lon;
|
||||
(void) alt;
|
||||
}
|
||||
|
||||
//
|
||||
// =============================== Initialization ===========================
|
||||
//
|
||||
|
@ -95,6 +103,7 @@ static void faupInit(void) {
|
|||
// Prepare error correction tables
|
||||
modesChecksumInit(1);
|
||||
icaoFilterInit();
|
||||
modeACInit();
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -109,7 +118,6 @@ static void showHelp(void) {
|
|||
"--net-bo-port <port> Port to connect for Beast data (default: 30005)\n"
|
||||
"--lat <latitude> Reference/receiver latitude for surface posn (opt)\n"
|
||||
"--lon <longitude> Reference/receiver longitude for surface posn (opt)\n"
|
||||
"--max-range <distance> Absolute maximum range for position decoding (in nm, default: 360)\n"
|
||||
"--stdout REQUIRED. Write results to stdout.\n"
|
||||
"--help Show this help\n"
|
||||
"\n",
|
||||
|
@ -130,22 +138,6 @@ static void backgroundTasks(void) {
|
|||
modesNetPeriodicWork();
|
||||
}
|
||||
|
||||
static void sendBeastSettings(struct client *c, const char *settings) {
|
||||
int len;
|
||||
char *buf, *p;
|
||||
|
||||
len = strlen(settings) * 3;
|
||||
buf = p = alloca(len);
|
||||
|
||||
while (*settings) {
|
||||
*p++ = 0x1a;
|
||||
*p++ = '1';
|
||||
*p++ = *settings++;
|
||||
}
|
||||
|
||||
anetWrite(c->fd, buf, len);
|
||||
}
|
||||
|
||||
//
|
||||
//=========================================================================
|
||||
//
|
||||
|
@ -172,8 +164,6 @@ int main(int argc, char **argv) {
|
|||
Modes.fUserLat = atof(argv[++j]);
|
||||
} else if (!strcmp(argv[j],"--lon") && more) {
|
||||
Modes.fUserLon = atof(argv[++j]);
|
||||
} else if (!strcmp(argv[j],"--max-range") && more) {
|
||||
Modes.maxRange = atof(argv[++j]) * 1852.0; // convert to metres
|
||||
} else if (!strcmp(argv[j],"--help")) {
|
||||
showHelp();
|
||||
exit(0);
|
||||
|
|
107
interactive.c
107
interactive.c
|
@ -49,6 +49,8 @@
|
|||
|
||||
#include "dump1090.h"
|
||||
|
||||
#include <curses.h>
|
||||
|
||||
//
|
||||
//========================= Interactive mode ===============================
|
||||
|
||||
|
@ -64,7 +66,7 @@ static int convert_altitude(int ft)
|
|||
static int convert_speed(int kts)
|
||||
{
|
||||
if (Modes.metric)
|
||||
return (kts / 1.852);
|
||||
return (kts * 1.852);
|
||||
else
|
||||
return kts;
|
||||
}
|
||||
|
@ -74,11 +76,29 @@ static int convert_speed(int kts)
|
|||
//
|
||||
// Show the currently captured interactive data on screen.
|
||||
//
|
||||
|
||||
void interactiveInit() {
|
||||
if (!Modes.interactive)
|
||||
return;
|
||||
|
||||
initscr();
|
||||
clear();
|
||||
refresh();
|
||||
|
||||
mvprintw(0, 0, " Hex Mode Sqwk Flight Alt Spd Hdg Lat Long RSSI Msgs Ti");
|
||||
mvhline(1, 0, ACS_HLINE, 80);
|
||||
}
|
||||
|
||||
void interactiveCleanup(void) {
|
||||
if (Modes.interactive) {
|
||||
endwin();
|
||||
}
|
||||
}
|
||||
|
||||
void interactiveShowData(void) {
|
||||
struct aircraft *a = Modes.aircrafts;
|
||||
static uint64_t next_update;
|
||||
uint64_t now = mstime();
|
||||
int count = 0;
|
||||
char progress;
|
||||
char spinner[4] = "|/-\\";
|
||||
|
||||
|
@ -89,34 +109,18 @@ void interactiveShowData(void) {
|
|||
next_update = now + MODES_INTERACTIVE_REFRESH_TIME;
|
||||
|
||||
progress = spinner[(now/1000)%4];
|
||||
mvaddch(0, 79, progress);
|
||||
|
||||
#ifndef _WIN32
|
||||
printf("\x1b[H\x1b[2J"); // Clear the screen
|
||||
#else
|
||||
cls();
|
||||
#endif
|
||||
int rows = getmaxy(stdscr);
|
||||
int row = 2;
|
||||
|
||||
if (Modes.interactive_rtl1090 == 0) {
|
||||
printf (
|
||||
" Hex Mode Sqwk Flight Alt Spd Hdg Lat Long RSSI Msgs Ti%c\n", progress);
|
||||
} else {
|
||||
printf (
|
||||
" Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress);
|
||||
}
|
||||
printf(
|
||||
"-------------------------------------------------------------------------------\n");
|
||||
|
||||
while(a && (count < Modes.interactive_rows)) {
|
||||
while (a && row < rows) {
|
||||
|
||||
if ((now - a->seen) < Modes.interactive_display_ttl)
|
||||
{
|
||||
int msgs = a->messages;
|
||||
int flags = a->modeACflags;
|
||||
|
||||
if ( (((flags & (MODEAC_MSG_FLAG )) == 0 ) && (msgs > 1 ) )
|
||||
|| (((flags & (MODEAC_MSG_MODES_HIT | MODEAC_MSG_MODEA_ONLY)) == MODEAC_MSG_MODEA_ONLY) && (msgs > 4 ) )
|
||||
|| (((flags & (MODEAC_MSG_MODES_HIT | MODEAC_MSG_MODEC_OLD )) == 0 ) && (msgs > 127) )
|
||||
) {
|
||||
if (msgs > 1) {
|
||||
char strSquawk[5] = " ";
|
||||
char strFl[7] = " ";
|
||||
char strTt[5] = " ";
|
||||
|
@ -138,14 +142,6 @@ void interactiveShowData(void) {
|
|||
msgs = 99999;
|
||||
}
|
||||
|
||||
if (Modes.interactive_rtl1090) { // RTL1090 display mode
|
||||
if (trackDataValid(&a->altitude_valid)) {
|
||||
snprintf(strFl,6,"F%03d",((a->altitude+50)/100));
|
||||
}
|
||||
printf("%06x %-8s %-4s %-3s %-3s %4s %-6d %-2.0f\n",
|
||||
a->addr, a->callsign, strFl, strGs, strTt, strSquawk, msgs, (now - a->seen)/1000.0);
|
||||
|
||||
} else { // Dump1090 display mode
|
||||
char strMode[5] = " ";
|
||||
char strLat[8] = " ";
|
||||
char strLon[9] = " ";
|
||||
|
@ -153,13 +149,9 @@ void interactiveShowData(void) {
|
|||
double signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] +
|
||||
pSig[4] + pSig[5] + pSig[6] + pSig[7]) / 8.0;
|
||||
|
||||
if ((flags & MODEAC_MSG_FLAG) == 0) {
|
||||
strMode[0] = 'S';
|
||||
} else if (flags & MODEAC_MSG_MODEA_ONLY) {
|
||||
strMode[0] = 'A';
|
||||
}
|
||||
if (flags & MODEAC_MSG_MODEA_HIT) {strMode[2] = 'a';}
|
||||
if (flags & MODEAC_MSG_MODEC_HIT) {strMode[3] = 'c';}
|
||||
if (a->modeA_hit) {strMode[2] = 'a';}
|
||||
if (a->modeC_hit) {strMode[3] = 'c';}
|
||||
|
||||
if (trackDataValid(&a->position_valid)) {
|
||||
snprintf(strLat, 8,"%7.03f", a->lat);
|
||||
|
@ -174,16 +166,51 @@ void interactiveShowData(void) {
|
|||
snprintf(strFl, 7, "%5d ", convert_altitude(a->altitude));
|
||||
}
|
||||
|
||||
printf("%s%06X %-4s %-4s %-8s %6s %3s %3s %7s %8s %5.1f %5d %2.0f\n",
|
||||
mvprintw(row, 0, "%s%06X %-4s %-4s %-8s %6s %3s %3s %7s %8s %5.1f %5d %2.0f",
|
||||
(a->addr & MODES_NON_ICAO_ADDRESS) ? "~" : " ", (a->addr & 0xffffff),
|
||||
strMode, strSquawk, a->callsign, strFl, strGs, strTt,
|
||||
strLat, strLon, 10 * log10(signalAverage), msgs, (now - a->seen)/1000.0);
|
||||
}
|
||||
count++;
|
||||
++row;
|
||||
}
|
||||
}
|
||||
a = a->next;
|
||||
}
|
||||
|
||||
if (Modes.mode_ac) {
|
||||
for (unsigned i = 1; i < 4096 && row < rows; ++i) {
|
||||
if (modeAC_match[i] || modeAC_count[i] < 50 || modeAC_age[i] > 5)
|
||||
continue;
|
||||
|
||||
char strMode[5] = " A ";
|
||||
char strFl[7] = " ";
|
||||
unsigned modeA = indexToModeA(i);
|
||||
int modeC = modeAToModeC(modeA);
|
||||
if (modeC != INVALID_ALTITUDE) {
|
||||
strMode[3] = 'C';
|
||||
snprintf(strFl, 7, "%5d ", convert_altitude(modeC * 100));
|
||||
}
|
||||
|
||||
mvprintw(row, 0,
|
||||
"%7s %-4s %04x %-8s %6s %3s %3s %7s %8s %5s %5d %2d\n",
|
||||
"", /* address */
|
||||
strMode, /* mode */
|
||||
modeA, /* squawk */
|
||||
"", /* callsign */
|
||||
strFl, /* altitude */
|
||||
"", /* gs */
|
||||
"", /* heading */
|
||||
"", /* lat */
|
||||
"", /* lon */
|
||||
"", /* signal */
|
||||
modeAC_count[i], /* messages */
|
||||
modeAC_age[i]); /* age */
|
||||
++row;
|
||||
}
|
||||
}
|
||||
|
||||
move(row, 0);
|
||||
clrtobot();
|
||||
refresh();
|
||||
}
|
||||
|
||||
//
|
||||
|
|
50
mode_ac.c
50
mode_ac.c
|
@ -29,12 +29,56 @@
|
|||
//
|
||||
|
||||
#include "dump1090.h"
|
||||
#include <assert.h>
|
||||
//
|
||||
//=========================================================================
|
||||
//
|
||||
// Input format is : 00:A4:A2:A1:00:B4:B2:B1:00:C4:C2:C1:00:D4:D2:D1
|
||||
//
|
||||
int ModeAToModeC(unsigned int ModeA)
|
||||
|
||||
static int modeAToCTable[4096];
|
||||
static unsigned modeCToATable[4096];
|
||||
static int internalModeAToModeC(unsigned int ModeA);
|
||||
|
||||
void modeACInit()
|
||||
{
|
||||
for (unsigned i = 0; i < 4096; ++i) {
|
||||
unsigned modeA = indexToModeA(i);
|
||||
int modeC = internalModeAToModeC(modeA);
|
||||
modeAToCTable[i] = modeC;
|
||||
|
||||
modeC += 13;
|
||||
if (modeC >= 0 && modeC < 4096) {
|
||||
assert(modeCToATable[modeC] == 0);
|
||||
modeCToATable[modeC] = modeA;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Given a mode A value (hex-encoded, see above)
|
||||
// return the mode C value (signed multiple of 100s of feet)
|
||||
// or INVALID_ALITITUDE if not a valid mode C value
|
||||
int modeAToModeC(unsigned modeA)
|
||||
{
|
||||
unsigned i = modeAToIndex(modeA);
|
||||
if (i >= 4096)
|
||||
return INVALID_ALTITUDE;
|
||||
|
||||
return modeAToCTable[i];
|
||||
}
|
||||
|
||||
// Given a mode C value (signed multiple of 100s of feet)
|
||||
// return the mode A value, or 0 if not a valid mode C value
|
||||
unsigned modeCToModeA(int modeC)
|
||||
{
|
||||
modeC += 13;
|
||||
if (modeC < 0 || modeC >= 4096)
|
||||
return 0;
|
||||
|
||||
return modeCToATable[modeC];
|
||||
}
|
||||
|
||||
static int internalModeAToModeC(unsigned int ModeA)
|
||||
{
|
||||
unsigned int FiveHundreds = 0;
|
||||
unsigned int OneHundreds = 0;
|
||||
|
@ -78,6 +122,8 @@ int ModeAToModeC(unsigned int ModeA)
|
|||
//
|
||||
void decodeModeAMessage(struct modesMessage *mm, int ModeA)
|
||||
{
|
||||
mm->source = SOURCE_MODE_AC;
|
||||
mm->addrtype = ADDR_MODE_A;
|
||||
mm->msgtype = 32; // Valid Mode S DF's are DF-00 to DF-31.
|
||||
// so use 32 to indicate Mode A/C
|
||||
|
||||
|
@ -98,7 +144,7 @@ void decodeModeAMessage(struct modesMessage *mm, int ModeA)
|
|||
|
||||
// Decode an altitude if this looks like a possible mode C
|
||||
if (!mm->spi) {
|
||||
int modeC = ModeAToModeC(ModeA);
|
||||
int modeC = modeAToModeC(ModeA);
|
||||
if (modeC != INVALID_ALTITUDE) {
|
||||
mm->altitude = modeC * 100;
|
||||
mm->altitude_unit = UNIT_FEET;
|
||||
|
|
30
mode_s.c
30
mode_s.c
|
@ -134,7 +134,7 @@ static int decodeAC13Field(int AC13Field, altitude_unit_t *unit) {
|
|||
return ((n * 25) - 1000);
|
||||
} else {
|
||||
// N is an 11 bit Gillham coded altitude
|
||||
int n = ModeAToModeC(decodeID13Field(AC13Field));
|
||||
int n = modeAToModeC(decodeID13Field(AC13Field));
|
||||
if (n < -12) {
|
||||
return INVALID_ALTITUDE;
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ static int decodeAC12Field(int AC12Field, altitude_unit_t *unit) {
|
|||
// Make N a 13 bit Gillham coded altitude by inserting M=0 at bit 6
|
||||
int n = ((AC12Field & 0x0FC0) << 1) |
|
||||
(AC12Field & 0x003F);
|
||||
n = ModeAToModeC(decodeID13Field(n));
|
||||
n = modeAToModeC(decodeID13Field(n));
|
||||
if (n < -12) {
|
||||
return INVALID_ALTITUDE;
|
||||
}
|
||||
|
@ -903,6 +903,7 @@ static void decodeESSurfacePosition(struct modesMessage *mm, int check_imf)
|
|||
mm->cpr_odd = getbit(me, 22);
|
||||
mm->cpr_nucp = (14 - mm->metype);
|
||||
mm->cpr_valid = 1;
|
||||
mm->cpr_type = CPR_SURFACE;
|
||||
|
||||
unsigned movement = getbits(me, 6, 12);
|
||||
if (movement > 0 && movement < 125) {
|
||||
|
@ -948,6 +949,7 @@ static void decodeESAirbornePosition(struct modesMessage *mm, int check_imf)
|
|||
} else {
|
||||
// Otherwise, assume it's valid.
|
||||
mm->cpr_valid = 1;
|
||||
mm->cpr_type = CPR_AIRBORNE;
|
||||
mm->cpr_odd = getbit(me, 22);
|
||||
|
||||
if (mm->metype == 18 || mm->metype == 22)
|
||||
|
@ -1381,11 +1383,26 @@ static const char *addrtype_to_string(addrtype_t type) {
|
|||
return "ADS-R";
|
||||
case ADDR_ADSR_OTHER:
|
||||
return "ADS-R, other addressing scheme";
|
||||
case ADDR_MODE_A:
|
||||
return "Mode A";
|
||||
default:
|
||||
return "unknown addressing scheme";
|
||||
}
|
||||
}
|
||||
|
||||
static const char *cpr_type_to_string(cpr_type_t type) {
|
||||
switch (type) {
|
||||
case CPR_SURFACE:
|
||||
return "Surface";
|
||||
case CPR_AIRBORNE:
|
||||
return "Airborne";
|
||||
case CPR_COARSE:
|
||||
return "TIS-B Coarse";
|
||||
default:
|
||||
return "unknown CPR type";
|
||||
}
|
||||
}
|
||||
|
||||
static void print_hex_bytes(unsigned char *data, size_t len) {
|
||||
size_t i;
|
||||
for (i = 0; i < len; ++i) {
|
||||
|
@ -1676,12 +1693,11 @@ void displayModesMessage(struct modesMessage *mm) {
|
|||
mm->category);
|
||||
}
|
||||
|
||||
if (mm->msgtype == 17 || mm->msgtype == 18) {
|
||||
}
|
||||
|
||||
if (mm->cpr_valid) {
|
||||
printf(" CPR odd flag: %s\n"
|
||||
printf(" CPR type: %s\n"
|
||||
" CPR odd flag: %s\n"
|
||||
" CPR NUCp/NIC: %u\n",
|
||||
cpr_type_to_string(mm->cpr_type),
|
||||
mm->cpr_odd ? "odd" : "even",
|
||||
mm->cpr_nucp);
|
||||
|
||||
|
@ -1804,7 +1820,7 @@ void useModesMessage(struct modesMessage *mm) {
|
|||
// If this is the second message, and we
|
||||
// squelched the first message, then re-emit the
|
||||
// first message now.
|
||||
if (!Modes.net_verbatim && a->messages == 2) {
|
||||
if (!Modes.net_verbatim && a && a->messages == 2) {
|
||||
modesQueueOutput(&a->first_message, a);
|
||||
}
|
||||
modesQueueOutput(mm, a);
|
||||
|
|
588
net_io.c
588
net_io.c
|
@ -67,17 +67,18 @@
|
|||
// handled via non-blocking I/O and manually polling clients to see if
|
||||
// they have something new to share with us when reading is needed.
|
||||
|
||||
static int handleBeastCommand(struct client *c, char *p);
|
||||
static int decodeBinMessage(struct client *c, char *p);
|
||||
static int decodeHexMessage(struct client *c, char *hex);
|
||||
#ifdef ENABLE_WEBSERVER
|
||||
static int handleHTTPRequest(struct client *c, char *p);
|
||||
#endif
|
||||
|
||||
static void send_raw_heartbeat(struct net_service *service);
|
||||
static void send_beast_heartbeat(struct net_service *service);
|
||||
static void send_sbs_heartbeat(struct net_service *service);
|
||||
|
||||
static void writeFATSVEvent(struct modesMessage *mm, struct aircraft *a);
|
||||
static void writeFATSVPositionUpdate(float lat, float lon, float alt);
|
||||
|
||||
static void autoset_modeac();
|
||||
|
||||
//
|
||||
//=========================================================================
|
||||
|
@ -87,7 +88,7 @@ static void writeFATSVEvent(struct modesMessage *mm, struct aircraft *a);
|
|||
|
||||
// Init a service with the given read/write characteristics, return the new service.
|
||||
// Doesn't arrange for the service to listen or connect
|
||||
struct net_service *serviceInit(const char *descr, struct net_writer *writer, heartbeat_fn hb, const char *sep, read_fn handler)
|
||||
struct net_service *serviceInit(const char *descr, struct net_writer *writer, heartbeat_fn hb, read_mode_t mode, const char *sep, read_fn handler)
|
||||
{
|
||||
struct net_service *service;
|
||||
|
||||
|
@ -104,6 +105,7 @@ struct net_service *serviceInit(const char *descr, struct net_writer *writer, he
|
|||
service->connections = 0;
|
||||
service->writer = writer;
|
||||
service->read_sep = sep;
|
||||
service->read_mode = mode;
|
||||
service->read_handler = handler;
|
||||
|
||||
if (service->writer) {
|
||||
|
@ -144,6 +146,7 @@ struct client *createGenericClient(struct net_service *service, int fd)
|
|||
c->next = Modes.clients;
|
||||
c->fd = fd;
|
||||
c->buflen = 0;
|
||||
c->modeac_requested = 0;
|
||||
Modes.clients = c;
|
||||
|
||||
++service->connections;
|
||||
|
@ -231,12 +234,12 @@ void serviceListen(struct net_service *service, char *bind_addr, char *bind_port
|
|||
|
||||
struct net_service *makeBeastInputService(void)
|
||||
{
|
||||
return serviceInit("Beast TCP input", NULL, NULL, NULL, decodeBinMessage);
|
||||
return serviceInit("Beast TCP input", NULL, NULL, READ_MODE_BEAST, NULL, decodeBinMessage);
|
||||
}
|
||||
|
||||
struct net_service *makeFatsvOutputService(void)
|
||||
{
|
||||
return serviceInit("FATSV TCP output", &Modes.fatsv_out, NULL, NULL, NULL);
|
||||
return serviceInit("FATSV TCP output", &Modes.fatsv_out, NULL, READ_MODE_IGNORE, NULL, NULL);
|
||||
}
|
||||
|
||||
void modesInitNet(void) {
|
||||
|
@ -247,25 +250,20 @@ void modesInitNet(void) {
|
|||
Modes.services = NULL;
|
||||
|
||||
// set up listeners
|
||||
s = serviceInit("Raw TCP output", &Modes.raw_out, send_raw_heartbeat, NULL, NULL);
|
||||
s = serviceInit("Raw TCP output", &Modes.raw_out, send_raw_heartbeat, READ_MODE_IGNORE, NULL, NULL);
|
||||
serviceListen(s, Modes.net_bind_address, Modes.net_output_raw_ports);
|
||||
|
||||
s = serviceInit("Beast TCP output", &Modes.beast_out, send_beast_heartbeat, NULL, NULL);
|
||||
s = serviceInit("Beast TCP output", &Modes.beast_out, send_beast_heartbeat, READ_MODE_BEAST_COMMAND, NULL, handleBeastCommand);
|
||||
serviceListen(s, Modes.net_bind_address, Modes.net_output_beast_ports);
|
||||
|
||||
s = serviceInit("Basestation TCP output", &Modes.sbs_out, send_sbs_heartbeat, NULL, NULL);
|
||||
s = serviceInit("Basestation TCP output", &Modes.sbs_out, send_sbs_heartbeat, READ_MODE_IGNORE, NULL, NULL);
|
||||
serviceListen(s, Modes.net_bind_address, Modes.net_output_sbs_ports);
|
||||
|
||||
s = serviceInit("Raw TCP input", NULL, NULL, "\n", decodeHexMessage);
|
||||
s = serviceInit("Raw TCP input", NULL, NULL, READ_MODE_ASCII, "\n", decodeHexMessage);
|
||||
serviceListen(s, Modes.net_bind_address, Modes.net_input_raw_ports);
|
||||
|
||||
s = makeBeastInputService();
|
||||
serviceListen(s, Modes.net_bind_address, Modes.net_input_beast_ports);
|
||||
|
||||
#ifdef ENABLE_WEBSERVER
|
||||
s = serviceInit("HTTP server", NULL, NULL, "\r\n\r\n", handleHTTPRequest);
|
||||
serviceListen(s, Modes.net_bind_address, Modes.net_http_ports);
|
||||
#endif
|
||||
}
|
||||
//
|
||||
//=========================================================================
|
||||
|
@ -310,6 +308,9 @@ static void modesCloseClient(struct client *c) {
|
|||
// mark it as inactive and ready to be freed
|
||||
c->fd = -1;
|
||||
c->service = NULL;
|
||||
c->modeac_requested = 0;
|
||||
|
||||
autoset_modeac();
|
||||
}
|
||||
//
|
||||
//=========================================================================
|
||||
|
@ -594,7 +595,7 @@ static void modesSendSBSOutput(struct modesMessage *mm, struct aircraft *a) {
|
|||
} else if (trackDataValid(&a->gnss_delta_valid)) {
|
||||
p += sprintf(p, ",%d", mm->altitude - a->gnss_delta);
|
||||
} else {
|
||||
p += sprintf(p, ",,");
|
||||
p += sprintf(p, ",");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -710,7 +711,7 @@ static void send_sbs_heartbeat(struct net_service *service)
|
|||
void modesQueueOutput(struct modesMessage *mm, struct aircraft *a) {
|
||||
int is_mlat = (mm->source == SOURCE_MLAT);
|
||||
|
||||
if (!is_mlat && mm->correctedbits < 2) {
|
||||
if (a && !is_mlat && mm->correctedbits < 2) {
|
||||
// Don't ever forward 2-bit-corrected messages via SBS output.
|
||||
// Don't ever forward mlat messages via SBS output.
|
||||
modesSendSBSOutput(mm, a);
|
||||
|
@ -728,10 +729,119 @@ void modesQueueOutput(struct modesMessage *mm, struct aircraft *a) {
|
|||
modesSendBeastOutput(mm);
|
||||
}
|
||||
|
||||
if (!is_mlat) {
|
||||
if (a && !is_mlat) {
|
||||
writeFATSVEvent(mm, a);
|
||||
}
|
||||
}
|
||||
|
||||
// Decode a little-endian IEEE754 float (binary32)
|
||||
float ieee754_binary32_le_to_float(uint8_t *data)
|
||||
{
|
||||
double sign = (data[3] & 0x80) ? -1.0 : 1.0;
|
||||
int16_t raw_exponent = ((data[3] & 0x7f) << 1) | ((data[2] & 0x80) >> 7);
|
||||
uint32_t raw_significand = ((data[2] & 0x7f) << 16) | (data[1] << 8) | data[0];
|
||||
|
||||
if (raw_exponent == 0) {
|
||||
if (raw_significand == 0) {
|
||||
/* -0 is treated like +0 */
|
||||
return 0;
|
||||
} else {
|
||||
/* denormal */
|
||||
return ldexp(sign * raw_significand, -126 - 23);
|
||||
}
|
||||
}
|
||||
|
||||
if (raw_exponent == 255) {
|
||||
if (raw_significand == 0) {
|
||||
/* +/-infinity */
|
||||
return sign < 0 ? -INFINITY : INFINITY;
|
||||
} else {
|
||||
/* NaN */
|
||||
#ifdef NAN
|
||||
return NAN;
|
||||
#else
|
||||
return 0.0f;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* normalized value */
|
||||
return ldexp(sign * ((1 << 23) | raw_significand), raw_exponent - 127 - 23);
|
||||
}
|
||||
|
||||
static void handle_radarcape_position(float lat, float lon, float alt)
|
||||
{
|
||||
if (!isfinite(lat) || lat < -90 || lat > 90 || !isfinite(lon) || lon < -180 || lon > 180 || !isfinite(alt))
|
||||
return;
|
||||
|
||||
writeFATSVPositionUpdate(lat, lon, alt);
|
||||
|
||||
if (!(Modes.bUserFlags & MODES_USER_LATLON_VALID)) {
|
||||
Modes.fUserLat = lat;
|
||||
Modes.fUserLon = lon;
|
||||
Modes.bUserFlags |= MODES_USER_LATLON_VALID;
|
||||
receiverPositionChanged(lat, lon, alt);
|
||||
}
|
||||
}
|
||||
|
||||
// recompute global Mode A/C setting
|
||||
static void autoset_modeac() {
|
||||
struct client *c;
|
||||
|
||||
if (!Modes.mode_ac_auto)
|
||||
return;
|
||||
|
||||
Modes.mode_ac = 0;
|
||||
for (c = Modes.clients; c; c = c->next) {
|
||||
if (c->modeac_requested) {
|
||||
Modes.mode_ac = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Send some Beast settings commands to a client
|
||||
void sendBeastSettings(struct client *c, const char *settings)
|
||||
{
|
||||
int len;
|
||||
char *buf, *p;
|
||||
|
||||
len = strlen(settings) * 3;
|
||||
buf = p = alloca(len);
|
||||
|
||||
while (*settings) {
|
||||
*p++ = 0x1a;
|
||||
*p++ = '1';
|
||||
*p++ = *settings++;
|
||||
}
|
||||
|
||||
anetWrite(c->fd, buf, len);
|
||||
}
|
||||
|
||||
//
|
||||
// Handle a Beast command message.
|
||||
// Currently, we just look for the Mode A/C command message
|
||||
// and ignore everything else.
|
||||
//
|
||||
static int handleBeastCommand(struct client *c, char *p) {
|
||||
if (p[0] != '1') {
|
||||
// huh?
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (p[1]) {
|
||||
case 'j':
|
||||
c->modeac_requested = 0;
|
||||
break;
|
||||
case 'J':
|
||||
c->modeac_requested = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
autoset_modeac();
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
//=========================================================================
|
||||
//
|
||||
|
@ -749,21 +859,37 @@ static int decodeBinMessage(struct client *c, char *p) {
|
|||
int msgLen = 0;
|
||||
int j;
|
||||
char ch;
|
||||
unsigned char msg[MODES_LONG_MSG_BYTES];
|
||||
unsigned char msg[MODES_LONG_MSG_BYTES + 7];
|
||||
static struct modesMessage zeroMessage;
|
||||
struct modesMessage mm;
|
||||
MODES_NOTUSED(c);
|
||||
memset(&mm, 0, sizeof(mm));
|
||||
|
||||
ch = *p++; /// Get the message type
|
||||
if (0x1A == ch) {p++;}
|
||||
|
||||
if ((ch == '1') && (Modes.mode_ac)) { // skip ModeA/C unless user enables --modes-ac
|
||||
if (ch == '1' && Modes.mode_ac) {
|
||||
msgLen = MODEAC_MSG_BYTES;
|
||||
} else if (ch == '2') {
|
||||
msgLen = MODES_SHORT_MSG_BYTES;
|
||||
} else if (ch == '3') {
|
||||
msgLen = MODES_LONG_MSG_BYTES;
|
||||
} else if (ch == '5') {
|
||||
// Special case for Radarcape position messages.
|
||||
float lat, lon, alt;
|
||||
|
||||
for (j = 0; j < 21; j++) { // and the data
|
||||
msg[j] = ch = *p++;
|
||||
if (0x1A == ch) {p++;}
|
||||
}
|
||||
|
||||
lat = ieee754_binary32_le_to_float(msg + 4);
|
||||
lon = ieee754_binary32_le_to_float(msg + 8);
|
||||
alt = ieee754_binary32_le_to_float(msg + 12);
|
||||
|
||||
handle_radarcape_position(lat, lon, alt);
|
||||
} else {
|
||||
// Ignore this.
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (msgLen) {
|
||||
|
@ -1027,10 +1153,6 @@ char *generateAircraftJson(const char *url_path, int *len) {
|
|||
Modes.stats_current.messages_total + Modes.stats_alltime.messages_total);
|
||||
|
||||
for (a = Modes.aircrafts; a; a = a->next) {
|
||||
if (a->modeACflags & MODEAC_MSG_FLAG) { // skip any fudged ICAO records Mode A/C
|
||||
continue;
|
||||
}
|
||||
|
||||
if (a->messages < 2) { // basic filter for bad decodes
|
||||
continue;
|
||||
}
|
||||
|
@ -1149,10 +1271,6 @@ static char * appendStatsJson(char *p,
|
|||
}
|
||||
|
||||
p += snprintf(p, end-p, "]}");
|
||||
|
||||
#ifdef ENABLE_WEBSERVER
|
||||
p += snprintf(p, end-p, ",\"http_requests\":%u", st->http_requests);
|
||||
#endif
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -1344,205 +1462,6 @@ void writeJsonToFile(const char *file, char * (*generator) (const char *,int*))
|
|||
}
|
||||
|
||||
|
||||
#ifdef ENABLE_WEBSERVER
|
||||
|
||||
//
|
||||
//=========================================================================
|
||||
//
|
||||
#define MODES_CONTENT_TYPE_HTML "text/html;charset=utf-8"
|
||||
#define MODES_CONTENT_TYPE_CSS "text/css;charset=utf-8"
|
||||
#define MODES_CONTENT_TYPE_JSON "application/json;charset=utf-8"
|
||||
#define MODES_CONTENT_TYPE_JS "application/javascript;charset=utf-8"
|
||||
#define MODES_CONTENT_TYPE_GIF "image/gif"
|
||||
|
||||
static struct {
|
||||
char *path;
|
||||
char * (*handler)(const char*,int*);
|
||||
char *content_type;
|
||||
int prefix;
|
||||
} url_handlers[] = {
|
||||
{ "/data/aircraft.json", generateAircraftJson, MODES_CONTENT_TYPE_JSON, 0 },
|
||||
{ "/data/receiver.json", generateReceiverJson, MODES_CONTENT_TYPE_JSON, 0 },
|
||||
{ "/data/stats.json", generateStatsJson, MODES_CONTENT_TYPE_JSON, 0 },
|
||||
{ "/data/history_", generateHistoryJson, MODES_CONTENT_TYPE_JSON, 1 },
|
||||
{ NULL, NULL, NULL, 0 }
|
||||
};
|
||||
|
||||
//
|
||||
// Get an HTTP request header and write the response to the client.
|
||||
// gain here we assume that the socket buffer is enough without doing
|
||||
// any kind of userspace buffering.
|
||||
//
|
||||
// Returns 1 on error to signal the caller the client connection should
|
||||
// be closed.
|
||||
//
|
||||
static int handleHTTPRequest(struct client *c, char *p) {
|
||||
char hdr[512];
|
||||
int clen, hdrlen;
|
||||
int httpver, keepalive;
|
||||
int statuscode = 500;
|
||||
const char *statusmsg = "Internal Server Error";
|
||||
char *url, *content = NULL;
|
||||
char *ext;
|
||||
char *content_type = NULL;
|
||||
int i;
|
||||
|
||||
if (Modes.debug & MODES_DEBUG_NET)
|
||||
printf("\nHTTP request: %s\n", c->buf);
|
||||
|
||||
// Minimally parse the request.
|
||||
httpver = (strstr(p, "HTTP/1.1") != NULL) ? 11 : 10;
|
||||
if (httpver == 10) {
|
||||
// HTTP 1.0 defaults to close, unless otherwise specified.
|
||||
//keepalive = strstr(p, "Connection: keep-alive") != NULL;
|
||||
} else if (httpver == 11) {
|
||||
// HTTP 1.1 defaults to keep-alive, unless close is specified.
|
||||
//keepalive = strstr(p, "Connection: close") == NULL;
|
||||
}
|
||||
keepalive = 0;
|
||||
|
||||
// Identify he URL.
|
||||
p = strchr(p,' ');
|
||||
if (!p) return 1; // There should be the method and a space
|
||||
url = ++p; // Now this should point to the requested URL
|
||||
p = strchr(p, ' ');
|
||||
if (!p) return 1; // There should be a space before HTTP/
|
||||
*p = '\0';
|
||||
|
||||
if (Modes.debug & MODES_DEBUG_NET) {
|
||||
printf("\nHTTP keep alive: %d\n", keepalive);
|
||||
printf("HTTP requested URL: %s\n\n", url);
|
||||
}
|
||||
|
||||
// Ditch any trailing query part (AJAX might add one to avoid caching)
|
||||
p = strchr(url, '?');
|
||||
if (p) *p = 0;
|
||||
|
||||
statuscode = 404;
|
||||
statusmsg = "Not Found";
|
||||
for (i = 0; url_handlers[i].path; ++i) {
|
||||
if ((url_handlers[i].prefix && !strncmp(url, url_handlers[i].path, strlen(url_handlers[i].path))) ||
|
||||
(!url_handlers[i].prefix && !strcmp(url, url_handlers[i].path))) {
|
||||
content_type = url_handlers[i].content_type;
|
||||
content = url_handlers[i].handler(url, &clen);
|
||||
if (!content)
|
||||
continue;
|
||||
|
||||
statuscode = 200;
|
||||
statusmsg = "OK";
|
||||
if (Modes.debug & MODES_DEBUG_NET) {
|
||||
printf("HTTP: 200: %s -> internal (%d bytes, %s)\n", url, clen, content_type);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!content) {
|
||||
struct stat sbuf;
|
||||
int fd = -1;
|
||||
char rp[PATH_MAX], hrp[PATH_MAX];
|
||||
char getFile[1024];
|
||||
|
||||
if (strlen(url) < 2) {
|
||||
snprintf(getFile, sizeof getFile, "%s/gmap.html", Modes.html_dir); // Default file
|
||||
} else {
|
||||
snprintf(getFile, sizeof getFile, "%s/%s", Modes.html_dir, url);
|
||||
}
|
||||
|
||||
if (!realpath(getFile, rp))
|
||||
rp[0] = 0;
|
||||
if (!realpath(Modes.html_dir, hrp))
|
||||
strcpy(hrp, Modes.html_dir);
|
||||
|
||||
clen = -1;
|
||||
content = strdup("Server error occured");
|
||||
if (!strncmp(hrp, rp, strlen(hrp))) {
|
||||
if (stat(getFile, &sbuf) != -1 && (fd = open(getFile, O_RDONLY)) != -1) {
|
||||
content = (char *) realloc(content, sbuf.st_size);
|
||||
if (read(fd, content, sbuf.st_size) == sbuf.st_size) {
|
||||
clen = sbuf.st_size;
|
||||
statuscode = 200;
|
||||
statusmsg = "OK";
|
||||
}
|
||||
}
|
||||
} else {
|
||||
errno = ENOENT;
|
||||
}
|
||||
|
||||
if (clen < 0) {
|
||||
content = realloc(content, 128);
|
||||
clen = snprintf(content, 128, "Error opening HTML file: %s", strerror(errno));
|
||||
statuscode = 404;
|
||||
statusmsg = "Not Found";
|
||||
}
|
||||
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
}
|
||||
|
||||
// Get file extension and content type
|
||||
content_type = MODES_CONTENT_TYPE_HTML; // Default content type
|
||||
ext = strrchr(getFile, '.');
|
||||
|
||||
if (ext) {
|
||||
if (!strcmp(ext, ".json")) {
|
||||
content_type = MODES_CONTENT_TYPE_JSON;
|
||||
} else if (!strcmp(ext, ".css")) {
|
||||
content_type = MODES_CONTENT_TYPE_CSS;
|
||||
} else if (!strcmp(ext, ".js")) {
|
||||
content_type = MODES_CONTENT_TYPE_JS;
|
||||
} else if (!strcmp(ext, ".gif")) {
|
||||
content_type = MODES_CONTENT_TYPE_GIF;
|
||||
}
|
||||
}
|
||||
|
||||
if (Modes.debug & MODES_DEBUG_NET) {
|
||||
printf("HTTP: %d %s: %s -> %s (%d bytes, %s)\n", statuscode, statusmsg, url, rp, clen, content_type);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Create the header and send the reply
|
||||
hdrlen = snprintf(hdr, sizeof(hdr),
|
||||
"HTTP/1.1 %d %s\r\n"
|
||||
"Server: Dump1090\r\n"
|
||||
"Content-Type: %s\r\n"
|
||||
"Connection: %s\r\n"
|
||||
"Content-Length: %d\r\n"
|
||||
"Cache-Control: no-cache, must-revalidate\r\n"
|
||||
"Expires: Sat, 26 Jul 1997 05:00:00 GMT\r\n"
|
||||
"\r\n",
|
||||
statuscode, statusmsg,
|
||||
content_type,
|
||||
keepalive ? "keep-alive" : "close",
|
||||
clen);
|
||||
|
||||
if (Modes.debug & MODES_DEBUG_NET) {
|
||||
printf("HTTP Reply header:\n%s", hdr);
|
||||
}
|
||||
|
||||
/* hack hack hack. try to deal with large content */
|
||||
anetSetSendBuffer(Modes.aneterr, c->fd, clen + hdrlen);
|
||||
|
||||
// Send header and content.
|
||||
#ifndef _WIN32
|
||||
if ( (write(c->fd, hdr, hdrlen) != hdrlen)
|
||||
|| (write(c->fd, content, clen) != clen) )
|
||||
#else
|
||||
if ( (send(c->fd, hdr, hdrlen, 0) != hdrlen)
|
||||
|| (send(c->fd, content, clen, 0) != clen) )
|
||||
#endif
|
||||
{
|
||||
free(content);
|
||||
return 1;
|
||||
}
|
||||
free(content);
|
||||
Modes.stats_current.http_requests++;
|
||||
return !keepalive;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//
|
||||
//=========================================================================
|
||||
//
|
||||
|
@ -1561,14 +1480,11 @@ static int handleHTTPRequest(struct client *c, char *p) {
|
|||
static void modesReadFromClient(struct client *c) {
|
||||
int left;
|
||||
int nread;
|
||||
int fullmsg;
|
||||
int bContinue = 1;
|
||||
char *s, *e, *p;
|
||||
|
||||
while(bContinue) {
|
||||
while (bContinue) {
|
||||
left = MODES_CLIENT_BUF_SIZE - c->buflen - 1; // leave 1 extra byte for NUL termination in the ASCII case
|
||||
|
||||
fullmsg = 0;
|
||||
left = MODES_CLIENT_BUF_SIZE - c->buflen;
|
||||
// If our buffer is full discard it, this is some badly formatted shit
|
||||
if (left <= 0) {
|
||||
c->buflen = 0;
|
||||
|
@ -1608,73 +1524,138 @@ static void modesReadFromClient(struct client *c) {
|
|||
|
||||
c->buflen += nread;
|
||||
|
||||
// Always null-term so we are free to use strstr() (it won't affect binary case)
|
||||
c->buf[c->buflen] = '\0';
|
||||
char *som = c->buf; // first byte of next message
|
||||
char *eod = som + c->buflen; // one byte past end of data
|
||||
char *p;
|
||||
|
||||
e = s = c->buf; // Start with the start of buffer, first message
|
||||
switch (c->service->read_mode) {
|
||||
case READ_MODE_IGNORE:
|
||||
// drop the bytes on the floor
|
||||
som = eod;
|
||||
break;
|
||||
|
||||
if (c->service->read_sep == NULL) {
|
||||
case READ_MODE_BEAST:
|
||||
// This is the Beast Binary scanning case.
|
||||
// If there is a complete message still in the buffer, there must be the separator 'sep'
|
||||
// in the buffer, note that we full-scan the buffer at every read for simplicity.
|
||||
|
||||
left = c->buflen; // Length of valid search for memchr()
|
||||
while (left > 1 && ((s = memchr(e, (char) 0x1a, left)) != NULL)) { // The first byte of buffer 'should' be 0x1a
|
||||
s++; // skip the 0x1a
|
||||
if (*s == '1') {
|
||||
e = s + MODEAC_MSG_BYTES + 8; // point past remainder of message
|
||||
} else if (*s == '2') {
|
||||
e = s + MODES_SHORT_MSG_BYTES + 8;
|
||||
} else if (*s == '3') {
|
||||
e = s + MODES_LONG_MSG_BYTES + 8;
|
||||
while (som < eod && ((p = memchr(som, (char) 0x1a, eod - som)) != NULL)) { // The first byte of buffer 'should' be 0x1a
|
||||
som = p; // consume garbage up to the 0x1a
|
||||
++p; // skip 0x1a
|
||||
|
||||
if (p >= eod) {
|
||||
// Incomplete message in buffer, retry later
|
||||
break;
|
||||
}
|
||||
|
||||
char *eom; // one byte past end of message
|
||||
if (*p == '1') {
|
||||
eom = p + MODEAC_MSG_BYTES + 8; // point past remainder of message
|
||||
} else if (*p == '2') {
|
||||
eom = p + MODES_SHORT_MSG_BYTES + 8;
|
||||
} else if (*p == '3') {
|
||||
eom = p + MODES_LONG_MSG_BYTES + 8;
|
||||
} else if (*p == '4') {
|
||||
eom = p + MODES_LONG_MSG_BYTES + 8;
|
||||
} else if (*p == '5') {
|
||||
eom = p + MODES_LONG_MSG_BYTES + 8;
|
||||
} else {
|
||||
e = s; // Not a valid beast message, skip
|
||||
left = &(c->buf[c->buflen]) - e;
|
||||
// Not a valid beast message, skip 0x1a and try again
|
||||
++som;
|
||||
continue;
|
||||
}
|
||||
|
||||
// we need to be careful of double escape characters in the message body
|
||||
for (p = s; p < e; p++) {
|
||||
for (p = som + 1; p < eod && p < eom; p++) {
|
||||
if (0x1A == *p) {
|
||||
p++; e++;
|
||||
if (e > &(c->buf[c->buflen])) {
|
||||
p++;
|
||||
eom++;
|
||||
}
|
||||
}
|
||||
|
||||
if (eom > eod) { // Incomplete message in buffer, retry later
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
left = &(c->buf[c->buflen]) - e;
|
||||
if (left < 0) { // Incomplete message in buffer
|
||||
e = s - 1; // point back at last found 0x1a.
|
||||
break;
|
||||
}
|
||||
// Have a 0x1a followed by 1, 2 or 3 - pass message less 0x1a to handler.
|
||||
if (c->service->read_handler(c, s)) {
|
||||
|
||||
// Have a 0x1a followed by 1/2/3/4/5 - pass message to handler.
|
||||
if (c->service->read_handler(c, som + 1)) {
|
||||
modesCloseClient(c);
|
||||
return;
|
||||
}
|
||||
fullmsg = 1;
|
||||
}
|
||||
s = e; // For the buffer remainder below
|
||||
|
||||
// advance to next message
|
||||
som = eom;
|
||||
}
|
||||
break;
|
||||
|
||||
case READ_MODE_BEAST_COMMAND:
|
||||
while (som < eod && ((p = memchr(som, (char) 0x1a, eod - som)) != NULL)) { // The first byte of buffer 'should' be 0x1a
|
||||
char *eom; // one byte past end of message
|
||||
|
||||
som = p; // consume garbage up to the 0x1a
|
||||
++p; // skip 0x1a
|
||||
|
||||
if (p >= eod) {
|
||||
// Incomplete message in buffer, retry later
|
||||
break;
|
||||
}
|
||||
|
||||
if (*p == '1') {
|
||||
eom = p + 2;
|
||||
} else {
|
||||
// Not a valid beast command, skip 0x1a and try again
|
||||
++som;
|
||||
continue;
|
||||
}
|
||||
|
||||
// we need to be careful of double escape characters in the message body
|
||||
for (p = som + 1; p < eod && p < eom; p++) {
|
||||
if (0x1A == *p) {
|
||||
p++;
|
||||
eom++;
|
||||
}
|
||||
}
|
||||
|
||||
if (eom > eod) { // Incomplete message in buffer, retry later
|
||||
break;
|
||||
}
|
||||
|
||||
// Have a 0x1a followed by 1 - pass message to handler.
|
||||
if (c->service->read_handler(c, som + 1)) {
|
||||
modesCloseClient(c);
|
||||
return;
|
||||
}
|
||||
|
||||
// advance to next message
|
||||
som = eom;
|
||||
}
|
||||
break;
|
||||
|
||||
case READ_MODE_ASCII:
|
||||
//
|
||||
// This is the ASCII scanning case, AVR RAW or HTTP at present
|
||||
// If there is a complete message still in the buffer, there must be the separator 'sep'
|
||||
// in the buffer, note that we full-scan the buffer at every read for simplicity.
|
||||
//
|
||||
while ((e = strstr(s, c->service->read_sep)) != NULL) { // end of first message if found
|
||||
*e = '\0'; // The handler expects null terminated strings
|
||||
if (c->service->read_handler(c, s)) { // Pass message to handler.
|
||||
|
||||
// Always NUL-terminate so we are free to use strstr()
|
||||
// nb: we never fill the last byte of the buffer with read data (see above) so this is safe
|
||||
*eod = '\0';
|
||||
|
||||
while (som < eod && (p = strstr(som, c->service->read_sep)) != NULL) { // end of first message if found
|
||||
*p = '\0'; // The handler expects null terminated strings
|
||||
if (c->service->read_handler(c, som)) { // Pass message to handler.
|
||||
modesCloseClient(c); // Handler returns 1 on error to signal we .
|
||||
return; // should close the client connection
|
||||
}
|
||||
s = e + strlen(c->service->read_sep); // Move to start of next message
|
||||
fullmsg = 1;
|
||||
}
|
||||
som = p + strlen(c->service->read_sep); // Move to start of next message
|
||||
}
|
||||
|
||||
if (fullmsg) { // We processed something - so
|
||||
c->buflen = &(c->buf[c->buflen]) - s; // Update the unprocessed buffer length
|
||||
memmove(c->buf, s, c->buflen); // Move what's remaining to the start of the buffer
|
||||
break;
|
||||
}
|
||||
|
||||
if (som > c->buf) { // We processed something - so
|
||||
c->buflen = eod - som; // Update the unprocessed buffer length
|
||||
memmove(c->buf, som, c->buflen); // Move what's remaining to the start of the buffer
|
||||
} else { // If no message was decoded process the next client
|
||||
return;
|
||||
}
|
||||
|
@ -1683,6 +1664,40 @@ static void modesReadFromClient(struct client *c) {
|
|||
|
||||
#define TSV_MAX_PACKET_SIZE 275
|
||||
|
||||
static void writeFATSVPositionUpdate(float lat, float lon, float alt)
|
||||
{
|
||||
static float last_lat, last_lon, last_alt;
|
||||
|
||||
if (lat == last_lat && lon == last_lon && alt == last_alt)
|
||||
return;
|
||||
|
||||
last_lat = lat;
|
||||
last_lon = lon;
|
||||
last_alt = alt;
|
||||
|
||||
char *p = prepareWrite(&Modes.fatsv_out, TSV_MAX_PACKET_SIZE);
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
char *end = p + TSV_MAX_PACKET_SIZE;
|
||||
# define bufsize(_p,_e) ((_p) >= (_e) ? (size_t)0 : (size_t)((_e) - (_p)))
|
||||
|
||||
p += snprintf(p, bufsize(p, end), "clock\t%" PRIu64, mstime() / 1000);
|
||||
p += snprintf(p, bufsize(p, end), "\ttype\t%s", "location_update");
|
||||
p += snprintf(p, bufsize(p, end), "\tlat\t%.5f", lat);
|
||||
p += snprintf(p, bufsize(p, end), "\tlon\t%.5f", lon);
|
||||
p += snprintf(p, bufsize(p, end), "\talt\t%.0f", alt);
|
||||
p += snprintf(p, bufsize(p, end), "\taltref\t%s", "egm96_meters");
|
||||
p += snprintf(p, bufsize(p, end), "\n");
|
||||
|
||||
if (p <= end)
|
||||
completeWrite(&Modes.fatsv_out, p);
|
||||
else
|
||||
fprintf(stderr, "fatsv: output too large (max %d, overran by %d)\n", TSV_MAX_PACKET_SIZE, (int) (p - end));
|
||||
|
||||
# undef bufsize
|
||||
}
|
||||
|
||||
static void writeFATSVEventMessage(struct modesMessage *mm, const char *datafield, unsigned char *data, size_t len)
|
||||
{
|
||||
char *p = prepareWrite(&Modes.fatsv_out, TSV_MAX_PACKET_SIZE);
|
||||
|
@ -1754,10 +1769,10 @@ static void writeFATSVEvent(struct modesMessage *mm, struct aircraft *a)
|
|||
case 17:
|
||||
case 18:
|
||||
// DF 17/18: extended squitter
|
||||
if (mm->metype == 28 && mm->mesub == 2 && memcmp(&mm->ME[1], &a->fatsv_emitted_bds_30[1], 6) != 0) {
|
||||
if (mm->metype == 28 && mm->mesub == 2 && memcmp(mm->ME, &a->fatsv_emitted_es_acas_ra, 7) != 0) {
|
||||
// type 28 subtype 2: ACAS RA report
|
||||
// first byte has the type/subtype, remaining bytes match the BDS 3,0 format
|
||||
memcpy(a->fatsv_emitted_bds_30, &mm->ME[1], 6);
|
||||
memcpy(a->fatsv_emitted_es_acas_ra, mm->ME, 7);
|
||||
writeFATSVEventMessage(mm, "es_acas_ra", mm->ME, 7);
|
||||
} else if (mm->metype == 31 && (mm->mesub == 0 || mm->mesub == 1) && memcmp(mm->ME, a->fatsv_emitted_es_status, 7) != 0) {
|
||||
// aircraft operational status
|
||||
|
@ -1787,6 +1802,17 @@ typedef enum {
|
|||
TISB_CATEGORY = 2048
|
||||
} tisb_flags;
|
||||
|
||||
static inline unsigned unsigned_difference(unsigned v1, unsigned v2)
|
||||
{
|
||||
return (v1 > v2) ? (v1 - v2) : (v2 - v1);
|
||||
}
|
||||
|
||||
static inline unsigned heading_difference(unsigned h1, unsigned h2)
|
||||
{
|
||||
unsigned d = unsigned_difference(h1, h2);
|
||||
return (d < 180) ? d : (360 - d);
|
||||
}
|
||||
|
||||
static void writeFATSV()
|
||||
{
|
||||
struct aircraft *a;
|
||||
|
@ -1860,19 +1886,19 @@ static void writeFATSV()
|
|||
if (altGNSSValid && abs(a->altitude_gnss - a->fatsv_emitted_altitude_gnss) >= 50) {
|
||||
changed = 1;
|
||||
}
|
||||
if (headingValid && abs(a->heading - a->fatsv_emitted_heading) >= 2) {
|
||||
if (headingValid && heading_difference(a->heading, a->fatsv_emitted_heading) >= 2) {
|
||||
changed = 1;
|
||||
}
|
||||
if (headingMagValid && abs(a->heading_magnetic - a->fatsv_emitted_heading_magnetic) >= 2) {
|
||||
if (headingMagValid && heading_difference(a->heading_magnetic, a->fatsv_emitted_heading_magnetic) >= 2) {
|
||||
changed = 1;
|
||||
}
|
||||
if (speedValid && abs(a->speed - a->fatsv_emitted_speed) >= 25) {
|
||||
if (speedValid && unsigned_difference(a->speed, a->fatsv_emitted_speed) >= 25) {
|
||||
changed = 1;
|
||||
}
|
||||
if (speedIASValid && abs(a->speed_ias - a->fatsv_emitted_speed_ias) >= 25) {
|
||||
if (speedIASValid && unsigned_difference(a->speed_ias, a->fatsv_emitted_speed_ias) >= 25) {
|
||||
changed = 1;
|
||||
}
|
||||
if (speedTASValid && abs(a->speed_tas - a->fatsv_emitted_speed_tas) >= 25) {
|
||||
if (speedTASValid && unsigned_difference(a->speed_tas, a->fatsv_emitted_speed_tas) >= 25) {
|
||||
changed = 1;
|
||||
}
|
||||
|
||||
|
@ -1997,7 +2023,7 @@ static void writeFATSV()
|
|||
}
|
||||
|
||||
if (headingMagValid && a->heading_magnetic_valid.updated > a->fatsv_last_emitted) {
|
||||
p += snprintf(p, bufsize(p,end), "\theading_magnetic\t%d", a->heading);
|
||||
p += snprintf(p, bufsize(p,end), "\theading_magnetic\t%d", a->heading_magnetic);
|
||||
a->fatsv_emitted_heading_magnetic = a->heading_magnetic;
|
||||
useful = 1;
|
||||
tisb |= (a->heading_magnetic_valid.source == SOURCE_TISB) ? TISB_HEADING_MAGNETIC : 0;
|
||||
|
|
13
net_io.h
13
net_io.h
|
@ -29,6 +29,13 @@ struct net_service;
|
|||
typedef int (*read_fn)(struct client *, char *);
|
||||
typedef void (*heartbeat_fn)(struct net_service *);
|
||||
|
||||
typedef enum {
|
||||
READ_MODE_IGNORE,
|
||||
READ_MODE_BEAST,
|
||||
READ_MODE_BEAST_COMMAND,
|
||||
READ_MODE_ASCII
|
||||
} read_mode_t;
|
||||
|
||||
// Describes one network service (a group of clients with common behaviour)
|
||||
struct net_service {
|
||||
struct net_service* next;
|
||||
|
@ -41,6 +48,7 @@ struct net_service {
|
|||
struct net_writer *writer; // shared writer state
|
||||
|
||||
const char *read_sep; // hander details for input data
|
||||
read_mode_t read_mode;
|
||||
read_fn read_handler;
|
||||
};
|
||||
|
||||
|
@ -51,6 +59,7 @@ struct client {
|
|||
struct net_service *service; // Service this client is part of
|
||||
int buflen; // Amount of data on buffer
|
||||
char buf[MODES_CLIENT_BUF_SIZE+1]; // Read buffer
|
||||
int modeac_requested; // 1 if this Beast output connection has asked for A/C
|
||||
};
|
||||
|
||||
// Common writer state for all output sockets of one type
|
||||
|
@ -62,7 +71,7 @@ struct net_writer {
|
|||
heartbeat_fn send_heartbeat; // function that queues a heartbeat if needed
|
||||
};
|
||||
|
||||
struct net_service *serviceInit(const char *descr, struct net_writer *writer, heartbeat_fn hb_handler, const char *sep, read_fn read_handler);
|
||||
struct net_service *serviceInit(const char *descr, struct net_writer *writer, heartbeat_fn hb_handler, read_mode_t mode, const char *sep, read_fn read_handler);
|
||||
struct client *serviceConnect(struct net_service *service, char *addr, int port);
|
||||
void serviceListen(struct net_service *service, char *bind_addr, char *bind_ports);
|
||||
struct client *createSocketClient(struct net_service *service, int fd);
|
||||
|
@ -72,6 +81,8 @@ struct client *createGenericClient(struct net_service *service, int fd);
|
|||
struct net_service *makeBeastInputService(void);
|
||||
struct net_service *makeFatsvOutputService(void);
|
||||
|
||||
void sendBeastSettings(struct client *c, const char *settings);
|
||||
|
||||
void modesInitNet(void);
|
||||
void modesQueueOutput(struct modesMessage *mm, struct aircraft *a);
|
||||
void modesNetPeriodicWork(void);
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"01":{"t":"GLF4"},"02":{"t":"SHIP"},"03":{"t":"SR22"},"05":{"desc":"L1P"},"06":{"desc":"L1P"},"07":{"desc":"L1P"},"08":{"t":"PA46"},"09":{"t":"BE40"},"0A":{"desc":"L1P"},"0B":{"desc":"L1P"},"0C":{"t":"C560"},"0D":{"desc":"L2J","t":"GLF6"},"0E":{"t":"GLF5"},"0F":{"desc":"L1P"},"10":{"t":"C750"},"12":{"t":"GLEX"},"13":{"desc":"A2P"},"15":{"desc":"H4E"},"16":{"t":"BE55"},"17":{"t":"BE35"},"18":{"t":"C172"},"19":{"t":"M20P"},"1A":{"t":"GLF4"},"1B":{"desc":"L4J"},"1C":{"desc":"L1P"},"1D":{"t":"GLF4"},"1E":{"t":"C56X"},"1F":{"t":"T34P"},"20":{"t":"BE35"},"21":{"t":"BE55"},"22":{"t":"S76"},"23":{"desc":"H1P","t":"GYRO"},"24":{"desc":"L1P"},"25":{"t":"BE30"},"26":{"t":"C25C"},"27":{"t":"C425"},"28":{"t":"GLF5"},"29":{"t":"C182"},"2A":{"t":"PA32"},"2B":{"t":"C182"},"2C":{"t":"C750"},"2D":{"t":"GLID"},"2E":{"desc":"L1P"},"2F":{"t":"BE55"},"30":{"t":"BE35"},"31":{"t":"GLF4"},"32":{"desc":"L1P"},"33":{"desc":"L1P"},"34":{"t":"F2TH"},"35":{"t":"CL30"},"36":{"t":"C172"},"37":{"t":"GLF2"},"38":{"t":"C337"},"39":{"t":"BE35"},"3A":{"t":"CL30"},"3B":{"t":"FA50"},"3C":{"t":"C25C"},"3D":{"desc":"L1P"},"3E":{"t":"BE33"},"3F":{"desc":"L1J"},"40":{"desc":"L1P"},"41":{"t":"BE55"},"42":{"t":"CL60"},"43":{"t":"AA1"},"44":{"desc":"H1T"},"45":{"t":"NAVI"},"46":{"t":"P337"},"47":{"t":"CL60"},"48":{"desc":"L1P"},"49":{"t":"PC12"},"4A":{"desc":"L1P"},"4B":{"t":"GC1"},"4C":{"t":"C190"},"4D":{"t":"GLF4"},"4E":{"t":"C500"},"4F":{"t":"C421"},"50":{"t":"GLF5"},"51":{"t":"BE36"},"52":{"desc":"L2J","t":"LR31"},"53":{"desc":"L1P"},"54":{"t":"GL5T"},"55":{"t":"CL60"},"56":{"t":"BE33"},"57":{"t":"SR22"},"58":{"t":"GLID"},"59":{"desc":"L2J","t":"C25C"},"5A":{"t":"BE35"},"5B":{"desc":"L1P"},"5C":{"t":"H500"},"5D":{"t":"C414"},"5E":{"t":"GLEX"},"60":{"t":"BE50"},"61":{"t":"T206"},"62":{"t":"GLF4"},"63":{"t":"R66"},"64":{"t":"C310"},"65":{"t":"C182"},"66":{"t":"C172"},"68":{"t":"GLF5"},"69":{"t":"ST75"},"6A":{"desc":"L2J","t":"LR31"},"6B":{"desc":"L1P"},"6C":{"t":"BE58"},"6D":{"t":"PRM1"},"6E":{"t":"C206"},"70":{"desc":"L1P"},"71":{"t":"C510"},"72":{"desc":"L1P"},"74":{"desc":"L1P"},"76":{"t":"DA42"},"77":{"t":"CL60"},"78":{"t":"PA31"},"79":{"desc":"L1P"},"7A":{"t":"BE36"},"7B":{"t":"NAVI"},"7C":{"desc":"L1P"},"7D":{"desc":"L1P"},"7E":{"desc":"L1P"},"7F":{"t":"GLF6"},"80":{"t":"BE35"},"81":{"desc":"L1P"},"82":{"desc":"L2J"},"83":{"t":"TOBA"},"84":{"t":"GLEX"},"85":{"desc":"L1P"},"86":{"t":"T206"},"87":{"t":"C180"},"88":{"t":"C680"},"89":{"t":"PA23"},"8A":{"desc":"H2T"},"8B":{"t":"C550"},"8C":{"desc":"L1P"},"8D":{"desc":"L1P"},"8F":{"t":"C182"},"90":{"t":"GLF5"},"91":{"desc":"L1J"},"92":{"t":"PA31"},"93":{"t":"M20P"},"94":{"desc":"L1P"},"95":{"t":"BE55"},"96":{"t":"AA5"},"97":{"t":"M5"},"98":{"desc":"L1P"},"99":{"t":"O1"},"9A":{"desc":"L1P"},"9B":{"t":"EC35"},"9C":{"desc":"L1P"},"9D":{"desc":"L1P"},"9E":{"t":"BE9L"},"9F":{"t":"C500"},"A0":{"t":"C550"},"A1":{"desc":"L1P"},"A2":{"desc":"H1P"},"A3":{"t":"PA27"},"A4":{"t":"SBR1"},"A5":{"t":"GLF5"},"A6":{"desc":"L1P"},"A7":{"t":"C421"},"A8":{"desc":"L1P"},"A9":{"t":"BE35"},"AA":{"t":"GLF5"},"AB":{"desc":"L1P"},"AC":{"desc":"L1P"},"AD":{"desc":"L1P"},"AE":{"t":"C177"},"AF":{"t":"C150"},"B0":{"desc":"L1P"},"B1":{"t":"C550"},"B2":{"t":"C551"},"B3":{"t":"BE55"},"B4":{"t":"GLF5"},"B6":{"t":"C550"},"B7":{"t":"FA20"},"B8":{"desc":"L1P"},"B9":{"t":"BE33"},"BA":{"desc":"L1P"},"BB":{"desc":"L1P"},"BC":{"t":"C182"},"BD":{"desc":"L1P"},"BE":{"desc":"L1P"},"BF":{"t":"CL30"},"C0":{"desc":"H1P"},"C2":{"t":"F2TH"},"C3":{"desc":"L1P","t":"LA4"},"C4":{"t":"C337"},"C5":{"desc":"L2P"},"C6":{"desc":"L1P"},"C7":{"t":"BE20"},"C8":{"desc":"L1P"},"C9":{"t":"CL60"},"CA":{"t":"PRM1"},"CB":{"t":"P210"},"CC":{"desc":"L2J","t":"LR60"},"CD":{"desc":"L2J"},"CE":{"t":"PA34"},"CF":{"desc":"L1P"},"D0":{"t":"T210"},"D1":{"desc":"L2J","t":"LR55"},"D2":{"t":"C182"},"D3":{"t":"BL17"},"D4":{"t":"F2TH"},"D5":{"t":"PA18"},"D6":{"t":"C750"},"D7":{"t":"GLF4"},"D8":{"t":"BE40"},"D9":{"t":"PA24"},"DA":{"t":"GLEX"},"DB":{"t":"BE35"},"DD":{"desc":"L1P"},"DE":{"desc":"L1P"},"DF":{"t":"FA10"},"E0":{"t":"SBR1"},"E1":{"t":"C182"},"E4":{"t":"C25B"},"E5":{"t":"C150"},"E7":{"desc":"L1P"},"E8":{"t":"GLF6"},"EA":{"t":"GLID"},"EB":{"t":"AA5"},"EC":{"desc":"L1P"},"ED":{"desc":"L1P"},"EE":{"t":"BE35"},"EF":{"t":"BE60"},"F0":{"desc":"L1P"},"F1":{"t":"T210"},"F2":{"t":"B14A"},"F3":{"desc":"L1P"},"F4":{"t":"C150"},"F5":{"t":"WW24"},"F6":{"t":"PA34"},"F7":{"desc":"L1P"},"F8":{"desc":"L1P"},"F9":{"t":"H269"},"FA":{"t":"BE33"},"FB":{"t":"PA18"},"FC":{"desc":"L3J","t":"F900"},"FD":{"t":"GLF5"},"FE":{"t":"P210"},"FF":{"desc":"L1P"}}
|
||||
{"01":{"t":"GLF4"},"02":{"t":"SHIP"},"03":{"t":"SR22"},"05":{"desc":"L1P"},"06":{"desc":"L1P"},"07":{"desc":"L1P"},"08":{"t":"PA46"},"09":{"t":"BE40"},"0A":{"desc":"L1P"},"0B":{"desc":"L1P"},"0C":{"t":"C560"},"0D":{"desc":"L2J","t":"GLF6"},"0E":{"t":"GLF5"},"0F":{"desc":"L1P"},"10":{"t":"C750"},"12":{"t":"GLEX"},"13":{"desc":"A2P"},"15":{"desc":"H4E"},"16":{"t":"BE55"},"17":{"t":"BE35"},"18":{"t":"C172"},"19":{"t":"M20P"},"1A":{"t":"GLF4"},"1B":{"desc":"L4J"},"1C":{"desc":"L1P"},"1D":{"t":"GLF5"},"1E":{"t":"CL30"},"1F":{"t":"T34P"},"20":{"t":"BE35"},"21":{"t":"BE55"},"22":{"t":"S76"},"23":{"desc":"H1P","t":"GYRO"},"24":{"desc":"L1P"},"25":{"t":"BE30"},"26":{"t":"C25C"},"27":{"t":"C425"},"28":{"desc":"L2J","t":"GLF5"},"29":{"t":"C182"},"2A":{"t":"PA32"},"2B":{"t":"C182"},"2C":{"t":"C750"},"2D":{"t":"GLID"},"2E":{"desc":"L1P"},"2F":{"t":"BE55"},"30":{"t":"BE35"},"31":{"t":"GLF4"},"32":{"desc":"L1P"},"33":{"desc":"L1P"},"34":{"t":"F2TH"},"35":{"t":"CL30"},"36":{"t":"C172"},"37":{"t":"GLF2"},"38":{"t":"C337"},"39":{"t":"BE35"},"3A":{"t":"CL30"},"3B":{"t":"FA50"},"3C":{"t":"C25C"},"3D":{"desc":"L1P"},"3E":{"t":"BE33"},"3F":{"desc":"L1J"},"40":{"desc":"L1P"},"41":{"t":"BE55"},"42":{"t":"CL60"},"43":{"t":"AA1"},"44":{"desc":"H1T"},"45":{"t":"NAVI"},"46":{"t":"P337"},"47":{"t":"CL60"},"48":{"desc":"L1P"},"49":{"t":"PC12"},"4A":{"desc":"L1P"},"4B":{"t":"GC1"},"4C":{"t":"C190"},"4D":{"t":"GLF4"},"4E":{"t":"C500"},"4F":{"t":"C421"},"50":{"t":"GLF5"},"51":{"t":"BE36"},"52":{"desc":"L2J","t":"LR31"},"53":{"desc":"L1P"},"54":{"t":"GL5T"},"55":{"t":"CL60"},"56":{"t":"BE33"},"57":{"t":"SR22"},"58":{"t":"GLID"},"59":{"desc":"L2J","t":"C25C"},"5A":{"t":"BE35"},"5B":{"desc":"L1P"},"5C":{"t":"H500"},"5D":{"desc":"L1P"},"5E":{"t":"GLEX"},"60":{"t":"BE50"},"61":{"t":"T206"},"62":{"t":"GLF4"},"63":{"t":"R66"},"64":{"t":"C310"},"65":{"t":"C182"},"66":{"t":"C172"},"68":{"t":"GLF5"},"69":{"t":"ST75"},"6A":{"desc":"L2J"},"6B":{"desc":"L1P"},"6C":{"t":"BE58"},"6D":{"t":"PRM1"},"6E":{"t":"C206"},"70":{"desc":"L1P"},"71":{"t":"C510"},"72":{"desc":"L1P"},"74":{"desc":"L1P"},"76":{"t":"DA42"},"77":{"t":"CL60"},"78":{"t":"PA31"},"79":{"desc":"L1P"},"7A":{"t":"BE36"},"7B":{"t":"NAVI"},"7C":{"desc":"L1P"},"7D":{"desc":"L1P"},"7E":{"desc":"L1P"},"7F":{"t":"GLF6"},"80":{"t":"BE35"},"81":{"desc":"L1P"},"82":{"desc":"L2J"},"83":{"t":"TOBA"},"84":{"t":"GLEX"},"85":{"desc":"L1P"},"86":{"t":"T206"},"87":{"t":"C180"},"88":{"t":"C680"},"89":{"t":"PA23"},"8A":{"desc":"H2T"},"8B":{"t":"C550"},"8C":{"desc":"L1P"},"8D":{"desc":"L1P"},"8F":{"t":"C182"},"90":{"t":"GLF5"},"91":{"desc":"L1J"},"92":{"desc":"H1T"},"93":{"t":"M20P"},"94":{"desc":"L1P"},"95":{"t":"BE55"},"96":{"t":"AA5"},"97":{"t":"M5"},"98":{"desc":"L1P"},"99":{"t":"O1"},"9A":{"desc":"L1P"},"9B":{"t":"EC35"},"9C":{"desc":"L1P"},"9D":{"desc":"L1P"},"9E":{"t":"BE9L"},"9F":{"t":"C500"},"A0":{"t":"C550"},"A1":{"desc":"L1P"},"A2":{"desc":"H1P"},"A3":{"t":"PA27"},"A4":{"t":"SBR1"},"A5":{"t":"GLF5"},"A6":{"desc":"L1P"},"A7":{"t":"C421"},"A8":{"desc":"L1P"},"A9":{"t":"BE35"},"AA":{"t":"GLF5"},"AB":{"desc":"L1P"},"AC":{"desc":"L1P"},"AD":{"desc":"L1P"},"AE":{"t":"C177"},"AF":{"t":"C150"},"B0":{"desc":"L1P"},"B1":{"t":"C550"},"B2":{"t":"C551"},"B3":{"t":"BE55"},"B4":{"t":"GLF5"},"B6":{"t":"C550"},"B7":{"t":"FA20"},"B8":{"desc":"L1P"},"B9":{"t":"BE33"},"BA":{"desc":"L1P"},"BB":{"desc":"L1P"},"BC":{"t":"C182"},"BD":{"desc":"L1P"},"BE":{"desc":"L1P"},"BF":{"t":"CL30"},"C0":{"desc":"H1P"},"C2":{"t":"F2TH"},"C3":{"desc":"L1P","t":"LA4"},"C4":{"t":"C337"},"C5":{"desc":"L2P"},"C6":{"desc":"L1P"},"C7":{"t":"BE20"},"C8":{"desc":"L1P"},"C9":{"t":"CL60"},"CA":{"t":"PRM1"},"CB":{"t":"P210"},"CC":{"desc":"L2J","t":"LR60"},"CD":{"desc":"L2J"},"CE":{"t":"PA34"},"CF":{"desc":"L1P"},"D0":{"t":"T210"},"D1":{"desc":"L2J","t":"LR55"},"D2":{"t":"C182"},"D3":{"t":"BL17"},"D4":{"t":"F2TH"},"D5":{"t":"PA18"},"D6":{"t":"C750"},"D7":{"t":"GLF4"},"D8":{"t":"BE40"},"D9":{"t":"PA24"},"DA":{"t":"GLEX"},"DB":{"t":"BE35"},"DD":{"desc":"L1P"},"DE":{"desc":"L1P"},"DF":{"t":"FA10"},"E0":{"t":"SBR1"},"E1":{"t":"C182"},"E4":{"t":"E55P"},"E5":{"t":"C150"},"E7":{"desc":"L1P"},"E8":{"t":"GLF6"},"EA":{"t":"GLID"},"EB":{"t":"AA5"},"EC":{"desc":"L1P"},"ED":{"desc":"L1P"},"EE":{"desc":"A1T"},"EF":{"t":"BE60"},"F0":{"desc":"L1P"},"F1":{"t":"T210"},"F2":{"t":"B14A"},"F3":{"desc":"L1P"},"F4":{"t":"C150"},"F5":{"t":"WW24"},"F6":{"t":"C172"},"F7":{"desc":"L1P"},"F8":{"desc":"L1P"},"F9":{"t":"H269"},"FA":{"t":"BE33"},"FB":{"t":"PA18"},"FC":{"desc":"L3J","t":"F900"},"FD":{"t":"GLF5"},"FE":{"t":"P210"},"FF":{"desc":"L1P"}}
|
|
@ -1 +1 @@
|
|||
{"00":{"t":"G164"},"01":{"t":"M7"},"02":{"desc":"A1P"},"03":{"t":"G164"},"04":{"t":"B732"},"05":{"t":"C150"},"06":{"t":"C210"},"08":{"t":"BALL"},"09":{"t":"M20P"},"0A":{"desc":"L1P"},"0B":{"t":"CH7A"},"0C":{"t":"PA30"},"0D":{"t":"ULAC"},"0E":{"t":"P28A"},"10":{"t":"PA32"},"11":{"t":"BE60"},"12":{"t":"C182"},"13":{"desc":"L1P"},"14":{"t":"BALL"},"15":{"t":"P28A"},"16":{"desc":"L1P"},"17":{"t":"TBM7"},"18":{"t":"BE35"},"19":{"t":"PA34"},"1A":{"t":"C206"},"1B":{"desc":"L1P"},"1C":{"t":"M7"},"1E":{"desc":"L1P"},"1F":{"t":"M7"},"20":{"desc":"H1T"},"21":{"t":"C210"},"23":{"t":"G164"},"25":{"t":"C150"},"26":{"t":"G164"},"27":{"desc":"H1T"},"28":{"desc":"L1P"},"29":{"desc":"L1P"},"2A":{"t":"AT5T"},"2B":{"t":"C208"},"2C":{"t":"M20P"},"2D":{"t":"C195"},"2E":{"t":"CH7A"},"2F":{"desc":"L2P"},"30":{"desc":"L1P"},"31":{"t":"H269"},"33":{"t":"SHIP"},"34":{"t":"BALL"},"35":{"t":"C182"},"36":{"t":"M7"},"37":{"t":"BE36"},"38":{"t":"P28R"},"39":{"t":"BALL"},"3A":{"t":"PA27"},"3B":{"t":"BE55"},"3C":{"t":"PA34"},"3D":{"t":"C72R"},"3E":{"t":"BE35"},"3F":{"t":"P28A"},"41":{"desc":"L1P","t":"ULAC"},"42":{"t":"G164"},"43":{"desc":"L1P"},"44":{"t":"G164"},"45":{"t":"G164"},"46":{"t":"G164"},"47":{"t":"C150"},"48":{"t":"G164"},"49":{"t":"C150"},"4A":{"t":"G164"},"4B":{"desc":"L1P","t":"ULAC"},"4C":{"desc":"L1P"},"4D":{"t":"M20P"},"4E":{"t":"BE50"},"4F":{"t":"M20T"},"50":{"t":"C190"},"51":{"t":"CH7A"},"52":{"t":"M20P"},"54":{"t":"P28A"},"55":{"desc":"L1P"},"56":{"t":"L8"},"57":{"desc":"A1P"},"58":{"t":"C172"},"59":{"t":"M20P"},"5A":{"t":"PA23"},"5B":{"desc":"L1P","t":"ULAC"},"5C":{"t":"BALL"},"5E":{"t":"BE35"},"5F":{"t":"M20T"},"60":{"t":"C208"},"61":{"t":"BE55"},"62":{"t":"P28A"},"63":{"t":"B412"},"64":{"desc":"H1P"},"65":{"desc":"L1P"},"66":{"t":"G164"},"67":{"t":"C182"},"68":{"t":"G164"},"69":{"t":"G164"},"6A":{"desc":"L1J"},"6B":{"t":"G164"},"6C":{"t":"C150"},"6D":{"t":"G164"},"6F":{"desc":"L1P"},"70":{"t":"PA18"},"71":{"t":"C208"},"72":{"desc":"L1T","t":"BE36"},"73":{"t":"C421"},"74":{"t":"CH7A"},"75":{"t":"PA32"},"76":{"t":"M7"},"77":{"t":"J3"},"78":{"desc":"L1P"},"79":{"desc":"L1P"},"7A":{"desc":"L1P"},"7B":{"t":"C172"},"7C":{"desc":"L4P"},"7D":{"t":"PA23"},"7E":{"t":"C310"},"7F":{"t":"BALL"},"80":{"desc":"L1P"},"81":{"t":"M20P"},"82":{"t":"C182"},"83":{"t":"C208"},"84":{"t":"BALL"},"85":{"t":"C180"},"86":{"desc":"L1P"},"87":{"desc":"L1P"},"88":{"t":"GLID"},"8A":{"desc":"L1P"},"8B":{"desc":"L1P"},"8C":{"t":"C177"},"8D":{"t":"C150"},"8E":{"t":"G164"},"8F":{"t":"G164"},"90":{"t":"G164"},"91":{"desc":"L1P"},"92":{"desc":"L1P"},"93":{"desc":"L1P"},"94":{"desc":"H1P"},"95":{"desc":"L2P"},"96":{"t":"C195"},"97":{"t":"CH7A"},"98":{"t":"C185"},"99":{"t":"C182"},"9A":{"t":"AR15"},"9C":{"t":"C172"},"9D":{"desc":"A1P"},"9E":{"t":"C182"},"9F":{"desc":"L4T"},"A0":{"t":"PA23"},"A1":{"desc":"L1P"},"A2":{"t":"P210"},"A3":{"desc":"L4T"},"A4":{"desc":"L1P","t":"ULAC"},"A5":{"t":"PA34"},"A6":{"desc":"L1P"},"A7":{"t":"BE55"},"A8":{"desc":"L1P"},"A9":{"desc":"L1P"},"AA":{"t":"B407"},"AB":{"t":"G164"},"AC":{"t":"G164"},"AF":{"t":"M7"},"B0":{"desc":"L1P"},"B1":{"t":"G164"},"B2":{"t":"G164"},"B3":{"t":"C150"},"B4":{"t":"G164"},"B5":{"t":"S55P"},"B6":{"t":"PA18"},"B7":{"t":"M20P"},"B8":{"desc":"L1P"},"B9":{"desc":"L1P"},"BA":{"t":"CH7B"},"BB":{"t":"C172"},"BC":{"desc":"A2P"},"BD":{"t":"P28A"},"BE":{"t":"C208"},"BF":{"t":"L8"},"C0":{"desc":"A1P"},"C1":{"t":"M20P"},"C2":{"t":"M7"},"C3":{"t":"ST75"},"C4":{"t":"C310"},"C5":{"t":"BALL"},"C6":{"desc":"L1P"},"C7":{"t":"BALL"},"C8":{"t":"PA34"},"C9":{"desc":"L4P"},"CA":{"desc":"L1P"},"CB":{"t":"PA32"},"CC":{"t":"C208"},"CD":{"t":"COL4"},"CE":{"desc":"L1P"},"CF":{"t":"G164"},"D0":{"desc":"H4E"},"D1":{"desc":"A1P"},"D2":{"t":"G164"},"D3":{"t":"G164"},"D4":{"desc":"L1P"},"D5":{"t":"C150"},"D6":{"t":"G164"},"D7":{"t":"B412"},"D8":{"desc":"L4P"},"D9":{"desc":"A1P"},"DA":{"t":"HUSK"},"DB":{"t":"H269"},"DC":{"t":"BL8"},"DD":{"t":"BE30"},"DE":{"t":"B06"},"DF":{"t":"BE18"},"E0":{"desc":"H4E"},"E1":{"t":"ULAC"},"E2":{"desc":"L1P"},"E4":{"desc":"L1P"},"E5":{"t":"C185"},"E6":{"t":"C208"},"E7":{"t":"BE9L"},"E9":{"t":"C182"},"EA":{"t":"C82R"},"EB":{"t":"PA32"},"ED":{"t":"P28A"},"EE":{"desc":"L1P"},"F2":{"desc":"L1P","t":"ULAC"},"F3":{"desc":"L2P"},"F4":{"t":"HUSK"},"F5":{"t":"BL8"},"F6":{"desc":"A1P"},"F7":{"desc":"L1P"},"F9":{"desc":"H4E"},"FA":{"t":"BALL"},"FB":{"desc":"L1P"},"FC":{"t":"GLID"},"FD":{"t":"BE9L"},"FE":{"t":"PA44"},"FF":{"desc":"H4E"}}
|
||||
{"00":{"t":"G164"},"01":{"t":"M7"},"02":{"desc":"A1P"},"03":{"t":"G164"},"04":{"t":"B732"},"05":{"t":"C150"},"06":{"t":"C210"},"08":{"t":"BALL"},"09":{"t":"M20P"},"0A":{"desc":"L1P"},"0B":{"t":"CH7A"},"0C":{"t":"PA30"},"0D":{"t":"ULAC"},"0E":{"t":"P28A"},"10":{"t":"PA32"},"11":{"t":"BE60"},"12":{"t":"C182"},"13":{"desc":"L1P"},"14":{"t":"BALL"},"15":{"t":"P28A"},"16":{"desc":"L1P"},"17":{"t":"TBM7"},"18":{"t":"BE35"},"19":{"t":"PA34"},"1A":{"t":"C206"},"1B":{"desc":"L1P"},"1C":{"t":"M7"},"1E":{"desc":"L1P"},"1F":{"t":"M7"},"20":{"desc":"H1T"},"21":{"t":"C210"},"23":{"t":"G164"},"25":{"t":"C150"},"26":{"t":"G164"},"27":{"desc":"H1T"},"28":{"desc":"L1P"},"29":{"desc":"L1P"},"2A":{"t":"AT5T"},"2B":{"t":"C208"},"2C":{"t":"M20P"},"2D":{"t":"C195"},"2E":{"t":"CH7A"},"2F":{"desc":"L2P"},"30":{"desc":"L1P"},"31":{"t":"H269"},"33":{"t":"SHIP"},"34":{"t":"BALL"},"35":{"t":"C182"},"36":{"t":"M7"},"37":{"t":"BE36"},"38":{"t":"P28R"},"39":{"t":"BALL"},"3A":{"t":"PA27"},"3B":{"t":"BE55"},"3C":{"t":"PA34"},"3D":{"t":"C72R"},"3E":{"t":"BE35"},"3F":{"t":"P28A"},"41":{"desc":"L1P","t":"ULAC"},"42":{"t":"G164"},"43":{"desc":"L1P"},"44":{"t":"G164"},"45":{"t":"G164"},"46":{"t":"G164"},"47":{"t":"C150"},"48":{"t":"G164"},"49":{"t":"C150"},"4A":{"t":"G164"},"4B":{"desc":"L1P","t":"ULAC"},"4C":{"desc":"L1P"},"4D":{"t":"M20P"},"4E":{"t":"BE50"},"4F":{"t":"M20T"},"50":{"t":"C190"},"51":{"t":"CH7A"},"52":{"t":"M20P"},"54":{"t":"P28A"},"55":{"desc":"L1P"},"56":{"t":"L8"},"57":{"desc":"A1P"},"58":{"t":"C172"},"59":{"t":"M20P"},"5A":{"t":"PA23"},"5B":{"desc":"L1P","t":"ULAC"},"5C":{"t":"BALL"},"5E":{"t":"BE35"},"5F":{"t":"M20T"},"60":{"t":"C208"},"61":{"t":"BE55"},"62":{"t":"P28A"},"63":{"t":"B412"},"64":{"desc":"H1P"},"65":{"desc":"L1P"},"66":{"t":"G164"},"67":{"t":"C182"},"68":{"t":"G164"},"69":{"t":"G164"},"6A":{"desc":"L1J"},"6B":{"t":"G164"},"6C":{"t":"C150"},"6D":{"t":"G164"},"6F":{"desc":"L1P"},"70":{"t":"PA18"},"71":{"t":"C208"},"72":{"t":"BE36"},"73":{"t":"C421"},"74":{"t":"CH7A"},"75":{"t":"PA32"},"76":{"t":"M7"},"77":{"t":"J3"},"78":{"desc":"L1P"},"79":{"desc":"L1P"},"7A":{"desc":"L1P"},"7B":{"t":"C172"},"7C":{"desc":"L4P"},"7D":{"t":"PA23"},"7E":{"t":"C310"},"7F":{"t":"BALL"},"80":{"desc":"L1P"},"81":{"t":"M20P"},"82":{"t":"C182"},"83":{"t":"C208"},"84":{"t":"BALL"},"85":{"t":"C180"},"86":{"desc":"L1P"},"87":{"desc":"L1P"},"88":{"t":"GLID"},"8A":{"desc":"L1P"},"8B":{"desc":"L1P"},"8C":{"t":"C177"},"8D":{"t":"C150"},"8E":{"t":"G164"},"8F":{"t":"G164"},"90":{"t":"G164"},"91":{"desc":"L1P"},"92":{"desc":"L1P"},"93":{"desc":"L1P"},"94":{"desc":"H1P"},"95":{"desc":"L2P"},"96":{"t":"C195"},"97":{"t":"CH7A"},"98":{"t":"C185"},"99":{"t":"C182"},"9A":{"t":"AR15"},"9C":{"t":"C172"},"9D":{"desc":"A1P"},"9E":{"t":"C182"},"9F":{"desc":"L4T"},"A0":{"t":"PA23"},"A1":{"desc":"L1P"},"A2":{"t":"P210"},"A3":{"desc":"L4T"},"A4":{"desc":"L1P","t":"ULAC"},"A5":{"t":"PA34"},"A6":{"desc":"L1P"},"A7":{"t":"BE55"},"A8":{"desc":"L1P"},"A9":{"desc":"L1P"},"AA":{"t":"B407"},"AB":{"t":"G164"},"AC":{"t":"G164"},"AF":{"t":"M7"},"B0":{"desc":"L1P"},"B1":{"t":"G164"},"B2":{"t":"G164"},"B3":{"t":"C150"},"B4":{"t":"G164"},"B5":{"t":"S55P"},"B6":{"t":"PA18"},"B7":{"t":"M20P"},"B8":{"desc":"L1P"},"B9":{"desc":"L1P"},"BA":{"t":"CH7B"},"BB":{"t":"C172"},"BC":{"desc":"A2P"},"BD":{"t":"P28A"},"BE":{"t":"C208"},"BF":{"t":"L8"},"C0":{"desc":"A1P"},"C1":{"t":"M20P"},"C2":{"t":"M7"},"C3":{"t":"ST75"},"C4":{"t":"C310"},"C5":{"t":"BALL"},"C6":{"desc":"L1P"},"C7":{"t":"BALL"},"C8":{"t":"PA34"},"C9":{"desc":"L4P"},"CA":{"desc":"L1P"},"CB":{"t":"PA32"},"CC":{"t":"C208"},"CD":{"t":"COL4"},"CE":{"desc":"L1P"},"CF":{"t":"G164"},"D0":{"desc":"H4E"},"D1":{"desc":"A1P"},"D2":{"t":"G164"},"D3":{"t":"G164"},"D4":{"desc":"L1P"},"D5":{"t":"C150"},"D6":{"t":"G164"},"D7":{"t":"B412"},"D8":{"desc":"L4P"},"D9":{"desc":"A1P"},"DA":{"t":"HUSK"},"DB":{"t":"H269"},"DC":{"t":"BL8"},"DD":{"t":"BE30"},"DE":{"t":"B06"},"DF":{"t":"BE18"},"E0":{"desc":"H4E"},"E1":{"t":"ULAC"},"E2":{"desc":"L1P"},"E4":{"desc":"L1P"},"E5":{"t":"C185"},"E6":{"t":"C208"},"E7":{"t":"BE9L"},"E9":{"t":"C182"},"EA":{"t":"C82R"},"EB":{"t":"PA32"},"ED":{"t":"P28A"},"EE":{"desc":"L1P"},"F2":{"desc":"L1P","t":"ULAC"},"F3":{"desc":"L2P"},"F4":{"t":"HUSK"},"F5":{"t":"BL8"},"F6":{"desc":"A1P"},"F7":{"desc":"L1P"},"F9":{"desc":"H4E"},"FA":{"t":"BALL"},"FB":{"desc":"L1P"},"FC":{"t":"GLID"},"FD":{"t":"BE9L"},"FE":{"t":"PA44"},"FF":{"desc":"H4E"}}
|
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"00":{"desc":"L1P"},"01":{"t":"C150"},"02":{"t":"C150"},"03":{"desc":"L1P"},"04":{"t":"C150"},"05":{"t":"PA18"},"06":{"desc":"L4P"},"09":{"t":"PA34"},"0B":{"desc":"L2P"},"0C":{"t":"PA18"},"0D":{"desc":"H1T","t":"B47G"},"0E":{"t":"M20T"},"0F":{"t":"TAYB"},"10":{"desc":"L1P"},"11":{"desc":"L2T"},"12":{"t":"M20T"},"13":{"t":"P32R"},"14":{"desc":"L1P"},"15":{"t":"L8"},"16":{"t":"C208"},"17":{"t":"C182"},"18":{"desc":"L1P"},"19":{"desc":"L1P"},"1A":{"t":"P28A"},"1B":{"t":"BALL"},"1C":{"t":"C172"},"1D":{"desc":"L1P"},"1E":{"desc":"L1P"},"1F":{"desc":"L1P"},"20":{"desc":"L1P"},"21":{"t":"P28A"},"22":{"t":"H269"},"23":{"desc":"L1P"},"24":{"t":"C177"},"25":{"t":"H269"},"26":{"t":"M20P"},"27":{"t":"CH7A"},"28":{"desc":"H1P"},"29":{"t":"H269"},"2A":{"t":"J4"},"2B":{"t":"BE35"},"2C":{"t":"BALL"},"2D":{"t":"T210"},"2E":{"t":"GLID"},"2F":{"t":"PA18"},"30":{"t":"B25"},"31":{"desc":"H1P"},"32":{"desc":"L1P"},"33":{"t":"CH7A"},"34":{"t":"C185"},"35":{"t":"C172"},"36":{"t":"PA34"},"37":{"t":"M7"},"38":{"t":"L8"},"39":{"t":"M7"},"3A":{"t":"ST75"},"3B":{"t":"H500"},"3C":{"t":"H269"},"3D":{"t":"BALL"},"3E":{"t":"BE55"},"3F":{"t":"C172"},"40":{"t":"BE58"},"41":{"t":"PA34"},"42":{"desc":"L4P"},"43":{"t":"H269"},"44":{"t":"P28R"},"45":{"desc":"H2T"},"46":{"t":"M7"},"47":{"t":"C177"},"48":{"t":"M7"},"49":{"t":"M20P"},"4A":{"t":"T6"},"4B":{"t":"C150"},"4C":{"t":"C150"},"4E":{"t":"COL4"},"4F":{"t":"C150"},"50":{"t":"TNAV"},"51":{"desc":"L1P"},"53":{"t":"M7"},"54":{"t":"T6"},"55":{"t":"C195"},"56":{"t":"CH7A"},"57":{"t":"C185"},"58":{"t":"GLID"},"59":{"t":"M20T"},"5A":{"desc":"L1P"},"5B":{"t":"PA18"},"5C":{"t":"UH12"},"5D":{"desc":"L2P"},"5E":{"desc":"L1P"},"5F":{"t":"PA23"},"60":{"t":"P28R"},"61":{"t":"BALL"},"62":{"t":"C172"},"63":{"t":"S61"},"64":{"t":"GC1"},"65":{"desc":"L2P"},"66":{"t":"BE33"},"67":{"t":"P28R"},"68":{"t":"C414"},"69":{"t":"M20P"},"6A":{"t":"BALL"},"6B":{"t":"C150"},"6C":{"t":"UH1"},"6D":{"t":"C170"},"6E":{"t":"T6"},"6F":{"t":"C150"},"70":{"t":"BALL"},"71":{"desc":"L2P"},"72":{"t":"M7"},"73":{"t":"C150"},"74":{"desc":"A1E"},"75":{"desc":"L1P"},"76":{"t":"M20P"},"77":{"t":"T6"},"78":{"t":"C190"},"79":{"t":"CH7A"},"7A":{"t":"M7"},"7B":{"t":"C140"},"7C":{"t":"PA34"},"7D":{"desc":"L1P"},"7E":{"desc":"L1P"},"7F":{"t":"M7"},"80":{"desc":"L2T"},"81":{"t":"M7"},"83":{"t":"UH1"},"84":{"t":"BALL"},"85":{"t":"C180"},"86":{"t":"J5"},"87":{"t":"PA34"},"88":{"t":"M20P"},"89":{"t":"BE35"},"8A":{"t":"PA34"},"8B":{"t":"C180"},"8C":{"t":"C150"},"8D":{"t":"J3"},"8E":{"t":"T34P"},"8F":{"t":"O1"},"90":{"desc":"L1P"},"91":{"t":"O1"},"92":{"t":"O1"},"93":{"t":"C172"},"94":{"t":"C150"},"95":{"t":"CH7A"},"96":{"t":"C150"},"97":{"desc":"L1P"},"98":{"t":"PA18"},"99":{"t":"M20P"},"9A":{"t":"B06"},"9B":{"desc":"H1P"},"9C":{"t":"CH7A"},"9D":{"t":"M20P"},"9E":{"desc":"L2P"},"9F":{"desc":"S1P","t":"AR15"},"A0":{"desc":"L1P"},"A1":{"t":"L8"},"A2":{"desc":"A1P"},"A3":{"t":"C337"},"A4":{"desc":"L2P"},"A5":{"t":"PA23"},"A6":{"t":"C310"},"A7":{"t":"M7"},"A8":{"t":"TAYD"},"A9":{"desc":"L1P"},"AA":{"t":"PA34"},"AB":{"t":"C206"},"AC":{"t":"BE55"},"AD":{"t":"M20P"},"AE":{"t":"C182"},"AF":{"t":"M20T"},"B0":{"t":"CH7A"},"B1":{"t":"CH7A"},"B2":{"t":"C150"},"B3":{"desc":"L1P"},"B4":{"t":"C150"},"B5":{"t":"C150"},"B6":{"t":"CH7A"},"B7":{"t":"C206"},"B8":{"t":"VALI"},"B9":{"t":"C150"},"BA":{"desc":"L1P"},"BB":{"t":"PA18"},"BC":{"t":"M20P"},"BF":{"t":"BL8"},"C0":{"t":"C172"},"C1":{"t":"BALL"},"C2":{"t":"P28A"},"C4":{"t":"L8"},"C5":{"t":"M20P"},"C6":{"t":"ST75"},"C7":{"t":"J3"},"C8":{"t":"M20T"},"C9":{"t":"C310"},"CA":{"t":"BALL"},"CB":{"t":"M20P"},"CC":{"desc":"L2P"},"CD":{"t":"M20P"},"CE":{"t":"T206"},"CF":{"t":"NAVI"},"D0":{"t":"P28A"},"D1":{"desc":"L1P"},"D2":{"desc":"L1P"},"D3":{"desc":"L1P"},"D4":{"desc":"L2P"},"D5":{"desc":"L1P"},"D7":{"t":"C140"},"D8":{"t":"T34P"},"D9":{"t":"C150"},"DA":{"t":"C150"},"DB":{"t":"C172"},"DC":{"t":"M20P"},"DD":{"desc":"L1P"},"DE":{"t":"M20T"},"DF":{"t":"BE18"},"E0":{"t":"T6"},"E1":{"t":"C195"},"E2":{"t":"CH7B"},"E3":{"t":"C185"},"E4":{"t":"DC3"},"E5":{"t":"P28A"},"E6":{"desc":"L1P"},"E7":{"desc":"L1P"},"E8":{"t":"M20P"},"E9":{"t":"P28A"},"EA":{"t":"M7"},"EB":{"desc":"L1P"},"EC":{"t":"P28S"},"ED":{"t":"P32R"},"EE":{"desc":"L1P"},"EF":{"t":"M7"},"F0":{"t":"M7"},"F1":{"desc":"L1P"},"F2":{"t":"BE55"},"F3":{"t":"AA1"},"F4":{"t":"M7"},"F5":{"t":"GLID"},"F6":{"desc":"L1P"},"F7":{"desc":"L1P"},"F8":{"t":"B06"},"F9":{"t":"C150"},"FA":{"t":"C150"},"FB":{"t":"H269"},"FD":{"desc":"L2P"},"FE":{"t":"C150"},"FF":{"t":"C150"}}
|
||||
{"00":{"desc":"L1P"},"01":{"t":"C150"},"02":{"t":"C150"},"03":{"desc":"L1P"},"04":{"t":"C150"},"05":{"t":"PA18"},"06":{"desc":"L4P"},"09":{"t":"PA34"},"0B":{"desc":"L2P"},"0C":{"t":"PA18"},"0D":{"desc":"H1T","t":"B47G"},"0E":{"t":"M20T"},"0F":{"t":"TAYB"},"10":{"desc":"L1P"},"11":{"desc":"L2T"},"12":{"t":"M20T"},"13":{"t":"P32R"},"14":{"desc":"L1P"},"15":{"t":"L8"},"16":{"t":"C208"},"17":{"t":"C182"},"18":{"desc":"L1P"},"19":{"desc":"L1P"},"1A":{"t":"P28A"},"1B":{"t":"BALL"},"1C":{"t":"C172"},"1D":{"desc":"L1P"},"1E":{"desc":"L1P"},"1F":{"desc":"L1P"},"20":{"desc":"L1P"},"21":{"t":"P28A"},"22":{"t":"H269"},"23":{"desc":"L1P"},"24":{"t":"C177"},"25":{"t":"H269"},"26":{"t":"M20P"},"27":{"t":"CH7A"},"28":{"desc":"H1P"},"29":{"t":"H269"},"2A":{"t":"J4"},"2B":{"t":"BE35"},"2C":{"t":"BALL"},"2D":{"t":"T210"},"2E":{"t":"GLID"},"2F":{"t":"PA18"},"30":{"t":"B25"},"31":{"desc":"H1P"},"32":{"desc":"L1P"},"33":{"t":"CH7A"},"34":{"t":"C185"},"35":{"t":"C172"},"36":{"desc":"L2T"},"37":{"t":"M7"},"38":{"t":"L8"},"39":{"t":"M7"},"3A":{"t":"ST75"},"3B":{"t":"H500"},"3C":{"t":"H269"},"3D":{"t":"BALL"},"3E":{"t":"BE55"},"3F":{"t":"C172"},"40":{"t":"BE58"},"41":{"t":"PA34"},"42":{"desc":"L4P"},"43":{"t":"H269"},"44":{"t":"P28R"},"45":{"desc":"H2T"},"46":{"t":"M7"},"47":{"t":"C177"},"48":{"t":"M7"},"49":{"t":"M20P"},"4A":{"t":"T6"},"4B":{"t":"C150"},"4C":{"t":"C150"},"4E":{"t":"COL4"},"4F":{"t":"C150"},"50":{"t":"TNAV"},"51":{"desc":"L1P"},"53":{"t":"M7"},"54":{"t":"T6"},"55":{"t":"C195"},"56":{"t":"CH7A"},"57":{"t":"C185"},"58":{"t":"GLID"},"59":{"t":"M20T"},"5A":{"desc":"L1P"},"5B":{"t":"PA18"},"5C":{"t":"UH12"},"5D":{"desc":"L2P"},"5E":{"desc":"L1P"},"5F":{"t":"PA23"},"60":{"t":"P28R"},"61":{"t":"BALL"},"62":{"t":"C172"},"63":{"t":"S61"},"64":{"t":"GC1"},"65":{"desc":"L2P"},"66":{"t":"BE33"},"67":{"t":"P28R"},"68":{"t":"C414"},"69":{"t":"M20P"},"6A":{"t":"BALL"},"6B":{"t":"C150"},"6C":{"t":"UH1"},"6D":{"t":"C170"},"6E":{"t":"T6"},"6F":{"t":"C150"},"70":{"t":"BALL"},"71":{"desc":"L2P"},"72":{"t":"M7"},"73":{"t":"C150"},"74":{"desc":"A1E"},"75":{"desc":"L1P"},"76":{"t":"M20P"},"77":{"t":"T6"},"78":{"t":"C190"},"79":{"t":"CH7A"},"7A":{"t":"M7"},"7B":{"t":"C140"},"7C":{"t":"PA34"},"7D":{"desc":"L1P"},"7E":{"desc":"L1P"},"7F":{"t":"M7"},"80":{"desc":"L2T"},"81":{"t":"M7"},"83":{"t":"UH1"},"84":{"t":"BALL"},"85":{"t":"C180"},"86":{"t":"J5"},"87":{"t":"PA34"},"88":{"t":"M20P"},"89":{"t":"BE35"},"8A":{"t":"PA34"},"8B":{"t":"C180"},"8C":{"t":"C150"},"8D":{"t":"J3"},"8E":{"t":"T34P"},"8F":{"t":"O1"},"90":{"desc":"L1P"},"91":{"t":"O1"},"92":{"t":"O1"},"93":{"t":"C172"},"94":{"t":"C150"},"95":{"t":"CH7A"},"96":{"t":"C150"},"97":{"desc":"L1P"},"98":{"t":"PA18"},"99":{"t":"M20P"},"9A":{"t":"B06"},"9B":{"desc":"H1P"},"9C":{"t":"CH7A"},"9D":{"t":"M20P"},"9E":{"desc":"L2P"},"9F":{"desc":"S1P","t":"AR15"},"A0":{"desc":"L1P"},"A1":{"t":"L8"},"A2":{"desc":"A1P"},"A3":{"t":"C337"},"A4":{"desc":"L2P"},"A5":{"t":"PA23"},"A6":{"t":"C310"},"A7":{"t":"M7"},"A8":{"t":"TAYD"},"A9":{"desc":"L1P"},"AA":{"t":"PA34"},"AB":{"desc":"L2T"},"AC":{"t":"BE55"},"AD":{"t":"M20P"},"AE":{"t":"C182"},"AF":{"t":"M20T"},"B0":{"t":"CH7A"},"B1":{"t":"CH7A"},"B2":{"t":"C150"},"B3":{"desc":"L1P"},"B4":{"t":"C150"},"B5":{"t":"C150"},"B6":{"t":"CH7A"},"B7":{"t":"C206"},"B8":{"t":"VALI"},"B9":{"t":"C150"},"BA":{"desc":"L1P"},"BB":{"t":"PA18"},"BC":{"t":"M20P"},"BF":{"t":"BL8"},"C0":{"t":"C172"},"C1":{"t":"BALL"},"C2":{"t":"P28A"},"C4":{"t":"L8"},"C5":{"t":"M20P"},"C6":{"t":"ST75"},"C7":{"t":"J3"},"C8":{"t":"M20T"},"C9":{"t":"C310"},"CA":{"t":"BALL"},"CB":{"t":"M20P"},"CC":{"desc":"L2P"},"CD":{"t":"M20P"},"CE":{"t":"T206"},"CF":{"t":"NAVI"},"D0":{"t":"P28A"},"D1":{"desc":"L1P"},"D2":{"desc":"L1P"},"D3":{"desc":"L1P"},"D4":{"desc":"L2P"},"D5":{"desc":"L1P"},"D7":{"t":"C140"},"D8":{"t":"T34P"},"D9":{"t":"C150"},"DA":{"t":"C150"},"DB":{"t":"C172"},"DC":{"t":"M20P"},"DD":{"desc":"L1P"},"DE":{"t":"M20T"},"DF":{"t":"BE18"},"E0":{"t":"T6"},"E1":{"t":"C195"},"E2":{"t":"CH7B"},"E3":{"t":"C185"},"E4":{"t":"DC3"},"E5":{"t":"P28A"},"E6":{"desc":"L1P"},"E7":{"desc":"L1P"},"E8":{"t":"M20P"},"E9":{"t":"P28A"},"EA":{"t":"M7"},"EB":{"desc":"L1P"},"EC":{"t":"P28S"},"ED":{"t":"P32R"},"EE":{"desc":"L1P"},"EF":{"t":"M7"},"F0":{"t":"M7"},"F1":{"desc":"L1P"},"F2":{"t":"BE55"},"F3":{"t":"AA1"},"F4":{"t":"M7"},"F5":{"t":"GLID"},"F6":{"desc":"L1P"},"F7":{"desc":"L1P"},"F8":{"t":"B06"},"F9":{"t":"C150"},"FA":{"t":"C150"},"FB":{"t":"H269"},"FD":{"desc":"L2P"},"FE":{"t":"C150"},"FF":{"t":"C150"}}
|
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"00":{"t":"C414"},"01":{"desc":"L1P"},"02":{"t":"BALL"},"03":{"desc":"L2J","t":"LR31"},"04":{"desc":"L1P"},"05":{"t":"C182"},"06":{"desc":"L1P","t":"ULAC"},"07":{"t":"F2TH"},"08":{"desc":"L1P"},"09":{"t":"BE33"},"0A":{"t":"COL4"},"0B":{"t":"PA22"},"0C":{"t":"C185"},"0D":{"t":"PA34"},"0E":{"desc":"L1P"},"0F":{"desc":"L1P"},"10":{"desc":"L1J"},"11":{"t":"BE35"},"12":{"t":"BE50"},"13":{"t":"PA24"},"14":{"desc":"L1P"},"15":{"t":"J3"},"16":{"desc":"L1P"},"17":{"desc":"L1P"},"18":{"t":"FA62"},"19":{"t":"GLID"},"1A":{"t":"PA38"},"1B":{"t":"B06"},"1C":{"t":"BL8"},"1E":{"desc":"L2T"},"1F":{"t":"UH12"},"20":{"t":"PA24"},"21":{"t":"P28R"},"22":{"desc":"L1P"},"23":{"t":"AA1"},"24":{"t":"YK11"},"25":{"desc":"L1P"},"26":{"t":"BE18"},"27":{"desc":"L1P"},"28":{"desc":"L1P"},"29":{"desc":"L1P"},"2A":{"t":"C310"},"2B":{"desc":"L1P"},"2C":{"desc":"L1P"},"2D":{"t":"C180"},"2E":{"t":"C421"},"2F":{"desc":"L1P"},"30":{"t":"B06"},"31":{"desc":"L1P"},"32":{"desc":"L2T"},"33":{"desc":"L1P"},"35":{"desc":"L1P"},"36":{"t":"PA22"},"37":{"t":"BE9L"},"38":{"t":"PA22"},"39":{"desc":"L1P"},"3A":{"desc":"L1P"},"3B":{"t":"BE55"},"3C":{"t":"GLID"},"3D":{"t":"C182"},"3E":{"t":"BE35"},"3F":{"t":"CRJ7"},"40":{"desc":"L1P"},"41":{"t":"BE58"},"42":{"t":"BE35"},"43":{"t":"PA22"},"44":{"t":"PA34"},"45":{"t":"PA27"},"46":{"t":"BE9L"},"47":{"t":"B14A"},"48":{"t":"GLID"},"49":{"t":"DC3"},"4A":{"t":"BE35"},"4B":{"t":"M4"},"4C":{"desc":"L1P"},"4D":{"t":"EC30"},"4E":{"desc":"A1P"},"4F":{"t":"GC1"},"50":{"desc":"L1P"},"52":{"t":"BE58"},"53":{"desc":"L1P"},"54":{"t":"E300"},"56":{"desc":"L1P"},"57":{"desc":"L1P"},"58":{"t":"C310"},"59":{"t":"T210"},"5A":{"t":"BE35"},"5B":{"desc":"H1P"},"5C":{"desc":"L1P"},"5D":{"t":"BE55"},"5E":{"desc":"L1P"},"5F":{"t":"B06"},"60":{"t":"C182"},"61":{"desc":"L1P"},"62":{"t":"P28R"},"63":{"desc":"L1P"},"64":{"t":"C150"},"65":{"t":"BE35"},"66":{"t":"EC30"},"67":{"t":"C182"},"68":{"t":"BL8"},"69":{"t":"BE9L"},"6A":{"t":"PA25"},"6B":{"desc":"L2P"},"6C":{"t":"VALI"},"6D":{"desc":"H1T"},"6E":{"desc":"L1P"},"6F":{"t":"NAVI"},"70":{"desc":"L1P"},"71":{"desc":"L1P"},"72":{"t":"C152"},"73":{"desc":"L1P"},"74":{"t":"J3"},"75":{"desc":"L1P"},"76":{"t":"CH7B"},"77":{"t":"BE35"},"78":{"desc":"L1P"},"79":{"desc":"L1P"},"7A":{"t":"P28A"},"7B":{"t":"C337"},"7C":{"t":"BE35"},"7D":{"t":"P28A"},"7E":{"desc":"L1P"},"7F":{"t":"C210"},"80":{"t":"GLID"},"81":{"t":"C150"},"83":{"t":"C680"},"84":{"t":"GLID"},"85":{"desc":"L1P"},"86":{"t":"C310"},"87":{"desc":"L1P"},"88":{"t":"PA34"},"89":{"desc":"L1P"},"8A":{"t":"P28A"},"8B":{"desc":"H1T"},"8C":{"desc":"L1P"},"8D":{"t":"FA7X"},"8E":{"desc":"L1P"},"8F":{"t":"GC1"},"90":{"desc":"L1P"},"91":{"t":"C180"},"92":{"t":"C500"},"93":{"t":"P32R"},"94":{"t":"BE58"},"95":{"desc":"L2T"},"97":{"t":"T6"},"98":{"t":"EC30"},"99":{"t":"PA34"},"9A":{"t":"GLID"},"9B":{"t":"BE18"},"9C":{"t":"HUSK"},"9D":{"desc":"H1T","t":"B47G"},"9E":{"t":"M20T"},"9F":{"desc":"A1P","t":"ULAC"},"A0":{"t":"HUSK"},"A1":{"desc":"H4E"},"A2":{"desc":"L1P"},"A3":{"t":"C340"},"A4":{"t":"BE35"},"A5":{"desc":"L1P"},"A6":{"t":"PA27"},"A7":{"t":"C182"},"A8":{"t":"M20P"},"A9":{"desc":"L1P"},"AA":{"t":"PA18"},"AB":{"t":"BE10"},"AC":{"t":"BE35"},"AD":{"t":"GLID"},"AE":{"desc":"L1P"},"AF":{"t":"GLID"},"B0":{"desc":"L1P"},"B1":{"t":"BE35"},"B2":{"t":"C402"},"B3":{"desc":"L1P"},"B4":{"t":"C150"},"B5":{"t":"P28R"},"B6":{"t":"AA5"},"B7":{"t":"CH7B"},"B8":{"desc":"L1P"},"B9":{"t":"GLID"},"BA":{"desc":"H1P"},"BB":{"t":"P28A"},"BC":{"desc":"L1P"},"BD":{"t":"GLID"},"BE":{"desc":"L1P"},"BF":{"desc":"L1P"},"C0":{"desc":"H1P"},"C1":{"t":"BE55"},"C2":{"t":"BE36"},"C4":{"t":"GLID"},"C5":{"t":"M20T"},"C6":{"desc":"L1P"},"C7":{"t":"BE50"},"C8":{"desc":"L1P"},"C9":{"desc":"H1P"},"CA":{"t":"EC30"},"CB":{"t":"T210"},"CC":{"t":"BE35"},"CD":{"t":"C172"},"CE":{"t":"R22"},"CF":{"desc":"H1T"},"D0":{"t":"T210"},"D1":{"t":"PA32"},"D2":{"t":"PA30"},"D3":{"t":"HUSK"},"D4":{"desc":"L2P"},"D5":{"t":"C210"},"D6":{"t":"C25B"},"D7":{"desc":"L1P"},"D8":{"desc":"L1P"},"D9":{"t":"GLID"},"DA":{"desc":"L1P"},"DB":{"desc":"L1P"},"DC":{"desc":"L1P"},"DD":{"t":"GLID"},"DE":{"desc":"L1P"},"DF":{"desc":"L1P"},"E0":{"desc":"L1P"},"E1":{"t":"WW24"},"E2":{"t":"DA42"},"E3":{"t":"EC30"},"E4":{"desc":"L1P"},"E5":{"t":"BE36"},"E6":{"t":"AA5"},"E7":{"desc":"L1P"},"E8":{"t":"M20P"},"EA":{"t":"SBR1"},"EB":{"t":"P28B"},"EC":{"t":"C404"},"ED":{"desc":"L1P"},"EE":{"desc":"L1P"},"EF":{"t":"C172"},"F0":{"desc":"L1P"},"F1":{"t":"GLID"},"F2":{"desc":"L1P"},"F3":{"t":"BL8"},"F4":{"desc":"L1P"},"F5":{"t":"M20P"},"F6":{"desc":"L1P"},"F7":{"t":"J3"},"F8":{"t":"P28R"},"F9":{"t":"C441"},"FA":{"t":"C500"},"FB":{"t":"C210"},"FC":{"desc":"H1T"},"FD":{"desc":"H1P"},"FE":{"desc":"L1P"},"FF":{"t":"PA24"}}
|
||||
{"00":{"t":"C414"},"01":{"desc":"L1P"},"02":{"t":"BALL"},"03":{"desc":"L2J","t":"LR31"},"04":{"desc":"L1P"},"05":{"t":"C182"},"06":{"desc":"L1P","t":"ULAC"},"07":{"t":"F2TH"},"08":{"desc":"L1P"},"09":{"t":"BE33"},"0A":{"t":"COL4"},"0B":{"t":"PA22"},"0C":{"t":"C185"},"0D":{"t":"PA34"},"0E":{"desc":"L1P"},"0F":{"desc":"L1P"},"10":{"desc":"L1J"},"11":{"t":"BE35"},"12":{"t":"BE50"},"13":{"t":"PA24"},"14":{"desc":"L1P"},"15":{"t":"J3"},"16":{"desc":"L1P"},"17":{"desc":"L1P"},"18":{"t":"FA62"},"19":{"t":"GLID"},"1A":{"t":"PA38"},"1B":{"t":"B06"},"1C":{"t":"BL8"},"1E":{"desc":"L2T"},"1F":{"t":"UH12"},"20":{"t":"PA24"},"21":{"t":"P28R"},"22":{"desc":"L1P"},"23":{"t":"AA1"},"24":{"t":"YK11"},"25":{"desc":"L1P"},"26":{"t":"BE18"},"27":{"desc":"L1P"},"28":{"desc":"L1P"},"29":{"desc":"L1P"},"2A":{"t":"C310"},"2B":{"desc":"L1P"},"2C":{"desc":"L1P"},"2D":{"t":"C180"},"2E":{"t":"C421"},"2F":{"desc":"L1P"},"30":{"t":"B06"},"31":{"desc":"L1P"},"32":{"desc":"L2T"},"33":{"desc":"L1P"},"35":{"desc":"L1P"},"36":{"t":"PA22"},"37":{"t":"BE9L"},"38":{"t":"PA22"},"39":{"desc":"L1P"},"3A":{"desc":"L1P"},"3B":{"t":"BE55"},"3C":{"t":"GLID"},"3D":{"t":"C182"},"3E":{"t":"BE35"},"3F":{"t":"CRJ7"},"40":{"desc":"L1P"},"41":{"t":"BE58"},"42":{"t":"BE35"},"43":{"t":"PA22"},"44":{"t":"PA34"},"45":{"t":"PA27"},"46":{"t":"BE9L"},"47":{"t":"B14A"},"48":{"t":"GLID"},"49":{"t":"DC3"},"4A":{"t":"BE35"},"4B":{"t":"M4"},"4C":{"desc":"L1P"},"4D":{"t":"EC30"},"4E":{"desc":"A1P"},"4F":{"t":"GC1"},"50":{"desc":"L1P"},"52":{"t":"BE58"},"53":{"desc":"L1P"},"54":{"t":"E300"},"56":{"desc":"L1P"},"57":{"desc":"L1P"},"58":{"t":"C310"},"59":{"t":"T210"},"5A":{"t":"BE35"},"5B":{"desc":"H1P"},"5C":{"desc":"L1P"},"5D":{"t":"BE55"},"5E":{"desc":"L1P"},"5F":{"t":"B06"},"60":{"t":"C182"},"61":{"desc":"L1P"},"62":{"t":"P28R"},"63":{"desc":"L1P"},"64":{"t":"C150"},"65":{"t":"BE35"},"66":{"t":"EC30"},"67":{"t":"C182"},"68":{"t":"BL8"},"69":{"t":"BE9L"},"6A":{"t":"PA25"},"6B":{"desc":"L2P"},"6C":{"t":"VALI"},"6D":{"desc":"H1T"},"6E":{"desc":"L1P"},"6F":{"t":"NAVI"},"70":{"desc":"L1P"},"71":{"desc":"L1P"},"72":{"t":"C152"},"73":{"desc":"L1P"},"74":{"t":"J3"},"75":{"desc":"L1P"},"76":{"t":"CH7B"},"77":{"t":"BE35"},"78":{"desc":"L1P"},"79":{"desc":"L1P"},"7A":{"t":"P28A"},"7B":{"t":"C337"},"7C":{"t":"BE35"},"7D":{"t":"P28A"},"7E":{"desc":"L1P"},"7F":{"t":"C210"},"80":{"t":"GLID"},"81":{"t":"C150"},"83":{"t":"C680"},"84":{"t":"GLID"},"85":{"desc":"L1P"},"86":{"t":"C310"},"87":{"desc":"L1P"},"88":{"t":"PA34"},"89":{"desc":"L1P"},"8A":{"t":"P28A"},"8B":{"desc":"H1T"},"8C":{"desc":"L1P"},"8D":{"t":"FA7X"},"8E":{"desc":"L1P"},"8F":{"t":"GC1"},"90":{"desc":"L1P"},"91":{"t":"C180"},"92":{"t":"C500"},"93":{"t":"P32R"},"94":{"t":"BE58"},"95":{"desc":"L2T"},"96":{"t":"R44"},"97":{"t":"T6"},"98":{"t":"EC30"},"99":{"t":"PA34"},"9A":{"t":"GLID"},"9B":{"t":"BE35"},"9C":{"t":"HUSK"},"9D":{"desc":"H1T","t":"B47G"},"9E":{"t":"M20T"},"9F":{"desc":"A1P","t":"ULAC"},"A0":{"t":"HUSK"},"A1":{"desc":"H4E"},"A2":{"desc":"L1P"},"A3":{"t":"C340"},"A4":{"t":"BE35"},"A5":{"desc":"L1P"},"A6":{"t":"PA27"},"A7":{"t":"C182"},"A8":{"t":"M20P"},"A9":{"desc":"L1P"},"AA":{"t":"PA18"},"AB":{"t":"BE10"},"AC":{"t":"BE35"},"AD":{"t":"GLID"},"AE":{"desc":"L1P"},"AF":{"t":"GLID"},"B0":{"desc":"L1P"},"B1":{"t":"BE35"},"B2":{"t":"C402"},"B3":{"desc":"L1P"},"B4":{"t":"C150"},"B5":{"t":"P28R"},"B6":{"t":"AA5"},"B7":{"t":"CH7B"},"B8":{"desc":"L1P"},"B9":{"t":"GLID"},"BA":{"desc":"H1P"},"BB":{"t":"P28A"},"BC":{"desc":"L1P"},"BD":{"t":"GLID"},"BE":{"desc":"L1P"},"BF":{"desc":"L1P"},"C0":{"desc":"H1P"},"C1":{"t":"BE55"},"C2":{"t":"BE36"},"C4":{"t":"GLID"},"C5":{"t":"M20T"},"C6":{"desc":"L1P"},"C7":{"t":"BE50"},"C8":{"desc":"L1P"},"C9":{"desc":"H1P"},"CA":{"t":"EC30"},"CB":{"t":"T210"},"CC":{"t":"BE35"},"CD":{"t":"C172"},"CE":{"t":"R22"},"CF":{"desc":"H1T"},"D0":{"t":"T210"},"D1":{"t":"PA32"},"D2":{"t":"PA30"},"D3":{"t":"HUSK"},"D4":{"desc":"L2P"},"D5":{"t":"C210"},"D6":{"t":"C25B"},"D7":{"desc":"L1P"},"D8":{"desc":"L1P"},"D9":{"t":"GLID"},"DA":{"desc":"L1P"},"DB":{"desc":"L1P"},"DC":{"desc":"L1P"},"DD":{"t":"GLID"},"DE":{"desc":"L1P"},"DF":{"desc":"L1P"},"E0":{"desc":"L1P"},"E1":{"t":"WW24"},"E2":{"t":"DA42"},"E3":{"t":"EC30"},"E4":{"desc":"L1P"},"E5":{"t":"BE36"},"E6":{"t":"AA5"},"E7":{"desc":"L1P"},"E8":{"t":"M20P"},"E9":{"desc":"L1T"},"EA":{"t":"SBR1"},"EB":{"t":"P28B"},"EC":{"t":"C404"},"ED":{"desc":"L1P"},"EE":{"desc":"L1P"},"EF":{"t":"C172"},"F0":{"desc":"L1P"},"F1":{"t":"GLID"},"F2":{"desc":"L1P"},"F3":{"t":"BL8"},"F4":{"desc":"L1P"},"F5":{"t":"M20P"},"F6":{"desc":"L1P"},"F7":{"t":"J3"},"F8":{"t":"P28R"},"F9":{"t":"C441"},"FA":{"t":"C500"},"FB":{"t":"C210"},"FC":{"desc":"H1T"},"FD":{"desc":"H1P"},"FE":{"desc":"L1P"},"FF":{"t":"PA24"}}
|
|
@ -1 +1 @@
|
|||
{"01":{"desc":"L1P"},"02":{"desc":"H1P"},"03":{"desc":"L1P","t":"ULAC"},"05":{"t":"SR22"},"06":{"desc":"L1P"},"07":{"t":"C150"},"08":{"t":"MITE"},"09":{"t":"GLID"},"0A":{"desc":"L1P"},"0B":{"t":"UH1"},"0C":{"desc":"L1P"},"0D":{"t":"BE55"},"0E":{"t":"BL8"},"11":{"desc":"L1P"},"12":{"desc":"L1P"},"13":{"t":"C172"},"14":{"desc":"L1P"},"15":{"desc":"H1T"},"17":{"desc":"L1P","t":"ULAC"},"18":{"t":"P28A"},"1A":{"desc":"H1P"},"1B":{"t":"RC3"},"1C":{"t":"C402"},"1D":{"t":"PC12"},"1E":{"t":"M20P"},"1F":{"t":"SR22"},"20":{"t":"PA22"},"21":{"desc":"L1P"},"22":{"t":"EA50"},"23":{"desc":"L1P"},"24":{"t":"P337"},"25":{"desc":"L1P"},"26":{"desc":"L1P"},"27":{"t":"C182"},"28":{"desc":"L1P"},"29":{"desc":"L1P"},"2A":{"desc":"L1P"},"2C":{"t":"PA31"},"2D":{"desc":"L1P"},"2E":{"desc":"L1P"},"2F":{"t":"SR22"},"30":{"t":"CH7A"},"31":{"t":"T206"},"33":{"t":"J3"},"34":{"desc":"L1P"},"35":{"desc":"L1P"},"36":{"t":"PA30"},"37":{"t":"PA27"},"38":{"desc":"L1P"},"3A":{"desc":"L1P"},"3B":{"t":"EC30"},"3C":{"t":"EC30"},"3D":{"t":"EC30"},"3E":{"t":"EC30"},"3F":{"t":"EC30"},"40":{"t":"EC30"},"42":{"t":"EC30"},"43":{"t":"EC30"},"44":{"t":"EC30"},"45":{"t":"EC30"},"46":{"t":"EC30"},"47":{"t":"BE19"},"48":{"desc":"L2P"},"49":{"t":"GLID"},"4A":{"t":"PA30"},"4B":{"t":"EC30"},"4C":{"t":"EC30"},"4D":{"t":"EC30"},"4E":{"t":"EC30"},"4F":{"t":"EC30"},"51":{"t":"C195"},"52":{"t":"R44"},"53":{"desc":"L1P"},"54":{"t":"B14C"},"55":{"t":"GLID"},"56":{"desc":"L1P"},"57":{"t":"L8"},"58":{"desc":"L1P"},"59":{"desc":"L1P"},"5A":{"t":"PA34"},"5B":{"desc":"L1P"},"5C":{"t":"BT36"},"5D":{"t":"BT36"},"5E":{"desc":"H1P"},"5F":{"t":"C402"},"60":{"t":"GLID"},"61":{"desc":"L1P"},"62":{"desc":"L1P"},"63":{"t":"BE35"},"64":{"desc":"L1P","t":"ULAC"},"65":{"desc":"L1P"},"66":{"desc":"L1P"},"67":{"t":"BE18"},"68":{"t":"M20P"},"69":{"desc":"L1P"},"6A":{"t":"PA11"},"6B":{"t":"GLID"},"6C":{"t":"PA31"},"6D":{"t":"BE95"},"6E":{"desc":"L1P"},"6F":{"desc":"L1P"},"70":{"desc":"L1P"},"71":{"desc":"L1P"},"72":{"t":"T6"},"73":{"desc":"L2T"},"74":{"desc":"L1P"},"75":{"t":"C310"},"76":{"t":"SR22"},"77":{"t":"BE9L"},"78":{"t":"B407"},"79":{"t":"C172"},"7A":{"desc":"L4P"},"7B":{"desc":"L1P"},"7C":{"desc":"L1P"},"7D":{"t":"C550"},"7E":{"desc":"L1P"},"7F":{"t":"GLID"},"80":{"desc":"L1P"},"81":{"t":"BE55"},"82":{"t":"GLID"},"83":{"t":"BE20"},"84":{"t":"GLID"},"85":{"desc":"L1P"},"86":{"t":"T210"},"87":{"t":"PA27"},"88":{"t":"E55P"},"89":{"desc":"L1P"},"8A":{"desc":"L1P"},"8B":{"t":"C25B"},"8C":{"t":"C310"},"8D":{"desc":"L1T"},"8E":{"t":"BALL"},"8F":{"t":"C501"},"90":{"t":"BE9L"},"91":{"desc":"L1P"},"92":{"desc":"H1T"},"93":{"desc":"L2J"},"94":{"desc":"L2J","t":"LR60"},"95":{"t":"AEST"},"96":{"t":"GLID"},"97":{"t":"B06"},"98":{"t":"GLID"},"99":{"t":"GLID"},"9A":{"desc":"L1P"},"9B":{"t":"TAYB"},"9C":{"t":"GLID"},"9D":{"desc":"H1P"},"9E":{"t":"BE40"},"9F":{"desc":"L1P"},"A0":{"t":"C25B"},"A2":{"desc":"L2J","t":"LR35"},"A3":{"t":"M7"},"A4":{"desc":"L1P"},"A5":{"desc":"L2J"},"A6":{"t":"HUSK"},"A7":{"t":"H25B"},"A8":{"t":"BALL"},"A9":{"desc":"L2T"},"AA":{"desc":"L1P"},"AB":{"desc":"H1T"},"AD":{"t":"BALL"},"AE":{"t":"PA31"},"AF":{"t":"GLID"},"B1":{"t":"BALL"},"B5":{"t":"C175"},"B6":{"desc":"L1P"},"B7":{"desc":"L1P"},"B8":{"t":"BE60"},"B9":{"desc":"L1P","t":"TRIN"},"BA":{"t":"GLID"},"BB":{"t":"C421"},"BC":{"t":"BE35"},"BD":{"t":"B47G"},"BE":{"t":"C337"},"BF":{"t":"BE55"},"C0":{"desc":"L1P"},"C1":{"desc":"L2P"},"C2":{"t":"TNAV"},"C3":{"desc":"L1P"},"C4":{"desc":"H1T"},"C5":{"t":"GLID"},"C6":{"t":"C182"},"C7":{"t":"S108"},"C9":{"t":"M20P"},"CA":{"desc":"L1P"},"CB":{"desc":"L1P"},"CC":{"t":"C182"},"CD":{"t":"BE36"},"CE":{"t":"SR22"},"CF":{"t":"FA20"},"D0":{"t":"PA31"},"D1":{"desc":"L1P"},"D2":{"desc":"L1P"},"D3":{"t":"BE95"},"D4":{"t":"BE40"},"D5":{"desc":"L1P"},"D6":{"t":"C182"},"D9":{"t":"BALL"},"DA":{"t":"F900"},"DB":{"t":"BE9T"},"DC":{"t":"BE36"},"DD":{"desc":"L1P"},"DE":{"desc":"L1P"},"DF":{"t":"P337"},"E0":{"desc":"L1P"},"E1":{"t":"UH1"},"E3":{"t":"BE55"},"E4":{"t":"GLID"},"E5":{"desc":"L1P"},"E6":{"t":"PA27"},"E7":{"t":"PT22"},"E8":{"desc":"L1P","t":"SP18"},"E9":{"desc":"L1P"},"EA":{"t":"H269"},"EB":{"desc":"L1P"},"EC":{"desc":"L1P","t":"SP18"},"EE":{"desc":"L1P"},"EF":{"t":"GLID"},"F2":{"desc":"L1P"},"F3":{"desc":"L1P"},"F4":{"t":"L39"},"F5":{"desc":"L1P"},"F6":{"desc":"H1T"},"F7":{"desc":"L1P"},"F8":{"desc":"L1P"},"F9":{"t":"SR20"},"FB":{"desc":"L1P"},"FC":{"desc":"L2P"},"FD":{"t":"CH7B"},"FE":{"desc":"L1P"}}
|
||||
{"01":{"desc":"L1P"},"02":{"desc":"H1P"},"03":{"desc":"L1P","t":"ULAC"},"05":{"t":"SR22"},"06":{"desc":"L1P"},"07":{"t":"C150"},"08":{"t":"MITE"},"09":{"t":"GLID"},"0A":{"desc":"L1P"},"0B":{"t":"UH1"},"0C":{"desc":"L1P"},"0D":{"t":"BE55"},"0E":{"t":"BL8"},"11":{"desc":"L1P"},"12":{"desc":"H2T"},"13":{"t":"C172"},"14":{"desc":"L1P"},"15":{"desc":"H1T"},"17":{"desc":"L1P","t":"ULAC"},"18":{"t":"P28A"},"1A":{"desc":"H1P"},"1B":{"t":"RC3"},"1C":{"t":"C402"},"1D":{"t":"PC12"},"1E":{"t":"M20P"},"1F":{"t":"SR22"},"20":{"t":"PA22"},"21":{"desc":"L1P"},"22":{"t":"EA50"},"23":{"desc":"L1P"},"24":{"t":"P337"},"25":{"desc":"L1P"},"26":{"desc":"L1P"},"27":{"t":"C182"},"28":{"desc":"L1P"},"29":{"desc":"L1P"},"2A":{"desc":"L1P"},"2C":{"t":"PA31"},"2D":{"desc":"L1P"},"2E":{"desc":"L1P"},"2F":{"t":"SR22"},"30":{"t":"CH7A"},"31":{"t":"T206"},"33":{"t":"J3"},"34":{"desc":"L1P"},"35":{"desc":"L1P"},"36":{"t":"PA30"},"37":{"t":"PA27"},"38":{"desc":"L1P"},"39":{"t":"EC30"},"3A":{"desc":"L1P"},"3B":{"t":"EC30"},"3C":{"t":"EC30"},"3D":{"t":"EC30"},"3E":{"t":"EC30"},"3F":{"t":"EC30"},"40":{"t":"EC30"},"42":{"t":"EC30"},"43":{"t":"EC30"},"44":{"t":"EC30"},"45":{"t":"EC30"},"46":{"t":"EC30"},"47":{"t":"BE19"},"48":{"desc":"L2P"},"49":{"t":"GLID"},"4A":{"t":"PA30"},"4B":{"t":"EC30"},"4C":{"desc":"L1P"},"4D":{"t":"EC30"},"4E":{"t":"EC30"},"4F":{"t":"EC30"},"51":{"t":"C195"},"52":{"t":"R44"},"53":{"desc":"L1P"},"54":{"t":"B14C"},"55":{"t":"GLID"},"56":{"desc":"L1P"},"57":{"t":"L8"},"58":{"desc":"L1P"},"59":{"desc":"L1P"},"5A":{"t":"PA34"},"5B":{"desc":"L1P"},"5C":{"t":"BT36"},"5D":{"t":"BT36"},"5E":{"desc":"H1P"},"5F":{"t":"C402"},"60":{"t":"GLID"},"61":{"desc":"L1P"},"62":{"desc":"L1P"},"63":{"t":"BE35"},"64":{"desc":"L1P","t":"ULAC"},"65":{"desc":"L1P"},"66":{"desc":"L1P"},"67":{"t":"BE18"},"68":{"t":"M20P"},"69":{"desc":"L1P"},"6A":{"t":"PA11"},"6B":{"t":"GLID"},"6C":{"t":"PA31"},"6D":{"t":"BE95"},"6E":{"desc":"L1P"},"6F":{"desc":"L1P"},"70":{"desc":"L1P"},"71":{"desc":"L1P"},"72":{"t":"T6"},"73":{"desc":"L2T"},"74":{"desc":"L1P"},"75":{"t":"C310"},"76":{"t":"SR22"},"77":{"t":"BE9L"},"78":{"t":"B407"},"79":{"t":"RV12"},"7A":{"desc":"L4P"},"7B":{"desc":"L1P"},"7C":{"desc":"L1P"},"7D":{"t":"C550"},"7E":{"desc":"L1P"},"7F":{"t":"GLID"},"80":{"desc":"L1P"},"81":{"t":"BE55"},"82":{"t":"GLID"},"83":{"t":"BE20"},"84":{"t":"GLID"},"85":{"desc":"L1P"},"86":{"t":"T210"},"87":{"t":"PA27"},"88":{"t":"E55P"},"89":{"desc":"L1P"},"8A":{"desc":"L1P"},"8B":{"t":"C25B"},"8C":{"t":"C310"},"8D":{"desc":"L1T"},"8E":{"t":"BALL"},"8F":{"t":"C501"},"90":{"t":"BE9L"},"91":{"desc":"L1P"},"92":{"desc":"H1T"},"93":{"desc":"L2J"},"94":{"desc":"L2J","t":"LR60"},"95":{"t":"AEST"},"96":{"t":"GLID"},"97":{"t":"B06"},"98":{"t":"GLID"},"99":{"t":"GLID"},"9A":{"desc":"L1P"},"9B":{"t":"TAYB"},"9C":{"t":"GLID"},"9D":{"desc":"H1P"},"9E":{"t":"BE40"},"9F":{"desc":"L1P"},"A0":{"t":"C25B"},"A2":{"desc":"L2J","t":"LR35"},"A3":{"t":"M7"},"A4":{"desc":"L1P"},"A5":{"desc":"L2J"},"A6":{"t":"HUSK"},"A7":{"t":"H25B"},"A8":{"t":"BALL"},"A9":{"desc":"L2T"},"AA":{"desc":"L1P"},"AB":{"desc":"H1T"},"AD":{"t":"BALL"},"AE":{"t":"PA31"},"AF":{"t":"GLID"},"B1":{"t":"BALL"},"B5":{"t":"C175"},"B6":{"desc":"L1P"},"B7":{"desc":"L1P"},"B8":{"t":"BE60"},"B9":{"desc":"L1P","t":"TRIN"},"BA":{"t":"GLID"},"BB":{"t":"C421"},"BC":{"t":"BE35"},"BD":{"t":"B47G"},"BE":{"t":"C337"},"BF":{"t":"BE55"},"C0":{"desc":"L1P"},"C1":{"desc":"L2P"},"C2":{"t":"TNAV"},"C3":{"desc":"L1P"},"C4":{"desc":"H1T"},"C5":{"t":"GLID"},"C6":{"t":"C182"},"C7":{"t":"S108"},"C9":{"t":"M20P"},"CA":{"desc":"L1P"},"CB":{"desc":"L1P"},"CC":{"t":"C182"},"CD":{"t":"BE36"},"CE":{"t":"SR22"},"CF":{"t":"FA20"},"D0":{"t":"PA31"},"D1":{"desc":"L1P"},"D2":{"desc":"L1P"},"D3":{"t":"BE95"},"D4":{"t":"BE40"},"D5":{"desc":"L1P"},"D6":{"t":"C182"},"D9":{"t":"BALL"},"DA":{"t":"F900"},"DB":{"t":"BE9T"},"DC":{"t":"BE36"},"DD":{"desc":"L1P"},"DE":{"desc":"L1P"},"DF":{"t":"P337"},"E0":{"desc":"L1P"},"E1":{"t":"UH1"},"E3":{"t":"BE55"},"E4":{"t":"GLID"},"E5":{"desc":"L1P"},"E6":{"t":"PA27"},"E7":{"t":"PT22"},"E8":{"desc":"L1P","t":"SP18"},"E9":{"desc":"L1P"},"EA":{"t":"H269"},"EB":{"desc":"L1P"},"EC":{"desc":"L1P","t":"SP18"},"EE":{"desc":"L1P"},"EF":{"t":"GLID"},"F1":{"desc":"L2J"},"F2":{"desc":"L1P"},"F3":{"desc":"L1P"},"F4":{"t":"L39"},"F5":{"desc":"L1P"},"F6":{"desc":"H1T"},"F7":{"desc":"L1P"},"F8":{"desc":"L1P"},"F9":{"t":"SR20"},"FB":{"desc":"L1P"},"FC":{"desc":"L2P"},"FD":{"t":"CH7B"},"FE":{"desc":"L1P"}}
|
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"00":{"t":"B190"},"01":{"desc":"L1P"},"02":{"t":"P28A"},"03":{"desc":"L1P"},"04":{"desc":"L1P"},"05":{"t":"C500"},"06":{"desc":"L2P"},"07":{"desc":"L1P"},"08":{"t":"CH7B"},"09":{"t":"C525"},"0A":{"t":"GLID"},"0B":{"t":"B429"},"0C":{"t":"PC12"},"0D":{"t":"C210"},"0E":{"t":"C185"},"0F":{"t":"COL3"},"10":{"desc":"L1P"},"11":{"t":"FA20"},"13":{"t":"C411"},"14":{"desc":"L1P"},"15":{"desc":"L1P","t":"ULAC"},"17":{"t":"BE76"},"18":{"t":"BE35"},"19":{"t":"C414"},"1C":{"t":"C185"},"1D":{"t":"GLID"},"1E":{"t":"C140"},"1F":{"t":"BE58"},"20":{"t":"SR22"},"21":{"t":"BE35"},"22":{"t":"PA31"},"23":{"desc":"L1P"},"24":{"desc":"L1P"},"25":{"t":"C182"},"26":{"t":"AEST"},"27":{"t":"BE35"},"29":{"t":"C180"},"2A":{"t":"P28R"},"2B":{"t":"GLF4"},"2C":{"t":"GLID"},"2D":{"t":"PA18"},"2E":{"t":"PAY2"},"2F":{"desc":"L1E"},"30":{"t":"BE35"},"31":{"desc":"L1P"},"32":{"t":"BE40"},"33":{"t":"C182"},"34":{"desc":"L2T"},"35":{"desc":"L2P"},"36":{"desc":"L1P"},"37":{"t":"PA18"},"38":{"desc":"L2J"},"39":{"t":"M20P"},"3A":{"t":"C182"},"3B":{"t":"M20P"},"3C":{"desc":"L1T"},"3D":{"desc":"L1P"},"3E":{"t":"P28R"},"3F":{"desc":"L1P"},"40":{"t":"PA27"},"41":{"desc":"L1P"},"42":{"t":"B762"},"43":{"desc":"H1P"},"44":{"desc":"L1P"},"45":{"t":"UH1"},"46":{"t":"AEST"},"47":{"t":"PA24"},"48":{"t":"SR22"},"49":{"desc":"L1P"},"4A":{"desc":"L1P"},"4B":{"t":"B350"},"4C":{"desc":"L1T"},"4D":{"desc":"A1E"},"4E":{"t":"PA24"},"4F":{"t":"C310"},"50":{"desc":"L1P"},"51":{"t":"BE35"},"52":{"desc":"L1P"},"53":{"desc":"H1P"},"54":{"t":"PA31"},"55":{"t":"BE55"},"56":{"desc":"A1P"},"57":{"desc":"L1P"},"58":{"desc":"L1P"},"59":{"t":"BE30"},"5A":{"t":"P28A"},"5B":{"t":"BE9T"},"5C":{"desc":"L1P"},"5D":{"t":"ASTR"},"5E":{"desc":"L2P"},"5F":{"t":"GLF3"},"60":{"t":"SR22"},"61":{"desc":"L1P"},"62":{"desc":"L1P"},"63":{"t":"M20T"},"64":{"t":"C172"},"65":{"t":"C185"},"66":{"t":"C185"},"67":{"t":"C650"},"68":{"t":"GLF3"},"69":{"t":"P28R"},"6A":{"t":"PA32"},"6B":{"t":"BE55"},"6C":{"desc":"L1P"},"6D":{"t":"C82R"},"6E":{"t":"BE55"},"6F":{"t":"B06"},"70":{"t":"BE55"},"71":{"t":"CL60"},"72":{"t":"AC90"},"73":{"t":"GLID"},"74":{"t":"AS50"},"75":{"t":"P28R"},"77":{"t":"P28A"},"78":{"desc":"L1P"},"79":{"t":"AEST"},"7B":{"t":"BE9L"},"7C":{"t":"BE40"},"80":{"t":"C185"},"81":{"t":"PA31"},"82":{"desc":"L1P"},"83":{"t":"YK52"},"84":{"t":"GLF2"},"85":{"t":"P28R"},"86":{"t":"C182"},"87":{"t":"C182"},"88":{"t":"C182"},"89":{"t":"C550"},"8A":{"t":"BE33"},"8B":{"desc":"L1P"},"8C":{"t":"BE35"},"8D":{"desc":"L1P"},"8E":{"t":"M20P"},"90":{"t":"C402"},"91":{"t":"BE35"},"92":{"t":"C340"},"93":{"t":"C56X"},"94":{"desc":"H1P"},"95":{"t":"BL8"},"96":{"desc":"L1P","t":"ULAC"},"98":{"t":"C140"},"99":{"desc":"L1P"},"9A":{"t":"BALL"},"9B":{"desc":"L1P"},"9C":{"t":"GLF3"},"9D":{"t":"BALL"},"9E":{"t":"P210"},"9F":{"desc":"L2T"},"A0":{"t":"B06"},"A1":{"desc":"L1P"},"A2":{"desc":"L2P"},"A3":{"desc":"L1P"},"A4":{"desc":"L1P"},"A5":{"t":"CH7B"},"A6":{"t":"DA40"},"A7":{"t":"C72R"},"A8":{"t":"E170"},"AA":{"t":"C172"},"AB":{"t":"SR22"},"AD":{"t":"C72R"},"AE":{"desc":"L1P"},"B0":{"desc":"L1P"},"B1":{"t":"FA7X"},"B2":{"t":"ERCO"},"B3":{"t":"BE9L"},"B4":{"desc":"L1P"},"B5":{"t":"C310"},"B6":{"t":"SR22"},"B7":{"desc":"L1P"},"B8":{"t":"C320"},"B9":{"t":"B06"},"BA":{"t":"T34P"},"BB":{"t":"C175"},"BC":{"desc":"L1P"},"BD":{"desc":"L2J"},"BE":{"t":"C510"},"BF":{"desc":"L1P"},"C0":{"t":"M20P"},"C1":{"t":"BE55"},"C2":{"desc":"L1P"},"C3":{"t":"B06"},"C4":{"t":"GLID"},"C6":{"t":"BE55"},"C7":{"t":"PA18"},"C8":{"desc":"L2J"},"C9":{"t":"M5"},"CA":{"t":"BE55"},"CB":{"t":"BE35"},"CC":{"t":"BE9L"},"CD":{"t":"C182"},"CE":{"t":"BE9L"},"CF":{"t":"M7"},"D0":{"desc":"H1J"},"D1":{"t":"BE55"},"D2":{"t":"GLID"},"D3":{"t":"B733"},"D4":{"t":"C25B"},"D5":{"desc":"L2J","t":"LR45"},"D6":{"t":"GLID"},"D7":{"t":"NAVI"},"D8":{"desc":"L1P"},"D9":{"t":"GLID"},"DA":{"desc":"A1T"},"DB":{"desc":"L2J","t":"LR35"},"DC":{"t":"C175"},"DD":{"t":"R22"},"DE":{"t":"C425"},"DF":{"t":"PAY2"},"E1":{"desc":"L1P"},"E4":{"t":"C170"},"E5":{"t":"AA5"},"E6":{"desc":"L1P"},"E7":{"desc":"L1P"},"E8":{"desc":"L1P"},"E9":{"desc":"L1P"},"EA":{"t":"PA24"},"EB":{"desc":"L1P"},"EC":{"t":"C172"},"ED":{"t":"BE36"},"EE":{"t":"T34P"},"EF":{"desc":"L1P"},"F0":{"desc":"H1P"},"F1":{"desc":"H1T"},"F2":{"t":"C25C"},"F3":{"t":"PRM1"},"F4":{"desc":"L1P"},"F5":{"t":"BL8"},"F6":{"t":"BALL"},"F7":{"t":"P28B"},"F8":{"desc":"L1P"},"F9":{"desc":"L1P"},"FA":{"t":"C140"},"FB":{"desc":"L1P"},"FC":{"t":"BE20"},"FD":{"t":"B350"},"FE":{"t":"BE55"},"FF":{"t":"P28B"}}
|
||||
{"00":{"t":"B190"},"01":{"desc":"L1P"},"02":{"t":"P28A"},"03":{"desc":"L1P"},"04":{"desc":"L1P"},"05":{"t":"C500"},"06":{"desc":"L2P"},"07":{"desc":"L1P"},"08":{"t":"CH7B"},"09":{"t":"C525"},"0A":{"t":"GLID"},"0B":{"t":"B429"},"0C":{"t":"PC12"},"0D":{"t":"C210"},"0E":{"t":"C185"},"0F":{"t":"COL3"},"10":{"desc":"L1P"},"11":{"t":"FA20"},"13":{"t":"C411"},"14":{"desc":"L1P"},"15":{"desc":"L1P","t":"ULAC"},"17":{"t":"BE76"},"18":{"t":"BE35"},"19":{"t":"C414"},"1C":{"t":"C185"},"1D":{"t":"BE9T"},"1E":{"t":"C140"},"1F":{"t":"BE58"},"20":{"t":"SR22"},"21":{"t":"BE35"},"22":{"t":"PA31"},"23":{"desc":"L1P"},"24":{"desc":"L1P"},"25":{"t":"C182"},"26":{"t":"AEST"},"27":{"t":"BE35"},"29":{"t":"C180"},"2A":{"t":"P28R"},"2B":{"t":"GLF4"},"2C":{"t":"GLID"},"2D":{"t":"PA18"},"2E":{"t":"PAY2"},"2F":{"desc":"L1E"},"30":{"t":"BE35"},"31":{"desc":"L1P"},"32":{"t":"BE40"},"33":{"t":"C182"},"34":{"desc":"L2T"},"35":{"desc":"L2P"},"36":{"desc":"L1P"},"37":{"t":"PA18"},"38":{"desc":"L2J"},"39":{"t":"M20P"},"3A":{"t":"C182"},"3B":{"t":"M20P"},"3C":{"desc":"L1T"},"3D":{"desc":"L1P"},"3E":{"t":"P28R"},"3F":{"desc":"L1P"},"40":{"t":"PA27"},"41":{"desc":"L1P"},"42":{"t":"B762"},"43":{"desc":"H1P"},"44":{"desc":"L1P"},"45":{"t":"UH1"},"46":{"t":"AEST"},"47":{"t":"PA24"},"48":{"t":"SR22"},"49":{"desc":"L1P"},"4A":{"desc":"L1P"},"4B":{"t":"B350"},"4C":{"desc":"L1T"},"4D":{"desc":"A1E"},"4E":{"t":"PA24"},"4F":{"t":"C310"},"50":{"desc":"L1P"},"51":{"t":"BE35"},"52":{"desc":"L1P"},"53":{"desc":"H1P"},"54":{"t":"PA31"},"55":{"t":"BE55"},"56":{"desc":"A1P"},"57":{"desc":"L1P"},"58":{"desc":"L1P"},"59":{"desc":"L2J","t":"LR60"},"5A":{"t":"P28A"},"5B":{"t":"BE9T"},"5C":{"desc":"L1P"},"5D":{"t":"ASTR"},"5E":{"desc":"L2P"},"5F":{"t":"GLF3"},"60":{"t":"SR22"},"61":{"desc":"L1P"},"62":{"desc":"L1P"},"63":{"t":"M20T"},"64":{"t":"C172"},"65":{"t":"C185"},"66":{"t":"C185"},"67":{"t":"C650"},"68":{"t":"GLF3"},"69":{"t":"P28R"},"6A":{"t":"PA32"},"6B":{"t":"BE55"},"6C":{"desc":"L1P"},"6D":{"t":"C82R"},"6E":{"t":"BE55"},"6F":{"t":"B06"},"70":{"t":"BE55"},"71":{"t":"CL60"},"72":{"t":"AC90"},"73":{"t":"GLID"},"74":{"t":"AS50"},"75":{"t":"P28R"},"77":{"t":"P28A"},"78":{"desc":"L1P"},"79":{"t":"AEST"},"7B":{"t":"BE9L"},"7C":{"t":"BE40"},"80":{"t":"C185"},"81":{"t":"PA31"},"82":{"desc":"L1P"},"83":{"t":"YK52"},"84":{"t":"GLF2"},"85":{"t":"P28R"},"86":{"t":"C182"},"87":{"t":"C182"},"88":{"t":"C182"},"89":{"t":"C550"},"8A":{"t":"BE33"},"8B":{"desc":"L1P"},"8C":{"t":"BE35"},"8D":{"desc":"L1P"},"8E":{"t":"M20P"},"90":{"t":"C402"},"91":{"t":"BE35"},"92":{"t":"C340"},"93":{"t":"C56X"},"94":{"desc":"H1P"},"95":{"t":"BL8"},"96":{"desc":"L1P","t":"ULAC"},"98":{"t":"C140"},"99":{"desc":"L1P"},"9A":{"t":"BALL"},"9B":{"desc":"L1P"},"9C":{"t":"GLF3"},"9D":{"t":"BALL"},"9E":{"t":"P210"},"9F":{"desc":"L2T"},"A0":{"t":"B06"},"A1":{"desc":"L1P"},"A2":{"desc":"L2P"},"A3":{"desc":"L1P"},"A4":{"desc":"L1P"},"A5":{"t":"CH7B"},"A6":{"t":"DA40"},"A7":{"t":"C72R"},"A8":{"t":"E170"},"AA":{"t":"C172"},"AB":{"t":"SR22"},"AD":{"t":"C72R"},"AE":{"desc":"L1P"},"B0":{"desc":"L1P"},"B1":{"t":"FA7X"},"B2":{"t":"ERCO"},"B3":{"t":"BE9L"},"B4":{"desc":"L1P"},"B5":{"t":"C310"},"B6":{"t":"SR22"},"B7":{"desc":"L1P"},"B8":{"t":"C320"},"B9":{"t":"B06"},"BA":{"t":"T34P"},"BB":{"t":"C175"},"BC":{"desc":"L1P"},"BD":{"desc":"L2J"},"BE":{"t":"C510"},"BF":{"desc":"L1P"},"C0":{"t":"M20P"},"C1":{"t":"BE55"},"C2":{"desc":"L1P"},"C3":{"t":"B06"},"C4":{"t":"GLID"},"C6":{"t":"BE55"},"C7":{"t":"PA18"},"C8":{"desc":"L2J"},"C9":{"t":"M5"},"CA":{"t":"BE55"},"CB":{"t":"BE35"},"CC":{"t":"BE9L"},"CD":{"t":"C182"},"CE":{"t":"BE9L"},"CF":{"t":"M7"},"D0":{"desc":"H1J"},"D1":{"t":"BE55"},"D2":{"t":"GLID"},"D3":{"t":"B733"},"D4":{"t":"C25B"},"D5":{"desc":"L2J","t":"LR45"},"D6":{"t":"GLID"},"D7":{"t":"NAVI"},"D8":{"desc":"L1P"},"D9":{"t":"GLID"},"DA":{"desc":"A1T"},"DB":{"desc":"L2J","t":"LR35"},"DC":{"t":"C175"},"DD":{"t":"R22"},"DE":{"t":"C425"},"DF":{"t":"PAY2"},"E1":{"desc":"L1P"},"E4":{"t":"C170"},"E5":{"t":"AA5"},"E6":{"t":"PA18"},"E7":{"desc":"L1P"},"E8":{"desc":"L1P"},"E9":{"desc":"L1P"},"EA":{"t":"PA24"},"EB":{"desc":"L1P"},"EC":{"t":"C172"},"ED":{"t":"C550"},"EE":{"t":"T34P"},"EF":{"desc":"L1P"},"F0":{"desc":"H1P"},"F1":{"desc":"H1T"},"F2":{"t":"C25C"},"F3":{"t":"PRM1"},"F4":{"desc":"L1P"},"F5":{"t":"BL8"},"F6":{"t":"BALL"},"F7":{"t":"P28B"},"F8":{"desc":"L1P"},"F9":{"desc":"L1P"},"FA":{"t":"C140"},"FB":{"desc":"L1P"},"FC":{"t":"BE20"},"FD":{"t":"B350"},"FE":{"t":"BE55"},"FF":{"t":"P28B"}}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"00":{"t":"M20P"},"01":{"t":"M20P"},"04":{"t":"M20P"},"06":{"t":"M20P"},"08":{"t":"M20P"},"09":{"t":"M20P"},"0B":{"t":"M20P"},"0C":{"t":"M20P"},"0D":{"t":"M20P"},"0E":{"t":"M20P"},"0F":{"t":"M20P"},"10":{"t":"M20P"},"11":{"t":"M20P"},"12":{"desc":"H1P"},"13":{"t":"BE23"},"14":{"t":"L8"},"15":{"t":"BE95"},"16":{"desc":"L1P"},"17":{"t":"C310"},"18":{"t":"BALL"},"19":{"t":"C182"},"1A":{"t":"C208"},"1B":{"t":"BALL"},"1C":{"t":"BALL"},"1D":{"t":"BE23"},"1E":{"t":"J3"},"1F":{"t":"C140"},"20":{"t":"PA23"},"21":{"t":"C77R"},"22":{"t":"BALL"},"23":{"t":"T210"},"24":{"desc":"A1P"},"25":{"t":"M4"},"26":{"t":"C414"},"27":{"t":"BE33"},"28":{"t":"C182"},"29":{"t":"C172"},"2A":{"t":"P28A"},"2B":{"t":"C182"},"2C":{"t":"J2"},"2D":{"t":"C172"},"2E":{"t":"C172"},"30":{"t":"C172"},"31":{"t":"C172"},"32":{"t":"BE76"},"33":{"t":"C82R"},"34":{"t":"C172"},"35":{"t":"M20P"},"36":{"t":"H269"},"37":{"t":"L8"},"38":{"t":"BE95"},"39":{"t":"BE35"},"3A":{"t":"CH7A"},"3B":{"t":"BALL"},"3C":{"desc":"L1P"},"3D":{"desc":"L1P"},"3E":{"t":"BALL"},"3F":{"t":"L8"},"40":{"desc":"L1P"},"41":{"desc":"L1J"},"42":{"t":"C140"},"43":{"desc":"L1P"},"44":{"t":"C77R"},"45":{"t":"C182"},"46":{"t":"T210"},"47":{"desc":"L1P"},"48":{"t":"SSAB"},"49":{"t":"SSAB"},"4A":{"t":"BALL"},"4B":{"t":"C182"},"4C":{"t":"BALL"},"4D":{"t":"C56X"},"4E":{"desc":"L1P"},"4F":{"t":"C172"},"50":{"t":"J2"},"51":{"desc":"L1P"},"52":{"t":"J2"},"53":{"t":"C172"},"54":{"t":"C177"},"55":{"t":"C172"},"56":{"t":"ULAC"},"57":{"t":"BE24"},"58":{"desc":"L1P"},"59":{"t":"BE24"},"5A":{"t":"BE24"},"5B":{"t":"GLEX"},"5C":{"t":"BE35"},"5D":{"t":"C172"},"5E":{"t":"C182"},"5F":{"t":"C182"},"60":{"t":"WACF"},"61":{"t":"BALL"},"62":{"t":"BE19"},"63":{"desc":"A1P"},"64":{"t":"J3"},"65":{"t":"BE23"},"66":{"t":"SHIP"},"67":{"t":"C77R"},"68":{"t":"C182"},"69":{"t":"T210"},"6A":{"t":"C172"},"6B":{"t":"M4"},"6C":{"t":"C140"},"6D":{"t":"BE35"},"6E":{"t":"C182"},"6F":{"t":"C182"},"70":{"t":"BALL"},"71":{"t":"BE23"},"72":{"t":"C172"},"73":{"desc":"L1P"},"74":{"t":"C172"},"75":{"t":"C177"},"76":{"t":"BE76"},"77":{"t":"C182"},"78":{"t":"C177"},"79":{"t":"BALL"},"7A":{"desc":"L2P"},"7B":{"desc":"L1P"},"7C":{"t":"BE19"},"7D":{"t":"L8"},"7E":{"desc":"L1P"},"7F":{"t":"BE35"},"80":{"t":"CH7A"},"81":{"t":"BALL"},"82":{"t":"BE19"},"83":{"t":"ERCO"},"84":{"t":"BALL"},"85":{"desc":"L1P"},"86":{"desc":"A1P"},"87":{"t":"BALL"},"88":{"t":"BE23"},"89":{"t":"PA23"},"8A":{"t":"C208"},"8B":{"t":"C182"},"8C":{"t":"C210"},"8D":{"t":"ERCO"},"8E":{"t":"M4"},"8F":{"t":"BE76"},"90":{"t":"BE35"},"91":{"t":"C182"},"92":{"t":"C172"},"93":{"t":"C208"},"94":{"t":"H269"},"95":{"t":"BE76"},"96":{"t":"C172"},"97":{"t":"C172"},"98":{"t":"T6"},"99":{"t":"BE24"},"9A":{"t":"C172"},"9B":{"desc":"L1P"},"9C":{"t":"ULAC"},"9D":{"t":"C172"},"9E":{"t":"C180"},"9F":{"t":"BALL"},"A0":{"t":"L8"},"A1":{"t":"BE95"},"A2":{"t":"BE23"},"A3":{"t":"C172"},"A4":{"t":"BALL"},"A5":{"t":"BE24"},"A6":{"t":"ERCO"},"A7":{"t":"BALL"},"A8":{"t":"B412"},"A9":{"desc":"A1P"},"AA":{"t":"J3"},"AB":{"t":"C140"},"AC":{"t":"PA18"},"AD":{"t":"C77R"},"AE":{"t":"C182"},"AF":{"t":"C182"},"B0":{"t":"H269"},"B1":{"t":"M20P"},"B2":{"t":"C120"},"B3":{"t":"ULAC"},"B4":{"t":"C182"},"B5":{"t":"SR20"},"B6":{"desc":"L1P"},"B7":{"desc":"H2T"},"B8":{"t":"C172"},"B9":{"t":"C177"},"BA":{"t":"C172"},"BB":{"t":"C172"},"BC":{"t":"C177"},"BD":{"t":"BALL"},"BE":{"t":"J3"},"BF":{"t":"BE55"},"C0":{"t":"J3"},"C1":{"desc":"H4E"},"C2":{"t":"C208"},"C3":{"t":"L8"},"C4":{"t":"BE36"},"C5":{"t":"BE35"},"C6":{"t":"CH7A"},"C7":{"t":"BALL"},"C8":{"desc":"L1P"},"C9":{"t":"ERCO"},"CA":{"t":"BALL"},"CB":{"t":"BE36"},"CC":{"desc":"H1P"},"CD":{"t":"BALL"},"CE":{"desc":"L1P"},"CF":{"t":"C182"},"D0":{"t":"C77R"},"D1":{"t":"C182"},"D2":{"t":"T210"},"D3":{"t":"BE33"},"D4":{"t":"M4"},"D5":{"t":"BE35"},"D6":{"t":"BE35"},"D7":{"t":"C182"},"D8":{"t":"C172"},"D9":{"t":"BALL"},"DA":{"t":"J2"},"DB":{"t":"C177"},"DC":{"t":"C172"},"DD":{"desc":"L1P"},"DE":{"t":"C172"},"DF":{"t":"C172"},"E0":{"t":"J3"},"E1":{"t":"C172"},"E2":{"t":"C172"},"E3":{"t":"C172"},"E4":{"desc":"L1P"},"E5":{"t":"FA7X"},"E6":{"t":"L8"},"E7":{"t":"BE55"},"E8":{"t":"BE35"},"E9":{"t":"CH7A"},"EA":{"t":"AT5T"},"EB":{"desc":"L1T"},"EC":{"t":"BALL"},"ED":{"t":"BALL"},"EE":{"t":"BE55"},"EF":{"t":"BALL"},"F0":{"t":"J3"},"F1":{"t":"BE36"},"F2":{"t":"PA23"},"F3":{"desc":"L1P"},"F4":{"t":"C182"},"F5":{"desc":"A1P"},"F6":{"desc":"H1P"},"F7":{"t":"M4"},"F8":{"t":"C120"},"F9":{"desc":"A1P"},"FA":{"t":"C182"},"FB":{"t":"BE35"},"FC":{"t":"C150"},"FD":{"t":"BE35"},"FE":{"t":"J2"},"FF":{"t":"C310"}}
|
||||
{"00":{"t":"M20P"},"01":{"t":"M20P"},"04":{"t":"M20P"},"06":{"t":"M20P"},"08":{"t":"M20P"},"09":{"t":"M20P"},"0B":{"t":"M20P"},"0C":{"t":"M20P"},"0D":{"t":"M20P"},"0E":{"t":"M20P"},"0F":{"t":"M20P"},"10":{"t":"M20P"},"11":{"t":"M20P"},"12":{"desc":"H1P"},"13":{"t":"BE23"},"14":{"t":"L8"},"15":{"t":"BE95"},"16":{"desc":"L1P"},"17":{"t":"C310"},"18":{"t":"BALL"},"19":{"t":"C182"},"1A":{"t":"C208"},"1B":{"t":"BALL"},"1C":{"t":"BALL"},"1D":{"t":"BE23"},"1E":{"t":"J3"},"1F":{"t":"C140"},"20":{"t":"PA23"},"21":{"t":"C77R"},"22":{"t":"BALL"},"23":{"t":"T210"},"24":{"desc":"A1P"},"25":{"t":"M4"},"26":{"t":"C414"},"27":{"t":"BE33"},"28":{"t":"C182"},"29":{"t":"C172"},"2A":{"t":"P28A"},"2B":{"t":"C182"},"2C":{"t":"J2"},"2D":{"t":"C172"},"2E":{"t":"C172"},"30":{"t":"C172"},"31":{"t":"C172"},"32":{"t":"BE76"},"33":{"t":"C82R"},"34":{"t":"C172"},"35":{"t":"M20P"},"36":{"t":"H269"},"37":{"t":"L8"},"38":{"t":"BE95"},"39":{"t":"BE35"},"3A":{"t":"CH7A"},"3B":{"t":"BALL"},"3C":{"desc":"L1P"},"3D":{"desc":"L1P"},"3E":{"t":"BALL"},"3F":{"t":"L8"},"40":{"desc":"L1P"},"41":{"desc":"L1J"},"42":{"t":"C140"},"43":{"desc":"L1P"},"44":{"t":"C77R"},"45":{"t":"C182"},"46":{"t":"T210"},"47":{"desc":"L1P"},"48":{"t":"SSAB"},"49":{"t":"SSAB"},"4A":{"t":"BALL"},"4B":{"t":"C182"},"4C":{"t":"BALL"},"4D":{"t":"C56X"},"4E":{"desc":"L1P"},"4F":{"t":"C172"},"50":{"t":"J2"},"51":{"desc":"L1P"},"52":{"t":"J2"},"53":{"t":"C172"},"54":{"t":"C177"},"55":{"t":"C172"},"56":{"desc":"L1P"},"57":{"t":"BE24"},"58":{"desc":"L1P"},"59":{"t":"BE24"},"5A":{"t":"BE24"},"5B":{"t":"GLEX"},"5C":{"t":"BE35"},"5D":{"t":"C172"},"5E":{"t":"C182"},"5F":{"t":"C182"},"60":{"t":"WACF"},"61":{"t":"BALL"},"62":{"t":"BE19"},"63":{"desc":"A1P"},"64":{"t":"J3"},"65":{"t":"BE23"},"66":{"t":"SHIP"},"67":{"t":"C77R"},"68":{"t":"C182"},"69":{"t":"T210"},"6A":{"t":"C172"},"6B":{"t":"M4"},"6C":{"t":"C140"},"6D":{"t":"BE35"},"6E":{"t":"C182"},"6F":{"t":"C182"},"70":{"t":"BALL"},"71":{"t":"BE23"},"72":{"t":"C172"},"73":{"desc":"L1P"},"74":{"t":"C172"},"75":{"t":"C177"},"76":{"t":"BE76"},"77":{"t":"C182"},"78":{"t":"C177"},"79":{"t":"BALL"},"7A":{"desc":"L2P"},"7B":{"desc":"L1P"},"7C":{"t":"BE19"},"7D":{"t":"L8"},"7E":{"desc":"L1P"},"7F":{"t":"BE35"},"80":{"t":"CH7A"},"81":{"t":"BALL"},"82":{"t":"BE19"},"83":{"t":"ERCO"},"84":{"t":"BALL"},"85":{"desc":"L1P"},"86":{"desc":"A1P"},"87":{"t":"BALL"},"88":{"t":"BE23"},"89":{"t":"PA23"},"8A":{"t":"C208"},"8B":{"t":"C182"},"8C":{"t":"C210"},"8D":{"t":"ERCO"},"8E":{"t":"M4"},"8F":{"t":"BE76"},"90":{"t":"BE35"},"91":{"t":"C182"},"92":{"t":"C172"},"93":{"t":"C208"},"94":{"t":"H269"},"95":{"t":"BE76"},"96":{"t":"C172"},"97":{"t":"C172"},"98":{"t":"T6"},"99":{"t":"BE24"},"9A":{"t":"C172"},"9B":{"desc":"L1P"},"9C":{"t":"ULAC"},"9D":{"t":"C172"},"9E":{"t":"C180"},"9F":{"t":"BALL"},"A0":{"t":"L8"},"A1":{"t":"BE95"},"A2":{"t":"BE23"},"A3":{"t":"C172"},"A4":{"t":"BALL"},"A5":{"t":"BE24"},"A6":{"t":"ERCO"},"A7":{"t":"BALL"},"A8":{"t":"B412"},"A9":{"desc":"A1P"},"AA":{"t":"J3"},"AB":{"t":"C140"},"AC":{"t":"PA18"},"AD":{"t":"C77R"},"AE":{"t":"C182"},"AF":{"t":"C182"},"B0":{"t":"H269"},"B1":{"t":"M20P"},"B2":{"t":"C120"},"B3":{"t":"ULAC"},"B4":{"t":"C182"},"B5":{"t":"SR20"},"B6":{"desc":"L1P"},"B7":{"desc":"H2T"},"B8":{"t":"C172"},"B9":{"t":"C177"},"BA":{"t":"C172"},"BB":{"t":"C172"},"BC":{"t":"C177"},"BD":{"t":"BALL"},"BE":{"t":"J3"},"BF":{"t":"BE55"},"C0":{"t":"J3"},"C1":{"desc":"H4E"},"C2":{"t":"C208"},"C3":{"t":"L8"},"C4":{"t":"BE36"},"C5":{"t":"BE35"},"C6":{"t":"CH7A"},"C7":{"t":"BALL"},"C8":{"desc":"L1P"},"C9":{"t":"ERCO"},"CA":{"t":"BALL"},"CB":{"t":"BE36"},"CC":{"desc":"H1P"},"CD":{"t":"BALL"},"CE":{"desc":"L1P"},"CF":{"t":"C182"},"D0":{"t":"C77R"},"D1":{"t":"C182"},"D2":{"t":"T210"},"D3":{"t":"BE33"},"D4":{"t":"M4"},"D5":{"t":"BE35"},"D6":{"t":"BE35"},"D7":{"t":"C182"},"D8":{"t":"C172"},"D9":{"t":"BALL"},"DA":{"t":"J2"},"DB":{"t":"C177"},"DC":{"t":"C172"},"DD":{"desc":"L1P"},"DE":{"t":"C172"},"DF":{"t":"C172"},"E0":{"t":"J3"},"E1":{"t":"C172"},"E2":{"t":"C172"},"E3":{"t":"C172"},"E4":{"desc":"L1P"},"E5":{"t":"FA7X"},"E6":{"t":"L8"},"E7":{"t":"BE55"},"E8":{"t":"BE35"},"E9":{"t":"CH7A"},"EA":{"t":"AT5T"},"EB":{"desc":"L1T"},"EC":{"t":"BALL"},"ED":{"t":"BALL"},"EE":{"t":"BE55"},"EF":{"t":"BALL"},"F0":{"t":"J3"},"F1":{"t":"BE36"},"F2":{"t":"PA23"},"F3":{"desc":"L1P"},"F4":{"t":"C182"},"F5":{"desc":"A1P"},"F6":{"desc":"H1P"},"F7":{"t":"M4"},"F8":{"t":"C120"},"F9":{"desc":"A1P"},"FA":{"t":"C182"},"FB":{"t":"BE35"},"FC":{"t":"C150"},"FD":{"desc":"L2J"},"FE":{"t":"J2"},"FF":{"t":"C310"}}
|
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"00":{"t":"BE35"},"01":{"t":"C182"},"02":{"t":"C172"},"03":{"t":"C150"},"04":{"t":"B06"},"05":{"t":"C172"},"06":{"t":"FA24"},"07":{"t":"BALL"},"08":{"t":"FA24"},"09":{"t":"C172"},"0A":{"t":"C172"},"0B":{"desc":"L1P"},"0C":{"t":"FA24"},"0D":{"desc":"L1P"},"0E":{"desc":"A1E"},"0F":{"desc":"A1P"},"10":{"t":"AT5T"},"11":{"t":"BE33"},"12":{"t":"BE35"},"13":{"t":"CH7A"},"14":{"t":"H269"},"15":{"t":"BE58"},"16":{"t":"H269"},"17":{"t":"C188"},"18":{"t":"L8"},"19":{"t":"BE19"},"1A":{"t":"J3"},"1B":{"t":"C140"},"1C":{"t":"C182"},"1D":{"t":"C77R"},"1E":{"t":"P28A"},"1F":{"t":"C82R"},"20":{"t":"T28"},"21":{"t":"M4"},"22":{"t":"BE36"},"23":{"t":"M20T"},"24":{"t":"BE23"},"25":{"t":"C172"},"26":{"t":"AT8T"},"27":{"t":"C172"},"28":{"desc":"L1P"},"29":{"t":"FA24"},"2A":{"t":"FA24"},"2B":{"t":"C172"},"2C":{"t":"C172"},"2D":{"t":"C172"},"2E":{"t":"C172"},"2F":{"t":"FA24"},"30":{"t":"C82R"},"31":{"desc":"L1P"},"32":{"t":"ULAC"},"33":{"t":"L8"},"34":{"t":"BE55"},"35":{"t":"BE35"},"36":{"t":"CH7A"},"37":{"t":"BALL"},"38":{"t":"C182"},"39":{"t":"ERCO"},"3A":{"t":"AT8T"},"3B":{"t":"BE55"},"3C":{"t":"BE23"},"3D":{"t":"AT3P"},"3E":{"t":"C140"},"3F":{"t":"PA23"},"40":{"t":"H269"},"41":{"desc":"H1T","t":"S92"},"42":{"t":"B06"},"43":{"t":"P28R"},"44":{"t":"M4"},"45":{"t":"BE58"},"46":{"t":"BALL"},"47":{"t":"C182"},"48":{"t":"C172"},"49":{"t":"C150"},"4A":{"t":"C180"},"4B":{"desc":"L1P"},"4C":{"t":"GLID"},"4D":{"desc":"H1T","t":"AT5T"},"4E":{"desc":"H1P"},"4F":{"desc":"L1P"},"50":{"t":"GLID"},"51":{"desc":"L1P"},"52":{"t":"C172"},"53":{"t":"BE55"},"54":{"desc":"L1P"},"55":{"desc":"L2P"},"56":{"desc":"L1P"},"57":{"t":"BE95"},"58":{"t":"H269"},"59":{"t":"C172"},"5A":{"t":"T28"},"5B":{"t":"C182"},"5C":{"desc":"L1P"},"5D":{"t":"T28"},"5E":{"desc":"A1P"},"5F":{"t":"BE95"},"60":{"desc":"L1P"},"61":{"t":"AT5T"},"62":{"t":"H269"},"63":{"t":"BE36"},"64":{"t":"T28"},"65":{"t":"AT8T"},"66":{"t":"H269"},"67":{"t":"M4"},"68":{"t":"C140"},"69":{"t":"BE33"},"6A":{"t":"C56X"},"6B":{"t":"BE35"},"6C":{"t":"C150"},"6D":{"t":"C172"},"6E":{"t":"BE36"},"6F":{"t":"C172"},"70":{"t":"AT5T"},"71":{"t":"BE35"},"72":{"t":"C172"},"73":{"t":"L8"},"74":{"t":"L8"},"75":{"t":"C172"},"76":{"t":"L8"},"77":{"desc":"H1P"},"78":{"t":"BE36"},"79":{"t":"L8"},"7A":{"t":"BALL"},"7B":{"t":"BE35"},"7C":{"t":"AT5T"},"7D":{"t":"BALL"},"7E":{"t":"C182"},"7F":{"desc":"L1P"},"80":{"t":"C188"},"81":{"t":"L8"},"82":{"t":"BE23"},"83":{"t":"J3"},"84":{"t":"BE35"},"85":{"t":"PA23"},"86":{"desc":"L1P"},"87":{"desc":"H1P"},"88":{"t":"T210"},"89":{"desc":"L1P"},"8A":{"t":"M4"},"8B":{"t":"C120"},"8C":{"desc":"H1T"},"8D":{"t":"ULAC"},"8E":{"t":"BALL"},"8F":{"t":"C150"},"90":{"t":"C172"},"91":{"t":"ST75"},"92":{"t":"L8"},"93":{"t":"L8"},"94":{"t":"AT3T"},"95":{"t":"C172"},"96":{"t":"C172"},"97":{"t":"C172"},"98":{"t":"C172"},"99":{"t":"C25A"},"9A":{"t":"CH7A"},"9B":{"t":"T28"},"9C":{"desc":"L1T"},"9D":{"t":"BE18"},"9E":{"desc":"L1P"},"9F":{"t":"AT8T"},"A0":{"desc":"L1P","t":"GLID"},"A1":{"t":"C182"},"A2":{"desc":"L1P"},"A3":{"desc":"L1P"},"A4":{"t":"T28"},"A5":{"t":"BE23"},"A6":{"desc":"L1P"},"A7":{"t":"AT8T"},"A8":{"t":"PA23"},"A9":{"t":"BALL"},"AA":{"desc":"L1P"},"AB":{"t":"C82R"},"AC":{"desc":"L1P"},"AD":{"t":"M4"},"AE":{"t":"C56X"},"AF":{"desc":"L1P"},"B0":{"desc":"L1P"},"B1":{"t":"C172"},"B2":{"t":"C150"},"B3":{"t":"C172"},"B4":{"t":"BALL"},"B5":{"desc":"H1T","t":"S92"},"B6":{"desc":"A1P"},"B7":{"desc":"L1P"},"B8":{"t":"C172"},"B9":{"t":"C172"},"BA":{"t":"T28"},"BB":{"t":"C172"},"BC":{"desc":"L1P","t":"ULAC"},"BD":{"t":"GLID"},"BE":{"t":"B06"},"BF":{"desc":"L1T"},"C0":{"t":"T206"},"C1":{"t":"BE35"},"C2":{"desc":"L1P"},"C3":{"t":"BALL"},"C4":{"t":"C750"},"C5":{"t":"ERCO"},"C6":{"t":"AT8T"},"C7":{"t":"L8"},"C8":{"desc":"A1P"},"C9":{"t":"J3"},"CA":{"t":"C140"},"CB":{"desc":"L1P"},"CC":{"desc":"A1P"},"CD":{"t":"C182"},"CE":{"t":"C82R"},"CF":{"t":"P28R"},"D0":{"t":"BALL"},"D1":{"t":"UH12"},"D2":{"desc":"L1T"},"D3":{"t":"B06"},"D4":{"t":"C172"},"D5":{"t":"C150"},"D6":{"t":"C172"},"D7":{"t":"T28"},"D8":{"t":"L8"},"D9":{"t":"B06"},"DA":{"t":"T34P"},"DB":{"t":"T34P"},"DC":{"t":"L8"},"DD":{"t":"L8"},"DE":{"desc":"H1T","t":"S92"},"DF":{"t":"C172"},"E0":{"desc":"L1J"},"E1":{"desc":"L1P"},"E2":{"t":"B407"},"E3":{"t":"BE18"},"E4":{"t":"BE35"},"E5":{"t":"CH7A"},"E6":{"t":"BALL"},"E7":{"desc":"L1P"},"E8":{"t":"ERCO"},"E9":{"t":"BALL"},"EA":{"t":"BE58"},"EB":{"t":"B06"},"EC":{"t":"P28A"},"ED":{"desc":"L1P"},"EE":{"desc":"L1P","t":"ULAC"},"EF":{"t":"AT8T"},"F0":{"t":"C182"},"F1":{"t":"C172"},"F2":{"desc":"L1P"},"F3":{"t":"M4"},"F4":{"desc":"L1P","t":"ULAC"},"F5":{"t":"GLID"},"F6":{"t":"C182"},"F7":{"t":"BE58"},"F8":{"desc":"L1P"},"F9":{"t":"L8"},"FA":{"t":"H269"},"FB":{"t":"L8"},"FC":{"t":"C172"},"FD":{"desc":"L1P"},"FE":{"desc":"L1P"},"FF":{"desc":"L1P"}}
|
||||
{"00":{"t":"BE35"},"01":{"t":"C182"},"02":{"t":"C172"},"03":{"t":"C150"},"04":{"t":"B06"},"05":{"t":"C172"},"06":{"t":"FA24"},"07":{"t":"BALL"},"08":{"t":"FA24"},"09":{"t":"C172"},"0A":{"t":"C172"},"0B":{"desc":"L1P"},"0C":{"t":"FA24"},"0D":{"desc":"L1P"},"0E":{"desc":"A1E"},"0F":{"desc":"A1P"},"10":{"t":"AT5T"},"11":{"t":"BE33"},"12":{"t":"BE35"},"13":{"t":"CH7A"},"14":{"t":"H269"},"15":{"t":"BE58"},"16":{"t":"H269"},"17":{"t":"C188"},"18":{"t":"L8"},"19":{"t":"BE19"},"1A":{"t":"J3"},"1B":{"t":"C140"},"1C":{"t":"C182"},"1D":{"t":"C77R"},"1E":{"t":"P28A"},"1F":{"t":"C82R"},"20":{"t":"T28"},"21":{"t":"M4"},"22":{"t":"BE36"},"23":{"t":"M20T"},"24":{"t":"BE23"},"25":{"t":"C172"},"26":{"t":"AT8T"},"27":{"t":"C172"},"28":{"desc":"L1P"},"29":{"t":"FA24"},"2A":{"t":"FA24"},"2B":{"t":"C172"},"2C":{"desc":"L1P"},"2D":{"t":"C172"},"2E":{"t":"C172"},"2F":{"t":"FA24"},"30":{"t":"C82R"},"31":{"desc":"L1P"},"32":{"t":"ULAC"},"33":{"t":"L8"},"34":{"t":"BE55"},"35":{"t":"BE35"},"36":{"t":"CH7A"},"37":{"t":"BALL"},"38":{"t":"C182"},"39":{"t":"ERCO"},"3A":{"t":"AT8T"},"3B":{"t":"BE55"},"3C":{"t":"BE23"},"3D":{"t":"AT3P"},"3E":{"t":"C140"},"3F":{"t":"PA23"},"40":{"t":"H269"},"41":{"desc":"L1P"},"42":{"t":"B06"},"43":{"t":"P28R"},"44":{"t":"M4"},"45":{"t":"BE58"},"46":{"t":"BALL"},"47":{"t":"C182"},"48":{"t":"C172"},"49":{"t":"C150"},"4A":{"t":"C180"},"4B":{"desc":"L1P"},"4C":{"t":"GLID"},"4D":{"desc":"H1T","t":"AT5T"},"4E":{"desc":"H1P"},"4F":{"desc":"L1P"},"50":{"t":"GLID"},"51":{"desc":"L1P"},"52":{"t":"C172"},"53":{"t":"BE55"},"54":{"desc":"L1P"},"55":{"desc":"L2P"},"56":{"desc":"L1P"},"57":{"t":"BE95"},"58":{"t":"H269"},"59":{"t":"C172"},"5A":{"t":"T28"},"5B":{"t":"C182"},"5C":{"desc":"L1P"},"5D":{"t":"T28"},"5E":{"desc":"A1P"},"5F":{"t":"BE95"},"60":{"desc":"L1P"},"61":{"t":"AT5T"},"62":{"t":"H269"},"63":{"t":"BE36"},"64":{"t":"T28"},"65":{"t":"AT8T"},"66":{"t":"H269"},"67":{"t":"M4"},"68":{"t":"C140"},"69":{"t":"BE33"},"6A":{"desc":"L1P"},"6B":{"t":"BE35"},"6C":{"t":"C150"},"6D":{"t":"C172"},"6E":{"t":"BE36"},"6F":{"t":"C172"},"70":{"t":"AT5T"},"71":{"t":"BE35"},"72":{"t":"C172"},"73":{"t":"L8"},"74":{"t":"L8"},"75":{"t":"C172"},"76":{"t":"L8"},"77":{"desc":"H1P"},"78":{"t":"BE36"},"79":{"t":"L8"},"7A":{"t":"BALL"},"7B":{"t":"BE35"},"7C":{"t":"AT5T"},"7D":{"t":"BALL"},"7E":{"t":"C182"},"7F":{"desc":"L1P"},"80":{"t":"C188"},"81":{"t":"L8"},"82":{"t":"BE23"},"83":{"t":"J3"},"84":{"t":"BE35"},"85":{"t":"PA23"},"86":{"desc":"L1P"},"87":{"desc":"H1P"},"88":{"t":"T210"},"89":{"desc":"L1P"},"8A":{"t":"M4"},"8B":{"t":"C120"},"8C":{"desc":"H1T"},"8D":{"t":"ULAC"},"8E":{"t":"BALL"},"8F":{"t":"C150"},"90":{"t":"C172"},"91":{"t":"ST75"},"92":{"t":"L8"},"93":{"t":"L8"},"94":{"t":"AT3T"},"95":{"t":"C172"},"96":{"t":"C172"},"97":{"t":"C172"},"98":{"t":"C172"},"99":{"desc":"L1T"},"9A":{"t":"CH7A"},"9B":{"t":"T28"},"9C":{"desc":"L1T"},"9D":{"t":"BE18"},"9E":{"desc":"L1P"},"9F":{"t":"AT8T"},"A0":{"desc":"L1P","t":"GLID"},"A1":{"t":"C182"},"A2":{"desc":"L1P"},"A3":{"desc":"L1P"},"A4":{"t":"T28"},"A5":{"t":"BE23"},"A6":{"desc":"L1P"},"A7":{"t":"AT8T"},"A8":{"t":"PA23"},"A9":{"t":"BALL"},"AA":{"desc":"L1P"},"AB":{"t":"C82R"},"AC":{"desc":"L1P"},"AD":{"t":"M4"},"AE":{"t":"C56X"},"AF":{"desc":"L1P"},"B0":{"desc":"L1P"},"B1":{"t":"C172"},"B2":{"desc":"L1T"},"B3":{"t":"C172"},"B4":{"t":"BALL"},"B5":{"desc":"H1T","t":"S92"},"B6":{"desc":"A1P"},"B7":{"desc":"L1P"},"B8":{"t":"C172"},"B9":{"t":"C172"},"BA":{"t":"T28"},"BB":{"t":"C172"},"BC":{"desc":"L1P","t":"ULAC"},"BD":{"t":"GLID"},"BE":{"t":"B06"},"BF":{"desc":"L1T"},"C0":{"t":"T206"},"C1":{"t":"BE35"},"C2":{"desc":"L1P"},"C3":{"t":"BALL"},"C4":{"t":"C750"},"C5":{"t":"ERCO"},"C6":{"t":"AT8T"},"C7":{"t":"L8"},"C8":{"desc":"A1P"},"C9":{"t":"J3"},"CA":{"t":"C140"},"CB":{"desc":"L1P"},"CC":{"desc":"A1P"},"CD":{"t":"C182"},"CE":{"t":"C82R"},"CF":{"t":"P28R"},"D0":{"t":"BALL"},"D1":{"t":"UH12"},"D2":{"desc":"L1T"},"D3":{"t":"B06"},"D4":{"t":"C172"},"D5":{"t":"C150"},"D6":{"t":"C172"},"D7":{"t":"T28"},"D8":{"t":"L8"},"D9":{"t":"B06"},"DA":{"t":"T34P"},"DB":{"t":"T34P"},"DC":{"t":"L8"},"DD":{"t":"L8"},"DE":{"desc":"H1T","t":"S92"},"DF":{"t":"C172"},"E0":{"desc":"L1J"},"E1":{"desc":"L1P"},"E2":{"t":"B407"},"E3":{"t":"BE18"},"E4":{"t":"BE35"},"E5":{"t":"CH7A"},"E6":{"t":"BALL"},"E7":{"desc":"L1P"},"E8":{"t":"ERCO"},"E9":{"t":"BALL"},"EA":{"t":"BE58"},"EB":{"t":"B06"},"EC":{"t":"P28A"},"ED":{"desc":"L1P"},"EE":{"desc":"L1P","t":"ULAC"},"EF":{"t":"AT8T"},"F0":{"t":"C182"},"F1":{"t":"C172"},"F2":{"desc":"L1P"},"F3":{"t":"M4"},"F4":{"desc":"L1P","t":"ULAC"},"F5":{"t":"GLID"},"F6":{"t":"C182"},"F7":{"t":"BE58"},"F8":{"desc":"L1P"},"F9":{"t":"L8"},"FA":{"t":"H269"},"FB":{"t":"L8"},"FC":{"t":"C172"},"FD":{"desc":"L1P"},"FE":{"desc":"L2J"},"FF":{"desc":"L1P"}}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"00":{"t":"BE35"},"01":{"t":"CH7A"},"02":{"t":"C206"},"03":{"t":"M20T"},"04":{"t":"BALL"},"05":{"t":"H269"},"06":{"t":"GLID"},"07":{"t":"C172"},"08":{"t":"P28U"},"09":{"t":"C140"},"0A":{"t":"PA23"},"0B":{"t":"C77R"},"0C":{"t":"P28A"},"0D":{"t":"C182"},"0E":{"t":"C172"},"0F":{"t":"C182"},"10":{"desc":"L1P"},"11":{"t":"C182"},"12":{"t":"P28T"},"13":{"t":"P28B"},"14":{"desc":"L1P"},"15":{"t":"C208"},"16":{"t":"C182"},"17":{"t":"C172"},"18":{"t":"P32T"},"19":{"t":"C208"},"1A":{"t":"P32T"},"1B":{"t":"PA44"},"1C":{"t":"ULAC"},"1D":{"t":"P28A"},"1E":{"t":"P28A"},"1F":{"desc":"H1P"},"20":{"t":"PA44"},"21":{"t":"P32T"},"22":{"t":"CH7B"},"23":{"t":"C182"},"24":{"t":"CH7A"},"25":{"t":"C206"},"26":{"t":"P28A"},"27":{"t":"B701"},"28":{"t":"BE58"},"29":{"t":"L8"},"2A":{"t":"BE55"},"2B":{"t":"J3"},"2C":{"t":"C140"},"2D":{"t":"P28B"},"2E":{"t":"C77R"},"2F":{"t":"C182"},"30":{"t":"T210"},"31":{"t":"P28A"},"32":{"desc":"H1P"},"33":{"t":"C140"},"34":{"t":"BALL"},"35":{"t":"C172"},"36":{"t":"P28A"},"37":{"t":"P28B"},"38":{"t":"C310"},"39":{"t":"B06"},"3A":{"t":"J3"},"3B":{"t":"P32T"},"3C":{"t":"M20P"},"3D":{"t":"P32T"},"3E":{"t":"P32T"},"3F":{"t":"PA34"},"40":{"t":"PA44"},"41":{"t":"M20T"},"42":{"desc":"L1P"},"43":{"t":"PA22"},"44":{"t":"L8"},"45":{"t":"P32T"},"46":{"t":"BE35"},"47":{"t":"CH7A"},"48":{"desc":"L4T"},"49":{"t":"C182"},"4A":{"t":"ERCO"},"4B":{"t":"P28U"},"4C":{"t":"L8"},"4D":{"t":"BE36"},"4E":{"t":"P28U"},"4F":{"t":"P28B"},"50":{"t":"M20P"},"51":{"t":"C77R"},"52":{"t":"C182"},"53":{"desc":"L1P"},"54":{"t":"P28A"},"55":{"desc":"H1P"},"56":{"t":"C182"},"57":{"t":"P28A"},"58":{"t":"C337"},"59":{"t":"C172"},"5A":{"t":"C180"},"5B":{"t":"J3"},"5C":{"t":"P28A"},"5D":{"t":"P28A"},"5E":{"t":"P28A"},"5F":{"desc":"L2J"},"60":{"t":"C182"},"61":{"t":"C172"},"62":{"t":"H269"},"63":{"t":"M20T"},"64":{"t":"PA32"},"65":{"desc":"L1P"},"66":{"t":"PA22"},"67":{"t":"L8"},"68":{"desc":"L1P"},"69":{"t":"BE35"},"6A":{"t":"CH7A"},"6B":{"t":"AA5"},"6C":{"t":"C182"},"6D":{"t":"BALL"},"6E":{"t":"C172"},"6F":{"t":"L8"},"70":{"desc":"H1T","t":"S92"},"71":{"t":"P28R"},"72":{"t":"PA32"},"73":{"t":"BALL"},"74":{"t":"C77R"},"75":{"t":"T206"},"76":{"t":"T210"},"77":{"t":"C172"},"78":{"t":"T210"},"79":{"desc":"L2J"},"7A":{"t":"ULAC"},"7B":{"t":"M20P"},"7C":{"t":"C172"},"7D":{"t":"C182"},"7E":{"t":"C182"},"7F":{"t":"BALL"},"80":{"t":"M20P"},"81":{"t":"C182"},"82":{"t":"C182"},"83":{"t":"C172"},"84":{"desc":"L1P"},"85":{"t":"C182"},"86":{"t":"C172"},"87":{"t":"P32T"},"89":{"t":"C182"},"8A":{"t":"BALL"},"8B":{"t":"C182"},"8C":{"t":"BE35"},"8D":{"t":"CH7A"},"8E":{"t":"B06"},"8F":{"desc":"L2J"},"90":{"t":"ERCO"},"91":{"desc":"L2J"},"92":{"t":"L8"},"93":{"t":"BE58"},"94":{"t":"J3"},"95":{"desc":"L1P","t":"ULAC"},"96":{"t":"PA23"},"97":{"t":"C77R"},"98":{"t":"P28A"},"99":{"desc":"L1P"},"9A":{"t":"P28A"},"9B":{"t":"P28U"},"9C":{"t":"C140"},"9D":{"t":"H269"},"9E":{"t":"M20P"},"9F":{"t":"P28A"},"A0":{"t":"C172"},"A1":{"t":"C208"},"A2":{"t":"C182"},"A3":{"t":"C182"},"A4":{"t":"C172"},"A5":{"desc":"L1J"},"A6":{"t":"C182"},"A7":{"t":"B06"},"A8":{"t":"BALL"},"A9":{"t":"GLID"},"AA":{"t":"P32T"},"AB":{"desc":"A1E"},"AC":{"t":"PA22"},"AD":{"t":"BALL"},"AE":{"t":"C195"},"AF":{"t":"P28B"},"B0":{"t":"CH7A"},"B1":{"t":"C206"},"B2":{"t":"P28A"},"B3":{"t":"ERCO"},"B4":{"t":"P28U"},"B5":{"t":"PA32"},"B6":{"t":"BE55"},"B7":{"t":"J3"},"B8":{"t":"PA32"},"B9":{"t":"PA32"},"BA":{"desc":"L1T","t":"T206"},"BB":{"t":"C182"},"BC":{"desc":"L2J"},"BD":{"t":"P28A"},"BE":{"desc":"H1P"},"BF":{"t":"C140"},"C0":{"t":"BE23"},"C1":{"desc":"L1P"},"C2":{"t":"C172"},"C3":{"t":"P28B"},"C4":{"t":"B06"},"C5":{"desc":"L1P"},"C6":{"t":"C182"},"C7":{"t":"C182"},"C8":{"t":"C182"},"C9":{"t":"C182"},"CA":{"desc":"H1P"},"CB":{"t":"C182"},"CC":{"t":"J3"},"CD":{"t":"M20P"},"CE":{"desc":"L1P"},"CF":{"desc":"H1T","t":"S92"},"D0":{"t":"P32T"},"D1":{"t":"M20P"},"D2":{"t":"BE35"},"D3":{"t":"C172"},"D4":{"t":"PA44"},"D5":{"t":"C182"},"D6":{"t":"ERCO"},"D7":{"t":"P28U"},"D8":{"t":"B412"},"D9":{"t":"BE36"},"DA":{"t":"P28R"},"DB":{"t":"P32T"},"DC":{"t":"PA32"},"DD":{"t":"C77R"},"DE":{"t":"C172"},"DF":{"t":"C172"},"E0":{"t":"P28B"},"E1":{"desc":"H1P"},"E2":{"t":"BALL"},"E3":{"t":"T206"},"E4":{"t":"P28U"},"E5":{"t":"P28A"},"E6":{"t":"P28A"},"E7":{"t":"P28A"},"E8":{"t":"P28A"},"E9":{"t":"J3"},"EA":{"t":"C172"},"EB":{"t":"J3"},"EC":{"t":"C172"},"ED":{"t":"J3"},"EE":{"t":"C182"},"EF":{"t":"C182"},"F0":{"t":"P28A"},"F1":{"desc":"L1P"},"F2":{"t":"PA22"},"F3":{"t":"L8"},"F4":{"t":"C195"},"F5":{"t":"P32T"},"F6":{"t":"P28B"},"F7":{"t":"P28A"},"F8":{"t":"C182"},"F9":{"t":"ERCO"},"FA":{"t":"P28B"},"FB":{"t":"L8"},"FC":{"t":"BE36"},"FD":{"t":"J3"},"FE":{"t":"C140"},"FF":{"t":"PA23"}}
|
||||
{"00":{"t":"BE35"},"01":{"t":"CH7A"},"02":{"t":"C206"},"03":{"t":"M20T"},"04":{"t":"BALL"},"05":{"t":"H269"},"06":{"t":"GLID"},"07":{"t":"C172"},"08":{"t":"P28U"},"09":{"t":"C140"},"0A":{"t":"PA23"},"0B":{"t":"C77R"},"0C":{"t":"P28A"},"0D":{"t":"C182"},"0E":{"t":"C172"},"0F":{"t":"B77W"},"10":{"desc":"L1P"},"11":{"t":"C182"},"12":{"t":"P28T"},"13":{"t":"P28B"},"14":{"desc":"L1P"},"15":{"t":"C208"},"16":{"t":"C182"},"17":{"t":"C172"},"18":{"t":"P32T"},"19":{"t":"C208"},"1A":{"t":"P32T"},"1B":{"t":"PA44"},"1C":{"t":"ULAC"},"1D":{"t":"P28A"},"1E":{"t":"P28A"},"1F":{"desc":"H1P"},"20":{"t":"PA44"},"21":{"t":"P32T"},"22":{"t":"CH7B"},"23":{"t":"C182"},"24":{"t":"CH7A"},"25":{"t":"C206"},"26":{"t":"P28A"},"27":{"t":"B701"},"28":{"t":"BE58"},"29":{"t":"L8"},"2A":{"t":"BE55"},"2B":{"t":"J3"},"2C":{"t":"C140"},"2D":{"t":"P28B"},"2E":{"t":"C77R"},"2F":{"t":"C182"},"30":{"t":"T210"},"31":{"t":"P28A"},"32":{"desc":"H1P"},"33":{"t":"C140"},"34":{"t":"BALL"},"35":{"t":"C172"},"36":{"t":"P28A"},"37":{"t":"P28B"},"38":{"t":"C310"},"39":{"t":"B06"},"3A":{"t":"J3"},"3B":{"t":"P32T"},"3C":{"t":"M20P"},"3D":{"t":"P32T"},"3E":{"t":"P32T"},"3F":{"t":"PA34"},"40":{"t":"PA44"},"41":{"t":"M20T"},"42":{"desc":"L1P"},"43":{"t":"PA22"},"44":{"t":"L8"},"45":{"t":"P32T"},"46":{"t":"BE35"},"47":{"t":"CH7A"},"48":{"desc":"L4T"},"49":{"t":"C182"},"4A":{"t":"ERCO"},"4B":{"t":"P28U"},"4C":{"t":"L8"},"4D":{"t":"BE36"},"4E":{"t":"P28U"},"4F":{"t":"P28B"},"50":{"t":"M20P"},"51":{"t":"C77R"},"52":{"t":"C182"},"53":{"desc":"L1P"},"54":{"t":"P28A"},"55":{"desc":"H1P"},"56":{"t":"C182"},"57":{"t":"P28A"},"58":{"t":"C337"},"59":{"t":"C172"},"5A":{"t":"C180"},"5B":{"t":"J3"},"5C":{"t":"P28A"},"5D":{"t":"P28A"},"5E":{"t":"P28A"},"5F":{"desc":"L2J"},"60":{"t":"C182"},"61":{"t":"C172"},"62":{"t":"H269"},"63":{"t":"M20T"},"64":{"t":"PA32"},"65":{"desc":"L1P"},"66":{"t":"PA22"},"67":{"t":"L8"},"68":{"desc":"L1P"},"69":{"t":"BE35"},"6A":{"t":"CH7A"},"6B":{"t":"AA5"},"6C":{"t":"C182"},"6D":{"t":"BALL"},"6E":{"t":"C172"},"6F":{"t":"L8"},"70":{"desc":"H1T","t":"S92"},"71":{"t":"P28R"},"72":{"t":"PA32"},"73":{"t":"BALL"},"74":{"t":"C77R"},"75":{"t":"T206"},"76":{"t":"T210"},"77":{"t":"C172"},"78":{"t":"T210"},"79":{"desc":"L2J"},"7A":{"t":"ULAC"},"7B":{"t":"M20P"},"7C":{"t":"C172"},"7D":{"t":"C182"},"7E":{"t":"C182"},"7F":{"t":"BALL"},"80":{"t":"M20P"},"81":{"t":"C182"},"82":{"t":"C182"},"83":{"t":"C172"},"84":{"desc":"L1P"},"85":{"t":"C182"},"86":{"t":"C172"},"87":{"t":"P32T"},"89":{"t":"C182"},"8A":{"t":"BALL"},"8B":{"t":"C182"},"8C":{"t":"BE35"},"8D":{"t":"CH7A"},"8E":{"t":"B06"},"8F":{"desc":"L2J"},"90":{"t":"ERCO"},"91":{"desc":"L2J"},"92":{"t":"L8"},"93":{"t":"BE58"},"94":{"t":"J3"},"95":{"desc":"L1P","t":"ULAC"},"96":{"t":"PA23"},"97":{"t":"C77R"},"98":{"t":"P28A"},"99":{"desc":"L1P"},"9A":{"t":"P28A"},"9B":{"t":"P28U"},"9C":{"t":"C140"},"9D":{"t":"H269"},"9E":{"t":"M20P"},"9F":{"t":"P28A"},"A0":{"t":"C172"},"A1":{"t":"C208"},"A2":{"t":"C182"},"A3":{"t":"C182"},"A4":{"t":"C172"},"A5":{"desc":"L1J"},"A6":{"t":"C182"},"A7":{"t":"B06"},"A8":{"t":"BALL"},"A9":{"t":"GLID"},"AA":{"t":"P32T"},"AB":{"desc":"A1E"},"AC":{"t":"PA22"},"AD":{"t":"BALL"},"AE":{"t":"C195"},"AF":{"t":"P28B"},"B0":{"t":"CH7A"},"B1":{"t":"C206"},"B2":{"t":"P28A"},"B3":{"t":"ERCO"},"B4":{"t":"P28U"},"B5":{"t":"PA32"},"B6":{"t":"BE55"},"B7":{"t":"J3"},"B8":{"t":"PA32"},"B9":{"t":"PA32"},"BA":{"desc":"L1T","t":"T206"},"BB":{"t":"C182"},"BC":{"desc":"L2J"},"BD":{"t":"P28A"},"BE":{"desc":"H1P"},"BF":{"t":"C140"},"C0":{"t":"BE23"},"C1":{"desc":"L1P"},"C2":{"t":"C172"},"C3":{"t":"P28B"},"C4":{"t":"B06"},"C5":{"desc":"L1P"},"C6":{"t":"C182"},"C7":{"t":"C182"},"C8":{"t":"C182"},"C9":{"t":"C182"},"CA":{"desc":"H1P"},"CB":{"t":"C182"},"CC":{"t":"J3"},"CD":{"t":"M20P"},"CE":{"desc":"L1P"},"CF":{"desc":"H1T","t":"S92"},"D0":{"t":"P32T"},"D1":{"t":"M20P"},"D2":{"t":"BE35"},"D3":{"t":"C172"},"D4":{"t":"PA44"},"D5":{"t":"C182"},"D6":{"t":"ERCO"},"D7":{"t":"P28U"},"D8":{"t":"B412"},"D9":{"t":"BE36"},"DA":{"t":"P28R"},"DB":{"t":"P32T"},"DC":{"t":"PA32"},"DD":{"t":"C77R"},"DE":{"t":"C172"},"DF":{"t":"C172"},"E0":{"t":"P28B"},"E1":{"desc":"H1P"},"E2":{"t":"BALL"},"E3":{"t":"T206"},"E4":{"t":"P28U"},"E5":{"t":"P28A"},"E6":{"t":"P28A"},"E7":{"t":"P28A"},"E8":{"t":"P28A"},"E9":{"t":"J3"},"EA":{"t":"C172"},"EB":{"t":"J3"},"EC":{"t":"C172"},"ED":{"t":"J3"},"EE":{"t":"C182"},"EF":{"t":"C182"},"F0":{"t":"P28A"},"F1":{"desc":"L1P"},"F2":{"t":"PA22"},"F3":{"t":"L8"},"F4":{"t":"C195"},"F5":{"t":"P32T"},"F6":{"t":"P28B"},"F7":{"t":"P28A"},"F8":{"t":"C182"},"F9":{"t":"ERCO"},"FA":{"t":"P28B"},"FB":{"t":"L8"},"FC":{"t":"BE36"},"FD":{"t":"J3"},"FE":{"t":"C140"},"FF":{"t":"PA23"}}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"00":{"t":"C182"},"01":{"t":"C177"},"02":{"t":"C185"},"03":{"t":"C150"},"04":{"t":"TAYB"},"05":{"desc":"H3P"},"06":{"t":"P32T"},"07":{"t":"P32T"},"08":{"t":"TAYB"},"09":{"t":"TAYB"},"0A":{"t":"P32T"},"0D":{"t":"TAYD"},"0E":{"t":"PA20"},"0F":{"t":"P28A"},"10":{"t":"PC12"},"11":{"t":"C170"},"12":{"t":"CH7A"},"13":{"t":"C310"},"14":{"t":"C182"},"15":{"t":"ERCO"},"16":{"t":"C140"},"17":{"t":"PA23"},"18":{"t":"B407"},"19":{"t":"C310"},"1A":{"t":"P28A"},"1B":{"t":"PA23"},"1C":{"t":"M20P"},"1D":{"t":"P28A"},"1E":{"desc":"A1P"},"1F":{"t":"P28A"},"20":{"t":"PA34"},"22":{"t":"C170"},"23":{"t":"C337"},"24":{"t":"PA27"},"25":{"t":"PA24"},"26":{"t":"TAYB"},"27":{"desc":"L1P"},"28":{"desc":"L1P"},"29":{"t":"TAYB"},"2A":{"t":"C210"},"2B":{"t":"P28A"},"2C":{"desc":"L1P"},"2D":{"t":"TAYB"},"2E":{"t":"TAYB"},"2F":{"t":"C210"},"30":{"desc":"L1P"},"31":{"desc":"H1P"},"32":{"t":"P28A"},"33":{"t":"C180"},"34":{"t":"C170"},"35":{"desc":"L1P"},"36":{"t":"P28A"},"37":{"t":"C182"},"38":{"t":"BALL"},"39":{"t":"C150"},"3A":{"t":"L8"},"3B":{"t":"BE23"},"3C":{"t":"J3"},"3D":{"t":"P28A"},"3E":{"t":"R22"},"3F":{"t":"P28A"},"40":{"t":"P28A"},"41":{"t":"T210"},"42":{"t":"C185"},"43":{"t":"C182"},"44":{"t":"P28B"},"45":{"t":"P28U"},"46":{"t":"C337"},"47":{"t":"C177"},"48":{"t":"P28U"},"49":{"t":"C172"},"4A":{"t":"TAYB"},"4B":{"t":"T210"},"4C":{"t":"TAYB"},"4E":{"t":"TAYB"},"4F":{"desc":"L1P"},"50":{"t":"C172"},"53":{"t":"PA18"},"55":{"t":"P28B"},"56":{"t":"PA23"},"57":{"t":"BE58"},"58":{"t":"C170"},"59":{"t":"M20P"},"5A":{"t":"C25A"},"5B":{"t":"BALL"},"5C":{"t":"C150"},"5D":{"t":"P28A"},"5E":{"t":"BE23"},"5F":{"t":"J3"},"60":{"desc":"L1P"},"61":{"t":"PA23"},"62":{"t":"C421"},"63":{"desc":"H1P"},"67":{"t":"C140"},"68":{"t":"P28B"},"69":{"t":"C337"},"6A":{"t":"C177"},"6B":{"t":"P28U"},"6C":{"t":"TAYB"},"6D":{"t":"TAYB"},"6E":{"t":"TAYB"},"6F":{"t":"C150"},"70":{"desc":"L1P"},"71":{"t":"C150"},"72":{"t":"TAYB"},"74":{"t":"C150"},"75":{"t":"TAYB"},"76":{"desc":"L1P"},"77":{"t":"C172"},"78":{"t":"L8"},"79":{"desc":"L2P"},"7A":{"t":"P28A"},"7B":{"t":"C182"},"7C":{"t":"C172"},"7D":{"t":"PA44"},"7E":{"t":"BE10"},"80":{"t":"L8"},"81":{"t":"BE24"},"82":{"t":"J3"},"83":{"t":"P28A"},"85":{"t":"P28U"},"86":{"t":"T210"},"87":{"t":"PA32"},"88":{"t":"C82R"},"8A":{"t":"C140"},"8B":{"t":"ULAC"},"8C":{"t":"C337"},"8E":{"t":"P28B"},"8F":{"t":"C150"},"90":{"t":"C150"},"91":{"t":"C150"},"92":{"t":"C150"},"93":{"t":"C150"},"94":{"t":"C150"},"95":{"t":"TAYB"},"96":{"t":"TAYB"},"97":{"t":"TAYB"},"98":{"desc":"L1P"},"99":{"desc":"L1P"},"9A":{"t":"PA22"},"9B":{"t":"C206"},"9C":{"t":"C180"},"9D":{"t":"P28A"},"9E":{"t":"CH7A"},"9F":{"t":"P28A"},"A0":{"t":"C182"},"A1":{"desc":"L1P"},"A2":{"desc":"L1P"},"A3":{"desc":"H1P"},"A4":{"t":"BT36"},"A5":{"t":"J3"},"A6":{"t":"P28A"},"A7":{"t":"PA23"},"A8":{"t":"C172"},"A9":{"t":"T210"},"AA":{"t":"C210"},"AB":{"t":"P28R"},"AC":{"desc":"H1P"},"AD":{"t":"C140"},"AE":{"t":"BALL"},"AF":{"t":"P28A"},"B0":{"t":"C177"},"B1":{"t":"P28A"},"B2":{"t":"C150"},"B3":{"t":"P28R"},"B4":{"t":"PA32"},"B5":{"t":"C150"},"B6":{"t":"C150"},"B7":{"t":"C172"},"B8":{"t":"P28A"},"B9":{"t":"P32T"},"BA":{"t":"TAYB"},"BC":{"desc":"L1P","t":"ULAC"},"BE":{"desc":"H1P"},"BF":{"t":"PA18"},"C0":{"t":"P28A"},"C1":{"t":"CH7A"},"C2":{"t":"C182"},"C3":{"t":"PA44"},"C4":{"t":"PA44"},"C5":{"t":"PA32"},"C6":{"t":"L8"},"C7":{"t":"H500"},"C8":{"t":"J3"},"C9":{"t":"C140"},"CA":{"t":"ULAC"},"CB":{"t":"C421"},"CC":{"t":"P28A"},"CD":{"desc":"L1P"},"CE":{"t":"C185"},"D0":{"t":"C140"},"D1":{"t":"PA34"},"D2":{"t":"P28A"},"D3":{"t":"C177"},"D4":{"t":"P28A"},"D5":{"t":"TAYB"},"D6":{"t":"C172"},"D7":{"t":"TAYB"},"D8":{"desc":"L1P"},"D9":{"t":"C150"},"DA":{"t":"C150"},"DB":{"t":"C150"},"DC":{"t":"C150"},"DD":{"t":"C150"},"DE":{"t":"C182"},"DF":{"desc":"A1P"},"E0":{"t":"PA22"},"E1":{"t":"P32T"},"E2":{"t":"C180"},"E3":{"t":"M20P"},"E4":{"t":"C172"},"E5":{"t":"C310"},"E6":{"t":"C182"},"E8":{"t":"C150"},"E9":{"t":"M20P"},"EA":{"t":"C172"},"EB":{"t":"J3"},"ED":{"t":"PA23"},"EF":{"t":"T210"},"F0":{"t":"C210"},"F1":{"t":"C182"},"F2":{"t":"PA34"},"F3":{"t":"C140"},"F5":{"t":"C337"},"F6":{"desc":"L1P"},"F7":{"t":"P28A"},"F8":{"t":"C150"},"F9":{"desc":"L1P"},"FA":{"t":"TAYB"},"FC":{"t":"C150"},"FD":{"t":"C150"},"FE":{"t":"C182"},"FF":{"t":"TAYB"}}
|
||||
{"00":{"t":"C182"},"01":{"t":"C177"},"02":{"t":"C185"},"03":{"t":"C150"},"04":{"t":"TAYB"},"05":{"desc":"H3P"},"06":{"t":"P32T"},"07":{"t":"P32T"},"08":{"t":"TAYB"},"09":{"t":"TAYB"},"0A":{"t":"P32T"},"0D":{"t":"TAYD"},"0E":{"t":"PA20"},"0F":{"t":"P28A"},"10":{"t":"PC12"},"11":{"t":"C170"},"12":{"t":"CH7A"},"13":{"t":"C310"},"14":{"t":"C182"},"15":{"t":"ERCO"},"16":{"t":"C140"},"17":{"t":"PA23"},"18":{"t":"B407"},"19":{"t":"C310"},"1A":{"t":"P28A"},"1B":{"t":"PA23"},"1C":{"t":"M20P"},"1D":{"t":"P28A"},"1E":{"desc":"A1P"},"1F":{"t":"P28A"},"20":{"t":"PA34"},"22":{"t":"C170"},"23":{"t":"C337"},"24":{"t":"PA27"},"25":{"t":"PA24"},"26":{"t":"TAYB"},"27":{"desc":"L1P"},"28":{"desc":"L1P"},"29":{"t":"TAYB"},"2A":{"t":"C210"},"2B":{"t":"P28A"},"2C":{"desc":"L1P"},"2D":{"t":"TAYB"},"2E":{"t":"TAYB"},"2F":{"t":"C210"},"30":{"desc":"L1P"},"31":{"desc":"H1P"},"32":{"t":"P28A"},"33":{"t":"C180"},"34":{"t":"C170"},"35":{"desc":"L1P"},"36":{"t":"P28A"},"37":{"t":"C182"},"38":{"t":"BALL"},"39":{"t":"C150"},"3A":{"t":"L8"},"3B":{"t":"BE23"},"3C":{"t":"J3"},"3D":{"t":"P28A"},"3E":{"t":"R22"},"3F":{"t":"P28A"},"40":{"t":"P28A"},"41":{"t":"T210"},"42":{"t":"C185"},"43":{"t":"C182"},"44":{"t":"P28B"},"45":{"t":"P28U"},"46":{"t":"C337"},"47":{"t":"C177"},"48":{"t":"P28U"},"49":{"t":"C172"},"4A":{"t":"TAYB"},"4B":{"t":"T210"},"4C":{"t":"TAYB"},"4E":{"t":"TAYB"},"4F":{"desc":"L1P"},"50":{"t":"C172"},"53":{"t":"PA18"},"55":{"t":"P28B"},"56":{"t":"PA23"},"57":{"t":"BE58"},"58":{"t":"C170"},"59":{"t":"M20P"},"5A":{"t":"C25A"},"5B":{"t":"BALL"},"5C":{"t":"C150"},"5D":{"t":"P28A"},"5E":{"t":"BE23"},"5F":{"t":"J3"},"60":{"desc":"L1P"},"61":{"t":"PA23"},"62":{"t":"C421"},"63":{"desc":"H1P"},"67":{"t":"C140"},"68":{"t":"P28B"},"69":{"t":"C337"},"6A":{"t":"C177"},"6B":{"t":"P28U"},"6C":{"t":"TAYB"},"6D":{"t":"TAYB"},"6E":{"t":"TAYB"},"6F":{"t":"C150"},"70":{"desc":"L1P"},"71":{"t":"C150"},"72":{"t":"TAYB"},"74":{"t":"C150"},"75":{"t":"TAYB"},"76":{"desc":"L1P"},"77":{"t":"C172"},"78":{"t":"L8"},"79":{"desc":"L2P"},"7A":{"t":"P28A"},"7B":{"t":"C182"},"7C":{"t":"C172"},"7D":{"t":"PA44"},"7E":{"t":"BE10"},"80":{"t":"L8"},"81":{"t":"BE24"},"82":{"t":"J3"},"83":{"t":"P28A"},"85":{"t":"P28U"},"86":{"t":"T210"},"87":{"t":"PA32"},"88":{"t":"C82R"},"8A":{"t":"C140"},"8B":{"t":"ULAC"},"8C":{"t":"C337"},"8E":{"t":"P28B"},"8F":{"t":"C150"},"90":{"t":"C150"},"91":{"t":"C150"},"92":{"t":"C150"},"93":{"t":"C150"},"94":{"t":"C150"},"95":{"t":"TAYB"},"96":{"t":"TAYB"},"97":{"t":"TAYB"},"98":{"desc":"L1P"},"99":{"desc":"L1P"},"9A":{"t":"PA22"},"9B":{"t":"C206"},"9C":{"t":"C180"},"9D":{"t":"P28A"},"9E":{"t":"CH7A"},"9F":{"t":"P28A"},"A0":{"t":"C182"},"A1":{"desc":"L1P"},"A2":{"desc":"L1P"},"A3":{"desc":"H1P"},"A4":{"t":"BT36"},"A5":{"t":"J3"},"A6":{"t":"P28A"},"A7":{"t":"PA23"},"A8":{"t":"C172"},"A9":{"t":"T210"},"AA":{"t":"C210"},"AB":{"t":"P28R"},"AC":{"desc":"H1P"},"AD":{"t":"C140"},"AE":{"t":"BALL"},"AF":{"t":"P28A"},"B0":{"t":"C177"},"B1":{"t":"P28A"},"B2":{"t":"C150"},"B3":{"t":"P28R"},"B4":{"t":"PA32"},"B5":{"t":"C150"},"B6":{"t":"C150"},"B7":{"t":"C172"},"B8":{"t":"P28A"},"B9":{"t":"P32T"},"BA":{"t":"TAYB"},"BC":{"desc":"L1P","t":"ULAC"},"BE":{"desc":"H1P"},"BF":{"t":"PA18"},"C0":{"t":"P28A"},"C1":{"t":"CH7A"},"C2":{"t":"C182"},"C3":{"desc":"H4E"},"C4":{"t":"PA44"},"C5":{"t":"PA32"},"C6":{"t":"L8"},"C7":{"t":"H500"},"C8":{"t":"J3"},"C9":{"t":"C140"},"CA":{"t":"ULAC"},"CB":{"t":"C421"},"CC":{"t":"P28A"},"CD":{"desc":"L1P"},"CE":{"t":"C185"},"D0":{"t":"C140"},"D1":{"t":"PA34"},"D2":{"t":"P28A"},"D3":{"t":"C177"},"D4":{"t":"P28A"},"D5":{"t":"TAYB"},"D6":{"t":"C172"},"D7":{"t":"TAYB"},"D8":{"desc":"L1P"},"D9":{"t":"C150"},"DA":{"t":"C150"},"DB":{"t":"C150"},"DC":{"t":"C150"},"DD":{"t":"C150"},"DE":{"t":"C182"},"DF":{"desc":"A1P"},"E0":{"t":"PA22"},"E1":{"t":"P32T"},"E2":{"t":"C180"},"E3":{"t":"M20P"},"E4":{"t":"C172"},"E5":{"t":"C310"},"E6":{"t":"C182"},"E8":{"t":"C150"},"E9":{"t":"M20P"},"EA":{"t":"C172"},"EB":{"t":"J3"},"ED":{"t":"PA23"},"EF":{"t":"T210"},"F0":{"t":"C210"},"F1":{"t":"C182"},"F2":{"t":"PA34"},"F3":{"t":"C140"},"F5":{"t":"C337"},"F6":{"desc":"L1P"},"F7":{"t":"P28A"},"F8":{"t":"C150"},"F9":{"desc":"L1P"},"FA":{"t":"TAYB"},"FC":{"t":"C150"},"FD":{"t":"C150"},"FE":{"t":"C182"},"FF":{"t":"TAYB"}}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue