deflate-ruby 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CLAUDE.md +138 -0
- data/LICENSE.txt +21 -0
- data/README.md +117 -0
- data/ext/deflate_ruby/deflate_ruby.c +301 -0
- data/ext/deflate_ruby/extconf.rb +34 -0
- data/ext/deflate_ruby/libdeflate/CMakeLists.txt +270 -0
- data/ext/deflate_ruby/libdeflate/COPYING +22 -0
- data/ext/deflate_ruby/libdeflate/NEWS.md +494 -0
- data/ext/deflate_ruby/libdeflate/README.md +228 -0
- data/ext/deflate_ruby/libdeflate/common_defs.h +747 -0
- data/ext/deflate_ruby/libdeflate/lib/adler32.c +162 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/adler32_impl.h +358 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/cpu_features.c +230 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/cpu_features.h +214 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/crc32_impl.h +600 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/crc32_pmull_helpers.h +156 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/crc32_pmull_wide.h +226 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/matchfinder_impl.h +78 -0
- data/ext/deflate_ruby/libdeflate/lib/bt_matchfinder.h +342 -0
- data/ext/deflate_ruby/libdeflate/lib/cpu_features_common.h +93 -0
- data/ext/deflate_ruby/libdeflate/lib/crc32.c +262 -0
- data/ext/deflate_ruby/libdeflate/lib/crc32_multipliers.h +377 -0
- data/ext/deflate_ruby/libdeflate/lib/crc32_tables.h +587 -0
- data/ext/deflate_ruby/libdeflate/lib/decompress_template.h +777 -0
- data/ext/deflate_ruby/libdeflate/lib/deflate_compress.c +4129 -0
- data/ext/deflate_ruby/libdeflate/lib/deflate_compress.h +15 -0
- data/ext/deflate_ruby/libdeflate/lib/deflate_constants.h +56 -0
- data/ext/deflate_ruby/libdeflate/lib/deflate_decompress.c +1208 -0
- data/ext/deflate_ruby/libdeflate/lib/gzip_compress.c +90 -0
- data/ext/deflate_ruby/libdeflate/lib/gzip_constants.h +45 -0
- data/ext/deflate_ruby/libdeflate/lib/gzip_decompress.c +144 -0
- data/ext/deflate_ruby/libdeflate/lib/hc_matchfinder.h +401 -0
- data/ext/deflate_ruby/libdeflate/lib/ht_matchfinder.h +234 -0
- data/ext/deflate_ruby/libdeflate/lib/lib_common.h +106 -0
- data/ext/deflate_ruby/libdeflate/lib/matchfinder_common.h +224 -0
- data/ext/deflate_ruby/libdeflate/lib/riscv/matchfinder_impl.h +97 -0
- data/ext/deflate_ruby/libdeflate/lib/utils.c +141 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/adler32_impl.h +134 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/adler32_template.h +518 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/cpu_features.c +183 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/cpu_features.h +169 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/crc32_impl.h +160 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/crc32_pclmul_template.h +495 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/decompress_impl.h +57 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/matchfinder_impl.h +122 -0
- data/ext/deflate_ruby/libdeflate/lib/zlib_compress.c +82 -0
- data/ext/deflate_ruby/libdeflate/lib/zlib_constants.h +21 -0
- data/ext/deflate_ruby/libdeflate/lib/zlib_decompress.c +104 -0
- data/ext/deflate_ruby/libdeflate/libdeflate-config.cmake.in +3 -0
- data/ext/deflate_ruby/libdeflate/libdeflate.h +411 -0
- data/ext/deflate_ruby/libdeflate/libdeflate.pc.in +18 -0
- data/ext/deflate_ruby/libdeflate/programs/CMakeLists.txt +105 -0
- data/ext/deflate_ruby/libdeflate/programs/benchmark.c +696 -0
- data/ext/deflate_ruby/libdeflate/programs/checksum.c +218 -0
- data/ext/deflate_ruby/libdeflate/programs/config.h.in +19 -0
- data/ext/deflate_ruby/libdeflate/programs/gzip.c +688 -0
- data/ext/deflate_ruby/libdeflate/programs/prog_util.c +521 -0
- data/ext/deflate_ruby/libdeflate/programs/prog_util.h +225 -0
- data/ext/deflate_ruby/libdeflate/programs/test_checksums.c +200 -0
- data/ext/deflate_ruby/libdeflate/programs/test_custom_malloc.c +155 -0
- data/ext/deflate_ruby/libdeflate/programs/test_incomplete_codes.c +385 -0
- data/ext/deflate_ruby/libdeflate/programs/test_invalid_streams.c +130 -0
- data/ext/deflate_ruby/libdeflate/programs/test_litrunlen_overflow.c +72 -0
- data/ext/deflate_ruby/libdeflate/programs/test_overread.c +95 -0
- data/ext/deflate_ruby/libdeflate/programs/test_slow_decompression.c +472 -0
- data/ext/deflate_ruby/libdeflate/programs/test_trailing_bytes.c +151 -0
- data/ext/deflate_ruby/libdeflate/programs/test_util.c +237 -0
- data/ext/deflate_ruby/libdeflate/programs/test_util.h +61 -0
- data/ext/deflate_ruby/libdeflate/programs/tgetopt.c +118 -0
- data/ext/deflate_ruby/libdeflate/scripts/android_build.sh +118 -0
- data/ext/deflate_ruby/libdeflate/scripts/android_tests.sh +69 -0
- data/ext/deflate_ruby/libdeflate/scripts/benchmark.sh +10 -0
- data/ext/deflate_ruby/libdeflate/scripts/checksum.sh +10 -0
- data/ext/deflate_ruby/libdeflate/scripts/checksum_benchmarks.sh +253 -0
- data/ext/deflate_ruby/libdeflate/scripts/cmake-helper.sh +17 -0
- data/ext/deflate_ruby/libdeflate/scripts/deflate_benchmarks.sh +119 -0
- data/ext/deflate_ruby/libdeflate/scripts/exec_tests.sh +38 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen-release-archives.sh +37 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_bitreverse_tab.py +19 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_crc32_multipliers.c +199 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_crc32_tables.c +105 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_default_litlen_costs.py +44 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_offset_slot_map.py +29 -0
- data/ext/deflate_ruby/libdeflate/scripts/gzip_tests.sh +523 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/deflate_compress/corpus/0 +0 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/deflate_compress/fuzz.c +95 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/deflate_decompress/corpus/0 +3 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/deflate_decompress/fuzz.c +62 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/fuzz.sh +108 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/gzip_decompress/corpus/0 +0 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/gzip_decompress/fuzz.c +19 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/zlib_decompress/corpus/0 +3 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/zlib_decompress/fuzz.c +19 -0
- data/ext/deflate_ruby/libdeflate/scripts/run_tests.sh +416 -0
- data/ext/deflate_ruby/libdeflate/scripts/toolchain-i686-w64-mingw32.cmake +8 -0
- data/ext/deflate_ruby/libdeflate/scripts/toolchain-x86_64-w64-mingw32.cmake +8 -0
- data/lib/deflate_ruby/version.rb +5 -0
- data/lib/deflate_ruby.rb +71 -0
- metadata +191 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* test_slow_decompression.c
|
|
3
|
+
*
|
|
4
|
+
* Test how quickly libdeflate decompresses degenerate/malicious compressed data
|
|
5
|
+
* streams that start new Huffman blocks extremely frequently.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include "test_util.h"
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* Generate a DEFLATE stream containing all empty "static Huffman" blocks.
|
|
12
|
+
*
|
|
13
|
+
* libdeflate used to decompress this very slowly (~1000x slower than typical
|
|
14
|
+
* data), but now it's much faster (only ~2x slower than typical data) because
|
|
15
|
+
* now it skips rebuilding the decode tables for the static Huffman codes when
|
|
16
|
+
* they're already loaded into the decompressor.
|
|
17
|
+
*/
|
|
18
|
+
static void
|
|
19
|
+
generate_empty_static_huffman_blocks(u8 *p, size_t len)
|
|
20
|
+
{
|
|
21
|
+
struct output_bitstream os = { .next = p, .end = p + len };
|
|
22
|
+
|
|
23
|
+
while (put_bits(&os, 0, 1) && /* BFINAL: 0 */
|
|
24
|
+
put_bits(&os, 1, 2) && /* BTYPE: STATIC_HUFFMAN */
|
|
25
|
+
put_bits(&os, 0, 7)) /* litlensym_256 (end-of-block) */
|
|
26
|
+
;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static bool
|
|
30
|
+
generate_empty_dynamic_huffman_block(struct output_bitstream *os)
|
|
31
|
+
{
|
|
32
|
+
int i;
|
|
33
|
+
|
|
34
|
+
if (!put_bits(os, 0, 1)) /* BFINAL: 0 */
|
|
35
|
+
return false;
|
|
36
|
+
if (!put_bits(os, 2, 2)) /* BTYPE: DYNAMIC_HUFFMAN */
|
|
37
|
+
return false;
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
* Write a minimal Huffman code, then the end-of-block symbol.
|
|
41
|
+
*
|
|
42
|
+
* Litlen code:
|
|
43
|
+
* litlensym_256 (end-of-block) freq=1 len=1 codeword=0
|
|
44
|
+
* Offset code:
|
|
45
|
+
* offsetsym_0 (unused) freq=0 len=1 codeword=0
|
|
46
|
+
*
|
|
47
|
+
* Litlen and offset codeword lengths:
|
|
48
|
+
* [0..255] = 0 presym_{18,18}
|
|
49
|
+
* [256] = 1 presym_1
|
|
50
|
+
* [257] = 1 presym_1
|
|
51
|
+
*
|
|
52
|
+
* Precode:
|
|
53
|
+
* presym_1 freq=2 len=1 codeword=0
|
|
54
|
+
* presym_18 freq=2 len=1 codeword=1
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
if (!put_bits(os, 0, 5)) /* num_litlen_syms: 0 + 257 */
|
|
58
|
+
return false;
|
|
59
|
+
if (!put_bits(os, 0, 5)) /* num_offset_syms: 0 + 1 */
|
|
60
|
+
return false;
|
|
61
|
+
if (!put_bits(os, 14, 4)) /* num_explicit_precode_lens: 14 + 4 */
|
|
62
|
+
return false;
|
|
63
|
+
/*
|
|
64
|
+
* Precode codeword lengths: order is
|
|
65
|
+
* [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]
|
|
66
|
+
*/
|
|
67
|
+
for (i = 0; i < 2; i++) { /* presym_{16,17}: len=0 */
|
|
68
|
+
if (!put_bits(os, 0, 3))
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
if (!put_bits(os, 1, 3)) /* presym_18: len=1 */
|
|
72
|
+
return false;
|
|
73
|
+
for (i = 0; i < 14; i++) { /* presym_{0,...,14}: len=0 */
|
|
74
|
+
if (!put_bits(os, 0, 3))
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (!put_bits(os, 1, 3)) /* presym_1: len=1 */
|
|
78
|
+
return false;
|
|
79
|
+
|
|
80
|
+
/* Litlen and offset codeword lengths */
|
|
81
|
+
for (i = 0; i < 2; i++) {
|
|
82
|
+
if (!put_bits(os, 1, 1) || /* presym_18, 128 zeroes */
|
|
83
|
+
!put_bits(os, 117, 7))
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (!put_bits(os, 0, 1)) /* presym_1 */
|
|
87
|
+
return false;
|
|
88
|
+
if (!put_bits(os, 0, 1)) /* presym_1 */
|
|
89
|
+
return false;
|
|
90
|
+
/* Done writing the Huffman codes */
|
|
91
|
+
|
|
92
|
+
return put_bits(os, 0, 1); /* litlensym_256 (end-of-block) */
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* Generate a DEFLATE stream containing all empty "dynamic Huffman" blocks.
|
|
97
|
+
*
|
|
98
|
+
* This is the worst known case currently, being ~100x slower to decompress than
|
|
99
|
+
* typical data.
|
|
100
|
+
*/
|
|
101
|
+
static void
|
|
102
|
+
generate_empty_dynamic_huffman_blocks(u8 *p, size_t len)
|
|
103
|
+
{
|
|
104
|
+
struct output_bitstream os = { .next = p, .end = p + len };
|
|
105
|
+
|
|
106
|
+
while (generate_empty_dynamic_huffman_block(&os))
|
|
107
|
+
;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
#define NUM_ITERATIONS 100
|
|
111
|
+
|
|
112
|
+
static u64
|
|
113
|
+
do_test_libdeflate(const char *input_type, const u8 *in, size_t in_nbytes,
|
|
114
|
+
u8 *out, size_t out_nbytes_avail)
|
|
115
|
+
{
|
|
116
|
+
struct libdeflate_decompressor *d;
|
|
117
|
+
enum libdeflate_result res;
|
|
118
|
+
u64 t;
|
|
119
|
+
int i;
|
|
120
|
+
|
|
121
|
+
d = libdeflate_alloc_decompressor();
|
|
122
|
+
ASSERT(d != NULL);
|
|
123
|
+
|
|
124
|
+
t = timer_ticks();
|
|
125
|
+
for (i = 0; i < NUM_ITERATIONS; i++) {
|
|
126
|
+
res = libdeflate_deflate_decompress(d, in, in_nbytes, out,
|
|
127
|
+
out_nbytes_avail, NULL);
|
|
128
|
+
ASSERT(res == LIBDEFLATE_BAD_DATA ||
|
|
129
|
+
res == LIBDEFLATE_INSUFFICIENT_SPACE);
|
|
130
|
+
}
|
|
131
|
+
t = timer_ticks() - t;
|
|
132
|
+
|
|
133
|
+
printf("[%s, libdeflate]: %"PRIu64" KB/s\n", input_type,
|
|
134
|
+
timer_KB_per_s((u64)in_nbytes * NUM_ITERATIONS, t));
|
|
135
|
+
|
|
136
|
+
libdeflate_free_decompressor(d);
|
|
137
|
+
return t;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
static u64
|
|
141
|
+
do_test_zlib(const char *input_type, const u8 *in, size_t in_nbytes,
|
|
142
|
+
u8 *out, size_t out_nbytes_avail)
|
|
143
|
+
{
|
|
144
|
+
z_stream z;
|
|
145
|
+
int res;
|
|
146
|
+
u64 t;
|
|
147
|
+
int i;
|
|
148
|
+
|
|
149
|
+
memset(&z, 0, sizeof(z));
|
|
150
|
+
res = inflateInit2(&z, -15);
|
|
151
|
+
ASSERT(res == Z_OK);
|
|
152
|
+
|
|
153
|
+
t = timer_ticks();
|
|
154
|
+
for (i = 0; i < NUM_ITERATIONS; i++) {
|
|
155
|
+
inflateReset(&z);
|
|
156
|
+
z.next_in = (void *)in;
|
|
157
|
+
z.avail_in = in_nbytes;
|
|
158
|
+
z.next_out = out;
|
|
159
|
+
z.avail_out = out_nbytes_avail;
|
|
160
|
+
res = inflate(&z, Z_FINISH);
|
|
161
|
+
ASSERT(res == Z_BUF_ERROR || res == Z_DATA_ERROR);
|
|
162
|
+
}
|
|
163
|
+
t = timer_ticks() - t;
|
|
164
|
+
|
|
165
|
+
printf("[%s, zlib ]: %"PRIu64" KB/s\n", input_type,
|
|
166
|
+
timer_KB_per_s((u64)in_nbytes * NUM_ITERATIONS, t));
|
|
167
|
+
|
|
168
|
+
inflateEnd(&z);
|
|
169
|
+
return t;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/*
|
|
173
|
+
* Test case from https://github.com/ebiggers/libdeflate/issues/33
|
|
174
|
+
* with the gzip header and footer removed to leave just the DEFLATE stream
|
|
175
|
+
*/
|
|
176
|
+
static const u8 orig_repro[3962] =
|
|
177
|
+
"\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b"
|
|
178
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
179
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
180
|
+
"\x1b\x1b\x1b\x1b\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a"
|
|
181
|
+
"\x6a\x6a\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
182
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
183
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
184
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20"
|
|
185
|
+
"\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
186
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28"
|
|
187
|
+
"\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
188
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
189
|
+
"\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11"
|
|
190
|
+
"\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
191
|
+
"\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b"
|
|
192
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48"
|
|
193
|
+
"\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
194
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
195
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80"
|
|
196
|
+
"\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
197
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00"
|
|
198
|
+
"\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
199
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
200
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
201
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea"
|
|
202
|
+
"\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
203
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
204
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea"
|
|
205
|
+
"\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
206
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
207
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
208
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b"
|
|
209
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
210
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48"
|
|
211
|
+
"\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
212
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20"
|
|
213
|
+
"\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
214
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
215
|
+
"\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00"
|
|
216
|
+
"\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
217
|
+
"\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11"
|
|
218
|
+
"\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
219
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
220
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
221
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
222
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
223
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x63"
|
|
224
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
225
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92"
|
|
226
|
+
"\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b"
|
|
227
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00"
|
|
228
|
+
"\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b"
|
|
229
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
230
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48"
|
|
231
|
+
"\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
232
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20"
|
|
233
|
+
"\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
234
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
235
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
236
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
237
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
238
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
239
|
+
"\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00"
|
|
240
|
+
"\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
241
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
242
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
243
|
+
"\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
244
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea"
|
|
245
|
+
"\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
246
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48"
|
|
247
|
+
"\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
248
|
+
"\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11"
|
|
249
|
+
"\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
250
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
251
|
+
"\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b"
|
|
252
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
253
|
+
"\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b"
|
|
254
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
255
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
256
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
257
|
+
"\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00"
|
|
258
|
+
"\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
259
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
260
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
261
|
+
"\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
262
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
263
|
+
"\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11"
|
|
264
|
+
"\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
265
|
+
"\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b"
|
|
266
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
267
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63"
|
|
268
|
+
"\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b"
|
|
269
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea"
|
|
270
|
+
"\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
271
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
272
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
273
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
274
|
+
"\x92\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
275
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
276
|
+
"\x1b\x1b\x1b\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a"
|
|
277
|
+
"\x6a\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
278
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
279
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
280
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80"
|
|
281
|
+
"\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
282
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00"
|
|
283
|
+
"\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
284
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
285
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
286
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
287
|
+
"\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00"
|
|
288
|
+
"\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
289
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
290
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
291
|
+
"\x1b\x1b\x92\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
292
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
293
|
+
"\x1b\x1b\x1b\x1b\x1b\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a"
|
|
294
|
+
"\x6a\x6a\x6a\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
295
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
296
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
297
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00"
|
|
298
|
+
"\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
299
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80"
|
|
300
|
+
"\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
301
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
302
|
+
"\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00"
|
|
303
|
+
"\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
304
|
+
"\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00"
|
|
305
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04"
|
|
306
|
+
"\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
307
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
308
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20"
|
|
309
|
+
"\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
310
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28"
|
|
311
|
+
"\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
312
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
313
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
314
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00"
|
|
315
|
+
"\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b"
|
|
316
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
317
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
318
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b"
|
|
319
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
320
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04"
|
|
321
|
+
"\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
322
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00"
|
|
323
|
+
"\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
324
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
325
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28"
|
|
326
|
+
"\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
327
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00"
|
|
328
|
+
"\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
329
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
330
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
331
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
332
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
333
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
334
|
+
"\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
335
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
336
|
+
"\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b"
|
|
337
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
338
|
+
"\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b"
|
|
339
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
340
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04"
|
|
341
|
+
"\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
342
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00"
|
|
343
|
+
"\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
344
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
345
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
346
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
347
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
348
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
349
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28"
|
|
350
|
+
"\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
351
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
352
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
353
|
+
"\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
354
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00"
|
|
355
|
+
"\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b"
|
|
356
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04"
|
|
357
|
+
"\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
358
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00"
|
|
359
|
+
"\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
360
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
361
|
+
"\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b"
|
|
362
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
363
|
+
"\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b"
|
|
364
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
365
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
366
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
367
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28"
|
|
368
|
+
"\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
369
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
370
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
371
|
+
"\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
372
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
373
|
+
"\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00"
|
|
374
|
+
"\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
375
|
+
"\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00"
|
|
376
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
377
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92"
|
|
378
|
+
"\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b"
|
|
379
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00"
|
|
380
|
+
"\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b"
|
|
381
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
382
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
383
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
384
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
385
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
386
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x63\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
387
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
388
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00"
|
|
389
|
+
"\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
390
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80"
|
|
391
|
+
"\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
392
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
393
|
+
"\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00"
|
|
394
|
+
"\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
395
|
+
"\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00"
|
|
396
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
397
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
398
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
399
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
400
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
401
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92"
|
|
402
|
+
"\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b"
|
|
403
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
404
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
405
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b"
|
|
406
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
407
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00"
|
|
408
|
+
"\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b"
|
|
409
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04"
|
|
410
|
+
"\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
411
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
412
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20"
|
|
413
|
+
"\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
414
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28"
|
|
415
|
+
"\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
416
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1a\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
417
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
418
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00"
|
|
419
|
+
"\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b"
|
|
420
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b"
|
|
421
|
+
"\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\x04\xea\x48\x00\x20"
|
|
422
|
+
"\x80\x28\x00\x00\x11\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00"
|
|
423
|
+
"\x20\x80\x28\x00\x00\x11\x00\x00\x01\x04\x00\x3f\x00\x00\x00\x00"
|
|
424
|
+
"\x28\xf7\xff\x00\xff\xff\xff\xff\x00\x00";
|
|
425
|
+
|
|
426
|
+
int
|
|
427
|
+
tmain(int argc, tchar *argv[])
|
|
428
|
+
{
|
|
429
|
+
u8 in[4096];
|
|
430
|
+
u8 out[10000];
|
|
431
|
+
u64 t, tz;
|
|
432
|
+
|
|
433
|
+
begin_program(argv);
|
|
434
|
+
|
|
435
|
+
begin_performance_test();
|
|
436
|
+
|
|
437
|
+
/* static huffman case */
|
|
438
|
+
generate_empty_static_huffman_blocks(in, sizeof(in));
|
|
439
|
+
t = do_test_libdeflate("static huffman", in, sizeof(in),
|
|
440
|
+
out, sizeof(out));
|
|
441
|
+
tz = do_test_zlib("static huffman", in, sizeof(in), out, sizeof(out));
|
|
442
|
+
/*
|
|
443
|
+
* libdeflate is faster than zlib in this case, e.g.
|
|
444
|
+
* [static huffman, libdeflate]: 215861 KB/s
|
|
445
|
+
* [static huffman, zlib ]: 73651 KB/s
|
|
446
|
+
*/
|
|
447
|
+
putchar('\n');
|
|
448
|
+
ASSERT(t < tz);
|
|
449
|
+
|
|
450
|
+
/* dynamic huffman case */
|
|
451
|
+
generate_empty_dynamic_huffman_blocks(in, sizeof(in));
|
|
452
|
+
t = do_test_libdeflate("dynamic huffman", in, sizeof(in),
|
|
453
|
+
out, sizeof(out));
|
|
454
|
+
tz = do_test_zlib("dynamic huffman", in, sizeof(in), out, sizeof(out));
|
|
455
|
+
/*
|
|
456
|
+
* libdeflate is slower than zlib in this case, though not super bad.
|
|
457
|
+
* [dynamic huffman, libdeflate]: 6277 KB/s
|
|
458
|
+
* [dynamic huffman, zlib ]: 10419 KB/s
|
|
459
|
+
* FIXME: make it faster.
|
|
460
|
+
*/
|
|
461
|
+
putchar('\n');
|
|
462
|
+
ASSERT(t < 4 * tz);
|
|
463
|
+
|
|
464
|
+
/* original reproducer */
|
|
465
|
+
t = do_test_libdeflate("original repro", orig_repro, sizeof(orig_repro),
|
|
466
|
+
out, sizeof(out));
|
|
467
|
+
tz = do_test_zlib("original repro", orig_repro, sizeof(orig_repro),
|
|
468
|
+
out, sizeof(out));
|
|
469
|
+
ASSERT(t < tz);
|
|
470
|
+
|
|
471
|
+
return 0;
|
|
472
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* test_trailing_bytes.c
|
|
3
|
+
*
|
|
4
|
+
* Test that decompression correctly stops at the end of the first DEFLATE,
|
|
5
|
+
* zlib, or gzip stream, and doesn't process any additional trailing bytes.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include "test_util.h"
|
|
9
|
+
|
|
10
|
+
static const struct {
|
|
11
|
+
size_t (*compress)(struct libdeflate_compressor *compressor,
|
|
12
|
+
const void *in, size_t in_nbytes,
|
|
13
|
+
void *out, size_t out_nbytes_avail);
|
|
14
|
+
enum libdeflate_result (*decompress)(
|
|
15
|
+
struct libdeflate_decompressor *decompressor,
|
|
16
|
+
const void *in, size_t in_nbytes,
|
|
17
|
+
void *out, size_t out_nbytes_avail,
|
|
18
|
+
size_t *actual_out_nbytes_ret);
|
|
19
|
+
enum libdeflate_result (*decompress_ex)(
|
|
20
|
+
struct libdeflate_decompressor *decompressor,
|
|
21
|
+
const void *in, size_t in_nbytes,
|
|
22
|
+
void *out, size_t out_nbytes_avail,
|
|
23
|
+
size_t *actual_in_nbytes_ret,
|
|
24
|
+
size_t *actual_out_nbytes_ret);
|
|
25
|
+
} codecs[] = {
|
|
26
|
+
{
|
|
27
|
+
.compress = libdeflate_deflate_compress,
|
|
28
|
+
.decompress = libdeflate_deflate_decompress,
|
|
29
|
+
.decompress_ex = libdeflate_deflate_decompress_ex,
|
|
30
|
+
}, {
|
|
31
|
+
.compress = libdeflate_zlib_compress,
|
|
32
|
+
.decompress = libdeflate_zlib_decompress,
|
|
33
|
+
.decompress_ex = libdeflate_zlib_decompress_ex,
|
|
34
|
+
}, {
|
|
35
|
+
.compress = libdeflate_gzip_compress,
|
|
36
|
+
.decompress = libdeflate_gzip_decompress,
|
|
37
|
+
.decompress_ex = libdeflate_gzip_decompress_ex,
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
int
|
|
42
|
+
tmain(int argc, tchar *argv[])
|
|
43
|
+
{
|
|
44
|
+
const size_t original_nbytes = 32768;
|
|
45
|
+
const size_t compressed_nbytes_total = 32768;
|
|
46
|
+
/*
|
|
47
|
+
* Don't use the full buffer for compressed data, because we want to
|
|
48
|
+
* test whether decompression can deal with additional trailing bytes.
|
|
49
|
+
*
|
|
50
|
+
* Note: we can't use a guarded buffer (i.e. a buffer where the byte
|
|
51
|
+
* after compressed_nbytes is unmapped) because the decompressor may
|
|
52
|
+
* read a few bytes beyond the end of the stream (but ultimately not
|
|
53
|
+
* actually use those bytes) as long as they are within the buffer.
|
|
54
|
+
*/
|
|
55
|
+
const size_t compressed_nbytes_avail = 30000;
|
|
56
|
+
size_t i;
|
|
57
|
+
u8 *original;
|
|
58
|
+
u8 *compressed;
|
|
59
|
+
u8 *decompressed;
|
|
60
|
+
struct libdeflate_compressor *c;
|
|
61
|
+
struct libdeflate_decompressor *d;
|
|
62
|
+
size_t compressed_nbytes;
|
|
63
|
+
enum libdeflate_result res;
|
|
64
|
+
size_t actual_compressed_nbytes;
|
|
65
|
+
size_t actual_decompressed_nbytes;
|
|
66
|
+
|
|
67
|
+
begin_program(argv);
|
|
68
|
+
|
|
69
|
+
ASSERT(compressed_nbytes_avail < compressed_nbytes_total);
|
|
70
|
+
|
|
71
|
+
/* Prepare some dummy data to compress */
|
|
72
|
+
original = xmalloc(original_nbytes);
|
|
73
|
+
ASSERT(original != NULL);
|
|
74
|
+
for (i = 0; i < original_nbytes; i++)
|
|
75
|
+
original[i] = (i % 123) + (i % 1023);
|
|
76
|
+
|
|
77
|
+
compressed = xmalloc(compressed_nbytes_total);
|
|
78
|
+
ASSERT(compressed != NULL);
|
|
79
|
+
memset(compressed, 0, compressed_nbytes_total);
|
|
80
|
+
|
|
81
|
+
decompressed = xmalloc(original_nbytes);
|
|
82
|
+
ASSERT(decompressed != NULL);
|
|
83
|
+
|
|
84
|
+
c = libdeflate_alloc_compressor(6);
|
|
85
|
+
ASSERT(c != NULL);
|
|
86
|
+
|
|
87
|
+
d = libdeflate_alloc_decompressor();
|
|
88
|
+
ASSERT(d != NULL);
|
|
89
|
+
|
|
90
|
+
for (i = 0; i < ARRAY_LEN(codecs); i++) {
|
|
91
|
+
compressed_nbytes = codecs[i].compress(c, original,
|
|
92
|
+
original_nbytes,
|
|
93
|
+
compressed,
|
|
94
|
+
compressed_nbytes_avail);
|
|
95
|
+
ASSERT(compressed_nbytes > 0);
|
|
96
|
+
ASSERT(compressed_nbytes <= compressed_nbytes_avail);
|
|
97
|
+
|
|
98
|
+
/* Test decompress() of stream that fills the whole buffer */
|
|
99
|
+
actual_decompressed_nbytes = 0;
|
|
100
|
+
memset(decompressed, 0, original_nbytes);
|
|
101
|
+
res = codecs[i].decompress(d, compressed, compressed_nbytes,
|
|
102
|
+
decompressed, original_nbytes,
|
|
103
|
+
&actual_decompressed_nbytes);
|
|
104
|
+
ASSERT(res == LIBDEFLATE_SUCCESS);
|
|
105
|
+
ASSERT(actual_decompressed_nbytes == original_nbytes);
|
|
106
|
+
ASSERT(memcmp(decompressed, original, original_nbytes) == 0);
|
|
107
|
+
|
|
108
|
+
/* Test decompress_ex() of stream that fills the whole buffer */
|
|
109
|
+
actual_compressed_nbytes = actual_decompressed_nbytes = 0;
|
|
110
|
+
memset(decompressed, 0, original_nbytes);
|
|
111
|
+
res = codecs[i].decompress_ex(d, compressed, compressed_nbytes,
|
|
112
|
+
decompressed, original_nbytes,
|
|
113
|
+
&actual_compressed_nbytes,
|
|
114
|
+
&actual_decompressed_nbytes);
|
|
115
|
+
ASSERT(res == LIBDEFLATE_SUCCESS);
|
|
116
|
+
ASSERT(actual_compressed_nbytes == compressed_nbytes);
|
|
117
|
+
ASSERT(actual_decompressed_nbytes == original_nbytes);
|
|
118
|
+
ASSERT(memcmp(decompressed, original, original_nbytes) == 0);
|
|
119
|
+
|
|
120
|
+
/* Test decompress() of stream with trailing bytes */
|
|
121
|
+
actual_decompressed_nbytes = 0;
|
|
122
|
+
memset(decompressed, 0, original_nbytes);
|
|
123
|
+
res = codecs[i].decompress(d, compressed,
|
|
124
|
+
compressed_nbytes_total,
|
|
125
|
+
decompressed, original_nbytes,
|
|
126
|
+
&actual_decompressed_nbytes);
|
|
127
|
+
ASSERT(res == LIBDEFLATE_SUCCESS);
|
|
128
|
+
ASSERT(actual_decompressed_nbytes == original_nbytes);
|
|
129
|
+
ASSERT(memcmp(decompressed, original, original_nbytes) == 0);
|
|
130
|
+
|
|
131
|
+
/* Test decompress_ex() of stream with trailing bytes */
|
|
132
|
+
actual_compressed_nbytes = actual_decompressed_nbytes = 0;
|
|
133
|
+
memset(decompressed, 0, original_nbytes);
|
|
134
|
+
res = codecs[i].decompress_ex(d, compressed,
|
|
135
|
+
compressed_nbytes_total,
|
|
136
|
+
decompressed, original_nbytes,
|
|
137
|
+
&actual_compressed_nbytes,
|
|
138
|
+
&actual_decompressed_nbytes);
|
|
139
|
+
ASSERT(res == LIBDEFLATE_SUCCESS);
|
|
140
|
+
ASSERT(actual_compressed_nbytes == compressed_nbytes);
|
|
141
|
+
ASSERT(actual_decompressed_nbytes == original_nbytes);
|
|
142
|
+
ASSERT(memcmp(decompressed, original, original_nbytes) == 0);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
free(original);
|
|
146
|
+
free(compressed);
|
|
147
|
+
free(decompressed);
|
|
148
|
+
libdeflate_free_compressor(c);
|
|
149
|
+
libdeflate_free_decompressor(d);
|
|
150
|
+
return 0;
|
|
151
|
+
}
|