@zip.js/zip.js 2.11.4 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/deno.json +1 -1
  2. package/dist/zip-core-external.js +549 -139
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +559 -136
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +615 -260
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +628 -257
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +615 -260
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +630 -259
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +631 -260
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +561 -138
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +561 -138
  19. package/dist/zip-native.min.js +1 -1
  20. package/dist/zip-web-worker-native.js +1 -1
  21. package/dist/zip-web-worker.js +1 -1
  22. package/dist/zip.js +562 -139
  23. package/dist/zip.min.js +1 -1
  24. package/index-native.cjs +630 -259
  25. package/index-native.min.js +1 -1
  26. package/index.cjs +631 -260
  27. package/index.d.cts +474 -59
  28. package/index.d.ts +474 -59
  29. package/index.min.js +1 -1
  30. package/lib/core/codec-worker-web.js +72 -22
  31. package/lib/core/codec-worker.js +18 -5
  32. package/lib/core/configuration.js +20 -5
  33. package/lib/core/constants.js +2 -0
  34. package/lib/core/io.js +13 -5
  35. package/lib/core/options.js +16 -0
  36. package/lib/core/streams/codec-stream.js +6 -0
  37. package/lib/core/util/error.js +35 -0
  38. package/lib/core/util/warnings.js +42 -0
  39. package/lib/core/version.js +1 -1
  40. package/lib/core/web-worker-base.js +46 -9
  41. package/lib/core/web-worker-inline-native.js +1 -1
  42. package/lib/core/web-worker-inline-wasm.js +1 -1
  43. package/lib/core/zip-entry.js +49 -1
  44. package/lib/core/zip-fs.js +45 -133
  45. package/lib/core/zip-reader.js +115 -52
  46. package/lib/core/zip-writer.js +244 -57
  47. package/lib/zip-core-base.js +9 -3
  48. package/lib/zip-core-reader.js +2 -0
  49. package/lib/zip-core-writer.js +6 -1
  50. package/lib/zip-module-wasm-base.js +2 -2
  51. package/package.json +5 -3
  52. package/worker-message-property-names.js +1 -1
package/dist/zip.js CHANGED
@@ -134,6 +134,7 @@
134
134
  const BOOLEAN_TYPE = "boolean";
135
135
 
136
136
  const EMPTY_UINT8_ARRAY = new Uint8Array();
137
+ const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
137
138
 
138
139
  /*
139
140
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -178,6 +179,7 @@
178
179
  const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
179
180
  const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
180
181
  const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
182
+ const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
181
183
  const OPTION_CHECK_SIGNATURE = "checkSignature";
182
184
  const OPTION_CHECK_CRC32 = "checkCrc32";
183
185
  const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
@@ -208,15 +210,18 @@
208
210
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
209
211
  const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
210
212
  const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
213
+ const OPTION_ENTRY = "entry";
211
214
  const TEXT_TYPE_FILENAME = "filename";
212
215
  const TEXT_TYPE_COMMENT = "comment";
213
216
  const STRICTNESS_STRICT = "strict";
214
217
  const STRICTNESS_BALANCED = "balanced";
215
218
  const STRICTNESS_TOLERANT = "tolerant";
219
+ const PASS_THROUGH_COMPRESSED = "compressed";
216
220
 
217
221
  const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
218
222
  const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
219
223
  const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
224
+ const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
220
225
  const ERR_ABORTED = "The operation was aborted";
221
226
  const ABORT_ERROR_NAME = "AbortError";
222
227
 
@@ -246,6 +251,13 @@
246
251
  }
247
252
  }
248
253
 
254
+ function checkPassThroughOption(passThrough) {
255
+ if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
256
+ throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
257
+ }
258
+ return passThrough;
259
+ }
260
+
249
261
  function checkInteger(value, maxValue, errorMessage) {
250
262
  if (!Number.isInteger(value) || value < 0 || value > maxValue) {
251
263
  throw new Error(errorMessage);
@@ -295,6 +307,8 @@
295
307
  const MINIMUM_CHUNK_SIZE = 64;
296
308
  const MINIMUM_PROPERTY_VALUE = 1;
297
309
  const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
310
+ const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
311
+ const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
298
312
  let maxWorkers = 2;
299
313
  try {
300
314
  if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
@@ -319,9 +333,9 @@
319
333
  };
320
334
 
321
335
  const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
336
+ const PROPERTY_NAME_BASE_URI = "baseURI";
322
337
 
323
- const STRING_PROPERTY_NAMES = [
324
- "baseURI",
338
+ const URI_PROPERTY_NAMES = [
325
339
  "wasmURI",
326
340
  "workerURI"
327
341
  ];
@@ -345,7 +359,8 @@
345
359
  "DecompressionStreamFallback"
346
360
  ];
347
361
  const CONFIGURABLE_PROPERTY_NAMES = [
348
- ...STRING_PROPERTY_NAMES,
362
+ PROPERTY_NAME_BASE_URI,
363
+ ...URI_PROPERTY_NAMES,
349
364
  ...BOOLEAN_PROPERTY_NAMES,
350
365
  ...NUMBER_PROPERTY_NAMES,
351
366
  ...FUNCTION_PROPERTY_NAMES
@@ -389,6 +404,14 @@
389
404
  }
390
405
  } else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
391
406
  checkFunctionOption(propertyValue);
407
+ } else if (propertyName == PROPERTY_NAME_BASE_URI) {
408
+ if (propertyValue && typeof propertyValue != STRING_TYPE) {
409
+ throw new Error(ERR_INVALID_BASE_URI);
410
+ }
411
+ } else if (URI_PROPERTY_NAMES.includes(propertyName)) {
412
+ if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
413
+ throw new Error(ERR_INVALID_URI);
414
+ }
392
415
  }
393
416
  return propertyValue;
394
417
  }
@@ -422,7 +445,7 @@
422
445
  Object.assign(config, DEFAULT_CONFIGURATION);
423
446
  }
424
447
 
425
- const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let s=0;if(e>=8&&t.buffer){const r=new u(t.buffer,t.byteOffset,e),o=e-8;for(;s<=o;s+=8){const t=n^r.getInt32(s,!0),e=r.getInt32(s+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;s<e;s++)n=n>>>8^I[255&(n^t[s])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function W(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function _(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],s=T.l(e);return 32===s?t.concat(n):T.h(n,s,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+T.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,s.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=T.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,n,e,s){for(void 0===s&&(s=[]);n>=32;n-=32)s.push(e),e=0;if(0===n)return s.concat(t);for(let r=0;r<t.length;r++)s.push(e|t[r]>>>n),e=t[r]<<32-n;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(n+o&31,n+o>32?e:s.pop(),1)),s}},V={bytes:{v(t){const n=T.bitLength(t)/8,e=new o(n);let s;for(let r=0;r<n;r++)3&r||(s=t[r/4]),e[r]=s>>>24,s<<=8;return e},C(t){const n=[];let e,s=0;for(e=0;e<t.length;e++)s=s<<8|t[e],3&~e||(n.push(s),s=0);return 3&e&&n.push(T.S(8*(3&e),s)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=V.D.C(t));const e=n.P=T.concat(n.P,t),s=n.B,o=n.B=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+s-(n.blockSize+s&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=T.concat(n,[T.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(s.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,s){return t<=19?n&e|~n&s:t<=39?n^e^s:t<=59?n&e|n&s|e&s:t<=79?n^e^s:void 0}W(t,n){return n<<t|n>>>32-t}F(n){const e=this,r=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=r[0],i=r[1],a=r[2],f=r[3],u=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.W(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[s.floor(t/20)]|0;u=f,f=a,a=e.W(30,i),i=c,c=n}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+u|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,n,e,s){if(e=e||1e4,s<0||e<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=T;for(n=V.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const n=this,e=n.V=K,s=[[],[]];n.K=[new e,new e];const r=n.K[0].blockSize/32;t.length>r&&(t=(new e).update(t).R());for(let n=0;n<r;n++)s[0][n]=909522486^t[n],s[1][n]=1549556828^t[n];n.K[0].update(s[0]),n.K[1].update(s[1]),n.L=new e(n.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,n=t.L.R(),e=new t.V(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="zipjs-abort-check-password";function H(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,st=V.bytes,rt=class{constructor(t){const n=this;n.j=[[[],[],[],[],[]],[[],[],[],[],[]]],n.j[0][0][0]||n.H();const e=n.j[0][4],s=n.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:s[0][e[n>>>24]]^s[1][e[n>>16&255]]^s[2][e[n>>8&255]]^s[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],n=this.j[1],e=t[4],s=n[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,s[o]=u,f=r[a=r[i=r[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*r[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new r("invalid aes block size");const e=this.A[n],s=e.length/4-2,o=[0,0,0,0],c=this.j[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,s=255&t;255===n?(n=0,255===e?(e=0,255===s?s=0:++s):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let s;if(!(s=n.length))return[];const r=T.bitLength(n);for(let r=0;r<s;r+=4){this.$(e);const s=t.encrypt(e);n[r]^=s[0],n[r+1]^=s[1],n[r+2]^=s[2],n[r+3]^=s[3]}return T.m(n,r)}},ct=E._;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,s){const o=await ht(t,n,e,dt(s,0,X[n])),c=dt(s,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),s?n.error(new r(j)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:s,ready:o}=this;if(e&&n){await o;const i=dt(s,0,s.length-Z),a=dt(s,s.length-Z);let f=z;if(i.length){const t=mt(st,i);e.update(t);const s=n.update(t);f=yt(st,s)}const u=dt(yt(st,e.digest()),0,Z);let l=s.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new r("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:s,strength:r,nt:c,ready:i}=e;let a=z;s?(a=await async function(t,n,e){const s=H(new o(X[n]));return W(s,await ht(t,n,e,s))}(e,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:s,ready:r}=this;if(e&&n){await r;let o=z;if(s.length){const t=n.update(mt(st,s));e.update(t),o=yt(st,t)}const c=yt(st,e.digest()).slice(0,Z);t.enqueue(W(o,c))}}})}}function lt(t,e,s,r){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,s),strength:r-1,ot:z})}function wt(t,n,e,s,r,c){const{et:i,st:a,ot:f}=t;f.length&&(n=W(f,n));const u=n.length-r;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,s+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(st,dt(n,l,l+N));c&&a.update(t);const r=i.update(t);c||a.update(r),e.set(yt(st,r),l+s)}return t.ot=dt(n,l),e}async function ht(e,s,r,c){e.password=null;const i=await async function(t,n,e,s,r){if(!it)return E.importKey(n);try{return await nt.importKey("raw",n,e,!1,r)}catch{return it=!1,E.importKey(n)}}(0,r,G,0,Q),a=await async function(t,n,e){if(!at)return E.T(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,E.T(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),u=mt(st,dt(f,0,Y[s])),l=mt(st,dt(f,Y[s],2*Y[s])),w=dt(f,2*Y[s]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new rt(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:s}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new r(O);t=t.subarray(12)}s?n.error(new r(j)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let s,r;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,s=new o(t.length+n.length),s.set(kt(e,n),0),r=12}else s=new o(t.length),r=0;s.set(kt(e,t),r),n.enqueue(s)}})}}function vt(t,e,s,r){n.assign(t,{password:e,rawPassword:s,passwordVerification:r}),function(t,e,s){const r=[305419896,591751049,878082192];if(n.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let n=0;n<s.length;n++)zt(t,s[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,s)}function bt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,e[s]);return e}function kt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,n[s]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const r=~t.it.get();e=At(s.imul(At(e+It(r)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[r,e,o]}function Ct(t){const n=2|t.keys[2];return It(s.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:s}=await n.read();s?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&r&&!l&&!v&&(!o||i)&&Boolean(c&&s);if(o&&!i||!a||b||(y=new U,g=Lt(g,y)),r)if(v)g=Ot(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=Ot(g,new s(Ft)),g=Lt(g,S);else try{g=Et(g,c,{level:f,chunkSize:n},s,e)}catch(t){let n;try{n=new s(Ft)}catch{throw t}g=Ot(g,n),g=Lt(g,new Wt)}o&&(i?g=Lt(g,new gt(t)):(m=new ut(t),g=Lt(g,m))),Vt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,r){if(n){const e=s.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=W(e,t));const c=o-8,i=s.min(c,e.length);r.enqueue(W(e.subarray(0,i),t.subarray(0,c-i))),e=W(e.subarray(i),t.subarray(c-i))},flush(){const n=_(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class _t extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Lt(C,new St(t)):(z=new ft(t),C=Lt(C,z))),w){const t=m&&Pt(m);if(t)C=Ot(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Et(C,h,{chunkSize:n,deflate64:p},s,e)}catch(t){if(p||b===v)throw t;let n;try{n=new s(Ft)}catch{throw t}C=function(t,n,e){const s=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),r=_(n);r.setUint32(0,s.get(),!0),r.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){s.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,n),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new r("Invalid compressed data");throw n.cause=t,n}const{value:s,done:o}=e;o?t.close():t.enqueue(s)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Lt(C,k)),Vt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r("Invalid CRC32")}})}}const Tt=new f;function Vt(t,e,s){e=Lt(e,new d({flush:s})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new r("Compression method not supported");return new t(n,e)}function Et(t,n,e,s,r){const o=n&&s?s:r||s,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!r||o==r)throw t;i=new r(c,e)}return Ot(t,i)}function Lt(t,n){return xt(t).pipeThrough(n)}function Ot(t,n){const e=n.writable.getWriter(),s=t.getReader();return async function(){try{for(;;){await e.ready;const t=await s.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(s,t)}}(),n.readable}const jt="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=_t),s.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(s,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),s.outputSize+=n.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;n.assign(s,{crc32:t,inputSize:i})}});n.defineProperty(s,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const n=[];let s=0;function r(){const e=new o(t);let r=0;for(;r<t;){const s=n[0],o=t-r;s.length<=o?(e.set(s,r),r+=s.length,n.shift()):(e.set(s.subarray(0,o),r),n[0]=s.subarray(o),r+=o)}return s-=t,e}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(e,o){for(n.push(e),s+=e.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(function(t,n){const e=new o(n);let s=0;for(const n of t)e.set(n,s),s+=n.length;return e}(n,s))}})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}const Qt=new f,Xt=new f;let Yt,Zt=0;async function $t(t){let n,o;try{const{options:c,config:i}=t;if(c.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:s}=n;if(typeof e!=k&&typeof s!=k)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:s})}(t,await(import(n)))}(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=Tt.get(t);e||(e=new f,Tt.set(t,e));let s=e.get(n);if(s===v){try{new t(n),s=!0}catch{s=!1}e.set(n,s)}return s}(c.codecType.startsWith(Nt)?i.CompressionStream:i.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},u=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Qt.set(Zt,t));tn({type:"pull",messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER;const{value:s,done:r}=await n;t.enqueue(s),r&&t.close()}},a);o=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const s=new l(t=>n=t);Xt.set(Zt,n),tn({type:jt,value:t,messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER,await s}},a),n=new qt(c,i),Yt=new AbortController;const{signal:w}=Yt;await u.pipeThrough(n).pipeThrough(new Gt(function(t){return r="string"==typeof(n=r=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(r)&&r>=1?s.max(r,64):65536;var n,r}(i))).pipeTo(o,{signal:w,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=n;tn({type:Ht,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=n?n.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}nn(t)}}function tn(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function nn(t=new r("Unknown error")){const{message:n,stack:e,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:n,stack:e,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:s,done:r}=t;try{if("start"==n&&$t(t),n==jt){const t=Qt.get(e);Qt.delete(e),t({value:s||new o,done:r})}if("ack"==n){const t=Xt.get(e);Xt.delete(e),t()}n==Ht&&Yt.abort()}catch(t){nn(t)}}),p({type:"ready"});const en="deflate",sn="deflate-raw",rn="deflate64-raw",on="gzip";let cn,an,fn,un,ln;function wn(t,n,e={}){if(!cn){const t=new r("WASM module not loaded");throw t.cause=ln,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=an(i),this.in=an(a),this.inBufferSize=a,!this.ut||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=cn.deflate_process,this.ht=cn.deflate_last_consumed,this.yt=cn.deflate_end,this.St=cn.deflate_new(),e=n===on?cn.deflate_init_gzip(this.St,c):n===sn?cn.deflate_init_raw(this.St,c):cn.deflate_init(this.St,c)):n===rn?(this.wt=cn.inflate9_process,this.ht=cn.inflate9_last_consumed,this.yt=cn.inflate9_end,this.St=cn.inflate9_new(),e=cn.inflate9_init_raw(this.St)):(this.wt=cn.inflate_process,this.ht=cn.inflate_last_consumed,this.yt=cn.inflate_end,this.St=cn.inflate_new(),e=n===sn?cn.inflate_init_raw(this.St):n===on?cn.inflate_init_gzip(this.St):cn.inflate_init(this.St)),0!==e)throw new r("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(un.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=s.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&fn&&(fn(this.in),this.in=0),this.in=an(t),this.inBufferSize=t,!this.in))throw new r("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new r("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(un.buffer),e=this.wt,s=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,s,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new r("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(s,s+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new r("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&fn&&fn(t.in),t.in=0,t.ut&&fn&&fn(t.ut),t.ut=0,n}}class hn{constructor(t=en,n){return wn(!0,t,n)}}class pn{constructor(t=en,n){return wn(!1,t,n)}}hn.gt=!0,pn.gt=!0,hn.vt=[en,sn,on],pn.vt=[en,sn,on,rn];let dn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:hn,DecompressionStreamFallback:pn,init:t=>async function(t,{baseURI:n}){if(!dn)try{await async function(t,n){let e,s;try{try{s=new URL(t,n)}catch{}const r=await fetch(s);e=await r.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),s=e.length,r=new o(s);for(let t=0;t<s;++t)r[t]=e.charCodeAt(t);return r.buffer}(t)}!function(t){if(cn=t,({malloc:an,free:fn,memory:un}=cn),"function"!=typeof an||"function"!=typeof fn||!un)throw cn=an=fn=un=null,new r("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),dn=!0}catch(t){throw function(t){ln=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
448
+ const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let r='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:r,Error:s,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let r=0;if(e>=8&&t.buffer){const s=new u(t.buffer,t.byteOffset,e),o=e-8;for(;r<=o;r+=8){const t=n^s.getInt32(r,!0),e=s.getInt32(r+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;r<e;r++)n=n>>>8^I[255&(n^t[r])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function V(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function W(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const _={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],r=_.l(e);return 32===r?t.concat(n):_.h(n,r,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+_.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,r.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=_.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>r.round(t/1099511627776)||32,h(t,n,e,r){for(void 0===r&&(r=[]);n>=32;n-=32)r.push(e),e=0;if(0===n)return r.concat(t);for(let s=0;s<t.length;s++)r.push(e|t[s]>>>n),e=t[s]<<32-n;const s=t.length?t[t.length-1]:0,o=_.l(s);return r.push(_.S(n+o&31,n+o>32?e:r.pop(),1)),r}},T={bytes:{v(t){const n=_.bitLength(t)/8,e=new o(n);let r;for(let s=0;s<n;s++)3&s||(r=t[s/4]),e[s]=r>>>24,r<<=8;return e},C(t){const n=[];let e,r=0;for(e=0;e<t.length;e++)r=r<<8|t[e],3&~e||(n.push(r),r=0);return 3&e&&n.push(_.S(8*(3&e),r)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=T.D.C(t));const e=n.P=_.concat(n.P,t),r=n.B,o=n.B=r+_.bitLength(t);if(o>9007199254740991)throw new s("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+r-(n.blockSize+r&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=_.concat(n,[_.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(r.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,r){return t<=19?n&e|~n&r:t<=39?n^e^r:t<=59?n&e|n&r|e&r:t<=79?n^e^r:void 0}V(t,n){return n<<t|n>>>32-t}F(n){const e=this,s=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=s[0],i=s[1],a=s[2],f=s[3],u=s[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.V(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.V(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[r.floor(t/20)]|0;u=f,f=a,a=e.V(30,i),i=c,c=n}s[0]=s[0]+c|0,s[1]=s[1]+i|0,s[2]=s[2]+a|0,s[3]=s[3]+f|0,s[4]=s[4]+u|0}},j={importKey:t=>new j.W(T.bytes.C(t)),_(t,n,e,r){if(e=e||1e4,r<0||e<0)throw new s("invalid params to pbkdf2");const o=1+(r>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=_;for(n=T.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,r/8)},W:class{constructor(t){const n=this,e=n.T=K,r=[[],[]];n.K=[new e,new e];const s=n.K[0].blockSize/32;t.length>s&&(t=(new e).update(t).R());for(let n=0;n<s;n++)r[0][n]=909522486^t[n],r[1][n]=1549556828^t[n];n.K[0].update(r[0]),n.K[1].update(r[1]),n.j=new e(n.K[0])}reset(){const t=this;t.j=new t.T(t.K[0]),t.L=!1}update(t){this.L=!0,this.j.update(t)}digest(){const t=this,n=t.j.R(),e=new t.T(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.L)throw new s("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},E=typeof h!=b&&typeof h.getRandomValues==k,L="Invalid password",O="zipjs-abort-check-password";function H(t){if(E)return h.getRandomValues(t);throw new s("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,rt=T.bytes,st=class{constructor(t){const n=this;n.O=[[[],[],[],[],[]],[[],[],[],[],[]]],n.O[0][0][0]||n.H();const e=n.O[0][4],r=n.O[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new s("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:r[0][e[n>>>24]]^r[1][e[n>>16&255]]^r[2][e[n>>8&255]]^r[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.O[0],n=this.O[1],e=t[4],r=n[4],s=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(s[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,r[o]=u,f=s[a=s[i=s[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*s[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new s("invalid aes block size");const e=this.A[n],r=e.length/4-2,o=[0,0,0,0],c=this.O[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<r;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,r=255&t;255===n?(n=0,255===e?(e=0,255===r?r=0:++r):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=r}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let r;if(!(r=n.length))return[];const s=_.bitLength(n);for(let s=0;s<r;s+=4){this.$(e);const r=t.encrypt(e);n[s]^=r[0],n[s+1]^=r[1],n[s+2]^=r[2],n[s+3]^=r[3]}return _.m(n,s)}},ct=j.W;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:r,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,r){const o=await ht(t,n,e,dt(r,0,X[n])),c=dt(r,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new s(L)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),r?n.error(new s(O)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:r,ready:o}=this;if(e&&n){await o;const i=dt(r,0,r.length-Z),a=dt(r,r.length-Z);let f=z;if(i.length){const t=mt(rt,i);e.update(t);const r=n.update(t);f=yt(rt,r)}const u=dt(yt(rt,e.digest()),0,Z);let l=r.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new s("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:r,strength:s,nt:c,ready:i}=e;let a=z;r?(a=await async function(t,n,e){const r=H(new o(X[n]));return V(r,await ht(t,n,e,r))}(e,s,r),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:r,ready:s}=this;if(e&&n){await s;let o=z;if(r.length){const t=n.update(mt(rt,r));e.update(t),o=yt(rt,t)}const c=yt(rt,e.digest()).slice(0,Z);t.enqueue(V(o,c))}}})}}function lt(t,e,r,s){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,r),strength:s-1,ot:z})}function wt(t,n,e,r,s,c){const{et:i,st:a,ot:f}=t;f.length&&(n=V(f,n));const u=n.length-s;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,r+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(rt,dt(n,l,l+N));c&&a.update(t);const s=i.update(t);c||a.update(s),e.set(yt(rt,s),l+r)}return t.ot=dt(n,l),e}async function ht(e,r,s,c){e.password=null;const i=await async function(t,n,e,r,s){if(!it)return j.importKey(n);try{return await nt.importKey("raw",n,e,!1,s)}catch{return it=!1,j.importKey(n)}}(0,s,G,0,Q),a=await async function(t,n,e){if(!at)return j._(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,j._(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[r]+2)),f=new o(a),u=mt(rt,dt(f,0,Y[r])),l=mt(rt,dt(f,Y[r],2*Y[r])),w=dt(f,2*Y[r]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new st(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:r}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new s(L);t=t.subarray(12)}r?n.error(new s(O)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let r,s;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,r=new o(t.length+n.length),r.set(kt(e,n),0),s=12}else r=new o(t.length),s=0;r.set(kt(e,t),s),n.enqueue(r)}})}}function vt(t,e,r,s){n.assign(t,{password:e,rawPassword:r,passwordVerification:s}),function(t,e,r){const s=[305419896,591751049,878082192];if(n.assign(t,{keys:s,it:new R(s[0]),ft:new R(s[2])}),r)for(let n=0;n<r.length;n++)zt(t,r[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,r)}function bt(t,n){const e=new o(n.length);for(let r=0;r<n.length;r++)e[r]=Ct(t)^n[r],zt(t,e[r]);return e}function kt(t,n){const e=new o(n.length);for(let r=0;r<n.length;r++)e[r]=Ct(t)^n[r],zt(t,n[r]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const s=~t.it.get();e=At(r.imul(At(e+It(s)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[s,e,o]}function Ct(t){const n=2|t.keys[2];return It(r.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:r}=await n.read();r?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:r}){super({});const{compressed:s,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&s&&!l&&!v&&(!o||i)&&Boolean(c&&r);if(o&&!i||!a||b||(y=new U,g=Et(g,y)),s)if(v)g=Lt(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Vt,g=Lt(g,new r(Ft)),g=Et(g,S);else try{g=jt(g,c,{level:f,chunkSize:n},r,e)}catch(t){let n;try{n=new r(Ft)}catch{throw t}g=Lt(g,n),g=Et(g,new Vt)}o&&(i?g=Et(g,new gt(t)):(m=new ut(t),g=Et(g,m))),Tt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Vt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,s){if(n){const e=r.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=V(e,t));const c=o-8,i=r.min(c,e.length);s.enqueue(V(e.subarray(0,i),t.subarray(0,c-i))),e=V(e.subarray(i),t.subarray(c-i))},flush(){const n=W(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class Wt extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:r}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Et(C,new St(t)):(z=new ft(t),C=Et(C,z))),w){const t=m&&Pt(m);if(t)C=Lt(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=jt(C,h,{chunkSize:n,deflate64:p},r,e)}catch(t){if(p||b===v)throw t;let n;try{n=new r(Ft)}catch{throw t}C=function(t,n,e){const r=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),s=W(n);s.setUint32(0,r.get(),!0),s.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){r.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Et(t,h),Et(t=Lt(t,n),p);function y(){m(),c=setTimeout(()=>a(new s(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new s("Invalid compressed data");throw n.cause=t,n}const{value:r,done:o}=e;o?t.close():t.enqueue(r)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Et(C,k)),Tt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new s("Invalid CRC32")}})}}const _t=new f;function Tt(t,e,r){e=Et(e,new d({flush:r})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new s("Compression method not supported");return new t(n,e)}function jt(t,n,e,r,s){const o=n&&r?r:s||r,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!s||o==s)throw t;i=new s(c,e)}return Lt(t,i)}function Et(t,n){return xt(t).pipeThrough(n)}function Lt(t,n){const e=n.writable.getWriter(),r=t.getReader();return async function(){try{for(;;){await e.ready;const t=await r.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(r,t)}}(),n.readable}const Ot="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const r=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=Wt),r.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(r,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),r.outputSize+=n.length,t.outputSize!==v&&r.outputSize>t.outputSize))throw new s(Bt)},flush(){const{crc32:t}=a;n.assign(r,{crc32:t,inputSize:i})}});n.defineProperty(r,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const r=[];let s=0,c=0;function i(){const n=new o(t);let e=0;for(;e<t;){const s=r[0],o=t-e;s.length<=o?(n.set(s,e),e+=s.length,r.shift()):(n.set(s.subarray(0,o),e),r[0]=s.subarray(o),e+=o)}return s-=t,n}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(n,e){for(r.push(n),s+=n.length;s>t;)c+=t,e.enqueue(i())},flush(t){s&&(c+=s,t.enqueue(function(t,n){const e=new o(n);let r=0;for(const n of t)e.set(n,r),r+=n.length;return e}(r,s)))}}),n.defineProperty(this,"outputSize",{get:()=>c})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}function Qt(t){return Boolean(t)&&"object"==typeof t}const Xt=new f,Yt=new f,Zt=function(){try{return structuredClone(new s)instanceof s}catch{return!1}}();let $t,tn=0;async function nn(t){let n,o,c;try{const{options:i,config:a}=t;if(i.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:r}=n;if(typeof e!=k&&typeof r!=k)throw new s("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:r})}(t,await(import(n)))}(i.format,i.codecURI)}catch(t){if(Qt(t))try{t.codecImportFailed=!0}catch{}throw t}if(a.CompressionStream=self.CompressionStream,a.DecompressionStream=self.DecompressionStream,i.compressed&&!i.format)if(i.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=_t.get(t);e||(e=new f,_t.set(t,e));let r=e.get(n);if(r===v){try{new t(n),r=!0}catch{r=!1}e.set(n,r)}return r}(i.codecType.startsWith(Nt)?a.CompressionStream:a.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{i.useCompressionStream=!0}!a.CompressionStreamFallback&&a.CompressionStreamZlib&&(a.CompressionStreamFallback=a.CompressionStreamZlib),!a.DecompressionStreamFallback&&a.DecompressionStreamZlib&&(a.DecompressionStreamFallback=a.DecompressionStreamZlib);const u={highWaterMark:1},w=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Xt.set(tn,t));en({type:"pull",messageId:tn}),tn=(tn+1)%e.MAX_SAFE_INTEGER;const{value:r,done:s}=await n;t.enqueue(r),s&&t.close()}},u);c=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const r=new l(t=>n=t);Yt.set(tn,n),en({type:Ot,value:t,messageId:tn}),tn=(tn+1)%e.MAX_SAFE_INTEGER,await r}},u),n=new qt(i,a),o=new Gt(function(t){return s="string"==typeof(n=s=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(s)&&s>=1?r.max(s,64):65536;var n,s}(a)),$t=new AbortController;const{signal:h}=$t;await w.pipeThrough(n).pipeThrough(o).pipeTo(c,{signal:h,preventClose:!0,preventAbort:!0}),await c.getWriter().close();const{crc32:p,inputSize:d,outputSize:S}=n;en({type:Ht,result:{crc32:p,inputSize:d,outputSize:S}})}catch(t){const n=o?o.outputSize:0;if(Qt(t))try{t.outputSize=n}catch{}if(c&&!c.locked)try{await c.getWriter().close()}catch{}rn(t,n)}}function en(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function rn(t,n){const{message:e,stack:r,code:o,name:c,outputSize:i,cause:a,codecImportFailed:f}=function(t=new s("Unknown error")){return Qt(t)?t:new s(String(t))}(t),u={message:e,stack:r,code:o,name:c,outputSize:i===v?n:i};if(a&&(u.cause={name:a.name,message:a.message}),f&&(u.codecImportFailed=!0),Zt)try{return void p({error:u,errorValue:{value:t}})}catch{}p({error:u})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:r,done:s}=t;try{if("start"==n&&nn(t),n==Ot){const t=Xt.get(e);Xt.delete(e),t({value:r||new o,done:s})}if("ack"==n){const t=Yt.get(e);Yt.delete(e),t()}n==Ht&&$t.abort()}catch(t){rn(t)}}),p({type:"ready"});const sn="deflate",on="deflate-raw",cn="deflate64-raw",an="gzip";let fn,un,ln,wn,hn;function pn(t,n,e={}){if(!fn){const t=new s("WASM module not loaded");throw t.cause=hn,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=un(i),this.in=un(a),this.inBufferSize=a,!this.ut||!this.in)throw new s("allocation failed");if(this.lt=new o(i),t?(this.wt=fn.deflate_process,this.ht=fn.deflate_last_consumed,this.yt=fn.deflate_end,this.St=fn.deflate_new(),e=n===an?fn.deflate_init_gzip(this.St,c):n===on?fn.deflate_init_raw(this.St,c):fn.deflate_init(this.St,c)):n===cn?(this.wt=fn.inflate9_process,this.ht=fn.inflate9_last_consumed,this.yt=fn.inflate9_end,this.St=fn.inflate9_new(),e=fn.inflate9_init_raw(this.St)):(this.wt=fn.inflate_process,this.ht=fn.inflate_last_consumed,this.yt=fn.inflate_end,this.St=fn.inflate_new(),e=n===on?fn.inflate_init_raw(this.St):n===an?fn.inflate_init_gzip(this.St):fn.inflate_init(this.St)),0!==e)throw new s("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(wn.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=r.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&ln&&(ln(this.in),this.in=0),this.in=un(t),this.inBufferSize=t,!this.in))throw new s("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new s("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(wn.buffer),e=this.wt,r=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,r,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new s("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(r,r+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new s("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&ln&&ln(t.in),t.in=0,t.ut&&ln&&ln(t.ut),t.ut=0,n}}class dn{constructor(t=sn,n){return pn(!0,t,n)}}class yn{constructor(t=sn,n){return pn(!1,t,n)}}dn.gt=!0,yn.gt=!0,dn.vt=[sn,on,an],yn.vt=[sn,on,an,cn];let mn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,r=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),r&&(t.DecompressionStreamFallback=r)}}({CompressionStreamFallback:dn,DecompressionStreamFallback:yn,init:t=>async function(t,{baseURI:n}){if(!mn)try{await async function(t,n){let e,r;try{try{r=new URL(t,n)}catch{}const s=await fetch(r);e=await s.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),r=e.length,s=new o(r);for(let t=0;t<r;++t)s[t]=e.charCodeAt(t);return s.buffer}(t)}!function(t){if(fn=t,({malloc:un,free:ln,memory:wn}=fn),"function"!=typeof un||"function"!=typeof ln||!wn)throw fn=un=ln=wn=null,new s("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),mn=!0}catch(t){throw function(t){hn=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const r=t.length;let s=0;for(;s+2<r;s+=3){const r=t[s]<<16|t[s+1]<<8|t[s+2];n+=e$1[r>>18&63]+e$1[r>>12&63]+e$1[r>>6&63]+e$1[63&r];}const o=r-s;if(1===o){const r=t[s]<<16;n+=e$1[r>>18&63]+e$1[r>>12&63]+"==";}else if(2===o){const r=t[s]<<16|t[s+1]<<8;n+=e$1[r>>18&63]+e$1[r>>12&63]+e$1[r>>6&63]+"=";}return n}(r)}});
426
449
 
427
450
  /*
428
451
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -468,6 +491,39 @@
468
491
  return new DataView(array.buffer, array.byteOffset, array.byteLength);
469
492
  }
470
493
 
494
+ /*
495
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
496
+
497
+ Redistribution and use in source and binary forms, with or without
498
+ modification, are permitted provided that the following conditions are met:
499
+
500
+ 1. Redistributions of source code must retain the above copyright notice,
501
+ this list of conditions and the following disclaimer.
502
+
503
+ 2. Redistributions in binary form must reproduce the above copyright
504
+ notice, this list of conditions and the following disclaimer in
505
+ the documentation and/or other materials provided with the distribution.
506
+
507
+ 3. The names of the authors may not be used to endorse or promote products
508
+ derived from this software without specific prior written permission.
509
+
510
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
511
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
512
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
513
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
514
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
515
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
516
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
517
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
518
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
519
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
520
+ */
521
+
522
+
523
+ function isErrorObject(error) {
524
+ return Boolean(error) && typeof error == "object";
525
+ }
526
+
471
527
  /*
472
528
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
473
529
 
@@ -2607,6 +2663,7 @@
2607
2663
  constructor(chunkSize) {
2608
2664
  const pendingChunks = [];
2609
2665
  let pendingLength = 0;
2666
+ let outputSize = 0;
2610
2667
  if (!Number.isFinite(chunkSize) || chunkSize < 1) {
2611
2668
  chunkSize = DEFAULT_CHUNK_SIZE;
2612
2669
  }
@@ -2615,15 +2672,20 @@
2615
2672
  pendingChunks.push(chunk);
2616
2673
  pendingLength += chunk.length;
2617
2674
  while (pendingLength > chunkSize) {
2675
+ outputSize += chunkSize;
2618
2676
  controller.enqueue(shiftChunk());
2619
2677
  }
2620
2678
  },
2621
2679
  flush(controller) {
2622
2680
  if (pendingLength) {
2681
+ outputSize += pendingLength;
2623
2682
  controller.enqueue(concatChunks(pendingChunks, pendingLength));
2624
2683
  }
2625
2684
  }
2626
2685
  });
2686
+ Object.defineProperty(this, "outputSize", {
2687
+ get: () => outputSize
2688
+ });
2627
2689
 
2628
2690
  function shiftChunk() {
2629
2691
  const result = new Uint8Array(chunkSize);
@@ -2733,7 +2795,9 @@
2733
2795
 
2734
2796
  class CodecWorker {
2735
2797
 
2736
- constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
2798
+ constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
2799
+ const { options, config, streamOptions, useWebWorkers, transferStreams, workerURI } = workerOptions;
2800
+ let { createWorker } = workerOptions;
2737
2801
  const { signal } = streamOptions;
2738
2802
  if (createWorkerFailed) {
2739
2803
  createWorker = UNDEFINED_VALUE;
@@ -2746,6 +2810,7 @@
2746
2810
  .pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
2747
2811
  writable,
2748
2812
  options: Object.assign({}, options),
2813
+ workerOptions,
2749
2814
  workerURI,
2750
2815
  createWorker,
2751
2816
  transferStreams,
@@ -2827,8 +2892,8 @@
2827
2892
  };
2828
2893
  }
2829
2894
 
2830
- async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
2831
- let codecStream;
2895
+ async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
2896
+ let codecStream, chunkStream;
2832
2897
  try {
2833
2898
  if (options.compressed && !options.format) {
2834
2899
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
@@ -2851,9 +2916,10 @@
2851
2916
  }
2852
2917
  }
2853
2918
  codecStream = new CodecStream(options, config);
2919
+ chunkStream = new ChunkStream(getChunkSize(config));
2854
2920
  await readable
2855
2921
  .pipeThrough(codecStream)
2856
- .pipeThrough(new ChunkStream(getChunkSize(config)))
2922
+ .pipeThrough(chunkStream)
2857
2923
  .pipeTo(writable, { preventClose: true, preventAbort: true });
2858
2924
  const {
2859
2925
  crc32,
@@ -2867,7 +2933,15 @@
2867
2933
  };
2868
2934
  } catch (error) {
2869
2935
  if (codecStream) {
2870
- error.outputSize = codecStream.outputSize;
2936
+ const outputSize = chunkStream ? chunkStream.outputSize : 0;
2937
+ workerOptions.outputSize = outputSize;
2938
+ if (isErrorObject(error)) {
2939
+ try {
2940
+ error.outputSize = outputSize;
2941
+ } catch {
2942
+ // ignored
2943
+ }
2944
+ }
2871
2945
  }
2872
2946
  throw error;
2873
2947
  } finally {
@@ -2976,11 +3050,23 @@
2976
3050
  let resolveResult, rejectResult;
2977
3051
  const result = new Promise((resolve, reject) => {
2978
3052
  resolveResult = resolve;
2979
- rejectResult = reject;
3053
+ rejectResult = error => {
3054
+ const { outputSize, workerOptions } = workerData;
3055
+ workerOptions.outputSize = outputSize;
3056
+ if (isErrorObject(error) && error.outputSize === UNDEFINED_VALUE) {
3057
+ try {
3058
+ error.outputSize = outputSize;
3059
+ } catch {
3060
+ // ignored
3061
+ }
3062
+ }
3063
+ reject(error);
3064
+ };
2980
3065
  });
2981
3066
  Object.assign(workerData, {
2982
3067
  reader: null,
2983
3068
  writer: null,
3069
+ outputSize: 0,
2984
3070
  resolveResult,
2985
3071
  rejectResult,
2986
3072
  result
@@ -3241,21 +3327,15 @@
3241
3327
  }
3242
3328
 
3243
3329
  async function onMessage({ data }, workerData) {
3244
- const { type, value, messageId, result, error } = data;
3330
+ const { type, value, messageId, result, error, errorValue } = data;
3245
3331
  const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
3246
3332
  const stale = () => workerData.generation != generation;
3247
3333
  try {
3248
3334
  if (error) {
3249
- const { message, stack, code, name, outputSize, cause, codecImportFailed } = error;
3250
- const responseError = new Error(message);
3251
- Object.assign(responseError, { stack, code, name, outputSize });
3252
- if (cause) {
3253
- responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
3254
- }
3255
- if (codecImportFailed) {
3256
- responseError.codecImportFailed = true;
3335
+ if (error.outputSize !== UNDEFINED_VALUE) {
3336
+ workerData.outputSize = error.outputSize;
3257
3337
  }
3258
- close(responseError);
3338
+ fail(getResponseError(error, errorValue));
3259
3339
  } else {
3260
3340
  if (type == MESSAGE_PULL) {
3261
3341
  const { value, done } = await reader.read();
@@ -3264,39 +3344,82 @@
3264
3344
  }
3265
3345
  }
3266
3346
  if (type == MESSAGE_DATA) {
3347
+ const chunk = new Uint8Array(value);
3267
3348
  await writer.ready;
3268
- await writer.write(new Uint8Array(value));
3349
+ await writer.write(chunk);
3350
+ workerData.outputSize += chunk.length;
3269
3351
  if (!stale()) {
3270
3352
  sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
3271
3353
  }
3272
3354
  }
3273
3355
  if (type == MESSAGE_CLOSE) {
3274
- close(null, result);
3356
+ succeed(result);
3275
3357
  }
3276
3358
  }
3277
3359
  } catch (error) {
3278
3360
  if (!stale()) {
3279
3361
  terminateWorker$1(workerData);
3280
- close(error);
3362
+ fail(error);
3281
3363
  }
3282
3364
  }
3283
3365
 
3284
- function close(error, result) {
3285
- if (stale()) {
3286
- return;
3287
- }
3288
- if (error) {
3366
+ function fail(error) {
3367
+ if (!stale()) {
3289
3368
  rejectResult(error);
3290
- } else {
3369
+ releaseWriter();
3370
+ if (!(isErrorObject(error) && error.codecImportFailed)) {
3371
+ onTaskFinished();
3372
+ }
3373
+ }
3374
+ }
3375
+
3376
+ function succeed(result) {
3377
+ if (!stale()) {
3291
3378
  resolveResult(result);
3379
+ releaseWriter();
3380
+ onTaskFinished();
3292
3381
  }
3382
+ }
3383
+
3384
+ function releaseWriter() {
3293
3385
  if (writer) {
3294
3386
  writer.releaseLock();
3295
3387
  }
3296
- if (!(error && error.codecImportFailed)) {
3297
- onTaskFinished();
3388
+ }
3389
+ }
3390
+
3391
+ function getResponseError(errorData, errorValue) {
3392
+ const { message, stack, code, name, outputSize, cause, codecImportFailed } = errorData;
3393
+ let responseError;
3394
+ if (errorValue) {
3395
+ responseError = errorValue.value;
3396
+ } else {
3397
+ responseError = Object.assign(new Error(message), { stack, code, name });
3398
+ if (cause) {
3399
+ responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
3400
+ }
3401
+ }
3402
+ if (isErrorObject(responseError)) {
3403
+ try {
3404
+ if (outputSize !== UNDEFINED_VALUE) {
3405
+ responseError.outputSize = outputSize;
3406
+ }
3407
+ if (codecImportFailed) {
3408
+ responseError.codecImportFailed = true;
3409
+ }
3410
+ if (errorValue) {
3411
+ if (responseError.name !== name) {
3412
+ responseError.name = name;
3413
+ }
3414
+ if (responseError.code !== code) {
3415
+ responseError.code = code;
3416
+ }
3417
+ }
3418
+ } catch {
3419
+ // ignored
3298
3420
  }
3299
3421
  }
3422
+ return responseError;
3300
3423
  }
3301
3424
 
3302
3425
  /*
@@ -3573,10 +3696,13 @@
3573
3696
 
3574
3697
 
3575
3698
  const ERR_HTTP_STATUS = "HTTP error ";
3699
+ const MIN_SUCCESS_HTTP_STATUS = 200;
3700
+ const MAX_SUCCESS_HTTP_STATUS = 299;
3576
3701
  const ERR_HTTP_RANGE = "HTTP Range not supported";
3577
3702
  const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
3578
3703
  const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
3579
3704
  const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
3705
+ const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
3580
3706
 
3581
3707
  const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
3582
3708
  const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
@@ -3768,6 +3894,7 @@
3768
3894
  const reader = this;
3769
3895
  const { sourceBlob, size } = reader;
3770
3896
  const { offset = 0, size: readSize = size - offset } = options || {};
3897
+ // deno-lint-ignore valid-typeof
3771
3898
  if (typeof sourceBlob.stream == FUNCTION_TYPE) {
3772
3899
  if (!offset && readSize >= size) {
3773
3900
  return toCompatibleReadable(sourceBlob.stream());
@@ -4154,7 +4281,7 @@
4154
4281
 
4155
4282
  async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
4156
4283
  const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
4157
- if (response.status < 400) {
4284
+ if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
4158
4285
  return response;
4159
4286
  } else {
4160
4287
  throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
@@ -4165,7 +4292,7 @@
4165
4292
  return new Promise((resolve, reject) => {
4166
4293
  const request = new XMLHttpRequest();
4167
4294
  request.addEventListener("load", () => {
4168
- if (request.status < 400) {
4295
+ if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
4169
4296
  const headers = [];
4170
4297
  request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
4171
4298
  const splitHeader = header.trim().split(/\s*:\s*/);
@@ -4469,8 +4596,10 @@
4469
4596
  writable: toCompatibleWritable(writer)
4470
4597
  };
4471
4598
  }
4472
- if (writer.size === UNDEFINED_VALUE) {
4473
- writer.size = 0;
4599
+ try {
4600
+ writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
4601
+ } catch {
4602
+ throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
4474
4603
  }
4475
4604
  return writer;
4476
4605
  }
@@ -4518,6 +4647,45 @@
4518
4647
  }
4519
4648
  }
4520
4649
 
4650
+ /*
4651
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
4652
+
4653
+ Redistribution and use in source and binary forms, with or without
4654
+ modification, are permitted provided that the following conditions are met:
4655
+
4656
+ 1. Redistributions of source code must retain the above copyright notice,
4657
+ this list of conditions and the following disclaimer.
4658
+
4659
+ 2. Redistributions in binary form must reproduce the above copyright
4660
+ notice, this list of conditions and the following disclaimer in
4661
+ the documentation and/or other materials provided with the distribution.
4662
+
4663
+ 3. The names of the authors may not be used to endorse or promote products
4664
+ derived from this software without specific prior written permission.
4665
+
4666
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4667
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4668
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4669
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4670
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4671
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4672
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4673
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4674
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4675
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4676
+ */
4677
+
4678
+
4679
+ function addWarning(warnings, reason, filename) {
4680
+ if (!warnings.some(warning => warning.reason == reason)) {
4681
+ const warning = { reason };
4682
+ if (filename !== UNDEFINED_VALUE) {
4683
+ warning.filename = filename;
4684
+ }
4685
+ warnings.push(warning);
4686
+ }
4687
+ }
4688
+
4521
4689
  /*
4522
4690
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4523
4691
 
@@ -4546,6 +4714,7 @@
4546
4714
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4547
4715
  */
4548
4716
 
4717
+
4549
4718
  const PROPERTY_NAME_FILENAME = "filename";
4550
4719
  const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
4551
4720
  const PROPERTY_NAME_COMMENT = "comment";
@@ -4670,6 +4839,38 @@
4670
4839
 
4671
4840
  }
4672
4841
 
4842
+ const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
4843
+ EXTRAFIELD_TYPE_ZIP64,
4844
+ EXTRAFIELD_TYPE_AES,
4845
+ EXTRAFIELD_TYPE_NTFS,
4846
+ EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
4847
+ EXTRAFIELD_TYPE_UNICODE_PATH,
4848
+ EXTRAFIELD_TYPE_UNICODE_COMMENT,
4849
+ EXTRAFIELD_TYPE_USDZ,
4850
+ EXTRAFIELD_TYPE_INFOZIP,
4851
+ EXTRAFIELD_TYPE_UNIX,
4852
+ EXTRAFIELD_TYPE_UNIX_TYPE1,
4853
+ EXTRAFIELD_TYPE_PKWARE_UNIX
4854
+ ]);
4855
+
4856
+ function getUserExtraField(extraField) {
4857
+ if (extraField) {
4858
+ const userExtraField = new Map();
4859
+ extraField.forEach((field, type) => {
4860
+ if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
4861
+ userExtraField.set(type, field.data);
4862
+ }
4863
+ });
4864
+ if (userExtraField.size) {
4865
+ return userExtraField;
4866
+ }
4867
+ }
4868
+ }
4869
+
4870
+ function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
4871
+ return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
4872
+ }
4873
+
4673
4874
  /*
4674
4875
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4675
4876
 
@@ -4729,6 +4930,8 @@
4729
4930
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4730
4931
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4731
4932
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4933
+ const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
4934
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
4732
4935
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4733
4936
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4734
4937
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
@@ -4799,7 +5002,7 @@
4799
5002
  }
4800
5003
  }
4801
5004
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
4802
- throwAmbiguousArchive("multiple end of central directory records");
5005
+ throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
4803
5006
  }
4804
5007
  const endOfDirectoryView = getDataView(endOfDirectoryInfo);
4805
5008
  let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
@@ -5097,7 +5300,8 @@
5097
5300
  const writer = new TransformStream();
5098
5301
  const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
5099
5302
  arrayBufferPromise.catch(() => { });
5100
- await fileEntry.getData(writer, entry, zipReader.readRanges, options);
5303
+ await fileEntry.getData(writer, entry, zipReader.readRanges,
5304
+ Object.assign({}, options, { preventClose: false }));
5101
5305
  return arrayBufferPromise;
5102
5306
  };
5103
5307
  offset = endOffset;
@@ -5178,49 +5382,101 @@
5178
5382
  await reader.readable.cancel();
5179
5383
  }
5180
5384
  }
5385
+
5386
+ [SYMBOL_ASYNC_DISPOSE]() {
5387
+ return this.close();
5388
+ }
5181
5389
  }
5182
5390
 
5183
5391
  class ZipReaderStream {
5184
5392
 
5185
5393
  constructor(options = {}) {
5186
- const { readable, writable } = new TransformStream();
5187
- const gen = new ZipReader(readable, options).getEntriesGenerator();
5394
+ let sourceController;
5395
+ const { readable, writable } = new TransformStream({
5396
+ start(controller) {
5397
+ sourceController = controller;
5398
+ }
5399
+ });
5400
+ const zipReader = new ZipReader(readable, options);
5401
+ const gen = zipReader.getEntriesGenerator();
5402
+ const pendingEntries = new Set();
5188
5403
  this.readable = new ReadableStream({
5189
5404
  async pull(controller) {
5190
5405
  const { done, value } = await gen.next();
5191
5406
  if (done)
5192
5407
  return controller.close();
5193
- const entryReadable = (function () {
5194
- const { readable, writable } = new TransformStream();
5195
- if (value.getData) {
5196
- getData();
5197
- return readable;
5198
- }
5199
-
5200
- async function getData() {
5201
- try {
5202
- await value.getData(writable);
5203
- } catch (error) {
5204
- try {
5205
- await writable.abort(error);
5206
- } catch {
5207
- // ignored
5208
- }
5209
- }
5210
- }
5211
- })();
5408
+ const entryStream = createEntryStream(value, pendingEntries);
5212
5409
  const chunk = {
5213
5410
  ...value,
5214
- readable: entryReadable
5411
+ readable: entryStream.readable
5215
5412
  };
5216
5413
  delete chunk.getData;
5414
+ Object.defineProperties(chunk, {
5415
+ localDirectory: {
5416
+ get: () => value.localDirectory,
5417
+ enumerable: true
5418
+ },
5419
+ warnings: {
5420
+ get: () => value.warnings,
5421
+ enumerable: true
5422
+ }
5423
+ });
5217
5424
  controller.enqueue(chunk);
5425
+ },
5426
+ async cancel(reason) {
5427
+ const entryStreams = Array.from(pendingEntries);
5428
+ pendingEntries.clear();
5429
+ sourceController.error(reason);
5430
+ await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
5431
+ await Promise.allSettled([gen.return(), zipReader.close()]);
5218
5432
  }
5219
5433
  });
5220
5434
  this.writable = writable;
5221
5435
  }
5222
5436
  }
5223
5437
 
5438
+ function createEntryStream(entry, pendingEntries) {
5439
+ const { readable, writable } = new TransformStream();
5440
+ let dataReader;
5441
+ const entryStream = {
5442
+ cancel: async reason => {
5443
+ pendingEntries.delete(entryStream);
5444
+ await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
5445
+ }
5446
+ };
5447
+ entryStream.readable = new ReadableStream({
5448
+ async pull(controller) {
5449
+ if (!dataReader) {
5450
+ dataReader = readable.getReader();
5451
+ pendingEntries.add(entryStream);
5452
+ getData();
5453
+ }
5454
+ const { done, value } = await dataReader.read();
5455
+ if (done) {
5456
+ controller.close();
5457
+ } else {
5458
+ controller.enqueue(value);
5459
+ }
5460
+ },
5461
+ cancel: reason => entryStream.cancel(reason)
5462
+ }, { highWaterMark: 0 });
5463
+ return entryStream;
5464
+
5465
+ async function getData() {
5466
+ try {
5467
+ await entry.getData(writable, { preventClose: false });
5468
+ } catch (error) {
5469
+ try {
5470
+ await writable.abort(error);
5471
+ } catch {
5472
+ // ignored
5473
+ }
5474
+ } finally {
5475
+ pendingEntries.delete(entryStream);
5476
+ }
5477
+ }
5478
+ }
5479
+
5224
5480
  async function isZipFile(reader, options = {}) {
5225
5481
  reader = new GenericReader(reader);
5226
5482
  await initStream(reader);
@@ -5280,7 +5536,9 @@
5280
5536
  const dataView = getDataView(dataArray);
5281
5537
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
5282
5538
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
5283
- const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
5539
+ const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
5540
+ const passThroughCompression = Boolean(passThrough);
5541
+ const passThroughEncryption = passThrough === true;
5284
5542
  checkPasswordOption(password, rawPassword);
5285
5543
  password = password && password.length && password;
5286
5544
  rawPassword = rawPassword && rawPassword.length && rawPassword;
@@ -5301,7 +5559,9 @@
5301
5559
  const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
5302
5560
  const entryStrictness = getStrictness(options, zipEntry.options);
5303
5561
  const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
5304
- const checkLocalFilename = getCheckLocalFilename(checkLocalDirectoryOption, entryStrictness);
5562
+ const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
5563
+ const checkLocalFilename = getCheckLocalFilename(
5564
+ checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
5305
5565
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
5306
5566
  if (checkLocalFilename && (filenameLength || extraFieldLength)) {
5307
5567
  const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
@@ -5332,16 +5592,17 @@
5332
5592
  if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
5333
5593
  fileEntry.gid = gid;
5334
5594
  }
5335
- const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
5595
+ const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5596
+ const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
5336
5597
  const zipCrypto = encrypted && !extraFieldAES;
5337
- if (!passThrough) {
5598
+ if (!passThroughEncryption) {
5338
5599
  fileEntry.zipCrypto = zipCrypto;
5339
5600
  }
5340
5601
  if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
5341
5602
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
5342
5603
  }
5343
- const registeredCodec = passThrough ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5344
- if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThrough) {
5604
+ const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5605
+ if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
5345
5606
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
5346
5607
  }
5347
5608
  if (encrypted) {
@@ -5358,15 +5619,16 @@
5358
5619
  const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5359
5620
  const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5360
5621
  throwIfAborted(signal);
5361
- const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5362
5622
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
5363
5623
  const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
5364
5624
  if (checkOverlappingEntryOnly) {
5365
5625
  checkOverlappingEntry = true;
5366
5626
  }
5367
5627
  const { onstart, onprogress, onend } = options;
5368
- const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
5369
- const outputSize = passThrough ? compressedSize : uncompressedSize;
5628
+ const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
5629
+ const outputSize = passThroughCompression ?
5630
+ compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
5631
+ uncompressedSize;
5370
5632
  const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
5371
5633
  let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
5372
5634
  if (deflate64) {
@@ -5375,7 +5637,7 @@
5375
5637
  const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
5376
5638
  const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
5377
5639
  getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
5378
- checkCrc32Option) && !passThrough &&
5640
+ checkCrc32Option) && !passThroughCompression &&
5379
5641
  (!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
5380
5642
  const workerOptions = {
5381
5643
  options: {
@@ -5419,7 +5681,7 @@
5419
5681
  readRanges
5420
5682
  });
5421
5683
  }
5422
- let writable, abortError;
5684
+ let writable, abortError, aborted;
5423
5685
  try {
5424
5686
  if (!checkOverlappingEntryOnly) {
5425
5687
  if (checkPasswordOnly) {
@@ -5429,24 +5691,28 @@
5429
5691
  await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5430
5692
  ({ writable } = writer);
5431
5693
  const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5432
- writer.size += writtenSize;
5433
5694
  if (writtenSize != outputSize) {
5434
- throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
5695
+ throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
5435
5696
  }
5697
+ writer.size += writtenSize;
5436
5698
  }
5437
5699
  } catch (error) {
5438
- if (error.outputSize !== UNDEFINED_VALUE) {
5700
+ const { outputSize: failedOutputSize } = workerOptions;
5701
+ if (failedOutputSize !== UNDEFINED_VALUE) {
5702
+ writer.size += failedOutputSize;
5703
+ } else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
5439
5704
  writer.size += error.outputSize;
5440
5705
  }
5441
- if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
5706
+ if (!checkPasswordOnly || !isErrorObject(error) || error.message != ERR_ABORT_CHECK_PASSWORD) {
5442
5707
  abortError = error;
5708
+ aborted = true;
5443
5709
  throw error;
5444
5710
  }
5445
5711
  } finally {
5446
5712
  const preventClose = !ownsWritable(writer) && getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
5447
5713
  if (!preventClose && writable && !writable.locked) {
5448
5714
  const writableWriter = writable.getWriter();
5449
- if (abortError) {
5715
+ if (aborted) {
5450
5716
  try {
5451
5717
  await writableWriter.abort(abortError);
5452
5718
  } catch {
@@ -6098,7 +6364,7 @@
6098
6364
  if (checkLocalFilename && !maskedLocalDirectory &&
6099
6365
  (rawLocalFilename.length != rawFilename.length ||
6100
6366
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6101
- reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6367
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
6102
6368
  }
6103
6369
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6104
6370
  reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
@@ -6123,16 +6389,6 @@
6123
6389
  }
6124
6390
  }
6125
6391
 
6126
- function addWarning(warnings, reason, filename) {
6127
- if (!warnings.some(warning => warning.reason == reason)) {
6128
- const warning = { reason };
6129
- if (filename !== UNDEFINED_VALUE) {
6130
- warning.filename = filename;
6131
- }
6132
- warnings.push(warning);
6133
- }
6134
- }
6135
-
6136
6392
  function throwAmbiguousArchive(reason) {
6137
6393
  const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
6138
6394
  error.reason = reason;
@@ -6212,7 +6468,9 @@
6212
6468
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6213
6469
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6214
6470
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6471
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
6215
6472
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6473
+ WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
6216
6474
  WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6217
6475
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6218
6476
  WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
@@ -6265,7 +6523,7 @@
6265
6523
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
6266
6524
  const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
6267
6525
  const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
6268
- const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
6526
+ const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
6269
6527
  const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
6270
6528
  const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
6271
6529
  const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
@@ -6277,6 +6535,7 @@
6277
6535
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
6278
6536
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
6279
6537
  const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
6538
+ const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
6280
6539
  const ERR_UNDETERMINED_SIZE = "Undetermined size";
6281
6540
  const ERR_UNDEFINED_READER = "Undefined reader";
6282
6541
  const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
@@ -6290,14 +6549,21 @@
6290
6549
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
6291
6550
  const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
6292
6551
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
6552
+ const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
6553
+ const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
6554
+ const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
6555
+ const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
6293
6556
 
6294
6557
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
6295
6558
  const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
6296
6559
  const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
6297
6560
  const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
6561
+ const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
6562
+ const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
6298
6563
  const VENDOR_VERSION_AE_1 = 1;
6299
6564
  const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
6300
6565
  const UNIX_EXTRA_FIELD_TYPE = "unix";
6566
+ const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
6301
6567
  const MAX_LEVEL = 9;
6302
6568
 
6303
6569
  let workers = 0;
@@ -6324,9 +6590,11 @@
6324
6590
  initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
6325
6591
  pendingAddFileCalls: new Set(),
6326
6592
  pendingErrors: [],
6593
+ warnings: [],
6327
6594
  bufferedWrites: 0,
6328
6595
  directWrites: 0,
6329
- lastFileEntry: UNDEFINED_VALUE
6596
+ lastFileEntry: UNDEFINED_VALUE,
6597
+ archiveClosed: false
6330
6598
  });
6331
6599
  }
6332
6600
 
@@ -6491,6 +6759,9 @@
6491
6759
  const zipWriter = this;
6492
6760
  const { pendingAddFileCalls, writer } = this;
6493
6761
  const { writable } = writer;
6762
+ if (zipWriter.archiveClosed) {
6763
+ return getWriterData(writer);
6764
+ }
6494
6765
  if (!(comment instanceof Uint8Array)) {
6495
6766
  throw new Error(ERR_INVALID_COMMENT_TYPE);
6496
6767
  }
@@ -6501,7 +6772,7 @@
6501
6772
  await Promise.allSettled(Array.from(pendingAddFileCalls));
6502
6773
  }
6503
6774
  await Promise.allSettled(zipWriter.pendingErrors.map(watcher => watcher.recorded));
6504
- const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.error && !watcher.observed);
6775
+ const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.failed && !watcher.observed);
6505
6776
  if (unobservedWatchers.length) {
6506
6777
  const unobservedErrors = unobservedWatchers.map(watcher => watcher.error);
6507
6778
  unobservedWatchers.forEach(watcher => watcher.observed = true);
@@ -6514,11 +6785,16 @@
6514
6785
  throw error;
6515
6786
  }
6516
6787
  await closeFile(zipWriter, comment, options);
6788
+ zipWriter.archiveClosed = true;
6517
6789
  const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
6518
6790
  if (!preventClose) {
6519
6791
  await writable.getWriter().close();
6520
6792
  }
6521
- return writer.getData ? writer.getData() : writable;
6793
+ return getWriterData(writer);
6794
+ }
6795
+
6796
+ [SYMBOL_ASYNC_DISPOSE]() {
6797
+ return this.close();
6522
6798
  }
6523
6799
  }
6524
6800
 
@@ -6597,11 +6873,16 @@
6597
6873
  }
6598
6874
  }
6599
6875
 
6876
+ function getWriterData(writer) {
6877
+ return writer.getData ? writer.getData() : writer.writable;
6878
+ }
6879
+
6600
6880
  function watchPromiseError(zipWriter, promise) {
6601
6881
  const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
6602
6882
  const watcher = {};
6603
6883
  watchedPromise.watcher = watcher;
6604
- watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE, error => watcher.error = error);
6884
+ watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE,
6885
+ error => Object.assign(watcher, { failed: true, error }));
6605
6886
  zipWriter.pendingErrors.push(watcher);
6606
6887
  return watchedPromise;
6607
6888
  }
@@ -6615,6 +6896,14 @@
6615
6896
 
6616
6897
  async function addFileEntry(zipWriter, name, reader, options) {
6617
6898
  options = Object.assign({}, options);
6899
+ const entry = options[OPTION_ENTRY];
6900
+ if (entry !== UNDEFINED_VALUE) {
6901
+ const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
6902
+ checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
6903
+ getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
6904
+ delete options[OPTION_ENTRY];
6905
+ options = Object.assign(entryOptions, passThroughOptions, options);
6906
+ }
6618
6907
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6619
6908
  name += DIRECTORY_SIGNATURE;
6620
6909
  }
@@ -6679,21 +6968,33 @@
6679
6968
  try {
6680
6969
  const { resolvedOptions } = metadataInfo;
6681
6970
  if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
6682
- !resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
6971
+ !resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
6683
6972
  resolvedOptions.level = 0;
6973
+ addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
6684
6974
  }
6685
6975
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
6686
6976
  ({ reader } = sizesInfo);
6687
6977
  const diskOffset = getDiskOffset(zipWriter.writer);
6688
6978
  const diskNumber = getDiskNumber(zipWriter.writer);
6979
+ let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
6980
+ const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
6981
+ if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
6982
+ crc32 = UNDEFINED_VALUE;
6983
+ }
6984
+ if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
6985
+ throw new Error(ERR_UNDEFINED_CRC32);
6986
+ }
6689
6987
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
6690
6988
  signature: options[PROPERTY_NAME_SIGNATURE],
6691
- crc32: options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32,
6989
+ crc32,
6692
6990
  offset: zipWriter.offset - diskOffset,
6693
6991
  diskNumberStart: diskNumber,
6694
6992
  [OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
6695
6993
  });
6696
6994
  const headerInfo = getHeaderInfo(options);
6995
+ if (headerInfo.lastModDateClamped) {
6996
+ addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
6997
+ }
6697
6998
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6698
6999
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6699
7000
  fileEntry = await getFileEntry(zipWriter, name, reader, {
@@ -6720,6 +7021,95 @@
6720
7021
  return new Entry(fileEntry);
6721
7022
  }
6722
7023
 
7024
+ function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
7025
+ if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
7026
+ throw new Error(ERR_INVALID_ENTRY);
7027
+ }
7028
+ const {
7029
+ externalFileAttributes,
7030
+ versionMadeBy,
7031
+ comment,
7032
+ lastModDate,
7033
+ rawLastModDate,
7034
+ creationDate,
7035
+ lastAccessDate,
7036
+ uncompressedSize,
7037
+ encrypted,
7038
+ zipCrypto,
7039
+ crc32,
7040
+ compressionMethod,
7041
+ extraFieldAES,
7042
+ extraFieldUnix,
7043
+ internalFileAttributes,
7044
+ extraField,
7045
+ bitFlag,
7046
+ directory,
7047
+ uid,
7048
+ gid
7049
+ } = entry;
7050
+ const entryOptions = {
7051
+ externalFileAttributes,
7052
+ versionMadeBy,
7053
+ comment,
7054
+ lastModDate,
7055
+ creationDate,
7056
+ lastAccessDate,
7057
+ internalFileAttributes,
7058
+ directory
7059
+ };
7060
+ if (bitFlag && bitFlag.languageEncodingFlag) {
7061
+ entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
7062
+ }
7063
+ const userExtraField = getUserExtraField(extraField);
7064
+ if (userExtraField) {
7065
+ entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
7066
+ }
7067
+ if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
7068
+ Object.assign(entryOptions, {
7069
+ uid,
7070
+ gid,
7071
+ unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
7072
+ });
7073
+ }
7074
+ const passThroughOptions = {};
7075
+ if (passThrough && !directory) {
7076
+ Object.assign(passThroughOptions, {
7077
+ uncompressedSize,
7078
+ crc32,
7079
+ compressionMethod
7080
+ });
7081
+ if (passThrough !== PASS_THROUGH_COMPRESSED) {
7082
+ Object.assign(passThroughOptions, {
7083
+ encrypted,
7084
+ zipCrypto,
7085
+ encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
7086
+ });
7087
+ }
7088
+ if (bitFlag) {
7089
+ passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
7090
+ passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
7091
+ }
7092
+ if (lastModDateOverride === UNDEFINED_VALUE) {
7093
+ passThroughOptions.rawLastModDate = rawLastModDate;
7094
+ } else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
7095
+ lastModDateOverride instanceof Date &&
7096
+ getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
7097
+ throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
7098
+ }
7099
+ }
7100
+ return { entryOptions, passThroughOptions };
7101
+ }
7102
+
7103
+ function getDosTimeHighByte(lastModDate) {
7104
+ let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
7105
+ if (dosLastModDate < MIN_DATE) {
7106
+ dosLastModDate = MIN_DATE;
7107
+ } else if (dosLastModDate > MAX_DATE) {
7108
+ dosLastModDate = MAX_DATE;
7109
+ }
7110
+ return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
7111
+ }
7112
+
6723
7113
  function resolveAttributes(zipWriter, name, options) {
6724
7114
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6725
7115
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
@@ -6873,7 +7263,9 @@
6873
7263
  const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6874
7264
  const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6875
7265
  const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
6876
- const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
7266
+ const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
7267
+ const passThroughCompression = Boolean(passThrough);
7268
+ const passThroughEncryption = passThrough === true;
6877
7269
  const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6878
7270
  const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6879
7271
  checkPasswordOption(password, rawPassword);
@@ -6889,10 +7281,11 @@
6889
7281
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
6890
7282
  const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
6891
7283
  throwIfAborted(signal);
6892
- const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
7284
+ const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
7285
+ !isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
6893
7286
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
6894
- const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
6895
- if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
7287
+ const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
7288
+ if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
6896
7289
  compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
6897
7290
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
6898
7291
  }
@@ -6906,15 +7299,15 @@
6906
7299
  level = 0;
6907
7300
  }
6908
7301
  }
6909
- if (passThrough) {
6910
- level = UNDEFINED_VALUE;
7302
+ if (passThroughCompression) {
7303
+ level = toNumber(options[OPTION_LEVEL]);
6911
7304
  }
6912
7305
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
6913
7306
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
6914
7307
  if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
6915
7308
  dataDescriptor = false;
6916
7309
  }
6917
- if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThrough)) {
7310
+ if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
6918
7311
  dataDescriptor = true;
6919
7312
  }
6920
7313
  if (level !== UNDEFINED_VALUE && level != 6) {
@@ -6938,7 +7331,8 @@
6938
7331
  lastAccessDate,
6939
7332
  creationDate,
6940
7333
  internalFileAttributes,
6941
- passThrough,
7334
+ passThroughCompression,
7335
+ passThroughEncryption,
6942
7336
  password,
6943
7337
  rawPassword,
6944
7338
  encryptionStrength,
@@ -6999,7 +7393,7 @@
6999
7393
  }
7000
7394
 
7001
7395
  async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
7002
- if (metadata.passThrough && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7396
+ if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7003
7397
  throw new Error(ERR_UNDEFINED_READER);
7004
7398
  }
7005
7399
  let contentSize;
@@ -7015,12 +7409,12 @@
7015
7409
  }
7016
7410
 
7017
7411
  function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
7018
- const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7412
+ const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7019
7413
  let { dataDescriptor, zip64, level, compressionMethod } = metadata;
7020
7414
  let maximumCompressedSize = 0;
7021
7415
  let uncompressedSize = 0;
7022
7416
  let unknownSize = false;
7023
- if (passThrough && hasContent) {
7417
+ if (passThroughCompression && hasContent) {
7024
7418
  uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
7025
7419
  if (uncompressedSize === UNDEFINED_VALUE) {
7026
7420
  throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
@@ -7031,17 +7425,17 @@
7031
7425
  }
7032
7426
  const zip64Enabled = zip64 === true;
7033
7427
  const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
7034
- if (hasContent && passThrough && !encrypted && getLength(password, rawPassword)) {
7428
+ if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
7035
7429
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
7036
7430
  }
7037
- const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
7431
+ const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
7038
7432
  if (!hasContent) {
7039
7433
  level = 0;
7040
7434
  compressionMethod = COMPRESSION_METHOD_STORE;
7041
7435
  }
7042
- const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7436
+ const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
7043
7437
  if (hasContent) {
7044
- if (!passThrough) {
7438
+ if (!passThroughCompression) {
7045
7439
  if (contentSize === UNDEFINED_VALUE) {
7046
7440
  dataDescriptor = true;
7047
7441
  if (zip64 || zip64 === UNDEFINED_VALUE) {
@@ -7054,10 +7448,12 @@
7054
7448
  }
7055
7449
  } else {
7056
7450
  options.uncompressedSize = uncompressedSize;
7057
- maximumCompressedSize = contentSize === UNDEFINED_VALUE ? getMaximumCompressedSize(uncompressedSize) + encryptionOverhead : contentSize;
7451
+ maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
7452
+ getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
7453
+ contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
7058
7454
  }
7059
7455
  }
7060
- const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThrough)) && !isCompressed(compressionMethod, level);
7456
+ const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
7061
7457
  if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7062
7458
  dataDescriptor = false;
7063
7459
  }
@@ -7264,6 +7660,7 @@
7264
7660
  localExtraFieldZip64Length,
7265
7661
  rawExtraFieldExtendedTimestamp,
7266
7662
  extraFieldExtendedTimestampFlag,
7663
+ extraFieldExtendedTimestampTime,
7267
7664
  rawExtraFieldNTFS,
7268
7665
  rawExtraFieldUnix,
7269
7666
  rawExtraFieldAES,
@@ -7276,6 +7673,7 @@
7276
7673
  password,
7277
7674
  rawPassword,
7278
7675
  level,
7676
+ useUnicodeFileNames,
7279
7677
  zip64,
7280
7678
  zip64Enabled,
7281
7679
  zip64UncompressedSize,
@@ -7310,7 +7708,8 @@
7310
7708
  msdosAttributesRaw,
7311
7709
  msdosAttributes,
7312
7710
  useCompressionStream,
7313
- passThrough,
7711
+ passThroughCompression,
7712
+ passThroughEncryption,
7314
7713
  format,
7315
7714
  codecURI
7316
7715
  } = options;
@@ -7321,9 +7720,9 @@
7321
7720
  zip64Enabled,
7322
7721
  directory: Boolean(directory),
7323
7722
  executable: Boolean(executable),
7324
- filenameUTF8: true,
7723
+ filenameUTF8: Boolean(useUnicodeFileNames),
7325
7724
  rawFilename,
7326
- commentUTF8: true,
7725
+ commentUTF8: Boolean(useUnicodeFileNames),
7327
7726
  rawComment,
7328
7727
  rawExtraFieldZip64,
7329
7728
  localExtraFieldZip64Length,
@@ -7354,7 +7753,7 @@
7354
7753
  uncompressedSize
7355
7754
  } = options;
7356
7755
  let compressedSize = 0;
7357
- if (!passThrough) {
7756
+ if (!passThroughCompression) {
7358
7757
  uncompressedSize = 0;
7359
7758
  }
7360
7759
  const { writable } = writer;
@@ -7371,9 +7770,9 @@
7371
7770
  encryptionStrength,
7372
7771
  zipCrypto: encrypted && zipCrypto,
7373
7772
  passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
7374
- computeCrc32: !passThrough,
7375
- compressed: compressed && !passThrough,
7376
- encrypted: encrypted && !passThrough,
7773
+ computeCrc32: !passThroughCompression,
7774
+ compressed: compressed && !passThroughCompression,
7775
+ encrypted: encrypted && !passThroughEncryption,
7377
7776
  useWebWorkers,
7378
7777
  useCompressionStream,
7379
7778
  transferStreams,
@@ -7388,7 +7787,7 @@
7388
7787
  const result = await runWorker({ readable, writable }, workerOptions);
7389
7788
  compressedSize = result.outputSize;
7390
7789
  writer.size += compressedSize;
7391
- if (!passThrough) {
7790
+ if (!passThroughCompression) {
7392
7791
  uncompressedSize = result.inputSize;
7393
7792
  if (!encrypted || zipCrypto) {
7394
7793
  crc32 = result.crc32;
@@ -7399,7 +7798,10 @@
7399
7798
  throw new Error(ERR_UNSUPPORTED_FORMAT);
7400
7799
  }
7401
7800
  } catch (error) {
7402
- if (error.outputSize !== UNDEFINED_VALUE) {
7801
+ const { outputSize: failedOutputSize } = workerOptions;
7802
+ if (failedOutputSize !== UNDEFINED_VALUE) {
7803
+ writer.size += failedOutputSize;
7804
+ } else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
7403
7805
  writer.size += error.outputSize;
7404
7806
  }
7405
7807
  throw error;
@@ -7431,8 +7833,9 @@
7431
7833
  headerArray,
7432
7834
  headerView,
7433
7835
  signature: crc32,
7434
- crc32: encrypted && !zipCrypto && !passThrough ? UNDEFINED_VALUE : crc32,
7836
+ crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
7435
7837
  extraFieldExtendedTimestampFlag,
7838
+ extraFieldExtendedTimestampTime,
7436
7839
  zip64UncompressedSize,
7437
7840
  zip64CompressedSize
7438
7841
  });
@@ -7457,7 +7860,7 @@
7457
7860
  encryptionStrength,
7458
7861
  extendedTimestamp,
7459
7862
  ntfsTimestamp,
7460
- passThrough,
7863
+ passThroughCompression,
7461
7864
  encrypted,
7462
7865
  zip64UncompressedSize,
7463
7866
  zip64CompressedSize,
@@ -7468,7 +7871,7 @@
7468
7871
  let { version, compressionMethod } = options;
7469
7872
  const compressed = !directory && isCompressed(compressionMethod, level);
7470
7873
  let rawLocalExtraFieldZip64;
7471
- const uncompressedFile = passThrough || !compressed;
7874
+ const uncompressedFile = passThroughCompression || !compressed;
7472
7875
  const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
7473
7876
  const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
7474
7877
  if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
@@ -7480,8 +7883,8 @@
7480
7883
  if (zip64ExtraFieldComplete) {
7481
7884
  extraFieldZip64.writeUint64(uncompressedSize);
7482
7885
  if (uncompressedFile) {
7483
- const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7484
- extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
7886
+ const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
7887
+ extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
7485
7888
  }
7486
7889
  }
7487
7890
  } else {
@@ -7500,6 +7903,7 @@
7500
7903
  let rawExtraFieldNTFS;
7501
7904
  let rawExtraFieldExtendedTimestamp;
7502
7905
  let extraFieldExtendedTimestampFlag;
7906
+ let extraFieldExtendedTimestampTime;
7503
7907
  if (extendedTimestamp) {
7504
7908
  const lastModTimeUnix = getTimeUnix(lastModDate);
7505
7909
  const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
@@ -7507,6 +7911,7 @@
7507
7911
  const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
7508
7912
  const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
7509
7913
  extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
7914
+ extraFieldExtendedTimestampTime = lastModTimeUnix;
7510
7915
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7511
7916
  extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
7512
7917
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
@@ -7590,7 +7995,7 @@
7590
7995
  }
7591
7996
  if (encrypted && !zipCrypto) {
7592
7997
  version = version > VERSION_AES ? version : VERSION_AES;
7593
- if (passThrough && crc32 !== UNDEFINED_VALUE) {
7998
+ if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
7594
7999
  rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
7595
8000
  }
7596
8001
  setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
@@ -7652,12 +8057,14 @@
7652
8057
  headerArray,
7653
8058
  headerView,
7654
8059
  lastModDate: storedLastModDate,
8060
+ lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
7655
8061
  rawLastModDate,
7656
8062
  encrypted,
7657
8063
  compressed,
7658
8064
  version,
7659
8065
  compressionMethod,
7660
8066
  extraFieldExtendedTimestampFlag,
8067
+ extraFieldExtendedTimestampTime,
7661
8068
  rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
7662
8069
  localExtraFieldZip64Length,
7663
8070
  rawExtraFieldExtendedTimestamp,
@@ -7760,7 +8167,7 @@
7760
8167
  }, {
7761
8168
  zip64,
7762
8169
  zipCrypto,
7763
- passThrough,
8170
+ passThroughCompression,
7764
8171
  dataDescriptor
7765
8172
  }) {
7766
8173
  const {
@@ -7771,7 +8178,7 @@
7771
8178
  dataDescriptorView,
7772
8179
  dataDescriptorOffset
7773
8180
  } = dataDescriptorInfo;
7774
- if ((!encrypted || zipCrypto || passThrough) && crc32 !== UNDEFINED_VALUE) {
8181
+ if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
7775
8182
  setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
7776
8183
  if (dataDescriptor) {
7777
8184
  setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
@@ -7802,9 +8209,9 @@
7802
8209
  uncompressedSize,
7803
8210
  zip64UncompressedSize,
7804
8211
  zip64CompressedSize
7805
- }, localHeaderView, { dataDescriptor, passThrough }) {
8212
+ }, localHeaderView, { dataDescriptor, passThroughCompression }) {
7806
8213
  if (!dataDescriptor) {
7807
- if (!encrypted || (passThrough && crc32 !== UNDEFINED_VALUE)) {
8214
+ if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
7808
8215
  setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
7809
8216
  }
7810
8217
  if (!zip64CompressedSize) {
@@ -7841,9 +8248,8 @@
7841
8248
  rawExtraFieldUnix,
7842
8249
  rawExtraField,
7843
8250
  rawCentralExtraField,
7844
- extendedTimestamp,
7845
8251
  extraFieldExtendedTimestampFlag,
7846
- lastModDate,
8252
+ extraFieldExtendedTimestampTime,
7847
8253
  zip64Enabled,
7848
8254
  uncompressedSize,
7849
8255
  compressedSize
@@ -7886,16 +8292,15 @@
7886
8292
  fileEntry.zip64Offset = zip64Offset;
7887
8293
  fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
7888
8294
  let rawExtraFieldTimestamp;
7889
- const lastModTimeUnix = getTimeUnix(lastModDate);
7890
- if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
8295
+ if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
8296
+ rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
8297
+ } else {
7891
8298
  const extraFieldTimestamp = createRecordWriter(9);
7892
8299
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7893
8300
  extraFieldTimestamp.writeUint16(5);
7894
8301
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7895
- extraFieldTimestamp.writeUint32(lastModTimeUnix);
8302
+ extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
7896
8303
  rawExtraFieldTimestamp = extraFieldTimestamp.array;
7897
- } else {
7898
- rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
7899
8304
  }
7900
8305
  fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
7901
8306
  const extraFieldLength = getLength(
@@ -8395,6 +8800,11 @@
8395
8800
  };
8396
8801
  }
8397
8802
 
8803
+ function isPrintableASCIIText(rawText) {
8804
+ return rawText.every(characterCode =>
8805
+ characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
8806
+ }
8807
+
8398
8808
  function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
8399
8809
  let bitFlag = 0;
8400
8810
  if (useUnicodeFileNames) {
@@ -8556,7 +8966,7 @@
8556
8966
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8557
8967
  */
8558
8968
 
8559
- const VERSION = "2.11.4";
8969
+ const VERSION = "2.13.0";
8560
8970
 
8561
8971
  /*
8562
8972
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9378,9 +9788,9 @@
9378
9788
  DecompressionStreamFallback: DecompressionStreamZlib
9379
9789
  });
9380
9790
 
9381
- function terminateWorkersAndModule() {
9791
+ async function terminateWorkersAndModule() {
9792
+ await terminateWorkers();
9382
9793
  modulePromise = null;
9383
- terminateWorkers();
9384
9794
  resetWasmModule();
9385
9795
  }
9386
9796
 
@@ -9450,6 +9860,7 @@
9450
9860
  exports.BlobWriter = BlobWriter;
9451
9861
  exports.Data64URIReader = Data64URIReader;
9452
9862
  exports.Data64URIWriter = Data64URIWriter;
9863
+ exports.ERR_ABORTED = ERR_ABORTED;
9453
9864
  exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
9454
9865
  exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
9455
9866
  exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
@@ -9462,7 +9873,9 @@
9462
9873
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
9463
9874
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
9464
9875
  exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
9876
+ exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
9465
9877
  exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
9878
+ exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
9466
9879
  exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
9467
9880
  exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
9468
9881
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
@@ -9471,6 +9884,7 @@
9471
9884
  exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
9472
9885
  exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
9473
9886
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
9887
+ exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
9474
9888
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
9475
9889
  exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
9476
9890
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
@@ -9488,6 +9902,7 @@
9488
9902
  exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
9489
9903
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
9490
9904
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
9905
+ exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
9491
9906
  exports.ERR_INVALID_READER = ERR_INVALID_READER;
9492
9907
  exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
9493
9908
  exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
@@ -9497,6 +9912,7 @@
9497
9912
  exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
9498
9913
  exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
9499
9914
  exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
9915
+ exports.ERR_INVALID_URI = ERR_INVALID_URI;
9500
9916
  exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
9501
9917
  exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
9502
9918
  exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
@@ -9504,6 +9920,7 @@
9504
9920
  exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
9505
9921
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
9506
9922
  exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
9923
+ exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
9507
9924
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
9508
9925
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
9509
9926
  exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
@@ -9519,6 +9936,8 @@
9519
9936
  exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
9520
9937
  exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
9521
9938
  exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
9939
+ exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
9940
+ exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
9522
9941
  exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
9523
9942
  exports.HttpRangeReader = HttpRangeReader;
9524
9943
  exports.HttpReader = HttpReader;
@@ -9531,13 +9950,17 @@
9531
9950
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
9532
9951
  exports.VERSION = VERSION;
9533
9952
  exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
9953
+ exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
9534
9954
  exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
9955
+ exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
9535
9956
  exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
9536
9957
  exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
9537
9958
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
9538
9959
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
9539
9960
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
9961
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
9540
9962
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
9963
+ exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
9541
9964
  exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
9542
9965
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
9543
9966
  exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;