| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950 |
- /* zlib-inflate.js -- JavaScript implementation for the zlib inflate.
- Version: 0.2.0
- LastModified: Apr 12 2012
- Copyright (C) 2012 Masanao Izumo <[email protected]>
- This library is one of the JavaScript zlib implementation.
- Some API's are modified from the original.
- Only inflate API is implemented.
- The original copyright notice (zlib 1.2.6):
- Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- Jean-loup Gailly Mark Adler
- [email protected] [email protected]
- The data format used by the zlib library is described by RFCs (Request for
- Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
- (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
- */
- /*
- API documentation
- ==============================================================================
- Usage: z_stream = ZLIB.inflateInit([windowBits]);
- Create the stream object for decompression.
- See zlib.h for windowBits information.
- ==============================================================================
- Usage: decoded_string = z_stream.inflate(encoded_string [, {OPTIONS...}]);
- OPTIONS:
- next_in: decode start offset for encoded_string.
- avail_in: // TODO document. See zlib.h for the information.
- avail_out: // TODO document. See zlib.h for the information.
- flush: // TODO document. See zlib.h for the information.
- Ex: decoded_string = z_stream.inflate(encoded_string);
- decoded_string = z_stream.inflate(encoded_string,
- {next_in: 0,
- avail_in: encoded_string.length,
- avail_out: 1024,
- flush: ZLIB.Z_NO_FLUSH});
- See zlib.h for more information.
- ==============================================================================
- Usage: z_stream.inflateReset();
- TODO document
- */
- if( typeof ZLIB === 'undefined' ) {
- alert('ZLIB is not defined. SRC zlib.js before zlib-inflate.js')
- }
- (function() {
- /* inflate.c -- zlib decompression
- * Copyright (C) 1995-2011 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
- var DEF_WBITS = 15;
- // inflate_mode
- var HEAD = 0; /* i: waiting for magic header */
- var FLAGS = 1; /* i: waiting for method and flags (gzip) */
- var TIME = 2; /* i: waiting for modification time (gzip) */
- var OS = 3; /* i: waiting for extra flags and operating system (gzip) */
- var EXLEN = 4; /* i: waiting for extra length (gzip) */
- var EXTRA = 5; /* i: waiting for extra bytes (gzip) */
- var NAME = 6; /* i: waiting for end of file name (gzip) */
- var COMMENT = 7; /* i: waiting for end of comment (gzip) */
- var HCRC = 8; /* i: waiting for header crc (gzip) */
- var DICTID = 9; /* i: waiting for dictionary check value */
- var DICT = 10; /* waiting for inflateSetDictionary() call */
- var TYPE = 11; /* i: waiting for type bits, including last-flag bit */
- var TYPEDO = 12; /* i: same, but skip check to exit inflate on new block */
- var STORED = 13; /* i: waiting for stored size (length and complement) */
- var COPY_ = 14; /* i/o: same as COPY below, but only first time in */
- var COPY = 15; /* i/o: waiting for input or output to copy stored block */
- var TABLE = 16; /* i: waiting for dynamic block table lengths */
- var LENLENS = 17; /* i: waiting for code length code lengths */
- var CODELENS = 18; /* i: waiting for length/lit and distance code lengths */
- var LEN_ = 19; /* i: same as LEN below, but only first time in */
- var LEN = 20; /* i: waiting for length/lit/eob code */
- var LENEXT = 21; /* i: waiting for length extra bits */
- var DIST = 22; /* i: waiting for distance code */
- var DISTEXT = 23; /* i: waiting for distance extra bits */
- var MATCH = 24; /* o: waiting for output space to copy string */
- var LIT = 25; /* o: waiting for output space to write literal */
- var CHECK = 26; /* i: waiting for 32-bit check value */
- var LENGTH = 27; /* i: waiting for 32-bit length (gzip) */
- var DONE = 28; /* finished check, done -- remain here until reset */
- var BAD = 29; /* got a data error -- remain here until reset */
- var MEM = 30; /* got an inflate() memory error -- remain here until reset */
- var SYNC = 31; /* looking for synchronization bytes to restart inflate() */
- /* Maximum size of the dynamic table. The maximum number of code structures is
- 1444, which is the sum of 852 for literal/length codes and 592 for distance
- codes. These values were found by exhaustive searches using the program
- examples/enough.c found in the zlib distribtution. The arguments to that
- program are the number of symbols, the initial root table size, and the
- maximum bit length of a code. "enough 286 9 15" for literal/length codes
- returns returns 852, and "enough 30 6 15" for distance codes returns 592.
- The initial root table size (9 or 6) is found in the fifth argument of the
- inflate_table() calls in inflate.c and infback.c. If the root table size is
- changed, then these maximum sizes would be need to be recalculated and
- updated. */
- var ENOUGH_LENS = 852;
- var ENOUGH_DISTS = 592;
- var ENOUGH = (ENOUGH_LENS + ENOUGH_DISTS);
- /* Type of code to build for inflate_table() */
- var CODES = 0;
- var LENS = 1;
- var DISTS = 2;
- var inflate_table_lbase = [ /* Length codes 257..285 base */
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
- 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0];
- var inflate_table_lext = [ /* Length codes 257..285 extra */
- 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 69];
- var inflate_table_dbase = [ /* Distance codes 0..29 base */
- 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
- 8193, 12289, 16385, 24577, 0, 0];
- var inflate_table_dext = [ /* Distance codes 0..29 extra */
- 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
- 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
- 28, 28, 29, 29, 64, 64];
- /* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2012 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
- ZLIB.inflate_copyright =
- ' inflate 1.2.6 Copyright 1995-2012 Mark Adler ';
- /*
- If you use the zlib library in a product, an acknowledgment is welcome
- in the documentation of your product. If for some reason you cannot
- include such an acknowledgment, I would appreciate that you keep this
- copyright string in the executable of your product.
- */
- /*
- Build a set of tables to decode the provided canonical Huffman code.
- The code lengths are lens[0..codes-1]. The result starts at *table,
- whose indices are 0..2^bits-1. work is a writable array of at least
- lens shorts, which is used as a work area. type is the type of code
- to be generated, CODES, LENS, or DISTS. On return, zero is success,
- -1 is an invalid code, and +1 means that ENOUGH isn't enough. table
- on return points to the next available entry's address. bits is the
- requested root table index bits, and on return it is the actual root
- table index bits. It will differ if the request is greater than the
- longest code or if it is less than the shortest code.
- */
- function inflate_table(state, type)
- {
- var MAXBITS = 15;
- var table = state.next;
- var bits = (type == DISTS ? state.distbits : state.lenbits);
- var work = state.work;
- var lens = state.lens;
- var lens_offset = (type == DISTS ? state.nlen : 0);
- var state_codes = state.codes;
- var codes;
- if(type == LENS)
- codes = state.nlen;
- else if(type == DISTS)
- codes = state.ndist;
- else // CODES
- codes = 19;
- var len; /* a code's length in bits */
- var sym; /* index of code symbols */
- var min, max; /* minimum and maximum code lengths */
- var root; /* number of index bits for root table */
- var curr; /* number of index bits for current table */
- var drop; /* code bits to drop for sub-table */
- var left; /* number of prefix codes available */
- var used; /* code entries in table used */
- var huff; /* Huffman code */
- var incr; /* for incrementing code, index */
- var fill; /* index for replicating entries */
- var low; /* low bits for current root entry */
- var mask; /* mask for low root bits */
- var here; /* table entry for duplication */
- var next; /* next available space in table */
- var base; /* base value table to use */
- var base_offset;
- var extra; /* extra bits table to use */
- var extra_offset;
- var end; /* use base and extra for symbol > end */
- var count = new Array(MAXBITS+1); /* number of codes of each length */
- var offs = new Array(MAXBITS+1); /* offsets in table for each length */
- /*
- Process a set of code lengths to create a canonical Huffman code. The
- code lengths are lens[0..codes-1]. Each length corresponds to the
- symbols 0..codes-1. The Huffman code is generated by first sorting the
- symbols by length from short to long, and retaining the symbol order
- for codes with equal lengths. Then the code starts with all zero bits
- for the first code of the shortest length, and the codes are integer
- increments for the same length, and zeros are appended as the length
- increases. For the deflate format, these bits are stored backwards
- from their more natural integer increment ordering, and so when the
- decoding tables are built in the large loop below, the integer codes
- are incremented backwards.
- This routine assumes, but does not check, that all of the entries in
- lens[] are in the range 0..MAXBITS. The caller must assure this.
- 1..MAXBITS is interpreted as that code length. zero means that that
- symbol does not occur in this code.
- The codes are sorted by computing a count of codes for each length,
- creating from that a table of starting indices for each length in the
- sorted table, and then entering the symbols in order in the sorted
- table. The sorted table is work[], with that space being provided by
- the caller.
- The length counts are used for other purposes as well, i.e. finding
- the minimum and maximum length codes, determining if there are any
- codes at all, checking for a valid set of lengths, and looking ahead
- at length counts to determine sub-table sizes when building the
- decoding tables.
- */
- /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
- for (len = 0; len <= MAXBITS; len++)
- count[len] = 0;
- for (sym = 0; sym < codes; sym++)
- count[lens[lens_offset + sym]]++;
- /* bound code lengths, force root to be within code lengths */
- root = bits;
- for (max = MAXBITS; max >= 1; max--)
- if (count[max] != 0) break;
- if (root > max) root = max;
- if (max == 0) {
- /* no symbols to code at all */
- /* invalid code marker */
- here = {op:64, bits:1, val:0};
- state_codes[table++] = here; /* make a table to force an error */
- state_codes[table++] = here;
- if(type == DISTS) state.distbits = 1; else state.lenbits = 1; // *bits = 1;
- state.next = table;
- return 0; /* no symbols, but wait for decoding to report error */
- }
- for (min = 1; min < max; min++)
- if (count[min] != 0) break;
- if (root < min) root = min;
- /* check for an over-subscribed or incomplete set of lengths */
- left = 1;
- for (len = 1; len <= MAXBITS; len++) {
- left <<= 1;
- left -= count[len];
- if (left < 0) return -1; /* over-subscribed */
- }
- if (left > 0 && (type == CODES || max != 1)) {
- state.next = table;
- return -1; /* incomplete set */
- }
- /* generate offsets into symbol table for each length for sorting */
- offs[1] = 0;
- for (len = 1; len < MAXBITS; len++)
- offs[len + 1] = offs[len] + count[len];
- /* sort symbols by length, by symbol order within each length */
- for (sym = 0; sym < codes; sym++)
- if (lens[lens_offset + sym] != 0) work[offs[lens[lens_offset + sym]]++] = sym;
- /*
- Create and fill in decoding tables. In this loop, the table being
- filled is at next and has curr index bits. The code being used is huff
- with length len. That code is converted to an index by dropping drop
- bits off of the bottom. For codes where len is less than drop + curr,
- those top drop + curr - len bits are incremented through all values to
- fill the table with replicated entries.
- root is the number of index bits for the root table. When len exceeds
- root, sub-tables are created pointed to by the root entry with an index
- of the low root bits of huff. This is saved in low to check for when a
- new sub-table should be started. drop is zero when the root table is
- being filled, and drop is root when sub-tables are being filled.
- When a new sub-table is needed, it is necessary to look ahead in the
- code lengths to determine what size sub-table is needed. The length
- counts are used for this, and so count[] is decremented as codes are
- entered in the tables.
- used keeps track of how many table entries have been allocated from the
- provided *table space. It is checked for LENS and DIST tables against
- the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
- the initial root table size constants. See the comments in inftrees.h
- for more information.
- sym increments through all symbols, and the loop terminates when
- all codes of length max, i.e. all codes, have been processed. This
- routine permits incomplete codes, so another loop after this one fills
- in the rest of the decoding tables with invalid code markers.
- */
- /* set up for code type */
- switch (type) {
- case CODES:
- base = extra = work; /* dummy value--not used */
- base_offset = 0;
- extra_offset = 0;
- end = 19;
- break;
- case LENS:
- base = inflate_table_lbase;
- base_offset = -257; // base -= 257;
- extra = inflate_table_lext;
- extra_offset = -257; // extra -= 257;
- end = 256;
- break;
- default: /* DISTS */
- base = inflate_table_dbase;
- extra = inflate_table_dext;
- base_offset = 0;
- extra_offset = 0;
- end = -1;
- }
- /* initialize state for loop */
- huff = 0; /* starting code */
- sym = 0; /* starting code symbol */
- len = min; /* starting code length */
- next = table; /* current table to fill in */
- curr = root; /* current table index bits */
- drop = 0; /* current bits to drop from code for index */
- low = -1; /* trigger new sub-table when len > root */
- used = 1 << root; /* use root table entries */
- mask = used - 1; /* mask for comparing low */
- /* check available table space */
- if ((type == LENS && used >= ENOUGH_LENS) ||
- (type == DISTS && used >= ENOUGH_DISTS)) {
- state.next = table;
- return 1;
- }
- /* process all codes and make table entries */
- for (;;) {
- /* create table entry */
- here = {op:0, bits:len - drop, val:0};
- if (work[sym] < end) {
- here.val = work[sym];
- }
- else if (work[sym] > end) {
- here.op = extra[extra_offset + work[sym]];
- here.val = base[base_offset + work[sym]];
- }
- else {
- here.op = 32 + 64; /* end of block */
- }
- /* replicate for those indices with low len bits equal to huff */
- incr = 1 << (len - drop);
- fill = 1 << curr;
- min = fill; /* save offset to next table */
- do {
- fill -= incr;
- state_codes[next + (huff >>> drop) + fill] = here;
- } while (fill != 0);
- /* backwards increment the len-bit code huff */
- incr = 1 << (len - 1);
- while (huff & incr)
- incr >>>= 1;
- if (incr != 0) {
- huff &= incr - 1;
- huff += incr;
- }
- else
- huff = 0;
- /* go to next symbol, update count, len */
- sym++;
- if (--(count[len]) == 0) {
- if (len == max) break;
- len = lens[lens_offset + work[sym]];
- }
- /* create new sub-table if needed */
- if (len > root && (huff & mask) != low) {
- /* if first time, transition to sub-tables */
- if (drop == 0)
- drop = root;
- /* increment past last table */
- next += min; /* here min is 1 << curr */
- /* determine length of next table */
- curr = len - drop;
- left = (1 << curr);
- while (curr + drop < max) {
- left -= count[curr + drop];
- if (left <= 0) break;
- curr++;
- left <<= 1;
- }
- /* check for enough space */
- used += 1 << curr;
- if ((type == LENS && used >= ENOUGH_LENS) ||
- (type == DISTS && used >= ENOUGH_DISTS)) {
- state.next = table;
- return 1;
- }
- /* point entry in root table to sub-table */
- low = huff & mask;
- state_codes[table + low] = {op:curr, bits:root, val:next - table};
- }
- }
- /* fill in remaining table entry if code is incomplete (guaranteed to have
- at most one remaining entry, since if the code is incomplete, the
- maximum code length that was allowed to get this far is one bit) */
- if (huff != 0) {
- state_codes[next + huff] = {op:64, bits:len - drop, val:0};
- }
- /* set return parameters */
- state.next = table + used;
- if(type == DISTS) state.distbits = root; else state.lenbits = root; //*bits = root;
- return 0;
- }
- /* inffast.c -- fast decoding
- * Copyright (C) 1995-2008, 2010 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
- /*
- Decode literal, length, and distance codes and write out the resulting
- literal and match bytes until either not enough input or output is
- available, an end-of-block is encountered, or a data error is encountered.
- When large enough input and output buffers are supplied to inflate(), for
- example, a 16K input buffer and a 64K output buffer, more than 95% of the
- inflate execution time is spent in this routine.
- Entry assumptions:
- state->mode == LEN
- strm->avail_in >= 6
- strm->avail_out >= 258
- start >= strm->avail_out
- state->bits < 8
- On return, state->mode is one of:
- LEN -- ran out of enough output space or enough available input
- TYPE -- reached end of block code, inflate() to interpret next block
- BAD -- error in block data
- Notes:
- - The maximum input bits used by a length/distance pair is 15 bits for the
- length code, 5 bits for the length extra, 15 bits for the distance code,
- and 13 bits for the distance extra. This totals 48 bits, or six bytes.
- Therefore if strm->avail_in >= 6, then there is enough input to avoid
- checking for available input while decoding.
- - The maximum bytes that a single length/distance pair can output is 258
- bytes, which is the maximum length that can be coded. inflate_fast()
- requires strm->avail_out >= 258 for each loop to avoid checking for
- output space.
- */
- function inflate_fast(strm,
- start) /* inflate()'s starting value for strm->avail_out */
- {
- var state;
- var input_data; /* local strm->input_data */
- var next_in; /* zlib.js: index of input_data */
- var last; /* while next_in < last, enough input available */
- var out; /* local strm.next_out */
- var beg; /* inflate()'s initial strm.next_out */
- var end; /* while out < end, enough space available */
- //NOSPRT #ifdef INFLATE_STRICT
- // unsigned dmax; /* maximum distance from zlib header */
- //#endif
- var wsize; /* window size or zero if not using window */
- var whave; /* valid bytes in the window */
- var wnext; /* window write index */
- var window; /* allocated sliding window, if wsize != 0 */
- var hold; /* local strm->hold */
- var bits; /* local strm->bits */
- var codes; /* zlib.js: local state.codes */
- var lcode; /* local strm->lencode */
- var dcode; /* local strm->distcode */
- var lmask; /* mask for first level of length codes */
- var dmask; /* mask for first level of distance codes */
- var here; /* retrieved table entry */
- var op; /* code bits, operation, extra bits, or */
- /* window position, window bytes to copy */
- var len; /* match length, unused bytes */
- var dist; /* match distance */
- // var from; /* where to copy match from */
- var from_window_offset = -1; /* index of window[] */
- var from_out_offset = -1; /* index of next_out[] */
- /* copy state to local variables */
- state = strm.state;
- input_data = strm.input_data;
- next_in = strm.next_in;
- last = next_in + strm.avail_in - 5;
- out = strm.next_out;
- beg = out - (start - strm.avail_out);
- end = out + (strm.avail_out - 257);
- //NOSPRT #ifdef INFLATE_STRICT
- // dmax = state->dmax;
- //#endif
- wsize = state.wsize;
- whave = state.whave;
- wnext = state.wnext;
- window = state.window;
- hold = state.hold;
- bits = state.bits;
- codes = state.codes;
- lcode = state.lencode;
- dcode = state.distcode;
- lmask = (1 << state.lenbits) - 1;
- dmask = (1 << state.distbits) - 1;
- /* decode literals and length/distances until end-of-block or not enough
- input data or output space */
- loop: do {
- if (bits < 15) {
- hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
- bits += 8;
- hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
- bits += 8;
- }
- here = codes[lcode + (hold & lmask)];
- dolen: while(true) {
- op = here.bits;
- hold >>>= op;
- bits -= op;
- op = here.op;
- if (op == 0) { /* literal */
- // Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
- // "inflate: literal '%c'\n" :
- // "inflate: literal 0x%02x\n", here.val));
- strm.output_data += String.fromCharCode(here.val);
- out++;
- }
- else if (op & 16) { /* length base */
- len = here.val;
- op &= 15; /* number of extra bits */
- if (op) {
- if (bits < op) {
- hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
- bits += 8;
- }
- len += hold & ((1 << op) - 1);
- hold >>>= op;
- bits -= op;
- }
- // Tracevv((stderr, "inflate: length %u\n", len));
- if (bits < 15) {
- hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
- bits += 8;
- hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
- bits += 8;
- }
- here = codes[dcode + (hold & dmask)];
- dodist: while(true) {
- op = here.bits;
- hold >>>= op;
- bits -= op;
- op = here.op;
- if (op & 16) { /* distance base */
- dist = here.val;
- op &= 15; /* number of extra bits */
- if (bits < op) {
- hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
- bits += 8;
- if (bits < op) {
- hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
- bits += 8;
- }
- }
- dist += hold & ((1 << op) - 1);
- //NOSPRT #ifdef INFLATE_STRICT
- // if (dist > dmax) {
- // strm->msg = (char *)"invalid distance too far back";
- // state->mode = BAD;
- // break loop;
- // }
- //#endif
- hold >>>= op;
- bits -= op;
- // Tracevv((stderr, "inflate: distance %u\n", dist));
- op = out - beg; /* max distance in output */
- if (dist > op) { /* see if copy from window */
- op = dist - op; /* distance back in window */
- if (op > whave) {
- if (state.sane) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD;
- break loop;
- }
- //NOSPRT #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
- // if (len <= op - whave) {
- // do {
- // PUP(out) = 0;
- // } while (--len);
- // continue;
- // }
- // len -= op - whave;
- // do {
- // PUP(out) = 0;
- // } while (--op > whave);
- // if (op == 0) {
- // from = out - dist;
- // do {
- // PUP(out) = PUP(from);
- // } while (--len);
- // continue;
- // }
- //#endif
- } // if (op > whave)
- from_window_offset = 0;
- from_out_offset = -1;
- if (wnext == 0) { /* very common case */
- from_window_offset += wsize - op;
- if (op < len) { /* some from window */
- len -= op;
- strm.output_data += window.substring(from_window_offset, from_window_offset + op);
- out += op;
- op = 0;
- from_window_offset = -1;
- from_out_offset = out - dist; /* rest from output */
- }
- }
- //NOTREACHED else if (wnext < op) { /* wrap around window */
- //NOTREACHED from += wsize + wnext - op;
- //NOTREACHED op -= wnext;
- //NOTREACHED if (op < len) { /* some from end of window */
- //NOTREACHED len -= op;
- //NOTREACHED do {
- //NOTREACHED PUP(out) = PUP(from);
- //NOTREACHED } while (--op);
- //NOTREACHED from = window - OFF;
- //NOTREACHED if (wnext < len) { /* some from start of window */
- //NOTREACHED op = wnext;
- //NOTREACHED len -= op;
- //NOTREACHED do {
- //NOTREACHED PUP(out) = PUP(from);
- //NOTREACHED } while (--op);
- //NOTREACHED from = out - dist; /* rest from output */
- //NOTREACHED }
- //NOTREACHED }
- //NOTREACHED }
- else { /* contiguous in window */
- from_window_offset += wnext - op;
- if (op < len) { /* some from window */
- len -= op;
- strm.output_data += window.substring(from_window_offset, from_window_offset + op);
- out += op;
- from_window_offset = -1;
- from_out_offset = out - dist; /* rest from output */
- }
- }
- }
- else {
- from_window_offset = -1;
- from_out_offset = out - dist; /* copy direct from output */
- }
- if (from_window_offset >= 0) {
- strm.output_data += window.substring(from_window_offset, from_window_offset + len);
- out += len;
- from_window_offset += len;
- } else {
- var len_inner = len;
- if(len_inner > out - from_out_offset)
- len_inner = out - from_out_offset;
- strm.output_data += strm.output_data.substring(
- from_out_offset, from_out_offset + len_inner);
- out += len_inner;
- len -= len_inner;
- from_out_offset += len_inner;
- out += len;
- while (len > 2) {
- strm.output_data += strm.output_data.charAt(from_out_offset++);
- strm.output_data += strm.output_data.charAt(from_out_offset++);
- strm.output_data += strm.output_data.charAt(from_out_offset++);
- len -= 3;
- }
- if (len) {
- strm.output_data += strm.output_data.charAt(from_out_offset++);
- if (len > 1)
- strm.output_data += strm.output_data.charAt(from_out_offset++);
- }
- }
- }
- else if ((op & 64) == 0) { /* 2nd level distance code */
- here = codes[dcode + (here.val + (hold & ((1 << op) - 1)))];
- continue dodist; // goto dodist
- }
- else {
- strm.msg = 'invalid distance code';
- state.mode = BAD;
- break loop;
- }
- break dodist; }
- }
- else if ((op & 64) == 0) { /* 2nd level length code */
- here = codes[lcode + (here.val + (hold & ((1 << op) - 1)))];
- continue dolen; // goto dolen;
- }
- else if (op & 32) { /* end-of-block */
- // Tracevv((stderr, "inflate: end of block\n"));
- state.mode = TYPE;
- break loop;
- }
- else {
- strm.msg = 'invalid literal/length code';
- state.mode = BAD;
- break loop;
- }
- break dolen; }
- } while (next_in < last && out < end);
- /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
- len = bits >>> 3;
- next_in -= len;
- bits -= len << 3;
- hold &= (1 << bits) - 1;
- /* update state and return */
- strm.next_in = next_in;
- strm.next_out = out;
- strm.avail_in = (next_in < last ? 5 + (last - next_in) : 5 - (next_in - last));
- strm.avail_out = (out < end ?
- 257 + (end - out) : 257 - (out - end));
- state.hold = hold;
- state.bits = bits;
- }
- function new_array(size)
- {
- var i;
- var ary = new Array(size);
- for(i = 0; i < size; i++)
- ary[i] = 0;
- return ary;
- }
- function getarg(opts, name, def_value)
- {
- return (opts && (name in opts)) ? opts[name] : def_value;
- }
- function checksum_none()
- {
- return 0;
- }
- /**
- * z_stream constructor
- * @constructor
- */
- function inflate_state()
- {
- var i;
- this.mode = 0; /* current inflate mode */
- this.last = 0; /* true if processing last block */
- this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
- this.havedict = 0; /* true if dictionary provided */
- this.flags = 0; /* gzip header method and flags (0 if zlib) */
- this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
- this.check = 0; /* protected copy of check value */
- this.total = 0; /* protected copy of output count */
- this.head = null; /* where to save gzip header information */
- /* sliding window */
- this.wbits = 0; /* log base 2 of requested window size */
- this.wsize = 0; /* window size or zero if not using window */
- this.whave = 0; /* valid bytes in the window */
- this.wnext = 0; /* window write index (TODO remove) */
- this.window = null; /* allocated sliding window, if needed */
- /* bit accumulator */
- this.hold = 0; /* input bit accumulator */
- this.bits = 0; /* number of bits in "in" */
- /* for string and stored block copying */
- this.length = 0; /* literal or length of data to copy */
- this.offset = 0; /* distance back to copy string from */
- /* for table and code decoding */
- this.extra = 0; /* extra bits needed */
- /* fixed and dynamic code tables */
- /* zlib.js: modified implementation: lencode, distcode, next are offset of codes[] */
- this.lencode = 0; /* starting table for length/literal codes */
- this.distcode = 0; /* starting table for distance codes */
- this.lenbits = 0; /* index bits for lencode */
- this.distbits = 0; /* index bits for distcode */
- /* dynamic table building */
- this.ncode = 0; /* number of code length code lengths */
- this.nlen = 0; /* number of length code lengths */
- this.ndist = 0; /* number of distance code lengths */
- this.have = 0; /* number of code lengths in lens[] */
- this.next = 0; /* next available space in codes[] */
- this.lens = new_array(320); /* temporary storage for code lengths */
- this.work = new_array(288); /* work area for code table building */
- this.codes = new Array(ENOUGH); /* space for code tables */
- var c = {op:0, bits:0, val:0};
- for(i = 0; i < ENOUGH; i++)
- this.codes[i] = c;
- this.sane = 0; /* if false, allow invalid distance too far */
- this.back = 0; /* bits back of last unprocessed length/lit */
- this.was = 0; /* initial length of match */
- }
- ZLIB.inflateResetKeep = function(strm)
- {
- var state;
- if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
- state = strm.state;
- strm.total_in = strm.total_out = state.total = 0;
- strm.msg = null;
- if (state.wrap) { /* to support ill-conceived Java test suite */
- strm.adler = state.wrap & 1;
- }
- state.mode = HEAD;
- state.last = 0;
- state.havedict = 0;
- state.dmax = 32768;
- state.head = null;
- state.hold = 0;
- state.bits = 0;
- state.lencode = 0;
- state.distcode = 0;
- state.next = 0;
- state.sane = 1;
- state.back = -1;
- return ZLIB.Z_OK;
- };
- // Usage: strm = ZLIB.inflateReset(z_stream [, windowBits]);
- ZLIB.inflateReset = function(strm, windowBits)
- {
- var wrap;
- var state;
- /* get the state */
- if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
- state = strm.state;
- if(typeof windowBits === "undefined")
- windowBits = DEF_WBITS;
- /* extract wrap request from windowBits parameter */
- if (windowBits < 0) {
- wrap = 0;
- windowBits = -windowBits;
- }
- else {
- wrap = (windowBits >>> 4) + 1;
- if (windowBits < 48)
- windowBits &= 15;
- }
- if(wrap == 1 && (typeof ZLIB.adler32 === 'function')) {
- strm.checksum_function = ZLIB.adler32;
- } else if(wrap == 2 && (typeof ZLIB.crc32 === 'function')) {
- strm.checksum_function = ZLIB.crc32;
- } else {
- strm.checksum_function = checksum_none;
- }
- /* set number of window bits, free window if different */
- if (windowBits && (windowBits < 8 || windowBits > 15))
- return ZLIB.Z_STREAM_ERROR;
- if (state.window && state.wbits != windowBits) {
- state.window = null;
- }
- /* update state and reset the rest of it */
- state.wrap = wrap;
- state.wbits = windowBits;
- state.wsize = 0;
- state.whave = 0;
- state.wnext = 0;
- return ZLIB.inflateResetKeep(strm);
- };
- // Usage: strm = ZLIB.inflateInit([windowBits]);
- ZLIB.inflateInit = function(windowBits)
- {
- var strm = new ZLIB.z_stream();
- strm.state = new inflate_state();
- ZLIB.inflateReset(strm, windowBits);
- return strm;
- };
- ZLIB.inflatePrime = function(strm, bits, value)
- {
- var state;
- if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
- state = strm.state;
- if (bits < 0) {
- state.hold = 0;
- state.bits = 0;
- return ZLIB.Z_OK;
- }
- if (bits > 16 || state.bits + bits > 32) return ZLIB.Z_STREAM_ERROR;
- value &= (1 << bits) - 1;
- state.hold += value << state.bits;
- state.bits += bits;
- return ZLIB.Z_OK;
- };
- var lenfix_ary = null;
- var distfix_ary = null;
- function fixedtables(state)
- {
- var i;
- if (!lenfix_ary) lenfix_ary = [ { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 80 }, { op: 0, bits: 8, val: 16 }, { op: 20, bits: 8, val: 115 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 112 }, { op: 0, bits: 8, val: 48 }, { op: 0, bits: 9, val: 192 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 96 }, { op: 0, bits: 8, val: 32 }, { op: 0, bits: 9, val: 160 }, { op: 0, bits: 8, val: 0 }, { op: 0, bits: 8, val: 128 }, { op: 0, bits: 8, val: 64 }, { op: 0, bits: 9, val: 224 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 88 }, { op: 0, bits: 8, val: 24 }, { op: 0, bits: 9, val: 144 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 120 }, { op: 0, bits: 8, val: 56 }, { op: 0, bits: 9, val: 208 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 104 }, { op: 0, bits: 8, val: 40 }, { op: 0, bits: 9, val: 176 }, { op: 0, bits: 8, val: 8 }, { op: 0, bits: 8, val: 136 }, { op: 0, bits: 8, val: 72 }, { op: 0, bits: 9, val: 240 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 84 }, { op: 0, bits: 8, val: 20 }, { op: 21, bits: 8, val: 227 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 116 }, { op: 0, bits: 8, val: 52 }, { op: 0, bits: 9, val: 200 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 100 }, { op: 0, bits: 8, val: 36 }, { op: 0, bits: 9, val: 168 }, { op: 0, bits: 8, val: 4 }, { op: 0, bits: 8, val: 132 }, { op: 0, bits: 8, val: 68 }, { op: 0, bits: 9, val: 232 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 92 }, { op: 0, bits: 8, val: 28 }, { op: 0, bits: 9, val: 152 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 124 }, { op: 0, bits: 8, val: 60 }, { op: 0, bits: 9, val: 216 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 108 }, { op: 0, bits: 8, val: 44 }, { op: 0, bits: 9, val: 184 }, { op: 0, bits: 8, val: 12 }, { op: 0, bits: 8, val: 140 }, { op: 0, bits: 8, val: 76 }, { op: 0, bits: 9, val: 248 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 82 }, { op: 0, bits: 8, val: 18 }, { op: 21, bits: 8, val: 163 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 114 }, { op: 0, bits: 8, val: 50 }, { op: 0, bits: 9, val: 196 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 98 }, { op: 0, bits: 8, val: 34 }, { op: 0, bits: 9, val: 164 }, { op: 0, bits: 8, val: 2 }, { op: 0, bits: 8, val: 130 }, { op: 0, bits: 8, val: 66 }, { op: 0, bits: 9, val: 228 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 90 }, { op: 0, bits: 8, val: 26 }, { op: 0, bits: 9, val: 148 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 122 }, { op: 0, bits: 8, val: 58 }, { op: 0, bits: 9, val: 212 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 106 }, { op: 0, bits: 8, val: 42 }, { op: 0, bits: 9, val: 180 }, { op: 0, bits: 8, val: 10 }, { op: 0, bits: 8, val: 138 }, { op: 0, bits: 8, val: 74 }, { op: 0, bits: 9, val: 244 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 86 }, { op: 0, bits: 8, val: 22 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 118 }, { op: 0, bits: 8, val: 54 }, { op: 0, bits: 9, val: 204 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 102 }, { op: 0, bits: 8, val: 38 }, { op: 0, bits: 9, val: 172 }, { op: 0, bits: 8, val: 6 }, { op: 0, bits: 8, val: 134 }, { op: 0, bits: 8, val: 70 }, { op: 0, bits: 9, val: 236 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 94 }, { op: 0, bits: 8, val: 30 }, { op: 0, bits: 9, val: 156 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 126 }, { op: 0, bits: 8, val: 62 }, { op: 0, bits: 9, val: 220 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 110 }, { op: 0, bits: 8, val: 46 }, { op: 0, bits: 9, val: 188 }, { op: 0, bits: 8, val: 14 }, { op: 0, bits: 8, val: 142 }, { op: 0, bits: 8, val: 78 }, { op: 0, bits: 9, val: 252 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 81 }, { op: 0, bits: 8, val: 17 }, { op: 21, bits: 8, val: 131 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 113 }, { op: 0, bits: 8, val: 49 }, { op: 0, bits: 9, val: 194 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 97 }, { op: 0, bits: 8, val: 33 }, { op: 0, bits: 9, val: 162 }, { op: 0, bits: 8, val: 1 }, { op: 0, bits: 8, val: 129 }, { op: 0, bits: 8, val: 65 }, { op: 0, bits: 9, val: 226 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 89 }, { op: 0, bits: 8, val: 25 }, { op: 0, bits: 9, val: 146 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 121 }, { op: 0, bits: 8, val: 57 }, { op: 0, bits: 9, val: 210 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 105 }, { op: 0, bits: 8, val: 41 }, { op: 0, bits: 9, val: 178 }, { op: 0, bits: 8, val: 9 }, { op: 0, bits: 8, val: 137 }, { op: 0, bits: 8, val: 73 }, { op: 0, bits: 9, val: 242 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 85 }, { op: 0, bits: 8, val: 21 }, { op: 16, bits: 8, val: 258 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 117 }, { op: 0, bits: 8, val: 53 }, { op: 0, bits: 9, val: 202 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 101 }, { op: 0, bits: 8, val: 37 }, { op: 0, bits: 9, val: 170 }, { op: 0, bits: 8, val: 5 }, { op: 0, bits: 8, val: 133 }, { op: 0, bits: 8, val: 69 }, { op: 0, bits: 9, val: 234 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 93 }, { op: 0, bits: 8, val: 29 }, { op: 0, bits: 9, val: 154 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 125 }, { op: 0, bits: 8, val: 61 }, { op: 0, bits: 9, val: 218 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 109 }, { op: 0, bits: 8, val: 45 }, { op: 0, bits: 9, val: 186 }, { op: 0, bits: 8, val: 13 }, { op: 0, bits: 8, val: 141 }, { op: 0, bits: 8, val: 77 }, { op: 0, bits: 9, val: 250 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 83 }, { op: 0, bits: 8, val: 19 }, { op: 21, bits: 8, val: 195 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 115 }, { op: 0, bits: 8, val: 51 }, { op: 0, bits: 9, val: 198 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 99 }, { op: 0, bits: 8, val: 35 }, { op: 0, bits: 9, val: 166 }, { op: 0, bits: 8, val: 3 }, { op: 0, bits: 8, val: 131 }, { op: 0, bits: 8, val: 67 }, { op: 0, bits: 9, val: 230 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 91 }, { op: 0, bits: 8, val: 27 }, { op: 0, bits: 9, val: 150 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 123 }, { op: 0, bits: 8, val: 59 }, { op: 0, bits: 9, val: 214 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 107 }, { op: 0, bits: 8, val: 43 }, { op: 0, bits: 9, val: 182 }, { op: 0, bits: 8, val: 11 }, { op: 0, bits: 8, val: 139 }, { op: 0, bits: 8, val: 75 }, { op: 0, bits: 9, val: 246 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 87 }, { op: 0, bits: 8, val: 23 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 119 }, { op: 0, bits: 8, val: 55 }, { op: 0, bits: 9, val: 206 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 103 }, { op: 0, bits: 8, val: 39 }, { op: 0, bits: 9, val: 174 }, { op: 0, bits: 8, val: 7 }, { op: 0, bits: 8, val: 135 }, { op: 0, bits: 8, val: 71 }, { op: 0, bits: 9, val: 238 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 95 }, { op: 0, bits: 8, val: 31 }, { op: 0, bits: 9, val: 158 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 127 }, { op: 0, bits: 8, val: 63 }, { op: 0, bits: 9, val: 222 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 111 }, { op: 0, bits: 8, val: 47 }, { op: 0, bits: 9, val: 190 }, { op: 0, bits: 8, val: 15 }, { op: 0, bits: 8, val: 143 }, { op: 0, bits: 8, val: 79 }, { op: 0, bits: 9, val: 254 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 80 }, { op: 0, bits: 8, val: 16 }, { op: 20, bits: 8, val: 115 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 112 }, { op: 0, bits: 8, val: 48 }, { op: 0, bits: 9, val: 193 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 96 }, { op: 0, bits: 8, val: 32 }, { op: 0, bits: 9, val: 161 }, { op: 0, bits: 8, val: 0 }, { op: 0, bits: 8, val: 128 }, { op: 0, bits: 8, val: 64 }, { op: 0, bits: 9, val: 225 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 88 }, { op: 0, bits: 8, val: 24 }, { op: 0, bits: 9, val: 145 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 120 }, { op: 0, bits: 8, val: 56 }, { op: 0, bits: 9, val: 209 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 104 }, { op: 0, bits: 8, val: 40 }, { op: 0, bits: 9, val: 177 }, { op: 0, bits: 8, val: 8 }, { op: 0, bits: 8, val: 136 }, { op: 0, bits: 8, val: 72 }, { op: 0, bits: 9, val: 241 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 84 }, { op: 0, bits: 8, val: 20 }, { op: 21, bits: 8, val: 227 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 116 }, { op: 0, bits: 8, val: 52 }, { op: 0, bits: 9, val: 201 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 100 }, { op: 0, bits: 8, val: 36 }, { op: 0, bits: 9, val: 169 }, { op: 0, bits: 8, val: 4 }, { op: 0, bits: 8, val: 132 }, { op: 0, bits: 8, val: 68 }, { op: 0, bits: 9, val: 233 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 92 }, { op: 0, bits: 8, val: 28 }, { op: 0, bits: 9, val: 153 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 124 }, { op: 0, bits: 8, val: 60 }, { op: 0, bits: 9, val: 217 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 108 }, { op: 0, bits: 8, val: 44 }, { op: 0, bits: 9, val: 185 }, { op: 0, bits: 8, val: 12 }, { op: 0, bits: 8, val: 140 }, { op: 0, bits: 8, val: 76 }, { op: 0, bits: 9, val: 249 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 82 }, { op: 0, bits: 8, val: 18 }, { op: 21, bits: 8, val: 163 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 114 }, { op: 0, bits: 8, val: 50 }, { op: 0, bits: 9, val: 197 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 98 }, { op: 0, bits: 8, val: 34 }, { op: 0, bits: 9, val: 165 }, { op: 0, bits: 8, val: 2 }, { op: 0, bits: 8, val: 130 }, { op: 0, bits: 8, val: 66 }, { op: 0, bits: 9, val: 229 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 90 }, { op: 0, bits: 8, val: 26 }, { op: 0, bits: 9, val: 149 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 122 }, { op: 0, bits: 8, val: 58 },{ op: 0, bits: 9, val: 213 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 106 }, { op: 0, bits: 8, val: 42 }, { op: 0, bits: 9, val: 181 }, { op: 0, bits: 8, val: 10 }, { op: 0, bits: 8, val: 138 },{ op: 0, bits: 8, val: 74 }, { op: 0, bits: 9, val: 245 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 86 }, { op: 0, bits: 8, val: 22 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 },{ op: 0, bits: 8, val: 118 }, { op: 0, bits: 8, val: 54 }, { op: 0, bits: 9, val: 205 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 102 }, { op: 0, bits: 8, val: 38 }, { op: 0, bits: 9, val: 173 },{ op: 0, bits: 8, val: 6 }, { op: 0, bits: 8, val: 134 }, { op: 0, bits: 8, val: 70 }, { op: 0, bits: 9, val: 237 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 94 }, { op: 0, bits: 8, val: 30 },{ op: 0, bits: 9, val: 157 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 126 }, { op: 0, bits: 8, val: 62 }, { op: 0, bits: 9, val: 221 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 110 }, { op: 0, bits: 8, val: 46 }, { op: 0, bits: 9, val: 189 }, { op: 0, bits: 8, val: 14 }, { op: 0, bits: 8, val: 142 }, { op: 0, bits: 8, val: 78 }, { op: 0, bits: 9, val: 253 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 81 }, { op: 0, bits: 8, val: 17 }, { op: 21, bits: 8, val: 131 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 113 }, { op: 0, bits: 8, val: 49 }, { op: 0, bits: 9, val: 195 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 97 }, { op: 0, bits: 8, val: 33 }, { op: 0, bits: 9, val: 163 }, { op: 0, bits: 8, val: 1 }, { op: 0, bits: 8, val: 129 }, { op: 0, bits: 8, val: 65 }, { op: 0, bits: 9, val: 227 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 89 }, { op: 0, bits: 8, val: 25 }, { op: 0, bits: 9, val: 147 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 121 }, { op: 0, bits: 8, val: 57 }, { op: 0, bits: 9, val: 211 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 105 }, { op: 0, bits: 8, val: 41 }, { op: 0, bits: 9, val: 179 }, { op: 0, bits: 8, val: 9 },{ op: 0, bits: 8, val: 137 }, { op: 0, bits: 8, val: 73 }, { op: 0, bits: 9, val: 243 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 85 }, { op: 0, bits: 8, val: 21 }, { op: 16, bits: 8, val: 258 },{ op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 117 }, { op: 0, bits: 8, val: 53 }, { op: 0, bits: 9, val: 203 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 101 }, { op: 0, bits: 8, val: 37 },{ op: 0, bits: 9, val: 171 }, { op: 0, bits: 8, val: 5 }, { op: 0, bits: 8, val: 133 }, { op: 0, bits: 8, val: 69 }, { op: 0, bits: 9, val: 235 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 93 },{ op: 0, bits: 8, val: 29 }, { op: 0, bits: 9, val: 155 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 125 }, { op: 0, bits: 8, val: 61 }, { op: 0, bits: 9, val: 219 }, { op: 18, bits: 7, val: 23 },{ op: 0, bits: 8, val: 109 }, { op: 0, bits: 8, val: 45 }, { op: 0, bits: 9, val: 187 }, { op: 0, bits: 8, val: 13 }, { op: 0, bits: 8, val: 141 }, { op: 0, bits: 8, val: 77 }, { op: 0, bits: 9, val: 251 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 83 }, { op: 0, bits: 8, val: 19 }, { op: 21, bits: 8, val: 195 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 115 }, { op: 0, bits: 8, val: 51 }, { op: 0, bits: 9, val: 199 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 99 }, { op: 0, bits: 8, val: 35 }, { op: 0, bits: 9, val: 167 }, { op: 0, bits: 8, val: 3 }, { op: 0, bits: 8, val: 131 }, { op: 0, bits: 8, val: 67 }, { op: 0, bits: 9, val: 231 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 91 }, { op: 0, bits: 8, val: 27 }, { op: 0, bits: 9, val: 151 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 123 }, { op: 0, bits: 8, val: 59 }, { op: 0, bits: 9, val: 215 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 107 }, { op: 0, bits: 8, val: 43 }, { op: 0, bits: 9, val: 183 }, { op: 0, bits: 8, val: 11 }, { op: 0, bits: 8, val: 139 }, { op: 0, bits: 8, val: 75 }, { op: 0, bits: 9, val: 247 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 87 }, { op: 0, bits: 8, val: 23 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 119 }, { op: 0, bits: 8, val: 55 }, { op: 0, bits: 9, val: 207 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 103 }, { op: 0, bits: 8, val: 39 }, { op: 0, bits: 9, val: 175 }, { op: 0, bits: 8, val: 7 }, { op: 0, bits: 8, val: 135 }, { op: 0, bits: 8, val: 71 }, { op: 0, bits: 9, val: 239 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 95 }, { op: 0, bits: 8, val: 31 }, { op: 0, bits: 9, val: 159 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 127 }, { op: 0, bits: 8, val: 63 }, { op: 0, bits: 9, val: 223 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 111 }, { op: 0, bits: 8, val: 47 }, { op: 0, bits: 9, val: 191 }, { op: 0, bits: 8, val: 15 }, { op: 0, bits: 8, val: 143 }, { op: 0, bits: 8, val: 79 }, { op: 0, bits: 9, val: 255 } ];
- if (!distfix_ary) distfix_ary = [ { op: 16, bits: 5, val: 1 }, { op: 23, bits: 5, val: 257 }, { op: 19, bits: 5, val: 17 }, { op: 27, bits: 5, val: 4097 }, { op: 17, bits: 5, val: 5 }, { op: 25, bits: 5, val: 1025 }, { op: 21, bits: 5, val: 65 }, { op: 29, bits: 5, val: 16385 }, { op: 16, bits: 5, val: 3 }, { op: 24, bits: 5, val: 513 }, { op: 20, bits: 5, val: 33 }, { op: 28, bits: 5, val: 8193 }, { op: 18, bits: 5, val: 9 }, { op: 26, bits: 5, val: 2049 }, { op: 22, bits: 5, val: 129 }, { op: 64, bits: 5, val: 0 }, { op: 16, bits: 5, val: 2 }, { op: 23, bits: 5, val: 385 }, { op: 19, bits: 5, val: 25 }, { op: 27, bits: 5, val: 6145 }, { op: 17, bits: 5, val: 7 }, { op: 25, bits: 5, val: 1537 }, { op: 21, bits: 5, val: 97 }, { op: 29, bits: 5, val: 24577 }, { op: 16, bits: 5, val: 4 }, { op: 24, bits: 5, val: 769 }, { op: 20, bits: 5, val: 49 }, { op: 28, bits: 5, val: 12289 }, { op: 18, bits: 5, val: 13 }, { op: 26, bits: 5, val: 3073 }, { op: 22, bits: 5, val: 193 }, { op: 64, bits: 5, val: 0 } ];
- state.lencode = 0;
- state.distcode = 512;
- for (i = 0; i < 512; i++) { state.codes[i] = lenfix_ary[i]; }
- for (i = 0; i < 32; i++) { state.codes[i + 512] = distfix_ary[i]; }
- state.lenbits = 9;
- state.distbits = 5;
- }
- /*
- Update the window with the last wsize (normally 32K) bytes written before
- returning. If window does not exist yet, create it. This is only called
- when a window is already in use, or when output has been written during this
- inflate call, but the end of the deflate stream has not been reached yet.
- It is also called to create a window for dictionary data when a dictionary
- is loaded.
- Providing output buffers larger than 32K to inflate() should provide a speed
- advantage, since only the last 32K of output is copied to the sliding window
- upon return from inflate(), and since all distances after the first 32K of
- output will fall in the output data, making match copies simpler and faster.
- The advantage may be dependent on the size of the processor's data caches.
- */
- function updatewindow(strm)
- {
- var state = strm.state;
- var out = strm.output_data.length;
- /* if it hasn't been done already, allocate space for the window */
- if (state.window === null) {
- state.window = '';
- }
- /* if window not in use yet, initialize */
- if (state.wsize == 0) {
- state.wsize = 1 << state.wbits;
- }
- // zlib.js: Sliding window
- if (out >= state.wsize) {
- state.window = strm.output_data.substring(out - state.wsize);
- } else {
- if(state.whave + out < state.wsize) {
- state.window += strm.output_data;
- } else {
- state.window = state.window.substring(state.whave - (state.wsize - out)) + strm.output_data;
- }
- }
- state.whave = state.window.length;
- if(state.whave < state.wsize) {
- state.wnext = state.whave;
- } else {
- state.wnext = 0;
- }
- return 0;
- }
- // #ifdef GUNZIP
- function CRC2(strm, word)
- {
- var hbuf = [word & 0xff, (word >>> 8) & 0xff];
- strm.state.check = strm.checksum_function(strm.state.check, hbuf, 0, 2);
- }
- function CRC4(strm, word)
- {
- var hbuf = [word & 0xff,
- (word >>> 8) & 0xff,
- (word >>> 16) & 0xff,
- (word >>> 24) & 0xff];
- strm.state.check = strm.checksum_function(strm.state.check, hbuf, 0, 4);
- }
- /* Load registers with state in inflate() for speed */
- function LOAD(strm, s)
- {
- s.strm = strm; /* z_stream */
- s.left = strm.avail_out; /* available output */
- s.next = strm.next_in; /* next input */
- s.have = strm.avail_in; /* available input */
- s.hold = strm.state.hold; /* bit buffer */
- s.bits = strm.state.bits; /* bits in bit buffer */
- return s;
- }
- /* Restore state from registers in inflate() */
- function RESTORE(s)
- {
- var strm = s.strm;
- strm.next_in = s.next;
- strm.avail_out = s.left;
- strm.avail_in = s.have;
- strm.state.hold = s.hold;
- strm.state.bits = s.bits;
- }
- /* Clear the input bit accumulator */
- function INITBITS(s)
- {
- s.hold = 0;
- s.bits = 0;
- }
- /* Get a byte of input into the bit accumulator, or return from inflate()
- if there is no input available. */
- function PULLBYTE(s)
- {
- if (s.have == 0) return false;
- s.have--;
- s.hold += (s.strm.input_data.charCodeAt(s.next++) & 0xff) << s.bits;
- s.bits += 8;
- return true;
- }
- /* Assure that there are at least n bits in the bit accumulator. If there is
- not enough available input to do that, then return from inflate(). */
- function NEEDBITS(s, n)
- {
- // if(typeof n != 'number') throw 'ERROR';
- while (s.bits < n) {
- if(!PULLBYTE(s))
- return false;
- }
- return true;
- }
- /* Return the low n bits of the bit accumulator (n < 16) */
- function BITS(s, n)
- {
- return s.hold & ((1 << n) - 1);
- }
- /* Remove n bits from the bit accumulator */
- function DROPBITS(s, n)
- {
- // if(typeof n != 'number') throw 'ERROR';
- s.hold >>>= n;
- s.bits -= n;
- }
- /* Remove zero to seven bits as needed to go to a byte boundary */
- function BYTEBITS(s)
- {
- s.hold >>>= s.bits & 7;
- s.bits -= s.bits & 7;
- }
- /* Reverse the bytes in a 32-bit value */
- function REVERSE(q)
- {
- return ((q >>> 24) & 0xff) +
- ((q >>> 8) & 0xff00) +
- ((q & 0xff00) << 8) +
- ((q & 0xff) << 24);
- }
- /*
- inflate() uses a state machine to process as much input data and generate as
- much output data as possible before returning. The state machine is
- structured roughly as follows:
- for (;;) switch (state) {
- ...
- case STATEn:
- if (not enough input data or output space to make progress)
- return;
- ... make progress ...
- state = STATEm;
- break;
- ...
- }
- so when inflate() is called again, the same case is attempted again, and
- if the appropriate resources are provided, the machine proceeds to the
- next state. The NEEDBITS() macro is usually the way the state evaluates
- whether it can proceed or should return. NEEDBITS() does the return if
- the requested bits are not available. The typical use of the BITS macros
- is:
- NEEDBITS(n);
- ... do something with BITS(n) ...
- DROPBITS(n);
- where NEEDBITS(n) either returns from inflate() if there isn't enough
- input left to load n bits into the accumulator, or it continues. BITS(n)
- gives the low n bits in the accumulator. When done, DROPBITS(n) drops
- the low n bits off the accumulator. INITBITS() clears the accumulator
- and sets the number of available bits to zero. BYTEBITS() discards just
- enough bits to put the accumulator on a byte boundary. After BYTEBITS()
- and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
- NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
- if there is no input available. The decoding of variable length codes uses
- PULLBYTE() directly in order to pull just enough bytes to decode the next
- code, and no more.
- Some states loop until they get enough input, making sure that enough
- state information is maintained to continue the loop where it left off
- if NEEDBITS() returns in the loop. For example, want, need, and keep
- would all have to actually be part of the saved state in case NEEDBITS()
- returns:
- case STATEw:
- while (want < need) {
- NEEDBITS(n);
- keep[want++] = BITS(n);
- DROPBITS(n);
- }
- state = STATEx;
- case STATEx:
- As shown above, if the next state is also the next case, then the break
- is omitted.
- A state may also return if there is not enough output space available to
- complete that state. Those states are copying stored data, writing a
- literal byte, and copying a matching string.
- When returning, a "goto inf_leave" is used to update the total counters,
- update the check value, and determine whether any progress has been made
- during that inflate() call in order to return the proper return code.
- Progress is defined as a change in either strm->avail_in or strm->avail_out.
- When there is a window, goto inf_leave will update the window with the last
- output written. If a goto inf_leave occurs in the middle of decompression
- and there is no window currently, goto inf_leave will create one and copy
- output to the window for the next call of inflate().
- In this implementation, the flush parameter of inflate() only affects the
- return code (per zlib.h). inflate() always writes as much as possible to
- strm->next_out, given the space available and the provided input--the effect
- documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers
- the allocation of and copying into a sliding window until necessary, which
- provides the effect documented in zlib.h for Z_FINISH when the entire input
- stream available. So the only thing the flush parameter actually does is:
- when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it
- will return Z_BUF_ERROR if it has not reached the end of the stream.
- */
- /* permutation of code lengths */
- var inflate_order = [
- 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
- ZLIB.inflate = function(strm, flush)
- {
- var state;
- var s;
- var _in, out; /* save starting available input and output */
- var copy; /* number of stored or match bytes to copy */
- var from_window_offset = -1; /* index of window[] */
- var from_out_offset = -1; /* index of next_out[] */
- var here; /* current decoding table entry */
- var last; /* parent table entry */
- var len; /* length to copy for repeats, bits to drop */
- var ret; /* return code */
- if (!strm || !strm.state ||
- (!strm.input_data && strm.avail_in != 0))
- return ZLIB.Z_STREAM_ERROR;
- state = strm.state;
- if (state.mode == TYPE) state.mode = TYPEDO; /* skip check */
- // LOAD
- s = {};
- LOAD(strm, s);
- _in = s.have;
- out = s.left;
- ret = ZLIB.Z_OK;
- inf_leave: for (;;) {
- switch (state.mode) {
- case HEAD:
- if (state.wrap == 0) {
- state.mode = TYPEDO;
- break;
- }
- if(!NEEDBITS(s, 16)) break inf_leave;
- // #ifdef GUNZIP
- if ((state.wrap & 2) && s.hold == 0x8b1f) { /* gzip header */
- state.check = strm.checksum_function(0, null, 0, 0);
- CRC2(strm, s.hold);
- INITBITS(s);
- state.mode = FLAGS;
- break;
- }
- state.flags = 0; /* expect zlib header */
- if (state.head !== null)
- state.head.done = -1;
- if (!(state.wrap & 1) || /* check if zlib header allowed */
- //#else
- // if (
- //#endif
- ((BITS(s, 8) << 8) + (s.hold >>> 8)) % 31) {
- strm.msg = 'incorrect header check';
- state.mode = BAD;
- break;
- }
- if (BITS(s, 4) != ZLIB.Z_DEFLATED) {
- strm.msg = 'unknown compression method';
- state.mode = BAD;
- break;
- }
- DROPBITS(s, 4);
- len = BITS(s, 4) + 8;
- if (state.wbits == 0)
- state.wbits = len;
- else if (len > state.wbits) {
- strm.msg = 'invalid window size';
- state.mode = BAD;
- break;
- }
- state.dmax = 1 << len;
- // Tracev((stderr, "inflate: zlib header ok\n"));
- strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
- state.mode = s.hold & 0x200 ? DICTID : TYPE;
- INITBITS(s);
- break;
- // #ifdef GUNZIP
- case FLAGS:
- if(!NEEDBITS(s, 16)) break inf_leave;
- state.flags = s.hold;
- if ((state.flags & 0xff) != ZLIB.Z_DEFLATED) {
- strm.msg = "unknown compression method";
- state.mode = BAD;
- break;
- }
- if (state.flags & 0xe000) {
- strm.msg = "unknown header flags set";
- state.mode = BAD;
- break;
- }
- if (state.head !== null)
- state.head.text = (s.hold >>> 8) & 1;
- if (state.flags & 0x0200) {
- CRC2(strm, s.hold);
- }
- INITBITS(s);
- state.mode = TIME;
- case TIME:
- if(!NEEDBITS(s, 32)) break inf_leave;
- if (state.head !== null)
- state.head.time = s.hold;
- if (state.flags & 0x0200) {
- CRC4(strm, s.hold);
- }
- INITBITS(s);
- state.mode = OS;
- case OS:
- if(!NEEDBITS(s, 16)) break inf_leave;
- if (state.head !== null) {
- state.head.xflags = s.hold & 0xff;
- state.head.os = s.hold >>> 8;
- }
- if (state.flags & 0x0200) {
- CRC2(strm, s.hold);
- }
- INITBITS(s);
- state.mode = EXLEN;
- case EXLEN:
- if (state.flags & 0x0400) {
- if(!NEEDBITS(s, 16)) break inf_leave;
- state.length = s.hold;
- if (state.head !== null) {
- state.head.extra_len = s.hold;
- }
- if (state.flags & 0x0200) {
- CRC2(strm, s.hold);
- }
- INITBITS(s);
- state.head.extra = "";
- }
- else if (state.head !== null) {
- state.head.extra = null;
- }
- state.mode = EXTRA;
- case EXTRA:
- if (state.flags & 0x0400) {
- copy = state.length;
- if (copy > s.have) copy = s.have;
- if (copy) {
- if (state.head !== null &&
- state.head.extra !== null) {
- len = state.head.extra_len - state.length;
- /*
- zmemcpy(state->head->extra + len, next,
- len + copy > state->head->extra_max ?
- state->head->extra_max - len : copy);
- */
- state.head.extra += strm.input_data.substring(
- s.next, s.next + (len + copy > state.head.extra_max ?
- state.head.extra_max - len : copy));
-
- }
- if (state.flags & 0x0200)
- state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
- s.have -= copy;
- s.next += copy;
- state.length -= copy;
- }
- if (state.length) break inf_leave;
- }
- state.length = 0;
- state.mode = NAME;
- case NAME:
- if (state.flags & 0x0800) {
- if (s.have == 0) break inf_leave;
- if (state.head !== null && state.head.name === null) {
- state.head.name = "";
- }
- copy = 0;
- // TODO end = strm.input_data.indexOf("\0", s.next);
- // TODO state.length => state.head.name.length
- do {
- len = strm.input_data.charAt(s.next + copy); copy++;
- if(len === "\0")
- break;
- if (state.head !== null &&
- state.length < state.head.name_max) {
- state.head.name += len;
- state.length++;
- }
- } while (copy < s.have);
- if (state.flags & 0x0200) {
- state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
- }
- s.have -= copy;
- s.next += copy;
- if (len !== "\0") break inf_leave;
- }
- else if (state.head !== null)
- state.head.name = null;
- state.length = 0;
- state.mode = COMMENT;
- case COMMENT:
- if (state.flags & 0x1000) {
- if (s.have == 0) break inf_leave;
- copy = 0;
- if (state.head !== null && state.head.comment === null) {
- state.head.comment = "";
- }
- // TODO end = strm.input_data.indexOf("\0", s.next);
- // TODO state.length => state.head.comment.length
- do {
- len = strm.input_data.charAt(s.next + copy); copy++;
- if(len === "\0")
- break;
- if (state.head !== null &&
- state.length < state.head.comm_max) {
- state.head.comment += len;
- state.length++;
- }
- } while (copy < s.have);
- if (state.flags & 0x0200)
- state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
- s.have -= copy;
- s.next += copy;
- if (len !== "\0") break inf_leave;
- }
- else if (state.head !== null)
- state.head.comment = null;
- state.mode = HCRC;
- case HCRC:
- if (state.flags & 0x0200) {
- if(!NEEDBITS(s, 16)) break inf_leave;
- if (s.hold != (state.check & 0xffff)) {
- strm.msg = "header crc mismatch";
- state.mode = BAD;
- break;
- }
- INITBITS(s);
- }
- if (state.head !== null) {
- state.head.hcrc = (state.flags >>> 9) & 1;
- state.head.done = 1;
- }
- strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
- state.mode = TYPE;
- break;
- //#endif
- case DICTID:
- if(!NEEDBITS(s, 32)) break inf_leave;
- strm.adler = state.check = REVERSE(s.hold);
- INITBITS(s);
- state.mode = DICT;
- case DICT:
- if (state.havedict == 0) {
- RESTORE(s);
- return ZLIB.Z_NEED_DICT;
- }
- strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
- state.mode = TYPE;
- case TYPE:
- if (flush == ZLIB.Z_BLOCK || flush == ZLIB.Z_TREES) break inf_leave;
- case TYPEDO:
- if (state.last) {
- BYTEBITS(s);
- state.mode = CHECK;
- break;
- }
- if(!NEEDBITS(s, 3)) break inf_leave;
- state.last = BITS(s, 1);
- DROPBITS(s, 1);
- switch (BITS(s, 2)) {
- case 0: /* stored block */
- // Tracev((stderr, "inflate: stored block%s\n",
- // state->last ? " (last)" : ""));
- state.mode = STORED;
- break;
- case 1: /* fixed block */
- fixedtables(state);
- // Tracev((stderr, "inflate: fixed codes block%s\n",
- // state->last ? " (last)" : ""));
- state.mode = LEN_; /* decode codes */
- if (flush == ZLIB.Z_TREES) {
- DROPBITS(s, 2);
- break inf_leave;
- }
- break;
- case 2: /* dynamic block */
- // Tracev((stderr, "inflate: dynamic codes block%s\n",
- // state->last ? " (last)" : ""));
- state.mode = TABLE;
- break;
- case 3:
- strm.msg = 'invalid block type';
- state.mode = BAD;
- }
- DROPBITS(s, 2);
- break;
- case STORED:
- BYTEBITS(s); /* go to byte boundary */
- if(!NEEDBITS(s, 32)) break inf_leave;
- if ((s.hold & 0xffff) != (((s.hold >>> 16) & 0xffff) ^ 0xffff)) {
- strm.msg = 'invalid stored block lengths';
- state.mode = BAD;
- break;
- }
- state.length = s.hold & 0xffff;
- // Tracev((stderr, "inflate: stored length %u\n",
- // state->length));
- INITBITS(s);
- state.mode = COPY_;
- if (flush == ZLIB.Z_TREES) break inf_leave;
- case COPY_:
- state.mode = COPY;
- case COPY:
- copy = state.length;
- if (copy) {
- if (copy > s.have) copy = s.have;
- if (copy > s.left) copy = s.left;
- if (copy == 0) break inf_leave;
- strm.output_data += strm.input_data.substring(s.next, s.next + copy);
- strm.next_out += copy;
- s.have -= copy;
- s.next += copy;
- s.left -= copy;
- state.length -= copy;
- break;
- }
- // Tracev((stderr, "inflate: stored end\n"));
- state.mode = TYPE;
- break;
- case TABLE:
- if(!NEEDBITS(s, 14)) break inf_leave;
- state.nlen = BITS(s, 5) + 257;
- DROPBITS(s, 5);
- state.ndist = BITS(s, 5) + 1;
- DROPBITS(s, 5);
- state.ncode = BITS(s, 4) + 4;
- DROPBITS(s, 4);
- //#ifndef PKZIP_BUG_WORKAROUND
- if (state.nlen > 286 || state.ndist > 30) {
- strm.msg = 'too many length or distance symbols';
- state.mode = BAD;
- break;
- }
- //#endif
- // Tracev((stderr, "inflate: table sizes ok\n"));
- state.have = 0;
- state.mode = LENLENS;
- case LENLENS:
- while (state.have < state.ncode) {
- if(!NEEDBITS(s, 3)) break inf_leave;
- var tmp = BITS(s, 3);
- state.lens[inflate_order[state.have++]] = tmp;
- DROPBITS(s, 3);
- }
- while (state.have < 19)
- state.lens[inflate_order[state.have++]] = 0;
- state.next = 0;
- state.lencode = 0;
- state.lenbits = 7;
- // ret = inflate_table(CODES, state->lens, 19, &(state->next),
- // &(state->lenbits), state->work);
- ret = inflate_table(state, CODES);
- if (ret) {
- strm.msg = 'invalid code lengths set';
- state.mode = BAD;
- break;
- }
- // Tracev((stderr, "inflate: code lengths ok\n"));
- state.have = 0;
- state.mode = CODELENS;
- case CODELENS:
- while (state.have < state.nlen + state.ndist) {
- for (;;) {
- here = state.codes[state.lencode + BITS(s, state.lenbits)];
- if (here.bits <= s.bits) break;
- if(!PULLBYTE(s)) break inf_leave;
- }
- if (here.val < 16) {
- DROPBITS(s, here.bits);
- state.lens[state.have++] = here.val;
- }
- else {
- if (here.val == 16) {
- if(!NEEDBITS(s, here.bits + 2)) break inf_leave;
- DROPBITS(s, here.bits);
- if (state.have == 0) {
- strm.msg = 'invalid bit length repeat';
- state.mode = BAD;
- break;
- }
- len = state.lens[state.have - 1];
- copy = 3 + BITS(s, 2);
- DROPBITS(s, 2);
- }
- else if (here.val == 17) {
- if(!NEEDBITS(s, here.bits + 3)) break inf_leave;
- DROPBITS(s, here.bits);
- len = 0;
- copy = 3 + BITS(s, 3);
- DROPBITS(s, 3);
- }
- else {
- if(!NEEDBITS(s, here.bits + 7)) break inf_leave;
- DROPBITS(s, here.bits);
- len = 0;
- copy = 11 + BITS(s, 7);
- DROPBITS(s, 7);
- }
- if (state.have + copy > state.nlen + state.ndist) {
- strm.msg = 'invalid bit length repeat';
- state.mode = BAD;
- break;
- }
- while (copy--)
- state.lens[state.have++] = len;
- }
- }
- /* handle error breaks in while */
- if (state.mode == BAD) break;
- /* check for end-of-block code (better have one) */
- if (state.lens[256] == 0) {
- strm.msg = 'invalid code -- missing end-of-block';
- state.mode = BAD;
- break;
- }
- /* build code tables -- note: do not change the lenbits or distbits
- values here (9 and 6) without reading the comments in inftrees.h
- concerning the ENOUGH constants, which depend on those values */
- state.next = 0;
- state.lencode = state.next;
- state.lenbits = 9;
- // ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
- // &(state->lenbits), state->work);
- ret = inflate_table(state, LENS);
- if (ret) {
- strm.msg = 'invalid literal/lengths set';
- state.mode = BAD;
- break;
- }
- state.distcode = state.next;
- state.distbits = 6;
- // ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next),
- // &(state->distbits), state->work);
- ret = inflate_table(state, DISTS);
- if (ret) {
- strm.msg = 'invalid distances set';
- state.mode = BAD;
- break;
- }
- // Tracev((stderr, "inflate: codes ok\n"));
- state.mode = LEN_;
- if (flush == ZLIB.Z_TREES) break inf_leave;
- case LEN_:
- state.mode = LEN;
- case LEN:
- if (s.have >= 6 && s.left >= 258) {
- RESTORE(s);
- inflate_fast(strm, out);
- LOAD(strm, s);
- if (state.mode == TYPE)
- state.back = -1;
- break;
- }
- state.back = 0;
- for (;;) {
- here = state.codes[state.lencode + BITS(s, state.lenbits)];
- if (here.bits <= s.bits) break;
- if(!PULLBYTE(s)) break inf_leave;
- }
- if (here.op && (here.op & 0xf0) == 0) {
- last = here;
- for (;;) {
- here = state.codes[state.lencode + last.val +
- (BITS(s, last.bits + last.op) >>> last.bits)];
- if (last.bits + here.bits <= s.bits) break;
- if(!PULLBYTE(s)) break inf_leave;
- }
- DROPBITS(s, last.bits);
- state.back += last.bits;
- }
- DROPBITS(s, here.bits);
- state.back += here.bits;
- state.length = here.val;
- if (here.op == 0) {
- // Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
- // "inflate: literal '%c'\n" :
- // "inflate: literal 0x%02x\n", here.val));
- state.mode = LIT;
- break;
- }
- if (here.op & 32) {
- // Tracevv((stderr, "inflate: end of block\n"));
- state.back = -1;
- state.mode = TYPE;
- break;
- }
- if (here.op & 64) {
- strm.msg = 'invalid literal/length code';
- state.mode = BAD;
- break;
- }
- state.extra = here.op & 15;
- state.mode = LENEXT;
- case LENEXT:
- if (state.extra) {
- if(!NEEDBITS(s, state.extra)) break inf_leave;
- state.length += BITS(s, state.extra);
- DROPBITS(s, state.extra);
- state.back += state.extra;
- }
- //Tracevv((stderr, "inflate: length %u\n", state->length));
- state.was = state.length;
- state.mode = DIST;
- case DIST:
- for (;;) {
- here = state.codes[state.distcode + BITS(s, state.distbits)];
- if (here.bits <= s.bits) break;
- if(!PULLBYTE(s)) break inf_leave;
- }
- if ((here.op & 0xf0) == 0) {
- last = here;
- for (;;) {
- here = state.codes[state.distcode + last.val +
- (BITS(s, last.bits + last.op) >>> last.bits)];
- if ((last.bits + here.bits) <= s.bits) break;
- if(!PULLBYTE(s)) break inf_leave;
- }
- DROPBITS(s, last.bits);
- state.back += last.bits;
- }
- DROPBITS(s, here.bits);
- state.back += here.bits;
- if (here.op & 64) {
- strm.msg = 'invalid distance code';
- state.mode = BAD;
- break;
- }
- state.offset = here.val;
- state.extra = here.op & 15;
- state.mode = DISTEXT;
- case DISTEXT:
- if (state.extra) {
- if(!NEEDBITS(s, state.extra)) break inf_leave;
- state.offset += BITS(s, state.extra);
- DROPBITS(s, state.extra);
- state.back += state.extra;
- }
- //NOSPRT #ifdef INFLATE_STRICT
- // if (state->offset > state->dmax) {
- // strm->msg = (char *)"invalid distance too far back";
- // state->mode = BAD;
- // break;
- // }
- //#endif
- // Tracevv((stderr, "inflate: distance %u\n", state->offset));
- state.mode = MATCH;
- case MATCH:
- if (s.left == 0) break inf_leave;
- copy = out - s.left;
- if (state.offset > copy) { /* copy from window */
- copy = state.offset - copy;
- if (copy > state.whave) {
- if (state.sane) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD;
- break;
- }
- //NOSPRT #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
- // Trace((stderr, "inflate.c too far\n"));
- // copy -= state->whave;
- // if (copy > state->length) copy = state->length;
- // if (copy > left) copy = left;
- // left -= copy;
- // state->length -= copy;
- // do {
- // *put++ = 0;
- // } while (--copy);
- // if (state->length == 0) state->mode = LEN;
- // break;
- //#endif
- }
- if (copy > state.wnext) {
- copy -= state.wnext;
- // from = state->window + (state->wsize - copy);
- from_window_offset = state.wsize - copy;
- from_out_offset = -1;
- }
- else {
- // from = state->window + (state->wnext - copy);
- from_window_offset = state.wnext - copy;
- from_out_offset = -1;
- }
- if (copy > state.length) copy = state.length;
- }
- else { /* copy from output */
- // from = put - state->offset;
- from_window_offset = -1;
- from_out_offset = strm.next_out - state.offset;
- copy = state.length;
- }
- if (copy > s.left) copy = s.left;
- s.left -= copy;
- state.length -= copy;
- if( from_window_offset >= 0 ) {
- strm.output_data += state.window.substring(from_window_offset, from_window_offset + copy);
- strm.next_out += copy;
- copy = 0;
- } else {
- strm.next_out += copy;
- do {
- strm.output_data += strm.output_data.charAt(from_out_offset++);
- } while (--copy);
- }
- if (state.length == 0) state.mode = LEN;
- break;
- case LIT:
- if (s.left == 0) break inf_leave;
- strm.output_data += String.fromCharCode(state.length);
- strm.next_out++;
- //*put++ = (unsigned char)(state->length);
- s.left--;
- state.mode = LEN;
- break;
- case CHECK:
- if (state.wrap) {
- if(!NEEDBITS(s, 32)) break inf_leave;
- out -= s.left;
- strm.total_out += out;
- state.total += out;
- if (out)
- strm.adler = state.check =
- strm.checksum_function(state.check, strm.output_data, strm.output_data.length - out, out);
- out = s.left;
- if ((
- // #ifdef GUNZIP
- state.flags ? s.hold :
- //#endif
- REVERSE(s.hold)) != state.check) {
- strm.msg = "incorrect data check";
- state.mode = BAD;
- break;
- }
- INITBITS(s);
- //debug("## inflate: check matches trailer\n");
- // Tracev((stderr, "inflate: check matches trailer\n"));
- }
- //#ifdef GUNZIP
- state.mode = LENGTH;
- case LENGTH:
- if (state.wrap && state.flags) {
- if(!NEEDBITS(s, 32)) break inf_leave;
- if (s.hold != (state.total & 0xffffffff)) {
- strm.msg = 'incorrect length check';
- state.mode = BAD;
- break;
- }
- INITBITS(s);
- //Tracev((stderr, "inflate: length matches trailer\n"));
- }
- //#endif
- state.mode = DONE;
- case DONE:
- ret = ZLIB.Z_STREAM_END;
- break inf_leave;
- case BAD:
- ret = ZLIB.Z_DATA_ERROR;
- break inf_leave;
- case MEM:
- return ZLIB.Z_MEM_ERROR;
- case SYNC:
- default:
- return ZLIB.Z_STREAM_ERROR;
- } }
- /*
- Return from inflate(), updating the total counts and the check value.
- If there was no progress during the inflate() call, return a buffer
- error. Call updatewindow() to create and/or update the window state.
- Note: a memory error from inflate() is non-recoverable.
- */
- inf_leave:
- RESTORE(s);
- if (state.wsize || (out != strm.avail_out && state.mode < BAD &&
- (state.mode < CHECK || flush != ZLIB.Z_FINISH)))
- if (updatewindow(strm)) {
- state.mode = MEM;
- return ZLIB.Z_MEM_ERROR;
- }
- _in -= strm.avail_in;
- out -= strm.avail_out;
- strm.total_in += _in;
- strm.total_out += out;
- state.total += out;
- if (state.wrap && out)
- strm.adler = state.check = strm.checksum_function(state.check, strm.output_data, 0, strm.output_data.length);
- strm.data_type = state.bits + (state.last ? 64 : 0) +
- (state.mode == TYPE ? 128 : 0) +
- (state.mode == LEN_ || state.mode == COPY_ ? 256 : 0);
- if (((_in == 0 && out == 0) || flush == ZLIB.Z_FINISH) && ret == ZLIB.Z_OK)
- ret = ZLIB.Z_BUF_ERROR;
- return ret;
- };
- ZLIB.inflateEnd = function(strm)
- {
- var state;
- if (!strm || !strm.state )
- return ZLIB.Z_STREAM_ERROR;
- state = strm.state;
- state.window = null;
- strm.state = null;
- // Tracev((stderr, "inflate: end\n"));
- return ZLIB.Z_OK;
- };
- ZLIB.z_stream.prototype.inflate = function(input_string, opts)
- {
- var flush;
- var avail_out;
- var DEFAULT_BUFFER_SIZE = 16384;
- this.input_data = input_string;
- this.next_in = getarg(opts, 'next_in', 0);
- this.avail_in = getarg(opts, 'avail_in', input_string.length - this.next_in);
- flush = getarg(opts, 'flush', ZLIB.Z_SYNC_FLUSH);
- avail_out = getarg(opts, 'avail_out', -1);
- var result = '';
- do {
- this.avail_out = (avail_out >= 0 ? avail_out : DEFAULT_BUFFER_SIZE);
- this.output_data = '';
- this.next_out = 0;
- this.error = ZLIB.inflate(this, flush);
- if(avail_out >= 0) {
- return this.output_data;
- }
- result += this.output_data;
- if(this.avail_out > 0) {
- break;
- }
- } while(this.error == ZLIB.Z_OK);
- return result;
- };
- ZLIB.z_stream.prototype.inflateReset = function(windowBits)
- {
- return ZLIB.inflateReset(this, windowBits);
- };
- }());
|