react / wstein / node_modules / browserify / node_modules / browserify-zlib / node_modules / pako / lib / zlib / inflate.js
80549 views'use strict';123var utils = require('../utils/common');4var adler32 = require('./adler32');5var crc32 = require('./crc32');6var inflate_fast = require('./inffast');7var inflate_table = require('./inftrees');89var CODES = 0;10var LENS = 1;11var DISTS = 2;1213/* Public constants ==========================================================*/14/* ===========================================================================*/151617/* Allowed flush values; see deflate() and inflate() below for details */18//var Z_NO_FLUSH = 0;19//var Z_PARTIAL_FLUSH = 1;20//var Z_SYNC_FLUSH = 2;21//var Z_FULL_FLUSH = 3;22var Z_FINISH = 4;23var Z_BLOCK = 5;24var Z_TREES = 6;252627/* Return codes for the compression/decompression functions. Negative values28* are errors, positive values are used for special but normal events.29*/30var Z_OK = 0;31var Z_STREAM_END = 1;32var Z_NEED_DICT = 2;33//var Z_ERRNO = -1;34var Z_STREAM_ERROR = -2;35var Z_DATA_ERROR = -3;36var Z_MEM_ERROR = -4;37var Z_BUF_ERROR = -5;38//var Z_VERSION_ERROR = -6;3940/* The deflate compression method */41var Z_DEFLATED = 8;424344/* STATES ====================================================================*/45/* ===========================================================================*/464748var HEAD = 1; /* i: waiting for magic header */49var FLAGS = 2; /* i: waiting for method and flags (gzip) */50var TIME = 3; /* i: waiting for modification time (gzip) */51var OS = 4; /* i: waiting for extra flags and operating system (gzip) */52var EXLEN = 5; /* i: waiting for extra length (gzip) */53var EXTRA = 6; /* i: waiting for extra bytes (gzip) */54var NAME = 7; /* i: waiting for end of file name (gzip) */55var COMMENT = 8; /* i: waiting for end of comment (gzip) */56var HCRC = 9; /* i: waiting for header crc (gzip) */57var DICTID = 10; /* i: waiting for dictionary check value */58var DICT = 11; /* waiting for inflateSetDictionary() call */59var TYPE = 12; /* i: waiting for type bits, including last-flag bit */60var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */61var STORED = 14; /* i: waiting for stored size (length and complement) */62var COPY_ = 15; /* i/o: same as COPY below, but only first time in */63var COPY = 16; /* i/o: waiting for input or output to copy stored block */64var TABLE = 17; /* i: waiting for dynamic block table lengths */65var LENLENS = 18; /* i: waiting for code length code lengths */66var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */67var LEN_ = 20; /* i: same as LEN below, but only first time in */68var LEN = 21; /* i: waiting for length/lit/eob code */69var LENEXT = 22; /* i: waiting for length extra bits */70var DIST = 23; /* i: waiting for distance code */71var DISTEXT = 24; /* i: waiting for distance extra bits */72var MATCH = 25; /* o: waiting for output space to copy string */73var LIT = 26; /* o: waiting for output space to write literal */74var CHECK = 27; /* i: waiting for 32-bit check value */75var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */76var DONE = 29; /* finished check, done -- remain here until reset */77var BAD = 30; /* got a data error -- remain here until reset */78var MEM = 31; /* got an inflate() memory error -- remain here until reset */79var SYNC = 32; /* looking for synchronization bytes to restart inflate() */8081/* ===========================================================================*/82838485var ENOUGH_LENS = 852;86var ENOUGH_DISTS = 592;87//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);8889var MAX_WBITS = 15;90/* 32K LZ77 window */91var DEF_WBITS = MAX_WBITS;929394function ZSWAP32(q) {95return (((q >>> 24) & 0xff) +96((q >>> 8) & 0xff00) +97((q & 0xff00) << 8) +98((q & 0xff) << 24));99}100101102function InflateState() {103this.mode = 0; /* current inflate mode */104this.last = false; /* true if processing last block */105this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */106this.havedict = false; /* true if dictionary provided */107this.flags = 0; /* gzip header method and flags (0 if zlib) */108this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */109this.check = 0; /* protected copy of check value */110this.total = 0; /* protected copy of output count */111// TODO: may be {}112this.head = null; /* where to save gzip header information */113114/* sliding window */115this.wbits = 0; /* log base 2 of requested window size */116this.wsize = 0; /* window size or zero if not using window */117this.whave = 0; /* valid bytes in the window */118this.wnext = 0; /* window write index */119this.window = null; /* allocated sliding window, if needed */120121/* bit accumulator */122this.hold = 0; /* input bit accumulator */123this.bits = 0; /* number of bits in "in" */124125/* for string and stored block copying */126this.length = 0; /* literal or length of data to copy */127this.offset = 0; /* distance back to copy string from */128129/* for table and code decoding */130this.extra = 0; /* extra bits needed */131132/* fixed and dynamic code tables */133this.lencode = null; /* starting table for length/literal codes */134this.distcode = null; /* starting table for distance codes */135this.lenbits = 0; /* index bits for lencode */136this.distbits = 0; /* index bits for distcode */137138/* dynamic table building */139this.ncode = 0; /* number of code length code lengths */140this.nlen = 0; /* number of length code lengths */141this.ndist = 0; /* number of distance code lengths */142this.have = 0; /* number of code lengths in lens[] */143this.next = null; /* next available space in codes[] */144145this.lens = new utils.Buf16(320); /* temporary storage for code lengths */146this.work = new utils.Buf16(288); /* work area for code table building */147148/*149because we don't have pointers in js, we use lencode and distcode directly150as buffers so we don't need codes151*/152//this.codes = new utils.Buf32(ENOUGH); /* space for code tables */153this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */154this.distdyn = null; /* dynamic table for distance codes (JS specific) */155this.sane = 0; /* if false, allow invalid distance too far */156this.back = 0; /* bits back of last unprocessed length/lit */157this.was = 0; /* initial length of match */158}159160function inflateResetKeep(strm) {161var state;162163if (!strm || !strm.state) { return Z_STREAM_ERROR; }164state = strm.state;165strm.total_in = strm.total_out = state.total = 0;166strm.msg = ''; /*Z_NULL*/167if (state.wrap) { /* to support ill-conceived Java test suite */168strm.adler = state.wrap & 1;169}170state.mode = HEAD;171state.last = 0;172state.havedict = 0;173state.dmax = 32768;174state.head = null/*Z_NULL*/;175state.hold = 0;176state.bits = 0;177//state.lencode = state.distcode = state.next = state.codes;178state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);179state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);180181state.sane = 1;182state.back = -1;183//Tracev((stderr, "inflate: reset\n"));184return Z_OK;185}186187function inflateReset(strm) {188var state;189190if (!strm || !strm.state) { return Z_STREAM_ERROR; }191state = strm.state;192state.wsize = 0;193state.whave = 0;194state.wnext = 0;195return inflateResetKeep(strm);196197}198199function inflateReset2(strm, windowBits) {200var wrap;201var state;202203/* get the state */204if (!strm || !strm.state) { return Z_STREAM_ERROR; }205state = strm.state;206207/* extract wrap request from windowBits parameter */208if (windowBits < 0) {209wrap = 0;210windowBits = -windowBits;211}212else {213wrap = (windowBits >> 4) + 1;214if (windowBits < 48) {215windowBits &= 15;216}217}218219/* set number of window bits, free window if different */220if (windowBits && (windowBits < 8 || windowBits > 15)) {221return Z_STREAM_ERROR;222}223if (state.window !== null && state.wbits !== windowBits) {224state.window = null;225}226227/* update state and reset the rest of it */228state.wrap = wrap;229state.wbits = windowBits;230return inflateReset(strm);231}232233function inflateInit2(strm, windowBits) {234var ret;235var state;236237if (!strm) { return Z_STREAM_ERROR; }238//strm.msg = Z_NULL; /* in case we return an error */239240state = new InflateState();241242//if (state === Z_NULL) return Z_MEM_ERROR;243//Tracev((stderr, "inflate: allocated\n"));244strm.state = state;245state.window = null/*Z_NULL*/;246ret = inflateReset2(strm, windowBits);247if (ret !== Z_OK) {248strm.state = null/*Z_NULL*/;249}250return ret;251}252253function inflateInit(strm) {254return inflateInit2(strm, DEF_WBITS);255}256257258/*259Return state with length and distance decoding tables and index sizes set to260fixed code decoding. Normally this returns fixed tables from inffixed.h.261If BUILDFIXED is defined, then instead this routine builds the tables the262first time it's called, and returns those tables the first time and263thereafter. This reduces the size of the code by about 2K bytes, in264exchange for a little execution time. However, BUILDFIXED should not be265used for threaded applications, since the rewriting of the tables and virgin266may not be thread-safe.267*/268var virgin = true;269270var lenfix, distfix; // We have no pointers in JS, so keep tables separate271272function fixedtables(state) {273/* build fixed huffman tables if first call (may not be thread safe) */274if (virgin) {275var sym;276277lenfix = new utils.Buf32(512);278distfix = new utils.Buf32(32);279280/* literal/length table */281sym = 0;282while (sym < 144) { state.lens[sym++] = 8; }283while (sym < 256) { state.lens[sym++] = 9; }284while (sym < 280) { state.lens[sym++] = 7; }285while (sym < 288) { state.lens[sym++] = 8; }286287inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9});288289/* distance table */290sym = 0;291while (sym < 32) { state.lens[sym++] = 5; }292293inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5});294295/* do this just once */296virgin = false;297}298299state.lencode = lenfix;300state.lenbits = 9;301state.distcode = distfix;302state.distbits = 5;303}304305306/*307Update the window with the last wsize (normally 32K) bytes written before308returning. If window does not exist yet, create it. This is only called309when a window is already in use, or when output has been written during this310inflate call, but the end of the deflate stream has not been reached yet.311It is also called to create a window for dictionary data when a dictionary312is loaded.313314Providing output buffers larger than 32K to inflate() should provide a speed315advantage, since only the last 32K of output is copied to the sliding window316upon return from inflate(), and since all distances after the first 32K of317output will fall in the output data, making match copies simpler and faster.318The advantage may be dependent on the size of the processor's data caches.319*/320function updatewindow(strm, src, end, copy) {321var dist;322var state = strm.state;323324/* if it hasn't been done already, allocate space for the window */325if (state.window === null) {326state.wsize = 1 << state.wbits;327state.wnext = 0;328state.whave = 0;329330state.window = new utils.Buf8(state.wsize);331}332333/* copy state->wsize or less output bytes into the circular window */334if (copy >= state.wsize) {335utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);336state.wnext = 0;337state.whave = state.wsize;338}339else {340dist = state.wsize - state.wnext;341if (dist > copy) {342dist = copy;343}344//zmemcpy(state->window + state->wnext, end - copy, dist);345utils.arraySet(state.window,src, end - copy, dist, state.wnext);346copy -= dist;347if (copy) {348//zmemcpy(state->window, end - copy, copy);349utils.arraySet(state.window,src, end - copy, copy, 0);350state.wnext = copy;351state.whave = state.wsize;352}353else {354state.wnext += dist;355if (state.wnext === state.wsize) { state.wnext = 0; }356if (state.whave < state.wsize) { state.whave += dist; }357}358}359return 0;360}361362function inflate(strm, flush) {363var state;364var input, output; // input/output buffers365var next; /* next input INDEX */366var put; /* next output INDEX */367var have, left; /* available input and output */368var hold; /* bit buffer */369var bits; /* bits in bit buffer */370var _in, _out; /* save starting available input and output */371var copy; /* number of stored or match bytes to copy */372var from; /* where to copy match bytes from */373var from_source;374var here = 0; /* current decoding table entry */375var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)376//var last; /* parent table entry */377var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)378var len; /* length to copy for repeats, bits to drop */379var ret; /* return code */380var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */381var opts;382383var n; // temporary var for NEED_BITS384385var order = /* permutation of code lengths */386[16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];387388389if (!strm || !strm.state || !strm.output ||390(!strm.input && strm.avail_in !== 0)) {391return Z_STREAM_ERROR;392}393394state = strm.state;395if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */396397398//--- LOAD() ---399put = strm.next_out;400output = strm.output;401left = strm.avail_out;402next = strm.next_in;403input = strm.input;404have = strm.avail_in;405hold = state.hold;406bits = state.bits;407//---408409_in = have;410_out = left;411ret = Z_OK;412413inf_leave: // goto emulation414for (;;) {415switch (state.mode) {416case HEAD:417if (state.wrap === 0) {418state.mode = TYPEDO;419break;420}421//=== NEEDBITS(16);422while (bits < 16) {423if (have === 0) { break inf_leave; }424have--;425hold += input[next++] << bits;426bits += 8;427}428//===//429if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */430state.check = 0/*crc32(0L, Z_NULL, 0)*/;431//=== CRC2(state.check, hold);432hbuf[0] = hold & 0xff;433hbuf[1] = (hold >>> 8) & 0xff;434state.check = crc32(state.check, hbuf, 2, 0);435//===//436437//=== INITBITS();438hold = 0;439bits = 0;440//===//441state.mode = FLAGS;442break;443}444state.flags = 0; /* expect zlib header */445if (state.head) {446state.head.done = false;447}448if (!(state.wrap & 1) || /* check if zlib header allowed */449(((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {450strm.msg = 'incorrect header check';451state.mode = BAD;452break;453}454if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {455strm.msg = 'unknown compression method';456state.mode = BAD;457break;458}459//--- DROPBITS(4) ---//460hold >>>= 4;461bits -= 4;462//---//463len = (hold & 0x0f)/*BITS(4)*/ + 8;464if (state.wbits === 0) {465state.wbits = len;466}467else if (len > state.wbits) {468strm.msg = 'invalid window size';469state.mode = BAD;470break;471}472state.dmax = 1 << len;473//Tracev((stderr, "inflate: zlib header ok\n"));474strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;475state.mode = hold & 0x200 ? DICTID : TYPE;476//=== INITBITS();477hold = 0;478bits = 0;479//===//480break;481case FLAGS:482//=== NEEDBITS(16); */483while (bits < 16) {484if (have === 0) { break inf_leave; }485have--;486hold += input[next++] << bits;487bits += 8;488}489//===//490state.flags = hold;491if ((state.flags & 0xff) !== Z_DEFLATED) {492strm.msg = 'unknown compression method';493state.mode = BAD;494break;495}496if (state.flags & 0xe000) {497strm.msg = 'unknown header flags set';498state.mode = BAD;499break;500}501if (state.head) {502state.head.text = ((hold >> 8) & 1);503}504if (state.flags & 0x0200) {505//=== CRC2(state.check, hold);506hbuf[0] = hold & 0xff;507hbuf[1] = (hold >>> 8) & 0xff;508state.check = crc32(state.check, hbuf, 2, 0);509//===//510}511//=== INITBITS();512hold = 0;513bits = 0;514//===//515state.mode = TIME;516/* falls through */517case TIME:518//=== NEEDBITS(32); */519while (bits < 32) {520if (have === 0) { break inf_leave; }521have--;522hold += input[next++] << bits;523bits += 8;524}525//===//526if (state.head) {527state.head.time = hold;528}529if (state.flags & 0x0200) {530//=== CRC4(state.check, hold)531hbuf[0] = hold & 0xff;532hbuf[1] = (hold >>> 8) & 0xff;533hbuf[2] = (hold >>> 16) & 0xff;534hbuf[3] = (hold >>> 24) & 0xff;535state.check = crc32(state.check, hbuf, 4, 0);536//===537}538//=== INITBITS();539hold = 0;540bits = 0;541//===//542state.mode = OS;543/* falls through */544case OS:545//=== NEEDBITS(16); */546while (bits < 16) {547if (have === 0) { break inf_leave; }548have--;549hold += input[next++] << bits;550bits += 8;551}552//===//553if (state.head) {554state.head.xflags = (hold & 0xff);555state.head.os = (hold >> 8);556}557if (state.flags & 0x0200) {558//=== CRC2(state.check, hold);559hbuf[0] = hold & 0xff;560hbuf[1] = (hold >>> 8) & 0xff;561state.check = crc32(state.check, hbuf, 2, 0);562//===//563}564//=== INITBITS();565hold = 0;566bits = 0;567//===//568state.mode = EXLEN;569/* falls through */570case EXLEN:571if (state.flags & 0x0400) {572//=== NEEDBITS(16); */573while (bits < 16) {574if (have === 0) { break inf_leave; }575have--;576hold += input[next++] << bits;577bits += 8;578}579//===//580state.length = hold;581if (state.head) {582state.head.extra_len = hold;583}584if (state.flags & 0x0200) {585//=== CRC2(state.check, hold);586hbuf[0] = hold & 0xff;587hbuf[1] = (hold >>> 8) & 0xff;588state.check = crc32(state.check, hbuf, 2, 0);589//===//590}591//=== INITBITS();592hold = 0;593bits = 0;594//===//595}596else if (state.head) {597state.head.extra = null/*Z_NULL*/;598}599state.mode = EXTRA;600/* falls through */601case EXTRA:602if (state.flags & 0x0400) {603copy = state.length;604if (copy > have) { copy = have; }605if (copy) {606if (state.head) {607len = state.head.extra_len - state.length;608if (!state.head.extra) {609// Use untyped array for more conveniend processing later610state.head.extra = new Array(state.head.extra_len);611}612utils.arraySet(613state.head.extra,614input,615next,616// extra field is limited to 65536 bytes617// - no need for additional size check618copy,619/*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/620len621);622//zmemcpy(state.head.extra + len, next,623// len + copy > state.head.extra_max ?624// state.head.extra_max - len : copy);625}626if (state.flags & 0x0200) {627state.check = crc32(state.check, input, copy, next);628}629have -= copy;630next += copy;631state.length -= copy;632}633if (state.length) { break inf_leave; }634}635state.length = 0;636state.mode = NAME;637/* falls through */638case NAME:639if (state.flags & 0x0800) {640if (have === 0) { break inf_leave; }641copy = 0;642do {643// TODO: 2 or 1 bytes?644len = input[next + copy++];645/* use constant limit because in js we should not preallocate memory */646if (state.head && len &&647(state.length < 65536 /*state.head.name_max*/)) {648state.head.name += String.fromCharCode(len);649}650} while (len && copy < have);651652if (state.flags & 0x0200) {653state.check = crc32(state.check, input, copy, next);654}655have -= copy;656next += copy;657if (len) { break inf_leave; }658}659else if (state.head) {660state.head.name = null;661}662state.length = 0;663state.mode = COMMENT;664/* falls through */665case COMMENT:666if (state.flags & 0x1000) {667if (have === 0) { break inf_leave; }668copy = 0;669do {670len = input[next + copy++];671/* use constant limit because in js we should not preallocate memory */672if (state.head && len &&673(state.length < 65536 /*state.head.comm_max*/)) {674state.head.comment += String.fromCharCode(len);675}676} while (len && copy < have);677if (state.flags & 0x0200) {678state.check = crc32(state.check, input, copy, next);679}680have -= copy;681next += copy;682if (len) { break inf_leave; }683}684else if (state.head) {685state.head.comment = null;686}687state.mode = HCRC;688/* falls through */689case HCRC:690if (state.flags & 0x0200) {691//=== NEEDBITS(16); */692while (bits < 16) {693if (have === 0) { break inf_leave; }694have--;695hold += input[next++] << bits;696bits += 8;697}698//===//699if (hold !== (state.check & 0xffff)) {700strm.msg = 'header crc mismatch';701state.mode = BAD;702break;703}704//=== INITBITS();705hold = 0;706bits = 0;707//===//708}709if (state.head) {710state.head.hcrc = ((state.flags >> 9) & 1);711state.head.done = true;712}713strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;714state.mode = TYPE;715break;716case DICTID:717//=== NEEDBITS(32); */718while (bits < 32) {719if (have === 0) { break inf_leave; }720have--;721hold += input[next++] << bits;722bits += 8;723}724//===//725strm.adler = state.check = ZSWAP32(hold);726//=== INITBITS();727hold = 0;728bits = 0;729//===//730state.mode = DICT;731/* falls through */732case DICT:733if (state.havedict === 0) {734//--- RESTORE() ---735strm.next_out = put;736strm.avail_out = left;737strm.next_in = next;738strm.avail_in = have;739state.hold = hold;740state.bits = bits;741//---742return Z_NEED_DICT;743}744strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;745state.mode = TYPE;746/* falls through */747case TYPE:748if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }749/* falls through */750case TYPEDO:751if (state.last) {752//--- BYTEBITS() ---//753hold >>>= bits & 7;754bits -= bits & 7;755//---//756state.mode = CHECK;757break;758}759//=== NEEDBITS(3); */760while (bits < 3) {761if (have === 0) { break inf_leave; }762have--;763hold += input[next++] << bits;764bits += 8;765}766//===//767state.last = (hold & 0x01)/*BITS(1)*/;768//--- DROPBITS(1) ---//769hold >>>= 1;770bits -= 1;771//---//772773switch ((hold & 0x03)/*BITS(2)*/) {774case 0: /* stored block */775//Tracev((stderr, "inflate: stored block%s\n",776// state.last ? " (last)" : ""));777state.mode = STORED;778break;779case 1: /* fixed block */780fixedtables(state);781//Tracev((stderr, "inflate: fixed codes block%s\n",782// state.last ? " (last)" : ""));783state.mode = LEN_; /* decode codes */784if (flush === Z_TREES) {785//--- DROPBITS(2) ---//786hold >>>= 2;787bits -= 2;788//---//789break inf_leave;790}791break;792case 2: /* dynamic block */793//Tracev((stderr, "inflate: dynamic codes block%s\n",794// state.last ? " (last)" : ""));795state.mode = TABLE;796break;797case 3:798strm.msg = 'invalid block type';799state.mode = BAD;800}801//--- DROPBITS(2) ---//802hold >>>= 2;803bits -= 2;804//---//805break;806case STORED:807//--- BYTEBITS() ---// /* go to byte boundary */808hold >>>= bits & 7;809bits -= bits & 7;810//---//811//=== NEEDBITS(32); */812while (bits < 32) {813if (have === 0) { break inf_leave; }814have--;815hold += input[next++] << bits;816bits += 8;817}818//===//819if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {820strm.msg = 'invalid stored block lengths';821state.mode = BAD;822break;823}824state.length = hold & 0xffff;825//Tracev((stderr, "inflate: stored length %u\n",826// state.length));827//=== INITBITS();828hold = 0;829bits = 0;830//===//831state.mode = COPY_;832if (flush === Z_TREES) { break inf_leave; }833/* falls through */834case COPY_:835state.mode = COPY;836/* falls through */837case COPY:838copy = state.length;839if (copy) {840if (copy > have) { copy = have; }841if (copy > left) { copy = left; }842if (copy === 0) { break inf_leave; }843//--- zmemcpy(put, next, copy); ---844utils.arraySet(output, input, next, copy, put);845//---//846have -= copy;847next += copy;848left -= copy;849put += copy;850state.length -= copy;851break;852}853//Tracev((stderr, "inflate: stored end\n"));854state.mode = TYPE;855break;856case TABLE:857//=== NEEDBITS(14); */858while (bits < 14) {859if (have === 0) { break inf_leave; }860have--;861hold += input[next++] << bits;862bits += 8;863}864//===//865state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;866//--- DROPBITS(5) ---//867hold >>>= 5;868bits -= 5;869//---//870state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;871//--- DROPBITS(5) ---//872hold >>>= 5;873bits -= 5;874//---//875state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;876//--- DROPBITS(4) ---//877hold >>>= 4;878bits -= 4;879//---//880//#ifndef PKZIP_BUG_WORKAROUND881if (state.nlen > 286 || state.ndist > 30) {882strm.msg = 'too many length or distance symbols';883state.mode = BAD;884break;885}886//#endif887//Tracev((stderr, "inflate: table sizes ok\n"));888state.have = 0;889state.mode = LENLENS;890/* falls through */891case LENLENS:892while (state.have < state.ncode) {893//=== NEEDBITS(3);894while (bits < 3) {895if (have === 0) { break inf_leave; }896have--;897hold += input[next++] << bits;898bits += 8;899}900//===//901state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);902//--- DROPBITS(3) ---//903hold >>>= 3;904bits -= 3;905//---//906}907while (state.have < 19) {908state.lens[order[state.have++]] = 0;909}910// We have separate tables & no pointers. 2 commented lines below not needed.911//state.next = state.codes;912//state.lencode = state.next;913// Switch to use dynamic table914state.lencode = state.lendyn;915state.lenbits = 7;916917opts = {bits: state.lenbits};918ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);919state.lenbits = opts.bits;920921if (ret) {922strm.msg = 'invalid code lengths set';923state.mode = BAD;924break;925}926//Tracev((stderr, "inflate: code lengths ok\n"));927state.have = 0;928state.mode = CODELENS;929/* falls through */930case CODELENS:931while (state.have < state.nlen + state.ndist) {932for (;;) {933here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/934here_bits = here >>> 24;935here_op = (here >>> 16) & 0xff;936here_val = here & 0xffff;937938if ((here_bits) <= bits) { break; }939//--- PULLBYTE() ---//940if (have === 0) { break inf_leave; }941have--;942hold += input[next++] << bits;943bits += 8;944//---//945}946if (here_val < 16) {947//--- DROPBITS(here.bits) ---//948hold >>>= here_bits;949bits -= here_bits;950//---//951state.lens[state.have++] = here_val;952}953else {954if (here_val === 16) {955//=== NEEDBITS(here.bits + 2);956n = here_bits + 2;957while (bits < n) {958if (have === 0) { break inf_leave; }959have--;960hold += input[next++] << bits;961bits += 8;962}963//===//964//--- DROPBITS(here.bits) ---//965hold >>>= here_bits;966bits -= here_bits;967//---//968if (state.have === 0) {969strm.msg = 'invalid bit length repeat';970state.mode = BAD;971break;972}973len = state.lens[state.have - 1];974copy = 3 + (hold & 0x03);//BITS(2);975//--- DROPBITS(2) ---//976hold >>>= 2;977bits -= 2;978//---//979}980else if (here_val === 17) {981//=== NEEDBITS(here.bits + 3);982n = here_bits + 3;983while (bits < n) {984if (have === 0) { break inf_leave; }985have--;986hold += input[next++] << bits;987bits += 8;988}989//===//990//--- DROPBITS(here.bits) ---//991hold >>>= here_bits;992bits -= here_bits;993//---//994len = 0;995copy = 3 + (hold & 0x07);//BITS(3);996//--- DROPBITS(3) ---//997hold >>>= 3;998bits -= 3;999//---//1000}1001else {1002//=== NEEDBITS(here.bits + 7);1003n = here_bits + 7;1004while (bits < n) {1005if (have === 0) { break inf_leave; }1006have--;1007hold += input[next++] << bits;1008bits += 8;1009}1010//===//1011//--- DROPBITS(here.bits) ---//1012hold >>>= here_bits;1013bits -= here_bits;1014//---//1015len = 0;1016copy = 11 + (hold & 0x7f);//BITS(7);1017//--- DROPBITS(7) ---//1018hold >>>= 7;1019bits -= 7;1020//---//1021}1022if (state.have + copy > state.nlen + state.ndist) {1023strm.msg = 'invalid bit length repeat';1024state.mode = BAD;1025break;1026}1027while (copy--) {1028state.lens[state.have++] = len;1029}1030}1031}10321033/* handle error breaks in while */1034if (state.mode === BAD) { break; }10351036/* check for end-of-block code (better have one) */1037if (state.lens[256] === 0) {1038strm.msg = 'invalid code -- missing end-of-block';1039state.mode = BAD;1040break;1041}10421043/* build code tables -- note: do not change the lenbits or distbits1044values here (9 and 6) without reading the comments in inftrees.h1045concerning the ENOUGH constants, which depend on those values */1046state.lenbits = 9;10471048opts = {bits: state.lenbits};1049ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);1050// We have separate tables & no pointers. 2 commented lines below not needed.1051// state.next_index = opts.table_index;1052state.lenbits = opts.bits;1053// state.lencode = state.next;10541055if (ret) {1056strm.msg = 'invalid literal/lengths set';1057state.mode = BAD;1058break;1059}10601061state.distbits = 6;1062//state.distcode.copy(state.codes);1063// Switch to use dynamic table1064state.distcode = state.distdyn;1065opts = {bits: state.distbits};1066ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);1067// We have separate tables & no pointers. 2 commented lines below not needed.1068// state.next_index = opts.table_index;1069state.distbits = opts.bits;1070// state.distcode = state.next;10711072if (ret) {1073strm.msg = 'invalid distances set';1074state.mode = BAD;1075break;1076}1077//Tracev((stderr, 'inflate: codes ok\n'));1078state.mode = LEN_;1079if (flush === Z_TREES) { break inf_leave; }1080/* falls through */1081case LEN_:1082state.mode = LEN;1083/* falls through */1084case LEN:1085if (have >= 6 && left >= 258) {1086//--- RESTORE() ---1087strm.next_out = put;1088strm.avail_out = left;1089strm.next_in = next;1090strm.avail_in = have;1091state.hold = hold;1092state.bits = bits;1093//---1094inflate_fast(strm, _out);1095//--- LOAD() ---1096put = strm.next_out;1097output = strm.output;1098left = strm.avail_out;1099next = strm.next_in;1100input = strm.input;1101have = strm.avail_in;1102hold = state.hold;1103bits = state.bits;1104//---11051106if (state.mode === TYPE) {1107state.back = -1;1108}1109break;1110}1111state.back = 0;1112for (;;) {1113here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/1114here_bits = here >>> 24;1115here_op = (here >>> 16) & 0xff;1116here_val = here & 0xffff;11171118if (here_bits <= bits) { break; }1119//--- PULLBYTE() ---//1120if (have === 0) { break inf_leave; }1121have--;1122hold += input[next++] << bits;1123bits += 8;1124//---//1125}1126if (here_op && (here_op & 0xf0) === 0) {1127last_bits = here_bits;1128last_op = here_op;1129last_val = here_val;1130for (;;) {1131here = state.lencode[last_val +1132((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];1133here_bits = here >>> 24;1134here_op = (here >>> 16) & 0xff;1135here_val = here & 0xffff;11361137if ((last_bits + here_bits) <= bits) { break; }1138//--- PULLBYTE() ---//1139if (have === 0) { break inf_leave; }1140have--;1141hold += input[next++] << bits;1142bits += 8;1143//---//1144}1145//--- DROPBITS(last.bits) ---//1146hold >>>= last_bits;1147bits -= last_bits;1148//---//1149state.back += last_bits;1150}1151//--- DROPBITS(here.bits) ---//1152hold >>>= here_bits;1153bits -= here_bits;1154//---//1155state.back += here_bits;1156state.length = here_val;1157if (here_op === 0) {1158//Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?1159// "inflate: literal '%c'\n" :1160// "inflate: literal 0x%02x\n", here.val));1161state.mode = LIT;1162break;1163}1164if (here_op & 32) {1165//Tracevv((stderr, "inflate: end of block\n"));1166state.back = -1;1167state.mode = TYPE;1168break;1169}1170if (here_op & 64) {1171strm.msg = 'invalid literal/length code';1172state.mode = BAD;1173break;1174}1175state.extra = here_op & 15;1176state.mode = LENEXT;1177/* falls through */1178case LENEXT:1179if (state.extra) {1180//=== NEEDBITS(state.extra);1181n = state.extra;1182while (bits < n) {1183if (have === 0) { break inf_leave; }1184have--;1185hold += input[next++] << bits;1186bits += 8;1187}1188//===//1189state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;1190//--- DROPBITS(state.extra) ---//1191hold >>>= state.extra;1192bits -= state.extra;1193//---//1194state.back += state.extra;1195}1196//Tracevv((stderr, "inflate: length %u\n", state.length));1197state.was = state.length;1198state.mode = DIST;1199/* falls through */1200case DIST:1201for (;;) {1202here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/1203here_bits = here >>> 24;1204here_op = (here >>> 16) & 0xff;1205here_val = here & 0xffff;12061207if ((here_bits) <= bits) { break; }1208//--- PULLBYTE() ---//1209if (have === 0) { break inf_leave; }1210have--;1211hold += input[next++] << bits;1212bits += 8;1213//---//1214}1215if ((here_op & 0xf0) === 0) {1216last_bits = here_bits;1217last_op = here_op;1218last_val = here_val;1219for (;;) {1220here = state.distcode[last_val +1221((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];1222here_bits = here >>> 24;1223here_op = (here >>> 16) & 0xff;1224here_val = here & 0xffff;12251226if ((last_bits + here_bits) <= bits) { break; }1227//--- PULLBYTE() ---//1228if (have === 0) { break inf_leave; }1229have--;1230hold += input[next++] << bits;1231bits += 8;1232//---//1233}1234//--- DROPBITS(last.bits) ---//1235hold >>>= last_bits;1236bits -= last_bits;1237//---//1238state.back += last_bits;1239}1240//--- DROPBITS(here.bits) ---//1241hold >>>= here_bits;1242bits -= here_bits;1243//---//1244state.back += here_bits;1245if (here_op & 64) {1246strm.msg = 'invalid distance code';1247state.mode = BAD;1248break;1249}1250state.offset = here_val;1251state.extra = (here_op) & 15;1252state.mode = DISTEXT;1253/* falls through */1254case DISTEXT:1255if (state.extra) {1256//=== NEEDBITS(state.extra);1257n = state.extra;1258while (bits < n) {1259if (have === 0) { break inf_leave; }1260have--;1261hold += input[next++] << bits;1262bits += 8;1263}1264//===//1265state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;1266//--- DROPBITS(state.extra) ---//1267hold >>>= state.extra;1268bits -= state.extra;1269//---//1270state.back += state.extra;1271}1272//#ifdef INFLATE_STRICT1273if (state.offset > state.dmax) {1274strm.msg = 'invalid distance too far back';1275state.mode = BAD;1276break;1277}1278//#endif1279//Tracevv((stderr, "inflate: distance %u\n", state.offset));1280state.mode = MATCH;1281/* falls through */1282case MATCH:1283if (left === 0) { break inf_leave; }1284copy = _out - left;1285if (state.offset > copy) { /* copy from window */1286copy = state.offset - copy;1287if (copy > state.whave) {1288if (state.sane) {1289strm.msg = 'invalid distance too far back';1290state.mode = BAD;1291break;1292}1293// (!) This block is disabled in zlib defailts,1294// don't enable it for binary compatibility1295//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR1296// Trace((stderr, "inflate.c too far\n"));1297// copy -= state.whave;1298// if (copy > state.length) { copy = state.length; }1299// if (copy > left) { copy = left; }1300// left -= copy;1301// state.length -= copy;1302// do {1303// output[put++] = 0;1304// } while (--copy);1305// if (state.length === 0) { state.mode = LEN; }1306// break;1307//#endif1308}1309if (copy > state.wnext) {1310copy -= state.wnext;1311from = state.wsize - copy;1312}1313else {1314from = state.wnext - copy;1315}1316if (copy > state.length) { copy = state.length; }1317from_source = state.window;1318}1319else { /* copy from output */1320from_source = output;1321from = put - state.offset;1322copy = state.length;1323}1324if (copy > left) { copy = left; }1325left -= copy;1326state.length -= copy;1327do {1328output[put++] = from_source[from++];1329} while (--copy);1330if (state.length === 0) { state.mode = LEN; }1331break;1332case LIT:1333if (left === 0) { break inf_leave; }1334output[put++] = state.length;1335left--;1336state.mode = LEN;1337break;1338case CHECK:1339if (state.wrap) {1340//=== NEEDBITS(32);1341while (bits < 32) {1342if (have === 0) { break inf_leave; }1343have--;1344// Use '|' insdead of '+' to make sure that result is signed1345hold |= input[next++] << bits;1346bits += 8;1347}1348//===//1349_out -= left;1350strm.total_out += _out;1351state.total += _out;1352if (_out) {1353strm.adler = state.check =1354/*UPDATE(state.check, put - _out, _out);*/1355(state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));13561357}1358_out = left;1359// NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too1360if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {1361strm.msg = 'incorrect data check';1362state.mode = BAD;1363break;1364}1365//=== INITBITS();1366hold = 0;1367bits = 0;1368//===//1369//Tracev((stderr, "inflate: check matches trailer\n"));1370}1371state.mode = LENGTH;1372/* falls through */1373case LENGTH:1374if (state.wrap && state.flags) {1375//=== NEEDBITS(32);1376while (bits < 32) {1377if (have === 0) { break inf_leave; }1378have--;1379hold += input[next++] << bits;1380bits += 8;1381}1382//===//1383if (hold !== (state.total & 0xffffffff)) {1384strm.msg = 'incorrect length check';1385state.mode = BAD;1386break;1387}1388//=== INITBITS();1389hold = 0;1390bits = 0;1391//===//1392//Tracev((stderr, "inflate: length matches trailer\n"));1393}1394state.mode = DONE;1395/* falls through */1396case DONE:1397ret = Z_STREAM_END;1398break inf_leave;1399case BAD:1400ret = Z_DATA_ERROR;1401break inf_leave;1402case MEM:1403return Z_MEM_ERROR;1404case SYNC:1405/* falls through */1406default:1407return Z_STREAM_ERROR;1408}1409}14101411// inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"14121413/*1414Return from inflate(), updating the total counts and the check value.1415If there was no progress during the inflate() call, return a buffer1416error. Call updatewindow() to create and/or update the window state.1417Note: a memory error from inflate() is non-recoverable.1418*/14191420//--- RESTORE() ---1421strm.next_out = put;1422strm.avail_out = left;1423strm.next_in = next;1424strm.avail_in = have;1425state.hold = hold;1426state.bits = bits;1427//---14281429if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&1430(state.mode < CHECK || flush !== Z_FINISH))) {1431if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {1432state.mode = MEM;1433return Z_MEM_ERROR;1434}1435}1436_in -= strm.avail_in;1437_out -= strm.avail_out;1438strm.total_in += _in;1439strm.total_out += _out;1440state.total += _out;1441if (state.wrap && _out) {1442strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/1443(state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));1444}1445strm.data_type = state.bits + (state.last ? 64 : 0) +1446(state.mode === TYPE ? 128 : 0) +1447(state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);1448if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {1449ret = Z_BUF_ERROR;1450}1451return ret;1452}14531454function inflateEnd(strm) {14551456if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {1457return Z_STREAM_ERROR;1458}14591460var state = strm.state;1461if (state.window) {1462state.window = null;1463}1464strm.state = null;1465return Z_OK;1466}14671468function inflateGetHeader(strm, head) {1469var state;14701471/* check state */1472if (!strm || !strm.state) { return Z_STREAM_ERROR; }1473state = strm.state;1474if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }14751476/* save header structure */1477state.head = head;1478head.done = false;1479return Z_OK;1480}148114821483exports.inflateReset = inflateReset;1484exports.inflateReset2 = inflateReset2;1485exports.inflateResetKeep = inflateResetKeep;1486exports.inflateInit = inflateInit;1487exports.inflateInit2 = inflateInit2;1488exports.inflate = inflate;1489exports.inflateEnd = inflateEnd;1490exports.inflateGetHeader = inflateGetHeader;1491exports.inflateInfo = 'pako inflate (from Nodeca project)';14921493/* Not implemented1494exports.inflateCopy = inflateCopy;1495exports.inflateGetDictionary = inflateGetDictionary;1496exports.inflateMark = inflateMark;1497exports.inflatePrime = inflatePrime;1498exports.inflateSetDictionary = inflateSetDictionary;1499exports.inflateSync = inflateSync;1500exports.inflateSyncPoint = inflateSyncPoint;1501exports.inflateUndermine = inflateUndermine;1502*/15031504