@zip.js/zip.js 2.8.34 → 2.8.35
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.
- package/README.md +13 -1
- package/deno.json +5 -2
- package/dist/README.md +3 -1
- package/dist/zip-core.js +472 -220
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +449 -220
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +476 -226
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +478 -228
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +474 -222
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +475 -223
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +477 -225
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +476 -226
- package/index-native.min.js +1 -1
- package/index.cjs +478 -228
- package/index.d.cts +53 -0
- package/index.d.ts +53 -0
- package/index.min.js +1 -1
- package/lib/core/codec-pool.js +2 -2
- package/lib/core/codec-worker.js +6 -2
- package/lib/core/configuration.js +22 -1
- package/lib/core/io.js +209 -56
- package/lib/core/streams/aes-crypto-stream.js +1 -10
- package/lib/core/streams/codec-stream.js +36 -15
- package/lib/core/streams/zip-entry-stream.js +19 -28
- package/lib/core/util/array.js +48 -0
- package/lib/core/web-worker-base.js +3 -3
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +2 -3
- package/lib/core/zip-reader.js +37 -40
- package/lib/core/zip-writer.js +58 -51
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-base.js +5 -3
- package/lib/zip-fs-native.js +2 -2
- package/lib/zip-fs-wasm.js +2 -2
- package/lib/zip-legacy.js +2 -2
- package/lib/zip-module-native.js +2 -2
- package/lib/zip-module-wasm.js +3 -3
- package/lib/zip-native.js +2 -2
- package/lib/zip-wasm.js +2 -2
- package/package.json +3 -3
- package/worker-message-property-names.js +3 -0
- package/.github/workflows/publish.yml +0 -30
- package/reserved-property-names.js +0 -50
package/index-native.cjs
CHANGED
|
@@ -156,6 +156,7 @@ const DEFAULT_CONFIGURATION = {
|
|
|
156
156
|
workerStarvationTimeout: 5000,
|
|
157
157
|
useWebWorkers: true,
|
|
158
158
|
useCompressionStream: true,
|
|
159
|
+
transferStreams: true,
|
|
159
160
|
CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
|
|
160
161
|
DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
|
|
161
162
|
};
|
|
@@ -170,13 +171,14 @@ const CONFIGURABLE_PROPERTY_NAMES = [
|
|
|
170
171
|
"workerStarvationTimeout",
|
|
171
172
|
"useCompressionStream",
|
|
172
173
|
"useWebWorkers",
|
|
174
|
+
"transferStreams",
|
|
173
175
|
"CompressionStream",
|
|
174
176
|
"DecompressionStream",
|
|
175
177
|
"CompressionStreamZlib",
|
|
176
178
|
"DecompressionStreamZlib"
|
|
177
179
|
];
|
|
178
180
|
|
|
179
|
-
const config =
|
|
181
|
+
const config = { ...DEFAULT_CONFIGURATION };
|
|
180
182
|
|
|
181
183
|
function getConfiguration() {
|
|
182
184
|
return config;
|
|
@@ -195,7 +197,24 @@ function configure(configuration) {
|
|
|
195
197
|
}
|
|
196
198
|
}
|
|
197
199
|
|
|
198
|
-
const t=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],r=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],o=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],c=new Uint8Array(288);c.fill(8,0,144),c.fill(9,144,256),c.fill(7,256,280),c.fill(8,280,288);const e=new Uint8Array(30).fill(5);function s(t){const r=new Uint16Array(16);for(const f of t)r[f]++;r[0]=0;const f=new Uint16Array(17);for(let t=1;15>=t;t++)f[t+1]=f[t]+r[t];const o=new Uint16Array(t.length);for(let r=0;r<t.length;r++)t[r]&&(o[f[t[r]]++]=r);return {t:r,symbols:o}}const a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function i(i){i({workerURI:i=>{const v="text/javascript",m=(a=>{let i=0,v=0,m=0,u=new Uint8Array(1024),j=0,R=0;for(;!R;){R=x(1);const t=x(2);if(0==t)V();else if(1==t)X(s(c),s(e));else {if(2!=t)throw Error("invalid deflate block type");X(...K());}}return u.subarray(0,j);function b(){if(i>=a.length)throw Error("unexpected end of deflate data");return a[i++]}function x(t){for(;t>m;)v|=b()<<m,m+=8;const r=v&(1<<t)-1;return v>>>=t,m-=t,r}function V(){v=0,m=0;const t=b()|b()<<8;i+=2,l(j+t);for(let r=0;t>r;r++)u[j++]=b();}function X(n,c){let e=L(n);for(;256!=e;){if(256>e)l(j+1),u[j++]=e;else {const n=e-257,s=t[n]+x(r[n]),a=L(c),i=f[a]+x(o[a]);l(j+s);const v=j-i;for(let t=0;s>t;t++)u[j++]=u[v+t];}e=L(n);}}function K(){const t=x(5)+257,r=x(5)+1,f=x(4)+4,o=new Uint8Array(19);for(let t=0;f>t;t++)o[n[t]]=x(3);const c=s(o),e=new Uint8Array(t+r);let a=0;for(;a<e.length;){const t=L(c);if(16>t)e[a++]=t;else if(16==t){const t=e[a-1];let r=x(2)+3;for(;r--;)e[a++]=t;}else a+=17==t?x(3)+3:x(7)+11;}return [s(e.subarray(0,t)),s(e.subarray(t))]}function L(t){const{t:r,symbols:f}=t;let o=0,n=0,c=0;for(let t=1;15>=t;t++){o|=x(1);const e=r[t];if(e>o-n)return f[c+(o-n)];c+=e,n=n+e<<1,o<<=1;}throw Error("invalid huffman code")}function l(t){if(u.length<t){let r=2*u.length;for(;t>r;)r*=2;const f=new Uint8Array(r);f.set(u.subarray(0,j)),u=f;}}})((t=>{const r=(t=(t+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let o=0;r>o;o+=4){const r=a.indexOf(t[o])<<18|a.indexOf(t[o+1])<<12|(63&a.indexOf(t[o+2]))<<6|63&a.indexOf(t[o+3]);f.push(r>>16&255),"="!==t[o+2]&&f.push(r>>8&255),"="!==t[o+3]&&f.push(255&r);}return new Uint8Array(f)})("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"));if(i){const t=new Blob([m],{type:v});return URL.createObjectURL(t)}return "data:"+v+";base64,"+(t=>{let r="";const f=t.length;let o=0;for(;f>o+2;o+=3){const f=t[o]<<16|t[o+1]<<8|t[o+2];r+=a[f>>18&63]+a[f>>12&63]+a[f>>6&63]+a[63&f];}const n=f-o;if(1===n){const f=t[o]<<16;r+=a[f>>18&63]+a[f>>12&63]+"==";}else if(2===n){const f=t[o]<<16|t[o+1]<<8;r+=a[f>>18&63]+a[f>>12&63]+a[f>>6&63]+"=";}return r})(m)}});}
|
|
200
|
+
function setDefaultConfiguration(configuration) {
|
|
201
|
+
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
202
|
+
const propertyValue = configuration[propertyName];
|
|
203
|
+
if (propertyValue !== UNDEFINED_VALUE) {
|
|
204
|
+
DEFAULT_CONFIGURATION[propertyName] = propertyValue;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
configure(configuration);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function resetConfiguration() {
|
|
211
|
+
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
212
|
+
delete config[propertyName];
|
|
213
|
+
}
|
|
214
|
+
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],e=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],t=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],o=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],r=new Uint8Array(288);r.fill(8,0,144),r.fill(9,144,256),r.fill(7,256,280),r.fill(8,280,288);const b=new Uint8Array(30).fill(5);function l(n){const e=new Uint16Array(16);for(const t of n)e[t]++;e[0]=0;const t=new Uint16Array(17);for(let n=1;15>=n;n++)t[n+1]=t[n]+e[n];const f=new Uint16Array(n.length);for(let e=0;e<n.length;e++)n[e]&&(f[t[n[e]]++]=e);return {o:e,symbols:f}}const c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function i(i){i({workerURI:i=>{const v="text/javascript",z=(c=>{let i=0,v=0,z=0,K=new Uint8Array(1024),u=0,j=0;for(;!j;){j=T(1);const n=T(2);if(0==n)s();else if(1==n)x(l(r),l(b));else {if(2!=n)throw Error("invalid deflate block type");x(...D());}}return K.subarray(0,u);function m(){if(i>=c.length)throw Error("unexpected end of deflate data");return c[i++]}function T(n){for(;n>z;)v|=m()<<z,z+=8;const e=v&(1<<n)-1;return v>>>=n,z-=n,e}function s(){v=0,z=0;const n=m()|m()<<8;i+=2,w(u+n);for(let e=0;n>e;e++)K[u++]=m();}function x(o,r){let b=F(o);for(;256!=b;){if(256>b)w(u+1),K[u++]=b;else {const o=b-257,l=n[o]+T(e[o]),c=F(r),i=t[c]+T(f[c]);w(u+l);const v=u-i;for(let n=0;l>n;n++)K[u++]=K[v+n];}b=F(o);}}function D(){const n=T(5)+257,e=T(5)+1,t=T(4)+4,f=new Uint8Array(19);for(let n=0;t>n;n++)f[o[n]]=T(3);const r=l(f),b=new Uint8Array(n+e);let c=0;for(;c<b.length;){const n=F(r);if(16>n)b[c++]=n;else if(16==n){const n=b[c-1];let e=T(2)+3;for(;e--;)b[c++]=n;}else c+=17==n?T(3)+3:T(7)+11;}return [l(b.subarray(0,n)),l(b.subarray(n))]}function F(n){const{o:e,symbols:t}=n;let f=0,o=0,r=0;for(let n=1;15>=n;n++){f|=T(1);const b=e[n];if(b>f-o)return t[r+(f-o)];r+=b,o=o+b<<1,f<<=1;}throw Error("invalid huffman code")}function w(n){if(K.length<n){let e=2*K.length;for(;n>e;)e*=2;const t=new Uint8Array(e);t.set(K.subarray(0,u)),K=t;}}})((n=>{const e=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let f=0;e>f;f+=4){const e=c.indexOf(n[f])<<18|c.indexOf(n[f+1])<<12|(63&c.indexOf(n[f+2]))<<6|63&c.indexOf(n[f+3]);t.push(e>>16&255),"="!==n[f+2]&&t.push(e>>8&255),"="!==n[f+3]&&t.push(255&e);}return new Uint8Array(t)})("zX1rc9s4z+j38yuSzD4esYK0knyJI4f2pLdtt23a7W1363E7jk3FahzJpei4aeznt58BSEm0k+72ubznPdOOI1EkSIIgCAIg6AjevzlIltlEpXl2wLm6Xog82ZuKJM1Eo6H/+uPL6UA/OoLFwmEb5pSFHHZzsCzEXqFkOlEHvUmeFermRMrxdSzg5dlnMVGxgtPl5ZmQsYQXYzWLM3gkZS7jFN6lmerq3Dm9hB39ltBbM9JvBTytX+bwYryIx/BwrMbvU7GKJ/BK5pdpIeIlvBVf1aNskk+FjFcwkdcLlcczWOSFeiGKYnwu4im8leOsSHJ5+UZJMb6MF/BajKfjs7kwCdfwu0yVlXABD/LLhRRFkeaZSTuDh2JyK/VywwsxT+CKX+XpdC+Ac36wzDT6pgfwhtf4hm88E6u9HD7z4XAEd/0f9ZJcOnOh9gQPelG70xc94brsBpMUF1ufu+aj4mFDDVS/3w8/No+63egoanZbMSX0Pg+D0VCMuNrcDblMVTzsdfuqp7A2GtU9yT8PlRdi8d7noSIwst/vdz8S0KjdbsjRhvIOX8FXeAcn8AlewwN4OuKfe5P5uCj2HmlgcjlRuXQEu1GztPBzLtZrL9yMFwuRTTFZtyFY68+9sgXBWvhzkZ2rWQ9zZDzopYkj+7zbaAj/bJkkQpbtTQm9E6dMB+GfXSvxMkkKoUAyyLn0uoTCXt7nWS9zebcsLLj6mPrnQhHlORnsBwwkt5PcFib2FH9KfRejjw+GAvHRiNrt0cfX9BJ29Nsneota+u3EYOvju6GsS3yll7LEK3ozJTY0XD3Zx1biECtC/CuC46iPYpiN2KhnkKk250I57EYKtZTZP3XqZqNH4M898VWJbFrsLbbGQuNcGFQrQt6jXrFcCOncqHLKOAIku1F+NVIgfZF9WYolcocNJPNlMXNqkiEKd1qsp8dClmPkF0LpKe4EoHxqLwPhX43nS8HlZsNAcGz4ZlNOmL2HjgC1C7qkB1eZB9bT3d6TWIduIT4oKLMykJpM9045QpuMlYacJk7AOS/zrdf4VsE1YIVviihWkaUYlmW8cAQZP/Xnjqwa0ow459nAKhif+jNHQQbBGsmymKcT4QRQA2FsA5c4D8rRqMjetFGVzQmsRuDsrCu95ygvZK5uywauqj42o3sluOMKjqjgOILXTcr8iUjnjvq5GTHGykaYMqrBmyHIftBoqEbDEUPphSN+6r9BZNNLIwpbh61us9Pq9vvKCyHEUd7AmxhbA5LxPmFHDFTsyEGwVrE6Pm5GnmBuGBwdtcOwEx0eHnbuCZjHgvczX+ZLJLyftz6z9boZwUwDhYzd4HTRHBhx32g4GR+OWE/1eTPqKY83I5b5C6RVifM6uIXXrBwtwSoum2K+43ooXLcCshbDdNTv9xVCw2fqheqVrKgsNNgilTiAnIglrYjFACQkunmjGYJy834zGsg48xf5wmGEw2yzgRf8BhlaEd98tknl1EfK+bkL5RRRTDPLrX6ofkodaDbS9drJsM0/t0YM5DAd8Yw4D2THx7xbTacNvLKrGY4IqgRkwggZsShr7EjEDs+Oj7trMZQjaDb+KddrR+n+ZQzL1VOkIRsNVXe9e89pNiSDjDFQm80G3nLiXrurR9kY5BQ95Z/N88nFm/Sb4O0wAuW/48PwsBm1u63wqAmtIGpGzWYrPISo3Yma3WYYRBAdhofNZvewC82o224eHrajYATKP+HDsB1220EQtY4g7LaPDg/bzaMmRK0gOGofHQZdaDaP2q3O0WE3GoEYOMr/xIX/qZw8DJT/mgv/tZ3wgAv/AYuVLwVyJbYxf+t1B7tS8RoE+K4uL/zXfDgC4T/gAYjNcjEdK3ELEQcojmXntUQncHbyF/5TH4ew5lvYvtOKLfmvQeCwKP8B5PjLM1cTE86OvH8UBIfh0VHUbh22gqOjkKmZzFd7SGSpc/BgnGW52puNi9neZS7FnpqNs73oY7u55+2Fe2epKg7KmhOizAJ5JNLQ3FCQFkesYXQzz9l6bVhvXshw3Ua5xS7DlP+nk/jF8myM8qITdu7NIezcc+ZuyBiDuctDa4lYGEaH2ZDWHu4OhRG1/Nc1o/U/9ZSFNxgiySJvG7GtfpiVKeqF7YaRzTSJBzpfORf8ZJ4jPfsPfm5FR62jzmF01EHKN7nXSDK9El6PCf9PR9lNZ6ymGENPIDenNTssv/bDo4HoN/GnjT+HRwPNJWP1UX7MYtWQa9XI1rKRWSn/VI1s80KvHyXrPz4WaxRCkFdv/nSsdRmxBimX/ifIuXC6AdsSU8NS1MxJDkVpEj8lPB0GIyh4OgxHMOfpMBrBmKfD5ggmPB22tmXhwyM98i67QYDrtUPgpP/CCSEfCq85+oh/uvpP2DJ/O6OK/BXlbkPCXOkjrgqYw5i5ExdBudI/GVYj83MUsNE66E34GMZ8DnMq2wygYFDwBBKuNth+6oSbrAPAblBf3ILeohF1yZ3TW3NEPXPH9NYaUQfdyTrYbOAZv0kvF7lUz8Q1LXlitffMf+u8IPG10FMYntWDixIwl+t1KFoQ9LP1OujL7bmZZlfjeTrdW4zl+LLYU/ne4uximkTVhMx56DpZv99mx8eRHg+NDliaHCuasrQFu08inJMzmBkRe6Xn8ZSX0siCn2oK53WrFYMlD3tOvl6HrD/tLXHwMFPCCy58kdF2zVlY82o5wgmL87U/783N9sTOXDAY86A3Pi7KyTHGXMPx6CMvhmNDMzyoam005sdJtYVwXTZD4VBL9FNIhvMRg6nLWxtD56taEvq5yzbwNv7bdQiQr97nbyEz+7pRT/lP+BBRJYF+R5VcoPwnw2BUc6+fm1GvXEL7KbFth4owv2L2/kOH1XNKoVBidmoZbsTUiB8FR+0oanU7H8VQjSAbhpQctltH7XanG3UpvWcqN4CxMPKcJ8PQSgsp7T0NNHIsLPGdRUuYbMK/7widEYT/O98PrYWKNiO/8/0A6Ol93a3NND0XxS5UQN77Hrts5JkSejiqUKIIJXexwJJOBM0SXff21DA59vJsbzyXYjy93tNQp3uzy/FkbzKez8V0/6ACT0CqRutemJYLhqLK/XLVne3z80ajfME9zutxNs0v3+Mep+D8DTzhB0+rqVkUq1xOD+C3OrFIz7OxWkpxAO/5wbd08bnwxme5VN5kJiYXXlWoV22Sfjd9vV8KsrcqxvV8e+UmNcneyaune7iCF8sFch8xPWBmm/SBhx14zm+y8aWID17df/bwcXSwgS9c+eMC2+jc4LIfmwxPXpw8ONhs4DmDl1aWVAk5xjYWcSiaYJd48+TEC02RX/nwYCpkeiXuo8gwgj/4sAthBGFnBD/xYdiBqAXNaASPeRjAL3wYAP0bgRA26kEJLkSjMUNZQM0FSP1usiiBeTJRcihIxQ/JmB/4cEddM4LdBJQfP+BcpP/rtfKfO7bURd9aI5K1PuB6l/MtvYZhvjxEwau1z3neaHT0ny7+uZu7j0WxdyGu94r0mzgoJYwTPizq/RxyU2xwwvNe617uRt1+0ktKjZLgxTDBPaST/CPnnAfrdZdTrfq9xYghSaPLGB0fR62P9GaUFsfHYUcndM1796M02hEwMAmEwC8ayscxgoExHx8fhx+jbvOeM+73D1FUK4bJiJqUjz6KLYVVgks/JJ5XD08xbDbEIIkTrzXqzVEYaPV5sl63+ri5JM4oh0o3fPSRWCK9m6ZjUmSSulVKE1Ow/Wo02tjcxGYGLx0BAdtMxXe/hmzzfIevEQ2AKp/DEe0bNU3gnxTl/LzcZRmC+I46MB86KXZYVBgUhMGPmFaVmfCEB719OZyMepOPvFivQ6SDYTLCpZEIIOfJxwSBJMfHEf408afVy3mO6iZERP7x6AgQBs8hG+YjPiEpDQU2lN0mo5Fu8ZKHnW6rGQRH98YfO+128/De/GPUPrxXfDQfuvcmsOKYlA7zUZ2aVy3GHWWrL2kriXtIrHXFV0R2K1SAgcLUfMSXfEmpS0zd2OXbVnmOP9ZmDJOUnbR5WSlJcNZVCqPvTjdat8sJZwvA/gktvFwaED+3vAiHs+JVSTnyCoXeBIlhzhOkgzFPUPad8ARl3yVPUPbF7qxgBlNYcDEMRh8llrhGpc+gGYf4Ho7ggothhM/RCM7oWxg38b05gkve2iKfzBDPihfDhZ4WH+fD61oBOR5eVKrJCU2CMwR1OYIZLzCjKXJhFznbKbKgIm44gikvMKspdGYXWuwUutaFqBMFZjWFFnah651CF7oQ9tTlLVjwFVzzGVzw6Va3W9WcUYNmwxOxGPFliQBNQxYSiKEta0Qg21pauHDdEaz4Ahb8Gq75BVzwMzjjq1JWyDcbyO9cVpDKiAB+5ULLEH9wpR9+4qqSr8oEymBJUTaDeazlml/BAPqJbX4xQgA29J/IDKIWY8LlIXawJ+aFKC0IZU+R+5hOQsaJY/eidhs1YgNH8QD0ixygmse8ZIOMB7HrZix2XYk/CgTqJVyuEHH4II+Pu/g3KwVqsRHUA1S2OUjJunO/0DOjBQZ3TlViOGJs89hoC2+0HitNnH0nqzWzRtQZ1mI1qi3UtuIuI4UXbxmkCoHaB50/s3YUkvXUMB195Bnx52HqhvQS6peIXiL90qSX5qjs26l/5ShI2WYDieDP/Lc0bQstdkhb9PCrHR6KgfO7ctQyEOdvjPVkLL6jvL8pJcFYgByvXpVvCky/jIUK0RVLIOmxzPQym1/H2YbdGF1/ocYSaW8piLBAo34D4+I6m+zZloDdTX/digSKsrYClIjnQKJ1PN5w2UsGzng1TpVDEKt9LO/flJtR+rw3E+bbQjgZBPDHUOF+MOH0Tm+kmBoGo33ioOt1PgzpORxt8ewnaLOUUECCsATBKkZuhMpoTinmHbKB8gVaJx1d8j1j8dxhLNZNGhuKmexYH7zHnvXM/vEB1TWlXWQlHAkCJhDAYzQZVbjUxpJSxLyRIlaQiRg7nE3T7DzODNryjZY+caffaCh2o1uTV+o0g6GsbgIUOtFKMrq2bwim3APXQsmFcDIBCevJendTzQ9lpc35NWXNyu3BGGvSabLcCjGGvdVVTnjZiOPHgzAOtvjxY8OPJ2s+HorRxwIVQmniTLYG8DfWExU+57jNYqU9a/LfmRObkrn8F2dBVs+CFGdBYoazwFlQDkY2cOb81nyoZ0PGf3c0sWn6L9eWh04GO/MkY5rOU8gYJDXVFr1yoDSgeamZrEi2fEDCHZO5bA6krt6h4TGUZeFfoeP07+hYawCJMtNblFkRnybRlG3RKCSGHgXbZH61Y+a3CLLS5DxGtUTZsYdOAlYxRrSFQvi27RHNm4hhSMn6qbe0Am50vxCtS0fxvvCV4IpBRQJTxFvGLELwwgot3zasrmFVjSKkkFi4LBCX86rQeMNFb2yQ1Gg4ij90xqAqteakWhe9VEvixjrjEK3yPmlCGg3VFzuYllz0HFEZjchG60jc2lRrN1JX5joTb/KPDwz1eUFv4n3o82Vv6fIPu8xkIRwFS1i6H1Bf1WjMb3GWlFu6lF6yXldZ0tJue20GHZZuVrfEN+jgug7U9RhaLPE5I8xrXEq/HBCeLedzU3nB71iGIDUo2i9EqUJ5Vi/XKFUoeV0KYJp+7fXcOZDj1QHB2g9RFpiM1WRW5i8E3w9hG95mw5wAUvgCAfyKG/Q7mQG2aG616BkZtIvxXMFLv1atgLy7fbU0YUBut2tu2vV9qNjKWpeDOeJkAy8ZFNC950T3fhpmekGtmAyDSU0HYwgAsxDRWKmYBro0YyhKY6J5rzRuZbUSbi7EdRHjbzyBFD1+yoF9L2SapBNqb7zagBQ0K3OhF3LhTHDWJzK/dH5B+6n+nAhnyTYMVvU8nIptQwfn/GrgCDNvtHi24vy81jzo/jqCLzNRTMYoT5AL0rvXT9FtKM9EhlqBynzOtja48ljZJlPalAp/MhvLB/lUnCjLkUAZ8qcurZivq0G1I0PXLFV3YiFKibmaMJVBjEa/ynm93V3hf0aSrD5f7H5GPb5Zec/+9ZX3ztH6QXn0amcl/os1mBaYas6v19K3mlEP3DktajVmAggjxrYL862yxD4g2Oc4F5TjhexjndXuFNuRP3vkVFHZJCO2uUvSrNdb3TRcjSpB5/K/he7/DLUkJUH6Nyj+SwRWBrhSsiG0q2EYogXvrkZD9l13H1y9hXLeIMIUQ6kl5WG0wU3u3m4p/Bb0rAKC4cpSoz3TCK/I/+o7y36FcbmF8exujKcbBo4GVMt1KR82g3YrPOoedaB9FB62w6B1BN3DbtCNwqOIpGC7TmJ9KeSacz1yUjKwJPVrNEJWljHbMqSOS9mbDETfsD8Z7ZwIQdtZ5a2s0mZEisRL3Y0aRefiLrcsdYvXoZtIVvM6dGOTw2zEPyMD+6hwHdBV2qxf1vW8+S/Xo75TzzdTz1yoIRAvRsT3hJ+L0uuN8FeO4j/pCzmw9ST/KpzMTy+Xc+ercKT7CgUZBmGzdXjY7oZN5oa0DNWgtJPfqDbE/pM+a3i6bj5MQUI+qtv4ecvnI1rrfMOo8v56VTVDQfhRMVSLWmP2ylYikbKn/vbV/la5I2AWzYbefY8NCbiZzJYZmTFjddtj9sM8PYvlHZ60Fq/fGDzclJ61Yhqn5X5NTOMcloW4DSGBb+lCm7HiAnDCiGk8h7m4EvN4DFORzMdKdFrxcsMFrGpGRgpVuOZUvS+NG7AZiws+bzTSRmN/2Wg4+/l6XbBGY9/ZT9br/Yz18kZjv1iv9+fr9cV67Whb+J9wzZ8K5xpmjAHaby8GzkKbzgVc80f4Cd8y5+D8W7o4YKwssGAsvuYP8DGBm7LpFkY3kOk9HuSNhlMMTDmEdoljxmJnqu3xtC0yn6doSHktnBVcg4PcR3t5UuPJFDO1Nj9g9ckR/GKwqD/G2tQ/0y6alR/nee3HiQKctQET9dJ1Iv7a6RQUmvLKOR2wu9xOU23CtRiAf5lmtlsnMUyPS9h3tlZbWUtemqw35VyTuxthBNHt87yUs9E5xpH8oV6MK3VL7nWhMA1IQNYNsLaV0pYrCrYtZyRegeNCkOv07VyUZ9ejVhmPCyfjkpWOzZnt2KxfnpsWXY3lXtYT1rAoe8jIrVn4y6yeb+Q+Z2ciN2fbIVeP6acf5AN3eMkbTnCX//xdvKCe27nFCpJynusJr2l0DhbjGN/NLJYWP1jhZrpiBLtsIGk0nHywwIm0oHl2tjXPxjTPzGeaZ+NGw1ngHF7AchsLdpVmHsOC07aidvFFQ70YT4WsnRmwnmvnRu9tF8v5vHSOl3qbZ1SlihrtmF2d0f4L9Im/1McejDi67d6dOpWnQY22velYjQ9KFwHlT8ZL1GCD0rPmhqZ/nME0zwQqdGQvR9fmeV4Ih8XCFqVgMs4mgvx2EQ4+02Zlw5wFKnIbDeSqyHAq7mmwOdNMi4TSheZbaeIQ681Zo1HUmoY7uRJO4/m+xmhN6iHb0Sluy3qvjazHbiQ2QrvqLJwbmoBImCgo6pMcr2S+EFJdOwIOSmo5gJtzoWJsq7T1Og9svU5eNjzhqtHIBlmcrtc5FFz6FYUMDqpHD3UJcflOb1pvSIM/p84nTlFt583A76tquFGhxuZmtEk7QNYfzJRXmeaG8ep9vqG8R9juudWRp7tbwUW6EG9nMl+ez7b2jI92JDXlr8xxGhwPPFqDFA7ZnRRv9B444thHOvbQKxWFem5e98rB16mZIX7srPCRLuv8hi57Z1KMLzZlKrZHOOa0Aa5SJfJ2VC9lK3Q54ZPvDW2ASXmyIX2YYPA3xQzpb5XLUF+5YQ4SVUlCZl36U/ADmoTwUPAD6sGBMQCdfp/pyluMcy8zCmnUEkzeXi9ovmp+l/Ryn3Z/xe+pmjkliR2wQcLfiXj7Y5qZj42Gk/BP6CTs50u1WCpaLAJt5qqc/0q6xDbBeIepgjadLLYXd8VuiFtVWs3Crazv1vZM2AtitTfK4CbNTGPiYkNr1fJ2LaQOMbrPuqL6+Ira7pZb6VFBWMn7nF81GnbGvv15m8VU7NVeYI27wM7KflMvYmLD5z27d9Yn2O1p7xZPyu7kSeOt6TphW6/z7VdUiZXL/IvvUtztowDomFMygawSWapNuLYGpcbZuyf6ac9iEmhuzbnw0l4pT/XzgaP36luyVK737Gg6ttIx1eU5i8simCl1KxEPlF/M0gQNASWHkx4XkG3CvnaPRyeVDoNboidxbctdGzXTLk8rpV1f9FheL3tOTaO4j0KqLr9VGvidPSyrDrNhNQare+i3z8qzS3heoqbIetvKiKz1SoZA3goe0eJgNJXZ+Co9H6tcki9i9ebPxnK6GkvxIM8mSylFNrluNJy3gv9lloqB6TY+08vvGO6bB+rHEwG/IVPY0ce/F9W5PkipiZru84X2CcxhkmdJeh4nyKNogfLvkt9YzVnxpKWfZql6kU+Xc2ToGkTZzLsB8P1gk/i3kwnarWRI/DvkVJ35jg+VaeFmlp7Pfh8rIV+M5UUcbmDORcUF1+s7BTtbOFuicPhM0Pj/Jmj78btwaFzjAyxwAEa2ezqNfxMbhlh3fhNuyP4h/Rcnf3x6c/L40aenp28f/fLIHF7YFt7STSk99myxDbetlUC32UDBenh+qVzDddMvyqabpdSMbM+e8tQDxQXr3a+6oRhUvfhTgG6P+Fd6YoyeGbUMNK5OhZNDwuCJpsMTXKYf5JmS+XwuZM9isHO0nz0RPQ1kviPDbL0ipBcC9fr9zL8cf0XyKiV66LQYcxLU6VOR3EmhqgAWUlyJTD1AFMb7QflOzYr3g40RGPZSWx6qRJXd5WBi8fwV1EtNPNtwVdPEQ3RwLZZzFf9Y2c3OZsFe0dVAWa9xgCSxn/ro7Cam1gS8swMlj/hAlolaLPy9JBNDhcrMc8VI0Vm62snrm/IYqCO5AmltblHNXO9u93l5nNRKHGieKllc74+njoChAToq24eHV7WWGJ969RNumS19IHaj3C29yy6yfJXtkd7+gJVLt6HeWEGhxpMLNGjkU5xm5N2c23gn5jZ1bghC/K+V3LDNeDp9hKT0PC2UyIR0DgyEA3BuUGaMxaZaYDRdKGtySdhlAII4cZo4ByTw4ZGxRuO99mzn/E9Rb7SeaaWkZL1naE6cC4UeVCCckqloxpCXoNkGoY4nFwizBnO/AnN/GwzbKM4fikbjSSlnWwRqaIkG58aKGvBcbIUN+CLsSAEvxa2j/r8KHYLgD2FiEPwkQGd+LDb8fJ6fjedvUWb+RZCneXgIYRcC6MIhHEEHwgDaEIbQQof0JoRNiCBsQQhhewRCM6Pn2rlUv3yhF0kyku32UrruSiNUCAjwFGw3brFemRZAaBQ4t4qHpRtjtl2+FUe6SFpVPwwgBGxsCzpgHOm1Bz20utBpwVEHwqgL4VGExyKh2W0Bnp487HQhDKIWhO1mB6Kg1YVmcBhBKzjqQCdstaCLRcIo6nYh7GCxqNU+7IwY5HdV3oYOHGIDAmpDi5oRYEuiLjUmwPa0O9ikbkCtwnzYsk6gWxe1IMAjduXUTJRltTent1Ojuutpf2axl2aFwv1Xnuw9FwOtxnwuvhMVQNjKM0i43CluCZwZZG7KSnAlJ9piVy62CzdaQjkJ2FvkQpX22WCfSxQ//4N2Mj9J53M8Rw/KtW278zoIwE0hYqFgjsx8jD8T/FlS4gofZ/gzxR+ULw5AIdePA7jGpAsR62OCFjsvD81ryT88PlZGKr05wxV9WWGGwSX6Al0hK7qIAzhHiG+optgGOFF14AeL3G8dK+aRcdUid25I8Y8bbs+PtL913rJ2HDF0qdgGZ8lS/aVv7jdROud+FqV37ivB8ZDe6jslK2Mh5v1alf9SFn8nuNRPJ4Jn+umT4OlmU5P1zD5DcF8NPTrgKPrR4CiOPDFarw8OLH8FMw564VwIPqs1FI5kOu3g2zw908vW3oGr3IM958CV7gE72FS+BbXzwNbI4imNoDrkXSJYlfwHT3iH67AhAS1Z9dHazHIxMPCE/xpPvz8QrksBSCofA/Od8tFhCwa6TBkbw6LpM7XlC0yuyhJS2r21G4pO0jwVrvAfifpA2GuBhwQwawr6zcXTmSX4Mi0a8QywpMubkPLUCxsEFoT/UAxfosXQfarccOT/icdPhH8qhufKSVmV8EjgqYEXljntcguZ1DvSfN3VxmyE3tP0hO2rnqMRl1W7qC3yL2q8sskHFcDeawvZ52rL9Nfpi8GveAg3/lUNo3bH1UdHLFvjG2tavlPuIejJDhl38C/zQkj5H8KclHWUe4JhJ34+URhgJTw+7rrvKs7g+z6xjbDNgLjEWxG3IniGzOB+yWPgiYib0WHnEH5DlvEemcfvKLN8EHEKzzVn/CIczNNl8KVKkAxeotD0umKeJsuvCP8PDbULD/DtJ/x5jD+/4I9AdpcRz1MxntTAxwR/CvyZ488Ef5b4s8KfGf5c488F/pzhzxX+nOPPG/z5pqghL4UT3Xuk0PT7WZVNK1NeqbL5L+j9ETbnBf58Vcicn+LjO4R2gj+fVNyF16rsCiY9xZ9H+PNQd/yxcE5VuSgw/3K8cFAD5Nz8ibD+pJz4c6riALXap1Wx6N6f2IgfL/pC1UUf/mtF36r4FR7SfGb+3td/rQXh23+2IEDOP6MRPff/VDyD3D9VPC3P1OfsDsb32Vov72q1ZUCvc9KSslTOcEQGg5VyyEdIKH3Sh1m862vZIdLIxrgcG+djbQnSXf1D0G7T931Rnnl9LBwbufXZX60kUhiBRQ7VyHWNJskUqkyjZUlI74IH+RZ3DzFMijklw3NX4rl5PAkDdMgs7207jQjbaaRcM/B0sZFs0NuEp0M5ct0S5zdmk2O6Lzbkv2Z8fL4gLW077JQVYjPzusK8Prcoh/lovQ7wVJV+6mXDFJcZMVig7CUYzm+TtCMLZFoWeKd4F04Ub8InxaM2zjL+CbmZG8IDfISnmN6BR4rjIuBGR/Cn4k0kEB4ewaniek7DC8XDNrzVuZ8p7oVwX/HhQSbQupYSLYzl9QFgnA4xvtwT2fQADg7gIEnnwmwu64/mFXd31UuaFcskSSepyNTepbjMCZyWFKtMByN4ovhEOVIx+I2eMsXgfSWdh0es914Nw86IR4APhyPepIfuiB/SPuJ3xb8qx6k9B0r6ibrdO+iRtibNPtfH0ZEMeNf6GrZaeKpo6/uR9T1qd3oRhnawvh/a37tBL+oe7sC3vJMZgw/UYtPKZmAa2WYMniv+TTm/KwZf6OmDYvBS1X7RlQ57y5NI2J5EN1qDjZLAAFe/YTaKQ5Q5UDRIvbCX95HmJc/ZJmp3zUvU7jJrYqJQ7Ibbp5Nkn+t4PN/lcm55RBM9RHXlEitPiOuRoa/Pk0YjcXMv7POU3WQYykca09fG1r3frsAL6yqy3SpyqsLNqH/o1JLymn9SLTUYyDbMyRU8UQx+VTZfM11vhxHFSKortvGNEomJcYbiUNaXA6w7RgRbGZFQpI7ZVjGdrN8/7BkhRvajdnsQtduxZCMaHev4cNQ+7LXDyEiwAacgJOhJbwKSeKHle7xhzv8UgfxvU0QlqTMnVfAbHiGolqo/KjE7TepAWmq9rp5l6SMTGtLWErjA9VeHsdOyc7m29GQ/6FX8uh+J5iASzVj20AzTm+Y3Gc9cNcxdd4RBUXjqZutgs5qlc+F4nmC97B9YRRRCah5Kb+gUDxuuM3RyC4iV/6T+JyIq1rEUP1IsRRNR8Sf174RU1AP6k6oiKuKjFVJRQzUxFa/GcvhYwS8KhAQlQUrIJKQScjniPylLISIdPIBZjtu+FSWuHjciv9pv0hDy+p+C1lp0s5Akg6TocF+fsexjcMR6CZhgYCatmVB/GVeRTl12SwRnH0UdQjE1URXtJBNVMeN5efD+Y6rP7ZvTvpl+Kw8Cy/JQv35VsgytKKQdW/EXtRVc8bG6M7qinnAZxT/rYiYKr5h9xBOhrHSudGqnyI+G6Gq9DtlFww7uyRYDh3a2wn8jGP3Sjm7BA3STWVDMSud6O0e/z7uYx+O2u+acoGKZ7qAGSUCCRmMLxDuFkXwQQtg43K7VUt3IcnIjiLDjyYFDOfUUpuc1RnjyFwx2+0AhEzzhL6q98cLl0gs7LP4+EJ3J6tKEurQrST7cEiZpp6twp2vx3DLr6U7W0+9nfaG2s75QVVaq4q1+C0H4j9Fx8BeNskf4LJSNuKXcOVaBtPtN4eFg81e/C/+p8rwRzHT+EI8n1Qe95O24XLpBx2Zjv16XneEmpdFAMfqYZ0Npbc1nclsXQnXTDkgeH+t1tZceo7IBwzNi5EJ8WElymvymzzabJ/z7WbFGI3Vd2Kcs2fYnhnHHvpnjKTpd8hTS42Me9sovltZnKi3Fh3Z+4sr/JlBG9z8L/6uAQj+dCJhzIwdgEzX2FT9VFJmxMBEcgn2ea2wgtX5TQ9fF3CM+J+3IZ2pAwGLKdKrKZSfqY64eS/lWoag/H7juHCMwDtNq/D9jv6j+x8Lz0EPNQXrweIKZTlUZVeWV4HOQtdoDYf4cMVy0w570PEZDk6O/VcoLXN0kX5ZJkG1Tjedhd7WOx3rNqpaZbrv5MMO/VTsd0+tj+puNBuZvbNKZi7HQ5Mh/qDiVfYg74JJScaRNM0NmFlrsR59HrLfVkrK124KQHlOg0CR6ZMccMQOTaoCX+ukLulzjwzsBM/30ScDUjBAKCC9Un+e0oRP+K9zCldN4aObTIzXSg0rLBW6zeqfKEEZN+DmfD+e6o5gbu99HJ5+cz2Dqugzo46niOYz7FBbUVIfBZHgAWZ+vyMdpOcy81QgPUc8rnD8WLi/uObmbMJgYwqCUiQbqojmY4oju8ym7meY3unco4qJxRtfUY7nn9cyL54F+csORyyP9MsPkqccjMybTvtlh5XyGm+q8l3seSRVZBTTY51lF4p4nR9g/lNTnmm73MYiPo/vg5J5JZffmmsLAJPCcQeZ55JhGtnqnPoBozv1QTBpEVk+3IKSx04J4whNXDjOjLUCK4wll0wFHjTxbilq6Smy6Dh6LLVF8oZycNBl4pBXbkQMRFfbUWj8W26yP2uWFtP8PECwUPIA5P4SxCXsScBSFnTkPm10Y8yaFf0FV7qnSKxapuKs9RaqD+pEiFsE5rlv0+Xy9Tvd5gn5w434xoKWEEOjyIg72eTpwUkK19QWVtC9ok01vLC76YaCLhl2dFuu3Q5Mfm57zFC16ycBqcZyahI5+dUz/bBXT9S5eECt5hRUk8oIfwpy3kCbpIAHBn/Nmvf0Ya0yMKZhemjgZzwnG2CDDdZM+xg/K9nlOgua8n7BpfkNyBfUF54yqHk9VyV+Cfe55ibG2I9EOnGyfCPUvylKcJ6gzECpV/YxZ6GviNSFiLE4QwxZEwrOqn60CYQiH6NFtZT60Mh/uQG/iHonj9iTD4ckHFvrizCR09KtjEG2rNC8sIxEPmMZY4GbQZEBSnha3pPn7TwxOTMGV0dTpv8YmPkAAKWYhUwq3JIuz25MC2bOJboz+0I8Eo50Wnfnxv6phMUK/Mqd+d8MRw5gtyEvoPRpBgXaHAAO+aMlRT1X991Sx2Mn5SxIIzOe8tJIo64UGkj9BdoUHKHEyph7P6Z3K4UltYj+Q83OFjkiUjKo9hER/NZDfbCCZx9MaSIZASmorjqnHPdMskvOUeTg1JsBLyYc3T1T8VsJvqOh9jz+/488HVPkCfntG31r4rYXfuvitdetbG7+FHfzYvfWxgx+bEX5sRvrr/R2wumjYsb928Wv43cLWZ7SUf6A/tzI0IytD1N6qoBkRiKiLWVDtiTCCqHU7D36s86AbwGZUbz2vpG1Xuic8R/Rbg6M4sI8K7ojPjkP7gw/io2QN4f8udnZTb2RpOJwpfq5n6Ayn5nKoXIfsTCNmXE+F/1wMVUP4TzDomf8FLY0zNarta2UKuhRZNgaztaKv71H1gxwSJ9sXDBPj6ER2D9/9+3++ffTm06tHrz89ev7oxaPTt1bfPsvavVGShHcpTAhUhNFTqP1QnkfyyxcKy2n+kpIriKWXmfzZdubnJvPz7cyWMcLaUGjtkfDHlWUx7WekscsYTuF0EOA2bSw8nkKCnqV0AlrQKSp0mQ05nXj0n4mB8FOOeiA/BaOkunPL72pXWxZHVVGSNVKO6ogfLMyoAS6JpxP6m9qGk7uQO8115Fvhv1ae8Av8SRR2UjYaJHAlyjwUaiB5FnshfZMkdiUotrhkLEWRD/u5BJT8l5BB5mn+qjyyCCfmb27+Zhg8IyGxxc8U1cSAKABdgzWmhX+GeGakbCM/N44D5Z8JqgPLuNgyzckL5XKl/xJ4fqIqQQmrx0SzQZph0lLTxB3zApWXmJsad8d3nDYUmPXO+QJbE0WR9JIpQpjdtB7rbaotQ6GOXyOm96s+65MYF8c4NNW48arLeK71WA5oarxWngTVf6AolMkDxfTsWwKd5hb+BZeuQl3HxbF0TS588IR/ATgMNPgXlF6+VDAoD0FxubLX4XfSuD2irY7zMq7GflCF+74oJ9C+wvidZ2If7yhpRftc+W9Fo9E+LJ86R+XTYbN8OgrLpzCoEsOweux0OvqxbtKJtLwgMAilcYLQDhF1vk/2XNANJSU7qZ7wQAp67kkSE/rCnwmDmZlgYERtTetIFCs84f0af34SGlErPPdA75oep+bvTHiU/oD+4hzzHwg6PvGT4NL/VdhC6Gu55UBCuPTvY4Qz/77wn6s72QM2pHai+lW4pjq8UUH/tQ9VbSsXdB1p4tC4rteq38Yo2JX6k3xkvIjoch/7vl4TtY5Fo7GP7G+97nQ6nGc0OK19fmdJmtQzsf2preNF8MxP8exlqhA9+zzzH2gCo+GCnaKU75mCQDuglrCxOVfSUeyYX0lHsruaouuzWms6cleuVlRlwgfiy/jOw7DJoPxaE1PXdTL/Snjd4+MWCoGaa2X+BeoE1uuon/nXahDEHf0QxtSIazWI4ibINUb96+jOE2+Ua7xmAzliM/TkP5ohnEgnQ35X56EU4aeoVGT6u7Ej+HpRSHkIZZvBINOg9xYy08RpH5pOEQciGgtoImXQDM1D2DwyT1088nNfMHpx8NH/gv0KmKvfnmPf6I34BKW9RBS0ttN+xbTudtofmIax+XVdOI8p/SdlUsxb5eS0m6qV1beStdLaJB9VI7A7TK042K35MR5xWs7n+2VHtALayvHLVtt+qdumEXV77iL3oMHADCeon6HB6hz1SsomcGVT/u7vD3aH/ShJ0Fw5Kukc+T3xoS0kVKYJ5JmSO5r+SnR42C2tScQMruxn/h+iV0pa+OLhBwqqp5wKIWCgE1pQxsFEyg6GPdIXlHT+pguk9PJ4uvk+eKnBu1xuAefBhvB02MSpcdi8jQdNu9VDFRCs5AjUMy1oUfupAwTgtT5z+HeNlzzYqHKODKnH7kiPo60UUKxXArQbfhRiw4/Cuxv+h6oe/kcb/scPNVy3OAwI12HwHWQ/V6xskxsRKTUaznZTbrelmqPIFHUbiGWWfKNidBsC/cPM0iwdtBhmfqHoQRnppF4aJA/MtHwrqfsxrRwXarBjGd83Node6YyNwl6j4Xyt18BCsfKjZZzUBmli2XOt473UVqflEIXGkZaQjdjuuqWGQ/GHiPv9kFY7PakrqGqjAWYIsGVVp8sEbDBoajn1kfghcKW5mw7vKhY370SC1orbeCABmX/SA69RUSbRwmzhocYa20UJJqLojbrFhBy+nFRvDUKSf5aof8k4d9200dj+y9hNroXvTwrnhKHeuzP/+N+8n+JOY46+UZ6Teynt4VDoLPQqMVe6K2Uvjk8Uhg/+y6ElI2KiwPzMcS6Ty29Ib96JMgU4faRC5SPiif3/QRuXcogTZuQ/0QyDzOoRx1tamug6UQpinU6HJoZcryPLpcKIi5SL5ivTS5nev+IfpUPSkWYrQu0hPT2vlFzPKy0XlBuDjMVtvQG4wGmsI5nhytukQz/ON+nonWumBxAlNFrPc/0HkYVBLrYl2tuMpQwdtM9RAEKxsx8MnEhLoAPn75iZlbIlAOmkLeFHQ5mIKsdE3IIzEbcBTeq7GFH3W8ugldfKHaKo7rbuDmHnmeAe/lY8FsU9FodWxIRyl0nbEoMpL7L2mHRXzFtRRzpccqFA+c8FV/j3i/n7Wuj0r0r//abdqV6aS8U+m+RXSmev7OjoDFKbyumtsobT231RXlSq/F/JdwQ3dPjnKf4JQyTXgdeMLbXco13LLjpwaM/7BE0Mwp+g/UX4V4oOvSaqT2qWAbEresRTKKTagglHFQQskYXBihgGzPiq/0kNPql4BVO+ROXuAv+gufqaHvCWCrjQj6Ne0kfNA9m4+2i9hKK/IsvGilVaIgXLoXST0T6/WK/p0cNQ0df0MtrnU52KaQs2yTOVZkthDqxHmp3ThTxYZTriHDOnox5LXZc4Ak8h6yeG4T/AXWDCMzQoFkYDdEfDSxWKo/h4qBqTEevPaUPnefWFgEl/NVjFSY3+Pw36nS1Tgll/SoW/8K+VmXaklNEcGR8slzyQvBUcNTtRq9U6NMrHoNcMjX8lnujgIe6kQryej6SF0iNje80yX46080L5GgY77027ZGgqbEa9p8q4RVmw1HbesjryFGYw1Uqtt6p6RB5ZWH0j6Av97aHO67/CcD066VSXoSQD4b5CzclD5ZH/c9OoDl+o4S/YGrJVKs+zrhlCY2rYcpv3yJkalPZixmnwWLhN97Dfb9Js+KV6c3J9JQkpStHbwsl5wlic84RLtw15n0u31WiogW0oYnFCliXN7LWx6Eyze/iiKutVS39x7IDqRL+ECm0D8aL2IbRLy4oXVs+Z14KWCY9o3KBqk9gvaJwly1+T9a4rnKL+Ha4rfEov1PEBDa7dsESxG0KBGDqzhuMUh3GieWqjMTdrVK0b9VDbCoqUrox+NXv5pHWoli7oodyKS6OnB23iKzXsTAxoIx/jokdmn1Oprb61AePFNhjVx0N41uGAt3f4s2AZ3ACiF9QlhaIOiPGRFrRiPaeSWOTCbUVIBKZFx3jvZlq2z0tJiiv7LfuZa8CQu171xkCSB67kKQPtS6oV3rjc0oW1eEh63yrADP9JeIvWecnrj4glIFIz0kDCoDql5bW0S0r52iTfxK6VEo34P+0cIb5jlnKQgG5epVZivDIgzeOZUT6ekf5Rj3dOES5Mmks6do2W8nFqUnOFf6WHSnYEW6vUt8FKC5qsockamqx2cZwnJKAVXjl0UBAjR/vhpWBGrZyoY04h88gcgF9gy2pAKdoUgD5HgkR1UarQbxsMWFncyLpnxg5zhsu1V+iYcSjeFgTARWorqBayBphITuSiVosUurA2PtWN06CVoVKEyk1rTWM21QSrI2yj+t40+cKYOBL0vKKDEk0W671ii35re4fen+BrjpOQKNygD0yWPgWYyPGQiX+pbUV5idF/HbmpW/flLiSn/XoipZWFgmIz7tpjIC1RntYoTy2UkynhNlrs2Z1WTCGFU3KGrWCwrSnuZH2e49W7tB7gYhDcQmXa5xmj2f4CxdEUOYyexXYunNH1TNa2k8RinDgDyhnJjE8bDiKOZ7RloH22o1bf3tAbS8/uPvb1D21j5dYe1pH8jW4sjZE+KkS4kce8tMnRju6R1q7oveXxiWLZX28gK72jobgHZhuZ6W2kwb9Jvb2dpP3rG7VeU9dOFLu1w4TKAkfV32WEozLhqJqhc+V5uBqU2gur77ZfDGbEHTVmIk3Ov7aTJQ6F1j2Ss2N8+u/ubSsyuf+/RCa4sSiHYolPZhg59bUkogn6/L5Rf01P0O4TJL2bRmkMh3yueKViISrpo5tDVZY8DnQzjk9MgT6+aWvDyuj2tgmUrK1Zo0FyScBKFZYh2lpCqfCibUIIjlxSrdxbNzeVxlTvRPUMrS8VtW2L1kOvSt+i9gmijP7wCGkT/WJxhbuF9W0KnShj3F3pqVAi37TzB0l2Y0CQXHAbWxo6g/83ZI3i4BPJu+0IfpM8VXR0VfA+xh+C95Lnyo4+5oWsztBk8LvkmS4iMwYfqrcsY73fpT5s2mlBhN/0W9iKwETpeC65VNW9JF7EKkBf7vyCQJ+XYDoQwmET42sEGCkEvlTwMSDJYYQ/3TKEyEtZheTwff+9BHTjwYvoGPy6+6lpPvwh8cjgc8ngJ3r6Ihk83sr8mzRZf9lNxvPJR9A6CttNHNAMy/+Opml6+iCto0Yy2xa8/xENRCzcsFMznOw7WaJunSfPbpuEaWWeC9qTrQRtxgpBEvoSfc4zf4nXVdC5i36AkQn9BT0teeYLCSue+QrVEXjSPfOlxMPu0/KNjr4vMAqwLn6N6mB6uuCZf64Tz3jmZxIuee45yFLQDH/FczyiMRO4G2NwzlNXu+S0GbzhAXzjAXzmAbzCfXxs/Ih7Ybs/0QwWT3WVBg9inHuiN3bRRd11R8fHE5i4XF+CKPlyOG7MRoYzf+b1GRgYY7iGzzDx+GfQHzC8Cuef2U1Bp7DMQQ5Za+fDTuMzAXpTfoPPDTzr+lkf5eh9vquJN5mfSh52osAo+vfE5nZz37h83EDMfka0Wo3b/EXvfwy0xsRqOG5MfxwTVV+//ff7+u27fdV86w0see5dItv61l+WRphv3pJcDfrXjcZZGdejvIxymuroMXsqz/eSsdw7w8hLUDXnqGqOXnUvqOmv+MLDwB0YoGk3uofrCmYIYT585bp0uR5pxfa272KVd2amQNyveO59q3wcZP+C3bziC/fC09dfCS49co0S/34LUGMl+qrnumons44GLnAagcKqbfgX32v0hWn0poyT+4pf/D/AEZGU6ke9MktBWeCv3pTHmz1cQ3eS++FuGtORzqj9VN//aFUVv+i0cA59h1AxBsCdBIpT1RjhJXOdeqaw0S7oNHGaET4YMOFRWIHZrnZOlxnNf9bz9K8qX363ciMJneP+9aqfa8/Tr3zS7zd7qce/4hT+enzchHGD1ogJI8FoLmg7uRI8B2Tz/LyfDs691G3Hbc9JvXNG/lX8qp8PrrzcjdqHcdQ+RJPaFRoc3gg+1jF4/AVWZg65JlltAqgX08JeBXmCF6eoQdhqdeKw1WrtxmEJTBiWVMZhJ+wGUMgY74HC2BdzehxLjHyCP0v8WdETxiWZ4tMU/aRf4o+QsQSl8D4U/CAxbYFP15I2pnEAl/hzhfnOZR3DJWDwpnrFoALwTZZRUzJ0qsTADRKjKL7Cx3f4cyJjZTnzzbPdy47wmtM13UG6tnx9x5k+HUsG5qDKXRW3TidiztDO0WkBXfJcHwXMan9n7T7PqFanvEaVUfVOdcMqOlStRWl3oiFcZfzmhND8ScYv0Xcj/kPCAxk/lvBUxiKDRzKOAvhTIkHAQ+z7qYzbRxG8oGJvETEbmBk4AcL5leD8RHB+ITiK4IRHGk4H4XihBtQiQAEBCq0QVNPMDlqONgVNUnMYwwSWYK4ihmu4gDO4hCs4hzfwDT7DK/gK76oAE+jTZb984sVglsUr7eo8x3AR7T6f9+auy94N5+WxL30ARZ8/eTdUw/EIQ5vglxVP/WcSljxs95Z9HtKe8t1wOeotUTefJs6qj9d1rPiS1L/LUuD/5L+VA+cNn2ROSGY8vECZv9FPIT4hYB5CwGJzFnHCw96yPzFV4K3ZrqsPyUzIvrTiEwziH8Kch1Y/0sRZ4KFIWHgc+wRBf1Ha/uhCdzq1S1vf9Trc50tWf0XgJ0NyQjdANcyT4RwjQp0M5yMXYd7CEuqOhmOMYpAPT0qMjfiY9YpVaoIoTsZ46Cb+zF/xHL7yT/4jI9v16EsYf+af/E+4In3yX0vK8WeZYyqSMcYWxSwPdJanOstDifz4gqNFD1s9gW88wTGacbTeBXCFR5CuMRTUCs75tReSjzm6vfgv5OC6z5/I+Lr/RDKygdsfPvmn+An/sG2zEYpxb/gic3K8khKmIAzpffJPJIMzrG3uTeESH2Yw4Ze4x730+JkRPJyLfn/K3Msejf83V4z4m3qne6mH2YAJexeNsx47o/Bm2kR1NnAuGvzMC+HC5Wcspu67LlKc5+EA6WNRSH8af3MMTIOjsqHjUkg+F41zts+vtFQRcD5tNJwpXzH45upWzzh2YUEvvWV/5mIOIqqZOx3BAs8FspnrApEbtuzalPzPEHzFLxrnemLgQLpXIz7PnBms4JuHCWxjnIcu6BQizam5N2V4lO+iZ/qzT/0xfaSeIXGsbOLQBZmZjd9cPSY4Fe9C/N1YL7fx1FB+rSfxCixr9eIWK4O5ZmZjuiZigNa94yLGP254XLAxH2cOutxlIOqbsqqsfZ0VDbuY1miEGHSyPHgxVCPc1fUISEKHpD19kNeIYDqfBkWAvOK7mffGGJyGjLvzzDnq0BLEHOlllRVyTAvJtSULwEXGb+4TV39SraTtVovBbzK+zuA9/m7g7Edy1QvCZVbHeDZ+8U7pWn4hYN/ZcpNX/gn5qaBA1ld+KjEplX2Stdh6vV9n6AY7GcKQMdvV+6qumQv/RA7OsvgiA8lvnsk42Ohb0u7bZ97MyVQMRdTqZ3hs/VwOM2SHJiqFDjJjpR+Z9G6wnX5Ypnd34Sj/ibTCZ+ErKP83yXNI+ZG5zxZbmG+goIcUI4CbNiPUaeagdHguAQOoIlkK/42EOQhiYbmeJ3hB6jM63i75HJ+wX81ouzntXsrbPX1ykzJNyqqXpuqexHkxhmnmRLrSZkQLOdUpTZ3KR3WX0TqN8f0+OvVthC/QT+U3zCclPwLhK8UxNyYo3tbtwzqIHM8zHRyzujngJ7Fz65MOsn9wihGxLnOJ0U8XS3XA7DCYb7JbBlc9e++WQcpAOi2SAohe12vj7E8+/ruu8l7UK6pVC7U/GOVSKLSBo8JIH5bVxxeAKBkPPaQUPqXcbUQMPjt42UQBKz6HM9wW1peWmJUXc5vFl+g91jtwia5DNzWoWs1yQqJS1JDksd9sd8I252N2Q4Wu9KmLK8ExiKL0l9L4uNPjGwf/wJjBVweTNPBuWAPXBzHoj/+75GjC30f/DmzNeu04n5wuSqq498EzKOwfzbDewk1yKcUEb5zGO1v26NrOg7KaahuF1XT3+SenxcqiSxM424qXv3cp1Cyf3l38tdNicEEg3C7sdPyCwUU/bK/XF318391hrtJsmq/0LRu3gUt/QgEsL0D6Y21tSDnh7g+l0ZhK3g6jxniAmDuKaegRnVuyEiI1rsaKQI2hu69P0uLrv9319mGz1dIgdiAYrCfz8XmxVwh1Z+/q0f2icN/YbYQM4zkTxEajZajK2SaXHXqJ6l5G8YlDpzgsyD8pPv4+0G/fAdqsgTbjEm810A86OuqYEv3HuvH/etNbdS0tOshKpQfVQE1xoOx6f/nLzmxXw2K75Ev0urOqbtdVt2NyAje1NxrODG94kjDrF/RSMJgZMOZUFB7G0MejMPsFN23zsBg7rr4kqqwbLognzr7f9kTqxme1/SKF1J0xul6r8PgMjeczQorHZxo7lRx4hVcyIbqCuoeduocd7CFGBTekqplaYZee8QCl7guOgRdnqC+y+vsFD2L6U3lcvemO/aqGmIzL2kVpe7poNIq+vt/vP+3rhdVALWPZI/orjeitbh/W3T7EbqNR8N/s9sutbr+suv3H/2a3/yi7bfrbrfvbja3aqbt6IpXNGO+XB2awHRXTKxcIOdm7TItLjEV9B7f66rAtjvUcDy6OZb9/1AihXKFCVrPocqXbVvbVrT0yzKoqsMycnbXwKKiyH9FSvC/9eeV4/cphEPXuWhJ0fVVRYv5t8rbqWMZIHP8qTxTTeltIdvOgbkEUdEz3jXxw4jTprnvJ9/c/oXLiNf58ciJWbdmrFjS3N+wYmy/DE59VhiOwm/PaiRhcbS9dUQ2tY6c34+1l9Axv+9jDKyTskdsgyB20HzWxIdhFjX1DEGO2z1GI6Iedj9qpenelLlQuRVmT1swWdy+KNCMN2O3hbMF38d+qe1qz5iNizSU7Joq2mTI64DozPifl0cwGmyi8Y6bkufXUmuNTYvHRain+DpUedYzg0MJuXEv+yWkz1PrCa4dEuguTFJYJC6kloRaQXISF+lG3s17vS9pHYZF+MzDoxbTBAdqBLsfZtcHrQbybspfLWhlfXF+e5fPiToni0uaFRzUvPDqMddg8/xLZ2UL2mCHlc4kuo5juuqMR/4Sprx0TYKYXHvXxU4/dyhj0pH+F+4hveARY4JNClnCFr1LyQ9rj6D0Npm7g0jxLuYGn1o7wjE9pD487nfAIlnAJEnc6T0HSTofqWeJWiQBf4tMtmxoaCUqy/K68tY2dmnMedbewcy1dHCWjHektOPZv+MnB6tkInEV9SgHtiu/0bYZhp28m04Kx13YmjWWDOTMzFtXdjhiAsC6ouXbk2uVxQGxwJGJfyl0UnOElSZpcpFiI8V04QFnFtAWd22e86SLzAuQUeq0JD63moCjW/Mu2oDJNQzF0g2c0nMMfKBOG7ifnEL8d6lBchKBZv8L/v9M/7fvveYZgS5xfbLRJPAqO9MawjvRAyDzHSJSd0Z1E5Xm4LBZpdo6xn7088YgH3klg9YTArTfNgEfWDPjTmgEPyxlA5B9q8se+wyP4U0+Ah/YEeFRNgD/9Z9oke8of4iOhjibglay8UE7Z7TmybVf7/jSRineogheEGutyZmxePT7w1urbs7JvagP36fm0nt0RvCBeCW/hme7bfbtvb03fFH+mnwwnMb25qy8lN/xeLwgpd66zW8vOUSxrJwCTGgWlrIH8uujzTqMx71Ng6BuUOch5ZaW1Cbu6hle0S7eIkZKCH+UhC33WqbFfPkWtgGk2dM0XJRQzPa+Z63xynOsakksvUYuxft9Oxwq3st1R+2s7B2CzXV6n6H3+4laOOgWsZX8BZQdYpTWJgnY9NKZ3zQg/E85uCYpWtk7rrynZWIjvoOSXihsYDq20zTDWmhiTM6zHPIylPmR/4uCD3mC5/JN5e12lYrfL53dSyyYVwKgGGMXV6qGUHnn1/ZH/ixFX6v/TEf/u8Oz4DdwxMFNVkYo9SmG7ztysUdm8Y2zU342NAdOqwbSMNm9uswISMFfenGD2jZCJo6q8GeBqdIEyWyZ/0InnVl8RxLkYODMPmSlG0pTooj5j8ZQSTC3TWvFgS7ZbIa5nxjElHyb6ghzpL4fTEYb4A9edapvFlCeoh0BPOKPF+HtYuQ3FEqtJXDaSspY6ppZKNQqCnd1FFLTvQnE+THARpubMMVDWjt9VXbyjd2HPhJGDcIey8vjcBLdZAV4HjX/LLe2qtDbk9SqVeCvAsIXlxvBcb7sVrOh0Myp/rY35WA7GMW090VuD7VOZ21pUutHhezpUvTc2iYd1dw7L7jTsLTl2yt6S1yGqG9g9drvyks39SPXduvpubAbhjIdgLXtRcFR/8Zpbn8LAfPJalR25VMFvti+htG9BO8/sATd3lVt2IUe7sNFm8FKs16t9c2iaWtOv1s8TOaCWU0pMJEGPbL2m8DpmtFfknUkHtXeCnlbRhfadzF+SGSHzl8blD09w+MvS+ECeoVd0TnjJLJOqpuBMH3fBP9zkBPQUpePVF3R4/Rg/VnHWcVZjhp6gM1TCnKFCv1VMxgvfymsU6B5yB2Pps4Fj8gTbGSi4xjleQIa1UUV4W/K5cLlpR91CbBRmvziuki5cLowj2d5dFWBGyPQ5l7pTmLB1ehNdvUU9s9AxylPkH8Uw5GsZWNvQXhiA1yqNvEuP7Dc4fXGsTKi45fdnsglWY0/ZO2pfmdpX5NuPYuLCJb3NoNOi4D+WRDYIo26VZgT/9Zq0DSZD1O7g0UMc7yW5jqzo90wf89HPeKLgjKO/75kVHZHIrg4KTnwkkSY1NjcyZJZp9M2WV/QlOrToC8Yu0YWkCt4DBOQSop3wit9+sPjlMNKvZo2+HDb1u3ZlKsG3dsB/dnTciaV2vF4JOgw+E+SbXVS+2YUe0zGX/hs8Di79hRXa0EHOtdSucyvBE+0qN6eYhXQg0HjXjQUvcBcgSLu/4BMreKDDbsbawGcFgHNq3W19Y/t51is8D8YmIipel8HQaxdDZZObbmA8iqugbWUU+54wIpAVqM0KiKn9CAXzrFM0r/E7QRXoOWixtgeO+XDYmOCnw8bEvhbL8jzTdvmBF8XaKfCzvoajA6+yu+4n5GEHFP+cmfsJf5UYy5ke/5DW3Rf6phFzB4QAvJIUb8HQRcyNiiamI2ObnxAwwqxdcsus1RUvqo+mUc8rHRNNBrwmipYzc+F7FYhvr4RQLGi7ZmLoWxc3PacbYaWYi3FBFwtv13lsetVobDVbbFmYv1quBQjzVeY0I/ic0bVby/ncvs1e6BsWlV9XWV50bDfrV+Hc0E26DrvZwM4l8rQDrH0ZHktHHwn8BWO+Gc+iTK8vFlH+JJwDvOR8LxmnczGN9w5c9P/geM+m0vf6JHgTsqCD/0SMxXF1PX2JcTOaZbpXgLkcb87Tmh8WULhSS3UJzrA5oGs7DyDBGTYvgeJbdZsLugb8hF1J8SAY2b9xxkpIcMZi0RkqJU3RckUVmZOg/2lRffISs/4W/aBcAfcxuM2NymJpn8EpGJhRiOliKrFeO4LvY9SKcnQkBg/vpZiYW3ebbyokh7eRvJD5RKDXAt0MTGjeJGk2ns+vb9L1GhXtm02BEZc3kMyRnNJyTLfunMWxqLzUtjCUlBjKNYZyjaH8exjK8Uy+haH8v46hBBPTHQxhvC1Lm3UbU4SV9NuY5sZd6EpKdGnqFL7MnLwk8YRIPNmBKbKpReEJxn632HW2fd/e96ZZdROqqrokfJWVKixWt1BUiGDVcLIbrBT56Mnd7PNgKpL5WIkDy8XaNPHurwfn39LFAd7M3Azj8rsnxytK88J2HGLgedVoHGTLyzMh8bLs6wWKvyhXXYn5wPxFp1SDgK+Zc/NY0sDaF7Phbb91cIoLwenmTqBr0eAXGQvMTpIt70KGR1lS/g7DtlTBQxLtRbhvecjQiTrcORwARs/V8VcxZlE/I9pHHxkvbPezukjGvUxLiVk/bNN1ChFkHg87WqfdT9frtH+0Xnf3Me5Rt483h5M/R9BHJzL8FPTz9Trvt9brLjezNalr0GlOxo+0D36hu1p2vsBT6hcoEBT+GV7BW2CopVYEBcbsSaCwot4U6FCSQWFEcnyFwn8iOKZ4IRT+b4Kn7iEU/nuT4zfM8TvmeK9zfBDcweTq5lMo6h1BdK8gkbjAmD7GE7pM+WKlvKcUVGMX/kuqKXU7UGDkn9Kx6R5+wVx/CK5fsKJGA0Hj7xf6fS0GToGBgvDR4uym7FNs+K/CNcVfCN68Rx/RE6jwrzFyTeFf4BUZhf9JcQnWFW5WeBWDa4pshPKHg8I4R0lc3zdEJIPSdATGR1BhHD4TYAiDDQF6/tGOWVEsJUWxlDAcEo84x7dB+xCvh0URvkwhC3Cs7bIKQ055kW4gEepDCj9QRT/q81PF7INCp2WgGRNiRl8Qak5pPxT2LaO3smsBAguYgGanVNlpXZm5PdWGoJMqKKe3Kj29VemtIrcqfqH0BRNWxQ9vV/zQhkJXHm1V/ELdrniniF0xxnTh5qZTiuBi7jp9jjf9AUb4h0cKXuhT2s+srKdV1i94xxzgpaplvvtWvhdq6/rU95jzocLLGbYusdJXXAU6csyGORgZjQLHVLM/0FwKaQIjT3C8TPRSwDdzEv2N4pdyKCg423sKSWEl/IYJV1bC75hwbiV80DHnqCF5GZeP/mTVgWg6pm5ORa+qiAG0+fUvRBkoCC+IMCHgoLy322sxoKBh4LUYi70WbZgz6IKELh0ez+IHEmQWP5UbtqHlrkcC7kqmanw2RzGifNSCvRTjqflQPvqLdCHezmS+PJ85uLLiCvjpb1a8Umx1thIrzvD3C12Z2GlZyZ04bP+ryxodcdoPt1e2ehm2XEZ3FzPDlkxULw+tpBUjyzRcigBygUtCptcOOiOWDrTPhz4kJfluyMfK43Rr4TRnkDEONbInL+xUEam9CAOMYqxTadoBinvKuObwtuuofr/FdIb9EFrdPi29eAKV9crQs6TZsjCIWbp6DU01U671VHjmBBVOOgJgRoHmdDg70gdd4QX3t9l7tb10KiZ+qZn4Bf2SmucHitWLg/JX0lohVH1bQNgoV4AUBWbqXI10RQ4yIaqbzN8x2XgU+nNSbtr4mouxp2IulNjD+HagNPtQxD6UdmX+ht7a5MNMT1dVWia1lKwNSIa1WL8YWlfqiYeT8U2Gk/FbtjE8aHsuqu/NRfWXc7FXiHni45bvRT5dzgXXvOxB7UD6hq4G/jBPz/hJRhG1Jnd+/JRtNqz3f/4v"));if(i){const n=new Blob([z],{type:v});return URL.createObjectURL(n)}return "data:"+v+";base64,"+(n=>{let e="";const t=n.length;let f=0;for(;t>f+2;f+=3){const t=n[f]<<16|n[f+1]<<8|n[f+2];e+=c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+c[63&t];}const o=t-f;if(1===o){const t=n[f]<<16;e+=c[t>>18&63]+c[t>>12&63]+"==";}else if(2===o){const t=n[f]<<16|n[f+1]<<8;e+=c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+"=";}return e})(z)}});}
|
|
199
218
|
|
|
200
219
|
/*
|
|
201
220
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -379,6 +398,50 @@ function encodeText(value) {
|
|
|
379
398
|
}
|
|
380
399
|
}
|
|
381
400
|
|
|
401
|
+
/*
|
|
402
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
403
|
+
|
|
404
|
+
Redistribution and use in source and binary forms, with or without
|
|
405
|
+
modification, are permitted provided that the following conditions are met:
|
|
406
|
+
|
|
407
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
408
|
+
this list of conditions and the following disclaimer.
|
|
409
|
+
|
|
410
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
411
|
+
notice, this list of conditions and the following disclaimer in
|
|
412
|
+
the documentation and/or other materials provided with the distribution.
|
|
413
|
+
|
|
414
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
415
|
+
derived from this software without specific prior written permission.
|
|
416
|
+
|
|
417
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
418
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
419
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
420
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
421
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
422
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
423
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
424
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
425
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
426
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
427
|
+
*/
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
function concat(first, second) {
|
|
431
|
+
const result = new Uint8Array(first.length + second.length);
|
|
432
|
+
result.set(first);
|
|
433
|
+
result.set(second, first.length);
|
|
434
|
+
return result;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
function toExactUint8Array(array) {
|
|
438
|
+
return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function getDataView(array) {
|
|
442
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
443
|
+
}
|
|
444
|
+
|
|
382
445
|
// Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
|
|
383
446
|
|
|
384
447
|
// deno-lint-ignore-file no-this-alias
|
|
@@ -1483,16 +1546,6 @@ function encodePassword(password, rawPassword) {
|
|
|
1483
1546
|
}
|
|
1484
1547
|
}
|
|
1485
1548
|
|
|
1486
|
-
function concat(leftArray, rightArray) {
|
|
1487
|
-
let array = leftArray;
|
|
1488
|
-
if (leftArray.length + rightArray.length) {
|
|
1489
|
-
array = new Uint8Array(leftArray.length + rightArray.length);
|
|
1490
|
-
array.set(leftArray, 0);
|
|
1491
|
-
array.set(rightArray, leftArray.length);
|
|
1492
|
-
}
|
|
1493
|
-
return array;
|
|
1494
|
-
}
|
|
1495
|
-
|
|
1496
1549
|
function expand(inputArray, length) {
|
|
1497
1550
|
if (length && length > inputArray.length) {
|
|
1498
1551
|
const array = inputArray;
|
|
@@ -1754,44 +1807,34 @@ class GzipToRawDeflateStream extends TransformStream {
|
|
|
1754
1807
|
constructor() {
|
|
1755
1808
|
// deno-lint-ignore prefer-const
|
|
1756
1809
|
let stream;
|
|
1757
|
-
let
|
|
1758
|
-
let
|
|
1810
|
+
let headerBytesLeft = GZIP_HEADER_LENGTH;
|
|
1811
|
+
let trailerCandidate = new Uint8Array(0);
|
|
1759
1812
|
super({
|
|
1760
1813
|
transform(chunk, controller) {
|
|
1761
|
-
if (
|
|
1762
|
-
const
|
|
1763
|
-
|
|
1764
|
-
chunk = chunk.subarray(
|
|
1814
|
+
if (headerBytesLeft) {
|
|
1815
|
+
const droppedLength = Math.min(headerBytesLeft, chunk.length);
|
|
1816
|
+
headerBytesLeft -= droppedLength;
|
|
1817
|
+
chunk = chunk.subarray(droppedLength);
|
|
1765
1818
|
if (!chunk.length) {
|
|
1766
1819
|
return;
|
|
1767
1820
|
}
|
|
1768
1821
|
}
|
|
1769
|
-
const
|
|
1770
|
-
if (
|
|
1771
|
-
|
|
1772
|
-
pending.set(tail);
|
|
1773
|
-
pending.set(chunk, tail.length);
|
|
1774
|
-
tail = pending;
|
|
1822
|
+
const availableLength = trailerCandidate.length + chunk.length;
|
|
1823
|
+
if (availableLength <= GZIP_TRAILER_LENGTH) {
|
|
1824
|
+
trailerCandidate = concat(trailerCandidate, chunk);
|
|
1775
1825
|
return;
|
|
1776
1826
|
}
|
|
1777
|
-
const emitLength =
|
|
1778
|
-
const
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
const nextTail = new Uint8Array(GZIP_TRAILER_LENGTH);
|
|
1786
|
-
const tailRemaining = tail.length - fromTail;
|
|
1787
|
-
if (tailRemaining) {
|
|
1788
|
-
nextTail.set(tail.subarray(fromTail), 0);
|
|
1789
|
-
}
|
|
1790
|
-
nextTail.set(chunk.subarray(emitLength - fromTail), tailRemaining);
|
|
1791
|
-
tail = nextTail;
|
|
1827
|
+
const emitLength = availableLength - GZIP_TRAILER_LENGTH;
|
|
1828
|
+
const emittedFromTrailer = Math.min(emitLength, trailerCandidate.length);
|
|
1829
|
+
controller.enqueue(concat(
|
|
1830
|
+
trailerCandidate.subarray(0, emittedFromTrailer),
|
|
1831
|
+
chunk.subarray(0, emitLength - emittedFromTrailer)));
|
|
1832
|
+
trailerCandidate = concat(
|
|
1833
|
+
trailerCandidate.subarray(emittedFromTrailer),
|
|
1834
|
+
chunk.subarray(emitLength - emittedFromTrailer));
|
|
1792
1835
|
},
|
|
1793
1836
|
flush() {
|
|
1794
|
-
const dataView =
|
|
1837
|
+
const dataView = getDataView(trailerCandidate);
|
|
1795
1838
|
stream.signature = dataView.getUint32(0, true);
|
|
1796
1839
|
stream.uncompressedSize = dataView.getUint32(4, true);
|
|
1797
1840
|
}
|
|
@@ -1966,7 +2009,7 @@ function mapInflateStreamError(readable) {
|
|
|
1966
2009
|
*/
|
|
1967
2010
|
|
|
1968
2011
|
|
|
1969
|
-
const DEFAULT_CHUNK_SIZE
|
|
2012
|
+
const DEFAULT_CHUNK_SIZE = 64 * 1024;
|
|
1970
2013
|
const MESSAGE_EVENT_TYPE = "message";
|
|
1971
2014
|
const MESSAGE_START = "start";
|
|
1972
2015
|
const MESSAGE_PULL = "pull";
|
|
@@ -2034,33 +2077,54 @@ class CodecStream extends TransformStream {
|
|
|
2034
2077
|
class ChunkStream extends TransformStream {
|
|
2035
2078
|
|
|
2036
2079
|
constructor(chunkSize) {
|
|
2037
|
-
|
|
2080
|
+
const pendingChunks = [];
|
|
2081
|
+
let pendingLength = 0;
|
|
2038
2082
|
if (!(chunkSize >= 1)) {
|
|
2039
|
-
chunkSize = DEFAULT_CHUNK_SIZE
|
|
2083
|
+
chunkSize = DEFAULT_CHUNK_SIZE;
|
|
2040
2084
|
}
|
|
2041
2085
|
super({
|
|
2042
|
-
transform,
|
|
2086
|
+
transform(chunk, controller) {
|
|
2087
|
+
pendingChunks.push(chunk);
|
|
2088
|
+
pendingLength += chunk.length;
|
|
2089
|
+
while (pendingLength > chunkSize) {
|
|
2090
|
+
controller.enqueue(shiftChunk());
|
|
2091
|
+
}
|
|
2092
|
+
},
|
|
2043
2093
|
flush(controller) {
|
|
2044
|
-
if (
|
|
2045
|
-
controller.enqueue(
|
|
2094
|
+
if (pendingLength) {
|
|
2095
|
+
controller.enqueue(concatChunks(pendingChunks, pendingLength));
|
|
2046
2096
|
}
|
|
2047
2097
|
}
|
|
2048
2098
|
});
|
|
2049
2099
|
|
|
2050
|
-
function
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2100
|
+
function shiftChunk() {
|
|
2101
|
+
const result = new Uint8Array(chunkSize);
|
|
2102
|
+
let resultOffset = 0;
|
|
2103
|
+
while (resultOffset < chunkSize) {
|
|
2104
|
+
const firstChunk = pendingChunks[0];
|
|
2105
|
+
const remainingLength = chunkSize - resultOffset;
|
|
2106
|
+
if (firstChunk.length <= remainingLength) {
|
|
2107
|
+
result.set(firstChunk, resultOffset);
|
|
2108
|
+
resultOffset += firstChunk.length;
|
|
2109
|
+
pendingChunks.shift();
|
|
2110
|
+
} else {
|
|
2111
|
+
result.set(firstChunk.subarray(0, remainingLength), resultOffset);
|
|
2112
|
+
pendingChunks[0] = firstChunk.subarray(remainingLength);
|
|
2113
|
+
resultOffset += remainingLength;
|
|
2114
|
+
}
|
|
2057
2115
|
}
|
|
2116
|
+
pendingLength -= chunkSize;
|
|
2117
|
+
return result;
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
function concatChunks(chunks, length) {
|
|
2121
|
+
const result = new Uint8Array(length);
|
|
2058
2122
|
let offset = 0;
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
offset +=
|
|
2123
|
+
for (const chunk of chunks) {
|
|
2124
|
+
result.set(chunk, offset);
|
|
2125
|
+
offset += chunk.length;
|
|
2062
2126
|
}
|
|
2063
|
-
|
|
2127
|
+
return result;
|
|
2064
2128
|
}
|
|
2065
2129
|
}
|
|
2066
2130
|
}
|
|
@@ -2242,7 +2306,10 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2242
2306
|
}
|
|
2243
2307
|
}
|
|
2244
2308
|
codecStream = new CodecStream(options, config);
|
|
2245
|
-
await readable
|
|
2309
|
+
await readable
|
|
2310
|
+
.pipeThrough(codecStream)
|
|
2311
|
+
.pipeThrough(new ChunkStream(getChunkSize(config)))
|
|
2312
|
+
.pipeTo(writable, { preventClose: true, preventAbort: true });
|
|
2246
2313
|
const {
|
|
2247
2314
|
signature,
|
|
2248
2315
|
inputSize,
|
|
@@ -2441,7 +2508,7 @@ function sendMessage(message, { worker, writer, transferStreams }) {
|
|
|
2441
2508
|
const { value, readable, writable } = message;
|
|
2442
2509
|
const transferables = [];
|
|
2443
2510
|
if (value) {
|
|
2444
|
-
message.value =
|
|
2511
|
+
message.value = toExactUint8Array(value);
|
|
2445
2512
|
transferables.push(message.value.buffer);
|
|
2446
2513
|
}
|
|
2447
2514
|
if (transferStreams && transferStreamsSupported) {
|
|
@@ -2565,8 +2632,8 @@ async function runWorker(stream, workerOptions) {
|
|
|
2565
2632
|
const { options, config } = workerOptions;
|
|
2566
2633
|
const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted } = options;
|
|
2567
2634
|
const { workerURI, maxWorkers } = config;
|
|
2568
|
-
workerOptions.transferStreams = transferStreams || transferStreams === UNDEFINED_VALUE;
|
|
2569
|
-
const streamCopy = !compressed && !signed && !encrypted
|
|
2635
|
+
workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
|
|
2636
|
+
const streamCopy = !compressed && !signed && !encrypted;
|
|
2570
2637
|
workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
|
|
2571
2638
|
workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
|
|
2572
2639
|
options.useCompressionStream = useCompressionStream || (useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream);
|
|
@@ -2700,6 +2767,7 @@ async function terminateWorkers() {
|
|
|
2700
2767
|
|
|
2701
2768
|
const ERR_HTTP_STATUS = "HTTP error ";
|
|
2702
2769
|
const ERR_HTTP_RANGE = "HTTP Range not supported";
|
|
2770
|
+
const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
|
|
2703
2771
|
const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
|
|
2704
2772
|
const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
|
|
2705
2773
|
|
|
@@ -2710,13 +2778,15 @@ const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
|
|
|
2710
2778
|
const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
|
|
2711
2779
|
const HTTP_HEADER_RANGE = "Range";
|
|
2712
2780
|
const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
|
|
2781
|
+
const HTTP_HEADER_ETAG = "Etag";
|
|
2782
|
+
const HTTP_HEADER_LAST_MODIFIED = "Last-Modified";
|
|
2713
2783
|
const HTTP_METHOD_HEAD = "HEAD";
|
|
2714
2784
|
const HTTP_METHOD_GET = "GET";
|
|
2715
2785
|
const HTTP_RANGE_UNIT = "bytes";
|
|
2716
|
-
const DEFAULT_CHUNK_SIZE = 64 * 1024;
|
|
2717
2786
|
const DEFAULT_BUFFER_SIZE = 256 * 1024;
|
|
2718
2787
|
|
|
2719
2788
|
const PROPERTY_NAME_WRITABLE = "writable";
|
|
2789
|
+
const DISK_BOUNDARY = Symbol();
|
|
2720
2790
|
|
|
2721
2791
|
class Stream {
|
|
2722
2792
|
|
|
@@ -2735,13 +2805,13 @@ class Reader extends Stream {
|
|
|
2735
2805
|
return this.createReadable();
|
|
2736
2806
|
}
|
|
2737
2807
|
|
|
2738
|
-
createReadable({ offset = 0, size,
|
|
2808
|
+
createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
|
|
2739
2809
|
const reader = this;
|
|
2740
2810
|
let chunkOffset = 0;
|
|
2741
2811
|
return new ReadableStream({
|
|
2742
2812
|
async pull(controller) {
|
|
2743
2813
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
2744
|
-
const data = await readUint8Array(reader, offset + chunkOffset, dataSize
|
|
2814
|
+
const data = await readUint8Array(reader, offset + chunkOffset, dataSize);
|
|
2745
2815
|
controller.enqueue(data);
|
|
2746
2816
|
if ((chunkOffset + chunkSize > size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
|
|
2747
2817
|
controller.close();
|
|
@@ -2763,7 +2833,7 @@ class Writer extends Stream {
|
|
|
2763
2833
|
if (!writer.initialized) {
|
|
2764
2834
|
throw new Error(ERR_WRITER_NOT_INITIALIZED);
|
|
2765
2835
|
}
|
|
2766
|
-
return writer.writeUint8Array(chunk);
|
|
2836
|
+
return writer.writeUint8Array(toExactUint8Array(chunk));
|
|
2767
2837
|
}
|
|
2768
2838
|
});
|
|
2769
2839
|
Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
|
|
@@ -2850,6 +2920,27 @@ class Data64URIWriter extends Writer {
|
|
|
2850
2920
|
}
|
|
2851
2921
|
}
|
|
2852
2922
|
|
|
2923
|
+
let blobSliceReliable;
|
|
2924
|
+
let blobSliceProbe;
|
|
2925
|
+
|
|
2926
|
+
function probeBlobSliceReliability() {
|
|
2927
|
+
blobSliceProbe = (async () => {
|
|
2928
|
+
try {
|
|
2929
|
+
const slicedBlob = new Blob([new Uint8Array(3)]).slice(1, 2);
|
|
2930
|
+
const streamReader = slicedBlob.stream().getReader();
|
|
2931
|
+
let streamedLength = 0;
|
|
2932
|
+
let result = await streamReader.read();
|
|
2933
|
+
while (!result.done) {
|
|
2934
|
+
streamedLength += result.value.length;
|
|
2935
|
+
result = await streamReader.read();
|
|
2936
|
+
}
|
|
2937
|
+
blobSliceReliable = streamedLength == 1;
|
|
2938
|
+
} catch {
|
|
2939
|
+
blobSliceReliable = false;
|
|
2940
|
+
}
|
|
2941
|
+
})();
|
|
2942
|
+
}
|
|
2943
|
+
|
|
2853
2944
|
class BlobReader extends Reader {
|
|
2854
2945
|
|
|
2855
2946
|
constructor(blob) {
|
|
@@ -2858,14 +2949,32 @@ class BlobReader extends Reader {
|
|
|
2858
2949
|
blob,
|
|
2859
2950
|
size: blob.size
|
|
2860
2951
|
});
|
|
2952
|
+
if (!blobSliceProbe) {
|
|
2953
|
+
probeBlobSliceReliability();
|
|
2954
|
+
}
|
|
2955
|
+
}
|
|
2956
|
+
|
|
2957
|
+
createReadable(options) {
|
|
2958
|
+
const reader = this;
|
|
2959
|
+
const { blob, size } = reader;
|
|
2960
|
+
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
2961
|
+
if (!offset && readSize >= size) {
|
|
2962
|
+
return blob.stream();
|
|
2963
|
+
}
|
|
2964
|
+
if (blobSliceReliable) {
|
|
2965
|
+
return blob.slice(offset, offset + readSize).stream();
|
|
2966
|
+
}
|
|
2967
|
+
return super.createReadable(options);
|
|
2861
2968
|
}
|
|
2862
2969
|
|
|
2863
2970
|
async readUint8Array(offset, length) {
|
|
2864
2971
|
const reader = this;
|
|
2865
2972
|
const offsetEnd = offset + length;
|
|
2866
|
-
const
|
|
2973
|
+
const readsWholeBlob = !offset && offsetEnd >= reader.size;
|
|
2974
|
+
const blob = readsWholeBlob ? reader.blob : reader.blob.slice(offset, offsetEnd);
|
|
2867
2975
|
let arrayBuffer = await blob.arrayBuffer();
|
|
2868
|
-
|
|
2976
|
+
const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
|
|
2977
|
+
if (sliceIgnoredByBuggyImplementation) {
|
|
2869
2978
|
arrayBuffer = arrayBuffer.slice(offset, offsetEnd);
|
|
2870
2979
|
}
|
|
2871
2980
|
return new Uint8Array(arrayBuffer);
|
|
@@ -2946,6 +3055,18 @@ class FetchReader extends Reader {
|
|
|
2946
3055
|
super.init();
|
|
2947
3056
|
}
|
|
2948
3057
|
|
|
3058
|
+
createReadable(options) {
|
|
3059
|
+
const reader = this;
|
|
3060
|
+
const { useRangeHeader, forceRangeRequests, size } = reader;
|
|
3061
|
+
if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
|
|
3062
|
+
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3063
|
+
if (readSize > 0 && offset < size) {
|
|
3064
|
+
return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
|
|
3065
|
+
}
|
|
3066
|
+
}
|
|
3067
|
+
return super.createReadable(options);
|
|
3068
|
+
}
|
|
3069
|
+
|
|
2949
3070
|
readUint8Array(index, length) {
|
|
2950
3071
|
return readUint8ArrayHttpReader(this, index, length, sendFetchRequest, getFetchRequestData);
|
|
2951
3072
|
}
|
|
@@ -2974,6 +3095,7 @@ function createHttpReader(httpReader, url, options) {
|
|
|
2974
3095
|
useRangeHeader,
|
|
2975
3096
|
forceRangeRequests,
|
|
2976
3097
|
combineSizeEocd,
|
|
3098
|
+
checkResourceChanges = true,
|
|
2977
3099
|
fetch
|
|
2978
3100
|
} = options;
|
|
2979
3101
|
options = Object.assign({}, options);
|
|
@@ -2981,6 +3103,7 @@ function createHttpReader(httpReader, url, options) {
|
|
|
2981
3103
|
delete options.useRangeHeader;
|
|
2982
3104
|
delete options.forceRangeRequests;
|
|
2983
3105
|
delete options.combineSizeEocd;
|
|
3106
|
+
delete options.checkResourceChanges;
|
|
2984
3107
|
delete options.useXHR;
|
|
2985
3108
|
delete options.fetch;
|
|
2986
3109
|
Object.assign(httpReader, {
|
|
@@ -2990,6 +3113,7 @@ function createHttpReader(httpReader, url, options) {
|
|
|
2990
3113
|
useRangeHeader,
|
|
2991
3114
|
forceRangeRequests,
|
|
2992
3115
|
combineSizeEocd,
|
|
3116
|
+
checkResourceChanges,
|
|
2993
3117
|
fetch
|
|
2994
3118
|
});
|
|
2995
3119
|
}
|
|
@@ -3014,17 +3138,8 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
|
|
|
3014
3138
|
httpReader.eocdCache = eocdCache;
|
|
3015
3139
|
}
|
|
3016
3140
|
}
|
|
3017
|
-
|
|
3018
|
-
const
|
|
3019
|
-
if (contentRangeHeader) {
|
|
3020
|
-
const splitHeader = contentRangeHeader.trim().split(/\s*\/\s*/);
|
|
3021
|
-
if (splitHeader.length) {
|
|
3022
|
-
const headerValue = splitHeader[1];
|
|
3023
|
-
if (headerValue && headerValue != "*") {
|
|
3024
|
-
contentSize = Number(headerValue);
|
|
3025
|
-
}
|
|
3026
|
-
}
|
|
3027
|
-
}
|
|
3141
|
+
setResourceValidators(httpReader, response);
|
|
3142
|
+
const contentSize = getContentRangeSize(response);
|
|
3028
3143
|
if (contentSize === UNDEFINED_VALUE) {
|
|
3029
3144
|
await getContentLength(httpReader, sendRequest, getRequestData);
|
|
3030
3145
|
} else {
|
|
@@ -3065,6 +3180,8 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
|
|
|
3065
3180
|
throw new Error(ERR_HTTP_RANGE);
|
|
3066
3181
|
}
|
|
3067
3182
|
}
|
|
3183
|
+
checkResourceValidators(httpReader, response);
|
|
3184
|
+
setResourceValidators(httpReader, response);
|
|
3068
3185
|
const data = new Uint8Array(await response.arrayBuffer());
|
|
3069
3186
|
if (data.length != length) {
|
|
3070
3187
|
throw new Error(ERR_HTTP_RANGE);
|
|
@@ -3076,7 +3193,97 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
|
|
|
3076
3193
|
if (!data) {
|
|
3077
3194
|
await getRequestData(httpReader, options);
|
|
3078
3195
|
}
|
|
3079
|
-
return
|
|
3196
|
+
return httpReader.data.subarray(index, index + length);
|
|
3197
|
+
}
|
|
3198
|
+
}
|
|
3199
|
+
|
|
3200
|
+
function createRangeReadable(httpReader, offset, size) {
|
|
3201
|
+
let bodyReader;
|
|
3202
|
+
let remainingLength = size;
|
|
3203
|
+
return new ReadableStream({
|
|
3204
|
+
async start() {
|
|
3205
|
+
const response = await sendFetchRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, offset, size));
|
|
3206
|
+
if (response.status != 206) {
|
|
3207
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3208
|
+
}
|
|
3209
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3210
|
+
if (contentRangeHeader) {
|
|
3211
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
3212
|
+
if (!Number.isNaN(rangeStart) && rangeStart != offset) {
|
|
3213
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3214
|
+
}
|
|
3215
|
+
}
|
|
3216
|
+
checkResourceValidators(httpReader, response);
|
|
3217
|
+
setResourceValidators(httpReader, response);
|
|
3218
|
+
bodyReader = response.body.getReader();
|
|
3219
|
+
},
|
|
3220
|
+
async pull(controller) {
|
|
3221
|
+
const { value, done } = await bodyReader.read();
|
|
3222
|
+
if (done) {
|
|
3223
|
+
if (remainingLength) {
|
|
3224
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3225
|
+
}
|
|
3226
|
+
controller.close();
|
|
3227
|
+
} else {
|
|
3228
|
+
const chunk = value.length > remainingLength ? value.subarray(0, remainingLength) : value;
|
|
3229
|
+
remainingLength -= chunk.length;
|
|
3230
|
+
if (chunk.length) {
|
|
3231
|
+
controller.enqueue(chunk);
|
|
3232
|
+
}
|
|
3233
|
+
if (!remainingLength) {
|
|
3234
|
+
controller.close();
|
|
3235
|
+
await bodyReader.cancel();
|
|
3236
|
+
}
|
|
3237
|
+
}
|
|
3238
|
+
},
|
|
3239
|
+
cancel(reason) {
|
|
3240
|
+
return bodyReader && bodyReader.cancel(reason);
|
|
3241
|
+
}
|
|
3242
|
+
});
|
|
3243
|
+
}
|
|
3244
|
+
|
|
3245
|
+
function getContentRangeSize(response) {
|
|
3246
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3247
|
+
if (contentRangeHeader) {
|
|
3248
|
+
const headerValue = contentRangeHeader.trim().split(/\s*\/\s*/)[1];
|
|
3249
|
+
if (headerValue && headerValue != "*") {
|
|
3250
|
+
const contentSize = Number(headerValue);
|
|
3251
|
+
if (!Number.isNaN(contentSize)) {
|
|
3252
|
+
return contentSize;
|
|
3253
|
+
}
|
|
3254
|
+
}
|
|
3255
|
+
}
|
|
3256
|
+
}
|
|
3257
|
+
|
|
3258
|
+
function getResourceValidators({ headers }) {
|
|
3259
|
+
return {
|
|
3260
|
+
etag: headers.get(HTTP_HEADER_ETAG) || UNDEFINED_VALUE,
|
|
3261
|
+
lastModified: headers.get(HTTP_HEADER_LAST_MODIFIED) || UNDEFINED_VALUE
|
|
3262
|
+
};
|
|
3263
|
+
}
|
|
3264
|
+
|
|
3265
|
+
function setResourceValidators(httpReader, response) {
|
|
3266
|
+
const { checkResourceChanges, resourceValidators } = httpReader;
|
|
3267
|
+
if (checkResourceChanges && !resourceValidators && response.status == 206) {
|
|
3268
|
+
httpReader.resourceValidators = getResourceValidators(response);
|
|
3269
|
+
}
|
|
3270
|
+
}
|
|
3271
|
+
|
|
3272
|
+
function checkResourceValidators(httpReader, response) {
|
|
3273
|
+
const { checkResourceChanges, resourceValidators, size } = httpReader;
|
|
3274
|
+
if (checkResourceChanges) {
|
|
3275
|
+
const contentRangeSize = getContentRangeSize(response);
|
|
3276
|
+
if (contentRangeSize !== UNDEFINED_VALUE && size !== UNDEFINED_VALUE && contentRangeSize != size) {
|
|
3277
|
+
throw new Error(ERR_HTTP_RESOURCE_CHANGED);
|
|
3278
|
+
}
|
|
3279
|
+
if (resourceValidators) {
|
|
3280
|
+
const validators = getResourceValidators(response);
|
|
3281
|
+
const changed = Object.entries(resourceValidators).some(([name, value]) =>
|
|
3282
|
+
value !== UNDEFINED_VALUE && validators[name] !== UNDEFINED_VALUE && value != validators[name]);
|
|
3283
|
+
if (changed) {
|
|
3284
|
+
throw new Error(ERR_HTTP_RESOURCE_CHANGED);
|
|
3285
|
+
}
|
|
3286
|
+
}
|
|
3080
3287
|
}
|
|
3081
3288
|
}
|
|
3082
3289
|
|
|
@@ -3187,6 +3394,10 @@ class HttpReader extends Reader {
|
|
|
3187
3394
|
super.init();
|
|
3188
3395
|
}
|
|
3189
3396
|
|
|
3397
|
+
createReadable(options) {
|
|
3398
|
+
return this.reader.createReadable(options);
|
|
3399
|
+
}
|
|
3400
|
+
|
|
3190
3401
|
readUint8Array(index, length) {
|
|
3191
3402
|
return this.reader.readUint8Array(index, length);
|
|
3192
3403
|
}
|
|
@@ -3267,25 +3478,26 @@ class SplitDataReader extends Reader {
|
|
|
3267
3478
|
const reader = this;
|
|
3268
3479
|
const { readers } = reader;
|
|
3269
3480
|
reader.lastDiskNumber = 0;
|
|
3270
|
-
|
|
3271
|
-
|
|
3272
|
-
|
|
3273
|
-
if (indexDiskReader != readers.length - 1) {
|
|
3274
|
-
reader.lastDiskOffset += diskReader.size;
|
|
3275
|
-
}
|
|
3481
|
+
await Promise.all(readers.map(diskReader => initStream(diskReader)));
|
|
3482
|
+
reader.diskOffsets = readers.map(diskReader => {
|
|
3483
|
+
const diskOffset = reader.size;
|
|
3276
3484
|
reader.size += diskReader.size;
|
|
3277
|
-
|
|
3485
|
+
return diskOffset;
|
|
3486
|
+
});
|
|
3278
3487
|
super.init();
|
|
3279
3488
|
}
|
|
3280
3489
|
|
|
3281
|
-
|
|
3490
|
+
getDiskOffset(diskNumber) {
|
|
3491
|
+
const { diskOffsets, size } = this;
|
|
3492
|
+
const diskOffset = diskOffsets.at(diskNumber);
|
|
3493
|
+
return diskOffset === UNDEFINED_VALUE ? size : diskOffset;
|
|
3494
|
+
}
|
|
3495
|
+
|
|
3496
|
+
async readUint8Array(offset, length) {
|
|
3282
3497
|
const reader = this;
|
|
3283
3498
|
const { readers } = this;
|
|
3284
3499
|
let result;
|
|
3285
|
-
let currentDiskNumber =
|
|
3286
|
-
if (currentDiskNumber == -1) {
|
|
3287
|
-
currentDiskNumber = readers.length - 1;
|
|
3288
|
-
}
|
|
3500
|
+
let currentDiskNumber = 0;
|
|
3289
3501
|
let currentReaderOffset = offset;
|
|
3290
3502
|
while (readers[currentDiskNumber] && currentReaderOffset >= readers[currentDiskNumber].size) {
|
|
3291
3503
|
currentReaderOffset -= readers[currentDiskNumber].size;
|
|
@@ -3298,14 +3510,9 @@ class SplitDataReader extends Reader {
|
|
|
3298
3510
|
result = await readUint8Array(currentReader, currentReaderOffset, length);
|
|
3299
3511
|
} else {
|
|
3300
3512
|
const chunkLength = currentReaderSize - currentReaderOffset;
|
|
3301
|
-
result = new Uint8Array(length);
|
|
3302
3513
|
const firstPart = await readUint8Array(currentReader, currentReaderOffset, chunkLength);
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
result.set(secondPart, chunkLength);
|
|
3306
|
-
if (firstPart.length + secondPart.length < length) {
|
|
3307
|
-
result = result.subarray(0, firstPart.length + secondPart.length);
|
|
3308
|
-
}
|
|
3514
|
+
const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength);
|
|
3515
|
+
result = concat(firstPart, secondPart);
|
|
3309
3516
|
}
|
|
3310
3517
|
} else {
|
|
3311
3518
|
result = EMPTY_UINT8_ARRAY;
|
|
@@ -3330,6 +3537,12 @@ class SplitDataWriter extends Stream {
|
|
|
3330
3537
|
let diskSourceWriter, diskWritable, diskWriter;
|
|
3331
3538
|
const writable = new WritableStream({
|
|
3332
3539
|
async write(chunk) {
|
|
3540
|
+
if (chunk === DISK_BOUNDARY) {
|
|
3541
|
+
if (diskWriter) {
|
|
3542
|
+
await endDisk();
|
|
3543
|
+
}
|
|
3544
|
+
return;
|
|
3545
|
+
}
|
|
3333
3546
|
const { availableSize } = writer;
|
|
3334
3547
|
if (!diskWriter) {
|
|
3335
3548
|
const { value, done } = await writerGenerator.next();
|
|
@@ -3349,11 +3562,7 @@ class SplitDataWriter extends Stream {
|
|
|
3349
3562
|
await this.write(chunk);
|
|
3350
3563
|
} else if (chunk.length >= availableSize) {
|
|
3351
3564
|
await writeChunk(chunk.subarray(0, availableSize));
|
|
3352
|
-
await
|
|
3353
|
-
writer.diskOffset += diskSourceWriter.size;
|
|
3354
|
-
writer.diskNumber++;
|
|
3355
|
-
diskWriter = null;
|
|
3356
|
-
writer.availableSize = writer.maxSize;
|
|
3565
|
+
await endDisk();
|
|
3357
3566
|
if (chunk.length > availableSize) {
|
|
3358
3567
|
await this.write(chunk.subarray(availableSize));
|
|
3359
3568
|
}
|
|
@@ -3364,7 +3573,7 @@ class SplitDataWriter extends Stream {
|
|
|
3364
3573
|
async close() {
|
|
3365
3574
|
if (diskWriter) {
|
|
3366
3575
|
await diskWriter.ready;
|
|
3367
|
-
await
|
|
3576
|
+
await closeDiskWriter();
|
|
3368
3577
|
}
|
|
3369
3578
|
},
|
|
3370
3579
|
async abort(reason) {
|
|
@@ -3389,10 +3598,28 @@ class SplitDataWriter extends Stream {
|
|
|
3389
3598
|
}
|
|
3390
3599
|
}
|
|
3391
3600
|
|
|
3392
|
-
async function
|
|
3601
|
+
async function endDisk() {
|
|
3602
|
+
await closeDiskWriter();
|
|
3603
|
+
writer.diskOffset += diskSourceWriter.size;
|
|
3604
|
+
writer.diskNumber++;
|
|
3605
|
+
diskWriter = null;
|
|
3606
|
+
writer.availableSize = writer.maxSize;
|
|
3607
|
+
}
|
|
3608
|
+
|
|
3609
|
+
async function closeDiskWriter() {
|
|
3393
3610
|
await diskWriter.close();
|
|
3394
3611
|
}
|
|
3395
3612
|
}
|
|
3613
|
+
|
|
3614
|
+
async closeDisk() {
|
|
3615
|
+
const streamWriter = this.writable.getWriter();
|
|
3616
|
+
try {
|
|
3617
|
+
await streamWriter.ready;
|
|
3618
|
+
await streamWriter.write(DISK_BOUNDARY);
|
|
3619
|
+
} finally {
|
|
3620
|
+
streamWriter.releaseLock();
|
|
3621
|
+
}
|
|
3622
|
+
}
|
|
3396
3623
|
}
|
|
3397
3624
|
|
|
3398
3625
|
class GenericReader {
|
|
@@ -3424,14 +3651,6 @@ class GenericWriter {
|
|
|
3424
3651
|
if (writer.size === UNDEFINED_VALUE) {
|
|
3425
3652
|
writer.size = 0;
|
|
3426
3653
|
}
|
|
3427
|
-
if (!(writer instanceof SplitDataWriter)) {
|
|
3428
|
-
Object.assign(writer, {
|
|
3429
|
-
diskNumber: 0,
|
|
3430
|
-
diskOffset: 0,
|
|
3431
|
-
availableSize: INFINITY_VALUE,
|
|
3432
|
-
maxSize: INFINITY_VALUE
|
|
3433
|
-
});
|
|
3434
|
-
}
|
|
3435
3654
|
return writer;
|
|
3436
3655
|
}
|
|
3437
3656
|
}
|
|
@@ -3450,8 +3669,8 @@ async function initStream(stream, initSize) {
|
|
|
3450
3669
|
}
|
|
3451
3670
|
}
|
|
3452
3671
|
|
|
3453
|
-
function readUint8Array(reader, offset, size
|
|
3454
|
-
return reader.readUint8Array(offset, size
|
|
3672
|
+
function readUint8Array(reader, offset, size) {
|
|
3673
|
+
return reader.readUint8Array(offset, size);
|
|
3455
3674
|
}
|
|
3456
3675
|
|
|
3457
3676
|
/*
|
|
@@ -3827,7 +4046,7 @@ class ZipReader {
|
|
|
3827
4046
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
3828
4047
|
if (!endOfDirectoryInfo) {
|
|
3829
4048
|
const signatureArray = await readUint8Array(reader, 0, 4);
|
|
3830
|
-
const signatureView = getDataView
|
|
4049
|
+
const signatureView = getDataView(signatureArray);
|
|
3831
4050
|
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
3832
4051
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
3833
4052
|
} else {
|
|
@@ -3837,7 +4056,7 @@ class ZipReader {
|
|
|
3837
4056
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
3838
4057
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
3839
4058
|
}
|
|
3840
|
-
const endOfDirectoryView = getDataView
|
|
4059
|
+
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
3841
4060
|
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
3842
4061
|
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
3843
4062
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
@@ -3853,17 +4072,21 @@ class ZipReader {
|
|
|
3853
4072
|
let prependedDataLength = 0;
|
|
3854
4073
|
let startOffset;
|
|
3855
4074
|
let zip64EndOfDirectory;
|
|
3856
|
-
|
|
4075
|
+
const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
|
|
4076
|
+
if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
|
|
4077
|
+
directoryDataOffset += getDiskOffset$1(reader, diskNumber);
|
|
4078
|
+
}
|
|
4079
|
+
if (requiresZip64) {
|
|
3857
4080
|
const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
|
|
3858
4081
|
await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
|
|
3859
4082
|
EMPTY_UINT8_ARRAY;
|
|
3860
|
-
const endOfDirectoryLocatorView = getDataView
|
|
4083
|
+
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
3861
4084
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
3862
4085
|
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
3863
|
-
directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
|
|
3864
|
-
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH
|
|
3865
|
-
let endOfDirectoryView = getDataView
|
|
3866
|
-
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH
|
|
4086
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4087
|
+
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4088
|
+
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4089
|
+
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
3867
4090
|
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
3868
4091
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
3869
4092
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -3871,8 +4094,8 @@ class ZipReader {
|
|
|
3871
4094
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
3872
4095
|
prependedDataLength = directoryDataOffset - originalDirectoryDataOffset;
|
|
3873
4096
|
}
|
|
3874
|
-
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH
|
|
3875
|
-
endOfDirectoryView = getDataView
|
|
4097
|
+
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4098
|
+
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
3876
4099
|
}
|
|
3877
4100
|
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3878
4101
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
@@ -3898,7 +4121,7 @@ class ZipReader {
|
|
|
3898
4121
|
} else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
3899
4122
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3900
4123
|
}
|
|
3901
|
-
directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4124
|
+
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
3902
4125
|
}
|
|
3903
4126
|
}
|
|
3904
4127
|
const declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -3915,19 +4138,19 @@ class ZipReader {
|
|
|
3915
4138
|
throw new Error(ERR_BAD_FORMAT);
|
|
3916
4139
|
}
|
|
3917
4140
|
let offset = 0;
|
|
3918
|
-
let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength
|
|
3919
|
-
let directoryView = getDataView
|
|
4141
|
+
let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4142
|
+
let directoryView = getDataView(directoryArray);
|
|
3920
4143
|
if (directoryDataLength) {
|
|
3921
4144
|
if (directoryArray.length < 4) {
|
|
3922
4145
|
throw new Error(ERR_BAD_FORMAT);
|
|
3923
4146
|
}
|
|
3924
|
-
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength
|
|
4147
|
+
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
3925
4148
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
3926
4149
|
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
3927
4150
|
let reconcile = !storedPointsAtDirectory;
|
|
3928
4151
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
3929
|
-
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4
|
|
3930
|
-
reconcile = getUint32(getDataView
|
|
4152
|
+
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4153
|
+
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
3931
4154
|
}
|
|
3932
4155
|
if (reconcile) {
|
|
3933
4156
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -3935,16 +4158,16 @@ class ZipReader {
|
|
|
3935
4158
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
3936
4159
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
3937
4160
|
}
|
|
3938
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength
|
|
3939
|
-
directoryView = getDataView
|
|
4161
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4162
|
+
directoryView = getDataView(directoryArray);
|
|
3940
4163
|
}
|
|
3941
4164
|
}
|
|
3942
4165
|
}
|
|
3943
|
-
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset
|
|
4166
|
+
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset;
|
|
3944
4167
|
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
|
|
3945
4168
|
directoryDataLength = expectedDirectoryDataLength;
|
|
3946
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength
|
|
3947
|
-
directoryView = getDataView
|
|
4169
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4170
|
+
directoryView = getDataView(directoryArray);
|
|
3948
4171
|
}
|
|
3949
4172
|
if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
|
|
3950
4173
|
throw new Error(ERR_BAD_FORMAT);
|
|
@@ -4017,7 +4240,7 @@ class ZipReader {
|
|
|
4017
4240
|
});
|
|
4018
4241
|
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
4019
4242
|
fileEntry.offset += prependedDataLength;
|
|
4020
|
-
startOffset = Math.min(fileEntry.offset, startOffset);
|
|
4243
|
+
startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
|
|
4021
4244
|
if (checkAmbiguity) {
|
|
4022
4245
|
if (filenames.has(fileEntry.filename)) {
|
|
4023
4246
|
duplicateFilename = true;
|
|
@@ -4171,8 +4394,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
4171
4394
|
dataDescriptor
|
|
4172
4395
|
} = bitFlag;
|
|
4173
4396
|
const localDirectory = fileEntry.localDirectory = {};
|
|
4174
|
-
const
|
|
4175
|
-
const
|
|
4397
|
+
const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
|
|
4398
|
+
const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
|
|
4399
|
+
const dataView = getDataView(dataArray);
|
|
4176
4400
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
4177
4401
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
4178
4402
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
@@ -4197,12 +4421,12 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
4197
4421
|
const checkAmbiguity = getStrictness(getOptionValue$1(zipEntry, options, OPTION_STRICTNESS), getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY)) == STRICTNESS_STRICT;
|
|
4198
4422
|
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
4199
4423
|
if (checkAmbiguity && (filenameLength || extraFieldLength)) {
|
|
4200
|
-
const trailingDataArray = await readUint8Array(reader,
|
|
4424
|
+
const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
|
|
4201
4425
|
rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
|
|
4202
4426
|
localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
|
|
4203
4427
|
} else {
|
|
4204
4428
|
localDirectory.rawExtraField = extraFieldLength ?
|
|
4205
|
-
await readUint8Array(reader,
|
|
4429
|
+
await readUint8Array(reader, localHeaderOffset + HEADER_SIZE + filenameLength, extraFieldLength) :
|
|
4206
4430
|
EMPTY_UINT8_ARRAY;
|
|
4207
4431
|
}
|
|
4208
4432
|
readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
|
|
@@ -4228,9 +4452,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
4228
4452
|
throw new Error(ERR_ENCRYPTED);
|
|
4229
4453
|
}
|
|
4230
4454
|
}
|
|
4231
|
-
const dataOffset =
|
|
4455
|
+
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
4232
4456
|
const size = compressedSize;
|
|
4233
|
-
const readable = reader.createReadable({ offset: dataOffset, size
|
|
4457
|
+
const readable = reader.createReadable({ offset: dataOffset, size });
|
|
4234
4458
|
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
4235
4459
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
4236
4460
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
@@ -4271,8 +4495,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
4271
4495
|
reader,
|
|
4272
4496
|
fileEntry,
|
|
4273
4497
|
index,
|
|
4274
|
-
offset,
|
|
4275
|
-
diskNumberStart,
|
|
4498
|
+
offset: localHeaderOffset,
|
|
4276
4499
|
signature,
|
|
4277
4500
|
compressedSize,
|
|
4278
4501
|
uncompressedSize,
|
|
@@ -4336,7 +4559,7 @@ function readCommonHeader(directory, dataView, offset) {
|
|
|
4336
4559
|
function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory) {
|
|
4337
4560
|
const { rawExtraField } = directory;
|
|
4338
4561
|
const extraField = directory.extraField = new Map();
|
|
4339
|
-
const rawExtraFieldView = getDataView
|
|
4562
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
4340
4563
|
let offsetExtraField = 0;
|
|
4341
4564
|
try {
|
|
4342
4565
|
while (offsetExtraField < rawExtraField.length) {
|
|
@@ -4408,7 +4631,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
4408
4631
|
|
|
4409
4632
|
function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
4410
4633
|
directory.zip64 = true;
|
|
4411
|
-
const extraFieldView = getDataView
|
|
4634
|
+
const extraFieldView = getDataView(extraFieldZip64.data);
|
|
4412
4635
|
const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
|
|
4413
4636
|
const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
|
|
4414
4637
|
if (extraFieldZip64.data.length < requiredLength) {
|
|
@@ -4427,10 +4650,10 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
|
|
|
4427
4650
|
extraFieldUnicode.valid = false;
|
|
4428
4651
|
return;
|
|
4429
4652
|
}
|
|
4430
|
-
const extraFieldView = getDataView
|
|
4653
|
+
const extraFieldView = getDataView(extraFieldUnicode.data);
|
|
4431
4654
|
const crc32 = new Crc32();
|
|
4432
4655
|
crc32.append(fileEntry[rawPropertyName]);
|
|
4433
|
-
const dataViewSignature = getDataView
|
|
4656
|
+
const dataViewSignature = getDataView(new Uint8Array(4));
|
|
4434
4657
|
dataViewSignature.setUint32(0, crc32.get(), true);
|
|
4435
4658
|
const signature = getUint32(extraFieldView, 1);
|
|
4436
4659
|
Object.assign(extraFieldUnicode, {
|
|
@@ -4445,7 +4668,7 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
|
|
|
4445
4668
|
}
|
|
4446
4669
|
|
|
4447
4670
|
function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
|
|
4448
|
-
const extraFieldView = getDataView
|
|
4671
|
+
const extraFieldView = getDataView(extraFieldAES.data);
|
|
4449
4672
|
const strength = getUint8(extraFieldView, 4);
|
|
4450
4673
|
Object.assign(extraFieldAES, {
|
|
4451
4674
|
vendorVersion: getUint8(extraFieldView, 0),
|
|
@@ -4458,7 +4681,7 @@ function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
|
|
|
4458
4681
|
}
|
|
4459
4682
|
|
|
4460
4683
|
function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
4461
|
-
const extraFieldView = getDataView
|
|
4684
|
+
const extraFieldView = getDataView(extraFieldNTFS.data);
|
|
4462
4685
|
let offsetExtraField = 4;
|
|
4463
4686
|
let tag1Data;
|
|
4464
4687
|
try {
|
|
@@ -4475,7 +4698,7 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
|
4475
4698
|
}
|
|
4476
4699
|
try {
|
|
4477
4700
|
if (tag1Data && tag1Data.length == 24) {
|
|
4478
|
-
const tag1View = getDataView
|
|
4701
|
+
const tag1View = getDataView(tag1Data);
|
|
4479
4702
|
const rawLastModDate = tag1View.getBigUint64(0, true);
|
|
4480
4703
|
const rawLastAccessDate = tag1View.getBigUint64(8, true);
|
|
4481
4704
|
const rawCreationDate = tag1View.getBigUint64(16, true);
|
|
@@ -4498,7 +4721,7 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
|
4498
4721
|
|
|
4499
4722
|
function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
4500
4723
|
try {
|
|
4501
|
-
const view = getDataView
|
|
4724
|
+
const view = getDataView(extraField.data);
|
|
4502
4725
|
let uid, gid;
|
|
4503
4726
|
if (isInfoZip) {
|
|
4504
4727
|
let offset = 0;
|
|
@@ -4536,7 +4759,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
|
|
|
4536
4759
|
if (!extraFieldExtendedTimestamp.data.length) {
|
|
4537
4760
|
return;
|
|
4538
4761
|
}
|
|
4539
|
-
const extraFieldView = getDataView
|
|
4762
|
+
const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
|
|
4540
4763
|
const flags = getUint8(extraFieldView, 0);
|
|
4541
4764
|
const timeProperties = [];
|
|
4542
4765
|
const timeRawProperties = [];
|
|
@@ -4574,7 +4797,6 @@ async function detectOverlappingEntry({
|
|
|
4574
4797
|
fileEntry,
|
|
4575
4798
|
index,
|
|
4576
4799
|
offset,
|
|
4577
|
-
diskNumberStart,
|
|
4578
4800
|
signature,
|
|
4579
4801
|
compressedSize,
|
|
4580
4802
|
uncompressedSize,
|
|
@@ -4583,12 +4805,6 @@ async function detectOverlappingEntry({
|
|
|
4583
4805
|
extraFieldZip64,
|
|
4584
4806
|
readRanges
|
|
4585
4807
|
}) {
|
|
4586
|
-
let diskOffset = 0;
|
|
4587
|
-
if (diskNumberStart && reader.readers) {
|
|
4588
|
-
for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
|
|
4589
|
-
diskOffset += reader.readers[indexReader].size;
|
|
4590
|
-
}
|
|
4591
|
-
}
|
|
4592
4808
|
let dataDescriptorLength = 0;
|
|
4593
4809
|
if (dataDescriptor) {
|
|
4594
4810
|
if (extraFieldZip64) {
|
|
@@ -4598,19 +4814,19 @@ async function detectOverlappingEntry({
|
|
|
4598
4814
|
}
|
|
4599
4815
|
}
|
|
4600
4816
|
if (dataDescriptorLength) {
|
|
4601
|
-
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH
|
|
4817
|
+
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
4602
4818
|
const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
4603
|
-
getUint32(getDataView
|
|
4819
|
+
getUint32(getDataView(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
4604
4820
|
if (dataDescriptorSignature) {
|
|
4605
|
-
const readSignature = getUint32(getDataView
|
|
4821
|
+
const readSignature = getUint32(getDataView(dataDescriptorArray), 4);
|
|
4606
4822
|
let readCompressedSize;
|
|
4607
4823
|
let readUncompressedSize;
|
|
4608
4824
|
if (extraFieldZip64) {
|
|
4609
|
-
readCompressedSize = getBigUint64(getDataView
|
|
4610
|
-
readUncompressedSize = getBigUint64(getDataView
|
|
4825
|
+
readCompressedSize = getBigUint64(getDataView(dataDescriptorArray), 8);
|
|
4826
|
+
readUncompressedSize = getBigUint64(getDataView(dataDescriptorArray), 16);
|
|
4611
4827
|
} else {
|
|
4612
|
-
readCompressedSize = getUint32(getDataView
|
|
4613
|
-
readUncompressedSize = getUint32(getDataView
|
|
4828
|
+
readCompressedSize = getUint32(getDataView(dataDescriptorArray), 8);
|
|
4829
|
+
readUncompressedSize = getUint32(getDataView(dataDescriptorArray), 12);
|
|
4614
4830
|
}
|
|
4615
4831
|
const matchSignature = (fileEntry.encrypted && !fileEntry.zipCrypto) || readSignature == signature;
|
|
4616
4832
|
if (matchSignature &&
|
|
@@ -4621,8 +4837,8 @@ async function detectOverlappingEntry({
|
|
|
4621
4837
|
}
|
|
4622
4838
|
}
|
|
4623
4839
|
const range = {
|
|
4624
|
-
start:
|
|
4625
|
-
end:
|
|
4840
|
+
start: offset,
|
|
4841
|
+
end: dataOffset + compressedSize + dataDescriptorLength,
|
|
4626
4842
|
fileEntry
|
|
4627
4843
|
};
|
|
4628
4844
|
for (const [otherIndex, otherRange] of readRanges) {
|
|
@@ -4635,6 +4851,10 @@ async function detectOverlappingEntry({
|
|
|
4635
4851
|
readRanges.set(index, range);
|
|
4636
4852
|
}
|
|
4637
4853
|
|
|
4854
|
+
function getDiskOffset$1(reader, diskNumber) {
|
|
4855
|
+
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
4856
|
+
}
|
|
4857
|
+
|
|
4638
4858
|
function getStrictness(strictness, checkAmbiguity) {
|
|
4639
4859
|
if (strictness === UNDEFINED_VALUE) {
|
|
4640
4860
|
return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
|
|
@@ -4718,7 +4938,7 @@ async function seekEndOfCentralDirectory(reader, maxAppendedDataSize, remoteProb
|
|
|
4718
4938
|
async function* scanEndOfCentralDirectory(reader, scanLength) {
|
|
4719
4939
|
const scanOffset = reader.size - scanLength;
|
|
4720
4940
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
4721
|
-
const scanView = getDataView
|
|
4941
|
+
const scanView = getDataView(scanArray);
|
|
4722
4942
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
4723
4943
|
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4724
4944
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
@@ -4741,7 +4961,8 @@ async function getCentralDirectoryReachability(reader, view, anchoredOffset, ind
|
|
|
4741
4961
|
if (!filesLength && !directoryDataLength) {
|
|
4742
4962
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
4743
4963
|
}
|
|
4744
|
-
|
|
4964
|
+
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
4965
|
+
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
4745
4966
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4746
4967
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
4747
4968
|
}
|
|
@@ -4759,7 +4980,7 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
|
|
|
4759
4980
|
if (remoteProbeBudget.count > 0) {
|
|
4760
4981
|
remoteProbeBudget.count--;
|
|
4761
4982
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
4762
|
-
return getUint32(getDataView
|
|
4983
|
+
return getUint32(getDataView(signatureArray), 0);
|
|
4763
4984
|
}
|
|
4764
4985
|
return UNDEFINED_VALUE;
|
|
4765
4986
|
}
|
|
@@ -4824,9 +5045,27 @@ function getBigUint64(view, offset) {
|
|
|
4824
5045
|
return Number(view.getBigUint64(offset, true));
|
|
4825
5046
|
}
|
|
4826
5047
|
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
5048
|
+
var zipReader = /*#__PURE__*/Object.freeze({
|
|
5049
|
+
__proto__: null,
|
|
5050
|
+
ERR_AMBIGUOUS_ARCHIVE: ERR_AMBIGUOUS_ARCHIVE,
|
|
5051
|
+
ERR_BAD_FORMAT: ERR_BAD_FORMAT,
|
|
5052
|
+
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5053
|
+
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5054
|
+
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5055
|
+
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5056
|
+
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
5057
|
+
ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
|
|
5058
|
+
ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
|
|
5059
|
+
ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
|
|
5060
|
+
ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
|
|
5061
|
+
ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
|
|
5062
|
+
ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
|
|
5063
|
+
ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
|
|
5064
|
+
ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
|
|
5065
|
+
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
5066
|
+
ZipReader: ZipReader,
|
|
5067
|
+
ZipReaderStream: ZipReaderStream
|
|
5068
|
+
});
|
|
4830
5069
|
|
|
4831
5070
|
/*
|
|
4832
5071
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -4891,9 +5130,10 @@ class ZipWriter {
|
|
|
4891
5130
|
|
|
4892
5131
|
constructor(writer, options = {}) {
|
|
4893
5132
|
writer = new GenericWriter(writer);
|
|
5133
|
+
const { availableSize = INFINITY_VALUE, maxSize = INFINITY_VALUE } = writer;
|
|
4894
5134
|
const addSplitZipSignature =
|
|
4895
|
-
|
|
4896
|
-
|
|
5135
|
+
availableSize > 0 && availableSize !== INFINITY_VALUE &&
|
|
5136
|
+
maxSize > 0 && maxSize !== INFINITY_VALUE;
|
|
4897
5137
|
Object.assign(this, {
|
|
4898
5138
|
writer,
|
|
4899
5139
|
addSplitZipSignature,
|
|
@@ -4915,9 +5155,10 @@ class ZipWriter {
|
|
|
4915
5155
|
}
|
|
4916
5156
|
reader = new GenericReader(reader);
|
|
4917
5157
|
await initStream(reader);
|
|
4918
|
-
const
|
|
4919
|
-
const
|
|
4920
|
-
await zipReader.
|
|
5158
|
+
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
5159
|
+
const zipReader$1 = new ZipReader(reader.readable);
|
|
5160
|
+
const entries = await zipReader$1.getEntries();
|
|
5161
|
+
await zipReader$1.close();
|
|
4921
5162
|
await initStream(this.writer);
|
|
4922
5163
|
await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
|
|
4923
5164
|
this.writer.size = this.offset = reader.size;
|
|
@@ -4933,8 +5174,6 @@ class ZipWriter {
|
|
|
4933
5174
|
encrypted,
|
|
4934
5175
|
uncompressedSize,
|
|
4935
5176
|
compressedSize,
|
|
4936
|
-
diskOffset,
|
|
4937
|
-
diskNumber,
|
|
4938
5177
|
zip64
|
|
4939
5178
|
} = entry;
|
|
4940
5179
|
let {
|
|
@@ -4982,8 +5221,9 @@ class ZipWriter {
|
|
|
4982
5221
|
Object.assign(entry, {
|
|
4983
5222
|
zip64UncompressedSize,
|
|
4984
5223
|
zip64CompressedSize,
|
|
4985
|
-
zip64Offset: zip64 &&
|
|
4986
|
-
|
|
5224
|
+
zip64Offset: zip64 && entry.offset >= MAX_32_BITS,
|
|
5225
|
+
diskNumberStart: 0,
|
|
5226
|
+
zip64DiskNumberStart: false,
|
|
4987
5227
|
rawExtraFieldZip64,
|
|
4988
5228
|
rawExtraFieldAES,
|
|
4989
5229
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -5150,7 +5390,8 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
5150
5390
|
try {
|
|
5151
5391
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
5152
5392
|
({ reader } = sizesInfo);
|
|
5153
|
-
const
|
|
5393
|
+
const diskOffset = getDiskOffset(zipWriter.writer);
|
|
5394
|
+
const diskNumber = getDiskNumber(zipWriter.writer);
|
|
5154
5395
|
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
5155
5396
|
internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
|
|
5156
5397
|
externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
|
|
@@ -5327,7 +5568,7 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
5327
5568
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
5328
5569
|
const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
|
|
5329
5570
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
5330
|
-
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS
|
|
5571
|
+
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
5331
5572
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
5332
5573
|
const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
5333
5574
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
@@ -5525,7 +5766,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
5525
5766
|
await requestLockWriter();
|
|
5526
5767
|
}
|
|
5527
5768
|
await initStream(fileWriter);
|
|
5528
|
-
const
|
|
5769
|
+
const diskOffset = getDiskOffset(writer);
|
|
5529
5770
|
if (zipWriter.addSplitZipSignature) {
|
|
5530
5771
|
delete zipWriter.addSplitZipSignature;
|
|
5531
5772
|
const signatureArray = new Uint8Array(4);
|
|
@@ -5542,7 +5783,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
5542
5783
|
await lockPreviousFileEntry;
|
|
5543
5784
|
await skipDiskIfNeeded();
|
|
5544
5785
|
}
|
|
5545
|
-
const diskNumberStart = writer
|
|
5786
|
+
const diskNumberStart = getDiskNumber(writer);
|
|
5546
5787
|
const entryOffset = getSegmentOffset(zipWriter, writer);
|
|
5547
5788
|
fileEntry.diskNumberStart = diskNumberStart;
|
|
5548
5789
|
if (!bufferedWrite) {
|
|
@@ -5562,11 +5803,11 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
5562
5803
|
writingBufferedEntryData = true;
|
|
5563
5804
|
writerSizeBeforeEntry = writer.size;
|
|
5564
5805
|
await skipDiskIfNeeded();
|
|
5565
|
-
fileEntry.diskNumberStart = writer
|
|
5806
|
+
fileEntry.diskNumberStart = getDiskNumber(writer);
|
|
5566
5807
|
fileEntry.offset = getSegmentOffset(zipWriter, writer);
|
|
5567
5808
|
if (usdz) {
|
|
5568
5809
|
const previousMetadataSize = entryInfo.metadataSize;
|
|
5569
|
-
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer
|
|
5810
|
+
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - getDiskOffset(writer));
|
|
5570
5811
|
fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
|
|
5571
5812
|
}
|
|
5572
5813
|
updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
|
|
@@ -5631,9 +5872,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
5631
5872
|
}
|
|
5632
5873
|
|
|
5633
5874
|
async function skipDiskIfNeeded() {
|
|
5634
|
-
if (getLength(headerInfo.localHeaderArray)
|
|
5635
|
-
writer.
|
|
5636
|
-
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
5875
|
+
if (exceedsAvailableSize(writer, getLength(headerInfo.localHeaderArray))) {
|
|
5876
|
+
await writer.closeDisk();
|
|
5637
5877
|
}
|
|
5638
5878
|
}
|
|
5639
5879
|
}
|
|
@@ -5744,7 +5984,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
5744
5984
|
}
|
|
5745
5985
|
const { writable } = writer;
|
|
5746
5986
|
if (reader) {
|
|
5747
|
-
const readable = reader.createReadable ? reader.createReadable(
|
|
5987
|
+
const readable = reader.createReadable ? reader.createReadable() : reader.readable;
|
|
5748
5988
|
const size = reader.size;
|
|
5749
5989
|
const workerOptions = {
|
|
5750
5990
|
options: {
|
|
@@ -6176,8 +6416,8 @@ function updateLocalHeader({
|
|
|
6176
6416
|
|
|
6177
6417
|
async function closeFile(zipWriter, comment, options) {
|
|
6178
6418
|
const directoryDataLength = createDirectoryRecords(zipWriter.files);
|
|
6179
|
-
const
|
|
6180
|
-
await writeEndOfDirectoryRecord(zipWriter, comment, options, {
|
|
6419
|
+
const directoryStart = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
6420
|
+
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength });
|
|
6181
6421
|
}
|
|
6182
6422
|
|
|
6183
6423
|
function createDirectoryRecords(files) {
|
|
@@ -6259,8 +6499,8 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
6259
6499
|
await initStream(writer);
|
|
6260
6500
|
let offset = 0;
|
|
6261
6501
|
let directoryDiskOffset = 0;
|
|
6262
|
-
let
|
|
6263
|
-
let
|
|
6502
|
+
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
6503
|
+
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
6264
6504
|
for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
|
|
6265
6505
|
const {
|
|
6266
6506
|
offset: fileEntryOffset,
|
|
@@ -6287,15 +6527,14 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
6287
6527
|
} = fileEntry;
|
|
6288
6528
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
6289
6529
|
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
6290
|
-
if (offset + directoryRecordLength - directoryDiskOffset
|
|
6530
|
+
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
6291
6531
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
6292
6532
|
directoryDiskOffset = offset;
|
|
6293
|
-
writer.
|
|
6294
|
-
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
6533
|
+
await writer.closeDisk();
|
|
6295
6534
|
}
|
|
6296
6535
|
if (indexFileEntry == 0) {
|
|
6297
|
-
|
|
6298
|
-
|
|
6536
|
+
directoryStartDiskNumber = getDiskNumber(writer);
|
|
6537
|
+
directoryStartDiskOffset = getDiskOffset(writer);
|
|
6299
6538
|
}
|
|
6300
6539
|
if (!zip64UncompressedSize) {
|
|
6301
6540
|
setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
|
|
@@ -6335,18 +6574,18 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
6335
6574
|
}
|
|
6336
6575
|
}
|
|
6337
6576
|
await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
|
|
6338
|
-
return {
|
|
6577
|
+
return { diskNumber: directoryStartDiskNumber, diskOffset: directoryStartDiskOffset };
|
|
6339
6578
|
}
|
|
6340
6579
|
|
|
6341
6580
|
async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
6342
6581
|
const { writer } = zipWriter;
|
|
6343
|
-
const {
|
|
6582
|
+
const { directoryStart } = cdInfo;
|
|
6344
6583
|
let { directoryDataLength } = cdInfo;
|
|
6345
6584
|
let filesLength = zipWriter.files.size;
|
|
6346
|
-
let diskNumber =
|
|
6347
|
-
let directoryOffset =
|
|
6348
|
-
let lastDiskNumber = writer
|
|
6349
|
-
if (writer
|
|
6585
|
+
let diskNumber = directoryStart.diskNumber;
|
|
6586
|
+
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
6587
|
+
let lastDiskNumber = getDiskNumber(writer);
|
|
6588
|
+
if (exceedsAvailableSize(writer, END_OF_CENTRAL_DIR_LENGTH)) {
|
|
6350
6589
|
lastDiskNumber++;
|
|
6351
6590
|
}
|
|
6352
6591
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
@@ -6362,11 +6601,10 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
6362
6601
|
throw new Error(ERR_INVALID_COMMENT);
|
|
6363
6602
|
}
|
|
6364
6603
|
const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
6365
|
-
if (getLength(endOfdirectoryRecord.array) + commentLength
|
|
6366
|
-
writer.
|
|
6367
|
-
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
6604
|
+
if (exceedsAvailableSize(writer, getLength(endOfdirectoryRecord.array) + commentLength)) {
|
|
6605
|
+
await writer.closeDisk();
|
|
6368
6606
|
}
|
|
6369
|
-
lastDiskNumber = writer
|
|
6607
|
+
lastDiskNumber = getDiskNumber(writer);
|
|
6370
6608
|
if (zip64) {
|
|
6371
6609
|
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6372
6610
|
endOfdirectoryRecord.uint64(44);
|
|
@@ -6380,7 +6618,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
6380
6618
|
endOfdirectoryRecord.uint64(directoryOffset);
|
|
6381
6619
|
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
6382
6620
|
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6383
|
-
endOfdirectoryRecord.uint64(BigInt(zipWriter
|
|
6621
|
+
endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength));
|
|
6384
6622
|
endOfdirectoryRecord.uint32(lastDiskNumber + 1);
|
|
6385
6623
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
6386
6624
|
if (supportZip64SplitFile) {
|
|
@@ -6420,8 +6658,23 @@ function createRecordWriter(length) {
|
|
|
6420
6658
|
};
|
|
6421
6659
|
}
|
|
6422
6660
|
|
|
6423
|
-
function
|
|
6424
|
-
|
|
6661
|
+
function getDiskNumber(writer) {
|
|
6662
|
+
const { diskNumber = 0 } = writer;
|
|
6663
|
+
return diskNumber;
|
|
6664
|
+
}
|
|
6665
|
+
|
|
6666
|
+
function getDiskOffset(writer) {
|
|
6667
|
+
const { diskOffset = 0 } = writer;
|
|
6668
|
+
return diskOffset;
|
|
6669
|
+
}
|
|
6670
|
+
|
|
6671
|
+
function exceedsAvailableSize(writer, length) {
|
|
6672
|
+
const { availableSize = INFINITY_VALUE } = writer;
|
|
6673
|
+
return length > availableSize;
|
|
6674
|
+
}
|
|
6675
|
+
|
|
6676
|
+
function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
|
|
6677
|
+
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
6425
6678
|
}
|
|
6426
6679
|
|
|
6427
6680
|
async function writeData(writer, array) {
|
|
@@ -6498,9 +6751,6 @@ function arraySet(array, typedArray, offset) {
|
|
|
6498
6751
|
array.set(typedArray, offset);
|
|
6499
6752
|
}
|
|
6500
6753
|
|
|
6501
|
-
function getDataView(array) {
|
|
6502
|
-
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
6503
|
-
}
|
|
6504
6754
|
|
|
6505
6755
|
function getLength(...arrayLikes) {
|
|
6506
6756
|
let result = 0;
|
|
@@ -7041,7 +7291,7 @@ function createSyncAccessHandleTempStream(options = {}) {
|
|
|
7041
7291
|
|
|
7042
7292
|
|
|
7043
7293
|
try {
|
|
7044
|
-
|
|
7294
|
+
setDefaultConfiguration({ baseURI: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-native.cjs', document.baseURI).href)) });
|
|
7045
7295
|
} catch {
|
|
7046
7296
|
// ignored
|
|
7047
7297
|
}
|
|
@@ -7077,7 +7327,7 @@ var{Uint8Array:x,Uint16Array:g,Int32Array:R,TransformStream:H,Math:z,Error:L,Arr
|
|
|
7077
7327
|
*/
|
|
7078
7328
|
|
|
7079
7329
|
|
|
7080
|
-
|
|
7330
|
+
setDefaultConfiguration({
|
|
7081
7331
|
workerURI: "./core/web-worker-native.js",
|
|
7082
7332
|
wasmURI: null,
|
|
7083
7333
|
CompressionStreamZlib: E_,
|
|
@@ -7262,9 +7512,7 @@ class ZipFileEntry extends ZipEntry {
|
|
|
7262
7512
|
|
|
7263
7513
|
async getArrayBuffer(options) {
|
|
7264
7514
|
const array = await this.getUint8Array(options);
|
|
7265
|
-
return array.
|
|
7266
|
-
? array.buffer.slice(array.byteOffset, array.byteOffset + array.byteLength)
|
|
7267
|
-
: array.buffer;
|
|
7515
|
+
return toExactUint8Array(array).buffer;
|
|
7268
7516
|
}
|
|
7269
7517
|
|
|
7270
7518
|
replaceBlob(blob) {
|
|
@@ -9768,7 +10016,7 @@ function getMimeTypes() {
|
|
|
9768
10016
|
*/
|
|
9769
10017
|
|
|
9770
10018
|
|
|
9771
|
-
i(
|
|
10019
|
+
i(setDefaultConfiguration);
|
|
9772
10020
|
|
|
9773
10021
|
exports.BlobReader = BlobReader;
|
|
9774
10022
|
exports.BlobWriter = BlobWriter;
|
|
@@ -9783,6 +10031,7 @@ exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
|
9783
10031
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
9784
10032
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
9785
10033
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
10034
|
+
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
9786
10035
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
9787
10036
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
9788
10037
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
@@ -9825,4 +10074,5 @@ exports.createOPFSTempStream = createOPFSTempStream;
|
|
|
9825
10074
|
exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
|
|
9826
10075
|
exports.fs = fs;
|
|
9827
10076
|
exports.getMimeType = getMimeType;
|
|
10077
|
+
exports.resetConfiguration = resetConfiguration;
|
|
9828
10078
|
exports.terminateWorkers = terminateWorkers;
|