nitro-patcher 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/browser.js CHANGED
@@ -4,11 +4,20 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __getProtoOf = Object.getPrototypeOf;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __esm = (fn, res) => function __init() {
8
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
+ var __esm = (fn, res, err2) => function __init() {
8
+ if (err2) throw err2[0];
9
+ try {
10
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
+ } catch (e) {
12
+ throw err2 = [e], e;
13
+ }
9
14
  };
10
15
  var __commonJS = (cb, mod) => function __require() {
11
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
16
+ try {
17
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
18
+ } catch (e) {
19
+ throw mod = 0, e;
20
+ }
12
21
  };
13
22
  var __copyProps = (to, from, except, desc) => {
14
23
  if (from && typeof from === "object" || typeof from === "function") {
@@ -39,11 +48,11 @@ var require_base64_js = __commonJS({
39
48
  var revLookup = [];
40
49
  var Arr = typeof Uint8Array !== "undefined" ? Uint8Array : Array;
41
50
  var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
42
- for (i = 0, len = code.length; i < len; ++i) {
43
- lookup[i] = code[i];
44
- revLookup[code.charCodeAt(i)] = i;
51
+ for (i2 = 0, len = code.length; i2 < len; ++i2) {
52
+ lookup[i2] = code[i2];
53
+ revLookup[code.charCodeAt(i2)] = i2;
45
54
  }
46
- var i;
55
+ var i2;
47
56
  var len;
48
57
  revLookup["-".charCodeAt(0)] = 62;
49
58
  revLookup["_".charCodeAt(0)] = 63;
@@ -74,19 +83,19 @@ var require_base64_js = __commonJS({
74
83
  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));
75
84
  var curByte = 0;
76
85
  var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen;
77
- var i2;
78
- for (i2 = 0; i2 < len2; i2 += 4) {
79
- tmp = revLookup[b64.charCodeAt(i2)] << 18 | revLookup[b64.charCodeAt(i2 + 1)] << 12 | revLookup[b64.charCodeAt(i2 + 2)] << 6 | revLookup[b64.charCodeAt(i2 + 3)];
86
+ var i3;
87
+ for (i3 = 0; i3 < len2; i3 += 4) {
88
+ tmp = revLookup[b64.charCodeAt(i3)] << 18 | revLookup[b64.charCodeAt(i3 + 1)] << 12 | revLookup[b64.charCodeAt(i3 + 2)] << 6 | revLookup[b64.charCodeAt(i3 + 3)];
80
89
  arr[curByte++] = tmp >> 16 & 255;
81
90
  arr[curByte++] = tmp >> 8 & 255;
82
91
  arr[curByte++] = tmp & 255;
83
92
  }
84
93
  if (placeHoldersLen === 2) {
85
- tmp = revLookup[b64.charCodeAt(i2)] << 2 | revLookup[b64.charCodeAt(i2 + 1)] >> 4;
94
+ tmp = revLookup[b64.charCodeAt(i3)] << 2 | revLookup[b64.charCodeAt(i3 + 1)] >> 4;
86
95
  arr[curByte++] = tmp & 255;
87
96
  }
88
97
  if (placeHoldersLen === 1) {
89
- tmp = revLookup[b64.charCodeAt(i2)] << 10 | revLookup[b64.charCodeAt(i2 + 1)] << 4 | revLookup[b64.charCodeAt(i2 + 2)] >> 2;
98
+ tmp = revLookup[b64.charCodeAt(i3)] << 10 | revLookup[b64.charCodeAt(i3 + 1)] << 4 | revLookup[b64.charCodeAt(i3 + 2)] >> 2;
90
99
  arr[curByte++] = tmp >> 8 & 255;
91
100
  arr[curByte++] = tmp & 255;
92
101
  }
@@ -98,8 +107,8 @@ var require_base64_js = __commonJS({
98
107
  function encodeChunk(uint8, start, end) {
99
108
  var tmp;
100
109
  var output = [];
101
- for (var i2 = start; i2 < end; i2 += 3) {
102
- tmp = (uint8[i2] << 16 & 16711680) + (uint8[i2 + 1] << 8 & 65280) + (uint8[i2 + 2] & 255);
110
+ for (var i3 = start; i3 < end; i3 += 3) {
111
+ tmp = (uint8[i3] << 16 & 16711680) + (uint8[i3 + 1] << 8 & 65280) + (uint8[i3 + 2] & 255);
103
112
  output.push(tripletToBase64(tmp));
104
113
  }
105
114
  return output.join("");
@@ -110,8 +119,8 @@ var require_base64_js = __commonJS({
110
119
  var extraBytes = len2 % 3;
111
120
  var parts = [];
112
121
  var maxChunkLength = 16383;
113
- for (var i2 = 0, len22 = len2 - extraBytes; i2 < len22; i2 += maxChunkLength) {
114
- parts.push(encodeChunk(uint8, i2, i2 + maxChunkLength > len22 ? len22 : i2 + maxChunkLength));
122
+ for (var i3 = 0, len22 = len2 - extraBytes; i3 < len22; i3 += maxChunkLength) {
123
+ parts.push(encodeChunk(uint8, i3, i3 + maxChunkLength > len22 ? len22 : i3 + maxChunkLength));
115
124
  }
116
125
  if (extraBytes === 1) {
117
126
  tmp = uint8[len2 - 1];
@@ -139,19 +148,19 @@ var require_ieee754 = __commonJS({
139
148
  var eMax = (1 << eLen) - 1;
140
149
  var eBias = eMax >> 1;
141
150
  var nBits = -7;
142
- var i = isLE2 ? nBytes - 1 : 0;
151
+ var i2 = isLE2 ? nBytes - 1 : 0;
143
152
  var d = isLE2 ? -1 : 1;
144
- var s = buffer[offset + i];
145
- i += d;
153
+ var s = buffer[offset + i2];
154
+ i2 += d;
146
155
  e = s & (1 << -nBits) - 1;
147
156
  s >>= -nBits;
148
157
  nBits += eLen;
149
- for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {
158
+ for (; nBits > 0; e = e * 256 + buffer[offset + i2], i2 += d, nBits -= 8) {
150
159
  }
151
160
  m = e & (1 << -nBits) - 1;
152
161
  e >>= -nBits;
153
162
  nBits += mLen;
154
- for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {
163
+ for (; nBits > 0; m = m * 256 + buffer[offset + i2], i2 += d, nBits -= 8) {
155
164
  }
156
165
  if (e === 0) {
157
166
  e = 1 - eBias;
@@ -169,7 +178,7 @@ var require_ieee754 = __commonJS({
169
178
  var eMax = (1 << eLen) - 1;
170
179
  var eBias = eMax >> 1;
171
180
  var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
172
- var i = isLE2 ? 0 : nBytes - 1;
181
+ var i2 = isLE2 ? 0 : nBytes - 1;
173
182
  var d = isLE2 ? 1 : -1;
174
183
  var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
175
184
  value = Math.abs(value);
@@ -202,13 +211,13 @@ var require_ieee754 = __commonJS({
202
211
  e = 0;
203
212
  }
204
213
  }
205
- for (; mLen >= 8; buffer[offset + i] = m & 255, i += d, m /= 256, mLen -= 8) {
214
+ for (; mLen >= 8; buffer[offset + i2] = m & 255, i2 += d, m /= 256, mLen -= 8) {
206
215
  }
207
216
  e = e << mLen | m;
208
217
  eLen += mLen;
209
- for (; eLen > 0; buffer[offset + i] = e & 255, i += d, e /= 256, eLen -= 8) {
218
+ for (; eLen > 0; buffer[offset + i2] = e & 255, i2 += d, e /= 256, eLen -= 8) {
210
219
  }
211
- buffer[offset + i - d] |= s * 128;
220
+ buffer[offset + i2 - d] |= s * 128;
212
221
  };
213
222
  }
214
223
  });
@@ -368,8 +377,8 @@ var require_buffer = __commonJS({
368
377
  function fromArrayLike(array) {
369
378
  const length = array.length < 0 ? 0 : checked(array.length) | 0;
370
379
  const buf = createBuffer(length);
371
- for (let i = 0; i < length; i += 1) {
372
- buf[i] = array[i] & 255;
380
+ for (let i2 = 0; i2 < length; i2 += 1) {
381
+ buf[i2] = array[i2] & 255;
373
382
  }
374
383
  return buf;
375
384
  }
@@ -442,17 +451,17 @@ var require_buffer = __commonJS({
442
451
  );
443
452
  }
444
453
  if (a === b) return 0;
445
- let x = a.length;
454
+ let x2 = a.length;
446
455
  let y = b.length;
447
- for (let i = 0, len = Math.min(x, y); i < len; ++i) {
448
- if (a[i] !== b[i]) {
449
- x = a[i];
450
- y = b[i];
456
+ for (let i2 = 0, len = Math.min(x2, y); i2 < len; ++i2) {
457
+ if (a[i2] !== b[i2]) {
458
+ x2 = a[i2];
459
+ y = b[i2];
451
460
  break;
452
461
  }
453
462
  }
454
- if (x < y) return -1;
455
- if (y < x) return 1;
463
+ if (x2 < y) return -1;
464
+ if (y < x2) return 1;
456
465
  return 0;
457
466
  };
458
467
  Buffer3.isEncoding = function isEncoding(encoding) {
@@ -480,17 +489,17 @@ var require_buffer = __commonJS({
480
489
  if (list.length === 0) {
481
490
  return Buffer3.alloc(0);
482
491
  }
483
- let i;
492
+ let i2;
484
493
  if (length === void 0) {
485
494
  length = 0;
486
- for (i = 0; i < list.length; ++i) {
487
- length += list[i].length;
495
+ for (i2 = 0; i2 < list.length; ++i2) {
496
+ length += list[i2].length;
488
497
  }
489
498
  }
490
499
  const buffer = Buffer3.allocUnsafe(length);
491
500
  let pos = 0;
492
- for (i = 0; i < list.length; ++i) {
493
- let buf = list[i];
501
+ for (i2 = 0; i2 < list.length; ++i2) {
502
+ let buf = list[i2];
494
503
  if (isInstance(buf, Uint8Array)) {
495
504
  if (pos + buf.length > buffer.length) {
496
505
  if (!Buffer3.isBuffer(buf)) buf = Buffer3.from(buf);
@@ -603,17 +612,17 @@ var require_buffer = __commonJS({
603
612
  }
604
613
  Buffer3.prototype._isBuffer = true;
605
614
  function swap(b, n, m) {
606
- const i = b[n];
615
+ const i2 = b[n];
607
616
  b[n] = b[m];
608
- b[m] = i;
617
+ b[m] = i2;
609
618
  }
610
619
  Buffer3.prototype.swap16 = function swap16() {
611
620
  const len = this.length;
612
621
  if (len % 2 !== 0) {
613
622
  throw new RangeError("Buffer size must be a multiple of 16-bits");
614
623
  }
615
- for (let i = 0; i < len; i += 2) {
616
- swap(this, i, i + 1);
624
+ for (let i2 = 0; i2 < len; i2 += 2) {
625
+ swap(this, i2, i2 + 1);
617
626
  }
618
627
  return this;
619
628
  };
@@ -622,9 +631,9 @@ var require_buffer = __commonJS({
622
631
  if (len % 4 !== 0) {
623
632
  throw new RangeError("Buffer size must be a multiple of 32-bits");
624
633
  }
625
- for (let i = 0; i < len; i += 4) {
626
- swap(this, i, i + 3);
627
- swap(this, i + 1, i + 2);
634
+ for (let i2 = 0; i2 < len; i2 += 4) {
635
+ swap(this, i2, i2 + 3);
636
+ swap(this, i2 + 1, i2 + 2);
628
637
  }
629
638
  return this;
630
639
  };
@@ -633,11 +642,11 @@ var require_buffer = __commonJS({
633
642
  if (len % 8 !== 0) {
634
643
  throw new RangeError("Buffer size must be a multiple of 64-bits");
635
644
  }
636
- for (let i = 0; i < len; i += 8) {
637
- swap(this, i, i + 7);
638
- swap(this, i + 1, i + 6);
639
- swap(this, i + 2, i + 5);
640
- swap(this, i + 3, i + 4);
645
+ for (let i2 = 0; i2 < len; i2 += 8) {
646
+ swap(this, i2, i2 + 7);
647
+ swap(this, i2 + 1, i2 + 6);
648
+ swap(this, i2 + 2, i2 + 5);
649
+ swap(this, i2 + 3, i2 + 4);
641
650
  }
642
651
  return this;
643
652
  };
@@ -701,20 +710,20 @@ var require_buffer = __commonJS({
701
710
  thisStart >>>= 0;
702
711
  thisEnd >>>= 0;
703
712
  if (this === target) return 0;
704
- let x = thisEnd - thisStart;
713
+ let x2 = thisEnd - thisStart;
705
714
  let y = end - start;
706
- const len = Math.min(x, y);
715
+ const len = Math.min(x2, y);
707
716
  const thisCopy = this.slice(thisStart, thisEnd);
708
717
  const targetCopy = target.slice(start, end);
709
- for (let i = 0; i < len; ++i) {
710
- if (thisCopy[i] !== targetCopy[i]) {
711
- x = thisCopy[i];
712
- y = targetCopy[i];
718
+ for (let i2 = 0; i2 < len; ++i2) {
719
+ if (thisCopy[i2] !== targetCopy[i2]) {
720
+ x2 = thisCopy[i2];
721
+ y = targetCopy[i2];
713
722
  break;
714
723
  }
715
724
  }
716
- if (x < y) return -1;
717
- if (y < x) return 1;
725
+ if (x2 < y) return -1;
726
+ if (y < x2) return 1;
718
727
  return 0;
719
728
  };
720
729
  function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {
@@ -776,36 +785,36 @@ var require_buffer = __commonJS({
776
785
  byteOffset /= 2;
777
786
  }
778
787
  }
779
- function read(buf, i2) {
788
+ function read(buf, i3) {
780
789
  if (indexSize === 1) {
781
- return buf[i2];
790
+ return buf[i3];
782
791
  } else {
783
- return buf.readUInt16BE(i2 * indexSize);
792
+ return buf.readUInt16BE(i3 * indexSize);
784
793
  }
785
794
  }
786
- let i;
795
+ let i2;
787
796
  if (dir) {
788
797
  let foundIndex = -1;
789
- for (i = byteOffset; i < arrLength; i++) {
790
- if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
791
- if (foundIndex === -1) foundIndex = i;
792
- if (i - foundIndex + 1 === valLength) return foundIndex * indexSize;
798
+ for (i2 = byteOffset; i2 < arrLength; i2++) {
799
+ if (read(arr, i2) === read(val, foundIndex === -1 ? 0 : i2 - foundIndex)) {
800
+ if (foundIndex === -1) foundIndex = i2;
801
+ if (i2 - foundIndex + 1 === valLength) return foundIndex * indexSize;
793
802
  } else {
794
- if (foundIndex !== -1) i -= i - foundIndex;
803
+ if (foundIndex !== -1) i2 -= i2 - foundIndex;
795
804
  foundIndex = -1;
796
805
  }
797
806
  }
798
807
  } else {
799
808
  if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
800
- for (i = byteOffset; i >= 0; i--) {
809
+ for (i2 = byteOffset; i2 >= 0; i2--) {
801
810
  let found = true;
802
811
  for (let j = 0; j < valLength; j++) {
803
- if (read(arr, i + j) !== read(val, j)) {
812
+ if (read(arr, i2 + j) !== read(val, j)) {
804
813
  found = false;
805
814
  break;
806
815
  }
807
816
  }
808
- if (found) return i;
817
+ if (found) return i2;
809
818
  }
810
819
  }
811
820
  return -1;
@@ -834,13 +843,13 @@ var require_buffer = __commonJS({
834
843
  if (length > strLen / 2) {
835
844
  length = strLen / 2;
836
845
  }
837
- let i;
838
- for (i = 0; i < length; ++i) {
839
- const parsed = parseInt(string.substr(i * 2, 2), 16);
840
- if (numberIsNaN(parsed)) return i;
841
- buf[offset + i] = parsed;
846
+ let i2;
847
+ for (i2 = 0; i2 < length; ++i2) {
848
+ const parsed = parseInt(string.substr(i2 * 2, 2), 16);
849
+ if (numberIsNaN(parsed)) return i2;
850
+ buf[offset + i2] = parsed;
842
851
  }
843
- return i;
852
+ return i2;
844
853
  }
845
854
  function utf8Write(buf, string, offset, length) {
846
855
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);
@@ -925,12 +934,12 @@ var require_buffer = __commonJS({
925
934
  function utf8Slice(buf, start, end) {
926
935
  end = Math.min(buf.length, end);
927
936
  const res = [];
928
- let i = start;
929
- while (i < end) {
930
- const firstByte = buf[i];
937
+ let i2 = start;
938
+ while (i2 < end) {
939
+ const firstByte = buf[i2];
931
940
  let codePoint = null;
932
941
  let bytesPerSequence = firstByte > 239 ? 4 : firstByte > 223 ? 3 : firstByte > 191 ? 2 : 1;
933
- if (i + bytesPerSequence <= end) {
942
+ if (i2 + bytesPerSequence <= end) {
934
943
  let secondByte, thirdByte, fourthByte, tempCodePoint;
935
944
  switch (bytesPerSequence) {
936
945
  case 1:
@@ -939,7 +948,7 @@ var require_buffer = __commonJS({
939
948
  }
940
949
  break;
941
950
  case 2:
942
- secondByte = buf[i + 1];
951
+ secondByte = buf[i2 + 1];
943
952
  if ((secondByte & 192) === 128) {
944
953
  tempCodePoint = (firstByte & 31) << 6 | secondByte & 63;
945
954
  if (tempCodePoint > 127) {
@@ -948,8 +957,8 @@ var require_buffer = __commonJS({
948
957
  }
949
958
  break;
950
959
  case 3:
951
- secondByte = buf[i + 1];
952
- thirdByte = buf[i + 2];
960
+ secondByte = buf[i2 + 1];
961
+ thirdByte = buf[i2 + 2];
953
962
  if ((secondByte & 192) === 128 && (thirdByte & 192) === 128) {
954
963
  tempCodePoint = (firstByte & 15) << 12 | (secondByte & 63) << 6 | thirdByte & 63;
955
964
  if (tempCodePoint > 2047 && (tempCodePoint < 55296 || tempCodePoint > 57343)) {
@@ -958,9 +967,9 @@ var require_buffer = __commonJS({
958
967
  }
959
968
  break;
960
969
  case 4:
961
- secondByte = buf[i + 1];
962
- thirdByte = buf[i + 2];
963
- fourthByte = buf[i + 3];
970
+ secondByte = buf[i2 + 1];
971
+ thirdByte = buf[i2 + 2];
972
+ fourthByte = buf[i2 + 3];
964
973
  if ((secondByte & 192) === 128 && (thirdByte & 192) === 128 && (fourthByte & 192) === 128) {
965
974
  tempCodePoint = (firstByte & 15) << 18 | (secondByte & 63) << 12 | (thirdByte & 63) << 6 | fourthByte & 63;
966
975
  if (tempCodePoint > 65535 && tempCodePoint < 1114112) {
@@ -978,7 +987,7 @@ var require_buffer = __commonJS({
978
987
  codePoint = 56320 | codePoint & 1023;
979
988
  }
980
989
  res.push(codePoint);
981
- i += bytesPerSequence;
990
+ i2 += bytesPerSequence;
982
991
  }
983
992
  return decodeCodePointsArray(res);
984
993
  }
@@ -989,11 +998,11 @@ var require_buffer = __commonJS({
989
998
  return String.fromCharCode.apply(String, codePoints);
990
999
  }
991
1000
  let res = "";
992
- let i = 0;
993
- while (i < len) {
1001
+ let i2 = 0;
1002
+ while (i2 < len) {
994
1003
  res += String.fromCharCode.apply(
995
1004
  String,
996
- codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
1005
+ codePoints.slice(i2, i2 += MAX_ARGUMENTS_LENGTH)
997
1006
  );
998
1007
  }
999
1008
  return res;
@@ -1001,16 +1010,16 @@ var require_buffer = __commonJS({
1001
1010
  function asciiSlice(buf, start, end) {
1002
1011
  let ret = "";
1003
1012
  end = Math.min(buf.length, end);
1004
- for (let i = start; i < end; ++i) {
1005
- ret += String.fromCharCode(buf[i] & 127);
1013
+ for (let i2 = start; i2 < end; ++i2) {
1014
+ ret += String.fromCharCode(buf[i2] & 127);
1006
1015
  }
1007
1016
  return ret;
1008
1017
  }
1009
1018
  function latin1Slice(buf, start, end) {
1010
1019
  let ret = "";
1011
1020
  end = Math.min(buf.length, end);
1012
- for (let i = start; i < end; ++i) {
1013
- ret += String.fromCharCode(buf[i]);
1021
+ for (let i2 = start; i2 < end; ++i2) {
1022
+ ret += String.fromCharCode(buf[i2]);
1014
1023
  }
1015
1024
  return ret;
1016
1025
  }
@@ -1019,16 +1028,16 @@ var require_buffer = __commonJS({
1019
1028
  if (!start || start < 0) start = 0;
1020
1029
  if (!end || end < 0 || end > len) end = len;
1021
1030
  let out = "";
1022
- for (let i = start; i < end; ++i) {
1023
- out += hexSliceLookupTable[buf[i]];
1031
+ for (let i2 = start; i2 < end; ++i2) {
1032
+ out += hexSliceLookupTable[buf[i2]];
1024
1033
  }
1025
1034
  return out;
1026
1035
  }
1027
1036
  function utf16leSlice(buf, start, end) {
1028
1037
  const bytes2 = buf.slice(start, end);
1029
1038
  let res = "";
1030
- for (let i = 0; i < bytes2.length - 1; i += 2) {
1031
- res += String.fromCharCode(bytes2[i] + bytes2[i + 1] * 256);
1039
+ for (let i2 = 0; i2 < bytes2.length - 1; i2 += 2) {
1040
+ res += String.fromCharCode(bytes2[i2] + bytes2[i2 + 1] * 256);
1032
1041
  }
1033
1042
  return res;
1034
1043
  }
@@ -1063,9 +1072,9 @@ var require_buffer = __commonJS({
1063
1072
  if (!noAssert) checkOffset(offset, byteLength2, this.length);
1064
1073
  let val = this[offset];
1065
1074
  let mul3 = 1;
1066
- let i = 0;
1067
- while (++i < byteLength2 && (mul3 *= 256)) {
1068
- val += this[offset + i] * mul3;
1075
+ let i2 = 0;
1076
+ while (++i2 < byteLength2 && (mul3 *= 256)) {
1077
+ val += this[offset + i2] * mul3;
1069
1078
  }
1070
1079
  return val;
1071
1080
  };
@@ -1137,9 +1146,9 @@ var require_buffer = __commonJS({
1137
1146
  if (!noAssert) checkOffset(offset, byteLength2, this.length);
1138
1147
  let val = this[offset];
1139
1148
  let mul3 = 1;
1140
- let i = 0;
1141
- while (++i < byteLength2 && (mul3 *= 256)) {
1142
- val += this[offset + i] * mul3;
1149
+ let i2 = 0;
1150
+ while (++i2 < byteLength2 && (mul3 *= 256)) {
1151
+ val += this[offset + i2] * mul3;
1143
1152
  }
1144
1153
  mul3 *= 128;
1145
1154
  if (val >= mul3) val -= Math.pow(2, 8 * byteLength2);
@@ -1149,11 +1158,11 @@ var require_buffer = __commonJS({
1149
1158
  offset = offset >>> 0;
1150
1159
  byteLength2 = byteLength2 >>> 0;
1151
1160
  if (!noAssert) checkOffset(offset, byteLength2, this.length);
1152
- let i = byteLength2;
1161
+ let i2 = byteLength2;
1153
1162
  let mul3 = 1;
1154
- let val = this[offset + --i];
1155
- while (i > 0 && (mul3 *= 256)) {
1156
- val += this[offset + --i] * mul3;
1163
+ let val = this[offset + --i2];
1164
+ while (i2 > 0 && (mul3 *= 256)) {
1165
+ val += this[offset + --i2] * mul3;
1157
1166
  }
1158
1167
  mul3 *= 128;
1159
1168
  if (val >= mul3) val -= Math.pow(2, 8 * byteLength2);
@@ -1244,10 +1253,10 @@ var require_buffer = __commonJS({
1244
1253
  checkInt(this, value, offset, byteLength2, maxBytes, 0);
1245
1254
  }
1246
1255
  let mul3 = 1;
1247
- let i = 0;
1256
+ let i2 = 0;
1248
1257
  this[offset] = value & 255;
1249
- while (++i < byteLength2 && (mul3 *= 256)) {
1250
- this[offset + i] = value / mul3 & 255;
1258
+ while (++i2 < byteLength2 && (mul3 *= 256)) {
1259
+ this[offset + i2] = value / mul3 & 255;
1251
1260
  }
1252
1261
  return offset + byteLength2;
1253
1262
  };
@@ -1259,11 +1268,11 @@ var require_buffer = __commonJS({
1259
1268
  const maxBytes = Math.pow(2, 8 * byteLength2) - 1;
1260
1269
  checkInt(this, value, offset, byteLength2, maxBytes, 0);
1261
1270
  }
1262
- let i = byteLength2 - 1;
1271
+ let i2 = byteLength2 - 1;
1263
1272
  let mul3 = 1;
1264
- this[offset + i] = value & 255;
1265
- while (--i >= 0 && (mul3 *= 256)) {
1266
- this[offset + i] = value / mul3 & 255;
1273
+ this[offset + i2] = value & 255;
1274
+ while (--i2 >= 0 && (mul3 *= 256)) {
1275
+ this[offset + i2] = value / mul3 & 255;
1267
1276
  }
1268
1277
  return offset + byteLength2;
1269
1278
  };
@@ -1363,15 +1372,15 @@ var require_buffer = __commonJS({
1363
1372
  const limit2 = Math.pow(2, 8 * byteLength2 - 1);
1364
1373
  checkInt(this, value, offset, byteLength2, limit2 - 1, -limit2);
1365
1374
  }
1366
- let i = 0;
1375
+ let i2 = 0;
1367
1376
  let mul3 = 1;
1368
1377
  let sub = 0;
1369
1378
  this[offset] = value & 255;
1370
- while (++i < byteLength2 && (mul3 *= 256)) {
1371
- if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
1379
+ while (++i2 < byteLength2 && (mul3 *= 256)) {
1380
+ if (value < 0 && sub === 0 && this[offset + i2 - 1] !== 0) {
1372
1381
  sub = 1;
1373
1382
  }
1374
- this[offset + i] = (value / mul3 >> 0) - sub & 255;
1383
+ this[offset + i2] = (value / mul3 >> 0) - sub & 255;
1375
1384
  }
1376
1385
  return offset + byteLength2;
1377
1386
  };
@@ -1382,15 +1391,15 @@ var require_buffer = __commonJS({
1382
1391
  const limit2 = Math.pow(2, 8 * byteLength2 - 1);
1383
1392
  checkInt(this, value, offset, byteLength2, limit2 - 1, -limit2);
1384
1393
  }
1385
- let i = byteLength2 - 1;
1394
+ let i2 = byteLength2 - 1;
1386
1395
  let mul3 = 1;
1387
1396
  let sub = 0;
1388
- this[offset + i] = value & 255;
1389
- while (--i >= 0 && (mul3 *= 256)) {
1390
- if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
1397
+ this[offset + i2] = value & 255;
1398
+ while (--i2 >= 0 && (mul3 *= 256)) {
1399
+ if (value < 0 && sub === 0 && this[offset + i2 + 1] !== 0) {
1391
1400
  sub = 1;
1392
1401
  }
1393
- this[offset + i] = (value / mul3 >> 0) - sub & 255;
1402
+ this[offset + i2] = (value / mul3 >> 0) - sub & 255;
1394
1403
  }
1395
1404
  return offset + byteLength2;
1396
1405
  };
@@ -1545,10 +1554,10 @@ var require_buffer = __commonJS({
1545
1554
  start = start >>> 0;
1546
1555
  end = end === void 0 ? this.length : end >>> 0;
1547
1556
  if (!val) val = 0;
1548
- let i;
1557
+ let i2;
1549
1558
  if (typeof val === "number") {
1550
- for (i = start; i < end; ++i) {
1551
- this[i] = val;
1559
+ for (i2 = start; i2 < end; ++i2) {
1560
+ this[i2] = val;
1552
1561
  }
1553
1562
  } else {
1554
1563
  const bytes2 = Buffer3.isBuffer(val) ? val : Buffer3.from(val, encoding);
@@ -1556,8 +1565,8 @@ var require_buffer = __commonJS({
1556
1565
  if (len === 0) {
1557
1566
  throw new TypeError('The value "' + val + '" is invalid for argument "value"');
1558
1567
  }
1559
- for (i = 0; i < end - start; ++i) {
1560
- this[i + start] = bytes2[i % len];
1568
+ for (i2 = 0; i2 < end - start; ++i2) {
1569
+ this[i2 + start] = bytes2[i2 % len];
1561
1570
  }
1562
1571
  }
1563
1572
  return this;
@@ -1630,12 +1639,12 @@ var require_buffer = __commonJS({
1630
1639
  );
1631
1640
  function addNumericalSeparator(val) {
1632
1641
  let res = "";
1633
- let i = val.length;
1642
+ let i2 = val.length;
1634
1643
  const start = val[0] === "-" ? 1 : 0;
1635
- for (; i >= start + 4; i -= 3) {
1636
- res = `_${val.slice(i - 3, i)}${res}`;
1644
+ for (; i2 >= start + 4; i2 -= 3) {
1645
+ res = `_${val.slice(i2 - 3, i2)}${res}`;
1637
1646
  }
1638
- return `${val.slice(0, i)}${res}`;
1647
+ return `${val.slice(0, i2)}${res}`;
1639
1648
  }
1640
1649
  function checkBounds(buf, offset, byteLength2) {
1641
1650
  validateNumber(offset, "offset");
@@ -1695,14 +1704,14 @@ var require_buffer = __commonJS({
1695
1704
  const length = string.length;
1696
1705
  let leadSurrogate = null;
1697
1706
  const bytes2 = [];
1698
- for (let i = 0; i < length; ++i) {
1699
- codePoint = string.charCodeAt(i);
1707
+ for (let i2 = 0; i2 < length; ++i2) {
1708
+ codePoint = string.charCodeAt(i2);
1700
1709
  if (codePoint > 55295 && codePoint < 57344) {
1701
1710
  if (!leadSurrogate) {
1702
1711
  if (codePoint > 56319) {
1703
1712
  if ((units -= 3) > -1) bytes2.push(239, 191, 189);
1704
1713
  continue;
1705
- } else if (i + 1 === length) {
1714
+ } else if (i2 + 1 === length) {
1706
1715
  if ((units -= 3) > -1) bytes2.push(239, 191, 189);
1707
1716
  continue;
1708
1717
  }
@@ -1751,17 +1760,17 @@ var require_buffer = __commonJS({
1751
1760
  }
1752
1761
  function asciiToBytes(str) {
1753
1762
  const byteArray = [];
1754
- for (let i = 0; i < str.length; ++i) {
1755
- byteArray.push(str.charCodeAt(i) & 255);
1763
+ for (let i2 = 0; i2 < str.length; ++i2) {
1764
+ byteArray.push(str.charCodeAt(i2) & 255);
1756
1765
  }
1757
1766
  return byteArray;
1758
1767
  }
1759
1768
  function utf16leToBytes(str, units) {
1760
1769
  let c, hi, lo;
1761
1770
  const byteArray = [];
1762
- for (let i = 0; i < str.length; ++i) {
1771
+ for (let i2 = 0; i2 < str.length; ++i2) {
1763
1772
  if ((units -= 2) < 0) break;
1764
- c = str.charCodeAt(i);
1773
+ c = str.charCodeAt(i2);
1765
1774
  hi = c >> 8;
1766
1775
  lo = c % 256;
1767
1776
  byteArray.push(lo);
@@ -1773,12 +1782,12 @@ var require_buffer = __commonJS({
1773
1782
  return base64.toByteArray(base64clean(str));
1774
1783
  }
1775
1784
  function blitBuffer(src, dst, offset, length) {
1776
- let i;
1777
- for (i = 0; i < length; ++i) {
1778
- if (i + offset >= dst.length || i >= src.length) break;
1779
- dst[i + offset] = src[i];
1785
+ let i2;
1786
+ for (i2 = 0; i2 < length; ++i2) {
1787
+ if (i2 + offset >= dst.length || i2 >= src.length) break;
1788
+ dst[i2 + offset] = src[i2];
1780
1789
  }
1781
- return i;
1790
+ return i2;
1782
1791
  }
1783
1792
  function isInstance(obj, type) {
1784
1793
  return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name;
@@ -1789,10 +1798,10 @@ var require_buffer = __commonJS({
1789
1798
  var hexSliceLookupTable = (function() {
1790
1799
  const alphabet = "0123456789abcdef";
1791
1800
  const table2 = new Array(256);
1792
- for (let i = 0; i < 16; ++i) {
1793
- const i16 = i * 16;
1801
+ for (let i2 = 0; i2 < 16; ++i2) {
1802
+ const i16 = i2 * 16;
1794
1803
  for (let j = 0; j < 16; ++j) {
1795
- table2[i16 + j] = alphabet[i] + alphabet[j];
1804
+ table2[i16 + j] = alphabet[i2] + alphabet[j];
1796
1805
  }
1797
1806
  }
1798
1807
  return table2;
@@ -1824,24 +1833,10 @@ init_buffer();
1824
1833
  // src/runtime/browser.ts
1825
1834
  init_buffer();
1826
1835
 
1827
- // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/legacy.js
1828
- init_buffer();
1829
-
1830
- // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/_md.js
1831
- init_buffer();
1832
-
1833
- // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/_u64.js
1836
+ // node_modules/.pnpm/@noble+ciphers@2.4.0/node_modules/@noble/ciphers/aes.js
1834
1837
  init_buffer();
1835
- var fromNumH = (n) => n / 2 ** 32 | 0;
1836
- var fromNumL = (n) => n >>> 0;
1837
- function setU64FromNum(view, byteOffset, n, isLE2) {
1838
- const h = fromNumH(n);
1839
- const l = fromNumL(n);
1840
- view.setUint32(byteOffset, isLE2 ? l : h, isLE2);
1841
- view.setUint32(byteOffset + 4, isLE2 ? h : l, isLE2);
1842
- }
1843
1838
 
1844
- // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/utils.js
1839
+ // node_modules/.pnpm/@noble+ciphers@2.4.0/node_modules/@noble/ciphers/utils.js
1845
1840
  init_buffer();
1846
1841
  function isBytes(a) {
1847
1842
  return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array" && "BYTES_PER_ELEMENT" in a && a.BYTES_PER_ELEMENT === 1;
@@ -1867,167 +1862,562 @@ function abytes(value, length, title = "") {
1867
1862
  throw new TypeError(message);
1868
1863
  throw new RangeError(message);
1869
1864
  }
1870
- function ahash(h) {
1871
- if (typeof h !== "function" || typeof h.create !== "function")
1872
- throw new TypeError("expected hash wrapped by utils.createHasher");
1873
- anumber(h.outputLen);
1874
- anumber(h.blockLen);
1875
- if (h.outputLen < 1 || h.blockLen < 1)
1876
- throw new Error("hash blockLen / outputLen must be >= 1");
1877
- }
1878
- var aobject = (value, label) => {
1879
- if (value === null || typeof value !== "object" || Array.isArray(value))
1880
- throw new TypeError((label === "object" ? "" : `"${label}" `) + "expected object, got type=" + typeof value);
1881
- };
1882
- var aopts = (value, label) => {
1883
- aobject(value, label);
1884
- const proto = Object.getPrototypeOf(value);
1885
- if (proto !== Object.prototype && proto !== null)
1886
- throw new TypeError(`"${label}" expected plain object`);
1887
- if (Object.hasOwn(value, "__proto__"))
1888
- throw new TypeError(`"${label}.__proto__" is not allowed`);
1889
- };
1890
- function aexists(instance, checkFinished = true) {
1891
- if (instance.destroyed)
1892
- throw new Error("hash was destroyed");
1893
- if (checkFinished && instance.finished)
1894
- throw new Error("digest() was already called");
1865
+ function u32(arr) {
1866
+ return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
1895
1867
  }
1896
- function aoutput(out, instance) {
1897
- abytes(out, void 0, "output");
1898
- const min = instance.outputLen;
1899
- if (!(out.length >= min)) {
1900
- throw new RangeError('"output" expected length >= ' + min);
1868
+ function clean(...arrays) {
1869
+ for (let i2 = 0; i2 < arrays.length; i2++) {
1870
+ arrays[i2].fill(0);
1901
1871
  }
1902
1872
  }
1903
- function clean(...arrays) {
1904
- for (let i = 0; i < arrays.length; i++) {
1905
- arrays[i].fill(0);
1873
+ var isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)();
1874
+ function byteSwap(word) {
1875
+ return word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255;
1876
+ }
1877
+ function byteSwap32(arr) {
1878
+ for (let i2 = 0; i2 < arr.length; i2++) {
1879
+ arr[i2] = byteSwap(arr[i2]);
1906
1880
  }
1881
+ return arr;
1907
1882
  }
1908
- function createView(arr) {
1909
- return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
1883
+ var swap32IfBE = isLE ? (u) => u : byteSwap32;
1884
+ function overlapBytes(a, b) {
1885
+ if (!a.byteLength || !b.byteLength)
1886
+ return false;
1887
+ return a.buffer === b.buffer && // best we can do, may fail with an obscure Proxy
1888
+ a.byteOffset < b.byteOffset + b.byteLength && // a starts before b end
1889
+ b.byteOffset < a.byteOffset + a.byteLength;
1910
1890
  }
1911
- function rotl(word, shift) {
1912
- return word << shift | word >>> 32 - shift >>> 0;
1891
+ function complexOverlapBytes(input, output) {
1892
+ if (overlapBytes(input, output) && input.byteOffset < output.byteOffset)
1893
+ throw new Error("complex overlap of input and output is not supported");
1913
1894
  }
1914
- function checkOpts(defaults, opts, title = "opts") {
1915
- aopts(defaults, "defaults");
1916
- if (opts !== void 0)
1917
- aopts(opts, title);
1918
- const merged = Object.assign(/* @__PURE__ */ Object.create(null), defaults, opts);
1919
- return merged;
1895
+ var wrapCipher = /* @__NO_SIDE_EFFECTS__ */ (params, constructor) => {
1896
+ function wrappedCipher(key2, ...args) {
1897
+ abytes(key2, void 0, "key");
1898
+ if (params.nonceLength !== void 0) {
1899
+ const nonce = args[0];
1900
+ abytes(nonce, params.varSizeNonce ? void 0 : params.nonceLength, "nonce");
1901
+ }
1902
+ const tagl = params.tagLength;
1903
+ const aadStart = params.nonceLength !== void 0 ? 1 : 0;
1904
+ if (!params.withAAD) {
1905
+ for (let i2 = aadStart; i2 < args.length; i2++)
1906
+ if (isBytes(args[i2]))
1907
+ throw new Error("AAD not supported");
1908
+ }
1909
+ if (params.withAAD && args[aadStart] !== void 0)
1910
+ abytes(args[aadStart], void 0, "AAD");
1911
+ const cipher = constructor(key2, ...args);
1912
+ const checkOutput = (fnLength, output) => {
1913
+ if (output !== void 0) {
1914
+ if (fnLength !== 2)
1915
+ throw new Error("cipher output not supported");
1916
+ abytes(output, void 0, "output");
1917
+ }
1918
+ };
1919
+ let called = false;
1920
+ const wrCipher = {
1921
+ encrypt(data, output) {
1922
+ if (called)
1923
+ throw new Error("cannot encrypt() twice with same key + nonce");
1924
+ called = true;
1925
+ abytes(data, void 0, "data");
1926
+ checkOutput(cipher.encrypt.length, output);
1927
+ return cipher.encrypt(data, output);
1928
+ },
1929
+ decrypt(data, output) {
1930
+ abytes(data, void 0, "data");
1931
+ if (tagl && data.length < tagl)
1932
+ throw new Error('"ciphertext" expected length >= tagLength=' + tagl);
1933
+ checkOutput(cipher.decrypt.length, output);
1934
+ return cipher.decrypt(data, output);
1935
+ }
1936
+ };
1937
+ return wrCipher;
1938
+ }
1939
+ Object.assign(wrappedCipher, params);
1940
+ return wrappedCipher;
1941
+ };
1942
+ function getOutput(expectedLength, out, onlyAligned = true) {
1943
+ if (out === void 0)
1944
+ return new Uint8Array(expectedLength);
1945
+ abytes(out, expectedLength, "output");
1946
+ if (onlyAligned && !isAligned32(out))
1947
+ throw new Error("invalid output, must be aligned");
1948
+ return out;
1920
1949
  }
1921
- function createHasher(hashCons, info = {}) {
1922
- if (typeof hashCons !== "function")
1923
- throw new TypeError('"hashCons" expected function, got type=' + typeof hashCons);
1924
- info = checkOpts({}, info, "info");
1925
- const hashC = (msg, opts) => hashCons(opts).update(msg).digest();
1926
- const tmp = hashCons(void 0);
1927
- hashC.outputLen = tmp.outputLen;
1928
- hashC.blockLen = tmp.blockLen;
1929
- hashC.canXOF = tmp.canXOF;
1930
- hashC.create = (opts) => hashCons(opts);
1931
- Object.assign(hashC, info);
1932
- return Object.freeze(hashC);
1950
+ function isAligned32(bytes2) {
1951
+ return bytes2.byteOffset % 4 === 0;
1952
+ }
1953
+ function copyBytes(bytes2) {
1954
+ return Uint8Array.from(abytes(bytes2));
1933
1955
  }
1934
1956
 
1935
- // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/_md.js
1936
- function Chi(a, b, c) {
1937
- return a & b ^ ~a & c;
1957
+ // node_modules/.pnpm/@noble+ciphers@2.4.0/node_modules/@noble/ciphers/aes.js
1958
+ var BLOCK_SIZE = 16;
1959
+ var POLY = 283;
1960
+ function validateKeyLength(key2) {
1961
+ if (![16, 24, 32].includes(key2.length))
1962
+ throw new Error('"aes key" expected Uint8Array of length 16/24/32, got length=' + key2.length);
1938
1963
  }
1939
- function Maj(a, b, c) {
1940
- return a & b ^ a & c ^ b & c;
1964
+ function mul2(n) {
1965
+ return n << 1 ^ POLY & -(n >> 7);
1941
1966
  }
1942
- var HashMD = class {
1943
- blockLen;
1944
- outputLen;
1945
- canXOF = false;
1946
- padOffset;
1947
- isLE;
1948
- // For partial updates less than block size
1949
- buffer;
1950
- view;
1951
- finished = false;
1952
- length = 0;
1953
- pos = 0;
1954
- destroyed = false;
1955
- constructor(blockLen, outputLen, padOffset, isLE2) {
1956
- this.blockLen = blockLen;
1957
- this.outputLen = outputLen;
1958
- this.padOffset = padOffset;
1959
- this.isLE = isLE2;
1960
- this.buffer = new Uint8Array(blockLen);
1961
- this.view = createView(this.buffer);
1967
+ function mul(a, b) {
1968
+ let res = 0;
1969
+ for (; b > 0; b >>= 1) {
1970
+ res ^= a & -(b & 1);
1971
+ a = mul2(a);
1962
1972
  }
1963
- update(data) {
1964
- aexists(this);
1965
- abytes(data);
1966
- const { view, buffer, blockLen } = this;
1967
- const len = data.length;
1968
- let processed = false;
1969
- for (let pos = 0; pos < len; ) {
1970
- const take = Math.min(blockLen - this.pos, len - pos);
1971
- if (take === blockLen) {
1972
- const dataView = createView(data);
1973
- for (; blockLen <= len - pos; pos += blockLen)
1974
- this.process(dataView, pos);
1975
- processed = true;
1976
- continue;
1977
- }
1978
- buffer.set(pos === 0 && take === len ? data : data.subarray(pos, pos + take), this.pos);
1979
- this.pos += take;
1980
- pos += take;
1981
- if (this.pos === blockLen) {
1982
- this.process(view, 0);
1983
- this.pos = 0;
1984
- processed = true;
1985
- }
1986
- }
1987
- this.length += data.length;
1988
- if (processed)
1989
- this.roundClean();
1990
- return this;
1973
+ return res;
1974
+ }
1975
+ var sbox = /* @__PURE__ */ (() => {
1976
+ const t = new Uint8Array(256);
1977
+ for (let i2 = 0, x2 = 1; i2 < 256; i2++, x2 ^= mul2(x2))
1978
+ t[i2] = x2;
1979
+ const box = new Uint8Array(256);
1980
+ box[0] = 99;
1981
+ for (let i2 = 0; i2 < 255; i2++) {
1982
+ let x2 = t[255 - i2];
1983
+ x2 |= x2 << 8;
1984
+ box[t[i2]] = (x2 ^ x2 >> 4 ^ x2 >> 5 ^ x2 >> 6 ^ x2 >> 7 ^ 99) & 255;
1991
1985
  }
1992
- digestInto(out) {
1993
- aexists(this);
1994
- aoutput(out, this);
1995
- this.finished = true;
1996
- const { buffer, view, blockLen, isLE: isLE2 } = this;
1997
- let { pos } = this;
1998
- buffer[pos++] = 128;
1999
- buffer.fill(0, pos);
2000
- if (this.padOffset > blockLen - pos) {
2001
- this.process(view, 0);
2002
- buffer.fill(0);
1986
+ clean(t);
1987
+ return box;
1988
+ })();
1989
+ var invSbox = /* @__PURE__ */ sbox.map((_, j) => sbox.indexOf(j));
1990
+ var rotr32_8 = (n) => n << 24 | n >>> 8;
1991
+ var rotl32_8 = (n) => n << 8 | n >>> 24;
1992
+ function genTtable(sbox2, fn) {
1993
+ if (sbox2.length !== 256)
1994
+ throw new Error("wrong sbox length");
1995
+ const T0 = new Uint32Array(256).map((_, j) => fn(sbox2[j]));
1996
+ const T1 = T0.map(rotl32_8);
1997
+ const T2 = T1.map(rotl32_8);
1998
+ const T3 = T2.map(rotl32_8);
1999
+ const T01 = new Uint32Array(256 * 256);
2000
+ const T23 = new Uint32Array(256 * 256);
2001
+ const sbox22 = new Uint16Array(256 * 256);
2002
+ for (let i2 = 0; i2 < 256; i2++) {
2003
+ for (let j = 0; j < 256; j++) {
2004
+ const idx = i2 * 256 + j;
2005
+ T01[idx] = T0[i2] ^ T1[j];
2006
+ T23[idx] = T2[i2] ^ T3[j];
2007
+ sbox22[idx] = sbox2[i2] << 8 | sbox2[j];
2003
2008
  }
2004
- setU64FromNum(view, blockLen - 8, this.length * 8, isLE2);
2005
- this.process(view, 0);
2006
- this.roundClean();
2007
- const oview = out === buffer ? view : createView(out);
2008
- const len = this.outputLen;
2009
- const outLen = len / 4;
2010
- const state = this.get();
2011
- if (len % 4 || outLen > state.length)
2012
- throw new Error("invalid outputLen");
2013
- for (let i = 0; i < outLen; i++)
2014
- oview.setUint32(4 * i, state[i], isLE2);
2015
- }
2016
- digest() {
2017
- const { buffer, outputLen } = this;
2018
- this.digestInto(buffer);
2019
- const res = buffer.slice(0, outputLen);
2020
- this.destroy();
2021
- return res;
2022
2009
  }
2023
- _cloneIntoMeta(to) {
2024
- const { buffer, length, finished, destroyed, pos } = this;
2025
- to.destroyed = destroyed;
2026
- to.finished = finished;
2027
- to.length = length;
2028
- to.pos = pos;
2029
- if (pos)
2030
- to.buffer.set(buffer);
2010
+ return { sbox: sbox2, sbox2: sbox22, T0, T1, T2, T3, T01, T23 };
2011
+ }
2012
+ var tableEncoding = /* @__PURE__ */ genTtable(sbox, (s) => mul(s, 3) << 24 | s << 16 | s << 8 | mul(s, 2));
2013
+ var tableDecoding = /* @__PURE__ */ genTtable(invSbox, (s) => mul(s, 11) << 24 | mul(s, 13) << 16 | mul(s, 9) << 8 | mul(s, 14));
2014
+ var xPowers = /* @__PURE__ */ (() => {
2015
+ const p = new Uint8Array(16);
2016
+ for (let i2 = 0, x2 = 1; i2 < 16; i2++, x2 = mul2(x2))
2017
+ p[i2] = x2;
2018
+ return p;
2019
+ })();
2020
+ function expandKeyLE(key2) {
2021
+ abytes(key2);
2022
+ const len = key2.length;
2023
+ validateKeyLength(key2);
2024
+ const { sbox2 } = tableEncoding;
2025
+ const toClean = [];
2026
+ if (!isLE || !isAligned32(key2))
2027
+ toClean.push(key2 = copyBytes(key2));
2028
+ const k32 = swap32IfBE(u32(key2));
2029
+ const Nk = k32.length;
2030
+ const subByte = (n) => applySbox(sbox2, n, n, n, n);
2031
+ const xk = new Uint32Array(len + 28);
2032
+ xk.set(k32);
2033
+ for (let i2 = Nk; i2 < xk.length; i2++) {
2034
+ let t = xk[i2 - 1];
2035
+ if (i2 % Nk === 0)
2036
+ t = subByte(rotr32_8(t)) ^ xPowers[i2 / Nk - 1];
2037
+ else if (Nk > 6 && i2 % Nk === 4)
2038
+ t = subByte(t);
2039
+ xk[i2] = xk[i2 - Nk] ^ t;
2040
+ }
2041
+ clean(...toClean);
2042
+ return xk;
2043
+ }
2044
+ function expandKeyDecLE(key2) {
2045
+ const encKey = expandKeyLE(key2);
2046
+ const xk = encKey.slice();
2047
+ const Nk = encKey.length;
2048
+ const { sbox2 } = tableEncoding;
2049
+ const { T0, T1, T2, T3 } = tableDecoding;
2050
+ for (let i2 = 0; i2 < Nk; i2 += 4) {
2051
+ for (let j = 0; j < 4; j++)
2052
+ xk[i2 + j] = encKey[Nk - i2 - 4 + j];
2053
+ }
2054
+ clean(encKey);
2055
+ for (let i2 = 4; i2 < Nk - 4; i2++) {
2056
+ const x2 = xk[i2];
2057
+ const w = applySbox(sbox2, x2, x2, x2, x2);
2058
+ xk[i2] = T0[w & 255] ^ T1[w >>> 8 & 255] ^ T2[w >>> 16 & 255] ^ T3[w >>> 24];
2059
+ }
2060
+ return xk;
2061
+ }
2062
+ function apply0123(T01, T23, s0, s1, s2, s3) {
2063
+ return T01[s0 << 8 & 65280 | s1 >>> 8 & 255] ^ T23[s2 >>> 8 & 65280 | s3 >>> 24 & 255];
2064
+ }
2065
+ function applySbox(sbox2, s0, s1, s2, s3) {
2066
+ return sbox2[s0 & 255 | s1 & 65280] | sbox2[s2 >>> 16 & 255 | s3 >>> 16 & 65280] << 16;
2067
+ }
2068
+ function encrypt(xk, s0, s1, s2, s3) {
2069
+ const { sbox2, T01, T23 } = tableEncoding;
2070
+ let k = 0;
2071
+ s0 ^= xk[k++], s1 ^= xk[k++], s2 ^= xk[k++], s3 ^= xk[k++];
2072
+ const rounds = xk.length / 4 - 2;
2073
+ for (let i2 = 0; i2 < rounds; i2++) {
2074
+ const t02 = xk[k++] ^ apply0123(T01, T23, s0, s1, s2, s3);
2075
+ const t12 = xk[k++] ^ apply0123(T01, T23, s1, s2, s3, s0);
2076
+ const t22 = xk[k++] ^ apply0123(T01, T23, s2, s3, s0, s1);
2077
+ const t32 = xk[k++] ^ apply0123(T01, T23, s3, s0, s1, s2);
2078
+ s0 = t02, s1 = t12, s2 = t22, s3 = t32;
2079
+ }
2080
+ const t0 = xk[k++] ^ applySbox(sbox2, s0, s1, s2, s3);
2081
+ const t1 = xk[k++] ^ applySbox(sbox2, s1, s2, s3, s0);
2082
+ const t2 = xk[k++] ^ applySbox(sbox2, s2, s3, s0, s1);
2083
+ const t3 = xk[k++] ^ applySbox(sbox2, s3, s0, s1, s2);
2084
+ return { s0: t0, s1: t1, s2: t2, s3: t3 };
2085
+ }
2086
+ function decrypt(xk, s0, s1, s2, s3) {
2087
+ const { sbox2, T01, T23 } = tableDecoding;
2088
+ let k = 0;
2089
+ s0 ^= xk[k++], s1 ^= xk[k++], s2 ^= xk[k++], s3 ^= xk[k++];
2090
+ const rounds = xk.length / 4 - 2;
2091
+ for (let i2 = 0; i2 < rounds; i2++) {
2092
+ const t02 = xk[k++] ^ apply0123(T01, T23, s0, s3, s2, s1);
2093
+ const t12 = xk[k++] ^ apply0123(T01, T23, s1, s0, s3, s2);
2094
+ const t22 = xk[k++] ^ apply0123(T01, T23, s2, s1, s0, s3);
2095
+ const t32 = xk[k++] ^ apply0123(T01, T23, s3, s2, s1, s0);
2096
+ s0 = t02, s1 = t12, s2 = t22, s3 = t32;
2097
+ }
2098
+ const t0 = xk[k++] ^ applySbox(sbox2, s0, s3, s2, s1);
2099
+ const t1 = xk[k++] ^ applySbox(sbox2, s1, s0, s3, s2);
2100
+ const t2 = xk[k++] ^ applySbox(sbox2, s2, s1, s0, s3);
2101
+ const t3 = xk[k++] ^ applySbox(sbox2, s3, s2, s1, s0);
2102
+ return { s0: t0, s1: t1, s2: t2, s3: t3 };
2103
+ }
2104
+ function validateBlockDecrypt(data, dst) {
2105
+ abytes(data);
2106
+ if (data.length % BLOCK_SIZE !== 0) {
2107
+ throw new Error("ciphertext must be multiple of " + BLOCK_SIZE);
2108
+ }
2109
+ if (dst !== void 0) {
2110
+ getOutput(data.length, dst);
2111
+ complexOverlapBytes(data, dst);
2112
+ }
2113
+ }
2114
+ function validateBlockEncrypt(plaintext, pkcs5, dst) {
2115
+ abytes(plaintext);
2116
+ let outLen = plaintext.length;
2117
+ const remaining = outLen % BLOCK_SIZE;
2118
+ if (!pkcs5 && remaining !== 0)
2119
+ throw new Error("plaintext must be multiple of " + BLOCK_SIZE);
2120
+ if (pkcs5) {
2121
+ let left = BLOCK_SIZE - remaining;
2122
+ if (!left)
2123
+ left = BLOCK_SIZE;
2124
+ outLen = outLen + left;
2125
+ }
2126
+ if (dst !== void 0) {
2127
+ getOutput(outLen, dst);
2128
+ complexOverlapBytes(plaintext, dst);
2129
+ }
2130
+ return outLen;
2131
+ }
2132
+ function prepareBlockEncrypt(plaintext, outLen, dst) {
2133
+ if (dst === void 0)
2134
+ dst = new Uint8Array(outLen);
2135
+ if (!isLE || !isAligned32(plaintext))
2136
+ plaintext = copyBytes(plaintext);
2137
+ const o = u32(dst);
2138
+ return { b: plaintext, o, out: dst };
2139
+ }
2140
+ function validatePKCS(data, pkcs5) {
2141
+ if (!pkcs5)
2142
+ return data;
2143
+ const len = data.length;
2144
+ if (len === 0)
2145
+ throw new Error("pkcs7: empty ciphertext not allowed");
2146
+ const lastByte = data[len - 1];
2147
+ let valid = 1;
2148
+ valid &= lastByte - 1 >>> 31 ^ 1;
2149
+ valid &= 16 - lastByte >>> 31 ^ 1;
2150
+ for (let i2 = 0; i2 < 16; i2++) {
2151
+ const shouldCheck = i2 - lastByte >>> 31;
2152
+ const eq = (data[len - 1 - i2] ^ lastByte) === 0 ? 1 : 0;
2153
+ valid &= eq | shouldCheck ^ 1;
2154
+ }
2155
+ if (!valid)
2156
+ throw new Error("aes: bad decrypt");
2157
+ return data.subarray(0, len - lastByte);
2158
+ }
2159
+ function padPCKS(left) {
2160
+ const tmp = new Uint8Array(16);
2161
+ const tmp32 = u32(tmp);
2162
+ tmp.set(left);
2163
+ const paddingByte = BLOCK_SIZE - left.length;
2164
+ for (let i2 = BLOCK_SIZE - paddingByte; i2 < BLOCK_SIZE; i2++)
2165
+ tmp[i2] = paddingByte;
2166
+ return tmp32;
2167
+ }
2168
+ var ecb = /* @__PURE__ */ wrapCipher({ blockSize: 16 }, function aesecb(key2, opts = {}) {
2169
+ const pkcs5 = !opts.disablePadding;
2170
+ return {
2171
+ encrypt(plaintext, dst) {
2172
+ const outLen = validateBlockEncrypt(plaintext, pkcs5, dst);
2173
+ const xk = expandKeyLE(key2);
2174
+ const { b: input, o, out: _out } = prepareBlockEncrypt(plaintext, outLen, dst);
2175
+ const b = u32(input);
2176
+ swap32IfBE(b);
2177
+ let i2 = 0;
2178
+ for (; i2 + 4 <= b.length; ) {
2179
+ const { s0, s1, s2, s3 } = encrypt(xk, b[i2 + 0], b[i2 + 1], b[i2 + 2], b[i2 + 3]);
2180
+ o[i2++] = s0, o[i2++] = s1, o[i2++] = s2, o[i2++] = s3;
2181
+ }
2182
+ if (pkcs5) {
2183
+ const tmp32 = padPCKS(plaintext.subarray(i2 * 4));
2184
+ swap32IfBE(tmp32);
2185
+ const { s0, s1, s2, s3 } = encrypt(xk, tmp32[0], tmp32[1], tmp32[2], tmp32[3]);
2186
+ o[i2++] = s0, o[i2++] = s1, o[i2++] = s2, o[i2++] = s3;
2187
+ clean(tmp32);
2188
+ }
2189
+ swap32IfBE(o);
2190
+ clean(xk);
2191
+ if (input !== plaintext)
2192
+ clean(input);
2193
+ return _out;
2194
+ },
2195
+ decrypt(ciphertext, dst) {
2196
+ validateBlockDecrypt(ciphertext, dst);
2197
+ const xk = expandKeyDecLE(key2);
2198
+ if (dst === void 0)
2199
+ dst = new Uint8Array(ciphertext.length);
2200
+ const toClean = [xk];
2201
+ if (!isLE || !isAligned32(ciphertext))
2202
+ toClean.push(ciphertext = copyBytes(ciphertext));
2203
+ const b = u32(ciphertext);
2204
+ const o = u32(dst);
2205
+ swap32IfBE(b);
2206
+ for (let i2 = 0; i2 + 4 <= b.length; ) {
2207
+ const { s0, s1, s2, s3 } = decrypt(xk, b[i2 + 0], b[i2 + 1], b[i2 + 2], b[i2 + 3]);
2208
+ o[i2++] = s0, o[i2++] = s1, o[i2++] = s2, o[i2++] = s3;
2209
+ }
2210
+ swap32IfBE(o);
2211
+ clean(...toClean);
2212
+ return validatePKCS(dst, pkcs5);
2213
+ }
2214
+ };
2215
+ });
2216
+
2217
+ // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/legacy.js
2218
+ init_buffer();
2219
+
2220
+ // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/_md.js
2221
+ init_buffer();
2222
+
2223
+ // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/_u64.js
2224
+ init_buffer();
2225
+ var fromNumH = (n) => n / 2 ** 32 | 0;
2226
+ var fromNumL = (n) => n >>> 0;
2227
+ function setU64FromNum(view, byteOffset, n, isLE2) {
2228
+ const h = fromNumH(n);
2229
+ const l = fromNumL(n);
2230
+ view.setUint32(byteOffset, isLE2 ? l : h, isLE2);
2231
+ view.setUint32(byteOffset + 4, isLE2 ? h : l, isLE2);
2232
+ }
2233
+
2234
+ // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/utils.js
2235
+ init_buffer();
2236
+ function isBytes2(a) {
2237
+ return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array" && "BYTES_PER_ELEMENT" in a && a.BYTES_PER_ELEMENT === 1;
2238
+ }
2239
+ var atitle2 = (title) => title ? `"${title}" ` : "";
2240
+ function anumber2(n, title = "") {
2241
+ if (typeof n !== "number")
2242
+ throw new TypeError(atitle2(title) + "expected number, got " + typeof n);
2243
+ if (!Number.isSafeInteger(n) || n < 0)
2244
+ throw new RangeError(atitle2(title) + "expected integer >= 0, got " + n);
2245
+ return n;
2246
+ }
2247
+ function abytes2(value, length, title = "") {
2248
+ if (isBytes2(value) && (length === void 0 || value.length === length))
2249
+ return value;
2250
+ if (length !== void 0)
2251
+ anumber2(length, "length");
2252
+ const bytes2 = isBytes2(value);
2253
+ const ofLen = length !== void 0 ? ` of length ${length}` : "";
2254
+ const got = bytes2 ? `length=${value.length}` : `type=${typeof value}`;
2255
+ const message = atitle2(title) + "expected Uint8Array" + ofLen + ", got " + got;
2256
+ if (!bytes2)
2257
+ throw new TypeError(message);
2258
+ throw new RangeError(message);
2259
+ }
2260
+ function ahash(h) {
2261
+ if (typeof h !== "function" || typeof h.create !== "function")
2262
+ throw new TypeError("expected hash wrapped by utils.createHasher");
2263
+ anumber2(h.outputLen);
2264
+ anumber2(h.blockLen);
2265
+ if (h.outputLen < 1 || h.blockLen < 1)
2266
+ throw new Error("hash blockLen / outputLen must be >= 1");
2267
+ }
2268
+ var aobject = (value, label) => {
2269
+ if (value === null || typeof value !== "object" || Array.isArray(value))
2270
+ throw new TypeError((label === "object" ? "" : `"${label}" `) + "expected object, got type=" + typeof value);
2271
+ };
2272
+ var aopts = (value, label) => {
2273
+ aobject(value, label);
2274
+ const proto = Object.getPrototypeOf(value);
2275
+ if (proto !== Object.prototype && proto !== null)
2276
+ throw new TypeError(`"${label}" expected plain object`);
2277
+ if (Object.hasOwn(value, "__proto__"))
2278
+ throw new TypeError(`"${label}.__proto__" is not allowed`);
2279
+ };
2280
+ function aexists2(instance, checkFinished = true) {
2281
+ if (instance.destroyed)
2282
+ throw new Error("hash was destroyed");
2283
+ if (checkFinished && instance.finished)
2284
+ throw new Error("digest() was already called");
2285
+ }
2286
+ function aoutput(out, instance) {
2287
+ abytes2(out, void 0, "output");
2288
+ const min = instance.outputLen;
2289
+ if (!(out.length >= min)) {
2290
+ throw new RangeError('"output" expected length >= ' + min);
2291
+ }
2292
+ }
2293
+ function clean2(...arrays) {
2294
+ for (let i2 = 0; i2 < arrays.length; i2++) {
2295
+ arrays[i2].fill(0);
2296
+ }
2297
+ }
2298
+ function createView2(arr) {
2299
+ return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
2300
+ }
2301
+ function rotl(word, shift) {
2302
+ return word << shift | word >>> 32 - shift >>> 0;
2303
+ }
2304
+ function checkOpts(defaults, opts, title = "opts") {
2305
+ aopts(defaults, "defaults");
2306
+ if (opts !== void 0)
2307
+ aopts(opts, title);
2308
+ const merged = Object.assign(/* @__PURE__ */ Object.create(null), defaults, opts);
2309
+ return merged;
2310
+ }
2311
+ function createHasher(hashCons, info = {}) {
2312
+ if (typeof hashCons !== "function")
2313
+ throw new TypeError('"hashCons" expected function, got type=' + typeof hashCons);
2314
+ info = checkOpts({}, info, "info");
2315
+ const hashC = (msg, opts) => hashCons(opts).update(msg).digest();
2316
+ const tmp = hashCons(void 0);
2317
+ hashC.outputLen = tmp.outputLen;
2318
+ hashC.blockLen = tmp.blockLen;
2319
+ hashC.canXOF = tmp.canXOF;
2320
+ hashC.create = (opts) => hashCons(opts);
2321
+ Object.assign(hashC, info);
2322
+ return Object.freeze(hashC);
2323
+ }
2324
+
2325
+ // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/_md.js
2326
+ function Chi(a, b, c) {
2327
+ return a & b ^ ~a & c;
2328
+ }
2329
+ function Maj(a, b, c) {
2330
+ return a & b ^ a & c ^ b & c;
2331
+ }
2332
+ var HashMD = class {
2333
+ blockLen;
2334
+ outputLen;
2335
+ canXOF = false;
2336
+ padOffset;
2337
+ isLE;
2338
+ // For partial updates less than block size
2339
+ buffer;
2340
+ view;
2341
+ finished = false;
2342
+ length = 0;
2343
+ pos = 0;
2344
+ destroyed = false;
2345
+ constructor(blockLen, outputLen, padOffset, isLE2) {
2346
+ this.blockLen = blockLen;
2347
+ this.outputLen = outputLen;
2348
+ this.padOffset = padOffset;
2349
+ this.isLE = isLE2;
2350
+ this.buffer = new Uint8Array(blockLen);
2351
+ this.view = createView2(this.buffer);
2352
+ }
2353
+ update(data) {
2354
+ aexists2(this);
2355
+ abytes2(data);
2356
+ const { view, buffer, blockLen } = this;
2357
+ const len = data.length;
2358
+ let processed = false;
2359
+ for (let pos = 0; pos < len; ) {
2360
+ const take = Math.min(blockLen - this.pos, len - pos);
2361
+ if (take === blockLen) {
2362
+ const dataView = createView2(data);
2363
+ for (; blockLen <= len - pos; pos += blockLen)
2364
+ this.process(dataView, pos);
2365
+ processed = true;
2366
+ continue;
2367
+ }
2368
+ buffer.set(pos === 0 && take === len ? data : data.subarray(pos, pos + take), this.pos);
2369
+ this.pos += take;
2370
+ pos += take;
2371
+ if (this.pos === blockLen) {
2372
+ this.process(view, 0);
2373
+ this.pos = 0;
2374
+ processed = true;
2375
+ }
2376
+ }
2377
+ this.length += data.length;
2378
+ if (processed)
2379
+ this.roundClean();
2380
+ return this;
2381
+ }
2382
+ digestInto(out) {
2383
+ aexists2(this);
2384
+ aoutput(out, this);
2385
+ this.finished = true;
2386
+ const { buffer, view, blockLen, isLE: isLE2 } = this;
2387
+ let { pos } = this;
2388
+ buffer[pos++] = 128;
2389
+ buffer.fill(0, pos);
2390
+ if (this.padOffset > blockLen - pos) {
2391
+ this.process(view, 0);
2392
+ buffer.fill(0);
2393
+ }
2394
+ setU64FromNum(view, blockLen - 8, this.length * 8, isLE2);
2395
+ this.process(view, 0);
2396
+ this.roundClean();
2397
+ const oview = out === buffer ? view : createView2(out);
2398
+ const len = this.outputLen;
2399
+ const outLen = len / 4;
2400
+ const state = this.get();
2401
+ if (len % 4 || outLen > state.length)
2402
+ throw new Error("invalid outputLen");
2403
+ for (let i2 = 0; i2 < outLen; i2++)
2404
+ oview.setUint32(4 * i2, state[i2], isLE2);
2405
+ }
2406
+ digest() {
2407
+ const { buffer, outputLen } = this;
2408
+ this.digestInto(buffer);
2409
+ const res = buffer.slice(0, outputLen);
2410
+ this.destroy();
2411
+ return res;
2412
+ }
2413
+ _cloneIntoMeta(to) {
2414
+ const { buffer, length, finished, destroyed, pos } = this;
2415
+ to.destroyed = destroyed;
2416
+ to.finished = finished;
2417
+ to.length = length;
2418
+ to.pos = pos;
2419
+ if (pos)
2420
+ to.buffer.set(buffer);
2031
2421
  return to;
2032
2422
  }
2033
2423
  clone() {
@@ -2069,585 +2459,204 @@ var _SHA1 = class extends HashMD {
2069
2459
  return this._cloneIntoMeta(to);
2070
2460
  }
2071
2461
  process(view, offset) {
2072
- for (let i = 0; i < 16; i++, offset += 4)
2073
- SHA1_W[i] = view.getUint32(offset, false);
2074
- for (let i = 16; i < 80; i++)
2075
- SHA1_W[i] = rotl(SHA1_W[i - 3] ^ SHA1_W[i - 8] ^ SHA1_W[i - 14] ^ SHA1_W[i - 16], 1);
2462
+ for (let i2 = 0; i2 < 16; i2++, offset += 4)
2463
+ SHA1_W[i2] = view.getUint32(offset, false);
2464
+ for (let i2 = 16; i2 < 80; i2++)
2465
+ SHA1_W[i2] = rotl(SHA1_W[i2 - 3] ^ SHA1_W[i2 - 8] ^ SHA1_W[i2 - 14] ^ SHA1_W[i2 - 16], 1);
2076
2466
  let { A, B, C, D, E } = this;
2077
- for (let i = 0; i < 80; i++) {
2467
+ for (let i2 = 0; i2 < 80; i2++) {
2078
2468
  let F, K2;
2079
- if (i < 20) {
2469
+ if (i2 < 20) {
2080
2470
  F = Chi(B, C, D);
2081
2471
  K2 = 1518500249;
2082
- } else if (i < 40) {
2472
+ } else if (i2 < 40) {
2083
2473
  F = B ^ C ^ D;
2084
2474
  K2 = 1859775393;
2085
- } else if (i < 60) {
2475
+ } else if (i2 < 60) {
2086
2476
  F = Maj(B, C, D);
2087
2477
  K2 = 2400959708;
2088
2478
  } else {
2089
- F = B ^ C ^ D;
2090
- K2 = 3395469782;
2091
- }
2092
- const T = rotl(A, 5) + F + E + K2 + SHA1_W[i] | 0;
2093
- E = D;
2094
- D = C;
2095
- C = rotl(B, 30);
2096
- B = A;
2097
- A = T;
2098
- }
2099
- A = A + this.A | 0;
2100
- B = B + this.B | 0;
2101
- C = C + this.C | 0;
2102
- D = D + this.D | 0;
2103
- E = E + this.E | 0;
2104
- this.set(A, B, C, D, E);
2105
- }
2106
- roundClean() {
2107
- clean(SHA1_W);
2108
- }
2109
- destroy() {
2110
- this.destroyed = true;
2111
- this.set(0, 0, 0, 0, 0);
2112
- clean(this.buffer);
2113
- }
2114
- };
2115
- var sha1 = /* @__PURE__ */ createHasher(() => new _SHA1());
2116
- var p32 = /* @__PURE__ */ Math.pow(2, 32);
2117
- var K = /* @__PURE__ */ Array.from({ length: 64 }, (_, i) => Math.floor(p32 * Math.abs(Math.sin(i + 1))));
2118
- var MD5_IV = /* @__PURE__ */ SHA1_IV.slice(0, 4);
2119
- var MD5_W = /* @__PURE__ */ new Uint32Array(16);
2120
- var MD5_SHIFTS = /* @__PURE__ */ (() => {
2121
- const S = [
2122
- [7, 12, 17, 22],
2123
- [5, 9, 14, 20],
2124
- [4, 11, 16, 23],
2125
- [6, 10, 15, 21]
2126
- ];
2127
- return Uint8Array.from({ length: 64 }, (_, i) => S[Math.floor(i / 16)][i % 4]);
2128
- })();
2129
- var _MD5 = class extends HashMD {
2130
- A = MD5_IV[0] | 0;
2131
- B = MD5_IV[1] | 0;
2132
- C = MD5_IV[2] | 0;
2133
- D = MD5_IV[3] | 0;
2134
- constructor() {
2135
- super(64, 16, 8, true);
2136
- }
2137
- get() {
2138
- const { A, B, C, D } = this;
2139
- return [A, B, C, D];
2140
- }
2141
- set(A, B, C, D) {
2142
- this.A = A | 0;
2143
- this.B = B | 0;
2144
- this.C = C | 0;
2145
- this.D = D | 0;
2146
- }
2147
- _cloneInto(to) {
2148
- (to ||= new this.constructor()).set(...this.get());
2149
- return this._cloneIntoMeta(to);
2150
- }
2151
- process(view, offset) {
2152
- for (let i = 0; i < 16; i++, offset += 4)
2153
- MD5_W[i] = view.getUint32(offset, true);
2154
- let { A, B, C, D } = this;
2155
- for (let i = 0; i < 64; i++) {
2156
- let F, g;
2157
- if (i < 16) {
2158
- F = Chi(B, C, D);
2159
- g = i;
2160
- } else if (i < 32) {
2161
- F = Chi(D, B, C);
2162
- g = (5 * i + 1) % 16;
2163
- } else if (i < 48) {
2164
- F = B ^ C ^ D;
2165
- g = (3 * i + 5) % 16;
2166
- } else {
2167
- F = C ^ (B | ~D);
2168
- g = 7 * i % 16;
2169
- }
2170
- F = F + A + K[i] + MD5_W[g];
2171
- A = D;
2172
- D = C;
2173
- C = B;
2174
- B = B + rotl(F, MD5_SHIFTS[i]);
2175
- }
2176
- A = A + this.A | 0;
2177
- B = B + this.B | 0;
2178
- C = C + this.C | 0;
2179
- D = D + this.D | 0;
2180
- this.set(A, B, C, D);
2181
- }
2182
- roundClean() {
2183
- clean(MD5_W);
2184
- }
2185
- destroy() {
2186
- this.destroyed = true;
2187
- this.set(0, 0, 0, 0);
2188
- clean(this.buffer);
2189
- }
2190
- };
2191
- var md5 = /* @__PURE__ */ createHasher(() => new _MD5());
2192
-
2193
- // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/hmac.js
2194
- init_buffer();
2195
- var _HMAC = class {
2196
- oHash;
2197
- iHash;
2198
- blockLen;
2199
- outputLen;
2200
- canXOF = false;
2201
- finished = false;
2202
- destroyed = false;
2203
- constructor(hash2, key2) {
2204
- ahash(hash2);
2205
- abytes(key2, void 0, "key");
2206
- this.iHash = hash2.create();
2207
- if (typeof this.iHash.update !== "function")
2208
- throw new Error("expected Hash instance");
2209
- this.blockLen = this.iHash.blockLen;
2210
- this.outputLen = this.iHash.outputLen;
2211
- const blockLen = this.blockLen;
2212
- const pad = new Uint8Array(blockLen);
2213
- pad.set(key2.length > blockLen ? hash2.create().update(key2).digest() : key2);
2214
- for (let i = 0; i < pad.length; i++)
2215
- pad[i] ^= 54;
2216
- this.iHash.update(pad);
2217
- this.oHash = hash2.create();
2218
- for (let i = 0; i < pad.length; i++)
2219
- pad[i] ^= 54 ^ 92;
2220
- this.oHash.update(pad);
2221
- clean(pad);
2222
- }
2223
- update(buf) {
2224
- aexists(this);
2225
- this.iHash.update(buf);
2226
- return this;
2227
- }
2228
- digestInto(out) {
2229
- aexists(this);
2230
- aoutput(out, this);
2231
- this.finished = true;
2232
- const buf = out.subarray(0, this.outputLen);
2233
- this.iHash.digestInto(buf);
2234
- this.oHash.update(buf);
2235
- this.oHash.digestInto(buf);
2236
- this.destroy();
2237
- }
2238
- digest() {
2239
- const out = new Uint8Array(this.oHash.outputLen);
2240
- this.digestInto(out);
2241
- return out;
2242
- }
2243
- _cloneInto(to) {
2244
- to ||= Object.create(Object.getPrototypeOf(this), {});
2245
- const { oHash, iHash, finished, destroyed, blockLen, outputLen, canXOF } = this;
2246
- to = to;
2247
- to.finished = finished;
2248
- to.destroyed = destroyed;
2249
- to.blockLen = blockLen;
2250
- to.outputLen = outputLen;
2251
- to.canXOF = canXOF;
2252
- to.oHash = oHash._cloneInto(to.oHash);
2253
- to.iHash = iHash._cloneInto(to.iHash);
2254
- return to;
2255
- }
2256
- clone() {
2257
- return this._cloneInto();
2258
- }
2259
- destroy() {
2260
- this.destroyed = true;
2261
- this.oHash.destroy();
2262
- this.iHash.destroy();
2263
- }
2264
- };
2265
- var hmac = /* @__PURE__ */ (() => {
2266
- const hmac_ = ((hash2, key2, message) => new _HMAC(hash2, key2).update(message).digest());
2267
- hmac_.create = (hash2, key2) => new _HMAC(hash2, key2);
2268
- return hmac_;
2269
- })();
2270
-
2271
- // node_modules/.pnpm/@noble+ciphers@2.4.0/node_modules/@noble/ciphers/aes.js
2272
- init_buffer();
2273
-
2274
- // node_modules/.pnpm/@noble+ciphers@2.4.0/node_modules/@noble/ciphers/utils.js
2275
- init_buffer();
2276
- function isBytes2(a) {
2277
- return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array" && "BYTES_PER_ELEMENT" in a && a.BYTES_PER_ELEMENT === 1;
2278
- }
2279
- var atitle2 = (title) => title ? `"${title}" ` : "";
2280
- function anumber2(n, title = "") {
2281
- if (typeof n !== "number")
2282
- throw new TypeError(atitle2(title) + "expected number, got " + typeof n);
2283
- if (!Number.isSafeInteger(n) || n < 0)
2284
- throw new RangeError(atitle2(title) + "expected integer >= 0, got " + n);
2285
- return n;
2286
- }
2287
- function abytes2(value, length, title = "") {
2288
- if (isBytes2(value) && (length === void 0 || value.length === length))
2289
- return value;
2290
- if (length !== void 0)
2291
- anumber2(length, "length");
2292
- const bytes2 = isBytes2(value);
2293
- const ofLen = length !== void 0 ? ` of length ${length}` : "";
2294
- const got = bytes2 ? `length=${value.length}` : `type=${typeof value}`;
2295
- const message = atitle2(title) + "expected Uint8Array" + ofLen + ", got " + got;
2296
- if (!bytes2)
2297
- throw new TypeError(message);
2298
- throw new RangeError(message);
2299
- }
2300
- function u32(arr) {
2301
- return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
2302
- }
2303
- function clean2(...arrays) {
2304
- for (let i = 0; i < arrays.length; i++) {
2305
- arrays[i].fill(0);
2306
- }
2307
- }
2308
- var isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)();
2309
- function byteSwap(word) {
2310
- return word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255;
2311
- }
2312
- function byteSwap32(arr) {
2313
- for (let i = 0; i < arr.length; i++) {
2314
- arr[i] = byteSwap(arr[i]);
2315
- }
2316
- return arr;
2317
- }
2318
- var swap32IfBE = isLE ? (u) => u : byteSwap32;
2319
- function overlapBytes(a, b) {
2320
- if (!a.byteLength || !b.byteLength)
2321
- return false;
2322
- return a.buffer === b.buffer && // best we can do, may fail with an obscure Proxy
2323
- a.byteOffset < b.byteOffset + b.byteLength && // a starts before b end
2324
- b.byteOffset < a.byteOffset + a.byteLength;
2325
- }
2326
- function complexOverlapBytes(input, output) {
2327
- if (overlapBytes(input, output) && input.byteOffset < output.byteOffset)
2328
- throw new Error("complex overlap of input and output is not supported");
2329
- }
2330
- var wrapCipher = /* @__NO_SIDE_EFFECTS__ */ (params, constructor) => {
2331
- function wrappedCipher(key2, ...args) {
2332
- abytes2(key2, void 0, "key");
2333
- if (params.nonceLength !== void 0) {
2334
- const nonce = args[0];
2335
- abytes2(nonce, params.varSizeNonce ? void 0 : params.nonceLength, "nonce");
2336
- }
2337
- const tagl = params.tagLength;
2338
- const aadStart = params.nonceLength !== void 0 ? 1 : 0;
2339
- if (!params.withAAD) {
2340
- for (let i = aadStart; i < args.length; i++)
2341
- if (isBytes2(args[i]))
2342
- throw new Error("AAD not supported");
2343
- }
2344
- if (params.withAAD && args[aadStart] !== void 0)
2345
- abytes2(args[aadStart], void 0, "AAD");
2346
- const cipher = constructor(key2, ...args);
2347
- const checkOutput = (fnLength, output) => {
2348
- if (output !== void 0) {
2349
- if (fnLength !== 2)
2350
- throw new Error("cipher output not supported");
2351
- abytes2(output, void 0, "output");
2352
- }
2353
- };
2354
- let called = false;
2355
- const wrCipher = {
2356
- encrypt(data, output) {
2357
- if (called)
2358
- throw new Error("cannot encrypt() twice with same key + nonce");
2359
- called = true;
2360
- abytes2(data, void 0, "data");
2361
- checkOutput(cipher.encrypt.length, output);
2362
- return cipher.encrypt(data, output);
2363
- },
2364
- decrypt(data, output) {
2365
- abytes2(data, void 0, "data");
2366
- if (tagl && data.length < tagl)
2367
- throw new Error('"ciphertext" expected length >= tagLength=' + tagl);
2368
- checkOutput(cipher.decrypt.length, output);
2369
- return cipher.decrypt(data, output);
2479
+ F = B ^ C ^ D;
2480
+ K2 = 3395469782;
2370
2481
  }
2371
- };
2372
- return wrCipher;
2482
+ const T = rotl(A, 5) + F + E + K2 + SHA1_W[i2] | 0;
2483
+ E = D;
2484
+ D = C;
2485
+ C = rotl(B, 30);
2486
+ B = A;
2487
+ A = T;
2488
+ }
2489
+ A = A + this.A | 0;
2490
+ B = B + this.B | 0;
2491
+ C = C + this.C | 0;
2492
+ D = D + this.D | 0;
2493
+ E = E + this.E | 0;
2494
+ this.set(A, B, C, D, E);
2373
2495
  }
2374
- Object.assign(wrappedCipher, params);
2375
- return wrappedCipher;
2376
- };
2377
- function getOutput(expectedLength, out, onlyAligned = true) {
2378
- if (out === void 0)
2379
- return new Uint8Array(expectedLength);
2380
- abytes2(out, expectedLength, "output");
2381
- if (onlyAligned && !isAligned32(out))
2382
- throw new Error("invalid output, must be aligned");
2383
- return out;
2384
- }
2385
- function isAligned32(bytes2) {
2386
- return bytes2.byteOffset % 4 === 0;
2387
- }
2388
- function copyBytes(bytes2) {
2389
- return Uint8Array.from(abytes2(bytes2));
2390
- }
2391
-
2392
- // node_modules/.pnpm/@noble+ciphers@2.4.0/node_modules/@noble/ciphers/aes.js
2393
- var BLOCK_SIZE = 16;
2394
- var POLY = 283;
2395
- function validateKeyLength(key2) {
2396
- if (![16, 24, 32].includes(key2.length))
2397
- throw new Error('"aes key" expected Uint8Array of length 16/24/32, got length=' + key2.length);
2398
- }
2399
- function mul2(n) {
2400
- return n << 1 ^ POLY & -(n >> 7);
2401
- }
2402
- function mul(a, b) {
2403
- let res = 0;
2404
- for (; b > 0; b >>= 1) {
2405
- res ^= a & -(b & 1);
2406
- a = mul2(a);
2496
+ roundClean() {
2497
+ clean2(SHA1_W);
2407
2498
  }
2408
- return res;
2409
- }
2410
- var sbox = /* @__PURE__ */ (() => {
2411
- const t = new Uint8Array(256);
2412
- for (let i = 0, x = 1; i < 256; i++, x ^= mul2(x))
2413
- t[i] = x;
2414
- const box = new Uint8Array(256);
2415
- box[0] = 99;
2416
- for (let i = 0; i < 255; i++) {
2417
- let x = t[255 - i];
2418
- x |= x << 8;
2419
- box[t[i]] = (x ^ x >> 4 ^ x >> 5 ^ x >> 6 ^ x >> 7 ^ 99) & 255;
2499
+ destroy() {
2500
+ this.destroyed = true;
2501
+ this.set(0, 0, 0, 0, 0);
2502
+ clean2(this.buffer);
2420
2503
  }
2421
- clean2(t);
2422
- return box;
2504
+ };
2505
+ var sha1 = /* @__PURE__ */ createHasher(() => new _SHA1());
2506
+ var p32 = /* @__PURE__ */ Math.pow(2, 32);
2507
+ var K = /* @__PURE__ */ Array.from({ length: 64 }, (_, i2) => Math.floor(p32 * Math.abs(Math.sin(i2 + 1))));
2508
+ var MD5_IV = /* @__PURE__ */ SHA1_IV.slice(0, 4);
2509
+ var MD5_W = /* @__PURE__ */ new Uint32Array(16);
2510
+ var MD5_SHIFTS = /* @__PURE__ */ (() => {
2511
+ const S = [
2512
+ [7, 12, 17, 22],
2513
+ [5, 9, 14, 20],
2514
+ [4, 11, 16, 23],
2515
+ [6, 10, 15, 21]
2516
+ ];
2517
+ return Uint8Array.from({ length: 64 }, (_, i2) => S[Math.floor(i2 / 16)][i2 % 4]);
2423
2518
  })();
2424
- var invSbox = /* @__PURE__ */ sbox.map((_, j) => sbox.indexOf(j));
2425
- var rotr32_8 = (n) => n << 24 | n >>> 8;
2426
- var rotl32_8 = (n) => n << 8 | n >>> 24;
2427
- function genTtable(sbox2, fn) {
2428
- if (sbox2.length !== 256)
2429
- throw new Error("wrong sbox length");
2430
- const T0 = new Uint32Array(256).map((_, j) => fn(sbox2[j]));
2431
- const T1 = T0.map(rotl32_8);
2432
- const T2 = T1.map(rotl32_8);
2433
- const T3 = T2.map(rotl32_8);
2434
- const T01 = new Uint32Array(256 * 256);
2435
- const T23 = new Uint32Array(256 * 256);
2436
- const sbox22 = new Uint16Array(256 * 256);
2437
- for (let i = 0; i < 256; i++) {
2438
- for (let j = 0; j < 256; j++) {
2439
- const idx = i * 256 + j;
2440
- T01[idx] = T0[i] ^ T1[j];
2441
- T23[idx] = T2[i] ^ T3[j];
2442
- sbox22[idx] = sbox2[i] << 8 | sbox2[j];
2443
- }
2519
+ var _MD5 = class extends HashMD {
2520
+ A = MD5_IV[0] | 0;
2521
+ B = MD5_IV[1] | 0;
2522
+ C = MD5_IV[2] | 0;
2523
+ D = MD5_IV[3] | 0;
2524
+ constructor() {
2525
+ super(64, 16, 8, true);
2444
2526
  }
2445
- return { sbox: sbox2, sbox2: sbox22, T0, T1, T2, T3, T01, T23 };
2446
- }
2447
- var tableEncoding = /* @__PURE__ */ genTtable(sbox, (s) => mul(s, 3) << 24 | s << 16 | s << 8 | mul(s, 2));
2448
- var tableDecoding = /* @__PURE__ */ genTtable(invSbox, (s) => mul(s, 11) << 24 | mul(s, 13) << 16 | mul(s, 9) << 8 | mul(s, 14));
2449
- var xPowers = /* @__PURE__ */ (() => {
2450
- const p = new Uint8Array(16);
2451
- for (let i = 0, x = 1; i < 16; i++, x = mul2(x))
2452
- p[i] = x;
2453
- return p;
2454
- })();
2455
- function expandKeyLE(key2) {
2456
- abytes2(key2);
2457
- const len = key2.length;
2458
- validateKeyLength(key2);
2459
- const { sbox2 } = tableEncoding;
2460
- const toClean = [];
2461
- if (!isLE || !isAligned32(key2))
2462
- toClean.push(key2 = copyBytes(key2));
2463
- const k32 = swap32IfBE(u32(key2));
2464
- const Nk = k32.length;
2465
- const subByte = (n) => applySbox(sbox2, n, n, n, n);
2466
- const xk = new Uint32Array(len + 28);
2467
- xk.set(k32);
2468
- for (let i = Nk; i < xk.length; i++) {
2469
- let t = xk[i - 1];
2470
- if (i % Nk === 0)
2471
- t = subByte(rotr32_8(t)) ^ xPowers[i / Nk - 1];
2472
- else if (Nk > 6 && i % Nk === 4)
2473
- t = subByte(t);
2474
- xk[i] = xk[i - Nk] ^ t;
2527
+ get() {
2528
+ const { A, B, C, D } = this;
2529
+ return [A, B, C, D];
2475
2530
  }
2476
- clean2(...toClean);
2477
- return xk;
2478
- }
2479
- function expandKeyDecLE(key2) {
2480
- const encKey = expandKeyLE(key2);
2481
- const xk = encKey.slice();
2482
- const Nk = encKey.length;
2483
- const { sbox2 } = tableEncoding;
2484
- const { T0, T1, T2, T3 } = tableDecoding;
2485
- for (let i = 0; i < Nk; i += 4) {
2486
- for (let j = 0; j < 4; j++)
2487
- xk[i + j] = encKey[Nk - i - 4 + j];
2531
+ set(A, B, C, D) {
2532
+ this.A = A | 0;
2533
+ this.B = B | 0;
2534
+ this.C = C | 0;
2535
+ this.D = D | 0;
2488
2536
  }
2489
- clean2(encKey);
2490
- for (let i = 4; i < Nk - 4; i++) {
2491
- const x = xk[i];
2492
- const w = applySbox(sbox2, x, x, x, x);
2493
- xk[i] = T0[w & 255] ^ T1[w >>> 8 & 255] ^ T2[w >>> 16 & 255] ^ T3[w >>> 24];
2537
+ _cloneInto(to) {
2538
+ (to ||= new this.constructor()).set(...this.get());
2539
+ return this._cloneIntoMeta(to);
2494
2540
  }
2495
- return xk;
2496
- }
2497
- function apply0123(T01, T23, s0, s1, s2, s3) {
2498
- return T01[s0 << 8 & 65280 | s1 >>> 8 & 255] ^ T23[s2 >>> 8 & 65280 | s3 >>> 24 & 255];
2499
- }
2500
- function applySbox(sbox2, s0, s1, s2, s3) {
2501
- return sbox2[s0 & 255 | s1 & 65280] | sbox2[s2 >>> 16 & 255 | s3 >>> 16 & 65280] << 16;
2502
- }
2503
- function encrypt(xk, s0, s1, s2, s3) {
2504
- const { sbox2, T01, T23 } = tableEncoding;
2505
- let k = 0;
2506
- s0 ^= xk[k++], s1 ^= xk[k++], s2 ^= xk[k++], s3 ^= xk[k++];
2507
- const rounds = xk.length / 4 - 2;
2508
- for (let i = 0; i < rounds; i++) {
2509
- const t02 = xk[k++] ^ apply0123(T01, T23, s0, s1, s2, s3);
2510
- const t12 = xk[k++] ^ apply0123(T01, T23, s1, s2, s3, s0);
2511
- const t22 = xk[k++] ^ apply0123(T01, T23, s2, s3, s0, s1);
2512
- const t32 = xk[k++] ^ apply0123(T01, T23, s3, s0, s1, s2);
2513
- s0 = t02, s1 = t12, s2 = t22, s3 = t32;
2541
+ process(view, offset) {
2542
+ for (let i2 = 0; i2 < 16; i2++, offset += 4)
2543
+ MD5_W[i2] = view.getUint32(offset, true);
2544
+ let { A, B, C, D } = this;
2545
+ for (let i2 = 0; i2 < 64; i2++) {
2546
+ let F, g;
2547
+ if (i2 < 16) {
2548
+ F = Chi(B, C, D);
2549
+ g = i2;
2550
+ } else if (i2 < 32) {
2551
+ F = Chi(D, B, C);
2552
+ g = (5 * i2 + 1) % 16;
2553
+ } else if (i2 < 48) {
2554
+ F = B ^ C ^ D;
2555
+ g = (3 * i2 + 5) % 16;
2556
+ } else {
2557
+ F = C ^ (B | ~D);
2558
+ g = 7 * i2 % 16;
2559
+ }
2560
+ F = F + A + K[i2] + MD5_W[g];
2561
+ A = D;
2562
+ D = C;
2563
+ C = B;
2564
+ B = B + rotl(F, MD5_SHIFTS[i2]);
2565
+ }
2566
+ A = A + this.A | 0;
2567
+ B = B + this.B | 0;
2568
+ C = C + this.C | 0;
2569
+ D = D + this.D | 0;
2570
+ this.set(A, B, C, D);
2514
2571
  }
2515
- const t0 = xk[k++] ^ applySbox(sbox2, s0, s1, s2, s3);
2516
- const t1 = xk[k++] ^ applySbox(sbox2, s1, s2, s3, s0);
2517
- const t2 = xk[k++] ^ applySbox(sbox2, s2, s3, s0, s1);
2518
- const t3 = xk[k++] ^ applySbox(sbox2, s3, s0, s1, s2);
2519
- return { s0: t0, s1: t1, s2: t2, s3: t3 };
2520
- }
2521
- function decrypt(xk, s0, s1, s2, s3) {
2522
- const { sbox2, T01, T23 } = tableDecoding;
2523
- let k = 0;
2524
- s0 ^= xk[k++], s1 ^= xk[k++], s2 ^= xk[k++], s3 ^= xk[k++];
2525
- const rounds = xk.length / 4 - 2;
2526
- for (let i = 0; i < rounds; i++) {
2527
- const t02 = xk[k++] ^ apply0123(T01, T23, s0, s3, s2, s1);
2528
- const t12 = xk[k++] ^ apply0123(T01, T23, s1, s0, s3, s2);
2529
- const t22 = xk[k++] ^ apply0123(T01, T23, s2, s1, s0, s3);
2530
- const t32 = xk[k++] ^ apply0123(T01, T23, s3, s2, s1, s0);
2531
- s0 = t02, s1 = t12, s2 = t22, s3 = t32;
2572
+ roundClean() {
2573
+ clean2(MD5_W);
2532
2574
  }
2533
- const t0 = xk[k++] ^ applySbox(sbox2, s0, s3, s2, s1);
2534
- const t1 = xk[k++] ^ applySbox(sbox2, s1, s0, s3, s2);
2535
- const t2 = xk[k++] ^ applySbox(sbox2, s2, s1, s0, s3);
2536
- const t3 = xk[k++] ^ applySbox(sbox2, s3, s2, s1, s0);
2537
- return { s0: t0, s1: t1, s2: t2, s3: t3 };
2538
- }
2539
- function validateBlockDecrypt(data, dst) {
2540
- abytes2(data);
2541
- if (data.length % BLOCK_SIZE !== 0) {
2542
- throw new Error("ciphertext must be multiple of " + BLOCK_SIZE);
2575
+ destroy() {
2576
+ this.destroyed = true;
2577
+ this.set(0, 0, 0, 0);
2578
+ clean2(this.buffer);
2543
2579
  }
2544
- if (dst !== void 0) {
2545
- getOutput(data.length, dst);
2546
- complexOverlapBytes(data, dst);
2580
+ };
2581
+ var md5 = /* @__PURE__ */ createHasher(() => new _MD5());
2582
+
2583
+ // node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/hmac.js
2584
+ init_buffer();
2585
+ var _HMAC = class {
2586
+ oHash;
2587
+ iHash;
2588
+ blockLen;
2589
+ outputLen;
2590
+ canXOF = false;
2591
+ finished = false;
2592
+ destroyed = false;
2593
+ constructor(hash2, key2) {
2594
+ ahash(hash2);
2595
+ abytes2(key2, void 0, "key");
2596
+ this.iHash = hash2.create();
2597
+ if (typeof this.iHash.update !== "function")
2598
+ throw new Error("expected Hash instance");
2599
+ this.blockLen = this.iHash.blockLen;
2600
+ this.outputLen = this.iHash.outputLen;
2601
+ const blockLen = this.blockLen;
2602
+ const pad = new Uint8Array(blockLen);
2603
+ pad.set(key2.length > blockLen ? hash2.create().update(key2).digest() : key2);
2604
+ for (let i2 = 0; i2 < pad.length; i2++)
2605
+ pad[i2] ^= 54;
2606
+ this.iHash.update(pad);
2607
+ this.oHash = hash2.create();
2608
+ for (let i2 = 0; i2 < pad.length; i2++)
2609
+ pad[i2] ^= 54 ^ 92;
2610
+ this.oHash.update(pad);
2611
+ clean2(pad);
2547
2612
  }
2548
- }
2549
- function validateBlockEncrypt(plaintext, pkcs5, dst) {
2550
- abytes2(plaintext);
2551
- let outLen = plaintext.length;
2552
- const remaining = outLen % BLOCK_SIZE;
2553
- if (!pkcs5 && remaining !== 0)
2554
- throw new Error("plaintext must be multiple of " + BLOCK_SIZE);
2555
- if (pkcs5) {
2556
- let left = BLOCK_SIZE - remaining;
2557
- if (!left)
2558
- left = BLOCK_SIZE;
2559
- outLen = outLen + left;
2613
+ update(buf) {
2614
+ aexists2(this);
2615
+ this.iHash.update(buf);
2616
+ return this;
2617
+ }
2618
+ digestInto(out) {
2619
+ aexists2(this);
2620
+ aoutput(out, this);
2621
+ this.finished = true;
2622
+ const buf = out.subarray(0, this.outputLen);
2623
+ this.iHash.digestInto(buf);
2624
+ this.oHash.update(buf);
2625
+ this.oHash.digestInto(buf);
2626
+ this.destroy();
2627
+ }
2628
+ digest() {
2629
+ const out = new Uint8Array(this.oHash.outputLen);
2630
+ this.digestInto(out);
2631
+ return out;
2560
2632
  }
2561
- if (dst !== void 0) {
2562
- getOutput(outLen, dst);
2563
- complexOverlapBytes(plaintext, dst);
2633
+ _cloneInto(to) {
2634
+ to ||= Object.create(Object.getPrototypeOf(this), {});
2635
+ const { oHash, iHash, finished, destroyed, blockLen, outputLen, canXOF } = this;
2636
+ to = to;
2637
+ to.finished = finished;
2638
+ to.destroyed = destroyed;
2639
+ to.blockLen = blockLen;
2640
+ to.outputLen = outputLen;
2641
+ to.canXOF = canXOF;
2642
+ to.oHash = oHash._cloneInto(to.oHash);
2643
+ to.iHash = iHash._cloneInto(to.iHash);
2644
+ return to;
2564
2645
  }
2565
- return outLen;
2566
- }
2567
- function prepareBlockEncrypt(plaintext, outLen, dst) {
2568
- if (dst === void 0)
2569
- dst = new Uint8Array(outLen);
2570
- if (!isLE || !isAligned32(plaintext))
2571
- plaintext = copyBytes(plaintext);
2572
- const o = u32(dst);
2573
- return { b: plaintext, o, out: dst };
2574
- }
2575
- function validatePKCS(data, pkcs5) {
2576
- if (!pkcs5)
2577
- return data;
2578
- const len = data.length;
2579
- if (len === 0)
2580
- throw new Error("pkcs7: empty ciphertext not allowed");
2581
- const lastByte = data[len - 1];
2582
- let valid = 1;
2583
- valid &= lastByte - 1 >>> 31 ^ 1;
2584
- valid &= 16 - lastByte >>> 31 ^ 1;
2585
- for (let i = 0; i < 16; i++) {
2586
- const shouldCheck = i - lastByte >>> 31;
2587
- const eq = (data[len - 1 - i] ^ lastByte) === 0 ? 1 : 0;
2588
- valid &= eq | shouldCheck ^ 1;
2646
+ clone() {
2647
+ return this._cloneInto();
2589
2648
  }
2590
- if (!valid)
2591
- throw new Error("aes: bad decrypt");
2592
- return data.subarray(0, len - lastByte);
2593
- }
2594
- function padPCKS(left) {
2595
- const tmp = new Uint8Array(16);
2596
- const tmp32 = u32(tmp);
2597
- tmp.set(left);
2598
- const paddingByte = BLOCK_SIZE - left.length;
2599
- for (let i = BLOCK_SIZE - paddingByte; i < BLOCK_SIZE; i++)
2600
- tmp[i] = paddingByte;
2601
- return tmp32;
2602
- }
2603
- var ecb = /* @__PURE__ */ wrapCipher({ blockSize: 16 }, function aesecb(key2, opts = {}) {
2604
- const pkcs5 = !opts.disablePadding;
2605
- return {
2606
- encrypt(plaintext, dst) {
2607
- const outLen = validateBlockEncrypt(plaintext, pkcs5, dst);
2608
- const xk = expandKeyLE(key2);
2609
- const { b: input, o, out: _out } = prepareBlockEncrypt(plaintext, outLen, dst);
2610
- const b = u32(input);
2611
- swap32IfBE(b);
2612
- let i = 0;
2613
- for (; i + 4 <= b.length; ) {
2614
- const { s0, s1, s2, s3 } = encrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);
2615
- o[i++] = s0, o[i++] = s1, o[i++] = s2, o[i++] = s3;
2616
- }
2617
- if (pkcs5) {
2618
- const tmp32 = padPCKS(plaintext.subarray(i * 4));
2619
- swap32IfBE(tmp32);
2620
- const { s0, s1, s2, s3 } = encrypt(xk, tmp32[0], tmp32[1], tmp32[2], tmp32[3]);
2621
- o[i++] = s0, o[i++] = s1, o[i++] = s2, o[i++] = s3;
2622
- clean2(tmp32);
2623
- }
2624
- swap32IfBE(o);
2625
- clean2(xk);
2626
- if (input !== plaintext)
2627
- clean2(input);
2628
- return _out;
2629
- },
2630
- decrypt(ciphertext, dst) {
2631
- validateBlockDecrypt(ciphertext, dst);
2632
- const xk = expandKeyDecLE(key2);
2633
- if (dst === void 0)
2634
- dst = new Uint8Array(ciphertext.length);
2635
- const toClean = [xk];
2636
- if (!isLE || !isAligned32(ciphertext))
2637
- toClean.push(ciphertext = copyBytes(ciphertext));
2638
- const b = u32(ciphertext);
2639
- const o = u32(dst);
2640
- swap32IfBE(b);
2641
- for (let i = 0; i + 4 <= b.length; ) {
2642
- const { s0, s1, s2, s3 } = decrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);
2643
- o[i++] = s0, o[i++] = s1, o[i++] = s2, o[i++] = s3;
2644
- }
2645
- swap32IfBE(o);
2646
- clean2(...toClean);
2647
- return validatePKCS(dst, pkcs5);
2648
- }
2649
- };
2650
- });
2649
+ destroy() {
2650
+ this.destroyed = true;
2651
+ this.oHash.destroy();
2652
+ this.iHash.destroy();
2653
+ }
2654
+ };
2655
+ var hmac = /* @__PURE__ */ (() => {
2656
+ const hmac_ = ((hash2, key2, message) => new _HMAC(hash2, key2).update(message).digest());
2657
+ hmac_.create = (hash2, key2) => new _HMAC(hash2, key2);
2658
+ return hmac_;
2659
+ })();
2651
2660
 
2652
2661
  // node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js
2653
2662
  init_buffer();
@@ -2728,13 +2737,13 @@ var fdeb = new u82([
2728
2737
  var clim = new u82([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
2729
2738
  var freb = function(eb, start) {
2730
2739
  var b = new u16(31);
2731
- for (var i = 0; i < 31; ++i) {
2732
- b[i] = start += 1 << eb[i - 1];
2740
+ for (var i2 = 0; i2 < 31; ++i2) {
2741
+ b[i2] = start += 1 << eb[i2 - 1];
2733
2742
  }
2734
2743
  var r = new i32(b[30]);
2735
- for (var i = 1; i < 30; ++i) {
2736
- for (var j = b[i]; j < b[i + 1]; ++j) {
2737
- r[j] = j - b[i] << 5 | i;
2744
+ for (var i2 = 1; i2 < 30; ++i2) {
2745
+ for (var j = b[i2]; j < b[i2 + 1]; ++j) {
2746
+ r[j] = j - b[i2] << 5 | i2;
2738
2747
  }
2739
2748
  }
2740
2749
  return { b, r };
@@ -2757,25 +2766,25 @@ var x;
2757
2766
  var i;
2758
2767
  var hMap = (function(cd, mb, r) {
2759
2768
  var s = cd.length;
2760
- var i = 0;
2769
+ var i2 = 0;
2761
2770
  var l = new u16(mb);
2762
- for (; i < s; ++i) {
2763
- if (cd[i])
2764
- ++l[cd[i] - 1];
2771
+ for (; i2 < s; ++i2) {
2772
+ if (cd[i2])
2773
+ ++l[cd[i2] - 1];
2765
2774
  }
2766
2775
  var le = new u16(mb);
2767
- for (i = 1; i < mb; ++i) {
2768
- le[i] = le[i - 1] + l[i - 1] << 1;
2776
+ for (i2 = 1; i2 < mb; ++i2) {
2777
+ le[i2] = le[i2 - 1] + l[i2 - 1] << 1;
2769
2778
  }
2770
2779
  var co;
2771
2780
  if (r) {
2772
2781
  co = new u16(1 << mb);
2773
2782
  var rvb = 15 - mb;
2774
- for (i = 0; i < s; ++i) {
2775
- if (cd[i]) {
2776
- var sv = i << 4 | cd[i];
2777
- var r_1 = mb - cd[i];
2778
- var v = le[cd[i] - 1]++ << r_1;
2783
+ for (i2 = 0; i2 < s; ++i2) {
2784
+ if (cd[i2]) {
2785
+ var sv = i2 << 4 | cd[i2];
2786
+ var r_1 = mb - cd[i2];
2787
+ var v = le[cd[i2] - 1]++ << r_1;
2779
2788
  for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
2780
2789
  co[rev[v] >> rvb] = sv;
2781
2790
  }
@@ -2783,9 +2792,9 @@ var hMap = (function(cd, mb, r) {
2783
2792
  }
2784
2793
  } else {
2785
2794
  co = new u16(s);
2786
- for (i = 0; i < s; ++i) {
2787
- if (cd[i]) {
2788
- co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
2795
+ for (i2 = 0; i2 < s; ++i2) {
2796
+ if (cd[i2]) {
2797
+ co[i2] = rev[le[cd[i2] - 1]++] >> 15 - cd[i2];
2789
2798
  }
2790
2799
  }
2791
2800
  }
@@ -2812,9 +2821,9 @@ var flrm = /* @__PURE__ */ hMap(flt, 9, 1);
2812
2821
  var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
2813
2822
  var max = function(a) {
2814
2823
  var m = a[0];
2815
- for (var i = 1; i < a.length; ++i) {
2816
- if (a[i] > m)
2817
- m = a[i];
2824
+ for (var i2 = 1; i2 < a.length; ++i2) {
2825
+ if (a[i2] > m)
2826
+ m = a[i2];
2818
2827
  }
2819
2828
  return m;
2820
2829
  };
@@ -2907,28 +2916,28 @@ var inflt = function(dat, st, buf, dict) {
2907
2916
  pos += 14;
2908
2917
  var ldt = new u82(tl);
2909
2918
  var clt = new u82(19);
2910
- for (var i = 0; i < hcLen; ++i) {
2911
- clt[clim[i]] = bits(dat, pos + i * 3, 7);
2919
+ for (var i2 = 0; i2 < hcLen; ++i2) {
2920
+ clt[clim[i2]] = bits(dat, pos + i2 * 3, 7);
2912
2921
  }
2913
2922
  pos += hcLen * 3;
2914
2923
  var clb = max(clt), clbmsk = (1 << clb) - 1;
2915
2924
  var clm = hMap(clt, clb, 1);
2916
- for (var i = 0; i < tl; ) {
2925
+ for (var i2 = 0; i2 < tl; ) {
2917
2926
  var r = clm[bits(dat, pos, clbmsk)];
2918
2927
  pos += r & 15;
2919
2928
  var s = r >> 4;
2920
2929
  if (s < 16) {
2921
- ldt[i++] = s;
2930
+ ldt[i2++] = s;
2922
2931
  } else {
2923
2932
  var c = 0, n = 0;
2924
2933
  if (s == 16)
2925
- n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
2934
+ n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i2 - 1];
2926
2935
  else if (s == 17)
2927
2936
  n = 3 + bits(dat, pos, 7), pos += 3;
2928
2937
  else if (s == 18)
2929
2938
  n = 11 + bits(dat, pos, 127), pos += 7;
2930
2939
  while (n--)
2931
- ldt[i++] = c;
2940
+ ldt[i2++] = c;
2932
2941
  }
2933
2942
  }
2934
2943
  var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
@@ -2966,8 +2975,8 @@ var inflt = function(dat, st, buf, dict) {
2966
2975
  } else {
2967
2976
  var add = sym - 254;
2968
2977
  if (sym > 264) {
2969
- var i = sym - 257, b = fleb[i];
2970
- add = bits(dat, pos, (1 << b) - 1) + fl[i];
2978
+ var i2 = sym - 257, b = fleb[i2];
2979
+ add = bits(dat, pos, (1 << b) - 1) + fl[i2];
2971
2980
  pos += b;
2972
2981
  }
2973
2982
  var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
@@ -3058,8 +3067,7 @@ var inflateRawSync = (data, options) => {
3058
3067
  const output = import_buffer.Buffer.alloc(options.maxOutputLength);
3059
3068
  let length = 0;
3060
3069
  const stream = new Inflate((chunk) => {
3061
- if (chunk.length > output.length - length)
3062
- throw new RangeError("Inflated data exceeds declared size");
3070
+ if (chunk.length > output.length - length) throw new RangeError("Inflated data exceeds declared size");
3063
3071
  output.set(chunk, length);
3064
3072
  length += chunk.length;
3065
3073
  });
@@ -3076,6 +3084,9 @@ var readFile = nodeOnly;
3076
3084
  var writeFile = nodeOnly;
3077
3085
  var readFileSync = nodeOnly;
3078
3086
 
3087
+ // src/nitro/banner.ts
3088
+ init_buffer();
3089
+
3079
3090
  // src/nitro/binary.ts
3080
3091
  init_buffer();
3081
3092
  var DEFAULT_MAX_SIZE = 1073741824;
@@ -3085,15 +3096,11 @@ var bytes = (value, name = "input") => {
3085
3096
  };
3086
3097
  var range = (buffer, offset, size, name = "binary data") => {
3087
3098
  if (!Number.isSafeInteger(offset) || !Number.isSafeInteger(size) || offset < 0 || size < 0 || offset + size > buffer.length) {
3088
- throw new RangeError(
3089
- `Invalid ${name} range: offset=${offset}, size=${size}, available=${buffer.length}`
3090
- );
3099
+ throw new RangeError(`Invalid ${name} range: offset=${offset}, size=${size}, available=${buffer.length}`);
3091
3100
  }
3092
3101
  return buffer.subarray(offset, offset + size);
3093
3102
  };
3094
- var align = (value, alignment = 512) => {
3095
- return Math.ceil(value / alignment) * alignment;
3096
- };
3103
+ var align = (value, alignment = 512) => Math.ceil(value / alignment) * alignment;
3097
3104
  var BinaryWriter = class {
3098
3105
  maxSize;
3099
3106
  buffer;
@@ -3117,8 +3124,7 @@ var BinaryWriter = class {
3117
3124
  }
3118
3125
  write(data) {
3119
3126
  data = bytes(data);
3120
- if (!Number.isSafeInteger(this.position) || this.position < 0)
3121
- throw new RangeError("Invalid writer position");
3127
+ if (!Number.isSafeInteger(this.position) || this.position < 0) throw new RangeError("Invalid writer position");
3122
3128
  this.ensure(this.position + data.length);
3123
3129
  bytes(data).copy(this.buffer, this.position);
3124
3130
  this.position += data.length;
@@ -3139,260 +3145,31 @@ var BinaryWriter = class {
3139
3145
  }
3140
3146
  };
3141
3147
 
3142
- // src/nitro/header.ts
3143
- init_buffer();
3144
-
3145
3148
  // src/nitro/crc.ts
3146
- init_buffer();
3147
- var table16 = new Uint16Array(256);
3148
- var table32 = new Uint32Array(256);
3149
- for (let i = 0; i < 256; i++) {
3150
- let a = i, b = i;
3151
- for (let bit = 0; bit < 8; bit++) {
3152
- a = a >>> 1 ^ (a & 1 ? 40961 : 0);
3153
- b = b >>> 1 ^ (b & 1 ? 3988292384 : 0);
3154
- }
3155
- table16[i] = a;
3156
- table32[i] = b;
3157
- }
3158
- var crc16 = (data, initial = 65535) => {
3159
- let crc = initial;
3160
- for (const byte of data) crc = crc >>> 8 ^ table16[(crc ^ byte) & 255];
3161
- return crc;
3162
- };
3163
- var crc32 = (data) => {
3164
- let crc = 4294967295;
3165
- for (const byte of data) crc = crc >>> 8 ^ table32[(crc ^ byte) & 255];
3166
- return (crc ^ 4294967295) >>> 0;
3167
- };
3168
-
3169
- // src/nitro/crypto.ts
3170
- init_buffer();
3171
- var KEY1 = import_buffer.Buffer.from(
3172
- "99D5205F5744F5B96E19A4D99E6A5A94D8AEF1EB4175E23A9382D03233EE31D5CC57619A3706A21B793972F555AEF6BE5F1B69FBE59DF1E9CE2CD9A15E3205E6FED3FECFD462040D8BF5ECB72B6079BB1295310D6E3FDA2B8884F0F13D127E254522F1BB24061A0611ADDF288B6481342BEB332999AAF2BD9C14959D9FF7F58C7297A1299DD15FCF664D071ADED34A4B85C9A7A31795053A3D490ABF0A898BA24A8249DD2790F10BE9EB1C6A83764505BA817061173F4BDEAECFAB3957F23A564811AD8A40E1453FFA9B0254CAA693FBEF4DFE6FA3D8879C08BAD5486A8D2DFD6E15F874BDBE528B18228A9EFB7437071B366C4A19BA4262B97991107B676596FE0223E8EE998C773E5C86644D6D7886A54F65E21EB2DF5A0AD07E0814B071ACBDDB831CB9D7A162CDC6637C5269C3E6BF75CE12445D2104FAFBD33C381163D4958541494609F2084311DC1F76C0156D1F3C6370EA87806CC3BD638BC2372137DCEE09232E376A4D7390F75030AC1C92041023914FD207AA683E4F9AC964606AC81421F3D62241124424CFE68A56DD0D534DE1851E8C525A9C1984C20357F16FE300BE58F64CEDD521649C1FBE55033C4ADCFFAAC9DAE05D5EBFE6DEF5D8B1F8FF36B3B9626795DB315F37ED4C70679990B518316C3D9999E442DAD3254213A0AED7706CB155CFC7D746D54361173D4428E93385D5D0A293AA25121FFBC50B46F597765645A6BE87B1946BE8B1FE3399AE1F3E6C39711D09009037E4103E7574FF8C833BB0F1B0F90105474295F1D6AC7E38E69E9574263FB4685018D04330B44C4BE368BFE54DB6958B0AA074253277CFA1F72CD871135AABEAC951E80DEEEFE9937E19A71E433881162CA148E373CC29216CD35DCEA0D9617143A01513B56492CF2A19DCADB7A59F8665F81A9FE7FBF7FDB8136C27DB6FDF351CF78D2C5B9B12AB386406CCDE31E84E751164E3FAEAEB3454C2AD3F34EB932C7D26369D56F35AE1F6B398634A9E3283E49A84607D902E130EEE934B36A285EC1638E8880602BFF0A03AEDD76A9A73E157CFF844B8DC2E2359D1DF9552719961A04BD57F6E78BAA9C530D34086329D320C9C37B7022FBA5498A9C41304C98DBEC8E75D97502E93D622590C27BC2292E0A7200F936F7F4C9FD3B5A62A0B7467497D1026CBD1C58671E78CA09CE95BB21AF601EE8C9E5E83F21ADBE6E5EA845976D27CF68DA5493648C21652BB83A374B9070C3BFF6128E161E9E4EF6E15AA4EBAE85D0596BB3256B0FB72520F0EC84225657689AFF2DE1027F0014B74A79707D5265454091F820A867D30390EB3269B0B57BB360631AFFD79FCD930102B0CB3E19BD77BDC5FEFD2F813454D4775BD46963C7E75F33EB567C59A3BB05B296BDE805BC81505B131B6CE49DDAD84B5AE60DC67313430FE4EBD802FA6BF63392186D9357F1668220554E990268C076C51A43155D70907A83E2E5366C1F8F27BC4F258CFF187C5A2E7278F308758A064622318B9887CFACEC498AEAD17CC4A5BF3E948D556D30DF2C892738CDBD72F56AC81F992694DC632F6E6C08D21E276806111BCDC6C93AF19699BD0BFB9319F0267A351EE8306227B0CAB494240B8D5017DCE5EF7555339C59946D8879FBAF764B4E39AFAA16D90681030CA8A54A79F60C319F56B0D7A5198E6984351B4D635E94FC3DF0F7BD62F5CBD3A156119F14BCBAADC6D64C9D3C61E56EF384C50718675CC0D0D4EE928F6065D701BAAD345CFA839AC95A62EB4E422D474A8375F487A04CCA54C40D828B428080D1C725241F07D47193A534E5884626B93B58A81214E0DDCB43FA2C6FCC92B40DA3804E95E5A866B0C22258568118D7C921D95554DAB8EBBDAA6E6B751B6325A0541DD052A0A5650911747CCC9E67EB5614ADB736751C833F5DA6E742E54C3370D6DAF08E8158A5FE25921CDA8DE0C065A776B5FDB18653EC850DE78E0B882B35D4E7232074FC13423BA96B7674EA4281E3462EB2D6A70E92F42C4704E5A319CF95B4728AADA716F381FB378C4926B1C9EF6359AB74D0EBFCC1829410348355D55D02BC629AF5C6074698E5E9B7CD4BD7B44647D3F925D69B61F004BD48335CF7E644E17AE8DD52E9A28124E2E2B49085CAEC64685AE41611E6F82D25137161F0BF659A49ACA5AAF0DD4338B2063F184805CCBCF08B4B9D31605BD6283319B5651989FBAB25BAAB2226B2CB5D448FA632B5F58FA61FA6409BB38E0B89D9260A80D676F0E37F50D019FC277D4FEECF1733039E07DF56198E42C2855045655DB2F6BECE55806B664806A2A1A4E5B0FD8C40A2E5219D962F53048BE8C7B4F389BA2C3AFC9D3C7C1624186B96121576F994FC1BACE7BB53B4D5E8A8B44575F135F706D5B2947DC38E2EC045565122AE81743E18EDD2AB3E294F7096E5CE6EB8AF86D89495448F52FADBFEA944BCAFC3987825F8A01F275F2E671D6D842DEF12D1D28A6887EA3A0471D30D9A371DF491CCB01F836B1F2F022585D456BBDA0BBB28842C78C28CE93E8906308907C893CF57DB7042D4F555116FD7E79E8BEC1F212D4F8B4840523A0CCD22BFDE1ABAD0DD1556C2341944D77374F05280CBF17B312676C8CC35AF741842A6DD09412272CB4ED9C4DEC478297D567B91B9DC055077EE58EE2A8E73E12E40E3A2A455534A2F92D5A1BAB527C83105F55D2F15A432BC6A7A4891595E8B44B9DF875E39F60785BD6E60D44E62106BD472253A400AD8D43138539F7AAFC38AF7BEDFCE42B5450984CFC8580F7DF3C8022E194DADE24C6B07A3938DC0FA1A7F4F96F6318578B84412A2ED453F2D9000FD0DD996E19A60AD0EC5B5824ABC0CB0665EC1A1338940A67032F3FF7E377447733C61439D0E3C0A20879BB409957410B0190CDE1CC4867DBB3AF8874F34C828F72B1B52329C4126C19FC8E46A49CC4256587D36DBE8A93110338ED832BF346A493EA3B53851DCED4F1088327EDFC9B1A18BCF98BAEDC24AB5038E9724B1022177B465DAB5964F340AEF8BBE5C8F926034E557DEBEBFEF739E6E00A11BE2E28FF98EDC0C9425642C3FD00F6AF87A25B013F329247959A72A5323DAE6BD09B07D24992E3784AFAA1067DF241CF77740414B20C86846416D5BB51A1E56FF1D1F2E2F75F58204DB857C7CFDDC5D8BE763DF65F7EE72A8B88241B383F0E412377F5F04BD40C1FFAA40B805FCF45F6E0DA2F345953FB203C52625E35B562FE8B6063E3865A151A6ED14745BC32B4EB6738ABE46E333AB5EDA3AD67E04E4195EE626271261D31EF6230AFD782ACC2DC0504F59707BF11592307C06402E897E53EAF18AC59A68B4A33901C6E7C9C207E4C3C3E6164BBC56B7C7E3E9FC54C9FEA73F5D789C04CF4FBF42DEC141B51D5C112C810DF0B4A8B9CBC93456A3E3E7DC1A9BACDC1B407E4E1688643B26D38F3FB0C5C663771DE56EF6EA0104065A798F7D0BE0EC83736EC10CA7C9CAB841E051776021C4F52AA5FC1C6A056B9D80484444DA759D8DE60E6380E058F03E13B6D8104336F300BCE69052133FB26BB897DB6AE877E5107E0ACF7960A6BF9C45C1DE44447B85EFAE3788455424B485EF77D4735861D2B430503EC8AB81E063C760C481A43A7B78AED1E13C643EE10EFDBECFB3C83B29544EFD854514E2D11441DFB36591E7A34C1C3CA570061EA67A5169B55D055E17FD936D24076AEDC01CEB07A83D5CB2098EC6BC1729234F3825737628A32360C9043AEAE5C9B788E136502FD6871C1FEB031A02482B0C3B17969A7F5D2EBD082C032DC9EC7263C6D8D98C1BB22D4D00F33EC3EB9CCE1DC6A4C7736141CF9BF819F285F71853229907548C4B34ACED8448F142FFD4057EFAA0875D946D1D66E32551FC318FE841FFC84D5FF715E1B48C386950E280827D33883717B4C8063549A56B0ACCF80CA3109EFFEF3BEAF247EA6FE533FC28D4A3368D122A666AD7BEADEB643B0A1259500A33F7546141144ECD795BC92F04FA916536297602A0F41F17124BEEE947F08CD6093B3855B07003FD80F28839AD1699FD1DA2EC39001A2B96B4E2A669DDAAEA6EA2AD3682F0C0C9CD28C4AEDE29E57659D0987A3B4C4325DC9D4322BB1E0711E644DE69071E31E40ED7DF3840EEDC87876AEC0712772BB05EA0264FBF3486BB542933FED9F1353D2F7FE2AEC1D4725DB3C9186C68EF011FD237436F7A4F59E7A7E535044D447CAD3EB386DE6D971947F4AC6694B11F452EA22FE8AB036678B59E8E6802AEB650413EEECDC9E5FB1EC056A59E69F5E596B89BFF71ACA44F95B6A718503E42962E0706F41C4CFB2B1CCE37EA607A887E77F8493DB524B6CEC7EDDD4244810699F046074E64818F3E42CB94F2E507ADFD454692B8BA7F3CEFF1FF33E26013917958489B0F04C4B82919FC44BAC9DA574AF1725C9CA32D3BC898A8489CC0DAE7CA2DB9C6A7891EEEA765D4E8760F5691567D402CFAF483607EABF6F662D068FC49AFEF9F6908775B8F7AD0F76105A3D59B02EB3C7352CCC70562BCBE33796C52F461B8A2246C788A726329861DF86228AF41C2F87A109AACCA9AED3BD00451C9A5487865287EFFF1E8FA18FC1895C351BDA2D3A2C16B2C2F156E278C16B6397C5568FC9327F2CAAAFA6A8AC20912288DEE4608BF94B42251AE37F9C2C19893A7E05D436CC6958C2C1328B2F9085EB7A3950A5A12792C566B0204F587E5583432B45E29CE4D812902C168356167903B3AD2D61181A131F37E2E19C737B80D5FD2D5187FC7BAAD71F2C7A8EAFF48DBBCD95117C720BEE6FE2B9AFDE3783DE8C8D620567B796C68D56B60DD762BAD64636BD8EC8E6EA2A6C1014FF6B5BFA823C46B1304346518A7D9B923E83795B555DB26C5ECE90628E5398C90D6DE52D57CDC58157BAE1E8B88F72E54F13DCEA9D711510B21188D509D47F5B657F2C3B384C1168508DFB9EB059BF9480894AC51A18128953D14A1029E88C1CECB6EA46C7178B251531A8A26B43B19DE2DB0B879BB011040E71D2297789820A66417F1D0B48FF72BB24FDC248A19BFE7B7FCE88DB86D9853B1CB0DCA83307BF512EE30E9A00971E06C097439DD8B645C486675F00F8889AA4529EC7AA8A8375ECC518AECEC32F1A2BF918FFAE1AF5530BB53351A7FDE8A8E1A264B622174380CC0AD8AE3BBA40D7D9924A89DF0410EE9B182B6A77698A68F4F9B9A221156EE61E3B0362309B60417E259B9E8FC5521008F8C269A1211188375E793566FF1042186EED97B66B1C4E36E56D7DB4E4BF20B9E0053A69D5B8E3D5DCE0B9AC533E07A457AD77FF4818762AAC492A8E47756D9F676330358C390539D56F643A5BADCA0BBB82529945B193363699AF13204436D8024409399285FF4A4A9787A663D7C7B5B524ED0FB46F0C585214D9A67BD379BC3858A1BD3B8406D81A06FD6BA8EA4B69280437AD8299FB0E1B85BDA85D73CDDC58750ABE636C48E74CE4302B0460B915D8DA8681758F96D48D1C5D70857C1C677BD50867A6CE4B0A6670B7E563D45B8A82EA1067CAE2F4EF17852F2A5F8A9782F86AD63410EAEBC95C3CE149F846EBDEBDF6A992F1AAA6A018B03AD30F1FF36FFF31454344D3509AF7880996C1CE76CCF22C2CBAAD82778F1884C0D2079C3690834E0BA54F433E04AB784FD6FB09012490DA6F3C3A610D7F694AEB2B3002B4DBE084A9ECD735BF377D8558CEA94EE480C7A8D3306748EB29AF2F746AB4A73F0F3F92AFF3CAACAF4BD994C043CA810D2F48A1B027D5D2EF4B0585A3DE4D93303CF0BB4A8F30274CEBE33E64ED9A2F3BF182F0BAF4CF7F40CBB0E17FBCAA57D3C974F2FA430D22D0F4774E93D785701F99BFB6DE35F130A75E71F06B012D7B64F033530A3988F36B3AA66B35D22F43CD02FDB5E9BC5BAAD8A4197E0E5D94819E6F77ADD60E749396E7C4185FADF519",
3173
- "hex"
3174
- );
3175
- var aes128CtrCrypt = (key2, counter, data) => {
3176
- if (key2.length !== 16 || counter.length !== 16)
3177
- throw new RangeError("AES key and counter must have 16 bytes");
3178
- const ctr = import_buffer.Buffer.from(counter).reverse();
3179
- const aes = createAesBlockCipher(import_buffer.Buffer.from(key2).reverse());
3180
- const output = import_buffer.Buffer.alloc(data.length);
3181
- for (let p = 0; p < data.length; p += 16) {
3182
- const mask = aes(ctr);
3183
- for (let j = 0; j < 16 && p + j < data.length; j++) output[p + j] = data[p + j] ^ mask[15 - j];
3184
- for (let j = 15; j >= 0; j--) {
3185
- ctr[j] = ctr[j] + 1 & 255;
3186
- if (ctr[j]) break;
3187
- }
3188
- }
3189
- return output;
3190
- };
3191
- var modcryptKey = (header) => {
3192
- if (typeof header.gameCode !== "string" || header.gameCode.length !== 4)
3193
- throw new Error("Expected four-character game code");
3194
- if (header.twlInternalFlags & 4 || (header.appflags?.[3] ?? 0) & 128) {
3195
- const key2 = import_buffer.Buffer.alloc(16);
3196
- key2.write(header.gameTitle, 0, 12, "ascii");
3197
- key2.write(header.gameCode, 12, 4, "ascii");
3198
- return key2;
3199
- }
3200
- if (!header.hmac_arm9i || header.hmac_arm9i.length < 16)
3201
- throw new Error("Missing ARM9i HMAC for modcrypt key");
3202
- const x = import_buffer.Buffer.from(
3203
- "Nintendo" + header.gameCode + [...header.gameCode].reverse().join(""),
3204
- "ascii"
3205
- );
3206
- for (let i = 0; i < 16; i++) x[i] ^= header.hmac_arm9i[i];
3207
- const mask = (1n << 128n) - 1n;
3208
- let v = x.readBigUInt64LE(0) | x.readBigUInt64LE(8) << 64n;
3209
- v = v + 0xfffefb4e295902582a680f5f1a4f3e79n & mask;
3210
- v = (v << 42n | v >> 86n) & mask;
3211
- const out = import_buffer.Buffer.alloc(16);
3212
- out.writeBigUInt64LE(v & (1n << 64n) - 1n);
3213
- out.writeBigUInt64LE(v >> 64n, 8);
3214
- return out;
3215
- };
3216
- var encryptSecureArea = (gameCode, input) => {
3217
- if (typeof gameCode !== "string" || gameCode.length !== 4)
3218
- throw new Error("Expected four-character game code");
3219
- if (input.length < 2048) throw new RangeError("Secure area must contain at least 0x800 bytes");
3220
- const output = import_buffer.Buffer.from(input);
3221
- let magic = new Uint32Array(1042);
3222
- let args = [0, 0, 0];
3223
- function encrypt2(a2, b2) {
3224
- for (let i = 0; i < 16; i++) {
3225
- const c = (magic[i] ^ a2) >>> 0;
3226
- const sum = magic[18 + (c >>> 24)] + magic[274 + (c >>> 16 & 255)] >>> 0;
3227
- const f = magic[786 + (c & 255)] + (magic[530 + (c >>> 8 & 255)] ^ sum) >>> 0;
3228
- a2 = (b2 ^ f) >>> 0;
3229
- b2 = c;
3230
- }
3231
- return [(b2 ^ magic[17]) >>> 0, (a2 ^ magic[16]) >>> 0];
3232
- }
3233
- function init2() {
3234
- [args[2], args[1]] = encrypt2(args[2], args[1]);
3235
- [args[1], args[0]] = encrypt2(args[1], args[0]);
3236
- const key2 = import_buffer.Buffer.alloc(12);
3237
- args.forEach((v, i) => key2.writeUInt32LE(v, i * 4));
3238
- for (let j = 0; j < 18; j++) magic[j] ^= key2.readUInt32BE(j * 4 & 7);
3239
- let a2 = 0, b2 = 0;
3240
- for (let i = 0; i < 1042; i += 2) {
3241
- [a2, b2] = encrypt2(a2, b2);
3242
- magic[i] = a2;
3243
- magic[i + 1] = b2;
3244
- }
3245
- }
3246
- function init1() {
3247
- magic = Uint32Array.from({ length: 1042 }, (_, i) => KEY1.readUInt32LE(i * 4));
3248
- const code = import_buffer.Buffer.from(gameCode, "ascii").readUInt32LE();
3249
- args = [code, code >>> 1, code << 1 >>> 0];
3250
- init2();
3251
- init2();
3252
- }
3253
- init1();
3254
- args[1] = args[1] << 1 >>> 0;
3255
- args[2] >>>= 1;
3256
- init2();
3257
- for (let p = 8; p < 2048; p += 8) {
3258
- const [b2, a2] = encrypt2(output.readUInt32LE(p + 4), output.readUInt32LE(p));
3259
- output.writeUInt32LE(a2, p);
3260
- output.writeUInt32LE(b2, p + 4);
3261
- }
3262
- let [b, a] = encrypt2(1784827769, 1919118949);
3263
- init1();
3264
- [b, a] = encrypt2(b, a);
3265
- output.writeUInt32LE(a, 0);
3266
- output.writeUInt32LE(b, 4);
3267
- return output;
3268
- };
3269
-
3270
- // src/nitro/header.ts
3271
- var UnitCode = Object.freeze({ NDS: 0, NDS_DSi: 2, DSi: 3 });
3272
- var Header = class {
3273
- raw;
3274
- trimmedRom;
3275
- doublePadding;
3276
- nitrocode;
3277
- decrypted;
3278
- headerCRC;
3279
- logoCRC;
3280
- secureCRC;
3281
- dlp_signature;
3282
- constructor(input) {
3283
- const data = bytes(input, "header");
3284
- range(data, 0, 368, "header");
3285
- const size = data.readUInt32LE(132);
3286
- if (size < 368 || size > data.length) throw new RangeError(`Invalid header size: ${size}`);
3287
- this.raw = import_buffer.Buffer.from(data.subarray(0, size));
3288
- if (this.unitCode & 2 && size > 512) range(this.raw, 0, 4096, "DSi header");
3289
- this.trimmedRom = this.total_rom_size ? this.total_rom_size >= data.length : data.length !== this.size;
3290
- this.doublePadding = this.ARM9size % 1024 < 512 && this.ARM7romOffset % 1024 === 0 && this.ARM9overlayOffset % 1024 === 0 || this.ARM7size % 1024 < 512 && this.FNToffset % 1024 === 0 && this.ARM7overlayOffset % 1024 === 0 || this.FNTsize % 1024 < 512 && this.FAToffset % 1024 === 0 || this.FATsize % 1024 < 512 && this.bannerOffset % 1024 === 0;
3291
- const nitroOffset = this.ARM9romOffset + this.ARM9size;
3292
- this.nitrocode = nitroOffset >= size && nitroOffset + 4 <= data.length && data.readUInt32LE(nitroOffset) === 3737126433;
3293
- this.decrypted = data.length >= 16392 && data.readBigUInt64LE(16384) === 0xe7ffdeffe7ffdeffn;
3294
- this.headerCRC = crc16(this.raw.subarray(0, 350)) === this.headerCRC16;
3295
- this.logoCRC = crc16(this.logo) === this.logoCRC16;
3296
- const secure = data.subarray(16384, 32768);
3297
- this.secureCRC = secure.length > 0 && crc16(this.decrypted ? encryptSecureArea(this.gameCode, secure) : secure) === this.secureCRC16;
3298
- this.dlp_signature = import_buffer.Buffer.alloc(0);
3299
- if (this.ROMsize >= size && this.ROMsize + 136 <= data.length && data.readUInt32LE(this.ROMsize) === 90977) {
3300
- this.dlp_signature = import_buffer.Buffer.from(data.subarray(this.ROMsize, this.ROMsize + 136));
3301
- }
3302
- }
3303
- get size() {
3304
- return 2 ** (17 + this.raw[20]);
3305
- }
3306
- set size(value) {
3307
- const power = Math.log2(value);
3308
- if (!Number.isInteger(power) || power < 17 || power > 32)
3309
- throw new RangeError("ROM capacity must be a power of two from 128 KiB to 4 GiB");
3310
- this.raw[20] = power - 17;
3311
- }
3312
- toBuffer() {
3313
- const data = import_buffer.Buffer.from(this.raw);
3314
- data.writeUInt16LE(crc16(data.subarray(192, 348)), 348);
3315
- data.writeUInt16LE(crc16(data.subarray(0, 350)), 350);
3316
- return data;
3317
- }
3318
- toString() {
3319
- return `NDS header: ${this.gameTitle.replace(/\0+$/, "")} (${this.gameCode})`;
3149
+ init_buffer();
3150
+ var table16 = new Uint16Array(256);
3151
+ var table32 = new Uint32Array(256);
3152
+ for (let i2 = 0; i2 < 256; i2++) {
3153
+ let a = i2, b = i2;
3154
+ for (let bit = 0; bit < 8; bit++) {
3155
+ a = a >>> 1 ^ (a & 1 ? 40961 : 0);
3156
+ b = b >>> 1 ^ (b & 1 ? 3988292384 : 0);
3320
3157
  }
3321
- };
3322
- function field(name, offset, length, type = "buffer", dsi = false) {
3323
- Object.defineProperty(Header.prototype, name, {
3324
- enumerable: true,
3325
- get() {
3326
- if (dsi && (!(this.unitCode & 2) || this.raw.length <= 512))
3327
- return type === "buffer" ? import_buffer.Buffer.alloc(length) : 0;
3328
- const data = range(this.raw, offset, length, `header ${name}`);
3329
- if (type === "string") return data.toString("latin1");
3330
- if (type === "buffer") return data;
3331
- return length === 8 ? data.readBigUInt64LE() : data.readUIntLE(0, length);
3332
- },
3333
- set(value) {
3334
- const target = range(this.raw, offset, length, `header ${name}`);
3335
- if (type === "string") {
3336
- if (typeof value !== "string" || import_buffer.Buffer.byteLength(value, "latin1") > length)
3337
- throw new TypeError(`Invalid ${name}`);
3338
- target.fill(0);
3339
- target.write(value, "latin1");
3340
- } else if (type === "buffer") {
3341
- if (!(value instanceof Uint8Array)) throw new TypeError(`Invalid ${name}`);
3342
- const source = bytes(value, name);
3343
- if (source.length !== length) throw new RangeError(`${name} must contain ${length} bytes`);
3344
- source.copy(target);
3345
- } else if (length === 8) {
3346
- if (typeof value !== "bigint") throw new TypeError(`Invalid ${name}`);
3347
- target.writeBigUInt64LE(value);
3348
- } else {
3349
- if (typeof value !== "number") throw new TypeError(`Invalid ${name}`);
3350
- target.writeUIntLE(value, 0, length);
3351
- }
3352
- }
3353
- });
3158
+ table16[i2] = a;
3159
+ table32[i2] = b;
3354
3160
  }
3355
- field("gameTitle", 0, 12, "string");
3356
- field("gameCode", 12, 4, "string");
3357
- field("makerCode", 16, 2, "string");
3358
- for (const [name, offset] of Object.entries({
3359
- unitCode: 18,
3360
- encryptionSeed: 19,
3361
- twlInternalFlags: 28,
3362
- permitsFlags: 29,
3363
- ROMversion: 30,
3364
- internalFlags: 31
3365
- }))
3366
- field(name, offset, 1, "number");
3367
- field("reserved", 21, 7);
3368
- var ntr32 = "ARM9romOffset ARM9entryAddress ARM9ramAddress ARM9size ARM7romOffset ARM7entryAddress ARM7ramAddress ARM7size FNToffset FNTsize FAToffset FATsize ARM9overlayOffset ARM9overlaySize ARM7overlayOffset ARM7overlaySize flagsRead flagsInit bannerOffset".split(
3369
- " "
3370
- );
3371
- ntr32.forEach((name, i) => field(name, 32 + i * 4, 4, "number"));
3372
- field("secureCRC16", 108, 2, "number");
3373
- field("ROMtimeout", 110, 2, "number");
3374
- field("ARM9autoload", 112, 4, "number");
3375
- field("ARM7autoload", 116, 4, "number");
3376
- field("secureDisable", 120, 8, "number");
3377
- field("ROMsize", 128, 4, "number");
3378
- field("headerSize", 132, 4, "number");
3379
- field("reserved2", 136, 56);
3380
- field("logo", 192, 156);
3381
- field("logoCRC16", 348, 2, "number");
3382
- field("headerCRC16", 350, 2, "number");
3383
- "debug_romOffset debug_size debug_ramAddress reserved3".split(" ").forEach((name, i) => field(name, 352 + i * 4, 4, "number"));
3384
- field("appflags", 444, 4, "buffer", true);
3385
- "mbk9_wramcnt_setting region_flags access_control scfg_ext_mask".split(" ").forEach((name, i) => field(name, 428 + i * 4, 4, "number", true));
3386
- var twl32 = "dsi9_rom_offset offset_0x1C4 dsi9_ram_address dsi9_size dsi7_rom_offset offset_0x1D4 dsi7_ram_address dsi7_size digest_ntr_start digest_ntr_size digest_twl_start digest_twl_size sector_hashtable_start sector_hashtable_size block_hashtable_start block_hashtable_size digest_sector_size digest_block_sectorcount banner_size offset_0x20C total_rom_size offset_0x214 offset_0x218 offset_0x21C modcrypt1_start modcrypt1_size modcrypt2_start modcrypt2_size tid_low tid_high public_sav_size private_sav_size".split(
3387
- " "
3388
- );
3389
- twl32.forEach((name, i) => field(name, 448 + i * 4, 4, "number", true));
3390
- "hmac_arm9 hmac_arm7 hmac_digest_master hmac_icon_title hmac_arm9i hmac_arm7i".split(" ").forEach((name, i) => field(name, 768 + i * 20, 20, "buffer", true));
3391
- field("hmac_arm9_no_secure", 928, 20, "buffer", true);
3392
- field("rsa_signature", 3968, 128, "buffer", true);
3161
+ var crc16 = (data, initial = 65535) => {
3162
+ let crc = initial;
3163
+ for (const byte of data) crc = crc >>> 8 ^ table16[(crc ^ byte) & 255];
3164
+ return crc;
3165
+ };
3166
+ var crc32 = (data) => {
3167
+ let crc = 4294967295;
3168
+ for (const byte of data) crc = crc >>> 8 ^ table32[(crc ^ byte) & 255];
3169
+ return (crc ^ 4294967295) >>> 0;
3170
+ };
3393
3171
 
3394
3172
  // src/nitro/banner.ts
3395
- init_buffer();
3396
3173
  var titles = [
3397
3174
  "japaneseTitle",
3398
3175
  "englishTitle",
@@ -3421,14 +3198,13 @@ var Banner = class {
3421
3198
  const data = bytes(input, "banner");
3422
3199
  this.version = range(data, offset, 2, "banner").readUInt16LE();
3423
3200
  let size = this.getDefSize(hardSize);
3424
- if (this.version >>> 8 === 1)
3425
- size = hardSize > 0 && hardSize !== 4294967295 ? Math.min(hardSize, 9152) : 9152;
3201
+ if (this.version >>> 8 === 1) size = hardSize > 0 && hardSize !== 4294967295 ? Math.min(hardSize, 9152) : 9152;
3426
3202
  this.raw = import_buffer.Buffer.from(range(data, offset, size, "banner"));
3427
3203
  this.bannerCRC = crc16(this.raw.subarray(32, 2112)) === this.raw.readUInt16LE(2);
3428
3204
  this.tileData = import_buffer.Buffer.from(this.raw.subarray(32, 544));
3429
3205
  this.palette = import_buffer.Buffer.from(this.raw.subarray(544, 576));
3430
- for (const [i, title] of titles.entries())
3431
- this[title] = i < this.titleCount ? this.raw.subarray(576 + i * 256, 832 + i * 256).toString("utf16le").split("\0")[0] : "";
3206
+ for (const [i2, title] of titles.entries())
3207
+ this[title] = i2 < this.titleCount ? this.raw.subarray(576 + i2 * 256, 832 + i2 * 256).toString("utf16le").split("\0")[0] : "";
3432
3208
  }
3433
3209
  get titleCount() {
3434
3210
  return this.version >= 3 ? 8 : this.version >= 2 ? 7 : 6;
@@ -3442,16 +3218,14 @@ var Banner = class {
3442
3218
  toBuffer() {
3443
3219
  const output = import_buffer.Buffer.from(this.raw);
3444
3220
  output.writeUInt16LE(this.version);
3445
- if (this.tileData.length !== 512 || this.palette.length !== 32)
3446
- throw new RangeError("Invalid banner icon size");
3221
+ if (this.tileData.length !== 512 || this.palette.length !== 32) throw new RangeError("Invalid banner icon size");
3447
3222
  this.tileData.copy(output, 32);
3448
3223
  this.palette.copy(output, 544);
3449
- for (let i = 0; i < this.titleCount; i++) {
3450
- const text = import_buffer.Buffer.from(this[titles[i]], "utf16le");
3451
- if (text.length > 256)
3452
- throw new RangeError(`Banner ${titles[i]} exceeds 128 UTF-16 code units`);
3453
- output.fill(0, 576 + i * 256, 832 + i * 256);
3454
- text.copy(output, 576 + i * 256);
3224
+ for (let i2 = 0; i2 < this.titleCount; i2++) {
3225
+ const text = import_buffer.Buffer.from(this[titles[i2]], "utf16le");
3226
+ if (text.length > 256) throw new RangeError(`Banner ${titles[i2]} exceeds 128 UTF-16 code units`);
3227
+ output.fill(0, 576 + i2 * 256, 832 + i2 * 256);
3228
+ text.copy(output, 576 + i2 * 256);
3455
3229
  }
3456
3230
  output.writeUInt16LE(crc16(output.subarray(32, 2112)), 2);
3457
3231
  if (this.version >= 2) output.writeUInt16LE(crc16(output.subarray(32, 2368)), 4);
@@ -3461,6 +3235,101 @@ var Banner = class {
3461
3235
  }
3462
3236
  };
3463
3237
 
3238
+ // src/nitro/crypto.ts
3239
+ init_buffer();
3240
+ var KEY1 = import_buffer.Buffer.from(
3241
+ "99D5205F5744F5B96E19A4D99E6A5A94D8AEF1EB4175E23A9382D03233EE31D5CC57619A3706A21B793972F555AEF6BE5F1B69FBE59DF1E9CE2CD9A15E3205E6FED3FECFD462040D8BF5ECB72B6079BB1295310D6E3FDA2B8884F0F13D127E254522F1BB24061A0611ADDF288B6481342BEB332999AAF2BD9C14959D9FF7F58C7297A1299DD15FCF664D071ADED34A4B85C9A7A31795053A3D490ABF0A898BA24A8249DD2790F10BE9EB1C6A83764505BA817061173F4BDEAECFAB3957F23A564811AD8A40E1453FFA9B0254CAA693FBEF4DFE6FA3D8879C08BAD5486A8D2DFD6E15F874BDBE528B18228A9EFB7437071B366C4A19BA4262B97991107B676596FE0223E8EE998C773E5C86644D6D7886A54F65E21EB2DF5A0AD07E0814B071ACBDDB831CB9D7A162CDC6637C5269C3E6BF75CE12445D2104FAFBD33C381163D4958541494609F2084311DC1F76C0156D1F3C6370EA87806CC3BD638BC2372137DCEE09232E376A4D7390F75030AC1C92041023914FD207AA683E4F9AC964606AC81421F3D62241124424CFE68A56DD0D534DE1851E8C525A9C1984C20357F16FE300BE58F64CEDD521649C1FBE55033C4ADCFFAAC9DAE05D5EBFE6DEF5D8B1F8FF36B3B9626795DB315F37ED4C70679990B518316C3D9999E442DAD3254213A0AED7706CB155CFC7D746D54361173D4428E93385D5D0A293AA25121FFBC50B46F597765645A6BE87B1946BE8B1FE3399AE1F3E6C39711D09009037E4103E7574FF8C833BB0F1B0F90105474295F1D6AC7E38E69E9574263FB4685018D04330B44C4BE368BFE54DB6958B0AA074253277CFA1F72CD871135AABEAC951E80DEEEFE9937E19A71E433881162CA148E373CC29216CD35DCEA0D9617143A01513B56492CF2A19DCADB7A59F8665F81A9FE7FBF7FDB8136C27DB6FDF351CF78D2C5B9B12AB386406CCDE31E84E751164E3FAEAEB3454C2AD3F34EB932C7D26369D56F35AE1F6B398634A9E3283E49A84607D902E130EEE934B36A285EC1638E8880602BFF0A03AEDD76A9A73E157CFF844B8DC2E2359D1DF9552719961A04BD57F6E78BAA9C530D34086329D320C9C37B7022FBA5498A9C41304C98DBEC8E75D97502E93D622590C27BC2292E0A7200F936F7F4C9FD3B5A62A0B7467497D1026CBD1C58671E78CA09CE95BB21AF601EE8C9E5E83F21ADBE6E5EA845976D27CF68DA5493648C21652BB83A374B9070C3BFF6128E161E9E4EF6E15AA4EBAE85D0596BB3256B0FB72520F0EC84225657689AFF2DE1027F0014B74A79707D5265454091F820A867D30390EB3269B0B57BB360631AFFD79FCD930102B0CB3E19BD77BDC5FEFD2F813454D4775BD46963C7E75F33EB567C59A3BB05B296BDE805BC81505B131B6CE49DDAD84B5AE60DC67313430FE4EBD802FA6BF63392186D9357F1668220554E990268C076C51A43155D70907A83E2E5366C1F8F27BC4F258CFF187C5A2E7278F308758A064622318B9887CFACEC498AEAD17CC4A5BF3E948D556D30DF2C892738CDBD72F56AC81F992694DC632F6E6C08D21E276806111BCDC6C93AF19699BD0BFB9319F0267A351EE8306227B0CAB494240B8D5017DCE5EF7555339C59946D8879FBAF764B4E39AFAA16D90681030CA8A54A79F60C319F56B0D7A5198E6984351B4D635E94FC3DF0F7BD62F5CBD3A156119F14BCBAADC6D64C9D3C61E56EF384C50718675CC0D0D4EE928F6065D701BAAD345CFA839AC95A62EB4E422D474A8375F487A04CCA54C40D828B428080D1C725241F07D47193A534E5884626B93B58A81214E0DDCB43FA2C6FCC92B40DA3804E95E5A866B0C22258568118D7C921D95554DAB8EBBDAA6E6B751B6325A0541DD052A0A5650911747CCC9E67EB5614ADB736751C833F5DA6E742E54C3370D6DAF08E8158A5FE25921CDA8DE0C065A776B5FDB18653EC850DE78E0B882B35D4E7232074FC13423BA96B7674EA4281E3462EB2D6A70E92F42C4704E5A319CF95B4728AADA716F381FB378C4926B1C9EF6359AB74D0EBFCC1829410348355D55D02BC629AF5C6074698E5E9B7CD4BD7B44647D3F925D69B61F004BD48335CF7E644E17AE8DD52E9A28124E2E2B49085CAEC64685AE41611E6F82D25137161F0BF659A49ACA5AAF0DD4338B2063F184805CCBCF08B4B9D31605BD6283319B5651989FBAB25BAAB2226B2CB5D448FA632B5F58FA61FA6409BB38E0B89D9260A80D676F0E37F50D019FC277D4FEECF1733039E07DF56198E42C2855045655DB2F6BECE55806B664806A2A1A4E5B0FD8C40A2E5219D962F53048BE8C7B4F389BA2C3AFC9D3C7C1624186B96121576F994FC1BACE7BB53B4D5E8A8B44575F135F706D5B2947DC38E2EC045565122AE81743E18EDD2AB3E294F7096E5CE6EB8AF86D89495448F52FADBFEA944BCAFC3987825F8A01F275F2E671D6D842DEF12D1D28A6887EA3A0471D30D9A371DF491CCB01F836B1F2F022585D456BBDA0BBB28842C78C28CE93E8906308907C893CF57DB7042D4F555116FD7E79E8BEC1F212D4F8B4840523A0CCD22BFDE1ABAD0DD1556C2341944D77374F05280CBF17B312676C8CC35AF741842A6DD09412272CB4ED9C4DEC478297D567B91B9DC055077EE58EE2A8E73E12E40E3A2A455534A2F92D5A1BAB527C83105F55D2F15A432BC6A7A4891595E8B44B9DF875E39F60785BD6E60D44E62106BD472253A400AD8D43138539F7AAFC38AF7BEDFCE42B5450984CFC8580F7DF3C8022E194DADE24C6B07A3938DC0FA1A7F4F96F6318578B84412A2ED453F2D9000FD0DD996E19A60AD0EC5B5824ABC0CB0665EC1A1338940A67032F3FF7E377447733C61439D0E3C0A20879BB409957410B0190CDE1CC4867DBB3AF8874F34C828F72B1B52329C4126C19FC8E46A49CC4256587D36DBE8A93110338ED832BF346A493EA3B53851DCED4F1088327EDFC9B1A18BCF98BAEDC24AB5038E9724B1022177B465DAB5964F340AEF8BBE5C8F926034E557DEBEBFEF739E6E00A11BE2E28FF98EDC0C9425642C3FD00F6AF87A25B013F329247959A72A5323DAE6BD09B07D24992E3784AFAA1067DF241CF77740414B20C86846416D5BB51A1E56FF1D1F2E2F75F58204DB857C7CFDDC5D8BE763DF65F7EE72A8B88241B383F0E412377F5F04BD40C1FFAA40B805FCF45F6E0DA2F345953FB203C52625E35B562FE8B6063E3865A151A6ED14745BC32B4EB6738ABE46E333AB5EDA3AD67E04E4195EE626271261D31EF6230AFD782ACC2DC0504F59707BF11592307C06402E897E53EAF18AC59A68B4A33901C6E7C9C207E4C3C3E6164BBC56B7C7E3E9FC54C9FEA73F5D789C04CF4FBF42DEC141B51D5C112C810DF0B4A8B9CBC93456A3E3E7DC1A9BACDC1B407E4E1688643B26D38F3FB0C5C663771DE56EF6EA0104065A798F7D0BE0EC83736EC10CA7C9CAB841E051776021C4F52AA5FC1C6A056B9D80484444DA759D8DE60E6380E058F03E13B6D8104336F300BCE69052133FB26BB897DB6AE877E5107E0ACF7960A6BF9C45C1DE44447B85EFAE3788455424B485EF77D4735861D2B430503EC8AB81E063C760C481A43A7B78AED1E13C643EE10EFDBECFB3C83B29544EFD854514E2D11441DFB36591E7A34C1C3CA570061EA67A5169B55D055E17FD936D24076AEDC01CEB07A83D5CB2098EC6BC1729234F3825737628A32360C9043AEAE5C9B788E136502FD6871C1FEB031A02482B0C3B17969A7F5D2EBD082C032DC9EC7263C6D8D98C1BB22D4D00F33EC3EB9CCE1DC6A4C7736141CF9BF819F285F71853229907548C4B34ACED8448F142FFD4057EFAA0875D946D1D66E32551FC318FE841FFC84D5FF715E1B48C386950E280827D33883717B4C8063549A56B0ACCF80CA3109EFFEF3BEAF247EA6FE533FC28D4A3368D122A666AD7BEADEB643B0A1259500A33F7546141144ECD795BC92F04FA916536297602A0F41F17124BEEE947F08CD6093B3855B07003FD80F28839AD1699FD1DA2EC39001A2B96B4E2A669DDAAEA6EA2AD3682F0C0C9CD28C4AEDE29E57659D0987A3B4C4325DC9D4322BB1E0711E644DE69071E31E40ED7DF3840EEDC87876AEC0712772BB05EA0264FBF3486BB542933FED9F1353D2F7FE2AEC1D4725DB3C9186C68EF011FD237436F7A4F59E7A7E535044D447CAD3EB386DE6D971947F4AC6694B11F452EA22FE8AB036678B59E8E6802AEB650413EEECDC9E5FB1EC056A59E69F5E596B89BFF71ACA44F95B6A718503E42962E0706F41C4CFB2B1CCE37EA607A887E77F8493DB524B6CEC7EDDD4244810699F046074E64818F3E42CB94F2E507ADFD454692B8BA7F3CEFF1FF33E26013917958489B0F04C4B82919FC44BAC9DA574AF1725C9CA32D3BC898A8489CC0DAE7CA2DB9C6A7891EEEA765D4E8760F5691567D402CFAF483607EABF6F662D068FC49AFEF9F6908775B8F7AD0F76105A3D59B02EB3C7352CCC70562BCBE33796C52F461B8A2246C788A726329861DF86228AF41C2F87A109AACCA9AED3BD00451C9A5487865287EFFF1E8FA18FC1895C351BDA2D3A2C16B2C2F156E278C16B6397C5568FC9327F2CAAAFA6A8AC20912288DEE4608BF94B42251AE37F9C2C19893A7E05D436CC6958C2C1328B2F9085EB7A3950A5A12792C566B0204F587E5583432B45E29CE4D812902C168356167903B3AD2D61181A131F37E2E19C737B80D5FD2D5187FC7BAAD71F2C7A8EAFF48DBBCD95117C720BEE6FE2B9AFDE3783DE8C8D620567B796C68D56B60DD762BAD64636BD8EC8E6EA2A6C1014FF6B5BFA823C46B1304346518A7D9B923E83795B555DB26C5ECE90628E5398C90D6DE52D57CDC58157BAE1E8B88F72E54F13DCEA9D711510B21188D509D47F5B657F2C3B384C1168508DFB9EB059BF9480894AC51A18128953D14A1029E88C1CECB6EA46C7178B251531A8A26B43B19DE2DB0B879BB011040E71D2297789820A66417F1D0B48FF72BB24FDC248A19BFE7B7FCE88DB86D9853B1CB0DCA83307BF512EE30E9A00971E06C097439DD8B645C486675F00F8889AA4529EC7AA8A8375ECC518AECEC32F1A2BF918FFAE1AF5530BB53351A7FDE8A8E1A264B622174380CC0AD8AE3BBA40D7D9924A89DF0410EE9B182B6A77698A68F4F9B9A221156EE61E3B0362309B60417E259B9E8FC5521008F8C269A1211188375E793566FF1042186EED97B66B1C4E36E56D7DB4E4BF20B9E0053A69D5B8E3D5DCE0B9AC533E07A457AD77FF4818762AAC492A8E47756D9F676330358C390539D56F643A5BADCA0BBB82529945B193363699AF13204436D8024409399285FF4A4A9787A663D7C7B5B524ED0FB46F0C585214D9A67BD379BC3858A1BD3B8406D81A06FD6BA8EA4B69280437AD8299FB0E1B85BDA85D73CDDC58750ABE636C48E74CE4302B0460B915D8DA8681758F96D48D1C5D70857C1C677BD50867A6CE4B0A6670B7E563D45B8A82EA1067CAE2F4EF17852F2A5F8A9782F86AD63410EAEBC95C3CE149F846EBDEBDF6A992F1AAA6A018B03AD30F1FF36FFF31454344D3509AF7880996C1CE76CCF22C2CBAAD82778F1884C0D2079C3690834E0BA54F433E04AB784FD6FB09012490DA6F3C3A610D7F694AEB2B3002B4DBE084A9ECD735BF377D8558CEA94EE480C7A8D3306748EB29AF2F746AB4A73F0F3F92AFF3CAACAF4BD994C043CA810D2F48A1B027D5D2EF4B0585A3DE4D93303CF0BB4A8F30274CEBE33E64ED9A2F3BF182F0BAF4CF7F40CBB0E17FBCAA57D3C974F2FA430D22D0F4774E93D785701F99BFB6DE35F130A75E71F06B012D7B64F033530A3988F36B3AA66B35D22F43CD02FDB5E9BC5BAAD8A4197E0E5D94819E6F77ADD60E749396E7C4185FADF519",
3242
+ "hex"
3243
+ );
3244
+ var aes128CtrCrypt = (key2, counter, data) => {
3245
+ if (key2.length !== 16 || counter.length !== 16) throw new RangeError("AES key and counter must have 16 bytes");
3246
+ const ctr = import_buffer.Buffer.from(counter).reverse();
3247
+ const aes = createAesBlockCipher(import_buffer.Buffer.from(key2).reverse());
3248
+ const output = import_buffer.Buffer.alloc(data.length);
3249
+ for (let p = 0; p < data.length; p += 16) {
3250
+ const mask = aes(ctr);
3251
+ for (let j = 0; j < 16 && p + j < data.length; j++) output[p + j] = data[p + j] ^ mask[15 - j];
3252
+ for (let j = 15; j >= 0; j--) {
3253
+ ctr[j] = ctr[j] + 1 & 255;
3254
+ if (ctr[j]) break;
3255
+ }
3256
+ }
3257
+ return output;
3258
+ };
3259
+ var modcryptKey = (header) => {
3260
+ if (typeof header.gameCode !== "string" || header.gameCode.length !== 4)
3261
+ throw new Error("Expected four-character game code");
3262
+ if (header.twlInternalFlags & 4 || (header.appflags?.[3] ?? 0) & 128) {
3263
+ const key2 = import_buffer.Buffer.alloc(16);
3264
+ key2.write(header.gameTitle, 0, 12, "ascii");
3265
+ key2.write(header.gameCode, 12, 4, "ascii");
3266
+ return key2;
3267
+ }
3268
+ if (!header.hmac_arm9i || header.hmac_arm9i.length < 16) throw new Error("Missing ARM9i HMAC for modcrypt key");
3269
+ const x2 = import_buffer.Buffer.from(`Nintendo${header.gameCode}${[...header.gameCode].reverse().join("")}`, "ascii");
3270
+ for (let i2 = 0; i2 < 16; i2++) x2[i2] ^= header.hmac_arm9i[i2];
3271
+ const mask = (1n << 128n) - 1n;
3272
+ let v = x2.readBigUInt64LE(0) | x2.readBigUInt64LE(8) << 64n;
3273
+ v = v + 0xfffefb4e295902582a680f5f1a4f3e79n & mask;
3274
+ v = (v << 42n | v >> 86n) & mask;
3275
+ const out = import_buffer.Buffer.alloc(16);
3276
+ out.writeBigUInt64LE(v & (1n << 64n) - 1n);
3277
+ out.writeBigUInt64LE(v >> 64n, 8);
3278
+ return out;
3279
+ };
3280
+ var encryptSecureArea = (gameCode, input) => {
3281
+ if (typeof gameCode !== "string" || gameCode.length !== 4) throw new Error("Expected four-character game code");
3282
+ if (input.length < 2048) throw new RangeError("Secure area must contain at least 0x800 bytes");
3283
+ const output = import_buffer.Buffer.from(input);
3284
+ let magic = new Uint32Array(1042);
3285
+ let args = [0, 0, 0];
3286
+ function encrypt2(a2, b2) {
3287
+ for (let i2 = 0; i2 < 16; i2++) {
3288
+ const c = (magic[i2] ^ a2) >>> 0;
3289
+ const sum = magic[18 + (c >>> 24)] + magic[274 + (c >>> 16 & 255)] >>> 0;
3290
+ const f = magic[786 + (c & 255)] + (magic[530 + (c >>> 8 & 255)] ^ sum) >>> 0;
3291
+ a2 = (b2 ^ f) >>> 0;
3292
+ b2 = c;
3293
+ }
3294
+ return [(b2 ^ magic[17]) >>> 0, (a2 ^ magic[16]) >>> 0];
3295
+ }
3296
+ function init2() {
3297
+ [args[2], args[1]] = encrypt2(args[2], args[1]);
3298
+ [args[1], args[0]] = encrypt2(args[1], args[0]);
3299
+ const key2 = import_buffer.Buffer.alloc(12);
3300
+ args.forEach((v, i2) => key2.writeUInt32LE(v, i2 * 4));
3301
+ for (let j = 0; j < 18; j++) magic[j] ^= key2.readUInt32BE(j * 4 & 7);
3302
+ let a2 = 0, b2 = 0;
3303
+ for (let i2 = 0; i2 < 1042; i2 += 2) {
3304
+ [a2, b2] = encrypt2(a2, b2);
3305
+ magic[i2] = a2;
3306
+ magic[i2 + 1] = b2;
3307
+ }
3308
+ }
3309
+ function init1() {
3310
+ magic = Uint32Array.from({ length: 1042 }, (_, i2) => KEY1.readUInt32LE(i2 * 4));
3311
+ const code = import_buffer.Buffer.from(gameCode, "ascii").readUInt32LE();
3312
+ args = [code, code >>> 1, code << 1 >>> 0];
3313
+ init2();
3314
+ init2();
3315
+ }
3316
+ init1();
3317
+ args[1] = args[1] << 1 >>> 0;
3318
+ args[2] >>>= 1;
3319
+ init2();
3320
+ for (let p = 8; p < 2048; p += 8) {
3321
+ const [b2, a2] = encrypt2(output.readUInt32LE(p + 4), output.readUInt32LE(p));
3322
+ output.writeUInt32LE(a2, p);
3323
+ output.writeUInt32LE(b2, p + 4);
3324
+ }
3325
+ let [b, a] = encrypt2(1784827769, 1919118949);
3326
+ init1();
3327
+ [b, a] = encrypt2(b, a);
3328
+ output.writeUInt32LE(a, 0);
3329
+ output.writeUInt32LE(b, 4);
3330
+ return output;
3331
+ };
3332
+
3464
3333
  // src/nitro/filesystem.ts
3465
3334
  init_buffer();
3466
3335
  var FileAllocationTable = class {
@@ -3491,8 +3360,7 @@ var FileNameTable = class _FileNameTable {
3491
3360
  const visited = /* @__PURE__ */ new Set();
3492
3361
  const fileIds = /* @__PURE__ */ new Set();
3493
3362
  const parse = (index, name, depth) => {
3494
- if (depth > 256 || index >= count || visited.has(index))
3495
- throw new Error("Invalid FNT directory tree or cycle");
3363
+ if (depth > 256 || index >= count || visited.has(index)) throw new Error("Invalid FNT directory tree or cycle");
3496
3364
  visited.add(index);
3497
3365
  let cursor = table2.readUInt32LE(index * 8);
3498
3366
  let fileId = table2.readUInt16LE(index * 8 + 4);
@@ -3572,6 +3440,7 @@ var OverlayTable = class {
3572
3440
  });
3573
3441
  }
3574
3442
  }
3443
+ isArm9;
3575
3444
  entries = [];
3576
3445
  readBasicOverlays(fat) {
3577
3446
  return this.entries.map((item) => {
@@ -3586,12 +3455,137 @@ var OverlayTable = class {
3586
3455
  toBuffer() {
3587
3456
  const data = import_buffer.Buffer.alloc(this.entries.length * 32);
3588
3457
  this.entries.forEach(
3589
- (entry, i) => overlayFields.forEach((field2, j) => data.writeUInt32LE(entry[field2], i * 32 + j * 4))
3458
+ (entry, i2) => overlayFields.forEach((field2, j) => data.writeUInt32LE(entry[field2], i2 * 32 + j * 4))
3590
3459
  );
3591
3460
  return data;
3592
3461
  }
3593
3462
  };
3594
3463
 
3464
+ // src/nitro/header.ts
3465
+ init_buffer();
3466
+ var UnitCode = Object.freeze({ NDS: 0, NDS_DSi: 2, DSi: 3 });
3467
+ var Header = class {
3468
+ raw;
3469
+ trimmedRom;
3470
+ doublePadding;
3471
+ nitrocode;
3472
+ decrypted;
3473
+ headerCRC;
3474
+ logoCRC;
3475
+ secureCRC;
3476
+ dlp_signature;
3477
+ constructor(input) {
3478
+ const data = bytes(input, "header");
3479
+ range(data, 0, 368, "header");
3480
+ const size = data.readUInt32LE(132);
3481
+ if (size < 368 || size > data.length) throw new RangeError(`Invalid header size: ${size}`);
3482
+ this.raw = import_buffer.Buffer.from(data.subarray(0, size));
3483
+ if (this.unitCode & 2 && size > 512) range(this.raw, 0, 4096, "DSi header");
3484
+ this.trimmedRom = this.total_rom_size ? this.total_rom_size >= data.length : data.length !== this.size;
3485
+ this.doublePadding = this.ARM9size % 1024 < 512 && this.ARM7romOffset % 1024 === 0 && this.ARM9overlayOffset % 1024 === 0 || this.ARM7size % 1024 < 512 && this.FNToffset % 1024 === 0 && this.ARM7overlayOffset % 1024 === 0 || this.FNTsize % 1024 < 512 && this.FAToffset % 1024 === 0 || this.FATsize % 1024 < 512 && this.bannerOffset % 1024 === 0;
3486
+ const nitroOffset = this.ARM9romOffset + this.ARM9size;
3487
+ this.nitrocode = nitroOffset >= size && nitroOffset + 4 <= data.length && data.readUInt32LE(nitroOffset) === 3737126433;
3488
+ this.decrypted = data.length >= 16392 && data.readBigUInt64LE(16384) === 0xe7ffdeffe7ffdeffn;
3489
+ this.headerCRC = crc16(this.raw.subarray(0, 350)) === this.headerCRC16;
3490
+ this.logoCRC = crc16(this.logo) === this.logoCRC16;
3491
+ const secure = data.subarray(16384, 32768);
3492
+ this.secureCRC = secure.length > 0 && crc16(this.decrypted ? encryptSecureArea(this.gameCode, secure) : secure) === this.secureCRC16;
3493
+ this.dlp_signature = import_buffer.Buffer.alloc(0);
3494
+ if (this.ROMsize >= size && this.ROMsize + 136 <= data.length && data.readUInt32LE(this.ROMsize) === 90977) {
3495
+ this.dlp_signature = import_buffer.Buffer.from(data.subarray(this.ROMsize, this.ROMsize + 136));
3496
+ }
3497
+ }
3498
+ get size() {
3499
+ return 2 ** (17 + this.raw[20]);
3500
+ }
3501
+ set size(value) {
3502
+ const power = Math.log2(value);
3503
+ if (!Number.isInteger(power) || power < 17 || power > 32)
3504
+ throw new RangeError("ROM capacity must be a power of two from 128 KiB to 4 GiB");
3505
+ this.raw[20] = power - 17;
3506
+ }
3507
+ toBuffer() {
3508
+ const data = import_buffer.Buffer.from(this.raw);
3509
+ data.writeUInt16LE(crc16(data.subarray(192, 348)), 348);
3510
+ data.writeUInt16LE(crc16(data.subarray(0, 350)), 350);
3511
+ return data;
3512
+ }
3513
+ toString() {
3514
+ return `NDS header: ${this.gameTitle.replace(/\0+$/, "")} (${this.gameCode})`;
3515
+ }
3516
+ };
3517
+ function field(name, offset, length, type = "buffer", dsi = false) {
3518
+ Object.defineProperty(Header.prototype, name, {
3519
+ enumerable: true,
3520
+ get() {
3521
+ if (dsi && (!(this.unitCode & 2) || this.raw.length <= 512))
3522
+ return type === "buffer" ? import_buffer.Buffer.alloc(length) : 0;
3523
+ const data = range(this.raw, offset, length, `header ${name}`);
3524
+ if (type === "string") return data.toString("latin1");
3525
+ if (type === "buffer") return data;
3526
+ return length === 8 ? data.readBigUInt64LE() : data.readUIntLE(0, length);
3527
+ },
3528
+ set(value) {
3529
+ const target = range(this.raw, offset, length, `header ${name}`);
3530
+ if (type === "string") {
3531
+ if (typeof value !== "string" || import_buffer.Buffer.byteLength(value, "latin1") > length)
3532
+ throw new TypeError(`Invalid ${name}`);
3533
+ target.fill(0);
3534
+ target.write(value, "latin1");
3535
+ } else if (type === "buffer") {
3536
+ if (!(value instanceof Uint8Array)) throw new TypeError(`Invalid ${name}`);
3537
+ const source = bytes(value, name);
3538
+ if (source.length !== length) throw new RangeError(`${name} must contain ${length} bytes`);
3539
+ source.copy(target);
3540
+ } else if (length === 8) {
3541
+ if (typeof value !== "bigint") throw new TypeError(`Invalid ${name}`);
3542
+ target.writeBigUInt64LE(value);
3543
+ } else {
3544
+ if (typeof value !== "number") throw new TypeError(`Invalid ${name}`);
3545
+ target.writeUIntLE(value, 0, length);
3546
+ }
3547
+ }
3548
+ });
3549
+ }
3550
+ field("gameTitle", 0, 12, "string");
3551
+ field("gameCode", 12, 4, "string");
3552
+ field("makerCode", 16, 2, "string");
3553
+ for (const [name, offset] of Object.entries({
3554
+ unitCode: 18,
3555
+ encryptionSeed: 19,
3556
+ twlInternalFlags: 28,
3557
+ permitsFlags: 29,
3558
+ ROMversion: 30,
3559
+ internalFlags: 31
3560
+ }))
3561
+ field(name, offset, 1, "number");
3562
+ field("reserved", 21, 7);
3563
+ var ntr32 = "ARM9romOffset ARM9entryAddress ARM9ramAddress ARM9size ARM7romOffset ARM7entryAddress ARM7ramAddress ARM7size FNToffset FNTsize FAToffset FATsize ARM9overlayOffset ARM9overlaySize ARM7overlayOffset ARM7overlaySize flagsRead flagsInit bannerOffset".split(
3564
+ " "
3565
+ );
3566
+ ntr32.forEach((name, i2) => field(name, 32 + i2 * 4, 4, "number"));
3567
+ field("secureCRC16", 108, 2, "number");
3568
+ field("ROMtimeout", 110, 2, "number");
3569
+ field("ARM9autoload", 112, 4, "number");
3570
+ field("ARM7autoload", 116, 4, "number");
3571
+ field("secureDisable", 120, 8, "number");
3572
+ field("ROMsize", 128, 4, "number");
3573
+ field("headerSize", 132, 4, "number");
3574
+ field("reserved2", 136, 56);
3575
+ field("logo", 192, 156);
3576
+ field("logoCRC16", 348, 2, "number");
3577
+ field("headerCRC16", 350, 2, "number");
3578
+ "debug_romOffset debug_size debug_ramAddress reserved3".split(" ").forEach((name, i2) => field(name, 352 + i2 * 4, 4, "number"));
3579
+ field("appflags", 444, 4, "buffer", true);
3580
+ "mbk9_wramcnt_setting region_flags access_control scfg_ext_mask".split(" ").forEach((name, i2) => field(name, 428 + i2 * 4, 4, "number", true));
3581
+ var twl32 = "dsi9_rom_offset offset_0x1C4 dsi9_ram_address dsi9_size dsi7_rom_offset offset_0x1D4 dsi7_ram_address dsi7_size digest_ntr_start digest_ntr_size digest_twl_start digest_twl_size sector_hashtable_start sector_hashtable_size block_hashtable_start block_hashtable_size digest_sector_size digest_block_sectorcount banner_size offset_0x20C total_rom_size offset_0x214 offset_0x218 offset_0x21C modcrypt1_start modcrypt1_size modcrypt2_start modcrypt2_size tid_low tid_high public_sav_size private_sav_size".split(
3582
+ " "
3583
+ );
3584
+ twl32.forEach((name, i2) => field(name, 448 + i2 * 4, 4, "number", true));
3585
+ "hmac_arm9 hmac_arm7 hmac_digest_master hmac_icon_title hmac_arm9i hmac_arm7i".split(" ").forEach((name, i2) => field(name, 768 + i2 * 20, 20, "buffer", true));
3586
+ field("hmac_arm9_no_secure", 928, 20, "buffer", true);
3587
+ field("rsa_signature", 3968, 128, "buffer", true);
3588
+
3595
3589
  // src/nitro/twl.ts
3596
3590
  init_buffer();
3597
3591
 
@@ -3617,8 +3611,7 @@ var decompressBLZ = (input, maxSize = 268435456) => {
3617
3611
  if (src - 2 < prefix) throw new Error("Truncated BLZ reference");
3618
3612
  const high = input[--src], low = input[--src];
3619
3613
  const count = (high >>> 4) + 3, offset = ((high & 15) << 8 | low) + 3;
3620
- if (dst - count < prefix || dst - 1 + offset >= size)
3621
- throw new Error("Invalid BLZ reference");
3614
+ if (dst - count < prefix || dst - 1 + offset >= size) throw new Error("Invalid BLZ reference");
3622
3615
  for (let j = 0; j < count; j++) {
3623
3616
  --dst;
3624
3617
  out[dst] = out[dst + offset];
@@ -3712,10 +3705,7 @@ var decompressArm9 = (data, header) => {
3712
3705
  const compressed = ptr > header.ARM9ramAddress && ptr + nitro >= header.ARM9ramAddress + data.length;
3713
3706
  return {
3714
3707
  compressed,
3715
- data: compressed ? import_buffer.Buffer.concat([
3716
- decompressBLZ(data.subarray(0, data.length - nitro)),
3717
- data.subarray(data.length - nitro)
3718
- ]) : import_buffer.Buffer.from(data)
3708
+ data: compressed ? import_buffer.Buffer.concat([decompressBLZ(data.subarray(0, data.length - nitro)), data.subarray(data.length - nitro)]) : import_buffer.Buffer.from(data)
3719
3709
  };
3720
3710
  };
3721
3711
  var compressArm9 = (data, header, postSize = 0) => {
@@ -3765,8 +3755,7 @@ function validate(h) {
3765
3755
  }
3766
3756
  }
3767
3757
  const s = h.digest_sector_size;
3768
- if (!Number.isSafeInteger(s) || s <= 0 || s > 16384 || 16384 % s)
3769
- throw new Error("Invalid TWL digest sector size");
3758
+ if (!Number.isSafeInteger(s) || s <= 0 || s > 16384 || 16384 % s) throw new Error("Invalid TWL digest sector size");
3770
3759
  if (!Number.isSafeInteger(h.digest_block_sectorcount) || h.digest_block_sectorcount <= 0 || h.digest_block_sectorcount > 1048576)
3771
3760
  throw new Error("Invalid TWL digest block sector count");
3772
3761
  if (h.digest_ntr_size < 16384 || h.digest_ntr_size % s || h.digest_twl_size % s)
@@ -3796,45 +3785,25 @@ var TWL = class {
3796
3785
  this.Hashtable2Data = import_buffer.Buffer.from(
3797
3786
  slice(original, h.block_hashtable_start, h.block_hashtable_size, "Block hash table")
3798
3787
  );
3799
- this.DSi9Data = import_buffer.Buffer.from(
3800
- slice(original, h.dsi9_rom_offset, Math.max(h.modcrypt1_size, h.dsi9_size), "ARM9i")
3801
- );
3802
- this.DSi7Data = import_buffer.Buffer.from(
3803
- slice(original, h.dsi7_rom_offset, Math.max(h.modcrypt2_size, h.dsi7_size), "ARM7i")
3804
- );
3788
+ this.DSi9Data = import_buffer.Buffer.from(slice(original, h.dsi9_rom_offset, Math.max(h.modcrypt1_size, h.dsi9_size), "ARM9i"));
3789
+ this.DSi7Data = import_buffer.Buffer.from(slice(original, h.dsi7_rom_offset, Math.max(h.modcrypt2_size, h.dsi7_size), "ARM7i"));
3805
3790
  this.Header2Data = h.trimmedRom ? null : Array.from(
3806
3791
  { length: 3 },
3807
- (_, i) => import_buffer.Buffer.from(
3808
- slice(original, h.digest_twl_start - 12288 + 4096 * i, 4096, "Secondary header")
3809
- )
3810
- );
3811
- this.Overlays9Sha1Hmac = overlays.map(
3812
- (o) => hash(slice(original, o.offset, o.size, "ARM9 overlay"))
3792
+ (_, i2) => import_buffer.Buffer.from(slice(original, h.digest_twl_start - 12288 + 4096 * i2, 4096, "Secondary header"))
3813
3793
  );
3794
+ this.Overlays9Sha1Hmac = overlays.map((o) => hash(slice(original, o.offset, o.size, "ARM9 overlay")));
3814
3795
  let encrypted = false;
3815
3796
  const modcryptStart = [
3816
3797
  { start: h.modcrypt1_start, size: h.modcrypt1_size },
3817
3798
  { start: h.modcrypt2_start, size: h.modcrypt2_size }
3818
- ].find(
3819
- ({ start, size }) => size > 0 && start >= h.digest_twl_start && start < 4294967295
3820
- )?.start;
3799
+ ].find(({ start, size }) => size > 0 && start >= h.digest_twl_start && start < 4294967295)?.start;
3821
3800
  if (modcryptStart !== void 0) {
3822
3801
  const index = Math.floor((modcryptStart - h.digest_twl_start) / h.digest_sector_size);
3823
3802
  const actual = hash(
3824
- slice(
3825
- original,
3826
- h.digest_twl_start + index * h.digest_sector_size,
3827
- h.digest_sector_size,
3828
- "Modcrypt sector"
3829
- )
3803
+ slice(original, h.digest_twl_start + index * h.digest_sector_size, h.digest_sector_size, "Modcrypt sector")
3830
3804
  );
3831
3805
  encrypted = !actual.equals(
3832
- slice(
3833
- this.Hashtable1Data,
3834
- this.firstDSiHashOffset + index * 20,
3835
- 20,
3836
- "Modcrypt sector hash"
3837
- )
3806
+ slice(this.Hashtable1Data, this.firstDSiHashOffset + index * 20, 20, "Modcrypt sector hash")
3838
3807
  );
3839
3808
  }
3840
3809
  if (encrypted) this.cryptSections(h);
@@ -3878,7 +3847,7 @@ var TWL = class {
3878
3847
  if (overlays.length !== this.Overlays9Sha1Hmac.length)
3879
3848
  throw new Error("Changing ARM9 overlay count is unsupported");
3880
3849
  const hashes = overlays.map(hash);
3881
- if (hashes.every((h, i) => h.equals(this.Overlays9Sha1Hmac[i]))) return import_buffer.Buffer.from(arm9Data);
3850
+ if (hashes.every((h, i2) => h.equals(this.Overlays9Sha1Hmac[i2]))) return import_buffer.Buffer.from(arm9Data);
3882
3851
  const init = header.reserved2.readUInt32LE(0) & 16383;
3883
3852
  const hdrptr = arm9Data.readUInt32LE(init + 20) - header.ARM9ramAddress;
3884
3853
  const unpacked = decompressArm9(arm9Data, header);
@@ -3890,9 +3859,8 @@ var TWL = class {
3890
3859
  break;
3891
3860
  }
3892
3861
  }
3893
- if (found < 0)
3894
- throw new Error("ARM9 overlay hashes changed but original hash table was not found");
3895
- hashes.forEach((h, i) => h.copy(unpacked.data, found + i * 20));
3862
+ if (found < 0) throw new Error("ARM9 overlay hashes changed but original hash table was not found");
3863
+ hashes.forEach((h, i2) => h.copy(unpacked.data, found + i2 * 20));
3896
3864
  return unpacked.compressed ? compressArm9(unpacked.data, header, arm9Data.length - hdrptr) : unpacked.data;
3897
3865
  }
3898
3866
  writeTo(writer, h) {
@@ -3930,8 +3898,7 @@ var TWL = class {
3930
3898
  writer.position = h.sector_hashtable_start + index++ * 20;
3931
3899
  writer.write(hash(b));
3932
3900
  };
3933
- for (let p = 0; p < 16384; p += h.digest_sector_size)
3934
- put(secure.subarray(p, p + h.digest_sector_size));
3901
+ for (let p = 0; p < 16384; p += h.digest_sector_size) put(secure.subarray(p, p + h.digest_sector_size));
3935
3902
  for (let p = h.digest_ntr_start + 16384; p < h.digest_ntr_start + h.digest_ntr_size; p += h.digest_sector_size)
3936
3903
  put(read(p, h.digest_sector_size));
3937
3904
  for (let p = h.digest_twl_start; p < h.digest_twl_start + h.digest_twl_size; p += h.digest_sector_size)
@@ -3975,18 +3942,8 @@ var NDSFile = class _NDSFile {
3975
3942
  this.fatTable = new FileAllocationTable(this.original, h.FAToffset, h.FATsize);
3976
3943
  this.fntTable = new FileNameTable(this.fatTable, this.original, h.FNToffset, h.FNTsize);
3977
3944
  this.root = this.fntTable.root;
3978
- this.overlay9Table = new OverlayTable(
3979
- this.original,
3980
- h.ARM9overlayOffset,
3981
- h.ARM9overlaySize,
3982
- true
3983
- );
3984
- this.overlay7Table = new OverlayTable(
3985
- this.original,
3986
- h.ARM7overlayOffset,
3987
- h.ARM7overlaySize,
3988
- false
3989
- );
3945
+ this.overlay9Table = new OverlayTable(this.original, h.ARM9overlayOffset, h.ARM9overlaySize, true);
3946
+ this.overlay7Table = new OverlayTable(this.original, h.ARM7overlayOffset, h.ARM7overlaySize, false);
3990
3947
  const arm9Overlays = this.overlay9Table.readBasicOverlays(this.fatTable);
3991
3948
  this.root.folders.push({
3992
3949
  name: "overlay",
@@ -4012,7 +3969,7 @@ var NDSFile = class _NDSFile {
4012
3969
  if (this.paths.has(key(path))) throw new Error(`Duplicate ROM path: ${path}`);
4013
3970
  this.paths.set(key(path), { path, file });
4014
3971
  }
4015
- for (const child of folder.folders) visit(child, prefix + child.name + "/");
3972
+ for (const child of folder.folders) visit(child, `${prefix + child.name}/`);
4016
3973
  };
4017
3974
  visit(this.root, "");
4018
3975
  if (h.unitCode & 2 && h.twlInternalFlags & 1 && h.tid_high && h.tid_high !== 4294967295) {
@@ -4057,15 +4014,8 @@ var NDSFile = class _NDSFile {
4057
4014
  toBuffer() {
4058
4015
  const fntReplacement = this.root.files.find((file) => file.name === "fnt.bin")?.replacement;
4059
4016
  if (fntReplacement) {
4060
- const replacementTree = new FileNameTable(
4061
- this.fatTable,
4062
- fntReplacement,
4063
- 0,
4064
- fntReplacement.length
4065
- );
4066
- const collect = (folder) => [...folder.files.map((file) => file.id), ...folder.folders.flatMap(collect)].sort(
4067
- (a, b) => a - b
4068
- );
4017
+ const replacementTree = new FileNameTable(this.fatTable, fntReplacement, 0, fntReplacement.length);
4018
+ const collect = (folder) => [...folder.files.map((file) => file.id), ...folder.folders.flatMap(collect)].sort((a, b) => a - b);
4069
4019
  if (collect(replacementTree.root).join(",") !== collect(this.data).join(","))
4070
4020
  throw new Error("Replacement FNT must preserve existing file IDs");
4071
4021
  }
@@ -4110,8 +4060,7 @@ var NDSFile = class _NDSFile {
4110
4060
  item.reserved = (item.reserved & 4278190080 | size & 16777215) >>> 0;
4111
4061
  overlayIds.add(file.id);
4112
4062
  }
4113
- if (table2.entries.length !== files.length)
4114
- throw new Error("Changing overlay file count is unsupported");
4063
+ if (table2.entries.length !== files.length) throw new Error("Changing overlay file count is unsupported");
4115
4064
  const encoded = table2.toBuffer();
4116
4065
  if (arm92) {
4117
4066
  h.ARM9overlayOffset = writer.position;
@@ -4195,158 +4144,10 @@ var NDSFile = class _NDSFile {
4195
4144
  // src/nitro-patch-helper.ts
4196
4145
  init_buffer();
4197
4146
 
4198
- // src/patch/zip.ts
4199
- init_buffer();
4200
- var fail = (message) => {
4201
- throw new Error(`ZIP: ${message}`);
4202
- };
4203
- var utf8 = new TextDecoder("utf-8", { fatal: true });
4204
- var cp437 = "\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0\xA0";
4205
- function decodeUtf8(bytes2) {
4206
- try {
4207
- return utf8.decode(bytes2);
4208
- } catch {
4209
- return fail("invalid UTF-8 filename");
4210
- }
4211
- }
4212
- function boundOption(value, fallback, label) {
4213
- value ??= fallback;
4214
- if (!Number.isSafeInteger(value) || value < 0)
4215
- throw new RangeError(`${label} must be a non-negative safe integer`);
4216
- return value;
4217
- }
4218
- function checkRange(bytes2, offset, length, end = bytes2.length) {
4219
- if (offset < 0 || offset > end || length > end - offset)
4220
- fail(`truncated or out-of-bounds record at ${offset} (length ${length})`);
4221
- }
4222
- function extras(bytes2) {
4223
- const fields = /* @__PURE__ */ new Map();
4224
- let offset = 0;
4225
- while (offset < bytes2.length) {
4226
- checkRange(bytes2, offset, 4);
4227
- const id = bytes2.readUInt16LE(offset), length = bytes2.readUInt16LE(offset + 2);
4228
- offset += 4;
4229
- checkRange(bytes2, offset, length);
4230
- if (id === 1) fail("ZIP64 archives are unsupported");
4231
- fields.set(id, bytes2.subarray(offset, offset + length));
4232
- offset += length;
4233
- }
4234
- return fields;
4235
- }
4236
- function filename(raw, flags, fields) {
4237
- if (flags & 2048) return decodeUtf8(raw);
4238
- const unicode = fields.get(28789);
4239
- if (unicode && unicode.length >= 5 && unicode[0] === 1 && unicode.readUInt32LE(1) === crc32(raw))
4240
- return decodeUtf8(unicode.subarray(5));
4241
- let result = "";
4242
- for (const byte of raw) result += byte < 128 ? String.fromCharCode(byte) : cp437[byte - 128];
4243
- return result;
4244
- }
4245
- var readZip = (input, options = {}) => {
4246
- if (!(input instanceof Uint8Array))
4247
- throw new TypeError("ZIP input must be a Buffer or Uint8Array");
4248
- const bytes2 = import_buffer.Buffer.from(input.buffer, input.byteOffset, input.byteLength);
4249
- const maxSize = boundOption(
4250
- options.maxUncompressedSize,
4251
- 1024 * 1024 * 1024,
4252
- "maxUncompressedSize"
4253
- );
4254
- const maxEntries = boundOption(options.maxEntries, 1e5, "maxEntries");
4255
- let eocd = -1;
4256
- for (let offset2 = bytes2.length - 22; offset2 >= Math.max(0, bytes2.length - 65557); offset2--) {
4257
- if (bytes2.readUInt32LE(offset2) === 101010256 && offset2 + 22 + bytes2.readUInt16LE(offset2 + 20) === bytes2.length) {
4258
- eocd = offset2;
4259
- break;
4260
- }
4261
- }
4262
- if (eocd < 0) fail("end of central directory not found or truncated");
4263
- const disk = bytes2.readUInt16LE(eocd + 4), centralDisk = bytes2.readUInt16LE(eocd + 6);
4264
- const diskEntries = bytes2.readUInt16LE(eocd + 8), count = bytes2.readUInt16LE(eocd + 10);
4265
- const centralSize = bytes2.readUInt32LE(eocd + 12), centralOffset = bytes2.readUInt32LE(eocd + 16);
4266
- if (count === 65535 || diskEntries === 65535 || centralSize === 4294967295 || centralOffset === 4294967295 || eocd >= 20 && bytes2.readUInt32LE(eocd - 20) === 117853008)
4267
- fail("ZIP64 archives are unsupported");
4268
- if (disk || centralDisk || diskEntries !== count)
4269
- fail("split or multiple-disk archives are unsupported");
4270
- if (count > maxEntries) fail(`entry count exceeds limit ${maxEntries}`);
4271
- checkRange(bytes2, centralOffset, centralSize, eocd);
4272
- if (centralOffset + centralSize !== eocd) fail("central directory size/offset mismatch");
4273
- if (count > Math.floor(centralSize / 46)) fail("entry count exceeds central directory size");
4274
- const result = /* @__PURE__ */ new Map();
4275
- const ranges = [];
4276
- let offset = centralOffset, totalSize = 0;
4277
- for (let index = 0; index < count; index++) {
4278
- checkRange(bytes2, offset, 46, eocd);
4279
- if (bytes2.readUInt32LE(offset) !== 33639248) fail("invalid central directory signature");
4280
- const flags = bytes2.readUInt16LE(offset + 8), method = bytes2.readUInt16LE(offset + 10);
4281
- const checksum = bytes2.readUInt32LE(offset + 16), compressedSize = bytes2.readUInt32LE(offset + 20), size = bytes2.readUInt32LE(offset + 24);
4282
- const nameLength = bytes2.readUInt16LE(offset + 28), extraLength = bytes2.readUInt16LE(offset + 30), commentLength = bytes2.readUInt16LE(offset + 32);
4283
- const startDisk = bytes2.readUInt16LE(offset + 34), localOffset = bytes2.readUInt32LE(offset + 42);
4284
- if (size === 4294967295 || compressedSize === 4294967295 || localOffset === 4294967295 || startDisk === 65535)
4285
- fail("ZIP64 entry is unsupported");
4286
- if (startDisk) fail("split or multiple-disk entry is unsupported");
4287
- if (flags & 8257) fail("encrypted entries are unsupported");
4288
- if (flags & ~2062) fail("unsupported general purpose flags");
4289
- if (method !== 0 && method !== 8) fail(`unsupported compression method ${method}`);
4290
- if (size > maxSize - totalSize) fail(`uncompressed size exceeds limit ${maxSize}`);
4291
- totalSize += size;
4292
- checkRange(bytes2, offset + 46, nameLength + extraLength + commentLength, eocd);
4293
- const rawName = bytes2.subarray(offset + 46, offset + 46 + nameLength);
4294
- const fields = extras(
4295
- bytes2.subarray(offset + 46 + nameLength, offset + 46 + nameLength + extraLength)
4296
- );
4297
- const name = filename(rawName, flags, fields).replaceAll("\\", "/").toLowerCase();
4298
- offset += 46 + nameLength + extraLength + commentLength;
4299
- checkRange(bytes2, localOffset, 30, centralOffset);
4300
- if (bytes2.readUInt32LE(localOffset) !== 67324752) fail("invalid local header signature");
4301
- if (bytes2.readUInt16LE(localOffset + 6) !== flags || bytes2.readUInt16LE(localOffset + 8) !== method)
4302
- fail("local header flags/compression method mismatch");
4303
- const localNameLength = bytes2.readUInt16LE(localOffset + 26), localExtraLength = bytes2.readUInt16LE(localOffset + 28);
4304
- const dataOffset = localOffset + 30 + localNameLength + localExtraLength;
4305
- checkRange(bytes2, localOffset + 30, localNameLength + localExtraLength, centralOffset);
4306
- if (!rawName.equals(bytes2.subarray(localOffset + 30, localOffset + 30 + localNameLength)))
4307
- fail("local filename differs from central directory");
4308
- extras(bytes2.subarray(localOffset + 30 + localNameLength, dataOffset));
4309
- if (!(flags & 8) && (bytes2.readUInt32LE(localOffset + 14) !== checksum || bytes2.readUInt32LE(localOffset + 18) !== compressedSize || bytes2.readUInt32LE(localOffset + 22) !== size))
4310
- fail("local header CRC/size mismatch");
4311
- checkRange(bytes2, dataOffset, compressedSize, centralOffset);
4312
- let dataEnd = dataOffset + compressedSize;
4313
- if (flags & 8) {
4314
- checkRange(bytes2, dataEnd, 12, centralOffset);
4315
- const matches = (at) => at + 12 <= centralOffset && bytes2.readUInt32LE(at) === checksum && bytes2.readUInt32LE(at + 4) === compressedSize && bytes2.readUInt32LE(at + 8) === size;
4316
- if (matches(dataEnd)) dataEnd += 12;
4317
- else if (bytes2.readUInt32LE(dataEnd) === 134695760 && matches(dataEnd + 4)) dataEnd += 16;
4318
- else fail("data descriptor CRC/size mismatch");
4319
- }
4320
- ranges.push({ start: localOffset, end: dataEnd });
4321
- const compressed = bytes2.subarray(dataOffset, dataOffset + compressedSize);
4322
- let data;
4323
- if (method === 0) {
4324
- if (compressedSize !== size) fail("stored entry compressed/uncompressed size mismatch");
4325
- data = import_buffer.Buffer.from(compressed);
4326
- } else {
4327
- try {
4328
- data = inflateRawSync(compressed, { maxOutputLength: Math.max(1, size) });
4329
- } catch (error) {
4330
- return fail(
4331
- `cannot inflate entry ${JSON.stringify(name)} within declared size: ${error instanceof Error ? error.message : String(error)}`
4332
- );
4333
- }
4334
- }
4335
- if (data.length !== size) fail(`uncompressed size mismatch for ${JSON.stringify(name)}`);
4336
- if (crc32(data) !== checksum) fail(`CRC32 mismatch for ${JSON.stringify(name)}`);
4337
- if (name && !name.endsWith("/")) result.set(name, data);
4338
- }
4339
- if (offset !== eocd) fail("central directory entry count/length mismatch");
4340
- ranges.sort((a, b) => a.start - b.start);
4341
- for (let i = 1; i < ranges.length; i++)
4342
- if (ranges[i].start < ranges[i - 1].end) fail("overlapping local entry ranges");
4343
- return result;
4344
- };
4345
-
4346
4147
  // src/patch/xdelta.ts
4347
4148
  init_buffer();
4348
4149
  var UINT32_MAX = 4294967295;
4349
- var fail2 = (message) => {
4150
+ var fail = (message) => {
4350
4151
  throw new Error(`VCDIFF: ${message}`);
4351
4152
  };
4352
4153
  var Reader = class {
@@ -4354,12 +4155,14 @@ var Reader = class {
4354
4155
  this.bytes = bytes2;
4355
4156
  this.label = label;
4356
4157
  }
4158
+ bytes;
4159
+ label;
4357
4160
  pos = 0;
4358
4161
  get remaining() {
4359
4162
  return this.bytes.length - this.pos;
4360
4163
  }
4361
4164
  byte() {
4362
- if (!this.remaining) fail2(`truncated ${this.label}`);
4165
+ if (!this.remaining) fail(`truncated ${this.label}`);
4363
4166
  return this.bytes[this.pos++];
4364
4167
  }
4365
4168
  integer() {
@@ -4367,14 +4170,13 @@ var Reader = class {
4367
4170
  for (let count = 0; count < 5; count++) {
4368
4171
  const byte = this.byte();
4369
4172
  value = value * 128 + (byte & 127);
4370
- if (value > UINT32_MAX) fail2(`integer exceeds 32-bit limit in ${this.label}`);
4173
+ if (value > UINT32_MAX) fail(`integer exceeds 32-bit limit in ${this.label}`);
4371
4174
  if (!(byte & 128)) return value;
4372
4175
  }
4373
- return fail2(`invalid variable-length integer in ${this.label}`);
4176
+ return fail(`invalid variable-length integer in ${this.label}`);
4374
4177
  }
4375
4178
  take(size) {
4376
- if (size > this.remaining)
4377
- fail2(`truncated ${this.label}: requested ${size} bytes, ${this.remaining} remain`);
4179
+ if (size > this.remaining) fail(`truncated ${this.label}: requested ${size} bytes, ${this.remaining} remain`);
4378
4180
  const result = this.bytes.subarray(this.pos, this.pos + size);
4379
4181
  this.pos += size;
4380
4182
  return result;
@@ -4401,8 +4203,8 @@ function adler32(bytes2) {
4401
4203
  let a = 1, b = 0;
4402
4204
  for (let start = 0; start < bytes2.length; start += 5552) {
4403
4205
  const end = Math.min(start + 5552, bytes2.length);
4404
- for (let i = start; i < end; i++) {
4405
- a += bytes2[i];
4206
+ for (let i2 = start; i2 < end; i2++) {
4207
+ a += bytes2[i2];
4406
4208
  b += a;
4407
4209
  }
4408
4210
  a %= 65521;
@@ -4425,27 +4227,26 @@ var decodeXdelta = (source, patch, options = {}) => {
4425
4227
  const reader = new Reader(asBuffer(patch, "patch"));
4426
4228
  const maxOutput = limit(options.maxOutputSize, 1024 * 1024 * 1024, "maxOutputSize");
4427
4229
  const maxWindow = limit(options.maxWindowSize, 16 * 1024 * 1024, "maxWindowSize");
4428
- if (!reader.take(3).equals(import_buffer.Buffer.from([214, 195, 196]))) fail2("invalid file signature");
4429
- if (reader.byte() !== 0) fail2("unsupported version (expected 0)");
4230
+ if (!reader.take(3).equals(import_buffer.Buffer.from([214, 195, 196]))) fail("invalid file signature");
4231
+ if (reader.byte() !== 0) fail("unsupported version (expected 0)");
4430
4232
  const header = reader.byte();
4431
- if (header & ~7) fail2("unrecognized header indicator bits");
4432
- if (header & 1)
4433
- fail2("secondary compression is unsupported; recreate the patch using xdelta3 -S none");
4434
- if (header & 2) fail2("custom code table is unsupported");
4233
+ if (header & ~7) fail("unrecognized header indicator bits");
4234
+ if (header & 1) fail("secondary compression is unsupported; recreate the patch using xdelta3 -S none");
4235
+ if (header & 2) fail("custom code table is unsupported");
4435
4236
  if (header & 4) reader.take(reader.integer());
4436
4237
  const windows = [];
4437
4238
  let total = 0;
4438
4239
  while (reader.remaining) {
4439
4240
  const indicator = reader.byte();
4440
4241
  if (indicator & ~7 || (indicator & 3) === 3)
4441
- fail2("invalid window indicator: source and target are mutually exclusive");
4242
+ fail("invalid window indicator: source and target are mutually exclusive");
4442
4243
  let dictionary = import_buffer.Buffer.alloc(0);
4443
4244
  if (indicator & 3) {
4444
4245
  const length = reader.integer();
4445
4246
  const offset = reader.integer();
4446
4247
  const available = indicator & 1 ? sourceBytes.length : total;
4447
4248
  if (offset > available || length > available - offset)
4448
- fail2("source segment exceeds available source/target bounds");
4249
+ fail("source segment exceeds available source/target bounds");
4449
4250
  if (indicator & 1) dictionary = sourceBytes.subarray(offset, offset + length);
4450
4251
  else {
4451
4252
  dictionary = import_buffer.Buffer.allocUnsafe(length);
@@ -4461,20 +4262,18 @@ var decodeXdelta = (source, patch, options = {}) => {
4461
4262
  const deltaLength = reader.integer();
4462
4263
  const delta = new Reader(reader.take(deltaLength), "delta window");
4463
4264
  const targetLength = delta.integer();
4464
- if (targetLength > maxWindow)
4465
- fail2(`window size ${targetLength} exceeds maximum limit ${maxWindow}`);
4466
- if (targetLength > maxOutput - total) fail2(`output size exceeds maximum limit ${maxOutput}`);
4467
- if (dictionary.length + targetLength > UINT32_MAX)
4468
- fail2("window address space exceeds 32-bit limit");
4265
+ if (targetLength > maxWindow) fail(`window size ${targetLength} exceeds maximum limit ${maxWindow}`);
4266
+ if (targetLength > maxOutput - total) fail(`output size exceeds maximum limit ${maxOutput}`);
4267
+ if (dictionary.length + targetLength > UINT32_MAX) fail("window address space exceeds 32-bit limit");
4469
4268
  const compressed = delta.byte();
4470
- if (compressed & ~7) fail2("unrecognized delta indicator bits");
4471
- if (compressed) fail2("secondary compression in delta sections is unsupported");
4269
+ if (compressed & ~7) fail("unrecognized delta indicator bits");
4270
+ if (compressed) fail("secondary compression in delta sections is unsupported");
4472
4271
  const dataLength = delta.integer(), instructionLength = delta.integer(), addressLength = delta.integer();
4473
4272
  const checksum = indicator & 4 ? delta.take(4).readUInt32BE() : null;
4474
4273
  const data = new Reader(delta.take(dataLength), "data section");
4475
4274
  const instructions = new Reader(delta.take(instructionLength), "instruction section");
4476
4275
  const addresses = new Reader(delta.take(addressLength), "address section");
4477
- if (delta.remaining) fail2("delta encoding length does not match section lengths");
4276
+ if (delta.remaining) fail("delta encoding length does not match section lengths");
4478
4277
  const target = import_buffer.Buffer.allocUnsafe(targetLength);
4479
4278
  const near = new Uint32Array(4), same = new Uint32Array(768);
4480
4279
  let nearIndex = 0, position = 0;
@@ -4482,7 +4281,7 @@ var decodeXdelta = (source, patch, options = {}) => {
4482
4281
  const operations = table[instructions.byte()];
4483
4282
  for (const { type, size: fixedSize, mode } of operations) {
4484
4283
  const size = fixedSize || instructions.integer();
4485
- if (size > targetLength - position) fail2(`${type} size exceeds target window length`);
4284
+ if (size > targetLength - position) fail(`${type} size exceeds target window length`);
4486
4285
  if (type === "ADD") {
4487
4286
  data.take(size).copy(target, position);
4488
4287
  } else if (type === "RUN") {
@@ -4494,8 +4293,7 @@ var decodeXdelta = (source, patch, options = {}) => {
4494
4293
  else if (mode === 1) address = here - addresses.integer();
4495
4294
  else if (mode < 6) address = near[mode - 2] + addresses.integer();
4496
4295
  else address = same[(mode - 6) * 256 + addresses.byte()];
4497
- if (address < 0 || address >= here)
4498
- fail2(`COPY address ${address} is outside decoded address space ${here}`);
4296
+ if (address < 0 || address >= here) fail(`COPY address ${address} is outside decoded address space ${here}`);
4499
4297
  near[nearIndex] = address;
4500
4298
  nearIndex = (nearIndex + 1) % near.length;
4501
4299
  same[address % same.length] = address;
@@ -4507,7 +4305,7 @@ var decodeXdelta = (source, patch, options = {}) => {
4507
4305
  const from = Math.max(0, address - dictionary.length);
4508
4306
  while (copied < size) {
4509
4307
  const count = Math.min(size - copied, position + copied - from);
4510
- if (count <= 0) fail2("COPY references unavailable target bytes");
4308
+ if (count <= 0) fail("COPY references unavailable target bytes");
4511
4309
  target.copy(target, position + copied, from, from + count);
4512
4310
  copied += count;
4513
4311
  }
@@ -4515,16 +4313,162 @@ var decodeXdelta = (source, patch, options = {}) => {
4515
4313
  position += size;
4516
4314
  }
4517
4315
  }
4518
- if (position !== targetLength)
4519
- fail2(`target window length mismatch: decoded ${position}, expected ${targetLength}`);
4520
- if (data.remaining || addresses.remaining) fail2("unused bytes in data/address section");
4521
- if (checksum !== null && adler32(target) !== checksum) fail2("Adler32 checksum mismatch");
4316
+ if (position !== targetLength) fail(`target window length mismatch: decoded ${position}, expected ${targetLength}`);
4317
+ if (data.remaining || addresses.remaining) fail("unused bytes in data/address section");
4318
+ if (checksum !== null && adler32(target) !== checksum) fail("Adler32 checksum mismatch");
4522
4319
  windows.push(target);
4523
4320
  total += targetLength;
4524
4321
  }
4525
4322
  return import_buffer.Buffer.concat(windows, total);
4526
4323
  };
4527
4324
 
4325
+ // src/patch/zip.ts
4326
+ init_buffer();
4327
+ var fail2 = (message) => {
4328
+ throw new Error(`ZIP: ${message}`);
4329
+ };
4330
+ var utf8 = new TextDecoder("utf-8", { fatal: true });
4331
+ var cp437 = "\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0\xA0";
4332
+ function decodeUtf8(bytes2) {
4333
+ try {
4334
+ return utf8.decode(bytes2);
4335
+ } catch {
4336
+ return fail2("invalid UTF-8 filename");
4337
+ }
4338
+ }
4339
+ function boundOption(value, fallback, label) {
4340
+ value ??= fallback;
4341
+ if (!Number.isSafeInteger(value) || value < 0) throw new RangeError(`${label} must be a non-negative safe integer`);
4342
+ return value;
4343
+ }
4344
+ function checkRange(bytes2, offset, length, end = bytes2.length) {
4345
+ if (offset < 0 || offset > end || length > end - offset)
4346
+ fail2(`truncated or out-of-bounds record at ${offset} (length ${length})`);
4347
+ }
4348
+ function extras(bytes2) {
4349
+ const fields = /* @__PURE__ */ new Map();
4350
+ let offset = 0;
4351
+ while (offset < bytes2.length) {
4352
+ checkRange(bytes2, offset, 4);
4353
+ const id = bytes2.readUInt16LE(offset), length = bytes2.readUInt16LE(offset + 2);
4354
+ offset += 4;
4355
+ checkRange(bytes2, offset, length);
4356
+ if (id === 1) fail2("ZIP64 archives are unsupported");
4357
+ fields.set(id, bytes2.subarray(offset, offset + length));
4358
+ offset += length;
4359
+ }
4360
+ return fields;
4361
+ }
4362
+ function filename(raw, flags, fields) {
4363
+ if (flags & 2048) return decodeUtf8(raw);
4364
+ const unicode = fields.get(28789);
4365
+ if (unicode && unicode.length >= 5 && unicode[0] === 1 && unicode.readUInt32LE(1) === crc32(raw))
4366
+ return decodeUtf8(unicode.subarray(5));
4367
+ let result = "";
4368
+ for (const byte of raw) result += byte < 128 ? String.fromCharCode(byte) : cp437[byte - 128];
4369
+ return result;
4370
+ }
4371
+ var readZip = (input, options = {}) => {
4372
+ if (!(input instanceof Uint8Array)) throw new TypeError("ZIP input must be a Buffer or Uint8Array");
4373
+ const bytes2 = import_buffer.Buffer.from(input.buffer, input.byteOffset, input.byteLength);
4374
+ const maxSize = boundOption(options.maxUncompressedSize, 1024 * 1024 * 1024, "maxUncompressedSize");
4375
+ const maxEntries = boundOption(options.maxEntries, 1e5, "maxEntries");
4376
+ let eocd = -1;
4377
+ for (let offset2 = bytes2.length - 22; offset2 >= Math.max(0, bytes2.length - 65557); offset2--) {
4378
+ if (bytes2.readUInt32LE(offset2) === 101010256 && offset2 + 22 + bytes2.readUInt16LE(offset2 + 20) === bytes2.length) {
4379
+ eocd = offset2;
4380
+ break;
4381
+ }
4382
+ }
4383
+ if (eocd < 0) fail2("end of central directory not found or truncated");
4384
+ const disk = bytes2.readUInt16LE(eocd + 4), centralDisk = bytes2.readUInt16LE(eocd + 6);
4385
+ const diskEntries = bytes2.readUInt16LE(eocd + 8), count = bytes2.readUInt16LE(eocd + 10);
4386
+ const centralSize = bytes2.readUInt32LE(eocd + 12), centralOffset = bytes2.readUInt32LE(eocd + 16);
4387
+ if (count === 65535 || diskEntries === 65535 || centralSize === 4294967295 || centralOffset === 4294967295 || eocd >= 20 && bytes2.readUInt32LE(eocd - 20) === 117853008)
4388
+ fail2("ZIP64 archives are unsupported");
4389
+ if (disk || centralDisk || diskEntries !== count) fail2("split or multiple-disk archives are unsupported");
4390
+ if (count > maxEntries) fail2(`entry count exceeds limit ${maxEntries}`);
4391
+ checkRange(bytes2, centralOffset, centralSize, eocd);
4392
+ if (centralOffset + centralSize !== eocd) fail2("central directory size/offset mismatch");
4393
+ if (count > Math.floor(centralSize / 46)) fail2("entry count exceeds central directory size");
4394
+ const result = /* @__PURE__ */ new Map();
4395
+ const ranges = [];
4396
+ let offset = centralOffset, totalSize = 0;
4397
+ for (let index = 0; index < count; index++) {
4398
+ checkRange(bytes2, offset, 46, eocd);
4399
+ if (bytes2.readUInt32LE(offset) !== 33639248) fail2("invalid central directory signature");
4400
+ const flags = bytes2.readUInt16LE(offset + 8), method = bytes2.readUInt16LE(offset + 10);
4401
+ const checksum = bytes2.readUInt32LE(offset + 16), compressedSize = bytes2.readUInt32LE(offset + 20), size = bytes2.readUInt32LE(offset + 24);
4402
+ const nameLength = bytes2.readUInt16LE(offset + 28), extraLength = bytes2.readUInt16LE(offset + 30), commentLength = bytes2.readUInt16LE(offset + 32);
4403
+ const startDisk = bytes2.readUInt16LE(offset + 34), localOffset = bytes2.readUInt32LE(offset + 42);
4404
+ if (size === 4294967295 || compressedSize === 4294967295 || localOffset === 4294967295 || startDisk === 65535)
4405
+ fail2("ZIP64 entry is unsupported");
4406
+ if (startDisk) fail2("split or multiple-disk entry is unsupported");
4407
+ if (flags & 8257) fail2("encrypted entries are unsupported");
4408
+ if (flags & ~2062) fail2("unsupported general purpose flags");
4409
+ if (method !== 0 && method !== 8) fail2(`unsupported compression method ${method}`);
4410
+ if (size > maxSize - totalSize) fail2(`uncompressed size exceeds limit ${maxSize}`);
4411
+ totalSize += size;
4412
+ checkRange(bytes2, offset + 46, nameLength + extraLength + commentLength, eocd);
4413
+ const rawName = bytes2.subarray(offset + 46, offset + 46 + nameLength);
4414
+ const fields = extras(bytes2.subarray(offset + 46 + nameLength, offset + 46 + nameLength + extraLength));
4415
+ const name = filename(rawName, flags, fields).replaceAll("\\", "/").toLowerCase();
4416
+ offset += 46 + nameLength + extraLength + commentLength;
4417
+ checkRange(bytes2, localOffset, 30, centralOffset);
4418
+ if (bytes2.readUInt32LE(localOffset) !== 67324752) fail2("invalid local header signature");
4419
+ if (bytes2.readUInt16LE(localOffset + 6) !== flags || bytes2.readUInt16LE(localOffset + 8) !== method)
4420
+ fail2("local header flags/compression method mismatch");
4421
+ const localNameLength = bytes2.readUInt16LE(localOffset + 26), localExtraLength = bytes2.readUInt16LE(localOffset + 28);
4422
+ const dataOffset = localOffset + 30 + localNameLength + localExtraLength;
4423
+ checkRange(bytes2, localOffset + 30, localNameLength + localExtraLength, centralOffset);
4424
+ if (!rawName.equals(bytes2.subarray(localOffset + 30, localOffset + 30 + localNameLength)))
4425
+ fail2("local filename differs from central directory");
4426
+ extras(bytes2.subarray(localOffset + 30 + localNameLength, dataOffset));
4427
+ if (!(flags & 8) && (bytes2.readUInt32LE(localOffset + 14) !== checksum || bytes2.readUInt32LE(localOffset + 18) !== compressedSize || bytes2.readUInt32LE(localOffset + 22) !== size))
4428
+ fail2("local header CRC/size mismatch");
4429
+ checkRange(bytes2, dataOffset, compressedSize, centralOffset);
4430
+ let dataEnd = dataOffset + compressedSize;
4431
+ if (flags & 8) {
4432
+ checkRange(bytes2, dataEnd, 12, centralOffset);
4433
+ const matches = (at) => at + 12 <= centralOffset && bytes2.readUInt32LE(at) === checksum && bytes2.readUInt32LE(at + 4) === compressedSize && bytes2.readUInt32LE(at + 8) === size;
4434
+ if (matches(dataEnd)) dataEnd += 12;
4435
+ else if (bytes2.readUInt32LE(dataEnd) === 134695760 && matches(dataEnd + 4)) dataEnd += 16;
4436
+ else fail2("data descriptor CRC/size mismatch");
4437
+ }
4438
+ ranges.push({ start: localOffset, end: dataEnd });
4439
+ const compressed = bytes2.subarray(dataOffset, dataOffset + compressedSize);
4440
+ let data;
4441
+ if (method === 0) {
4442
+ if (compressedSize !== size) fail2("stored entry compressed/uncompressed size mismatch");
4443
+ data = import_buffer.Buffer.from(compressed);
4444
+ } else {
4445
+ try {
4446
+ data = inflateRawSync(compressed, { maxOutputLength: Math.max(1, size) });
4447
+ } catch (error) {
4448
+ return fail2(
4449
+ `cannot inflate entry ${JSON.stringify(name)} within declared size: ${error instanceof Error ? error.message : String(error)}`
4450
+ );
4451
+ }
4452
+ }
4453
+ if (data.length !== size) fail2(`uncompressed size mismatch for ${JSON.stringify(name)}`);
4454
+ if (crc32(data) !== checksum) fail2(`CRC32 mismatch for ${JSON.stringify(name)}`);
4455
+ if (name && !name.endsWith("/")) result.set(name, data);
4456
+ }
4457
+ if (offset !== eocd) fail2("central directory entry count/length mismatch");
4458
+ ranges.sort((a, b) => a.start - b.start);
4459
+ for (let i2 = 1; i2 < ranges.length; i2++)
4460
+ if (ranges[i2].start < ranges[i2 - 1].end) fail2("overlapping local entry ranges");
4461
+ return result;
4462
+ };
4463
+ var extractZipEntry = (input, entryName, options = {}) => {
4464
+ if (typeof entryName !== "string" || !entryName) throw new TypeError("ZIP entry name must be a non-empty string");
4465
+ const normalized = entryName.replaceAll("\\", "/").toLowerCase();
4466
+ if (normalized.endsWith("/")) fail2(`entry ${JSON.stringify(entryName)} is a directory`);
4467
+ const entry = readZip(input, options).get(normalized);
4468
+ if (entry === void 0) return fail2(`entry ${JSON.stringify(entryName)} not found`);
4469
+ return entry;
4470
+ };
4471
+
4528
4472
  // src/nitro-patch-helper.ts
4529
4473
  var PatchReturnValue = Object.freeze({
4530
4474
  SUCCESS: "SUCCESS",
@@ -4554,9 +4498,12 @@ var readMetadata = (files) => {
4554
4498
  const value = metadata;
4555
4499
  const result = {};
4556
4500
  for (const field2 of ["id", "author", "name", "homepage", "version"]) {
4557
- if (typeof value[field2] === "string") result[field2] = value[field2];
4501
+ const fieldValue = value[field2];
4502
+ if (fieldValue === void 0) continue;
4503
+ if (typeof fieldValue === "string") result[field2] = fieldValue;
4558
4504
  else invalidMetadataField(field2, "\u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u3002");
4559
4505
  }
4506
+ if (value.isBeta === void 0) return result;
4560
4507
  if (typeof value.isBeta === "boolean") result.isBeta = value.isBeta;
4561
4508
  else invalidMetadataField("isBeta", "\u5FC5\u987B\u662F\u5E03\u5C14\u503C\u3002");
4562
4509
  return result;
@@ -4587,6 +4534,7 @@ var readPatchInfo = (patch, options = {}) => {
4587
4534
  const files = readZip(patch, options);
4588
4535
  return { metadata: readMetadata(files), readme: readReadme(files) };
4589
4536
  };
4537
+ var extractZipEntry2 = (archive, entryName, options = {}) => extractZipEntry(archive, entryName, options);
4590
4538
  var readPatchMetadataFile = async (patchPath, options = {}) => readPatchMetadata(await readFile(patchPath), options);
4591
4539
  var readPatchReadmeFile = async (patchPath, options = {}) => readPatchReadme(await readFile(patchPath), options);
4592
4540
  var readPatchInfoFile = async (patchPath, options = {}) => readPatchInfo(await readFile(patchPath), options);
@@ -4595,10 +4543,7 @@ var patchBuffer = (original, patch, options = {}) => {
4595
4543
  const patches = readZip(patch, options);
4596
4544
  const inputMd5 = md52(input);
4597
4545
  const preprocessing = patches.get(`preprocessing/${inputMd5}.xdelta`);
4598
- const rom = new NDSFile(
4599
- preprocessing ? decodeXdelta(input, preprocessing, options) : input,
4600
- options
4601
- );
4546
+ const rom = new NDSFile(preprocessing ? decodeXdelta(input, preprocessing, options) : input, options);
4602
4547
  let matched = true;
4603
4548
  const md5File = patches.get("md5.txt");
4604
4549
  if (md5File) {
@@ -4632,6 +4577,7 @@ var patchIt = async (originalPath, patchPath, options = {}) => {
4632
4577
  return patchBuffer(original, patch, options);
4633
4578
  };
4634
4579
  var PatchHelper = Object.freeze({
4580
+ extractZipEntry: extractZipEntry2,
4635
4581
  patchBuffer,
4636
4582
  patchIt,
4637
4583
  readPatchInfo,
@@ -4675,7 +4621,9 @@ var patchBuffer2 = (original, archive, options = {}) => {
4675
4621
  var readPatchMetadata2 = (archive, options = {}) => readPatchMetadata(archive, options);
4676
4622
  var readPatchReadme2 = (archive, options = {}) => readPatchReadme(archive, options);
4677
4623
  var readPatchInfo2 = (archive, options = {}) => readPatchInfo(archive, options);
4624
+ var extractZipEntry3 = (archive, entryName, options = {}) => new Uint8Array(extractZipEntry2(archive, entryName, options));
4678
4625
  var PatchHelper2 = Object.freeze({
4626
+ extractZipEntry: extractZipEntry3,
4679
4627
  patchBuffer: patchBuffer2,
4680
4628
  readPatchInfo: readPatchInfo2,
4681
4629
  readPatchMetadata: readPatchMetadata2,
@@ -4685,6 +4633,7 @@ var NitroHelper = Object.freeze({ inspectRom });
4685
4633
  export {
4686
4634
  NitroHelper,
4687
4635
  PatchHelper2 as PatchHelper,
4636
+ extractZipEntry3 as extractZipEntry,
4688
4637
  inspectRom,
4689
4638
  patchBuffer2 as patchBuffer,
4690
4639
  readPatchInfo2 as readPatchInfo,