10 #include <QCoreApplication>
26 m_rbuf(new unsigned char[sizeof(
ccsubtitle)+255])
29 for (
uint i = 0; i < 128; i++)
58 auto then = SystemClock::now() - seconds;
59 for (
uint i = 0; i < 4; i++)
63 static const std::array<const int,16>
rowdata =
65 11, -1, 1, 2, 3, 4, 12, 13,
66 14, 15, 5, 6, 7, 8, 9, 10
71 QLatin1Char(0xAE), QLatin1Char(0xB0), QLatin1Char(0xBD), QLatin1Char(0xBF),
72 QChar(0x2122), QLatin1Char(0xA2), QLatin1Char(0xA3), QChar(0x266A),
73 QLatin1Char(0xE0), QLatin1Char(
' '), QLatin1Char(0xE8), QLatin1Char(0xE2),
74 QLatin1Char(0xEA), QLatin1Char(0xEE), QLatin1Char(0xF4), QLatin1Char(0xFB)
79 QLatin1Char(0xC1), QLatin1Char(0xC9), QLatin1Char(0xD3), QLatin1Char(0xDA),
80 QLatin1Char(0xDC), QLatin1Char(0xFC), QLatin1Char(
'`'), QLatin1Char(0xA1),
81 QLatin1Char(
'*'), QLatin1Char(
'\''), QChar(0x2014), QLatin1Char(0xA9),
82 QChar(0x2120), QLatin1Char(0xB7), QChar(0x201C), QChar(0x201D),
83 QLatin1Char(0xC0), QLatin1Char(0xC2), QLatin1Char(0xC7), QLatin1Char(0xC8),
84 QLatin1Char(0xCA), QLatin1Char(0xCB), QLatin1Char(0xEB), QLatin1Char(0xCE),
85 QLatin1Char(0xCF), QLatin1Char(0xEF), QLatin1Char(0xD4), QLatin1Char(0xD9),
86 QLatin1Char(0xF9), QLatin1Char(0xDB), QLatin1Char(0xAB), QLatin1Char(0xBB)
91 QLatin1Char(0xC3), QLatin1Char(0xE3), QLatin1Char(0xCD), QLatin1Char(0xCC),
92 QLatin1Char(0xEC), QLatin1Char(0xD2), QLatin1Char(0xF2), QLatin1Char(0xD5),
93 QLatin1Char(0xF5), QLatin1Char(
'{'), QLatin1Char(
'}'), QLatin1Char(
'\\'),
94 QLatin1Char(
'^'), QLatin1Char(
'_'), QLatin1Char(0xA6), QLatin1Char(
'~'),
95 QLatin1Char(0xC4), QLatin1Char(0xE4), QLatin1Char(0xD6), QLatin1Char(0xF6),
96 QLatin1Char(0xDF), QLatin1Char(0xA5), QLatin1Char(0xA4), QLatin1Char(
'|'),
97 QLatin1Char(0xC5), QLatin1Char(0xE5), QLatin1Char(0xD8), QLatin1Char(0xF8),
98 QChar(0x250C), QChar(0x2510), QChar(0x2514), QChar(0x2518)
111 for (mode = field*4; mode < (field*4 + 4); mode++)
125 LOG(VB_VBI, LOG_DEBUG,
"Format CC -- Duplicate");
132 int b1 = data & 0x7f;
133 int b2 = (data >> 8) & 0x7f;
135 LOG(VB_VBI, LOG_DEBUG,
136 QString(
"Format CC @%1/%2 = %3 %4, %5/%6 = '%7' '%8'")
137 .arg(tc.count()).arg(field)
138 .arg((data&0xff), 2, 16)
139 .arg((data&0xff00)>>8, 2, 16)
140 .arg(b1, 2, 16, QChar(
'0'))
141 .arg(b2, 2, 16, QChar(
'0'))
142 .arg(QChar((b1 & 0x60) ? b1 :
'_'))
143 .arg(QChar((b2 & 0x60) ? b2 :
'_')));
150 if (mode != std::numeric_limits<std::size_t>::max())
157 mode = std::numeric_limits<std::size_t>::max();
175 if (mode != std::numeric_limits<std::size_t>::max())
195 else if ((b1 & 0x10) && (b2 > 0x1F))
201 int newccmode = (b1 >> 3) & 1;
202 int newtxtmode =
m_txtMode[field*2 + newccmode];
203 if ((b1 & 0x06) == 0x04)
225 m_txtMode[field*2 + newccmode] = newtxtmode;
226 mode = (field << 2) | (newtxtmode << 1) |
m_ccMode[field];
248 LOG(VB_VBI, LOG_INFO,
249 QString(
"cc608 preamble indent, b2=%1")
258 LOG(VB_VBI, LOG_INFO,
259 QString(
"cc608 preamble color change, b2=%1")
272 LOG(VB_VBI, LOG_DEBUG,
273 QString(
"<ATTRIBUTE %1 %2>").arg(b1).arg(b2));
283 LOG(VB_VBI, LOG_INFO,
284 QString(
"cc608 mid-row color change, b2=%1")
289 m_ccBuf[mode] += QChar(0x7000 + (b2 & 0xf));
306 m_ccBuf[mode].remove(len - 1, 1);
319 m_ccBuf[mode].remove(len - 1, 1);
327 LOG(VB_VBI, LOG_DEBUG,
328 QString(
"ccmode %1 cmd %2").arg(
m_ccMode)
329 .arg(b2, 2, 16,
'0'));
339 m_ccBuf[mode].startsWith(
"\b"))
346 m_ccBuf[mode].remove(len - 1, 1);
377 (!newtxtmode ||
m_row[mode] >= 16)))
384 if (
m_row[mode] < 16)
416 if (
m_row[mode] == 0)
507 for (
int x = 0; x < (b2 & 0x03); x++)
519 for (mode = field*4; mode < (field*4 + 4); mode++)
545 int b1 = data & 0x7f;
546 int b2 = (data >> 8) & 0x7f;
554 ((b1 & 0x70) == 0x10))
566 std::chrono::milliseconds dup_text_fudge = 0ms;
567 std::chrono::milliseconds dup_ctrl_fudge = 0ms;
568 if (
m_badVbi[field] < 100 && b1 != 0 && b2 != 0)
570 std::chrono::milliseconds
d = tc -
m_lastTc[field];
571 if (d < 25ms || d > 42ms)
579 dup_text_fudge = -2ms;
581 dup_ctrl_fudge = 33ms - 4ms;
585 dup_text_fudge = 4ms;
586 dup_ctrl_fudge = 33ms - 4ms;
591 if ((b1 & 0x70) == 0x10)
629 for (
const auto& cp : qAsConst(cc608str))
631 int cpu = cp.unicode();
636 case 0x2120 : ret +=
"(SM)";
break;
637 case 0x2122 : ret +=
"(TM)";
break;
638 case 0x2014 : ret +=
"(--)";
break;
639 case 0x201C : ret +=
"``";
break;
640 case 0x201D : ret +=
"''";
break;
641 case 0x250C : ret +=
"|-";
break;
642 case 0x2510 : ret +=
"-|";
break;
643 case 0x2514 : ret +=
"|_";
break;
644 case 0x2518 : ret +=
"_|";
break;
645 case 0x2588 : ret +=
"[]";
break;
646 case 0x266A : ret +=
"o/~";
break;
647 case '\b' : ret +=
"\\b";
break;
649 if (cpu >= 0x7000 && cpu < 0x7000 + 0x30)
651 if (!suppress_unknown)
652 ret += QString(
"[%1]").arg(cpu, 2, 16);
654 else if (cpu <= 0x80)
655 ret += QString(cp.toLatin1());
656 else if (!suppress_unknown)
657 ret += QString(
"{%1}").arg(cpu, 2, 16);
670 tmpbuf =
m_ccBuf[mode].toUtf8();
671 len = std::min(
static_cast<int>(tmpbuf.length()), 255);
674 unsigned char *bp =
m_rbuf;
675 *(bp++) =
m_row[mode];
698 LOG(VB_VBI, LOG_INFO, QString(
"### %1 %2 %3 %4 %5 %6 %7 - '%8'")
701 .arg(
m_style[mode]).arg(f, 2, 16)
702 .arg(clr).arg(len, 3)
703 .arg(
ToASCII(QString::fromUtf8(tmpbuf.constData(), len),
false)));
711 case CC_CC1: stream = 0;
break;
712 case CC_CC2: stream = 1;
break;
713 case CC_CC3: stream = 2;
break;
714 case CC_CC4: stream = 3;
break;
717 m_lastSeen[stream] = std::chrono::system_clock::now();
745 if (
m_row[mode] == 0)
755 if (
m_row[mode] == 0)
808 for (
int x = 0; x < limit; x++)
830 return ((c) & 0x7F) >= 0x20 && ((c) & 0x7F) <= 0x7E;
839 static int OddParity(
unsigned char c)
841 c ^= (c >> 4); c ^= (c >> 2); c ^= (c >> 1);
850 static constexpr
int PIL_TIME(
int day,
int mon,
int hour,
int min)
851 {
return (day << 15) + (mon << 11) + (hour << 6) + min; }
855 int day = (pil >> 15);
856 int mon = (pil >> 11) & 0xF;
857 int hour = (pil >> 6 ) & 0x1F;
858 int min = (pil ) & 0x3F;
861 LOG(VB_VBI, LOG_INFO,
" PDC: Timer-control (no PDC)");
862 else if (pil ==
PIL_TIME(0, 15, 30, 63))
863 LOG(VB_VBI, LOG_INFO,
" PDC: Recording inhibit/terminate");
864 else if (pil ==
PIL_TIME(0, 15, 29, 63))
865 LOG(VB_VBI, LOG_INFO,
" PDC: Interruption");
866 else if (pil ==
PIL_TIME(0, 15, 28, 63))
867 LOG(VB_VBI, LOG_INFO,
" PDC: Continue");
868 else if (pil ==
PIL_TIME(31, 15, 31, 63))
869 LOG(VB_VBI, LOG_INFO,
" PDC: No time");
871 LOG(VB_VBI, LOG_INFO, QString(
" PDC: %1, 200X-%2-%3 %4:%5")
872 .arg(pil).arg(mon).arg(day).arg(hour).arg(min));
890 LOG(VB_VBI, LOG_INFO, QString(
"VPS: 3-10: %1 %2 %3 %4 %5 %6 %7 %8 (\"%9\")")
891 .arg(buf[0]).arg(buf[1]).arg(buf[2]).arg(buf[3]).arg(buf[4])
892 .arg(buf[5]).arg(buf[6]).arg(buf[7]).arg(
m_vpsPrLabel.data()));
894 int pcs = buf[2] >> 6;
895 int cni = + ((buf[10] & 3) << 10)
896 + ((buf[11] & 0xC0) << 2)
897 + ((buf[8] & 0xC0) << 0)
899 int pil = ((buf[8] & 0x3F) << 14) + (buf[9] << 6) + (buf[10] >> 2);
902 LOG(VB_VBI, LOG_INFO, QString(
"CNI: %1 PCS: %2 PTY: %3 ")
903 .arg(cni).arg(pcs).arg(pty));
916 static const std::array<const int,8> kWssBits { 0, 0, 0, 1, 0, 1, 1, 1 };
919 for (
uint i = 0; i < 16; i++)
921 uint b1 = kWssBits[buf[i] & 7];
922 uint b2 = kWssBits[(buf[i] >> 3) & 7];
928 unsigned char parity = wss & 0xf;
929 parity ^= parity >> 2;
930 parity ^= parity >> 1;
932 LOG(VB_VBI, LOG_INFO,
933 QString(
"WSS: %1; %2 mode; %3 color coding;\n\t\t\t"
934 " %4 helper; reserved b7=%5; %6\n\t\t\t"
935 " open subtitles: %7; %scopyright %8; copying %9")
936 .arg(QString::fromStdString(
formats[wss & 7]),
937 (wss & 0x0010) ?
"film" :
"camera",
938 (wss & 0x0020) ?
"MA/CP" :
"standard",
939 (wss & 0x0040) ?
"modulated" :
"no",
940 (wss & 0x0080) ?
"1" :
"0",
941 (wss & 0x0100) ?
"have TTX subtitles; " :
"",
942 QString::fromStdString(
subtitles[(wss >> 9) & 3]),
943 (wss & 0x0800) ?
"surround sound; " :
"",
944 (wss & 0x1000) ?
"asserted" :
"unknown")
946 .arg((wss & 0x2000) ?
"restricted" :
"not restricted"));
959 for (
uint i = start; (i < buf.size()) && (i < end); i++)
961 LOG(VB_VBI, LOG_INFO, QString(
"%1: 0x%2 -> 0x%3 %4")
963 .arg(buf[i],2,16,QChar(
'0'))
970 for (
uint i = start; (i < buf.size()) && (i < end); i++)
977 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecodeString: '%1'").arg(
tmp));
980 return tmp.trimmed();
983 static bool is_better(
const QString &newStr,
const QString &oldStr)
985 if (!newStr.isEmpty() && newStr != oldStr &&
986 (newStr != oldStr.left(newStr.length())))
988 if (oldStr.isEmpty())
992 return std::all_of(newStr.cbegin(), newStr.cend(),
993 [](
auto ch){ return ch.toLatin1() >= 0x20; } );
1014 const std::array<const QString,4>
prefix {
"MPAA-",
"TV-",
"CE-",
"CF-" };
1015 const std::array<const std::array<const QString,8>,4> mainStr
1017 {
"NR",
"G",
"PG",
"PG-13",
"R",
"NC-17",
"X",
"NR" },
1018 {
"NR",
"Y",
"Y7",
"G",
"PG",
"14",
"MA",
"NR" },
1019 {
"E",
"C",
"C8+",
"G",
"PG",
"14+",
"18+",
"NR" },
1020 {
"E",
"G",
"8+",
"13+",
"16+",
"18+",
"NR",
"NR" },
1027 uint cf = (future) ? 1 : 0;
1055 const std::vector<uint> &program_type =
m_xdsProgramType[(future) ? 1 : 0];
1058 for (
size_t i = 0; i < program_type.size(); i++)
1072 if (key ==
"ratings")
1074 if (key.startsWith(
"has_rating_"))
1076 if (key.startsWith(
"rating_"))
1079 if (key ==
"future_ratings")
1081 if (key.startsWith(
"has_future_rating_"))
1083 if (key.startsWith(
"future_rating_"))
1086 if (key ==
"programname")
1088 if (key ==
"future_programname")
1091 if (key ==
"programtype")
1093 if (key ==
"future_programtype")
1096 if (key ==
"callsign")
1098 if (key ==
"channame")
1124 LOG(VB_VBI, LOG_INFO,
1125 QString(
"XDSDecode: 0x%1 0x%2 '%3%4' xds[%5]=%6 in XDS %7")
1126 .arg(b1,2,16,QChar(
'0')).arg(b2,2,16,QChar(
'0'))
1129 .arg(field).arg(
m_xds[field])
1151 else if ((0
x0 < b1) && (b1 < 0x0f))
1175 else if ((0x10 <= b1) && (b1 <= 0x1f))
1178 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecode: Suspending XDS %1 on 0x%2")
1191 bool handled =
false;
1192 int xds_class = xds_buf[0];
1197 if ((xds_class == 0x01) || (xds_class == 0x03))
1199 else if (xds_class == 0x05)
1201 else if ((xds_class == 0x07) ||
1202 (xds_class == 0x09) ||
1203 (xds_class == 0x0b))
1205 else if (xds_class == 0x0d)
1211 LOG(VB_VBI, LOG_INFO, QString(
"XDS: ") +
1212 QString(
"Unhandled packet (0x%1 0x%2) sz(%3) '%4'")
1213 .arg(xds_buf[0],0,16).arg(xds_buf[1],0,16)
1214 .arg(xds_buf.size())
1224 for (
size_t i = 0; i < xds_buf.size() - 1; i++)
1227 if ((((~sum) & 0x7f) + 1) != xds_buf[xds_buf.size() - 1])
1231 LOG(VB_VBI, LOG_ERR, QString(
"XDS: failed CRC %1 of %2")
1242 const std::vector<unsigned char> &xds_buf,
bool future)
1244 bool handled =
true;
1245 int b2 = xds_buf[1];
1246 int cf = (future) ? 1 : 0;
1247 QString loc = (future) ?
"XDS: Future " :
"XDS: Current ";
1249 if ((b2 == 0x01) && (xds_buf.size() >= 6))
1251 uint min = xds_buf[2] & 0x3f;
1252 uint hour = xds_buf[3] & 0x0f;
1253 uint day = xds_buf[4] & 0x1f;
1254 uint month = xds_buf[5] & 0x0f;
1255 month = (month < 1 || month > 12) ? 0 : month;
1257 LOG(VB_VBI, LOG_INFO, loc +
1258 QString(
"Start Time %1/%2 %3:%4%5")
1259 .arg(month).arg(day).arg(hour).arg(min / 10).arg(min % 10));
1261 else if ((b2 == 0x02) && (xds_buf.size() >= 4))
1263 uint length_min = xds_buf[2] & 0x3f;
1264 uint length_hour = xds_buf[3] & 0x3f;
1265 uint length_elapsed_min = 0;
1266 uint length_elapsed_hour = 0;
1267 uint length_elapsed_secs = 0;
1268 if (xds_buf.size() > 6)
1270 length_elapsed_min = xds_buf[4] & 0x3f;
1271 length_elapsed_hour = xds_buf[5] & 0x3f;
1273 if (xds_buf.size() > 8 && xds_buf[7] == 0x40)
1274 length_elapsed_secs = xds_buf[6] & 0x3f;
1276 QString msg = QString(
"Program Length %1:%2%3 "
1277 "Time in Show %4:%5%6.%7%8")
1278 .arg(length_hour).arg(length_min / 10).arg(length_min % 10)
1279 .arg(length_elapsed_hour)
1280 .arg(length_elapsed_min / 10).arg(length_elapsed_min % 10)
1281 .arg(length_elapsed_secs / 10).arg(length_elapsed_secs % 10);
1283 LOG(VB_VBI, LOG_INFO, loc + msg);
1285 else if ((b2 == 0x03) && (xds_buf.size() >= 6))
1291 LOG(VB_VBI, LOG_INFO, loc + QString(
"Program Name: '%1'")
1295 else if ((b2 == 0x04) && (xds_buf.size() >= 6))
1297 std::vector<uint> program_type;
1298 for (
size_t i = 2; i < xds_buf.size() - 2; i++)
1300 int cur = xds_buf[i] - 0x20;
1301 if (cur >= 0 && cur < 96)
1302 program_type.push_back(cur);
1306 for (
uint i = 0; (i < program_type.size()) && unchanged; i++)
1312 LOG(VB_VBI, LOG_INFO, loc + QString(
"Program Type '%1'")
1316 else if ((b2 == 0x05) && (xds_buf.size() >= 4))
1318 uint movie_rating = xds_buf[2] & 0x7;
1319 uint rating_system = (xds_buf[2] >> 3) & 0x7;
1320 uint tv_rating = xds_buf[3] & 0x7;
1321 uint VSL = xds_buf[3] & (0x7 << 3);
1322 uint sel = VSL | rating_system;
1330 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1341 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1345 else if (sel == 0x13 || sel == 0x1f)
1347 else if ((rating_system & 0
x3) == 1)
1352 uint f = ((xds_buf[0]<<3) & 0x80) | ((xds_buf[1]<<1) & 0x70);
1355 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1359 else if (rating_system == 0)
1366 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1372 LOG(VB_VBI, LOG_ERR, loc +
1373 QString(
"VChip Unhandled -- rs(%1) rating(%2:%3)")
1374 .arg(rating_system).arg(tv_rating).arg(movie_rating));
1378 else if (b2 == 0x07)
1380 else if (b2 == 0x08)
1382 else if (b2 == 0x09)
1384 else if (b2 == 0x0c)
1386 else if (b2 == 0x10 || b2 == 0x13 || b2 == 0x15 || b2 == 0x16 ||
1387 b2 == 0x91 || b2 == 0x92 || b2 == 0x94 || b2 == 0x97)
1389 else if (b2 == 0x86)
1391 else if (b2 == 0x89)
1393 else if (b2 == 0x8c)
1404 bool handled =
true;
1406 int b2 = xds_buf[1];
1407 if ((b2 == 0x01) && (xds_buf.size() >= 6))
1412 LOG(VB_VBI, LOG_INFO, QString(
"XDS: Network Name '%1'").arg(
tmp));
1416 else if ((b2 == 0x02) && (xds_buf.size() >= 6))
1421 LOG(VB_VBI, LOG_INFO, QString(
"XDS: Network Call '%1'").arg(
tmp));
1425 else if ((b2 == 0x04) && (xds_buf.size() >= 6))
1427 uint tsid = (xds_buf[2] << 24 | xds_buf[3] << 16 |
1428 xds_buf[4] << 8 | xds_buf[5]);
1431 LOG(VB_VBI, LOG_INFO, QString(
"XDS: TSID 0x%1").arg(tsid,0,16));
1443 xds_program_type[0] = QCoreApplication::translate(
"(Categories)",
1445 xds_program_type[1] = QCoreApplication::translate(
"(Categories)",
1447 xds_program_type[2] = QCoreApplication::translate(
"(Categories)",
1449 xds_program_type[3] = QCoreApplication::translate(
"(Categories)",
1451 xds_program_type[4] = QCoreApplication::translate(
"(Categories)",
1453 xds_program_type[5] = QCoreApplication::translate(
"(Categories)",
1455 xds_program_type[6] = QCoreApplication::translate(
"(Categories)",
1457 xds_program_type[7] = QCoreApplication::translate(
"(Categories)",
1459 xds_program_type[8] = QCoreApplication::translate(
"(Categories)",
1461 xds_program_type[9] = QCoreApplication::translate(
"(Categories)",
1463 xds_program_type[10] = QCoreApplication::translate(
"(Categories)",
1465 xds_program_type[11] = QCoreApplication::translate(
"(Categories)",
1467 xds_program_type[12] = QCoreApplication::translate(
"(Categories)",
1469 xds_program_type[13] = QCoreApplication::translate(
"(Categories)",
1471 xds_program_type[14] = QCoreApplication::translate(
"(Categories)",
1473 xds_program_type[15] = QCoreApplication::translate(
"(Categories)",
1475 xds_program_type[16] = QCoreApplication::translate(
"(Categories)",
1477 xds_program_type[17] = QCoreApplication::translate(
"(Categories)",
1479 xds_program_type[18] = QCoreApplication::translate(
"(Categories)",
1481 xds_program_type[19] = QCoreApplication::translate(
"(Categories)",
1483 xds_program_type[20] = QCoreApplication::translate(
"(Categories)",
1485 xds_program_type[21] = QCoreApplication::translate(
"(Categories)",
1487 xds_program_type[22] = QCoreApplication::translate(
"(Categories)",
1489 xds_program_type[23] = QCoreApplication::translate(
"(Categories)",
1491 xds_program_type[24] = QCoreApplication::translate(
"(Categories)",
1493 xds_program_type[25] = QCoreApplication::translate(
"(Categories)",
1495 xds_program_type[26] = QCoreApplication::translate(
"(Categories)",
1497 xds_program_type[27] = QCoreApplication::translate(
"(Categories)",
1499 xds_program_type[28] = QCoreApplication::translate(
"(Categories)",
1501 xds_program_type[29] = QCoreApplication::translate(
"(Categories)",
1503 xds_program_type[30] = QCoreApplication::translate(
"(Categories)",
1505 xds_program_type[31] = QCoreApplication::translate(
"(Categories)",
1507 xds_program_type[32] = QCoreApplication::translate(
"(Categories)",
1509 xds_program_type[33] = QCoreApplication::translate(
"(Categories)",
1511 xds_program_type[34] = QCoreApplication::translate(
"(Categories)",
1513 xds_program_type[35] = QCoreApplication::translate(
"(Categories)",
1515 xds_program_type[36] = QCoreApplication::translate(
"(Categories)",
1517 xds_program_type[37] = QCoreApplication::translate(
"(Categories)",
1519 xds_program_type[38] = QCoreApplication::translate(
"(Categories)",
1521 xds_program_type[39] = QCoreApplication::translate(
"(Categories)",
1523 xds_program_type[40] = QCoreApplication::translate(
"(Categories)",
1525 xds_program_type[41] = QCoreApplication::translate(
"(Categories)",
1527 xds_program_type[42] = QCoreApplication::translate(
"(Categories)",
1529 xds_program_type[43] = QCoreApplication::translate(
"(Categories)",
1531 xds_program_type[44] = QCoreApplication::translate(
"(Categories)",
1533 xds_program_type[45] = QCoreApplication::translate(
"(Categories)",
1535 xds_program_type[46] = QCoreApplication::translate(
"(Categories)",
1537 xds_program_type[47] = QCoreApplication::translate(
"(Categories)",
1539 xds_program_type[48] = QCoreApplication::translate(
"(Categories)",
1541 xds_program_type[49] = QCoreApplication::translate(
"(Categories)",
1543 xds_program_type[50] = QCoreApplication::translate(
"(Categories)",
1545 xds_program_type[51] = QCoreApplication::translate(
"(Categories)",
1547 xds_program_type[52] = QCoreApplication::translate(
"(Categories)",
1549 xds_program_type[53] = QCoreApplication::translate(
"(Categories)",
1551 xds_program_type[54] = QCoreApplication::translate(
"(Categories)",
1553 xds_program_type[55] = QCoreApplication::translate(
"(Categories)",
1555 xds_program_type[56] = QCoreApplication::translate(
"(Categories)",
1557 xds_program_type[57] = QCoreApplication::translate(
"(Categories)",
1559 xds_program_type[58] = QCoreApplication::translate(
"(Categories)",
1561 xds_program_type[59] = QCoreApplication::translate(
"(Categories)",
1563 xds_program_type[60] = QCoreApplication::translate(
"(Categories)",
1565 xds_program_type[61] = QCoreApplication::translate(
"(Categories)",
1567 xds_program_type[62] = QCoreApplication::translate(
"(Categories)",
1569 xds_program_type[63] = QCoreApplication::translate(
"(Categories)",
1571 xds_program_type[64] = QCoreApplication::translate(
"(Categories)",
1573 xds_program_type[65] = QCoreApplication::translate(
"(Categories)",
1575 xds_program_type[66] = QCoreApplication::translate(
"(Categories)",
1577 xds_program_type[67] = QCoreApplication::translate(
"(Categories)",
1579 xds_program_type[68] = QCoreApplication::translate(
"(Categories)",
1581 xds_program_type[69] = QCoreApplication::translate(
"(Categories)",
1583 xds_program_type[70] = QCoreApplication::translate(
"(Categories)",
1585 xds_program_type[71] = QCoreApplication::translate(
"(Categories)",
1587 xds_program_type[72] = QCoreApplication::translate(
"(Categories)",
1589 xds_program_type[73] = QCoreApplication::translate(
"(Categories)",
1591 xds_program_type[74] = QCoreApplication::translate(
"(Categories)",
1593 xds_program_type[75] = QCoreApplication::translate(
"(Categories)",
1595 xds_program_type[76] = QCoreApplication::translate(
"(Categories)",
1597 xds_program_type[77] = QCoreApplication::translate(
"(Categories)",
1599 xds_program_type[78] = QCoreApplication::translate(
"(Categories)",
1601 xds_program_type[79] = QCoreApplication::translate(
"(Categories)",
1603 xds_program_type[80] = QCoreApplication::translate(
"(Categories)",
1605 xds_program_type[81] = QCoreApplication::translate(
"(Categories)",
1607 xds_program_type[82] = QCoreApplication::translate(
"(Categories)",
1609 xds_program_type[83] = QCoreApplication::translate(
"(Categories)",
1611 xds_program_type[84] = QCoreApplication::translate(
"(Categories)",
1613 xds_program_type[85] = QCoreApplication::translate(
"(Categories)",
1615 xds_program_type[86] = QCoreApplication::translate(
"(Categories)",
1617 xds_program_type[87] = QCoreApplication::translate(
"(Categories)",
1619 xds_program_type[88] = QCoreApplication::translate(
"(Categories)",
1621 xds_program_type[89] = QCoreApplication::translate(
"(Categories)",
1623 xds_program_type[90] = QCoreApplication::translate(
"(Categories)",
1625 xds_program_type[91] = QCoreApplication::translate(
"(Categories)",
1627 xds_program_type[92] = QCoreApplication::translate(
"(Categories)",
1629 xds_program_type[93] = QCoreApplication::translate(
"(Categories)",
1631 xds_program_type[94] = QCoreApplication::translate(
"(Categories)",
1633 xds_program_type[95] = QCoreApplication::translate(
"(Categories)",