zstd-ruby 1.5.0.0 → 1.5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/README.md +1 -1
- data/ext/zstdruby/extconf.rb +1 -0
- data/ext/zstdruby/libzstd/Makefile +50 -175
- data/ext/zstdruby/libzstd/README.md +7 -1
- data/ext/zstdruby/libzstd/common/bitstream.h +24 -9
- data/ext/zstdruby/libzstd/common/compiler.h +89 -43
- data/ext/zstdruby/libzstd/common/entropy_common.c +11 -5
- data/ext/zstdruby/libzstd/common/error_private.h +79 -0
- data/ext/zstdruby/libzstd/common/fse.h +2 -1
- data/ext/zstdruby/libzstd/common/fse_decompress.c +1 -1
- data/ext/zstdruby/libzstd/common/huf.h +24 -22
- data/ext/zstdruby/libzstd/common/mem.h +18 -0
- data/ext/zstdruby/libzstd/common/portability_macros.h +131 -0
- data/ext/zstdruby/libzstd/common/xxhash.c +5 -805
- data/ext/zstdruby/libzstd/common/xxhash.h +5568 -167
- data/ext/zstdruby/libzstd/common/zstd_internal.h +92 -88
- data/ext/zstdruby/libzstd/common/zstd_trace.h +12 -3
- data/ext/zstdruby/libzstd/compress/clevels.h +134 -0
- data/ext/zstdruby/libzstd/compress/fse_compress.c +63 -27
- data/ext/zstdruby/libzstd/compress/huf_compress.c +537 -104
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +194 -278
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +102 -44
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +4 -3
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +3 -1
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +5 -4
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +3 -2
- data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +3 -3
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +289 -114
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +302 -123
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +418 -502
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +4 -4
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +4 -1
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +186 -108
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +59 -29
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +727 -189
- data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +571 -0
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +85 -22
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +744 -220
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +8 -2
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +34 -3
- data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +23 -3
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +9 -2
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +11 -4
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +99 -28
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +2 -6
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +3 -7
- data/ext/zstdruby/libzstd/libzstd.mk +185 -0
- data/ext/zstdruby/libzstd/libzstd.pc.in +1 -0
- data/ext/zstdruby/libzstd/modulemap/module.modulemap +4 -0
- data/ext/zstdruby/libzstd/zdict.h +4 -4
- data/ext/zstdruby/libzstd/zstd.h +179 -136
- data/ext/zstdruby/zstdruby.c +2 -2
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +8 -3
@@ -56,7 +56,6 @@
|
|
56
56
|
* Dependencies
|
57
57
|
*********************************************************/
|
58
58
|
#include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memmove, ZSTD_memset */
|
59
|
-
#include "../common/cpu.h" /* bmi2 */
|
60
59
|
#include "../common/mem.h" /* low level memory routines */
|
61
60
|
#define FSE_STATIC_LINKING_ONLY
|
62
61
|
#include "../common/fse.h"
|
@@ -177,12 +176,15 @@ static const ZSTD_DDict* ZSTD_DDictHashSet_getDDict(ZSTD_DDictHashSet* hashSet,
|
|
177
176
|
static ZSTD_DDictHashSet* ZSTD_createDDictHashSet(ZSTD_customMem customMem) {
|
178
177
|
ZSTD_DDictHashSet* ret = (ZSTD_DDictHashSet*)ZSTD_customMalloc(sizeof(ZSTD_DDictHashSet), customMem);
|
179
178
|
DEBUGLOG(4, "Allocating new hash set");
|
179
|
+
if (!ret)
|
180
|
+
return NULL;
|
180
181
|
ret->ddictPtrTable = (const ZSTD_DDict**)ZSTD_customCalloc(DDICT_HASHSET_TABLE_BASE_SIZE * sizeof(ZSTD_DDict*), customMem);
|
181
|
-
ret->
|
182
|
-
|
183
|
-
if (!ret || !ret->ddictPtrTable) {
|
182
|
+
if (!ret->ddictPtrTable) {
|
183
|
+
ZSTD_customFree(ret, customMem);
|
184
184
|
return NULL;
|
185
185
|
}
|
186
|
+
ret->ddictPtrTableSize = DDICT_HASHSET_TABLE_BASE_SIZE;
|
187
|
+
ret->ddictPtrCount = 0;
|
186
188
|
return ret;
|
187
189
|
}
|
188
190
|
|
@@ -255,11 +257,15 @@ static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx)
|
|
255
257
|
dctx->inBuffSize = 0;
|
256
258
|
dctx->outBuffSize = 0;
|
257
259
|
dctx->streamStage = zdss_init;
|
260
|
+
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
|
258
261
|
dctx->legacyContext = NULL;
|
259
262
|
dctx->previousLegacyVersion = 0;
|
263
|
+
#endif
|
260
264
|
dctx->noForwardProgress = 0;
|
261
265
|
dctx->oversizedDuration = 0;
|
262
|
-
|
266
|
+
#if DYNAMIC_BMI2
|
267
|
+
dctx->bmi2 = ZSTD_cpuSupportsBmi2();
|
268
|
+
#endif
|
263
269
|
dctx->ddictSet = NULL;
|
264
270
|
ZSTD_DCtx_resetParameters(dctx);
|
265
271
|
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
@@ -280,8 +286,7 @@ ZSTD_DCtx* ZSTD_initStaticDCtx(void *workspace, size_t workspaceSize)
|
|
280
286
|
return dctx;
|
281
287
|
}
|
282
288
|
|
283
|
-
ZSTD_DCtx*
|
284
|
-
{
|
289
|
+
static ZSTD_DCtx* ZSTD_createDCtx_internal(ZSTD_customMem customMem) {
|
285
290
|
if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL;
|
286
291
|
|
287
292
|
{ ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_customMalloc(sizeof(*dctx), customMem);
|
@@ -292,10 +297,15 @@ ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem)
|
|
292
297
|
}
|
293
298
|
}
|
294
299
|
|
300
|
+
ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem)
|
301
|
+
{
|
302
|
+
return ZSTD_createDCtx_internal(customMem);
|
303
|
+
}
|
304
|
+
|
295
305
|
ZSTD_DCtx* ZSTD_createDCtx(void)
|
296
306
|
{
|
297
307
|
DEBUGLOG(3, "ZSTD_createDCtx");
|
298
|
-
return
|
308
|
+
return ZSTD_createDCtx_internal(ZSTD_defaultCMem);
|
299
309
|
}
|
300
310
|
|
301
311
|
static void ZSTD_clearDict(ZSTD_DCtx* dctx)
|
@@ -380,6 +390,19 @@ unsigned ZSTD_isFrame(const void* buffer, size_t size)
|
|
380
390
|
return 0;
|
381
391
|
}
|
382
392
|
|
393
|
+
/*! ZSTD_isSkippableFrame() :
|
394
|
+
* Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame.
|
395
|
+
* Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.
|
396
|
+
*/
|
397
|
+
unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size)
|
398
|
+
{
|
399
|
+
if (size < ZSTD_FRAMEIDSIZE) return 0;
|
400
|
+
{ U32 const magic = MEM_readLE32(buffer);
|
401
|
+
if ((magic & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) return 1;
|
402
|
+
}
|
403
|
+
return 0;
|
404
|
+
}
|
405
|
+
|
383
406
|
/** ZSTD_frameHeaderSize_internal() :
|
384
407
|
* srcSize must be large enough to reach header size fields.
|
385
408
|
* note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless.
|
@@ -466,7 +489,9 @@ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, s
|
|
466
489
|
}
|
467
490
|
switch(dictIDSizeCode)
|
468
491
|
{
|
469
|
-
default:
|
492
|
+
default:
|
493
|
+
assert(0); /* impossible */
|
494
|
+
ZSTD_FALLTHROUGH;
|
470
495
|
case 0 : break;
|
471
496
|
case 1 : dictID = ip[pos]; pos++; break;
|
472
497
|
case 2 : dictID = MEM_readLE16(ip+pos); pos+=2; break;
|
@@ -474,7 +499,9 @@ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, s
|
|
474
499
|
}
|
475
500
|
switch(fcsID)
|
476
501
|
{
|
477
|
-
default:
|
502
|
+
default:
|
503
|
+
assert(0); /* impossible */
|
504
|
+
ZSTD_FALLTHROUGH;
|
478
505
|
case 0 : if (singleSegment) frameContentSize = ip[pos]; break;
|
479
506
|
case 1 : frameContentSize = MEM_readLE16(ip+pos)+256; break;
|
480
507
|
case 2 : frameContentSize = MEM_readLE32(ip+pos); break;
|
@@ -503,7 +530,6 @@ size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t src
|
|
503
530
|
return ZSTD_getFrameHeader_advanced(zfhPtr, src, srcSize, ZSTD_f_zstd1);
|
504
531
|
}
|
505
532
|
|
506
|
-
|
507
533
|
/** ZSTD_getFrameContentSize() :
|
508
534
|
* compatible with legacy mode
|
509
535
|
* @return : decompressed size of the single frame pointed to be `src` if known, otherwise
|
@@ -544,6 +570,37 @@ static size_t readSkippableFrameSize(void const* src, size_t srcSize)
|
|
544
570
|
}
|
545
571
|
}
|
546
572
|
|
573
|
+
/*! ZSTD_readSkippableFrame() :
|
574
|
+
* Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer.
|
575
|
+
*
|
576
|
+
* The parameter magicVariant will receive the magicVariant that was supplied when the frame was written,
|
577
|
+
* i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested
|
578
|
+
* in the magicVariant.
|
579
|
+
*
|
580
|
+
* Returns an error if destination buffer is not large enough, or if the frame is not skippable.
|
581
|
+
*
|
582
|
+
* @return : number of bytes written or a ZSTD error.
|
583
|
+
*/
|
584
|
+
ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant,
|
585
|
+
const void* src, size_t srcSize)
|
586
|
+
{
|
587
|
+
U32 const magicNumber = MEM_readLE32(src);
|
588
|
+
size_t skippableFrameSize = readSkippableFrameSize(src, srcSize);
|
589
|
+
size_t skippableContentSize = skippableFrameSize - ZSTD_SKIPPABLEHEADERSIZE;
|
590
|
+
|
591
|
+
/* check input validity */
|
592
|
+
RETURN_ERROR_IF(!ZSTD_isSkippableFrame(src, srcSize), frameParameter_unsupported, "");
|
593
|
+
RETURN_ERROR_IF(skippableFrameSize < ZSTD_SKIPPABLEHEADERSIZE || skippableFrameSize > srcSize, srcSize_wrong, "");
|
594
|
+
RETURN_ERROR_IF(skippableContentSize > dstCapacity, dstSize_tooSmall, "");
|
595
|
+
|
596
|
+
/* deliver payload */
|
597
|
+
if (skippableContentSize > 0 && dst != NULL)
|
598
|
+
ZSTD_memcpy(dst, (const BYTE *)src + ZSTD_SKIPPABLEHEADERSIZE, skippableContentSize);
|
599
|
+
if (magicVariant != NULL)
|
600
|
+
*magicVariant = magicNumber - ZSTD_MAGIC_SKIPPABLE_START;
|
601
|
+
return skippableContentSize;
|
602
|
+
}
|
603
|
+
|
547
604
|
/** ZSTD_findDecompressedSize() :
|
548
605
|
* compatible with legacy mode
|
549
606
|
* `srcSize` must be the exact length of some number of ZSTD compressed and/or
|
@@ -858,7 +915,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
|
858
915
|
switch(blockProperties.blockType)
|
859
916
|
{
|
860
917
|
case bt_compressed:
|
861
|
-
decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oend-op), ip, cBlockSize, /* frame */ 1);
|
918
|
+
decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oend-op), ip, cBlockSize, /* frame */ 1, not_streaming);
|
862
919
|
break;
|
863
920
|
case bt_raw :
|
864
921
|
decodedSize = ZSTD_copyRawBlock(op, (size_t)(oend-op), ip, cBlockSize);
|
@@ -1009,7 +1066,7 @@ static ZSTD_DDict const* ZSTD_getDDict(ZSTD_DCtx* dctx)
|
|
1009
1066
|
switch (dctx->dictUses) {
|
1010
1067
|
default:
|
1011
1068
|
assert(0 /* Impossible */);
|
1012
|
-
|
1069
|
+
ZSTD_FALLTHROUGH;
|
1013
1070
|
case ZSTD_dont_use:
|
1014
1071
|
ZSTD_clearDict(dctx);
|
1015
1072
|
return NULL;
|
@@ -1031,7 +1088,7 @@ size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t sr
|
|
1031
1088
|
{
|
1032
1089
|
#if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE>=1)
|
1033
1090
|
size_t regenSize;
|
1034
|
-
ZSTD_DCtx* const dctx =
|
1091
|
+
ZSTD_DCtx* const dctx = ZSTD_createDCtx_internal(ZSTD_defaultCMem);
|
1035
1092
|
RETURN_ERROR_IF(dctx==NULL, memory_allocation, "NULL pointer!");
|
1036
1093
|
regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize);
|
1037
1094
|
ZSTD_freeDCtx(dctx);
|
@@ -1065,7 +1122,7 @@ static size_t ZSTD_nextSrcSizeToDecompressWithInputSize(ZSTD_DCtx* dctx, size_t
|
|
1065
1122
|
return dctx->expected;
|
1066
1123
|
if (dctx->bType != bt_raw)
|
1067
1124
|
return dctx->expected;
|
1068
|
-
return
|
1125
|
+
return BOUNDED(1, inputSize, dctx->expected);
|
1069
1126
|
}
|
1070
1127
|
|
1071
1128
|
ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) {
|
@@ -1073,7 +1130,9 @@ ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) {
|
|
1073
1130
|
{
|
1074
1131
|
default: /* should not happen */
|
1075
1132
|
assert(0);
|
1133
|
+
ZSTD_FALLTHROUGH;
|
1076
1134
|
case ZSTDds_getFrameHeaderSize:
|
1135
|
+
ZSTD_FALLTHROUGH;
|
1077
1136
|
case ZSTDds_decodeFrameHeader:
|
1078
1137
|
return ZSTDnit_frameHeader;
|
1079
1138
|
case ZSTDds_decodeBlockHeader:
|
@@ -1085,6 +1144,7 @@ ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) {
|
|
1085
1144
|
case ZSTDds_checkChecksum:
|
1086
1145
|
return ZSTDnit_checksum;
|
1087
1146
|
case ZSTDds_decodeSkippableHeader:
|
1147
|
+
ZSTD_FALLTHROUGH;
|
1088
1148
|
case ZSTDds_skipFrame:
|
1089
1149
|
return ZSTDnit_skippableFrame;
|
1090
1150
|
}
|
@@ -1168,7 +1228,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
|
|
1168
1228
|
{
|
1169
1229
|
case bt_compressed:
|
1170
1230
|
DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed");
|
1171
|
-
rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1);
|
1231
|
+
rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1, is_streaming);
|
1172
1232
|
dctx->expected = 0; /* Streaming not supported */
|
1173
1233
|
break;
|
1174
1234
|
case bt_raw :
|
@@ -1493,7 +1553,7 @@ size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
|
|
1493
1553
|
ZSTD_DStream* ZSTD_createDStream(void)
|
1494
1554
|
{
|
1495
1555
|
DEBUGLOG(3, "ZSTD_createDStream");
|
1496
|
-
return
|
1556
|
+
return ZSTD_createDCtx_internal(ZSTD_defaultCMem);
|
1497
1557
|
}
|
1498
1558
|
|
1499
1559
|
ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize)
|
@@ -1503,7 +1563,7 @@ ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize)
|
|
1503
1563
|
|
1504
1564
|
ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem)
|
1505
1565
|
{
|
1506
|
-
return
|
1566
|
+
return ZSTD_createDCtx_internal(customMem);
|
1507
1567
|
}
|
1508
1568
|
|
1509
1569
|
size_t ZSTD_freeDStream(ZSTD_DStream* zds)
|
@@ -1763,7 +1823,8 @@ size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx)
|
|
1763
1823
|
size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize)
|
1764
1824
|
{
|
1765
1825
|
size_t const blockSize = (size_t) MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
|
1766
|
-
|
1826
|
+
/* space is needed to store the litbuffer after the output of a given block without stomping the extDict of a previous run, as well as to cover both windows against wildcopy*/
|
1827
|
+
unsigned long long const neededRBSize = windowSize + blockSize + ZSTD_BLOCKSIZE_MAX + (WILDCOPY_OVERLENGTH * 2);
|
1767
1828
|
unsigned long long const neededSize = MIN(frameContentSize, neededRBSize);
|
1768
1829
|
size_t const minRBSize = (size_t) neededSize;
|
1769
1830
|
RETURN_ERROR_IF((unsigned long long)minRBSize != neededSize,
|
@@ -1897,10 +1958,12 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
1897
1958
|
DEBUGLOG(5, "stage zdss_init => transparent reset ");
|
1898
1959
|
zds->streamStage = zdss_loadHeader;
|
1899
1960
|
zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0;
|
1961
|
+
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
|
1900
1962
|
zds->legacyVersion = 0;
|
1963
|
+
#endif
|
1901
1964
|
zds->hostageByte = 0;
|
1902
1965
|
zds->expectedOutBuffer = *output;
|
1903
|
-
|
1966
|
+
ZSTD_FALLTHROUGH;
|
1904
1967
|
|
1905
1968
|
case zdss_loadHeader :
|
1906
1969
|
DEBUGLOG(5, "stage zdss_loadHeader (srcSize : %u)", (U32)(iend - ip));
|
@@ -2038,7 +2101,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2038
2101
|
zds->outBuffSize = neededOutBuffSize;
|
2039
2102
|
} } }
|
2040
2103
|
zds->streamStage = zdss_read;
|
2041
|
-
|
2104
|
+
ZSTD_FALLTHROUGH;
|
2042
2105
|
|
2043
2106
|
case zdss_read:
|
2044
2107
|
DEBUGLOG(5, "stage zdss_read");
|
@@ -2057,7 +2120,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2057
2120
|
} }
|
2058
2121
|
if (ip==iend) { someMoreWork = 0; break; } /* no more input */
|
2059
2122
|
zds->streamStage = zdss_load;
|
2060
|
-
|
2123
|
+
ZSTD_FALLTHROUGH;
|
2061
2124
|
|
2062
2125
|
case zdss_load:
|
2063
2126
|
{ size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds);
|