diff --git a/backend/hanxin.c b/backend/hanxin.c index f568b519..e4482ba9 100644 --- a/backend/hanxin.c +++ b/backend/hanxin.c @@ -628,6 +628,59 @@ void hx_setup_grid(unsigned char* grid, int size, int version) { } } +/* Calculate error correction codes */ +void hx_add_ecc(unsigned char fullstream[], unsigned char datastream[], int version, int ecc_level) { + unsigned char data_block[180]; + unsigned char ecc_block[36]; + + //FIXME: Check that this is the correct method for assembling the data + + int i, j, block; + int batch_size, data_length, ecc_length; + int input_position = -1; + int output_position = -1; + + for (i = 0; i < 3; i++) { + batch_size = hx_table_d1[(((version - 1) + (ecc_level - 1)) * 9) + (3 * i)]; + data_length = hx_table_d1[(((version - 1) + (ecc_level - 1)) * 9) + (3 * i) + 1]; + ecc_length = hx_table_d1[(((version - 1) + (ecc_level - 1)) * 9) + (3 * i) + 2]; + + for(block = 0; block < batch_size; block++) { + for (j = 0; j < data_length; j++) { + input_position++; + output_position++; + data_block[j] = datastream[input_position]; + fullstream[output_position] = datastream[input_position]; + } + + rs_init_gf(0x163); // x^8 + x^6 + x^5 + x + 1 = 0 + rs_init_code(ecc_length, 1); + rs_encode(data_length, data_block, ecc_block); + rs_free(); + + for (j = 0; j < ecc_length; j++) { + output_position++; + fullstream[output_position] = ecc_block[ecc_length - j - 1]; + } + } + } +} + +/* Rearrange data in batches of 13 codewords (section 5.8.2) */ +void make_picket_fence(unsigned char fullstream[], unsigned char picket_fence[], int streamsize) { + int i, start; + int output_position = 0; + + for (start = 0; start < 13; start++) { + for (i = start; i < streamsize; i += 13) { + if (i < streamsize) { + picket_fence[output_position] = fullstream[i]; + output_position++; + } + } + } +} + /* Han Xin Code - main */ int han_xin(struct zint_symbol *symbol, const unsigned char source[], int length) { char mode[length + 1]; @@ -690,17 +743,19 @@ int han_xin(struct zint_symbol *symbol, const unsigned char source[], int length } size = (version * 2) + 21; - + #ifndef _MSC_VER - int datastream[data_codewords]; - int fullstream[hx_total_codewords[version - 1]]; + unsigned char datastream[data_codewords]; + unsigned char fullstream[hx_total_codewords[version - 1]]; + unsigned char picket_fence[hx_total_codewords[version - 1]]; unsigned char grid[size * size]; #else - datastream = (int *) _alloca((data_codewords) * sizeof (int)); - fullstream = (int *) _alloca((hx_total_codewords[version - 1]) * sizeof (int)); + datastream = (unsigned char *) _alloca((data_codewords) * sizeof (unsigned char)); + fullstream = (unsigned char *) _alloca((hx_total_codewords[version - 1]) * sizeof (unsigned char)); + picket_fence = (unsigned char *) _alloca((hx_total_codewords[version - 1]) * sizeof (unsigned char)); grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); #endif - + for (i = 0; i < data_codewords; i++) { datastream[i] = 0; } @@ -710,9 +765,9 @@ int han_xin(struct zint_symbol *symbol, const unsigned char source[], int length datastream[i / 8] += 0x80 >> (i % 8); } } - + hx_setup_grid(grid, size, version); - + printf("Binary: %s\n", binary); printf("Data Codewords:\n"); @@ -721,6 +776,24 @@ int han_xin(struct zint_symbol *symbol, const unsigned char source[], int length } printf("\n"); + hx_add_ecc(fullstream, datastream, version, ecc_level); + + printf("Full stream, including ecc:\n"); + for (i = 0; i < hx_total_codewords[version - 1]; i++) { + printf("%2X ", fullstream[i]); + } + printf("\n"); + + make_picket_fence(fullstream, picket_fence, hx_total_codewords[version - 1]); + + printf("Picket fence:\n"); + for (i = 0; i < hx_total_codewords[version - 1]; i++) { + printf("%2X ", picket_fence[i]); + } + printf("\n"); + + printf("Version %d, ECC level %d\n", version, ecc_level); + symbol->width = size; symbol->rows = size; @@ -732,6 +805,6 @@ int han_xin(struct zint_symbol *symbol, const unsigned char source[], int length } symbol->row_height[i] = 1; } - - return 0; + + return 1; } \ No newline at end of file diff --git a/backend/hanxin.h b/backend/hanxin.h index f4d4289d..3436e6c8 100644 --- a/backend/hanxin.h +++ b/backend/hanxin.h @@ -2,6 +2,7 @@ libzint - the open source barcode library Copyright (C) 2009-2016 Robin Stuart + Copyright (C) 2016 Zoe Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -46,7 +47,7 @@ static int hx_data_codewords_L1[] = { 634, 666, 702, 738, 774, 812, 849, 888, 929, 946, 987, 1028, 1071, 1115, 1160, 1204, 1251, 1271, 1317, 1368, 1416, 1465, 1517, 1569, 1621, 1674, 1697, 1752, 1807, 1864, 1920, 1979, 2037, 2096, 2124, 2184, 2245, 2309, - 2372, 2436, 2501, 2568, 2140, 2633, 2663, 2732, 2800, 2870, 2940, 3011, + 2372, 2436, 2501, 2568, 2633, 2663, 2732, 2800, 2870, 2940, 3011, 3083, 3156, 3190, 3264 }; @@ -65,17 +66,17 @@ static int hx_data_codewords_L3[] = { 175, 191, 205, 221, 228, 245, 261, 280, 298, 317, 337, 358, 376, 397, 408, 428, 452, 474, 498, 522, 545, 572, 597, 608, 635, 660, 689, 717, 746, 774, 805, 817, 847, 880, 910, 943, 975, 1009, 1041, 1076, 1091, 1126, 1161, 1198, - 1600, 1271, 1309, 1348, 1366, 1404, 1443, 1485, 1524, 1566, 1607,1650, 1693, + 1234, 1271, 1309, 1348, 1366, 1404, 1443, 1485, 1524, 1566, 1607,1650, 1693, 1713, 1756, 1800, 1844, 1890, 1935, 1983, 2030, 2050, 2098 }; static int hx_data_codewords_L4[] = { 9, 15, 20, 22, 27, 34, 40, 47, 54, 61, 65, 73, 81, 89, 99, 109, 119, 129, 141, 153, 165, 168, 181, 195, 208, 220, 235, 251, 264, 280, 295, 302, 318, - 334, 352, 368, 386, 405, 424, 441, 450, 490, 509, 531, 552, 574, 595, 605, - 627, 652, 674, 697, 721, 747, 771, 796, 809, 834, 861, 892, 914, 969, 998, + 334, 352, 368, 386, 405, 424, 441, 450, 469, 490, 509, 531, 552, 574, 595, 605, + 627, 652, 674, 697, 721, 747, 771, 796, 809, 834, 861, 892, 914, 941, 969, 998, 1012, 1040, 1069, 1099, 1130, 1160, 1191, 1222, 1253, 1269, 1300, 1334, - 1366, 1433, 1469, 1504, 1520, 1554 + 1366, 1400, 1433, 1469, 1504, 1520, 1554 }; /* Value 'k' from Annex A */ @@ -115,4 +116,345 @@ static int hx_module_m[] = { 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10 +}; + +/* Error correction block sizes from Table D1 */ +static int hx_table_d1[] = { + /* #blocks, k, 2t, #blocks, k, 2t, #blocks, k, 2t */ + 1, 21, 4, 0, 0, 0, 0, 0, 0, // version 1 + 1, 17, 8, 0, 0, 0, 0, 0, 0, + 1, 13, 12, 0, 0, 0, 0, 0, 0, + 1, 9, 16, 0, 0, 0, 0, 0, 0, + 1, 31, 6, 0, 0, 0, 0, 0, 0, // version 2 + 1, 25, 12, 0, 0, 0, 0, 0, 0, + 1, 19, 18, 0, 0, 0, 0, 0, 0, + 1, 15, 22, 0, 0, 0, 0, 0, 0, + 1, 42, 8, 0, 0, 0, 0, 0, 0, // version 3 + 1, 34, 16, 0, 0, 0, 0, 0, 0, + 1, 26, 24, 0, 0, 0, 0, 0, 0, + 1, 20, 30, 0, 0, 0, 0, 0, 0, + 1, 46, 8, 0, 0, 0, 0, 0, 0, // version 4 + 1, 38, 16, 0, 0, 0, 0, 0, 0, + 1, 30, 24, 0, 0, 0, 0, 0, 0, + 1, 22, 32, 0, 0, 0, 0, 0, 0, + 1, 57, 12, 0, 0, 0, 0, 0, 0, // version 5 + 1, 49, 20, 0, 0, 0, 0, 0, 0, + 1, 37, 32, 0, 0, 0, 0, 0, 0, + 1, 14, 20, 1, 13, 22, 0, 0, 0, + 1, 70, 14, 0, 0, 0, 0, 0, 0, // version 6 + 1, 58, 26, 0, 0, 0, 0, 0, 0, + 1, 24, 20, 1, 22, 18, 0, 0, 0, + 1, 16, 24, 1, 18, 26, 0, 0, 0, + 1, 84, 16, 0, 0, 0, 0, 0, 0, // version 7 + 1, 70, 30, 0, 0, 0, 0, 0, 0, + 1, 26, 22, 1, 28, 24, 0, 0, 0, + 2, 14, 20, 1, 12, 20, 0, 0, 0, + 1, 99, 18, 0, 0, 0, 0, 0, 0, // version 8 + 1, 40, 18, 1, 41, 18, 0, 0, 0, + 1, 31, 26, 1, 32, 28, 0, 0, 0, + 2, 16, 24, 1, 15, 22, 0, 0, 0, + 1, 114, 22, 0, 0, 0, 0, 0, 0, // version 9 + 2, 48, 20, 0, 0, 0, 0, 0, 0, + 2, 24, 20, 1, 26, 22, 0, 0, 0, + 2, 18, 28, 1, 18, 26, 0, 0, 0, + 1, 131, 24, 0, 0, 0, 0, 0, 0, // version 10 + 1, 52, 22, 1, 57, 24, 0, 0, 0, + 2, 27, 24, 1, 29, 24, 0, 0, 0, + 2, 21, 32, 1, 19, 30, 0, 0, 0, + 1, 135, 26, 0, 0, 0, 0, 0, 0, // version 11 + 1, 56, 24, 1, 57, 24, 0, 0, 0, + 2, 28, 24, 1, 31, 26, 0, 0, 0, + 2, 22, 32, 1, 21, 32, 0, 0, 0, + 1, 153, 28, 0, 0, 0, 0, 0, 0, // version 12 + 1, 62, 26, 1, 65, 28, 0, 0, 0, + 2, 32, 28, 1, 33, 28, 0, 0, 0, + 3, 17, 26, 1, 22, 30, 0, 0, 0, + 1, 86, 16, 1, 85, 16, 0, 0, 0, // version 13 + 1, 71, 30, 1, 72, 30, 0, 0, 0, + 2, 37, 32, 1, 35, 30, 0, 0, 0, + 3, 20, 30, 1, 21, 32, 0, 0, 0, + 1, 94, 18, 1, 95, 18, 0, 0, 0, // version 14 + 2, 51, 22, 1, 55, 24, 0, 0, 0, + 3, 30, 26, 1, 31, 26, 0, 0, 0, + 4, 18, 28, 1, 17, 24, 0, 0, 0, + 1, 104, 20, 1, 105, 20, 0, 0, 0, // version 15 + 2, 57, 24, 1, 61, 26, 0, 0, 0, + 3, 33, 28, 1, 36, 30, 0, 0, 0, + 4, 20, 30, 1, 19, 30, 0, 0, 0, + 1, 115, 22, 1, 114, 22, 0, 0, 0, // version 16 + 2, 65, 28, 1, 61, 26, 0, 0, 0, + 3, 38, 32, 1, 33, 30, 0, 0, 0, + 5, 19, 28, 1, 14, 24, 0, 0, 0, + 1, 126, 24, 1, 125, 24, 0, 0, 0, // version 17 + 2, 70, 30, 1, 69, 30, 0, 0, 0, + 4, 33, 28, 1, 29, 26, 0, 0, 0, + 5, 20, 30, 1, 19, 30, 0, 0, 0, + 1, 136, 26, 1, 137, 26, 0, 0, 0, //version 18 + 3, 56, 24, 1, 59, 26, 0, 0, 0, + 5, 35, 30, 0, 0, 0, 0, 0, 0, + 6, 18, 28, 1, 21, 28, 0, 0, 0, + 1, 148, 28, 1, 149, 28, 0, 0, 0, // version 19 + 3, 61, 26, 1, 64, 28, 0, 0, 0, + 7, 24, 20, 1, 23, 22, 0, 0, 0, + 6, 20, 30, 1, 21, 32, 0, 0, 0, + 3, 107, 20, 0, 0, 0, 0, 0, 0, // version 20 + 3, 65, 28, 1, 72, 30, 0, 0, 0, + 7, 26, 22, 1, 23, 22, 0, 0, 0, + 7, 19, 28, 1, 20, 32, 0, 0, 0, + 3, 115, 22, 0, 0, 0, 0, 0, 0, // version 21 + 4, 56, 24, 1, 63, 28, 0, 0, 0, + 7, 28, 24, 1, 25, 22, 0, 0, 0, + 8, 18, 28, 1, 21, 22, 0, 0, 0, + 2, 116, 22, 1, 122, 24, 0, 0, 0, // version 22 + 4, 56, 24, 1, 72, 30, 0, 0, 0, + 7, 28, 24, 1, 32, 26, 0, 0, 0, + 8, 18, 28, 1, 24, 30, 0, 0, 0, + 3, 127, 24, 0, 0, 0, 0, 0, 0, // version 23 + 5, 51, 22, 1, 62, 26, 0, 0, 0, + 7, 30, 26, 1, 35, 26, 0, 0, 0, + 8, 20, 30, 1, 21, 32, 0, 0, 0, + 2, 135, 26, 1, 137, 26, 0, 0, 0, // version 24 + 5, 56, 24, 1, 59, 26, 0, 0, 0, + 7, 33, 28, 1, 30, 28, 0, 0, 0, + 11, 16, 24, 1, 19, 26, 0, 0, 0, + 3, 105, 20, 1, 121, 22, 0, 0, 0, // version 25 + 5, 61, 26, 1, 57, 26, 0, 0, 0, + 9, 28, 24, 1, 28, 22, 0, 0, 0, + 10, 19, 28, 1, 18, 30, 0, 0, 0, + 2, 157, 30, 1, 150, 28, 0, 0, 0, // version 26 + 5, 65, 28, 1, 61, 26, 0, 0, 0, + 8, 33, 28, 1, 34, 30, 0, 0, 0, + 10, 19, 28, 2, 15, 26, 0, 0, 0, + 3, 126, 24, 1, 115, 22, 0, 0, 0, // version 27 + 7, 51, 22, 1, 54, 22, 0, 0, 0, + 8, 35, 30, 1, 37, 30, 0, 0, 0, + 15, 15, 22, 1, 10, 22, 0, 0, 0, + 4, 105, 20, 1, 103, 20, 0, 0, 0, // version 28 + 7, 56, 24, 1, 45, 18, 0, 0, 0, + 10, 31, 26, 1, 27, 26, 0, 0, 0, + 10, 17, 26, 3, 20, 28, 1, 21, 28, + 3, 139, 26, 1, 137, 28, 0, 0, 0, // version 29 + 6, 66, 28, 1, 66, 30, 0, 0, 0, + 9, 36, 30, 1, 34, 32, 0, 0, 0, + 13, 19, 28, 1, 17, 32, 0, 0, 0, + 6, 84, 16, 1, 82, 16, 0, 0, 0, // version 30 + 6, 70, 30, 1, 68, 30, 0, 0, 0, + 7, 35, 30, 3, 33, 28, 1, 32, 28, + 13, 20, 30, 1, 20, 28, 0, 0, 0, + 5, 105, 20, 1, 94, 18, 0, 0, 0, // version 31 + 6, 74, 32, 1, 71, 30, 0, 0, 0, + 11, 33, 28, 1, 34, 32, 0, 0, 0, + 13, 19, 28, 3, 16, 26, 0, 0, 0, + 4, 127, 24, 1, 126, 24, 0, 0, 0, // version 32 + 7, 66, 28, 1, 66, 30, 0, 0, 0, + 12, 30,24, 1, 24, 28, 1, 24, 30, + 15, 19, 28, 1, 17, 32, 0, 0, 0, + 7, 84, 16, 1, 78, 16, 0, 0, 0, // version 33 + 7, 70, 30, 1, 66, 28, 0, 0, 0, + 12, 33, 28, 1, 32, 30, 0, 0, 0, + 14, 21, 32, 1, 24, 28, 0, 0, 0, + 5, 117, 22, 1, 117, 24, 0, 0, 0, // version 34 + 8, 66, 28, 1, 58, 26, 0, 0, 0, + 11, 38, 32, 1, 34, 32, 0, 0, 0, + 15, 20, 30, 2, 17, 26, 0, 0, 0, + 4, 148, 28, 1, 146, 28, 0, 0, 0, // version 35 + 8, 68, 30, 1, 70, 24, 0, 0, 0, + 10, 36, 32, 3, 38, 28, 0, 0, 0, + 16, 19, 28, 3, 16, 26, 0, 0, 0, + 4, 126, 24, 2, 135, 26, 0, 0, 0, // version 36 + 8, 70, 28, 2, 43, 26, 0, 0, 0, + 13, 32, 28, 2, 41, 30, 0, 0, 0, + 17, 19, 28, 3, 15, 26, 0, 0, 0, + 5, 136, 26, 1, 132, 24, 0, 0, 0, // version 37 + 5, 67, 30, 4, 68, 28, 1, 69, 28, + 14, 35, 30, 1, 32, 24, 0, 0, 0, + 18, 18, 26, 3, 16, 28, 1, 14, 28, + 3, 142, 26, 3, 141, 28, 0, 0, 0, // version 38 + 8, 70, 30, 1, 73, 32, 1, 74, 32, + 12, 34, 30, 3, 34, 26, 1, 35, 28, + 18, 21, 32, 1, 27, 30, 0, 0, 0, + 5, 116, 22, 2, 103, 20, 1, 102, 20, // version 39 + 9, 74, 32, 1, 74, 30, 0, 0, 0, + 14, 34, 28, 2, 32, 32, 1, 32, 30, + 19, 21, 32, 1, 25, 26, 0, 0, 0, + 7, 116, 22, 1, 117, 22, 0, 0, 0, // version 40 + 11, 65, 28, 1, 58, 24, 0, 0, 0, + 15, 38, 32, 1, 27, 28, 0, 0, 0, + 20, 20, 30, 1, 20, 32, 1, 21, 32, + 6, 136, 26, 1, 130, 24, 0, 0, 0, // version 41 + 11, 66, 28, 1, 62, 30, 0, 0, 0, + 14, 34, 28, 3, 34, 32, 1, 30, 30, + 18, 20, 30, 3, 20, 28, 2, 15, 26, + 5, 105, 20, 2, 115, 22, 2, 116, 22, // version 42 + 10, 75, 32, 1, 73, 32, 0, 0, 0, + 16, 38, 32, 1, 27, 28, 0, 0, 0, + 22, 19, 28, 2, 16, 30, 1, 19, 30, + 6, 147, 28, 1, 146, 28, 0, 0, 0, // version 43 + 11, 66, 28, 2, 65, 30, 0, 0, 0, + 18, 33, 28, 2, 33, 30, 0, 0, 0, + 22, 21, 32, 1, 28, 30, 0, 0, 0, + 6, 116, 22, 3, 125, 24, 0, 0, 0, // version 44 + 11, 75, 32, 1, 68, 30, 0, 0, 0, + 13, 35, 28, 6, 34, 32, 1, 30, 30, + 23, 21, 32, 1, 26, 30, 0, 0, 0, + 7, 105, 20, 4, 95, 18, 0, 0, 0, // version 45 + 12, 67, 28, 1, 63, 30, 1, 62, 32, + 21, 31, 26, 2, 33, 32, 0, 0, 0, + 23, 21, 32, 2, 24, 30, 0, 0, 0, + 10, 116, 22, 0, 0, 0, 0, 0, 0, // version 46 + 12, 74, 32, 1, 78, 30, 0, 0, 0, + 18, 37, 32, 1, 39, 30, 1, 41, 28, + 25, 21, 32, 1, 27, 28, 0, 0, 0, + 5, 126, 24, 4, 115, 22, 1, 114, 22, // version 47 + 12, 67, 28, 2, 66, 32, 1, 68, 30, + 21, 35, 30, 1, 39, 30, 0, 0, 0, + 26, 21, 32, 1, 28, 28, 0, 0, 0, + 9, 126, 24, 1, 117, 22, 0, 0, 0, // version 48 + 13, 75, 32, 1, 68, 30, 0, 0, 0, + 20, 35, 30, 3, 35, 28, 0, 0, 0, + 27, 21, 32, 1, 28, 30, 0, 0, 0, + 9, 126, 24, 1, 137, 26, 0, 0, 0, // version 49 + 13, 71, 30, 2, 68, 32, 0, 0, 0, + 20, 37, 32, 1, 39, 28, 1, 38, 28, + 24, 20, 32, 5, 25, 28, 0, 0, 0, + 8, 147, 28, 1, 141, 28, 0, 0, 0, // version 50 + 10, 73, 32, 4, 74, 30, 1, 73, 30, + 16, 36, 32, 6, 39, 30, 1, 37, 30, + 27, 21, 32, 3, 20, 26, 0, 0, 0, + 9, 137, 26, 1, 135, 26, 0, 0, 0, // version 51 + 12, 70, 30, 4, 75, 32, 0, 0, 0, + 24, 35, 30, 1, 40, 28, 0, 0, 0, + 23, 20, 32, 8, 24, 30, 0, 0, 0, + 14, 95, 18, 1, 86, 18, 0, 0, 0, // version 52 + 13, 73, 32, 3, 77, 30, 0, 0, 0, + 24, 35, 30, 2, 35, 28, 0, 0, 0, + 26, 21, 32, 5, 21, 30, 1, 23, 30, + 9, 147, 28, 1, 142, 28, 0, 0, 0, // version 53 + 10, 73, 30, 6, 70, 32, 1, 71, 32, + 25, 35, 30, 2, 34, 26, 0, 0, 0, + 29, 21, 32, 4, 22, 30, 0, 0, 0, + 11, 126, 24, 1, 131, 24, 0, 0, 0, // version 54 + 16, 74, 32, 1, 79, 30, 0, 0, 0, + 25, 38, 32, 1, 25, 30, 0, 0, 0, + 33, 21, 32, 1, 28, 28, 0, 0, 0, + 14, 105, 20, 1, 99, 18, 0, 0, 0, // version 55 + 19, 65, 28, 1, 72, 28, 0, 0, 0, + 24, 37, 32, 2, 40, 30, 1, 41, 30, + 31, 21, 32, 4, 24, 32, 0, 0, 0, + 10, 147, 28, 1, 151, 28, 0, 0, 0, // version 56 + 15, 71, 30, 3, 71, 32, 1, 73, 32, + 24, 37, 32, 3, 38, 30, 1, 39, 30, + 36, 19, 30, 3, 29, 26, 0, 0, 0, + 15, 105, 20, 1, 99, 18, 0, 0, 0, // version 57 + 19, 70, 30, 1, 64, 28, 0, 0, 0, + 27, 38, 32, 2, 25, 26, 0, 0, 0, + 38, 20, 30, 2, 18, 28, 0, 0, 0, + 14, 105, 20, 1, 113, 22, 1, 114, 22, // version 58 + 17, 67, 30, 3, 92, 32, 0, 0, 0, + 30, 35, 30, 1, 41, 30, 0, 0, 0, + 36, 21, 32, 1, 26, 30, 1, 27, 30, + 11, 146, 28, 1, 146, 26, 0, 0, 0, // version 59 + 20, 70, 30, 1, 60, 26, 0, 0, 0, + 29, 38, 32, 1, 24, 32, 0, 0, 0, + 40, 20, 30, 2, 17, 26, 0, 0, 0, + 3, 137, 26, 1, 136, 26, 10, 126, 24, // version 60 + 22, 65, 28, 1, 75, 30, 0, 0, 0, + 30, 37, 32, 1, 51, 30, 0, 0, 0, + 42, 20, 30, 1, 21, 30, 0, 0, 0, + 12, 126, 24, 2, 118, 22, 1, 116, 22, // version 61 + 19, 74, 32, 1, 74, 30, 1, 72, 28, + 30, 38, 32, 2, 29, 30, 0, 0, 0, + 39, 20, 32, 2, 37, 26, 1, 38, 26, + 12, 126, 24, 3, 136, 26, 0, 0, 0, // version 62 + 21, 70, 30, 2, 65, 28, 0, 0, 0, + 34, 35, 30, 1, 44, 32, 0, 0, 0, + 42, 20, 30, 2, 19, 28, 2, 18, 28, + 12, 126, 24, 3, 117, 22, 1, 116, 22, // version 63 + 25, 61, 26, 2, 62, 28, 0, 0, 0, + 34, 35, 30, 1, 40, 32, 1, 41, 32, + 45, 20, 30, 1, 20, 32, 1, 21, 32, + 15, 105, 20, 2, 115, 22, 2, 116, 22, // version 64 + 25, 65, 28, 1, 72, 28, 0, 0, 0, + 18, 35, 30, 17, 37, 32, 1, 50, 32, + 42, 20, 30, 6, 19, 28, 1, 15, 28, + 19, 105, 20, 1, 101, 20, 0, 0, 0, // version 65 + 33, 51, 22, 1, 65, 22, 0, 0, 0, + 40, 33, 28, 1, 28, 28, 0, 0, 0, + 49, 20, 30, 1, 18, 28, 0, 0, 0, + 18, 105, 20, 2, 117, 22, 0, 0, 0, // version 66 + 26, 65, 28, 1, 80, 30, 0, 0, 0, + 35, 35, 30, 3, 35, 28, 1, 36, 28, + 52, 18, 28, 2, 38, 30, 0, 0, 0, + 26, 84, 16, 0, 0, 0, 0, 0, 0, // version 67 + 26, 70, 30, 0, 0, 0, 0, 0, 0, + 45, 31, 26, 1, 9, 26, 0, 0, 0, + 52, 20, 30, 0, 0, 0, 0, 0, 0, + 16, 126, 24, 1, 114, 22, 1, 115, 22, // version 68 + 23, 70, 30, 3, 65, 28, 1, 66, 28, + 40, 35, 30, 1, 43, 30, 0, 0, 0, + 46, 20, 30, 7, 19, 28, 1, 16, 28, + 19, 116, 22, 1, 105, 22, 0, 0, 0, // version 69 + 20, 70, 30, 7, 66, 28, 1, 63, 28, + 40, 35, 30, 1, 42, 32, 1, 43, 32, + 54, 20, 30, 1, 19, 30, 0, 0, 0, + 17, 126, 24, 2, 115, 22, 0, 0, 0, // version 70 + 24, 70, 30, 4, 74, 32, 0, 0, 0, + 48, 31, 26, 2, 18, 26, 0, 0, 0, + 54, 19, 28, 6, 15, 26, 1, 14, 26, + 29, 84, 16, 0, 0, 0, 0, 0, 0, // version 71 + 29, 70, 30, 0, 0, 0, 0, 0, 0, + 6, 34, 30, 3, 36, 30, 38, 33, 28, + 58, 20, 30, 0, 0, 0, 0, 0, 0, + 16, 147, 28, 1, 149, 28, 0, 0, 0, // version 72 + 31, 66, 28, 1, 37, 26, 0, 0, 0, + 48, 33, 28, 1, 23, 26, 0, 0, 0, + 53, 20, 30, 6, 19, 28, 1, 17, 28, + 20, 115, 22, 2, 134, 24, 0, 0, 0, // verdion 73 + 29, 66, 28, 2, 56, 26, 2, 57, 26, + 45, 36, 30, 2, 15, 28, 0, 0, 0, + 59, 20, 30, 2, 21, 32, 0, 0, 0, + 17, 147, 28, 1, 134, 26, 0, 0, 0, // version 74 + 26, 70, 30, 5, 75, 32, 0, 0, 0, + 47, 35, 30, 1, 48, 32, 0, 0, 0, + 64, 18, 28, 2, 33, 30, 1, 35, 30, + 22, 115, 22, 1, 133, 24, 0, 0, 0, // version 75 + 33, 65, 28, 1, 74, 28, 0, 0, 0, + 43, 36, 30, 5, 27, 28, 1, 30, 28, + 57, 20, 30, 5, 21, 32, 1, 24, 32, + 18, 136, 26, 2, 142, 26, 0, 0, 0, // version 76 + 33, 66, 28, 2, 49, 26, 0, 0, 0, + 48, 35, 30, 2, 38, 28, 0, 0, 0, + 64, 20, 30, 1, 20, 32, 0, 0, 0, + 19, 126, 24, 2, 135, 26, 1, 136, 26, // version 77 + 32, 66, 28, 2, 55, 26, 2, 56, 26, + 49, 36, 30, 2, 18, 32, 0, 0, 0, + 65, 18, 28, 5, 27, 30, 1, 29, 30, + 20, 137, 26, 1, 130, 26, 0, 0, 0, // version 78 + 30, 75, 32, 2, 71, 32, 0, 0, 0, + 46, 35, 30, 6, 39, 32, 0, 0, 0, + 3, 12, 30, 70, 19, 28, 0, 0, 0, + 20, 147, 28, 0, 0, 0, 0, 0, 0, // version 79 + 35, 70, 30, 0, 0, 0, 0, 0, 0, + 49, 35, 30, 5, 35, 28, 0, 0, 0, + 70, 20, 30, 0, 0, 0, 0, 0, 0, + 21, 136, 26, 1, 155, 28, 0, 0, 0, // version 80 + 34, 70, 30, 1, 64, 28, 1, 65, 28, + 54, 35, 30, 1, 45, 30, 0, 0, 0, + 68, 20, 30, 3, 18, 28, 1, 19, 28, + 19, 126, 24, 5, 115, 22, 1, 114, 22, // version 81 + 33, 70, 30, 3, 65, 28, 1, 64, 28, + 52, 35, 30, 3, 41, 32, 1, 40, 32, + 67, 20, 30, 5, 21, 32, 1, 24, 32, + 2, 150, 28, 21, 136, 26, 0, 0, 0, // version 82 + 32, 70, 30, 6, 65, 28, 0, 0, 0, + 52, 38, 32, 2, 27, 32, 0, 0, 0, + 73, 20, 30, 2, 22, 32, 0, 0, 0, + 21, 126, 24, 4, 136, 26, 0, 0, 0, // version 83 + 30, 74, 32, 6, 73, 30, 0, 0, 0, + 54, 35, 30, 4, 40, 32, 0, 0, 0, + 75, 20, 30, 1, 20, 28, 0, 0, 0, + 30, 105, 20, 1, 114, 22, 0, 0, 0, // version 84 + 3, 45, 22, 55, 47, 20, 0, 0, 0, + 2, 26, 26, 62, 33, 28, 0, 0, 0, + 79, 18, 28, 4, 33, 30, 0, 0, 0 }; \ No newline at end of file