@infersec/conduit 1.71.0 → 1.73.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/cli.js CHANGED
@@ -13,7 +13,7 @@ import process$3, { platform, hrtime, execPath, execArgv } from 'node:process';
13
13
  import crypto from 'node:crypto';
14
14
  import require$$0$8, { Readable, Transform, PassThrough, getDefaultHighWaterMark, Duplex, Writable } from 'node:stream';
15
15
  import 'argon2';
16
- import require$$1$7, { setDefaultResultOrder } from 'node:dns';
16
+ import require$$1$8, { setDefaultResultOrder } from 'node:dns';
17
17
  import require$$0$6 from 'os';
18
18
  import require$$1$3, { realpathSync as realpathSync$1, readlinkSync, readdirSync, readdir as readdir$1, lstatSync } from 'fs';
19
19
  import require$$2$2 from 'util';
@@ -21,20 +21,21 @@ import require$$3$2 from 'assert';
21
21
  import require$$4$1 from 'events';
22
22
  import require$$1$2 from 'stream';
23
23
  import require$$0$7 from 'node:assert';
24
- import require$$0$9, { createServer } from 'node:net';
24
+ import require$$1$4, { createServer } from 'node:net';
25
25
  import require$$2$3 from 'node:http';
26
26
  import require$$5$1 from 'node:querystring';
27
- import require$$0$a from 'node:diagnostics_channel';
27
+ import require$$0$9 from 'node:diagnostics_channel';
28
28
  import require$$3$3, { debuglog, stripVTControlCharacters, inspect, promisify, callbackify, aborted as aborted$1, isDeepStrictEqual } from 'node:util';
29
29
  import require$$4$2 from 'node:tls';
30
- import require$$0$b, { Buffer as Buffer$1 } from 'node:buffer';
30
+ import require$$0$a, { Buffer as Buffer$1 } from 'node:buffer';
31
31
  import require$$3$4 from 'node:zlib';
32
32
  import require$$5$2 from 'node:perf_hooks';
33
33
  import require$$8 from 'node:util/types';
34
- import require$$1$4 from 'node:sqlite';
34
+ import require$$1$5 from 'node:sqlite';
35
35
  import require$$2$4 from 'node:worker_threads';
36
- import require$$1$5 from 'node:async_hooks';
37
- import require$$1$6 from 'node:console';
36
+ import require$$0$b, { fileURLToPath } from 'node:url';
37
+ import require$$1$6 from 'node:async_hooks';
38
+ import require$$1$7 from 'node:console';
38
39
  import require$$0$c, { realpath, readlink, readdir, lstat, mkdir, readFile, writeFile, stat, unlink, rename, rm } from 'node:fs/promises';
39
40
  import require$$2$5 from 'node:timers';
40
41
  import require$$0$d from 'path';
@@ -42,12 +43,11 @@ import require$$0$e from 'tty';
42
43
  import require$$4$3 from 'net';
43
44
  import require$$3$5 from 'zlib';
44
45
  import require$$0$f from 'buffer';
45
- import require$$1$8 from 'string_decoder';
46
+ import require$$1$9 from 'string_decoder';
46
47
  import require$$8$1 from 'querystring';
47
48
  import require$$0$g from 'url';
48
49
  import require$$0$h from 'http';
49
50
  import require$$0$i from 'crypto';
50
- import { fileURLToPath } from 'node:url';
51
51
  import { StringDecoder } from 'node:string_decoder';
52
52
  import { pipeline, finished } from 'node:stream/promises';
53
53
  import 'fs/promises';
@@ -20915,8 +20915,85 @@ object({
20915
20915
  object({
20916
20916
  id: ULIDSchema
20917
20917
  });
20918
+ const EngineOutputSchema = object({
20919
+ created: string$1(),
20920
+ id: ULIDSchema,
20921
+ llamacppBatchSize: number$1().nullable(),
20922
+ llamacppCacheTypeK: string$1().nullable(),
20923
+ llamacppCacheTypeV: string$1().nullable(),
20924
+ llamacppExtraArgs: array(string$1()),
20925
+ llamacppFlashAttn: boolean$1(),
20926
+ llamacppGpuLayers: number$1(),
20927
+ llamacppMainGpu: number$1().nullable(),
20928
+ llamacppParallelism: number$1(),
20929
+ llamacppTensorSplit: string$1().nullable(),
20930
+ llamacppUbatchSize: number$1().nullable(),
20931
+ name: string$1(),
20932
+ type: LLMEngineSchema,
20933
+ updated: string$1(),
20934
+ vllmDevice: string$1().nullable(),
20935
+ vllmDtype: string$1().nullable(),
20936
+ vllmExtraArgs: array(string$1()),
20937
+ vllmTensorParallelSize: number$1()
20938
+ });
20939
+ object({
20940
+ llamacppBatchSize: number$1().int().positive().nullable().optional(),
20941
+ llamacppCacheTypeK: string$1().nullable().optional(),
20942
+ llamacppCacheTypeV: string$1().nullable().optional(),
20943
+ llamacppExtraArgs: array(string$1()).optional(),
20944
+ llamacppFlashAttn: boolean$1().optional(),
20945
+ llamacppGpuLayers: number$1().int().min(0).optional(),
20946
+ llamacppMainGpu: number$1().int().min(0).nullable().optional(),
20947
+ llamacppParallelism: number$1().int().positive().optional(),
20948
+ llamacppTensorSplit: string$1().nullable().optional(),
20949
+ llamacppUbatchSize: number$1().int().positive().nullable().optional(),
20950
+ name: ResourceNameSchema,
20951
+ type: LLMEngineSchema,
20952
+ vllmDevice: string$1().nullable().optional(),
20953
+ vllmDtype: string$1().nullable().optional(),
20954
+ vllmExtraArgs: array(string$1()).optional(),
20955
+ vllmTensorParallelSize: number$1().int().positive().optional()
20956
+ });
20957
+ object({
20958
+ llamacppBatchSize: number$1().int().positive().nullable().optional(),
20959
+ llamacppCacheTypeK: string$1().nullable().optional(),
20960
+ llamacppCacheTypeV: string$1().nullable().optional(),
20961
+ llamacppExtraArgs: array(string$1()).optional(),
20962
+ llamacppFlashAttn: boolean$1().optional(),
20963
+ llamacppGpuLayers: number$1().int().min(0).optional(),
20964
+ llamacppMainGpu: number$1().int().min(0).nullable().optional(),
20965
+ llamacppParallelism: number$1().int().positive().optional(),
20966
+ llamacppTensorSplit: string$1().nullable().optional(),
20967
+ llamacppUbatchSize: number$1().int().positive().nullable().optional(),
20968
+ name: ResourceNameSchema.optional(),
20969
+ type: LLMEngineSchema.optional(),
20970
+ vllmDevice: string$1().nullable().optional(),
20971
+ vllmDtype: string$1().nullable().optional(),
20972
+ vllmExtraArgs: array(string$1()).optional(),
20973
+ vllmTensorParallelSize: number$1().int().positive().optional()
20974
+ });
20975
+ object({
20976
+ results: array(EngineOutputSchema)
20977
+ });
20978
+ object({
20979
+ id: ULIDSchema
20980
+ });
20918
20981
 
20919
20982
  ({
20983
+ "/api/v1/engines/:engineID": {
20984
+ DELETE: {
20985
+ parameters: {
20986
+ engineID: ULIDSchema.describe("Engine identifier")
20987
+ }},
20988
+ GET: {
20989
+ parameters: {
20990
+ engineID: ULIDSchema.describe("Engine identifier")
20991
+ }},
20992
+ PATCH: {
20993
+ parameters: {
20994
+ engineID: ULIDSchema.describe("Engine identifier")
20995
+ }}
20996
+ },
20920
20997
  "/api/v1/endpoints/:endpointID": {
20921
20998
  DELETE: {
20922
20999
  parameters: {
@@ -23598,7 +23675,8 @@ function requireSymbols () {
23598
23675
  kPingInterval: Symbol('ping interval'),
23599
23676
  kNoProxyAgent: Symbol('no proxy agent'),
23600
23677
  kHttpProxyAgent: Symbol('http proxy agent'),
23601
- kHttpsProxyAgent: Symbol('https proxy agent')
23678
+ kHttpsProxyAgent: Symbol('https proxy agent'),
23679
+ kSocks5ProxyAgent: Symbol('socks5 proxy agent')
23602
23680
  };
23603
23681
  return symbols;
23604
23682
  }
@@ -24464,6 +24542,33 @@ function requireErrors () {
24464
24542
  }
24465
24543
  }
24466
24544
 
24545
+ class Socks5ProxyError extends UndiciError {
24546
+ constructor (message, code) {
24547
+ super(message);
24548
+ this.name = 'Socks5ProxyError';
24549
+ this.message = message || 'SOCKS5 proxy error';
24550
+ this.code = code || 'UND_ERR_SOCKS5';
24551
+ }
24552
+ }
24553
+
24554
+ const kMessageSizeExceededError = Symbol.for('undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED');
24555
+ class MessageSizeExceededError extends UndiciError {
24556
+ constructor (message) {
24557
+ super(message);
24558
+ this.name = 'MessageSizeExceededError';
24559
+ this.message = message || 'Max decompressed message size exceeded';
24560
+ this.code = 'UND_ERR_WS_MESSAGE_SIZE_EXCEEDED';
24561
+ }
24562
+
24563
+ static [Symbol.hasInstance] (instance) {
24564
+ return instance && instance[kMessageSizeExceededError] === true
24565
+ }
24566
+
24567
+ get [kMessageSizeExceededError] () {
24568
+ return true
24569
+ }
24570
+ }
24571
+
24467
24572
  errors = {
24468
24573
  AbortError,
24469
24574
  HTTPParserError,
@@ -24487,7 +24592,9 @@ function requireErrors () {
24487
24592
  RequestRetryError,
24488
24593
  ResponseError,
24489
24594
  SecureProxyConnectionError,
24490
- MaxOriginsReachedError
24595
+ MaxOriginsReachedError,
24596
+ Socks5ProxyError,
24597
+ MessageSizeExceededError
24491
24598
  };
24492
24599
  return errors;
24493
24600
  }
@@ -24822,7 +24929,7 @@ function requireUtil$5 () {
24822
24929
  const { kDestroyed, kBodyUsed, kListeners, kBody } = requireSymbols();
24823
24930
  const { IncomingMessage } = require$$2$3;
24824
24931
  const stream = require$$0$8;
24825
- const net = require$$0$9;
24932
+ const net = require$$1$4;
24826
24933
  const { stringify } = require$$5$1;
24827
24934
  const { EventEmitter: EE } = require$$0$5;
24828
24935
  const timers = requireTimers();
@@ -25145,6 +25252,20 @@ function requireUtil$5 () {
25145
25252
  return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))
25146
25253
  }
25147
25254
 
25255
+ /**
25256
+ * Checks whether an object has a safe Symbol.iterator — i.e. one that is
25257
+ * either own or inherited from a non-Object.prototype chain. This prevents
25258
+ * prototype-pollution attacks from injecting a fake iterator on
25259
+ * Object.prototype.
25260
+ * @param {object} obj
25261
+ * @returns {boolean}
25262
+ */
25263
+ function hasSafeIterator (obj) {
25264
+ const prototype = Object.getPrototypeOf(obj);
25265
+ const ownIterator = Object.prototype.hasOwnProperty.call(obj, Symbol.iterator);
25266
+ return ownIterator || (prototype != null && prototype !== Object.prototype && typeof obj[Symbol.iterator] === 'function')
25267
+ }
25268
+
25148
25269
  /**
25149
25270
  * @param {Blob|Buffer|import ('stream').Stream} body
25150
25271
  * @returns {number|null}
@@ -25244,19 +25365,39 @@ function requireUtil$5 () {
25244
25365
  const key = headerNameToString(headers[i]);
25245
25366
  let val = obj[key];
25246
25367
 
25247
- if (val) {
25248
- if (typeof val === 'string') {
25249
- val = [val];
25250
- obj[key] = val;
25251
- }
25252
- val.push(headers[i + 1].toString('latin1'));
25253
- } else {
25254
- const headersValue = headers[i + 1];
25255
- if (typeof headersValue === 'string') {
25256
- obj[key] = headersValue;
25368
+ if (val !== undefined) {
25369
+ if (!Object.hasOwn(obj, key)) {
25370
+ const headersValue = typeof headers[i + 1] === 'string'
25371
+ ? headers[i + 1]
25372
+ : Array.isArray(headers[i + 1])
25373
+ ? headers[i + 1].map(x => x.toString('latin1'))
25374
+ : headers[i + 1].toString('latin1');
25375
+
25376
+ if (key === '__proto__') {
25377
+ Object.defineProperty(obj, key, {
25378
+ value: headersValue,
25379
+ enumerable: true,
25380
+ configurable: true,
25381
+ writable: true
25382
+ });
25383
+ } else {
25384
+ obj[key] = headersValue;
25385
+ }
25257
25386
  } else {
25258
- obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('latin1')) : headersValue.toString('latin1');
25387
+ if (typeof val === 'string') {
25388
+ val = [val];
25389
+ obj[key] = val;
25390
+ }
25391
+ val.push(headers[i + 1].toString('latin1'));
25259
25392
  }
25393
+ } else {
25394
+ const headersValue = typeof headers[i + 1] === 'string'
25395
+ ? headers[i + 1]
25396
+ : Array.isArray(headers[i + 1])
25397
+ ? headers[i + 1].map(x => x.toString('latin1'))
25398
+ : headers[i + 1].toString('latin1');
25399
+
25400
+ obj[key] = headersValue;
25260
25401
  }
25261
25402
  }
25262
25403
 
@@ -25736,6 +25877,7 @@ function requireUtil$5 () {
25736
25877
  getServerName,
25737
25878
  isStream,
25738
25879
  isIterable,
25880
+ hasSafeIterator,
25739
25881
  isAsyncIterable,
25740
25882
  isDestroyed,
25741
25883
  headerNameToString,
@@ -25823,7 +25965,7 @@ function requireDiagnostics () {
25823
25965
  if (hasRequiredDiagnostics) return diagnostics;
25824
25966
  hasRequiredDiagnostics = 1;
25825
25967
 
25826
- const diagnosticsChannel = require$$0$a;
25968
+ const diagnosticsChannel = require$$0$9;
25827
25969
  const util = require$$3$3;
25828
25970
 
25829
25971
  const undiciDebugLog = util.debuglog('undici');
@@ -26000,10 +26142,12 @@ function requireDiagnostics () {
26000
26142
 
26001
26143
  diagnosticsChannel.subscribe('undici:websocket:open',
26002
26144
  evt => {
26003
- const {
26004
- address: { address, port }
26005
- } = evt;
26006
- debugLog('connection opened %s%s', address, port ? `:${port}` : '');
26145
+ if (evt.address != null) {
26146
+ const { address, port } = evt.address;
26147
+ debugLog('connection opened %s%s', address, port ? `:${port}` : '');
26148
+ } else {
26149
+ debugLog('connection opened');
26150
+ }
26007
26151
  });
26008
26152
 
26009
26153
  diagnosticsChannel.subscribe('undici:websocket:close',
@@ -26069,6 +26213,7 @@ function requireRequest$2 () {
26069
26213
  isBuffer,
26070
26214
  isFormDataLike,
26071
26215
  isIterable,
26216
+ hasSafeIterator,
26072
26217
  isBlobLike,
26073
26218
  serializePathWithQuery,
26074
26219
  assertRequestHandler,
@@ -26082,6 +26227,21 @@ function requireRequest$2 () {
26082
26227
  // Verifies that a given path is valid does not contain control chars \x00 to \x20
26083
26228
  const invalidPathRegex = /[^\u0021-\u00ff]/;
26084
26229
 
26230
+ function isValidContentLengthHeaderValue (val) {
26231
+ if (typeof val !== 'string' || val.length === 0) {
26232
+ return false
26233
+ }
26234
+
26235
+ for (let i = 0; i < val.length; i++) {
26236
+ const charCode = val.charCodeAt(i);
26237
+ if (charCode < 48 || charCode > 57) {
26238
+ return false
26239
+ }
26240
+ }
26241
+
26242
+ return true
26243
+ }
26244
+
26085
26245
  const kHandler = Symbol('handler');
26086
26246
 
26087
26247
  class Request {
@@ -26100,7 +26260,8 @@ function requireRequest$2 () {
26100
26260
  expectContinue,
26101
26261
  servername,
26102
26262
  throwOnError,
26103
- maxRedirections
26263
+ maxRedirections,
26264
+ typeOfService
26104
26265
  }, handler) {
26105
26266
  if (typeof path !== 'string') {
26106
26267
  throw new InvalidArgumentError('path must be a string')
@@ -26124,6 +26285,10 @@ function requireRequest$2 () {
26124
26285
  throw new InvalidArgumentError('upgrade must be a string')
26125
26286
  }
26126
26287
 
26288
+ if (upgrade && !isValidHeaderValue(upgrade)) {
26289
+ throw new InvalidArgumentError('invalid upgrade header')
26290
+ }
26291
+
26127
26292
  if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {
26128
26293
  throw new InvalidArgumentError('invalid headersTimeout')
26129
26294
  }
@@ -26148,12 +26313,18 @@ function requireRequest$2 () {
26148
26313
  throw new InvalidArgumentError('maxRedirections is not supported, use the redirect interceptor')
26149
26314
  }
26150
26315
 
26316
+ if (typeOfService != null && (!Number.isInteger(typeOfService) || typeOfService < 0 || typeOfService > 255)) {
26317
+ throw new InvalidArgumentError('typeOfService must be an integer between 0 and 255')
26318
+ }
26319
+
26151
26320
  this.headersTimeout = headersTimeout;
26152
26321
 
26153
26322
  this.bodyTimeout = bodyTimeout;
26154
26323
 
26155
26324
  this.method = method;
26156
26325
 
26326
+ this.typeOfService = typeOfService ?? 0;
26327
+
26157
26328
  this.abort = null;
26158
26329
 
26159
26330
  if (body == null) {
@@ -26230,7 +26401,7 @@ function requireRequest$2 () {
26230
26401
  processHeader(this, headers[i], headers[i + 1]);
26231
26402
  }
26232
26403
  } else if (headers && typeof headers === 'object') {
26233
- if (headers[Symbol.iterator]) {
26404
+ if (hasSafeIterator(headers)) {
26234
26405
  for (const header of headers) {
26235
26406
  if (!Array.isArray(header) || header.length !== 2) {
26236
26407
  throw new InvalidArgumentError('headers must be in key-value pair format')
@@ -26433,30 +26604,44 @@ function requireRequest$2 () {
26433
26604
  val = `${val}`;
26434
26605
  }
26435
26606
 
26436
- if (request.host === null && headerName === 'host') {
26607
+ if (headerName === 'host') {
26608
+ if (request.host !== null) {
26609
+ throw new InvalidArgumentError('duplicate host header')
26610
+ }
26437
26611
  if (typeof val !== 'string') {
26438
26612
  throw new InvalidArgumentError('invalid host header')
26439
26613
  }
26440
26614
  // Consumed by Client
26441
26615
  request.host = val;
26442
- } else if (request.contentLength === null && headerName === 'content-length') {
26443
- request.contentLength = parseInt(val, 10);
26444
- if (!Number.isFinite(request.contentLength)) {
26616
+ } else if (headerName === 'content-length') {
26617
+ if (request.contentLength !== null) {
26618
+ throw new InvalidArgumentError('duplicate content-length header')
26619
+ }
26620
+ if (!isValidContentLengthHeaderValue(val)) {
26445
26621
  throw new InvalidArgumentError('invalid content-length header')
26446
26622
  }
26623
+ request.contentLength = parseInt(val, 10);
26447
26624
  } else if (request.contentType === null && headerName === 'content-type') {
26448
26625
  request.contentType = val;
26449
26626
  request.headers.push(key, val);
26450
26627
  } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') {
26451
26628
  throw new InvalidArgumentError(`invalid ${headerName} header`)
26452
26629
  } else if (headerName === 'connection') {
26453
- const value = typeof val === 'string' ? val.toLowerCase() : null;
26454
- if (value !== 'close' && value !== 'keep-alive') {
26630
+ // Per RFC 7230 Section 6.1, Connection header can contain
26631
+ // a comma-separated list of connection option tokens (header names)
26632
+ const value = typeof val === 'string' ? val : null;
26633
+ if (value === null) {
26455
26634
  throw new InvalidArgumentError('invalid connection header')
26456
26635
  }
26457
26636
 
26458
- if (value === 'close') {
26459
- request.reset = true;
26637
+ for (const token of value.toLowerCase().split(',')) {
26638
+ const trimmed = token.trim();
26639
+ if (!isValidHTTPToken(trimmed)) {
26640
+ throw new InvalidArgumentError('invalid connection header')
26641
+ }
26642
+ if (trimmed === 'close') {
26643
+ request.reset = true;
26644
+ }
26460
26645
  }
26461
26646
  } else if (headerName === 'expect') {
26462
26647
  throw new NotSupportedError('expect header not supported')
@@ -26496,6 +26681,10 @@ function requireWrapHandler () {
26496
26681
  return this.#handler.onConnect?.(abort, context)
26497
26682
  }
26498
26683
 
26684
+ onResponseStarted () {
26685
+ return this.#handler.onResponseStarted?.()
26686
+ }
26687
+
26499
26688
  onHeaders (statusCode, rawHeaders, resume, statusMessage) {
26500
26689
  return this.#handler.onHeaders?.(statusCode, rawHeaders, resume, statusMessage)
26501
26690
  }
@@ -26529,7 +26718,7 @@ function requireWrapHandler () {
26529
26718
  onRequestUpgrade (controller, statusCode, headers, socket) {
26530
26719
  const rawHeaders = [];
26531
26720
  for (const [key, val] of Object.entries(headers)) {
26532
- rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val));
26721
+ rawHeaders.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val));
26533
26722
  }
26534
26723
 
26535
26724
  this.#handler.onUpgrade?.(statusCode, rawHeaders, socket);
@@ -26538,7 +26727,7 @@ function requireWrapHandler () {
26538
26727
  onResponseStart (controller, statusCode, headers, statusMessage) {
26539
26728
  const rawHeaders = [];
26540
26729
  for (const [key, val] of Object.entries(headers)) {
26541
- rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val));
26730
+ rawHeaders.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val));
26542
26731
  }
26543
26732
 
26544
26733
  if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) {
@@ -26555,7 +26744,7 @@ function requireWrapHandler () {
26555
26744
  onResponseEnd (controller, trailers) {
26556
26745
  const rawTrailers = [];
26557
26746
  for (const [key, val] of Object.entries(trailers)) {
26558
- rawTrailers.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val));
26747
+ rawTrailers.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val));
26559
26748
  }
26560
26749
 
26561
26750
  this.#handler.onComplete?.(rawTrailers);
@@ -26569,6 +26758,12 @@ function requireWrapHandler () {
26569
26758
  this.#handler.onError?.(err);
26570
26759
  }
26571
26760
  };
26761
+
26762
+ function toRawHeaderValue (value) {
26763
+ return Array.isArray(value)
26764
+ ? value.map((item) => Buffer.from(item, 'latin1'))
26765
+ : Buffer.from(value, 'latin1')
26766
+ }
26572
26767
  return wrapHandler;
26573
26768
  }
26574
26769
 
@@ -26648,6 +26843,9 @@ function requireUnwrapHandler () {
26648
26843
 
26649
26844
  [kResume] = null
26650
26845
 
26846
+ rawHeaders = null
26847
+ rawTrailers = null
26848
+
26651
26849
  constructor (abort) {
26652
26850
  this.#abort = abort;
26653
26851
  }
@@ -26702,12 +26900,18 @@ function requireUnwrapHandler () {
26702
26900
  this.#handler.onRequestStart?.(this.#controller, context);
26703
26901
  }
26704
26902
 
26903
+ onResponseStarted () {
26904
+ return this.#handler.onResponseStarted?.()
26905
+ }
26906
+
26705
26907
  onUpgrade (statusCode, rawHeaders, socket) {
26908
+ this.#controller.rawHeaders = rawHeaders;
26706
26909
  this.#handler.onRequestUpgrade?.(this.#controller, statusCode, parseHeaders(rawHeaders), socket);
26707
26910
  }
26708
26911
 
26709
26912
  onHeaders (statusCode, rawHeaders, resume, statusMessage) {
26710
26913
  this.#controller[kResume] = resume;
26914
+ this.#controller.rawHeaders = rawHeaders;
26711
26915
  this.#handler.onResponseStart?.(this.#controller, statusCode, parseHeaders(rawHeaders), statusMessage);
26712
26916
  return !this.#controller.paused
26713
26917
  }
@@ -26718,6 +26922,7 @@ function requireUnwrapHandler () {
26718
26922
  }
26719
26923
 
26720
26924
  onComplete (rawTrailers) {
26925
+ this.#controller.rawTrailers = rawTrailers;
26721
26926
  this.#handler.onResponseEnd?.(this.#controller, parseHeaders(rawTrailers));
26722
26927
  }
26723
26928
 
@@ -26750,6 +26955,7 @@ function requireDispatcherBase () {
26750
26955
 
26751
26956
  const kOnDestroyed = Symbol('onDestroyed');
26752
26957
  const kOnClosed = Symbol('onClosed');
26958
+ const kWebSocketOptions = Symbol('webSocketOptions');
26753
26959
 
26754
26960
  class DispatcherBase extends Dispatcher {
26755
26961
  /** @type {boolean} */
@@ -26764,6 +26970,24 @@ function requireDispatcherBase () {
26764
26970
  /** @type {Array<Function>|null} */
26765
26971
  [kOnClosed] = null
26766
26972
 
26973
+ /**
26974
+ * @param {import('../../types/dispatcher').DispatcherOptions} [opts]
26975
+ */
26976
+ constructor (opts) {
26977
+ super();
26978
+ this[kWebSocketOptions] = opts?.webSocket ?? {};
26979
+ }
26980
+
26981
+ /**
26982
+ * @returns {import('../../types/dispatcher').WebSocketOptions}
26983
+ */
26984
+ get webSocketOptions () {
26985
+ return {
26986
+ maxFragments: this[kWebSocketOptions].maxFragments ?? 131072,
26987
+ maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 // 128 MB default
26988
+ }
26989
+ }
26990
+
26767
26991
  /** @returns {boolean} */
26768
26992
  get destroyed () {
26769
26993
  return this[kDestroyed]
@@ -26912,7 +27136,7 @@ function requireConnect () {
26912
27136
  if (hasRequiredConnect) return connect;
26913
27137
  hasRequiredConnect = 1;
26914
27138
 
26915
- const net = require$$0$9;
27139
+ const net = require$$1$4;
26916
27140
  const assert = require$$0$7;
26917
27141
  const util = requireUtil$5();
26918
27142
  const { InvalidArgumentError } = requireErrors();
@@ -26950,6 +27174,22 @@ function requireConnect () {
26950
27174
  return
26951
27175
  }
26952
27176
 
27177
+ if (this._sessionCache.has(sessionKey)) {
27178
+ this._sessionCache.delete(sessionKey);
27179
+ } else if (this._sessionCache.size >= this._maxCachedSessions) {
27180
+ for (const [key, ref] of this._sessionCache) {
27181
+ if (ref.deref() === undefined) {
27182
+ this._sessionCache.delete(key);
27183
+ return
27184
+ }
27185
+ }
27186
+
27187
+ const oldest = this._sessionCache.keys().next();
27188
+ if (!oldest.done) {
27189
+ this._sessionCache.delete(oldest.value);
27190
+ }
27191
+ }
27192
+
26953
27193
  this._sessionCache.set(sessionKey, new WeakRef(session));
26954
27194
  this._sessionRegistry.register(session, sessionKey);
26955
27195
  }
@@ -27624,7 +27864,7 @@ function requireLlhttpWasm () {
27624
27864
  hasRequiredLlhttpWasm = 1;
27625
27865
  (function (module) {
27626
27866
 
27627
- const { Buffer } = require$$0$b;
27867
+ const { Buffer } = require$$0$a;
27628
27868
 
27629
27869
  const wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgL5YUCAgd/A34gASACaiEEAkAgACIDKAIMIgANACADKAIEBEAgAyABNgIECyMAQRBrIgkkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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C0HjAQwHC0HXAQwGC0HYAQwFC0HZAQwEC0HaAQwDC0HbAQwCC0HdAQwBC0HcAQshAgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAg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ogKiAqICogKiAqICogKiAqICogKiAqICogIAogILIAQgAUEBaiIBRw0AC0HJACECDOwCCyABQQFqIQEgA0Evai0AAEEBcQ2lAiADQQA2AhwgAyABNgIUIANBlxA2AhAgA0EKNgIMQQAhAgzrAgsgASAERwRAA0AgAS0AAEEgRw0VIAQgAUEBaiIBRw0AC0H4ACECDOsCC0H4ACECDOoCCyADQQI6ACgMOAtBACECIANBADYCHCADQb8LNgIQIANBAjYCDCADIAFBAWo2AhQM6AILQQAhAgzOAgtBDSECDM0CC0ETIQIMzAILQRUhAgzLAgtBFiECDMoCC0EYIQIMyQILQRkhAgzIAgtBGiECDMcCC0EbIQIMxgILQRwhAgzFAgtBHSECDMQCC0EeIQIMwwILQR8hAgzCAgtBICECDMECC0EiIQIMwAILQSMhAgy/AgtBJSECDL4CC0HlACECDL0CCyADQT02AhwgAyABNgIUIAMgADYCDEEAIQIM1QILIANBGzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDNQCCyADQSA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzTAgsgA0ETNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0gILIANBCzYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNECCyADQRA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzQAgsgA0EgNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzwILIANBCzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM4CCyADQQw2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzNAgtBACECIANBADYCHCADIAE2AhQgA0HdDjYCECADQRI2AgwMzAILAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB/QEhAgzMAgsCQAJAIAMtADZBAUcNAEEAIQACQCADKAI4IgJFDQAgAigCYCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUcNASADQfwBNgIcIAMgATYCFCADQdwZNgIQIANBFTYCDEEAIQIMzQILQdwBIQIMswILIANBADYCHCADIAE2AhQgA0H5CzYCECADQR82AgxBACECDMsCCwJAAkAgAy0AKEEBaw4CBAEAC0HbASECDLICC0HUASECDLECCyADQQI6ADFBACEAAkAgAygCOCICRQ0AIAIoAgAiAkUNACADIAIRAAAhAAsgAEUEQEHdASECDLECCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQbQMNgIQIANBEDYCDEEAIQIMygILIANB+wE2AhwgAyABNgIUIANBgRo2AhAgA0EVNgIMQQAhAgzJAgsgASAERgRAQfoBIQIMyQILIAEtAABByABGDQEgA0EBOgAoC0HAASECDK4CC0HaASECDK0CCyABIARHBEAgA0EMNgIIIAMgATYCBEHZASECDK0CC0H5ASECDMUCCyABIARGBEBB+AEhAgzFAgsgAS0AAEHIAEcNBCABQQFqIQFB2AEhAgyrAgsgASAERgRAQfcBIQIMxAILAkACQCABLQAAQcUAaw4QAAUFBQUFBQUFBQUFBQUFAQULIAFBAWohAUHWASECDKsCCyABQQFqIQFB1wEhAgyqAgtB9gEhAiABIARGDcICIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbrVAGotAABHDQMgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMMCCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIARQRAQeMBIQIMqgILIANB9QE2AhwgAyABNgIUIAMgADYCDEEAIQIMwgILQfQBIQIgASAERg3BAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEG41QBqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzCAgsgA0GBBDsBKCADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIADQMMAgsgA0EANgIAC0EAIQIgA0EANgIcIAMgATYCFCADQeUfNgIQIANBCDYCDAy/AgtB1QEhAgylAgsgA0HzATYCHCADIAE2AhQgAyAANgIMQQAhAgy9AgtBACEAAkAgAygCOCICRQ0AIAIoAkAiAkUNACADIAIRAAAhAAsgAEUNbiAAQRVHBEAgA0EANgIcIAMgATYCFCADQYIPNgIQIANBIDYCDEEAIQIMvQILIANBjwE2AhwgAyABNgIUIANB7Bs2AhAgA0EVNgIMQQAhAgy8AgsgASAERwRAIANBDTYCCCADIAE2AgRB0wEhAgyjAgtB8gEhAgy7AgsgASAERgRAQfEBIQIMuwILAkACQAJAIAEtAABByABrDgsAAQgICAgICAgIAggLIAFBAWohAUHQASECDKMCCyABQQFqIQFB0QEhAgyiAgsgAUEBaiEBQdIBIQIMoQILQfABIQIgASAERg25AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBtdUAai0AAEcNBCAAQQJGDQMgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuQILQe8BIQIgASAERg24AiADKAIAIgAgBCABa2ohBiABIABrQQFqIQUDQCABLQAAIABBs9UAai0AAEcNAyAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuAILQe4BIQIgASAERg23AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMtwILIAMoAgQhACADQgA3AwAgAyAAIAVBAWoiARArIgBFDQIgA0HsATYCHCADIAE2AhQgAyAANgIMQQAhAgy2AgsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNnAIgA0HtATYCHCADIAE2AhQgAyAANgIMQQAhAgy0AgtBzwEhAgyaAgtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDLQCC0HOASECDJoCCyADQesBNgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMsgILIAEgBEYEQEHrASECDLICCyABLQAAQS9GBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GyODYCECADQQg2AgxBACECDLECC0HNASECDJcCCyABIARHBEAgA0EONgIIIAMgATYCBEHMASECDJcCC0HqASECDK8CCyABIARGBEBB6QEhAgyvAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBywEhAgyWAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZcCIANB6AE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAEgBEYEQEHnASECDK4CCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5gE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILQcoBIQIMlAILIAEgBEYEQEHlASECDK0CC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDQIgA0HiATYCHCADIAE2AhQgAyAANgIMQQAhAgyvAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZoCIANB4wE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ2YAiADQeQBNgIcIAMgATYCFCADIAA2AgwMrQILQckBIQIMkwILQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBpA02AhAgA0EhNgIMQQAhAgytAgtByAEhAgyTAgsgA0HhATYCHCADIAE2AhQgA0HQGjYCECADQRU2AgxBACECDKsCCyABIARGBEBB4QEhAgyrAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANBmRE2AhAgA0EJNgIMQQAhAgyrAgtBxwEhAgyRAgsgASAERgRAQeABIQIMqgILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyrAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqgILQcYBIQIMkAILIAEgBEYEQEHfASECDKkCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqgILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKkCC0HFASECDI8CCyABIARGBEBB3gEhAgyoAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKkCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyoAgtBxAEhAgyOAgsgASAERgRAQd0BIQIMpwILAkACQAJAAkAgAS0AAEEKaw4XAgMDAAMDAwMDAwMDAwMDAwMDAwMDAwEDCyABQQFqDAULIAFBAWohAUHDASECDI8CCyABQQFqIQEgA0Evai0AAEEBcQ0IIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKcCCyADQQA2AhwgAyABNgIUIANBjQs2AhAgA0ENNgIMQQAhAgymAgsgASAERwRAIANBDzYCCCADIAE2AgRBASECDI0CC0HcASECDKUCCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtB2wEhAgymAgsgAygCBCEAIANBADYCBCADIAAgARAtIgBFBEAgAUEBaiEBDAQLIANB2gE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMpQILIAMoAgQhACADQQA2AgQgAyAAIAEQLSIADQEgAUEBagshAUHBASECDIoCCyADQdkBNgIcIAMgADYCDCADIAFBAWo2AhRBACECDKICC0HCASECDIgCCyADQS9qLQAAQQFxDQEgA0EANgIcIAMgATYCFCADQeQcNgIQIANBGTYCDEEAIQIMoAILIAEgBEYEQEHZASEC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IAFBAWohAUGeASECDOQBCyABQQFqIQFBnwEhAgzjAQtBtwEhAiABIARGDfsBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQezUAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPwBCyADQQA2AgAgBkEBaiEBQQ0MKAtBtgEhAiABIARGDfoBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPsBCyADQQA2AgAgBkEBaiEBQQwMJwtBtQEhAiABIARGDfkBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQerUAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPoBCyADQQA2AgAgBkEBaiEBQQMMJgtBtAEhAiABIARGDfgBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQejUAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPkBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQbMBIQIM+AELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBmQEhAgzfAQsgAUEBaiEBQZoBIQIM3gELQbIBIQIgASAERg32ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHm1ABqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz3AQsgA0EANgIAIAZBAWohAUEnDCMLQbEBIQIgASAERg31ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHk1ABqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz2AQsgA0EANgIAIAZBAWohAUEcDCILQbABIQIgASAERg30ASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHe1ABqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz1AQsgA0EANgIAIAZBAWohAUEGDCELQa8BIQIgASAERg3zASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHZ1ABqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz0AQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGuASECDPMBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQY4BIQIM3AELIAFBAWohAUGPASECDNsBCyABQQFqIQFBlAEhAgzaAQsgAUEBaiEBQZUBIQIM2QELQa0BIQIgASAERg3xASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHX1ABqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzyAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGsASECDPEBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGQASECDNgBCyABQQFqIQFBkwEhAgzXAQsgASAERgRAQasBIQIM8AELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQZEBIQIM1wELIAFBAWohAUGSASECDNYBCyABIARGBEBBqgEhAgzvAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GpASECIAEgBEYN7QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABB0dQAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7gELIANBADYCACAGQQFqIQFBHgwaC0GoASECIAEgBEYN7AEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBytQAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7QELIANBADYCACAGQQFqIQFBFQwZC0GnASECIAEgBEYN6wEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBx9QAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7AELIANBADYCACAGQQFqIQFBFwwYC0GmASECIAEgBEYN6gEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBwdQAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6wELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBpQEhAgzqAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYsBIQIM0QELIAFBAWohAUGMASECDNABC0GkASECIAEgBEYN6AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBptUAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6QELIANBADYCACAGQQFqIQFBCQwVC0GjASECIAEgBEYN5wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBpNUAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6AELIANBADYCACAGQQFqIQFBHwwUC0GiASECIAEgBEYN5gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBvtQAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5wELIANBADYCACAGQQFqIQFBAgwTC0GhASECIAEgBEYN5QEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQbzUAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOUBCyABIARGBEBBoAEhAgzlAQtBASABLQAAQd8ARw0RGiABQQFqIQFBhwEhAgzLAQsgA0EANgIAIAZBAWohAUGIASECDMoBC0GfASECIAEgBEYN4gEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBhNUAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4wELIANBADYCACAGQQFqIQFBKQwPC0GeASECIAEgBEYN4QEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBuNQAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4gELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBnQEhAgzhAQsgAS0AAEHFAEcNDiABQQFqIQFBhAEhAgzHAQsgASAERgRAQZwBIQIM4AELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFBggEhAgzHAQsgAUEBaiEBQYMBIQIMxgELQZsBIQIgASAERg3eASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGz1ABqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzfAQsgA0EANgIAIAZBAWohAUEjDAsLQZoBIQIgASAERg3dASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGw1ABqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzeAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGZASECDN0BCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQf0AIQIMxAELIAFBAWohAUGAASECDMMBCyABIARGBEBBmAEhAgzcAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB/gAhAgzDAQsgAUEBaiEBQf8AIQIMwgELIAEgBEYEQEGXASECDNsBCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQZYBIQIgASAERg3ZASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEGs1ABqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzaAQsgA0EANgIAIAZBAWohAUEFDAYLQZUBIQIgASAERg3YASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGm1ABqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzZAQsgA0EANgIAIAZBAWohAUEWDAULQZQBIQIgASAERg3XASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzYAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGTASECDNcBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUH5ACECDL4BCyABQQFqIQFB+gAhAgy9AQtBkgEhAiABIARGDdUBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQaDUAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNYBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGRASECDNQBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC4iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB/h82AhAgA0EGNgIMDNEBC0H4ACECDLcBCyADQZABNgIcIAMgATYCFCADIAA2AgxBACECDM8BC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgzOAQtB9wAhAgy0AQsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDMwBCyABIARGBEBBjwEhAgzMAQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GbHzYCECADQQY2AgxBACECDMwBC0ECIQIMsgELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GOASECDMoBCyABIARGBEBBjQEhAgzKAQsCQCABLQAAQQlrDgRKAABKAAtB9QAhAgywAQsgAy0AKUEFRgRAQfYAIQIMsAELQfQAIQIMrwELIAEgBEYEQEGMASECDMgBCyADQRA2AgggAyABNgIEDAoLIAEgBEYEQEGLASECDMcBCwJAIAEtAABBCWsOBEcAAEcAC0HzACECDK0BCyABIARHBEAgA0EQNgIIIAMgATYCBEHxACECDK0BC0GKASECDMUBCwJAIAEgBEcEQANAIAEtAABBoNAAai0AACIAQQNHBEACQCAAQQFrDgJJAAQLQfAAIQIMrwELIAQgAUEBaiIBRw0AC0GIASEC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BCABQQFqIgFHDQALQfsAIQIMpwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMpgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMpQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMpAELIANBADYCHCADIAE2AhQgA0G8CjYCECADQQc2AgxBACECDKMBC0HPACECDIkBC0HRACECDIgBC0HnACECDIcBCyABIARGBEBB+gAhAgygAQsCQCABLQAAQQlrDgQgAAAgAAsgAUEBaiEBQeYAIQIMhgELIAEgBEYEQEH5ACECDJ8BCwJAIAEtAABBCWsOBB8AAB8AC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQRAQeIBIQIMhgELIABBFUcEQCADQQA2AhwgAyABNgIUIANByQ02AhAgA0EaNgIMQQAhAgyfAQsgA0H4ADYCHCADIAE2AhQgA0HqGjYCECADQRU2AgxBACECDJ4BCyABIARHBEAgA0ENNgIIIAMgATYCBEHkACECDIUBC0H3ACECDJ0BCyABIARGBEBB9gAhAgydAQsCQAJAAkAgAS0AAEHIAGsOCwABCwsLCwsLCwsCCwsgAUEBaiEBQd0AIQIMhQELIAFBAWohAUHgACECDIQBCyABQQFqIQFB4wAhAgyDAQtB9QAhAiABIARGDZsBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbXVAGotAABHDQggAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJwBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIABEAgA0H0ADYCHCADIAE2AhQgAyAANgIMQQAhAgycAQtB4gAhAgyCAQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJwBC0HhACECDIIBCyADQfMANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMmgELIAMtACkiAEEja0ELSQ0JAkAgAEEGSw0AQQEgAHRBygBxRQ0ADAoLQQAhAiADQQA2AhwgAyABNgIUIANB7Qk2AhAgA0EINgIMDJkBC0HyACECIAEgBEYNmAEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBs9UAai0AAEcNBSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMmQELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfEANgIcIAMgATYCFCADIAA2AgxBACECDJkBC0HfACECDH8LQQAhAAJAIAMoAjgiAkUNACACKAI0IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANB6g02AhAgA0EmNgIMQQAhAgyZAQtB3gAhAgx/CyADQfAANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMlwELIAMtAClBIUYNBiADQQA2AhwgAyABNgIUIANBkQo2AhAgA0EINgIMQQAhAgyWAQtB7wAhAiABIARGDZUBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDVAGotAABHDQIgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJYBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIARQ0CIANB7QA2AhwgAyABNgIUIAMgADYCDEEAIQIMlQELIANBADYCAAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDYABIANB7gA2AhwgAyABNgIUIAMgADYCDEEAIQIMkwELQdwAIQIMeQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJMBC0HbACECDHkLIANB7AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyRAQsgAy0AKSIAQSNJDQAgAEEuRg0AIANBADYCHCADIAE2AhQgA0HJCTYCECADQQg2AgxBACECDJABC0HaACECDHYLIAEgBEYEQEHrACECDI8BCwJAIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMjwELQdkAIQIMdQsgASAERwRAIANBDjYCCCADIAE2AgRB2AAhAgx1C0HqACECDI0BCyABIARGBEBB6QAhAgyNAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1wAhAgx0CyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeiADQegANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyABIARGBEBB5wAhAgyMAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ17IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMjAELQdYAIQIMcgsgASAERgRAQeUAIQIMiwELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDI0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNfSADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeyADQeQANgIcIAMgATYCFCADIAA2AgwMiwELQdQAIQIMcQsgAy0AKUEiRg2GAUHTACECDHALQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALIABFBEBB1QAhAgxwCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQaQNNgIQIANBITYCDEEAIQIMiQELIANB4QA2AhwgAyABNgIUIANB0Bo2AhAgA0EVNgIMQQAhAgyIAQsgASAERgRAQeAAIQIMiAELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HSACECDHALIANBADYCHCADIAE2AhQgA0G2ETYCECADQQk2AgxBACECDIgBCyADQQA2AhwgAyABNgIUIANBthE2AhAgA0EJNgIMQQAhAgyHAQsgASAERgRAQd8AIQIMhwELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBthE2AhAgA0ECNgIMQQAhAgyGAQsgASAERgRAQd0AIQIMhgELIAEtAAAiAkENRgRAIAFBAWohAUHQACECDG0LIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyFAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0HKLTYCECADQQc2AgwMgwELIAEgBEYEQEHbACECDIMBCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc4AIQIMaAsgASAERgRAQdoAIQIMgQELIAEtAABBCWsOBAABAQABC0EAIQIgA0EANgIcIANBmhI2AhAgA0EHNgIMIAMgAUEBajYCFAx/CyADQYASOwEqQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB2QA2AhwgAyABNgIUIANB6ho2AhAgA0EVNgIMQQAhAgx+C0HNACECDGQLIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDHwLIAEgBEYEQEHZACECDHwLIAEtAABBIEcNPSABQQFqIQEgAy0ALkEBcQ09IANBADYCHCADIAE2AhQgA0HCHDYCECADQR42AgxBACECDHsLIAEgBEYEQEHYACECDHsLAkACQAJAAkACQCABLQAAIgBBCmsOBAIDAwABCyABQQFqIQFBLCECDGULIABBOkcNASADQQA2AhwgAyABNgIUIANB5xE2AhAgA0EKNgIMQQAhAgx9CyABQQFqIQEgA0Evai0AAEEBcUUNcyADLQAyQYABcUUEQCADQTJqIQIgAxA1QQAhAAJAIAMoAjgiBkUNACAGKAIoIgZFDQAgAyAGEQAAIQALAkACQCAADhZNTEsBAQEBAQEBAQEBAQEBAQEBAQEAAQsgA0EpNgIcIAMgATYCFCADQawZNgIQIANBFTYCDEEAIQIMfgsg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c3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw==';
27630
27870
 
@@ -27652,7 +27892,7 @@ function requireLlhttp_simdWasm () {
27652
27892
  hasRequiredLlhttp_simdWasm = 1;
27653
27893
  (function (module) {
27654
27894
 
27655
- const { Buffer } = require$$0$b;
27895
+ const { Buffer } = require$$0$a;
27656
27896
 
27657
27897
  const wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgLhocCAwd/A34BeyABIAJqIQQCQCAAIgMoAgwiAA0AIAMoAgQEQCADIAE2AgQLIwBBEGsiCSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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DAgLQeMBDAcLQdcBDAYLQdgBDAULQdkBDAQLQdoBDAMLQdsBDAILQd0BDAELQdwBCyECA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAn8CQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAwJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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A0EXNgIcIAMgADYCDCADIAFBAWo2AhQM+AILIABBFUYNI0EAIQIgA0EANgIcIAMgATYCFCADQdYMNgIQIANBIzYCDAz3AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQwdCyADQRk2AhwgAyAANgIMIAMgAUEBajYCFAz2AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQzvAgsgA0EaNgIcIAMgADYCDCADIAFBAWo2AhQM9QILIABBFUYNH0EAIQIgA0EANgIcIAMgATYCFCADQdAPNgIQIANBIjYCDAz0AgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDBsLIANBHDYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgzzAgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDOsCCyADQR02AhwgAyAANgIMIAMgAUEBajYCFEEAIQIM8gILIABBO0cNASABQQFqIQELQSYhAgzXAgtBACECIANBADYCHCADIAE2AhQgA0GfFTYCECADQQw2AgwM7wILIAEgBEcEQANAIAEtAABBIEcNhAIgBCABQQFqIgFHDQALQSwhAgzvAgtBLCECDO4CCyABIARGBEBBNCECDO4CCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtBNCECDO8CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUNnwIgA0EyNgIcIAMgATYCFCADIAA2AgxBACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUEQCABQQFqIQEMnwILIANBMjYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgztAgsgASAERwRAAkADQCABLQAAQTBrIgBB/wFxQQpPBEBBOiECDNcCCyADKQMgIgtCmbPmzJmz5swZVg0BIAMgC0IKfiIKNwMgIAogAK1C/wGDIgtCf4VWDQEgAyAKIAt8NwMgIAQgAUEBaiIBRw0AC0HAACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABQQFqIgEQMSIADRcM4gILQcAAIQIM7AILIAEgBEYEQEHJACECDOwCCwJAA0ACQCABLQAAQQlrDhgAAqICogKpAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAgCiAgsgBCABQQFqIgFHDQALQckAIQIM7AILIAFBAWohASADQS9qLQAAQQFxDaUCIANBADYCHCADIAE2AhQgA0GXEDYCECADQQo2AgxBACECDOsCCyABIARHBEADQCABLQAAQSBHDRUgBCABQQFqIgFHDQALQfgAIQIM6wILQfgAIQIM6gILIANBAjoAKAw4C0EAIQIgA0EANgIcIANBvws2AhAgA0ECNgIMIAMgAUEBajYCFAzoAgtBACECDM4CC0ENIQIMzQILQRMhAgzMAgtBFSECDMsCC0EWIQIMygILQRghAgzJAgtBGSECDMgCC0EaIQIMxwILQRshAgzGAgtBHCECDMUCC0EdIQIMxAILQR4hAgzDAgtBHyECDMICC0EgIQIMwQILQSIhAgzAAgtBIyECDL8CC0ElIQIMvgILQeUAIQIMvQILIANBPTYCHCADIAE2AhQgAyAANgIMQQAhAgzVAgsgA0EbNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIM1AILIANBIDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNMCCyADQRM2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzSAgsgA0ELNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0QILIANBEDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNACCyADQSA2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzPAgsgA0ELNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzgILIANBDDYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM0CC0EAIQIgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDAzMAgsCQANAAkAgAS0AAEEKaw4EAAICAAILIAQgAUEBaiIBRw0AC0H9ASECDMwCCwJAAkAgAy0ANkEBRw0AQQAhAAJAIAMoAjgiAkUNACACKAJgIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB/AE2AhwgAyABNgIUIANB3Bk2AhAgA0EVNgIMQQAhAgzNAgtB3AEhAgyzAgsgA0EANgIcIAMgATYCFCADQfkLNgIQIANBHzYCDEEAIQIMywILAkACQCADLQAoQQFrDgIEAQALQdsBIQIMsgILQdQBIQIMsQILIANBAjoAMUEAIQACQCADKAI4IgJFDQAgAigCACICRQ0AIAMgAhEAACEACyAARQRAQd0BIQIMsQILIABBFUcEQCADQQA2AhwgAyABNgIUIANBtAw2AhAgA0EQNgIMQQAhAgzKAgsgA0H7ATYCHCADIAE2AhQgA0GBGjYCECADQRU2AgxBACECDMkCCyABIARGBEBB+gEhAgzJAgsgAS0AAEHIAEYNASADQQE6ACgLQcABIQIMrgILQdoBIQIMrQILIAEgBEcEQCADQQw2AgggAyABNgIEQdkBIQIMrQILQfkBIQIMxQILIAEgBEYEQEH4ASECDMUCCyABLQAAQcgARw0EIAFBAWohAUHYASECDKsCCyABIARGBEBB9wEhAgzEAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQdYBIQIMqwILIAFBAWohAUHXASECDKoCC0H2ASECIAEgBEYNwgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABButUAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMwwILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgBFBEBB4wEhAgyqAgsgA0H1ATYCHCADIAE2AhQgAyAANgIMQQAhAgzCAgtB9AEhAiABIARGDcECIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjVAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMICCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB5R82AhAgA0EINgIMDL8CC0HVASECDKUCCyADQfMBNgIcIAMgATYCFCADIAA2AgxBACECDL0CC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ1uIABBFUcEQCADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgy9AgsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDLwCCyABIARHBEAgA0ENNgIIIAMgATYCBEHTASECDKMCC0HyASECDLsCCyABIARGBEBB8QEhAgy7AgsCQAJAAkAgAS0AAEHIAGsOCwABCAgICAgICAgCCAsgAUEBaiEBQdABIQIMowILIAFBAWohAUHRASECDKICCyABQQFqIQFB0gEhAgyhAgtB8AEhAiABIARGDbkCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEG11QBqLQAARw0EIABBAkYNAyAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy5AgtB7wEhAiABIARGDbgCIAMoAgAiACAEIAFraiEGIAEgAGtBAWohBQNAIAEtAAAgAEGz1QBqLQAARw0DIABBAUYNAiAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy4AgtB7gEhAiABIARGDbcCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEGw1QBqLQAARw0CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy3AgsgAygCBCEAIANCADcDACADIAAgBUEBaiIBECsiAEUNAiADQewBNgIcIAMgATYCFCADIAA2AgxBACECDLYCCyADQQA2AgALIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ2cAiADQe0BNgIcIAMgATYCFCADIAA2AgxBACECDLQCC0HPASECDJoCC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMtAILQc4BIQIMmgILIANB6wE2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyyAgsgASAERgRAQesBIQIMsgILIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMsQILQc0BIQIMlwILIAEgBEcEQCADQQ42AgggAyABNgIEQcwBIQIMlwILQeoBIQIMrwILIAEgBEYEQEHpASECDK8CCyABLQAAQTBrIgBB/wFxQQpJBEAgAyAAOgAqIAFBAWohAUHLASECDJYCCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNlwIgA0HoATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgASAERgRAQecBIQIMrgILAkAgAS0AAEEuRgRAIAFBAWohAQwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmAIgA0HmATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgtBygEhAgyUAgsgASAERgRAQeUBIQIMrQILQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDK8CCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmgIgA0HjATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5AE2AhwgAyABNgIUIAMgADYCDAytAgtByQEhAgyTAgtBACEAAkAgAygCOCICRQ0AIAIoAkQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GkDTYCECADQSE2AgxBACECDK0CC0HIASECDJMCCyADQeEBNgIcIAMgATYCFCADQdAaNgIQIANBFTYCDEEAIQIMqwILIAEgBEYEQEHhASECDKsCCwJAIAEtAABBIEYEQCADQQA7ATQgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GZETYCECADQQk2AgxBACECDKsCC0HHASECDJECCyABIARGBEBB4AEhAgyqAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKsCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyqAgtBxgEhAgyQAgsgASAERgRAQd8BIQIMqQILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyqAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqQILQcUBIQIMjwILIAEgBEYEQEHeASECDKgCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqQILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKgCC0HEASECDI4CCyABIARGBEBB3QEhAgynAgsCQAJAAkACQCABLQAAQQprDhcCAwMAAwMDAwMDAwMDAwMDAwMDAwMDAQMLIAFBAWoMBQsgAUEBaiEBQcMBIQIMjwILIAFBAWohASADQS9qLQAAQQFxDQggA0EANgIcIAMgATYCFCADQY0LNgIQIANBDTYCDEEAIQIMpwILIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKYCCyABIARHBEAgA0EPNgIIIAMgATYCBEEBIQIMjQILQdwBIQIMpQILAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0HbASECDKYCCyADKAIEIQAgA0EANgIEIAMgACABEC0iAEUEQCABQQFqIQEMBAsgA0HaATYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgylAgsgAygCBCEAIANBADYCBCADIAAgARAtIgANASABQQFqCyEBQcEBIQIMigILIANB2QE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMogILQcIBIQIMiAILIANBL2otAABBAXENASADQQA2AhwgAyABNgIUIANB5Bw2AhAgA0EZNgIMQQAhAgygAgsgASAERgRAQdkB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CyADIAU2AgAMkAILIANBADYCACAGQQFqIQFBGgw8C0HKASECIAEgBEYNjgIgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBjdUAai0AAEcNOyAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMjwILIANBADYCACAGQQFqIQFBIQw7CyABIARGBEBByQEhAgyOAgsCQAJAIAEtAABBwQBrDhQAPT09PT09PT09PT09PT09PT09AT0LIAFBAWohAUGtASECDPUBCyABQQFqIQFBsAEhAgz0AQsgASAERgRAQcgBIQIMjQILAkACQCABLQAAQdUAaw4LADw8PDw8PDw8PAE8CyABQQFqIQFBrgEhAgz0AQsgAUEBaiEBQa8BIQIM8wELQccBIQIgASAERg2LAiADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw04IABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyMAgsgA0EANgIAIAZBAWohAUEqDDgLIAEgBEYEQEHGASECDIsCCyABLQAAQdAARw04IAFBAWohAUElDDcLQcUBIQIgASAERg2JAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGB1QBqLQAARw02IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyKAgsgA0EANgIAIAZBAWohAUEODDYLIAEgBEYEQEHEASECDIkCCyABLQAAQcUARw02IAFBAWohAUGrASECDO8BCyABIARGBEBBwwEhAgyIAgsCQAJAAkACQCABLQAAQcIAaw4PAAECOTk5OTk5OTk5OTkDOQsgAUEBaiEBQacBIQIM8QELIAFBAWohAUGoASECDPABCyABQQFqIQFBqQEhAgzvAQsgAUEBaiEBQaoBIQIM7gELQcIBIQIgASAERg2GAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEH+1ABqLQAARw0zIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyHAgsgA0EANgIAIAZBAWohAUEUDDMLQcEBIQIgASAERg2FAiADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANA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BTYCAAzsAQsgA0EANgIAIAZBAWohAUEXDBgLQaYBIQIgASAERg3qASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHB1ABqLQAARw0XIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzrAQsgA0EANgIAIAZBAWohAUEYDBcLIAEgBEYEQEGlASECDOoBCwJAAkAgAS0AAEHJAGsOBwAZGRkZGQEZCyABQQFqIQFBiwEhAgzRAQsgAUEBaiEBQYwBIQIM0AELQaQBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm1QBqLQAARw0VIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEJDBULQaMBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk1QBqLQAARw0UIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEfDBQLQaIBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEG+1ABqLQAARw0TIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUECDBMLQaEBIQIgASAERg3lASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYDQCABLQAAIABBvNQAai0AAEcNESAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5QELIAEgBEYEQEGgASECDOUBC0EBIAEtAABB3wBHDREaIAFBAWohAUGHASECDMsBCyADQQA2AgAgBkEBaiEBQYgBIQIMygELQZ8BIQIgASAERg3iASADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw0PIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzjAQsgA0EANgIAIAZBAWohAUEpDA8LQZ4BIQIgASAERg3hASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEG41ABqLQAARw0OIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAziAQsgA0EANgIAIAZBAWohAUEtDA4LIAEgBEYEQEGdASECDOEBCyABLQAAQcUARw0OIAFBAWohAUGEASECDMcBCyABIARGBEBBnAEhAgzgAQsCQAJAIAEtAABBzABrDggADw8PDw8PAQ8LIAFBAWohAUGCASECDMcBCyABQQFqIQFBgwEhAgzGAQtBmwEhAiABIARGDd4BIAMoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQbPUAGotAABHDQsgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN8BCyADQQA2AgAgBkEBaiEBQSMMCwtBmgEhAiABIARGDd0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDUAGotAABHDQogAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN4BCyADQQA2AgAgBkEBaiEBQQAMCgsgASAERgRAQZkBIQIM3QELAkACQCABLQAAQcgAaw4IAAwMDAwMDAEMCyABQQFqIQFB/QAhAgzEAQsgAUEBaiEBQYABIQIMwwELIAEgBEYEQEGYASECDNwBCwJAAkAgAS0AAEHOAGsOAwALAQsLIAFBAWohAUH+ACECDMMBCyABQQFqIQFB/wAhAgzCAQsgASAERgRAQZcBIQIM2wELIAEtAABB2QBHDQggAUEBaiEBQQgMBwtBlgEhAiABIARGDdkBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazUAGotAABHDQYgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNoBCyADQQA2AgAgBkEBaiEBQQUMBgtBlQEhAiABIARGDdgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQabUAGotAABHDQUgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNkBCyADQQA2AgAgBkEBaiEBQRYMBQtBlAEhAiABIARGDdcBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDQQgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyADQQA2AgAgBkEBaiEBQRAMBAsgASAERgRAQZMBIQIM1wELAkACQCABLQAAQcMAaw4MAAYGBgYGBgYGBgYBBgsgAUEBaiEBQfkAIQIMvgELIAFBAWohAUH6ACECDL0BC0GSASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBoNQAai0AAEcNAiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBJAwCCyADQQA2AgAMAgsgASAERgRAQZEBIQIM1AELIAEtAABBzABHDQEgAUEBaiEBQRMLOgApIAMoAgQhACADQQA2AgQgAyAAIAEQLiIADQIMAQtBACECIANBADYCHCADIAE2AhQgA0H+HzYCECADQQY2AgwM0QELQfgAIQIMtwELIANBkAE2AhwgAyABNgIUIAMgADYCDEEAIQIMzwELQQAhAAJAIAMoAjgiAkUNACACKAJAIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GCDzYCECADQSA2AgxBACECDM4BC0H3ACECDLQBCyADQY8BNgIcIAMgATYCFCADQewbNgIQIANBFTYCDEEAIQIMzAELIAEgBEYEQEGPASECDMwBCwJAIAEtAABBIEYEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQZsfNgIQIANBBjYCDEEAIQIMzAELQQIhAgyyAQsDQCABLQAAQSBHDQIgBCABQQFqIgFHDQALQY4BIQIMygELIAEgBEYEQEGNASECDMoBCwJAIAEtAABBCWsOBEoAAEoAC0H1ACECDLABCyADLQApQQVGBEBB9gAhAgywAQtB9AAhAgyvAQsgASAERgRAQYwBIQIMyAELIANBEDYCCCADIAE2AgQMCgsgASAERgRAQYsBIQIMxwELAkAgAS0AAEEJaw4ERwAARwALQfMAIQIMrQELIAEgBEcEQCADQRA2AgggAyABNgIEQfEAIQIMrQELQYoBIQIMxQELAkAgASAERwRAA0AgAS0AAEGg0ABqLQAAIgBBA0cEQAJAIABBAWsOAkkABAtB8AAhAgyvAQsgBCABQQFqIgFHDQALQYgBIQIMxgELQYgBIQIMxQELIANBADYCHCADIAE2AhQgA0HbIDYCECADQQc2AgxBACECDMQBCyABIARGBEBBiQEhAgzEAQsCQAJAAkAgAS0AAEGg0gBqLQAAQQFrDgNGAgABC0HyACECDKwBCyADQQA2AhwgAyABNgIUIANBtBI2AhAgA0EHNgIMQQAhAgzEAQtB6gAhAgyqAQsgASAERwRAIAFBAWohAUHvACECDKoBC0GHASECDMIBCyAEIAEiAEYEQEGGASECDMIBCyAALQAAIgFBL0YEQCAAQQFqIQFB7gAhAgypAQsgAUEJayICQRdLDQEgACEBQQEgAnRBm4CABHENQQwBCyAEIAEiAEYEQEGFASECDMEBCyAALQAAQS9HDQAgAEEBaiEBDAMLQQAhAiADQQA2AhwgAyAANgIUIANB2yA2AhAgA0EHNgIMDL8BCwJAAkACQAJAAkADQCABLQAAQaDOAGotAAAiAEEFRwRAAkACQCAAQQFrDghHBQYHCAAEAQgLQesAIQIMrQELIAFBAWohAUHtACECDKwBCyAEIAFBAWoiAUcNAAtBhAEhAgzDAQsgAUEBagwUCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDMEBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDMABCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDL8BCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy+AQsgASAERgRAQYMBIQIMvgELAkAgAS0AAEGgzgBqLQAAQQFrDgg+BAUGAAgCAwcLIAFBAWohAQtBAyECDKMBCyABQQFqDA0LQQAhAiADQQA2AhwgA0HREjYCECADQQc2AgwgAyABQQFqNgIUDLoBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDLkBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDLgBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDLcBCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy2AQtB7AAhAgycAQsgASAERgRAQYIBIQIMtQELIAFBAWoMAgsgASAERgRAQYEBIQIMtAELIAFBAWoMAQsgASAERg0BIAFBAWoLIQFBBCECDJgBC0GAASECDLABCwNAIAEtAABBoMwAai0AACIAQQJHBEAgAEEBRwRAQekAIQIMmQELDDELIAQgAUEBaiIBRw0AC0H/ACECDK8BCyABIARGBEBB/gAhAgyvAQsCQCABLQAAQQlrDjcvAwYvBAYGBgYGBgYGBgYGBgYGBgYGBgUGBgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYABgsgAUEBagshAUEFIQIMlAELIAFBAWoMBgsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgypAQsgA0EANgIcIAMgATYCFCADQY0UNgIQIANBBzYCDEEAIQIMqAELAkACQAJAAkADQCABLQAAQaDKAGotAAAiAEEFRwRAAkAgAEEBaw4GLgMEBQYABgtB6AAhAgyUAQsgBCABQQFqIgFHDQALQf0AIQIMqwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMqgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMqQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMqAELIANBADYCHCADIAE2AhQgA0HkCDYCECADQQc2AgxBACECDKcBCyABIARGDQEgAUEBagshAUEGIQIMjAELQfwAIQIMpAELAkACQAJAAkADQCABLQAAQaDIAGotAAAiAEEFRwRAIABBAWsOBCkCAwQFCyAEIAFBAWoiAUcNAAtB+wAhAgynAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgymAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgylAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgykAQsgA0EANgIcIAMgATYCFCADQbwKNgIQIANBBzYCDEEAIQIMowELQc8AIQIMiQELQdEAIQIMiAELQecAIQIMhwELIAEgBEYEQEH6ACECDKABCwJAIAEtAABBCWsOBCAAACAACyABQQFqIQFB5gAhAgyGAQsgASAERgRAQfkAIQIMnwELAkAgAS0AAEEJaw4EHwAAHwALQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFBEBB4gEhAgyGAQsgAEEVRwRAIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDJ8BCyADQfgANgIcIAMgATYCFCADQeoaNgIQIANBFTYCDEEAIQIMngELIAEgBEcEQCADQQ02AgggAyABNgIEQeQAIQIMhQELQfcAIQIMnQELIAEgBEYEQEH2ACECDJ0BCwJAAkACQCABLQAAQcgAaw4LAAELCwsLCwsLCwILCyABQQFqIQFB3QAhAgyFAQsgAUEBaiEBQeAAIQIMhAELIAFBAWohAUHjACECDIMBC0H1ACECIAEgBEYNmwEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBtdUAai0AAEcNCCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMnAELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfQANgIcIAMgATYCFCADIAA2AgxBACECDJwBC0HiACECDIIBC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMnAELQeEAIQIMggELIANB8wA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyaAQsgAy0AKSIAQSNrQQtJDQkCQCAAQQZLDQBBASAAdEHKAHFFDQAMCgtBACECIANBADYCHCADIAE2AhQgA0HtCTYCECADQQg2AgwMmQELQfIAIQIgASAERg2YASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGz1QBqLQAARw0FIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyZAQsgAygCBCEAIANCADcDACADIAAgBkEBaiIBECsiAARAIANB8QA2AhwgAyABNgIUIAMgADYCDEEAIQIMmQELQd8AIQIMfwtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJkBC0HeACECDH8LIANB8AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyXAQsgAy0AKUEhRg0GIANBADYCHCADIAE2AhQgA0GRCjYCECADQQg2AgxBACECDJYBC0HvACECIAEgBEYNlQEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMlgELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgBFDQIgA0HtADYCHCADIAE2AhQgAyAANgIMQQAhAgyVAQsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNgAEgA0HuADYCHCADIAE2AhQgAyAANgIMQQAhAgyTAQtB3AAhAgx5C0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMkwELQdsAIQIMeQsgA0HsADYCHCADIAE2AhQgA0GAGzYCECADQRU2AgxBACECDJEBCyADLQApIgBBI0kNACAAQS5GDQAgA0EANgIcIAMgATYCFCADQckJNgIQIANBCDYCDEEAIQIMkAELQdoAIQIMdgsgASAERgRAQesAIQIMjwELAkAgAS0AAEEvRgRAIAFBAWohAQwBCyAD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ciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw==';
27658
27898
 
@@ -28752,7 +28992,7 @@ function requireRuntimeFeatures () {
28752
28992
  const lazyLoaders = {
28753
28993
  __proto__: null,
28754
28994
  'node:crypto': () => crypto,
28755
- 'node:sqlite': () => require$$1$4,
28995
+ 'node:sqlite': () => require$$1$5,
28756
28996
  'node:worker_threads': () => require$$2$4,
28757
28997
  'node:zlib': () => require$$3$4
28758
28998
  };
@@ -29068,10 +29308,10 @@ function requireWebidl () {
29068
29308
  } else {
29069
29309
  // 3. Otherwise:
29070
29310
 
29071
- // 1. Let lowerBound be -2^bitLength − 1.
29072
- lowerBound = Math.pow(-2, bitLength) - 1;
29311
+ // 1. Let lowerBound be -2^(bitLength − 1).
29312
+ lowerBound = -Math.pow(2, bitLength - 1);
29073
29313
 
29074
- // 2. Let upperBound be 2^bitLength − 1 − 1.
29314
+ // 2. Let upperBound be 2^(bitLength − 1) − 1.
29075
29315
  upperBound = Math.pow(2, bitLength - 1) - 1;
29076
29316
  }
29077
29317
 
@@ -29150,9 +29390,9 @@ function requireWebidl () {
29150
29390
  // 10. Set x to x modulo 2^bitLength.
29151
29391
  x = x % Math.pow(2, bitLength);
29152
29392
 
29153
- // 11. If signedness is "signed" and x ≥ 2^bitLength − 1,
29393
+ // 11. If signedness is "signed" and x ≥ 2^(bitLength − 1),
29154
29394
  // then return x − 2^bitLength.
29155
- if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) {
29395
+ if (signedness === 'signed' && x >= Math.pow(2, bitLength - 1)) {
29156
29396
  return x - Math.pow(2, bitLength)
29157
29397
  }
29158
29398
 
@@ -29330,6 +29570,9 @@ function requireWebidl () {
29330
29570
  };
29331
29571
 
29332
29572
  webidl.dictionaryConverter = function (converters) {
29573
+ // "For each dictionary member member declared on dictionary, in lexicographical order:"
29574
+ converters.sort((a, b) => (a.key > b.key) - (a.key < b.key));
29575
+
29333
29576
  return (dictionary, prefix, argument) => {
29334
29577
  const dict = {};
29335
29578
 
@@ -31335,8 +31578,10 @@ function requireUtil$4 () {
31335
31578
  * @param {object|string} navigable
31336
31579
  */
31337
31580
  function isTraversableNavigable (navigable) {
31338
- // TODO
31339
- return true
31581
+ // Returns true only if we have an actual traversable navigable object
31582
+ // that can prompt the user for credentials. In Node.js, this will always
31583
+ // be false since there's no Window object or navigable.
31584
+ return navigable != null && navigable !== 'client' && navigable !== 'no-traversable'
31340
31585
  }
31341
31586
 
31342
31587
  class EnvironmentSettingsObjectBase {
@@ -31687,10 +31932,10 @@ function requireFormdataParser () {
31687
31932
  const { webidl } = requireWebidl();
31688
31933
  const assert = require$$0$7;
31689
31934
  const { isomorphicDecode } = requireInfra();
31690
- const { utf8DecodeBytes } = requireEncoding$1();
31691
31935
 
31692
31936
  const dd = Buffer.from('--');
31693
31937
  const decoder = new TextDecoder();
31938
+ const decoderIgnoreBOM = new TextDecoder('utf-8', { ignoreBOM: true });
31694
31939
 
31695
31940
  /**
31696
31941
  * @param {string} chars
@@ -31869,7 +32114,7 @@ function requireFormdataParser () {
31869
32114
  // 5.11. Otherwise:
31870
32115
 
31871
32116
  // 5.11.1. Let value be the UTF-8 decoding without BOM of body.
31872
- value = utf8DecodeBytes(Buffer.from(body));
32117
+ value = decoderIgnoreBOM.decode(Buffer.from(body));
31873
32118
  }
31874
32119
 
31875
32120
  // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object.
@@ -31885,7 +32130,7 @@ function requireFormdataParser () {
31885
32130
  * Parses content-disposition attributes (e.g., name="value" or filename*=utf-8''encoded)
31886
32131
  * @param {Buffer} input
31887
32132
  * @param {{ position: number }} position
31888
- * @returns {{ name: string, value: string }}
32133
+ * @returns {{ name: string, value: string, extended: boolean } | null}
31889
32134
  */
31890
32135
  function parseContentDispositionAttribute (input, position) {
31891
32136
  // Skip leading semicolon and whitespace
@@ -31985,7 +32230,7 @@ function requireFormdataParser () {
31985
32230
  value = decoder.decode(tokenValue);
31986
32231
  }
31987
32232
 
31988
- return { name: attrNameStr, value }
32233
+ return { name: attrNameStr, value, extended: isExtended }
31989
32234
  }
31990
32235
 
31991
32236
  /**
@@ -32049,6 +32294,9 @@ function requireFormdataParser () {
32049
32294
  switch (bufferToLowerCasedHeaderName(headerName)) {
32050
32295
  case 'content-disposition': {
32051
32296
  name = filename = null;
32297
+ // Track whether filename was set from the extended (RFC 5987) form so
32298
+ // a subsequent legacy `filename` attribute does not override it.
32299
+ let filenameIsExtended = false;
32052
32300
 
32053
32301
  // Collect the disposition type (should be "form-data")
32054
32302
  const dispositionType = collectASequenceOfBytes(
@@ -32064,8 +32312,8 @@ function requireFormdataParser () {
32064
32312
  // Parse attributes recursively until CRLF
32065
32313
  while (
32066
32314
  position.position < input.length &&
32067
- input[position.position] !== 0x0d &&
32068
- input[position.position + 1] !== 0x0a
32315
+ (input[position.position] !== 0x0d ||
32316
+ input[position.position + 1] !== 0x0a)
32069
32317
  ) {
32070
32318
  const attribute = parseContentDispositionAttribute(input, position);
32071
32319
 
@@ -32076,7 +32324,15 @@ function requireFormdataParser () {
32076
32324
  if (attribute.name === 'name') {
32077
32325
  name = attribute.value;
32078
32326
  } else if (attribute.name === 'filename') {
32079
- filename = attribute.value;
32327
+ // Per RFC 5987 §4.1, when both legacy and extended forms of the
32328
+ // same parameter are present, the extended (filename*) form takes
32329
+ // precedence regardless of the order they appear in.
32330
+ if (attribute.extended) {
32331
+ filename = attribute.value;
32332
+ filenameIsExtended = true;
32333
+ } else if (!filenameIsExtended) {
32334
+ filename = attribute.value;
32335
+ }
32080
32336
  }
32081
32337
  }
32082
32338
 
@@ -32129,7 +32385,7 @@ function requireFormdataParser () {
32129
32385
 
32130
32386
  // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A
32131
32387
  // (CR LF), return failure. Otherwise, advance position by 2 (past the newline).
32132
- if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) {
32388
+ if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {
32133
32389
  throw parsingError('expected CRLF')
32134
32390
  } else {
32135
32391
  position.position += 2;
@@ -32874,6 +33130,9 @@ function requireClientH1 () {
32874
33130
  const EMPTY_BUF = Buffer.alloc(0);
32875
33131
  const FastBuffer = Buffer[Symbol.species];
32876
33132
  const removeAllListeners = util.removeAllListeners;
33133
+ const kIdleSocketValidation = Symbol('kIdleSocketValidation');
33134
+ const kIdleSocketValidationTimeout = Symbol('kIdleSocketValidationTimeout');
33135
+ const kSocketUsed = Symbol('kSocketUsed');
32877
33136
 
32878
33137
  let extractBody;
32879
33138
 
@@ -32886,9 +33145,9 @@ function requireClientH1 () {
32886
33145
  let useWasmSIMD = process.arch !== 'ppc64';
32887
33146
  // The Env Variable UNDICI_NO_WASM_SIMD allows explicitly overriding the default behavior
32888
33147
  if (process.env.UNDICI_NO_WASM_SIMD === '1') {
32889
- useWasmSIMD = true;
32890
- } else if (process.env.UNDICI_NO_WASM_SIMD === '0') {
32891
33148
  useWasmSIMD = false;
33149
+ } else if (process.env.UNDICI_NO_WASM_SIMD === '0') {
33150
+ useWasmSIMD = true;
32892
33151
  }
32893
33152
 
32894
33153
  if (useWasmSIMD) {
@@ -33033,6 +33292,7 @@ function requireClientH1 () {
33033
33292
  */
33034
33293
  this.socket = socket;
33035
33294
  this.timeout = null;
33295
+ this.timeoutWeakRef = new WeakRef(this);
33036
33296
  this.timeoutValue = null;
33037
33297
  this.timeoutType = null;
33038
33298
  this.statusCode = 0;
@@ -33070,9 +33330,9 @@ function requireClientH1 () {
33070
33330
 
33071
33331
  if (delay) {
33072
33332
  if (type & USE_FAST_TIMER) {
33073
- this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this));
33333
+ this.timeout = timers.setFastTimeout(onParserTimeout, delay, this.timeoutWeakRef);
33074
33334
  } else {
33075
- this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this));
33335
+ this.timeout = setTimeout(onParserTimeout, delay, this.timeoutWeakRef);
33076
33336
  this.timeout?.unref();
33077
33337
  }
33078
33338
  }
@@ -33166,16 +33426,7 @@ function requireClientH1 () {
33166
33426
  this.paused = true;
33167
33427
  socket.unshift(data);
33168
33428
  } else {
33169
- const ptr = llhttp.llhttp_get_error_reason(this.ptr);
33170
- let message = '';
33171
- if (ptr) {
33172
- const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0);
33173
- message =
33174
- 'Response does not match the HTTP/1.1 protocol (' +
33175
- Buffer.from(llhttp.memory.buffer, ptr, len).toString() +
33176
- ')';
33177
- }
33178
- throw new HTTPParserError(message, constants.ERROR[ret], data)
33429
+ throw this.createError(ret, data)
33179
33430
  }
33180
33431
  }
33181
33432
  } catch (err) {
@@ -33183,6 +33434,54 @@ function requireClientH1 () {
33183
33434
  }
33184
33435
  }
33185
33436
 
33437
+ finish () {
33438
+ assert(currentParser === null);
33439
+ assert(this.ptr != null);
33440
+ assert(!this.paused);
33441
+
33442
+ const { llhttp } = this;
33443
+
33444
+ let ret;
33445
+
33446
+ try {
33447
+ currentParser = this;
33448
+ ret = llhttp.llhttp_finish(this.ptr);
33449
+ } finally {
33450
+ currentParser = null;
33451
+ }
33452
+
33453
+ if (ret === constants.ERROR.OK) {
33454
+ return null
33455
+ }
33456
+
33457
+ if (ret === constants.ERROR.PAUSED || ret === constants.ERROR.PAUSED_UPGRADE) {
33458
+ this.paused = true;
33459
+ return null
33460
+ }
33461
+
33462
+ return this.createError(ret, EMPTY_BUF)
33463
+ }
33464
+
33465
+ createError (ret, data) {
33466
+ const { llhttp, contentLength, bytesRead } = this;
33467
+
33468
+ if (contentLength && bytesRead !== parseInt(contentLength, 10)) {
33469
+ return new ResponseContentLengthMismatchError()
33470
+ }
33471
+
33472
+ const ptr = llhttp.llhttp_get_error_reason(this.ptr);
33473
+ let message = '';
33474
+ if (ptr) {
33475
+ const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0);
33476
+ message =
33477
+ 'Response does not match the HTTP/1.1 protocol (' +
33478
+ Buffer.from(llhttp.memory.buffer, ptr, len).toString() +
33479
+ ')';
33480
+ }
33481
+
33482
+ return new HTTPParserError(message, constants.ERROR[ret], data)
33483
+ }
33484
+
33186
33485
  destroy () {
33187
33486
  assert(currentParser === null);
33188
33487
  assert(this.ptr != null);
@@ -33217,6 +33516,11 @@ function requireClientH1 () {
33217
33516
  return -1
33218
33517
  }
33219
33518
 
33519
+ if (client[kRunning] === 0) {
33520
+ util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)));
33521
+ return -1
33522
+ }
33523
+
33220
33524
  const request = client[kQueue][client[kRunningIdx]];
33221
33525
  if (!request) {
33222
33526
  return -1
@@ -33345,6 +33649,11 @@ function requireClientH1 () {
33345
33649
  return -1
33346
33650
  }
33347
33651
 
33652
+ if (client[kRunning] === 0) {
33653
+ util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)));
33654
+ return -1
33655
+ }
33656
+
33348
33657
  const request = client[kQueue][client[kRunningIdx]];
33349
33658
 
33350
33659
  if (!request) {
@@ -33523,6 +33832,7 @@ function requireClientH1 () {
33523
33832
  request.onComplete(headers);
33524
33833
 
33525
33834
  client[kQueue][client[kRunningIdx]++] = null;
33835
+ socket[kSocketUsed] = client[kPending] === 0;
33526
33836
 
33527
33837
  if (socket[kWriting]) {
33528
33838
  assert(client[kRunning] === 0);
@@ -33599,6 +33909,9 @@ function requireClientH1 () {
33599
33909
  socket[kWriting] = false;
33600
33910
  socket[kReset] = false;
33601
33911
  socket[kBlocking] = false;
33912
+ socket[kIdleSocketValidation] = 0;
33913
+ socket[kIdleSocketValidationTimeout] = null;
33914
+ socket[kSocketUsed] = false;
33602
33915
  socket[kParser] = new Parser(client, socket, llhttpInstance);
33603
33916
 
33604
33917
  util.addListener(socket, 'error', onHttpSocketError);
@@ -33641,7 +33954,7 @@ function requireClientH1 () {
33641
33954
  * @returns {boolean}
33642
33955
  */
33643
33956
  busy (request) {
33644
- if (socket[kWriting] || socket[kReset] || socket[kBlocking]) {
33957
+ if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) {
33645
33958
  return true
33646
33959
  }
33647
33960
 
@@ -33687,8 +34000,11 @@ function requireClientH1 () {
33687
34000
  // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded
33688
34001
  // to the user.
33689
34002
  if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {
33690
- // We treat all incoming data so for as a valid response.
33691
- parser.onMessageComplete();
34003
+ const parserErr = parser.finish();
34004
+ if (parserErr) {
34005
+ this[kError] = parserErr;
34006
+ this[kClient][kOnError](parserErr);
34007
+ }
33692
34008
  return
33693
34009
  }
33694
34010
 
@@ -33705,8 +34021,10 @@ function requireClientH1 () {
33705
34021
  const parser = this[kParser];
33706
34022
 
33707
34023
  if (parser.statusCode && !parser.shouldKeepAlive) {
33708
- // We treat all incoming data so far as a valid response.
33709
- parser.onMessageComplete();
34024
+ const parserErr = parser.finish();
34025
+ if (parserErr) {
34026
+ util.destroy(this, parserErr);
34027
+ }
33710
34028
  return
33711
34029
  }
33712
34030
 
@@ -33716,10 +34034,11 @@ function requireClientH1 () {
33716
34034
  function onHttpSocketClose () {
33717
34035
  const parser = this[kParser];
33718
34036
 
34037
+ clearIdleSocketValidation(this);
34038
+
33719
34039
  if (parser) {
33720
34040
  if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {
33721
- // We treat all incoming data so far as a valid response.
33722
- parser.onMessageComplete();
34041
+ this[kError] = parser.finish() || this[kError];
33723
34042
  }
33724
34043
 
33725
34044
  this[kParser].destroy();
@@ -33763,6 +34082,28 @@ function requireClientH1 () {
33763
34082
  this[kClosed] = true;
33764
34083
  }
33765
34084
 
34085
+ function clearIdleSocketValidation (socket) {
34086
+ if (socket[kIdleSocketValidationTimeout]) {
34087
+ clearTimeout(socket[kIdleSocketValidationTimeout]);
34088
+ socket[kIdleSocketValidationTimeout] = null;
34089
+ }
34090
+
34091
+ socket[kIdleSocketValidation] = 0;
34092
+ }
34093
+
34094
+ function scheduleIdleSocketValidation (client, socket) {
34095
+ socket[kIdleSocketValidation] = 1;
34096
+ socket[kIdleSocketValidationTimeout] = setTimeout(() => {
34097
+ socket[kIdleSocketValidationTimeout] = null;
34098
+ socket[kIdleSocketValidation] = 2;
34099
+
34100
+ if (client[kSocket] === socket && !socket.destroyed) {
34101
+ client[kResume]();
34102
+ }
34103
+ }, 0);
34104
+ socket[kIdleSocketValidationTimeout].unref?.();
34105
+ }
34106
+
33766
34107
  /**
33767
34108
  * @param {import('./client.js')} client
33768
34109
  */
@@ -33780,6 +34121,32 @@ function requireClientH1 () {
33780
34121
  socket[kNoRef] = false;
33781
34122
  }
33782
34123
 
34124
+ if (client[kRunning] === 0 && client[kPending] > 0 && socket[kSocketUsed]) {
34125
+ if (socket[kIdleSocketValidation] === 0) {
34126
+ scheduleIdleSocketValidation(client, socket);
34127
+ socket[kParser].readMore();
34128
+ if (socket.destroyed) {
34129
+ return
34130
+ }
34131
+ return
34132
+ }
34133
+
34134
+ if (socket[kIdleSocketValidation] === 1) {
34135
+ socket[kParser].readMore();
34136
+ if (socket.destroyed) {
34137
+ return
34138
+ }
34139
+ return
34140
+ }
34141
+ }
34142
+
34143
+ if (client[kRunning] === 0) {
34144
+ socket[kParser].readMore();
34145
+ if (socket.destroyed) {
34146
+ return
34147
+ }
34148
+ }
34149
+
33783
34150
  if (client[kSize] === 0) {
33784
34151
  if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) {
33785
34152
  socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE);
@@ -33878,6 +34245,7 @@ function requireClientH1 () {
33878
34245
  }
33879
34246
 
33880
34247
  const socket = client[kSocket];
34248
+ clearIdleSocketValidation(socket);
33881
34249
 
33882
34250
  /**
33883
34251
  * @param {Error} [err]
@@ -33931,6 +34299,10 @@ function requireClientH1 () {
33931
34299
  socket[kBlocking] = true;
33932
34300
  }
33933
34301
 
34302
+ if (socket.setTypeOfService) {
34303
+ socket.setTypeOfService(request.typeOfService);
34304
+ }
34305
+
33934
34306
  let header = `${method} ${path} HTTP/1.1\r\n`;
33935
34307
 
33936
34308
  if (typeof host === 'string') {
@@ -35131,12 +35503,16 @@ function requireClientH2 () {
35131
35503
  if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) {
35132
35504
  stream.pause();
35133
35505
  }
35134
- });
35135
35506
 
35136
- stream.on('data', (chunk) => {
35137
- if (request.onData(chunk) === false) {
35138
- stream.pause();
35139
- }
35507
+ stream.on('data', (chunk) => {
35508
+ if (request.aborted || request.completed) {
35509
+ return
35510
+ }
35511
+
35512
+ if (request.onData(chunk) === false) {
35513
+ stream.pause();
35514
+ }
35515
+ });
35140
35516
  });
35141
35517
 
35142
35518
  stream.once('end', () => {
@@ -35198,6 +35574,7 @@ function requireClientH2 () {
35198
35574
  return
35199
35575
  }
35200
35576
 
35577
+ stream.removeAllListeners('data');
35201
35578
  request.onComplete(trailers);
35202
35579
  });
35203
35580
 
@@ -35430,7 +35807,7 @@ function requireClient () {
35430
35807
  hasRequiredClient = 1;
35431
35808
 
35432
35809
  const assert = require$$0$7;
35433
- const net = require$$0$9;
35810
+ const net = require$$1$4;
35434
35811
  const http = require$$2$3;
35435
35812
  const util = requireUtil$5();
35436
35813
  const { ClientStats } = requireStats();
@@ -35498,7 +35875,7 @@ function requireClient () {
35498
35875
  ? () => http.maxHeaderSize
35499
35876
  : () => { throw new InvalidArgumentError('http module not available or http.maxHeaderSize invalid') };
35500
35877
 
35501
- const noop = () => {};
35878
+ const noop = () => { };
35502
35879
 
35503
35880
  function getPipelining (client) {
35504
35881
  return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1
@@ -35543,7 +35920,8 @@ function requireClient () {
35543
35920
  useH2c,
35544
35921
  initialWindowSize,
35545
35922
  connectionWindowSize,
35546
- pingInterval
35923
+ pingInterval,
35924
+ webSocket
35547
35925
  } = {}) {
35548
35926
  if (keepAlive !== undefined) {
35549
35927
  throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')
@@ -35651,7 +36029,7 @@ function requireClient () {
35651
36029
  throw new InvalidArgumentError('pingInterval must be a positive integer, greater or equal to 0')
35652
36030
  }
35653
36031
 
35654
- super();
36032
+ super({ webSocket });
35655
36033
 
35656
36034
  if (typeof connect !== 'function') {
35657
36035
  connect = buildConnector({
@@ -35664,6 +36042,13 @@ function requireClient () {
35664
36042
  ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
35665
36043
  ...connect
35666
36044
  });
36045
+ } else {
36046
+ const customConnect = connect;
36047
+ connect = (opts, callback) => customConnect({
36048
+ ...opts,
36049
+ ...(socketPath != null ? { socketPath } : null),
36050
+ ...(allowH2 != null ? { allowH2 } : null)
36051
+ }, callback);
35667
36052
  }
35668
36053
 
35669
36054
  this[kUrl] = util.parseOrigin(url);
@@ -35876,65 +36261,70 @@ function requireClient () {
35876
36261
  });
35877
36262
  }
35878
36263
 
35879
- client[kConnector]({
35880
- host,
35881
- hostname,
35882
- protocol,
35883
- port,
35884
- servername: client[kServerName],
35885
- localAddress: client[kLocalAddress]
35886
- }, (err, socket) => {
35887
- if (err) {
35888
- handleConnectError(client, err, { host, hostname, protocol, port });
35889
- client[kResume]();
35890
- return
35891
- }
36264
+ try {
36265
+ client[kConnector]({
36266
+ host,
36267
+ hostname,
36268
+ protocol,
36269
+ port,
36270
+ servername: client[kServerName],
36271
+ localAddress: client[kLocalAddress]
36272
+ }, (err, socket) => {
36273
+ if (err) {
36274
+ handleConnectError(client, err, { host, hostname, protocol, port });
36275
+ client[kResume]();
36276
+ return
36277
+ }
35892
36278
 
35893
- if (client.destroyed) {
35894
- util.destroy(socket.on('error', noop), new ClientDestroyedError());
35895
- client[kResume]();
35896
- return
35897
- }
36279
+ if (client.destroyed) {
36280
+ util.destroy(socket.on('error', noop), new ClientDestroyedError());
36281
+ client[kResume]();
36282
+ return
36283
+ }
35898
36284
 
35899
- assert(socket);
36285
+ assert(socket);
35900
36286
 
35901
- try {
35902
- client[kHTTPContext] = socket.alpnProtocol === 'h2'
35903
- ? connectH2(client, socket)
35904
- : connectH1(client, socket);
35905
- } catch (err) {
35906
- socket.destroy().on('error', noop);
35907
- handleConnectError(client, err, { host, hostname, protocol, port });
35908
- client[kResume]();
35909
- return
35910
- }
36287
+ try {
36288
+ client[kHTTPContext] = socket.alpnProtocol === 'h2'
36289
+ ? connectH2(client, socket)
36290
+ : connectH1(client, socket);
36291
+ } catch (err) {
36292
+ socket.destroy().on('error', noop);
36293
+ handleConnectError(client, err, { host, hostname, protocol, port });
36294
+ client[kResume]();
36295
+ return
36296
+ }
35911
36297
 
35912
- client[kConnecting] = false;
36298
+ client[kConnecting] = false;
35913
36299
 
35914
- socket[kCounter] = 0;
35915
- socket[kMaxRequests] = client[kMaxRequests];
35916
- socket[kClient] = client;
35917
- socket[kError] = null;
36300
+ socket[kCounter] = 0;
36301
+ socket[kMaxRequests] = client[kMaxRequests];
36302
+ socket[kClient] = client;
36303
+ socket[kError] = null;
35918
36304
 
35919
- if (channels.connected.hasSubscribers) {
35920
- channels.connected.publish({
35921
- connectParams: {
35922
- host,
35923
- hostname,
35924
- protocol,
35925
- port,
35926
- version: client[kHTTPContext]?.version,
35927
- servername: client[kServerName],
35928
- localAddress: client[kLocalAddress]
35929
- },
35930
- connector: client[kConnector],
35931
- socket
35932
- });
35933
- }
36305
+ if (channels.connected.hasSubscribers) {
36306
+ channels.connected.publish({
36307
+ connectParams: {
36308
+ host,
36309
+ hostname,
36310
+ protocol,
36311
+ port,
36312
+ version: client[kHTTPContext]?.version,
36313
+ servername: client[kServerName],
36314
+ localAddress: client[kLocalAddress]
36315
+ },
36316
+ connector: client[kConnector],
36317
+ socket
36318
+ });
36319
+ }
35934
36320
 
35935
- client.emit('connect', client[kUrl], [client]);
36321
+ client.emit('connect', client[kUrl], [client]);
36322
+ client[kResume]();
36323
+ });
36324
+ } catch (err) {
36325
+ handleConnectError(client, err, { host, hostname, protocol, port });
35936
36326
  client[kResume]();
35937
- });
36327
+ }
35938
36328
  }
35939
36329
 
35940
36330
  function handleConnectError (client, err, { host, hostname, protocol, port }) {
@@ -36034,6 +36424,10 @@ function requireClient () {
36034
36424
 
36035
36425
  const request = client[kQueue][client[kPendingIdx]];
36036
36426
 
36427
+ if (request === null) {
36428
+ return
36429
+ }
36430
+
36037
36431
  if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) {
36038
36432
  if (client[kRunning] > 0) {
36039
36433
  return
@@ -36510,11 +36904,11 @@ function requirePool () {
36510
36904
  });
36511
36905
  }
36512
36906
 
36513
- super();
36907
+ super(options);
36514
36908
 
36515
36909
  this[kConnections] = connections || null;
36516
36910
  this[kUrl] = util.parseOrigin(origin);
36517
- this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl };
36911
+ this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath };
36518
36912
  this[kOptions].interceptors = options.interceptors
36519
36913
  ? { ...options.interceptors }
36520
36914
  : undefined;
@@ -36587,7 +36981,7 @@ function requireBalancedPool () {
36587
36981
  } = requirePoolBase();
36588
36982
  const Pool = requirePool();
36589
36983
  const { kUrl } = requireSymbols();
36590
- const { parseOrigin } = requireUtil$5();
36984
+ const util = requireUtil$5();
36591
36985
  const kFactory = Symbol('factory');
36592
36986
 
36593
36987
  const kOptions = Symbol('options');
@@ -36627,9 +37021,12 @@ function requireBalancedPool () {
36627
37021
  throw new InvalidArgumentError('factory must be a function.')
36628
37022
  }
36629
37023
 
36630
- super();
37024
+ super(opts);
36631
37025
 
36632
- this[kOptions] = opts;
37026
+ this[kOptions] = { ...util.deepClone(opts) };
37027
+ this[kOptions].interceptors = opts.interceptors
37028
+ ? { ...opts.interceptors }
37029
+ : undefined;
36633
37030
  this[kIndex] = -1;
36634
37031
  this[kCurrentWeight] = 0;
36635
37032
 
@@ -36649,7 +37046,7 @@ function requireBalancedPool () {
36649
37046
  }
36650
37047
 
36651
37048
  addUpstream (upstream) {
36652
- const upstreamOrigin = parseOrigin(upstream).origin;
37049
+ const upstreamOrigin = util.parseOrigin(upstream).origin;
36653
37050
 
36654
37051
  if (this[kClients].find((pool) => (
36655
37052
  pool[kUrl].origin === upstreamOrigin &&
@@ -36658,7 +37055,7 @@ function requireBalancedPool () {
36658
37055
  ))) {
36659
37056
  return this
36660
37057
  }
36661
- const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions]));
37058
+ const pool = this[kFactory](upstreamOrigin, this[kOptions]);
36662
37059
 
36663
37060
  this[kAddClient](pool);
36664
37061
  pool.on('connect', () => {
@@ -36698,7 +37095,7 @@ function requireBalancedPool () {
36698
37095
  }
36699
37096
 
36700
37097
  removeUpstream (upstream) {
36701
- const upstreamOrigin = parseOrigin(upstream).origin;
37098
+ const upstreamOrigin = util.parseOrigin(upstream).origin;
36702
37099
 
36703
37100
  const pool = this[kClients].find((pool) => (
36704
37101
  pool[kUrl].origin === upstreamOrigin &&
@@ -36714,7 +37111,7 @@ function requireBalancedPool () {
36714
37111
  }
36715
37112
 
36716
37113
  getUpstream (upstream) {
36717
- const upstreamOrigin = parseOrigin(upstream).origin;
37114
+ const upstreamOrigin = util.parseOrigin(upstream).origin;
36718
37115
 
36719
37116
  return this[kClients].find((pool) => (
36720
37117
  pool[kUrl].origin === upstreamOrigin &&
@@ -36865,7 +37262,7 @@ function requireRoundRobinPool () {
36865
37262
 
36866
37263
  this[kConnections] = connections || null;
36867
37264
  this[kUrl] = util.parseOrigin(origin);
36868
- this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl };
37265
+ this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath };
36869
37266
  this[kOptions].interceptors = options.interceptors
36870
37267
  ? { ...options.interceptors }
36871
37268
  : undefined;
@@ -36977,7 +37374,7 @@ function requireAgent () {
36977
37374
  throw new InvalidArgumentError('maxOrigins must be a number greater than 0')
36978
37375
  }
36979
37376
 
36980
- super();
37377
+ super(options);
36981
37378
 
36982
37379
  if (connect && typeof connect !== 'function') {
36983
37380
  connect = { ...connect };
@@ -37101,6 +37498,924 @@ function requireAgent () {
37101
37498
  return agent;
37102
37499
  }
37103
37500
 
37501
+ var socks5Utils;
37502
+ var hasRequiredSocks5Utils;
37503
+
37504
+ function requireSocks5Utils () {
37505
+ if (hasRequiredSocks5Utils) return socks5Utils;
37506
+ hasRequiredSocks5Utils = 1;
37507
+
37508
+ const { Buffer } = require$$0$a;
37509
+ const net = require$$1$4;
37510
+ const { InvalidArgumentError } = requireErrors();
37511
+
37512
+ /**
37513
+ * Parse an address and determine its type
37514
+ * @param {string} address - The address to parse
37515
+ * @returns {{type: number, buffer: Buffer}} Address type and buffer
37516
+ */
37517
+ function parseAddress (address) {
37518
+ // Check if it's an IPv4 address
37519
+ if (net.isIPv4(address)) {
37520
+ const parts = address.split('.').map(Number);
37521
+ return {
37522
+ type: 0x01, // IPv4
37523
+ buffer: Buffer.from(parts)
37524
+ }
37525
+ }
37526
+
37527
+ // Check if it's an IPv6 address
37528
+ if (net.isIPv6(address)) {
37529
+ return {
37530
+ type: 0x04, // IPv6
37531
+ buffer: parseIPv6(address)
37532
+ }
37533
+ }
37534
+
37535
+ // Otherwise, treat as domain name
37536
+ const domainBuffer = Buffer.from(address, 'utf8');
37537
+ if (domainBuffer.length > 255) {
37538
+ throw new InvalidArgumentError('Domain name too long (max 255 bytes)')
37539
+ }
37540
+
37541
+ return {
37542
+ type: 0x03, // Domain
37543
+ buffer: Buffer.concat([Buffer.from([domainBuffer.length]), domainBuffer])
37544
+ }
37545
+ }
37546
+
37547
+ /**
37548
+ * Parse IPv6 address to buffer
37549
+ * @param {string} address - IPv6 address string
37550
+ * @returns {Buffer} 16-byte buffer
37551
+ */
37552
+ function parseIPv6 (address) {
37553
+ const buffer = Buffer.alloc(16);
37554
+ let normalizedAddress = address;
37555
+
37556
+ // Expand an embedded IPv4 tail into the last two IPv6 groups.
37557
+ if (address.includes('.')) {
37558
+ const lastColonIndex = address.lastIndexOf(':');
37559
+ const ipv4Part = address.slice(lastColonIndex + 1);
37560
+
37561
+ if (net.isIPv4(ipv4Part)) {
37562
+ const octets = ipv4Part.split('.').map(Number);
37563
+ const high = ((octets[0] << 8) | octets[1]).toString(16);
37564
+ const low = ((octets[2] << 8) | octets[3]).toString(16);
37565
+ normalizedAddress = `${address.slice(0, lastColonIndex)}:${high}:${low}`;
37566
+ }
37567
+ }
37568
+
37569
+ // Handle compressed notation (::)
37570
+ const doubleColonIndex = normalizedAddress.indexOf('::');
37571
+ if (doubleColonIndex !== -1) {
37572
+ const before = normalizedAddress.slice(0, doubleColonIndex);
37573
+ const after = normalizedAddress.slice(doubleColonIndex + 2);
37574
+ const beforeParts = before === '' ? [] : before.split(':');
37575
+ const afterParts = after === '' ? [] : after.split(':');
37576
+
37577
+ let bufferIndex = 0;
37578
+ for (const part of beforeParts) {
37579
+ buffer.writeUInt16BE(parseInt(part, 16), bufferIndex);
37580
+ bufferIndex += 2;
37581
+ }
37582
+ bufferIndex = 16 - afterParts.length * 2;
37583
+ for (const part of afterParts) {
37584
+ buffer.writeUInt16BE(parseInt(part, 16), bufferIndex);
37585
+ bufferIndex += 2;
37586
+ }
37587
+ } else {
37588
+ const parts = normalizedAddress.split(':');
37589
+ for (let i = 0; i < parts.length; i++) {
37590
+ buffer.writeUInt16BE(parseInt(parts[i], 16), i * 2);
37591
+ }
37592
+ }
37593
+
37594
+ return buffer
37595
+ }
37596
+
37597
+ /**
37598
+ * Build a SOCKS5 address buffer
37599
+ * @param {number} type - Address type (1=IPv4, 3=Domain, 4=IPv6)
37600
+ * @param {Buffer} addressBuffer - The address data
37601
+ * @param {number} port - Port number
37602
+ * @returns {Buffer} Complete address buffer including type, address, and port
37603
+ */
37604
+ function buildAddressBuffer (type, addressBuffer, port) {
37605
+ const portBuffer = Buffer.allocUnsafe(2);
37606
+ portBuffer.writeUInt16BE(port, 0);
37607
+
37608
+ return Buffer.concat([
37609
+ Buffer.from([type]),
37610
+ addressBuffer,
37611
+ portBuffer
37612
+ ])
37613
+ }
37614
+
37615
+ /**
37616
+ * Parse address from SOCKS5 response
37617
+ * @param {Buffer} buffer - Buffer containing the address
37618
+ * @param {number} offset - Starting offset in buffer
37619
+ * @returns {{address: string, port: number, bytesRead: number}}
37620
+ */
37621
+ function parseResponseAddress (buffer, offset = 0) {
37622
+ if (buffer.length < offset + 1) {
37623
+ throw new InvalidArgumentError('Buffer too small to contain address type')
37624
+ }
37625
+
37626
+ const addressType = buffer[offset];
37627
+ let address;
37628
+ let currentOffset = offset + 1;
37629
+
37630
+ switch (addressType) {
37631
+ case 0x01: { // IPv4
37632
+ if (buffer.length < currentOffset + 6) {
37633
+ throw new InvalidArgumentError('Buffer too small for IPv4 address')
37634
+ }
37635
+ address = Array.from(buffer.subarray(currentOffset, currentOffset + 4)).join('.');
37636
+ currentOffset += 4;
37637
+ break
37638
+ }
37639
+
37640
+ case 0x03: { // Domain
37641
+ if (buffer.length < currentOffset + 1) {
37642
+ throw new InvalidArgumentError('Buffer too small for domain length')
37643
+ }
37644
+ const domainLength = buffer[currentOffset];
37645
+ currentOffset += 1;
37646
+
37647
+ if (buffer.length < currentOffset + domainLength + 2) {
37648
+ throw new InvalidArgumentError('Buffer too small for domain address')
37649
+ }
37650
+ address = buffer.subarray(currentOffset, currentOffset + domainLength).toString('utf8');
37651
+ currentOffset += domainLength;
37652
+ break
37653
+ }
37654
+
37655
+ case 0x04: { // IPv6
37656
+ if (buffer.length < currentOffset + 18) {
37657
+ throw new InvalidArgumentError('Buffer too small for IPv6 address')
37658
+ }
37659
+ // Convert buffer to IPv6 string
37660
+ const parts = [];
37661
+ for (let i = 0; i < 8; i++) {
37662
+ const value = buffer.readUInt16BE(currentOffset + i * 2);
37663
+ parts.push(value.toString(16));
37664
+ }
37665
+ address = parts.join(':');
37666
+ currentOffset += 16;
37667
+ break
37668
+ }
37669
+
37670
+ default:
37671
+ throw new InvalidArgumentError(`Invalid address type: ${addressType}`)
37672
+ }
37673
+
37674
+ // Parse port
37675
+ if (buffer.length < currentOffset + 2) {
37676
+ throw new InvalidArgumentError('Buffer too small for port')
37677
+ }
37678
+ const port = buffer.readUInt16BE(currentOffset);
37679
+ currentOffset += 2;
37680
+
37681
+ return {
37682
+ address,
37683
+ port,
37684
+ bytesRead: currentOffset - offset
37685
+ }
37686
+ }
37687
+
37688
+ /**
37689
+ * Create error for SOCKS5 reply code
37690
+ * @param {number} replyCode - SOCKS5 reply code
37691
+ * @returns {Error} Appropriate error object
37692
+ */
37693
+ function createReplyError (replyCode) {
37694
+ const messages = {
37695
+ 0x01: 'General SOCKS server failure',
37696
+ 0x02: 'Connection not allowed by ruleset',
37697
+ 0x03: 'Network unreachable',
37698
+ 0x04: 'Host unreachable',
37699
+ 0x05: 'Connection refused',
37700
+ 0x06: 'TTL expired',
37701
+ 0x07: 'Command not supported',
37702
+ 0x08: 'Address type not supported'
37703
+ };
37704
+
37705
+ const message = messages[replyCode] || `Unknown SOCKS5 error code: ${replyCode}`;
37706
+ const error = new Error(message);
37707
+ error.code = `SOCKS5_${replyCode}`;
37708
+ return error
37709
+ }
37710
+
37711
+ socks5Utils = {
37712
+ parseAddress,
37713
+ parseIPv6,
37714
+ buildAddressBuffer,
37715
+ parseResponseAddress,
37716
+ createReplyError
37717
+ };
37718
+ return socks5Utils;
37719
+ }
37720
+
37721
+ var socks5Client;
37722
+ var hasRequiredSocks5Client;
37723
+
37724
+ function requireSocks5Client () {
37725
+ if (hasRequiredSocks5Client) return socks5Client;
37726
+ hasRequiredSocks5Client = 1;
37727
+
37728
+ const { EventEmitter } = require$$0$5;
37729
+ const { Buffer } = require$$0$a;
37730
+ const { InvalidArgumentError, Socks5ProxyError } = requireErrors();
37731
+ const { debuglog } = require$$3$3;
37732
+ const { parseAddress } = requireSocks5Utils();
37733
+
37734
+ const debug = debuglog('undici:socks5');
37735
+ const EMPTY_BUFFER = Buffer.alloc(0);
37736
+
37737
+ // SOCKS5 constants
37738
+ const SOCKS_VERSION = 0x05;
37739
+
37740
+ // Authentication methods
37741
+ const AUTH_METHODS = {
37742
+ NO_AUTH: 0x00,
37743
+ GSSAPI: 0x01,
37744
+ USERNAME_PASSWORD: 0x02,
37745
+ NO_ACCEPTABLE: 0xFF
37746
+ };
37747
+
37748
+ // SOCKS5 commands
37749
+ const COMMANDS = {
37750
+ CONNECT: 0x01,
37751
+ BIND: 0x02,
37752
+ UDP_ASSOCIATE: 0x03
37753
+ };
37754
+
37755
+ // Address types
37756
+ const ADDRESS_TYPES = {
37757
+ IPV4: 0x01,
37758
+ DOMAIN: 0x03,
37759
+ IPV6: 0x04
37760
+ };
37761
+
37762
+ // Reply codes
37763
+ const REPLY_CODES = {
37764
+ SUCCEEDED: 0x00,
37765
+ GENERAL_FAILURE: 0x01,
37766
+ CONNECTION_NOT_ALLOWED: 0x02,
37767
+ NETWORK_UNREACHABLE: 0x03,
37768
+ HOST_UNREACHABLE: 0x04,
37769
+ CONNECTION_REFUSED: 0x05,
37770
+ TTL_EXPIRED: 0x06,
37771
+ COMMAND_NOT_SUPPORTED: 0x07,
37772
+ ADDRESS_TYPE_NOT_SUPPORTED: 0x08
37773
+ };
37774
+
37775
+ // State machine states
37776
+ const STATES = {
37777
+ INITIAL: 'initial',
37778
+ HANDSHAKING: 'handshaking',
37779
+ AUTHENTICATING: 'authenticating',
37780
+ AUTHENTICATED: 'authenticated',
37781
+ CONNECTING: 'connecting',
37782
+ CONNECTED: 'connected',
37783
+ ERROR: 'error',
37784
+ CLOSED: 'closed'
37785
+ };
37786
+
37787
+ /**
37788
+ * SOCKS5 client implementation
37789
+ * Handles SOCKS5 protocol negotiation and connection establishment
37790
+ */
37791
+ class Socks5Client extends EventEmitter {
37792
+ constructor (socket, options = {}) {
37793
+ super();
37794
+
37795
+ if (!socket) {
37796
+ throw new InvalidArgumentError('socket is required')
37797
+ }
37798
+
37799
+ this.socket = socket;
37800
+ this.options = options;
37801
+ this.state = STATES.INITIAL;
37802
+ this.buffer = EMPTY_BUFFER;
37803
+ this.onSocketData = this.onData.bind(this);
37804
+ this.onSocketError = this.onError.bind(this);
37805
+ this.onSocketClose = this.onClose.bind(this);
37806
+
37807
+ // Authentication settings
37808
+ this.authMethods = [];
37809
+ if (options.username && options.password) {
37810
+ this.authMethods.push(AUTH_METHODS.USERNAME_PASSWORD);
37811
+ }
37812
+ this.authMethods.push(AUTH_METHODS.NO_AUTH);
37813
+
37814
+ // Socket event handlers
37815
+ this.socket.on('data', this.onSocketData);
37816
+ this.socket.on('error', this.onSocketError);
37817
+ this.socket.on('close', this.onSocketClose);
37818
+ }
37819
+
37820
+ /**
37821
+ * Handle incoming data from the socket
37822
+ */
37823
+ onData (data) {
37824
+ debug('received data', data.length, 'bytes in state', this.state);
37825
+ this.buffer = Buffer.concat([this.buffer, data]);
37826
+
37827
+ try {
37828
+ switch (this.state) {
37829
+ case STATES.HANDSHAKING:
37830
+ this.handleHandshakeResponse();
37831
+ break
37832
+ case STATES.AUTHENTICATING:
37833
+ this.handleAuthResponse();
37834
+ break
37835
+ case STATES.CONNECTING:
37836
+ this.handleConnectResponse();
37837
+ break
37838
+ }
37839
+ } catch (err) {
37840
+ this.onError(err);
37841
+ }
37842
+ }
37843
+
37844
+ /**
37845
+ * Handle socket errors
37846
+ */
37847
+ onError (err) {
37848
+ debug('socket error', err);
37849
+ this.state = STATES.ERROR;
37850
+ this.emit('error', err);
37851
+ this.destroy();
37852
+ }
37853
+
37854
+ /**
37855
+ * Handle socket close
37856
+ */
37857
+ onClose () {
37858
+ debug('socket closed');
37859
+ this.state = STATES.CLOSED;
37860
+ this.emit('close');
37861
+ }
37862
+
37863
+ /**
37864
+ * Destroy the client and underlying socket
37865
+ */
37866
+ destroy () {
37867
+ if (this.socket && !this.socket.destroyed) {
37868
+ this.socket.destroy();
37869
+ }
37870
+ }
37871
+
37872
+ markAuthenticated () {
37873
+ this.state = STATES.AUTHENTICATED;
37874
+ this.emit('authenticated');
37875
+ }
37876
+
37877
+ /**
37878
+ * Start the SOCKS5 handshake
37879
+ */
37880
+ handshake () {
37881
+ if (this.state !== STATES.INITIAL) {
37882
+ throw new InvalidArgumentError('Handshake already started')
37883
+ }
37884
+
37885
+ debug('starting handshake with', this.authMethods.length, 'auth methods');
37886
+ this.state = STATES.HANDSHAKING;
37887
+
37888
+ // Build handshake request
37889
+ // +----+----------+----------+
37890
+ // |VER | NMETHODS | METHODS |
37891
+ // +----+----------+----------+
37892
+ // | 1 | 1 | 1 to 255 |
37893
+ // +----+----------+----------+
37894
+ const request = Buffer.alloc(2 + this.authMethods.length);
37895
+ request[0] = SOCKS_VERSION;
37896
+ request[1] = this.authMethods.length;
37897
+ this.authMethods.forEach((method, i) => {
37898
+ request[2 + i] = method;
37899
+ });
37900
+
37901
+ this.socket.write(request);
37902
+ }
37903
+
37904
+ /**
37905
+ * Handle handshake response from server
37906
+ */
37907
+ handleHandshakeResponse () {
37908
+ if (this.buffer.length < 2) {
37909
+ return // Not enough data yet
37910
+ }
37911
+
37912
+ const version = this.buffer[0];
37913
+ const method = this.buffer[1];
37914
+
37915
+ if (version !== SOCKS_VERSION) {
37916
+ throw new Socks5ProxyError(`Invalid SOCKS version: ${version}`, 'UND_ERR_SOCKS5_VERSION')
37917
+ }
37918
+
37919
+ if (method === AUTH_METHODS.NO_ACCEPTABLE) {
37920
+ throw new Socks5ProxyError('No acceptable authentication method', 'UND_ERR_SOCKS5_AUTH_REJECTED')
37921
+ }
37922
+
37923
+ this.buffer = this.buffer.subarray(2);
37924
+ debug('server selected auth method', method);
37925
+
37926
+ if (method === AUTH_METHODS.NO_AUTH) {
37927
+ this.markAuthenticated();
37928
+ } else if (method === AUTH_METHODS.USERNAME_PASSWORD) {
37929
+ this.state = STATES.AUTHENTICATING;
37930
+ this.sendAuthRequest();
37931
+ } else {
37932
+ throw new Socks5ProxyError(`Unsupported authentication method: ${method}`, 'UND_ERR_SOCKS5_AUTH_METHOD')
37933
+ }
37934
+ }
37935
+
37936
+ /**
37937
+ * Send username/password authentication request
37938
+ */
37939
+ sendAuthRequest () {
37940
+ const { username, password } = this.options;
37941
+
37942
+ if (!username || !password) {
37943
+ throw new InvalidArgumentError('Username and password required for authentication')
37944
+ }
37945
+
37946
+ debug('sending username/password auth');
37947
+
37948
+ // Username/Password authentication request (RFC 1929)
37949
+ // +----+------+----------+------+----------+
37950
+ // |VER | ULEN | UNAME | PLEN | PASSWD |
37951
+ // +----+------+----------+------+----------+
37952
+ // | 1 | 1 | 1 to 255 | 1 | 1 to 255 |
37953
+ // +----+------+----------+------+----------+
37954
+ const usernameBuffer = Buffer.from(username);
37955
+ const passwordBuffer = Buffer.from(password);
37956
+
37957
+ if (usernameBuffer.length > 255 || passwordBuffer.length > 255) {
37958
+ throw new InvalidArgumentError('Username or password too long')
37959
+ }
37960
+
37961
+ const request = Buffer.alloc(3 + usernameBuffer.length + passwordBuffer.length);
37962
+ request[0] = 0x01; // Sub-negotiation version
37963
+ request[1] = usernameBuffer.length;
37964
+ usernameBuffer.copy(request, 2);
37965
+ request[2 + usernameBuffer.length] = passwordBuffer.length;
37966
+ passwordBuffer.copy(request, 3 + usernameBuffer.length);
37967
+
37968
+ this.socket.write(request);
37969
+ }
37970
+
37971
+ /**
37972
+ * Handle authentication response
37973
+ */
37974
+ handleAuthResponse () {
37975
+ if (this.buffer.length < 2) {
37976
+ return // Not enough data yet
37977
+ }
37978
+
37979
+ const version = this.buffer[0];
37980
+ const status = this.buffer[1];
37981
+
37982
+ if (version !== 0x01) {
37983
+ throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version}`, 'UND_ERR_SOCKS5_AUTH_VERSION')
37984
+ }
37985
+
37986
+ if (status !== 0x00) {
37987
+ throw new Socks5ProxyError('Authentication failed', 'UND_ERR_SOCKS5_AUTH_FAILED')
37988
+ }
37989
+
37990
+ this.buffer = this.buffer.subarray(2);
37991
+ debug('authentication successful');
37992
+ this.markAuthenticated();
37993
+ }
37994
+
37995
+ /**
37996
+ * Send CONNECT command
37997
+ * @param {string} address - Target address (IP or domain)
37998
+ * @param {number} port - Target port
37999
+ */
38000
+ connect (address, port) {
38001
+ if (this.state === STATES.CONNECTING || this.state === STATES.CONNECTED) {
38002
+ throw new InvalidArgumentError('Connection already in progress')
38003
+ }
38004
+
38005
+ if (this.state !== STATES.AUTHENTICATED) {
38006
+ throw new InvalidArgumentError('Client must be authenticated before CONNECT')
38007
+ }
38008
+
38009
+ debug('connecting to', address, port);
38010
+ this.state = STATES.CONNECTING;
38011
+
38012
+ const request = this.buildConnectRequest(COMMANDS.CONNECT, address, port);
38013
+ this.socket.write(request);
38014
+ }
38015
+
38016
+ /**
38017
+ * Build a SOCKS5 request
38018
+ */
38019
+ buildConnectRequest (command, address, port) {
38020
+ // Parse address to determine type and buffer
38021
+ const { type: addressType, buffer: addressBuffer } = parseAddress(address);
38022
+
38023
+ // Build request
38024
+ // +----+-----+-------+------+----------+----------+
38025
+ // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
38026
+ // +----+-----+-------+------+----------+----------+
38027
+ // | 1 | 1 | X'00' | 1 | Variable | 2 |
38028
+ // +----+-----+-------+------+----------+----------+
38029
+ const request = Buffer.alloc(4 + addressBuffer.length + 2);
38030
+ request[0] = SOCKS_VERSION;
38031
+ request[1] = command;
38032
+ request[2] = 0x00; // Reserved
38033
+ request[3] = addressType;
38034
+ addressBuffer.copy(request, 4);
38035
+ request.writeUInt16BE(port, 4 + addressBuffer.length);
38036
+
38037
+ return request
38038
+ }
38039
+
38040
+ /**
38041
+ * Handle CONNECT response
38042
+ */
38043
+ handleConnectResponse () {
38044
+ if (this.buffer.length < 4) {
38045
+ return // Not enough data for header
38046
+ }
38047
+
38048
+ const version = this.buffer[0];
38049
+ const reply = this.buffer[1];
38050
+ const addressType = this.buffer[3];
38051
+
38052
+ if (version !== SOCKS_VERSION) {
38053
+ throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version}`, 'UND_ERR_SOCKS5_REPLY_VERSION')
38054
+ }
38055
+
38056
+ // Calculate the expected response length
38057
+ let responseLength = 4; // VER + REP + RSV + ATYP
38058
+ if (addressType === ADDRESS_TYPES.IPV4) {
38059
+ responseLength += 4 + 2; // IPv4 + port
38060
+ } else if (addressType === ADDRESS_TYPES.DOMAIN) {
38061
+ if (this.buffer.length < 5) {
38062
+ return // Need domain length byte
38063
+ }
38064
+ responseLength += 1 + this.buffer[4] + 2; // length byte + domain + port
38065
+ } else if (addressType === ADDRESS_TYPES.IPV6) {
38066
+ responseLength += 16 + 2; // IPv6 + port
38067
+ } else {
38068
+ throw new Socks5ProxyError(`Invalid address type in reply: ${addressType}`, 'UND_ERR_SOCKS5_ADDR_TYPE')
38069
+ }
38070
+
38071
+ if (this.buffer.length < responseLength) {
38072
+ return // Not enough data for full response
38073
+ }
38074
+
38075
+ if (reply !== REPLY_CODES.SUCCEEDED) {
38076
+ const errorMessage = this.getReplyErrorMessage(reply);
38077
+ throw new Socks5ProxyError(`SOCKS5 connection failed: ${errorMessage}`, `UND_ERR_SOCKS5_REPLY_${reply}`)
38078
+ }
38079
+
38080
+ // Parse bound address and port
38081
+ let boundAddress;
38082
+ let offset = 4;
38083
+
38084
+ if (addressType === ADDRESS_TYPES.IPV4) {
38085
+ boundAddress = Array.from(this.buffer.subarray(offset, offset + 4)).join('.');
38086
+ offset += 4;
38087
+ } else if (addressType === ADDRESS_TYPES.DOMAIN) {
38088
+ const domainLength = this.buffer[offset];
38089
+ offset += 1;
38090
+ boundAddress = this.buffer.subarray(offset, offset + domainLength).toString();
38091
+ offset += domainLength;
38092
+ } else if (addressType === ADDRESS_TYPES.IPV6) {
38093
+ // Parse IPv6 address from 16-byte buffer
38094
+ const parts = [];
38095
+ for (let i = 0; i < 8; i++) {
38096
+ const value = this.buffer.readUInt16BE(offset + i * 2);
38097
+ parts.push(value.toString(16));
38098
+ }
38099
+ boundAddress = parts.join(':');
38100
+ offset += 16;
38101
+ }
38102
+
38103
+ const boundPort = this.buffer.readUInt16BE(offset);
38104
+
38105
+ this.buffer = EMPTY_BUFFER;
38106
+ this.state = STATES.CONNECTED;
38107
+ this.socket.removeListener('data', this.onSocketData);
38108
+
38109
+ debug('connected, bound address:', boundAddress, 'port:', boundPort);
38110
+ this.emit('connected', { address: boundAddress, port: boundPort });
38111
+ }
38112
+
38113
+ /**
38114
+ * Get human-readable error message for reply code
38115
+ */
38116
+ getReplyErrorMessage (reply) {
38117
+ switch (reply) {
38118
+ case REPLY_CODES.GENERAL_FAILURE:
38119
+ return 'General SOCKS server failure'
38120
+ case REPLY_CODES.CONNECTION_NOT_ALLOWED:
38121
+ return 'Connection not allowed by ruleset'
38122
+ case REPLY_CODES.NETWORK_UNREACHABLE:
38123
+ return 'Network unreachable'
38124
+ case REPLY_CODES.HOST_UNREACHABLE:
38125
+ return 'Host unreachable'
38126
+ case REPLY_CODES.CONNECTION_REFUSED:
38127
+ return 'Connection refused'
38128
+ case REPLY_CODES.TTL_EXPIRED:
38129
+ return 'TTL expired'
38130
+ case REPLY_CODES.COMMAND_NOT_SUPPORTED:
38131
+ return 'Command not supported'
38132
+ case REPLY_CODES.ADDRESS_TYPE_NOT_SUPPORTED:
38133
+ return 'Address type not supported'
38134
+ default:
38135
+ return `Unknown error code: ${reply}`
38136
+ }
38137
+ }
38138
+ }
38139
+
38140
+ socks5Client = {
38141
+ Socks5Client,
38142
+ AUTH_METHODS,
38143
+ COMMANDS,
38144
+ ADDRESS_TYPES,
38145
+ REPLY_CODES,
38146
+ STATES
38147
+ };
38148
+ return socks5Client;
38149
+ }
38150
+
38151
+ var socks5ProxyAgent;
38152
+ var hasRequiredSocks5ProxyAgent;
38153
+
38154
+ function requireSocks5ProxyAgent () {
38155
+ if (hasRequiredSocks5ProxyAgent) return socks5ProxyAgent;
38156
+ hasRequiredSocks5ProxyAgent = 1;
38157
+
38158
+ const { URL } = require$$0$b;
38159
+
38160
+ let tls; // include tls conditionally since it is not always available
38161
+ const DispatcherBase = requireDispatcherBase();
38162
+ const { InvalidArgumentError } = requireErrors();
38163
+ const { Socks5Client, STATES } = requireSocks5Client();
38164
+ const { kDispatch, kClose, kDestroy } = requireSymbols();
38165
+ const Pool = requirePool();
38166
+ const buildConnector = requireConnect();
38167
+ const { debuglog } = require$$3$3;
38168
+
38169
+ const debug = debuglog('undici:socks5-proxy');
38170
+
38171
+ const kProxyUrl = Symbol('proxy url');
38172
+ const kProxyHeaders = Symbol('proxy headers');
38173
+ const kProxyAuth = Symbol('proxy auth');
38174
+ const kProxyProtocol = Symbol('proxy protocol');
38175
+ const kPools = Symbol('pools');
38176
+ const kConnector = Symbol('connector');
38177
+ const kRequestTls = Symbol('request tls settings');
38178
+
38179
+ // Static flag to ensure warning is only emitted once per process
38180
+ let experimentalWarningEmitted = false;
38181
+
38182
+ /**
38183
+ * SOCKS5 proxy agent for dispatching requests through a SOCKS5 proxy
38184
+ */
38185
+ class Socks5ProxyAgent extends DispatcherBase {
38186
+ constructor (proxyUrl, options = {}) {
38187
+ super();
38188
+
38189
+ // Emit experimental warning only once
38190
+ if (!experimentalWarningEmitted) {
38191
+ process.emitWarning(
38192
+ 'SOCKS5 proxy support is experimental and subject to change',
38193
+ 'ExperimentalWarning'
38194
+ );
38195
+ experimentalWarningEmitted = true;
38196
+ }
38197
+
38198
+ if (!proxyUrl) {
38199
+ throw new InvalidArgumentError('Proxy URL is mandatory')
38200
+ }
38201
+
38202
+ // Parse proxy URL
38203
+ const url = typeof proxyUrl === 'string' ? new URL(proxyUrl) : proxyUrl;
38204
+
38205
+ if (url.protocol !== 'socks5:' && url.protocol !== 'socks:') {
38206
+ throw new InvalidArgumentError('Proxy URL must use socks5:// or socks:// protocol')
38207
+ }
38208
+
38209
+ this[kProxyUrl] = url;
38210
+ this[kProxyHeaders] = options.headers || {};
38211
+ this[kProxyProtocol] = options.proxyTls ? 'https:' : 'http:';
38212
+ this[kRequestTls] = options.requestTls;
38213
+
38214
+ // Extract auth from URL or options
38215
+ this[kProxyAuth] = {
38216
+ username: options.username || (url.username ? decodeURIComponent(url.username) : null),
38217
+ password: options.password || (url.password ? decodeURIComponent(url.password) : null)
38218
+ };
38219
+
38220
+ // Create connector for proxy connection
38221
+ this[kConnector] = options.connect || buildConnector({
38222
+ ...options.proxyTls,
38223
+ servername: options.proxyTls?.servername || url.hostname
38224
+ });
38225
+
38226
+ // Pools for the actual HTTP connections (with SOCKS5 tunnel connect function), keyed by origin
38227
+ this[kPools] = new Map();
38228
+ }
38229
+
38230
+ /**
38231
+ * Create a SOCKS5 connection to the proxy
38232
+ */
38233
+ async createSocks5Connection (targetHost, targetPort) {
38234
+ const proxyHost = this[kProxyUrl].hostname;
38235
+ const proxyPort = parseInt(this[kProxyUrl].port) || 1080;
38236
+
38237
+ debug('creating SOCKS5 connection to', proxyHost, proxyPort);
38238
+
38239
+ // Connect to the SOCKS5 proxy
38240
+ const socket = await new Promise((resolve, reject) => {
38241
+ this[kConnector]({
38242
+ hostname: proxyHost,
38243
+ host: proxyHost,
38244
+ port: proxyPort,
38245
+ protocol: this[kProxyProtocol]
38246
+ }, (err, socket) => {
38247
+ if (err) {
38248
+ reject(err);
38249
+ } else {
38250
+ resolve(socket);
38251
+ }
38252
+ });
38253
+ });
38254
+
38255
+ // Create SOCKS5 client
38256
+ const socks5Client = new Socks5Client(socket, this[kProxyAuth]);
38257
+
38258
+ // Handle SOCKS5 errors
38259
+ socks5Client.on('error', (err) => {
38260
+ debug('SOCKS5 error:', err);
38261
+ socket.destroy();
38262
+ });
38263
+
38264
+ // Perform SOCKS5 handshake
38265
+ await socks5Client.handshake();
38266
+
38267
+ // Wait for authentication (if required)
38268
+ await new Promise((resolve, reject) => {
38269
+ const timeout = setTimeout(() => {
38270
+ reject(new Error('SOCKS5 authentication timeout'));
38271
+ }, 5000);
38272
+
38273
+ const onAuthenticated = () => {
38274
+ clearTimeout(timeout);
38275
+ socks5Client.removeListener('error', onError);
38276
+ resolve();
38277
+ };
38278
+
38279
+ const onError = (err) => {
38280
+ clearTimeout(timeout);
38281
+ socks5Client.removeListener('authenticated', onAuthenticated);
38282
+ reject(err);
38283
+ };
38284
+
38285
+ // Check if already authenticated (for NO_AUTH method)
38286
+ if (socks5Client.state === STATES.AUTHENTICATED) {
38287
+ clearTimeout(timeout);
38288
+ resolve();
38289
+ } else {
38290
+ socks5Client.once('authenticated', onAuthenticated);
38291
+ socks5Client.once('error', onError);
38292
+ }
38293
+ });
38294
+
38295
+ // Send CONNECT command
38296
+ await socks5Client.connect(targetHost, targetPort);
38297
+
38298
+ // Wait for connection
38299
+ await new Promise((resolve, reject) => {
38300
+ const timeout = setTimeout(() => {
38301
+ reject(new Error('SOCKS5 connection timeout'));
38302
+ }, 5000);
38303
+
38304
+ const onConnected = (info) => {
38305
+ debug('SOCKS5 tunnel established to', targetHost, targetPort, 'via', info);
38306
+ clearTimeout(timeout);
38307
+ socks5Client.removeListener('error', onError);
38308
+ resolve();
38309
+ };
38310
+
38311
+ const onError = (err) => {
38312
+ clearTimeout(timeout);
38313
+ socks5Client.removeListener('connected', onConnected);
38314
+ reject(err);
38315
+ };
38316
+
38317
+ socks5Client.once('connected', onConnected);
38318
+ socks5Client.once('error', onError);
38319
+ });
38320
+
38321
+ return socket
38322
+ }
38323
+
38324
+ /**
38325
+ * Dispatch a request through the SOCKS5 proxy
38326
+ */
38327
+ [kDispatch] (opts, handler) {
38328
+ const { origin } = opts;
38329
+
38330
+ debug('dispatching request to', origin, 'via SOCKS5');
38331
+
38332
+ try {
38333
+ const originKey = String(origin);
38334
+ let pool = this[kPools].get(originKey);
38335
+ // Create a Pool per origin so requests are not routed to the wrong host
38336
+ if (!pool || pool.destroyed || pool.closed) {
38337
+ pool = new Pool(origin, {
38338
+ pipelining: opts.pipelining,
38339
+ connections: opts.connections,
38340
+ connect: async (connectOpts, callback) => {
38341
+ try {
38342
+ const url = new URL(origin);
38343
+ const targetHost = url.hostname;
38344
+ const targetPort = parseInt(url.port) || (url.protocol === 'https:' ? 443 : 80);
38345
+
38346
+ debug('establishing SOCKS5 connection to', targetHost, targetPort);
38347
+
38348
+ // Create SOCKS5 tunnel
38349
+ const socket = await this.createSocks5Connection(targetHost, targetPort);
38350
+
38351
+ // Handle TLS if needed
38352
+ let finalSocket = socket;
38353
+ if (url.protocol === 'https:') {
38354
+ if (!tls) {
38355
+ tls = require('node:tls');
38356
+ }
38357
+ debug('upgrading to TLS');
38358
+ finalSocket = tls.connect({
38359
+ ...this[kRequestTls],
38360
+ socket,
38361
+ servername: this[kRequestTls]?.servername || targetHost
38362
+ });
38363
+
38364
+ await new Promise((resolve, reject) => {
38365
+ finalSocket.once('secureConnect', resolve);
38366
+ finalSocket.once('error', reject);
38367
+ });
38368
+ }
38369
+
38370
+ callback(null, finalSocket);
38371
+ } catch (err) {
38372
+ debug('SOCKS5 connection error:', err);
38373
+ callback(err);
38374
+ }
38375
+ }
38376
+ });
38377
+ this[kPools].set(originKey, pool);
38378
+ }
38379
+
38380
+ // Dispatch the request through the per-origin pool
38381
+ return pool[kDispatch](opts, handler)
38382
+ } catch (err) {
38383
+ debug('dispatch error:', err);
38384
+ if (typeof handler.onResponseError === 'function') {
38385
+ handler.onResponseError(null, err);
38386
+ return false
38387
+ } else if (typeof handler.onError === 'function') {
38388
+ handler.onError(err);
38389
+ return false
38390
+ } else {
38391
+ throw err
38392
+ }
38393
+ }
38394
+ }
38395
+
38396
+ async [kClose] () {
38397
+ const closePromises = [];
38398
+ for (const pool of this[kPools].values()) {
38399
+ closePromises.push(pool.close());
38400
+ }
38401
+ this[kPools].clear();
38402
+ await Promise.all(closePromises);
38403
+ }
38404
+
38405
+ async [kDestroy] (err) {
38406
+ const destroyPromises = [];
38407
+ for (const pool of this[kPools].values()) {
38408
+ destroyPromises.push(pool.destroy(err));
38409
+ }
38410
+ this[kPools].clear();
38411
+ await Promise.all(destroyPromises);
38412
+ }
38413
+ }
38414
+
38415
+ socks5ProxyAgent = Socks5ProxyAgent;
38416
+ return socks5ProxyAgent;
38417
+ }
38418
+
37104
38419
  var proxyAgent;
37105
38420
  var hasRequiredProxyAgent;
37106
38421
 
@@ -37116,6 +38431,7 @@ function requireProxyAgent () {
37116
38431
  const buildConnector = requireConnect();
37117
38432
  const Client = requireClient();
37118
38433
  const { channels } = requireDiagnostics();
38434
+ const Socks5ProxyAgent = requireSocks5ProxyAgent();
37119
38435
 
37120
38436
  const kAgent = Symbol('proxy agent');
37121
38437
  const kClient = Symbol('proxy client');
@@ -37240,6 +38556,20 @@ function requireProxyAgent () {
37240
38556
  const agentFactory = opts.factory || defaultAgentFactory;
37241
38557
  const factory = (origin, options) => {
37242
38558
  const { protocol } = new URL(origin);
38559
+
38560
+ // Handle SOCKS5 proxy
38561
+ if (this[kProxy].protocol === 'socks5:' || this[kProxy].protocol === 'socks:') {
38562
+ return new Socks5ProxyAgent(this[kProxy].uri, {
38563
+ headers: this[kProxyHeaders],
38564
+ connect,
38565
+ factory: agentFactory,
38566
+ username: opts.username || username,
38567
+ password: opts.password || password,
38568
+ proxyTls: opts.proxyTls,
38569
+ requestTls: opts.requestTls
38570
+ })
38571
+ }
38572
+
37243
38573
  if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') {
37244
38574
  return new Http1ProxyWrapper(this[kProxy].uri, {
37245
38575
  headers: this[kProxyHeaders],
@@ -37249,11 +38579,26 @@ function requireProxyAgent () {
37249
38579
  }
37250
38580
  return agentFactory(origin, options)
37251
38581
  };
37252
- this[kClient] = clientFactory(url, { connect });
38582
+
38583
+ // For SOCKS5 proxies, we don't need a client to the proxy itself
38584
+ // The SOCKS5 connection is handled within Socks5ProxyAgent
38585
+ if (protocol === 'socks5:' || protocol === 'socks:') {
38586
+ this[kClient] = null;
38587
+ } else {
38588
+ this[kClient] = clientFactory(url, { connect });
38589
+ }
38590
+
37253
38591
  this[kAgent] = new Agent({
37254
38592
  ...opts,
37255
38593
  factory,
37256
38594
  connect: async (opts, callback) => {
38595
+ // SOCKS5 proxies handle their own connections via Socks5ProxyAgent,
38596
+ // so this connect function should never be called for them.
38597
+ if (!this[kClient]) {
38598
+ callback(new InvalidArgumentError('Cannot establish tunnel connection without a proxy client'));
38599
+ return
38600
+ }
38601
+
37257
38602
  let requestedPath = opts.host;
37258
38603
  if (!opts.port) {
37259
38604
  requestedPath += `:${defaultProtocolPort(opts.protocol)}`;
@@ -37341,17 +38686,19 @@ function requireProxyAgent () {
37341
38686
  }
37342
38687
 
37343
38688
  [kClose] () {
37344
- return Promise.all([
37345
- this[kAgent].close(),
37346
- this[kClient].close()
37347
- ])
38689
+ const promises = [this[kAgent].close()];
38690
+ if (this[kClient]) {
38691
+ promises.push(this[kClient].close());
38692
+ }
38693
+ return Promise.all(promises)
37348
38694
  }
37349
38695
 
37350
38696
  [kDestroy] () {
37351
- return Promise.all([
37352
- this[kAgent].destroy(),
37353
- this[kClient].destroy()
37354
- ])
38697
+ const promises = [this[kAgent].destroy()];
38698
+ if (this[kClient]) {
38699
+ promises.push(this[kClient].destroy());
38700
+ }
38701
+ return Promise.all(promises)
37355
38702
  }
37356
38703
  }
37357
38704
 
@@ -38017,7 +39364,7 @@ function requireH2cClient () {
38017
39364
  )
38018
39365
  }
38019
39366
 
38020
- const { connect, maxConcurrentStreams, pipelining, ...opts } =
39367
+ const { maxConcurrentStreams, pipelining, ...opts } =
38021
39368
  clientOpts ?? {};
38022
39369
  let defaultMaxConcurrentStreams = 100;
38023
39370
  let defaultPipelining = 100;
@@ -38653,7 +40000,7 @@ function requireApiRequest () {
38653
40000
  hasRequiredApiRequest = 1;
38654
40001
 
38655
40002
  const assert = require$$0$7;
38656
- const { AsyncResource } = require$$1$5;
40003
+ const { AsyncResource } = require$$1$6;
38657
40004
  const { Readable } = requireReadable();
38658
40005
  const { InvalidArgumentError, RequestAbortedError } = requireErrors();
38659
40006
  const util = requireUtil$5();
@@ -38673,7 +40020,7 @@ function requireApiRequest () {
38673
40020
  throw new InvalidArgumentError('invalid callback')
38674
40021
  }
38675
40022
 
38676
- if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) {
40023
+ if (highWaterMark != null && (!Number.isFinite(highWaterMark) || highWaterMark < 0)) {
38677
40024
  throw new InvalidArgumentError('invalid highWaterMark')
38678
40025
  }
38679
40026
 
@@ -38943,7 +40290,7 @@ function requireApiStream () {
38943
40290
 
38944
40291
  const assert = require$$0$7;
38945
40292
  const { finished } = require$$0$8;
38946
- const { AsyncResource } = require$$1$5;
40293
+ const { AsyncResource } = require$$1$6;
38947
40294
  const { InvalidArgumentError, InvalidReturnValueError } = requireErrors();
38948
40295
  const util = requireUtil$5();
38949
40296
  const { addSignal, removeSignal } = requireAbortSignal();
@@ -39164,7 +40511,7 @@ function requireApiPipeline () {
39164
40511
  PassThrough
39165
40512
  } = require$$0$8;
39166
40513
  const assert = require$$0$7;
39167
- const { AsyncResource } = require$$1$5;
40514
+ const { AsyncResource } = require$$1$6;
39168
40515
  const {
39169
40516
  InvalidArgumentError,
39170
40517
  InvalidReturnValueError,
@@ -39419,7 +40766,7 @@ function requireApiUpgrade () {
39419
40766
  hasRequiredApiUpgrade = 1;
39420
40767
 
39421
40768
  const { InvalidArgumentError, SocketError } = requireErrors();
39422
- const { AsyncResource } = require$$1$5;
40769
+ const { AsyncResource } = require$$1$6;
39423
40770
  const assert = require$$0$7;
39424
40771
  const util = requireUtil$5();
39425
40772
  const { kHTTP2Stream } = requireSymbols();
@@ -39538,7 +40885,7 @@ function requireApiConnect () {
39538
40885
  hasRequiredApiConnect = 1;
39539
40886
 
39540
40887
  const assert = require$$0$7;
39541
- const { AsyncResource } = require$$1$5;
40888
+ const { AsyncResource } = require$$1$6;
39542
40889
  const { InvalidArgumentError, SocketError } = requireErrors();
39543
40890
  const util = requireUtil$5();
39544
40891
  const { addSignal, removeSignal } = requireAbortSignal();
@@ -39733,7 +41080,8 @@ function requireMockSymbols () {
39733
41080
  kMockAgentAddCallHistoryLog: Symbol('mock agent add call history log'),
39734
41081
  kMockAgentIsCallHistoryEnabled: Symbol('mock agent is call history enabled'),
39735
41082
  kMockAgentAcceptsNonStandardSearchParameters: Symbol('mock agent accepts non standard search parameters'),
39736
- kMockCallHistoryAddLog: Symbol('mock call history add log')
41083
+ kMockCallHistoryAddLog: Symbol('mock call history add log'),
41084
+ kTotalDispatchCount: Symbol('total dispatch count')
39737
41085
  };
39738
41086
  return mockSymbols;
39739
41087
  }
@@ -39751,7 +41099,8 @@ function requireMockUtils () {
39751
41099
  kMockAgent,
39752
41100
  kOriginalDispatch,
39753
41101
  kOrigin,
39754
- kGetNetConnect
41102
+ kGetNetConnect,
41103
+ kTotalDispatchCount
39755
41104
  } = requireMockSymbols();
39756
41105
  const { serializePathWithQuery } = requireUtil$5();
39757
41106
  const { STATUS_CODES } = require$$2$3;
@@ -39951,6 +41300,8 @@ function requireMockUtils () {
39951
41300
  const replyData = typeof data === 'function' ? { callback: data } : { ...data };
39952
41301
  const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } };
39953
41302
  mockDispatches.push(newMockDispatch);
41303
+ // Track total number of intercepts ever registered for better error messages
41304
+ mockDispatches[kTotalDispatchCount] = (mockDispatches[kTotalDispatchCount] || 0) + 1;
39954
41305
  return newMockDispatch
39955
41306
  }
39956
41307
 
@@ -40146,13 +41497,16 @@ function requireMockUtils () {
40146
41497
  } catch (error) {
40147
41498
  if (error.code === 'UND_MOCK_ERR_MOCK_NOT_MATCHED') {
40148
41499
  const netConnect = agent[kGetNetConnect]();
41500
+ const totalInterceptsCount = this[kDispatches][kTotalDispatchCount] || this[kDispatches].length;
41501
+ const pendingInterceptsCount = this[kDispatches].filter(({ consumed }) => !consumed).length;
41502
+ const interceptsMessage = `, ${pendingInterceptsCount} interceptor(s) remaining out of ${totalInterceptsCount} defined`;
40149
41503
  if (netConnect === false) {
40150
- throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)
41504
+ throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`)
40151
41505
  }
40152
41506
  if (checkNetConnect(netConnect, origin)) {
40153
41507
  originalDispatch.call(this, opts, handler);
40154
41508
  } else {
40155
- throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`)
41509
+ throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`)
40156
41510
  }
40157
41511
  } else {
40158
41512
  throw error
@@ -40531,14 +41885,14 @@ function requireMockCallHistory () {
40531
41885
  const { kMockCallHistoryAddLog } = requireMockSymbols();
40532
41886
  const { InvalidArgumentError } = requireErrors();
40533
41887
 
40534
- function handleFilterCallsWithOptions (criteria, options, handler, store) {
41888
+ function handleFilterCallsWithOptions (criteria, options, handler, store, allLogs) {
40535
41889
  switch (options.operator) {
40536
41890
  case 'OR':
40537
- store.push(...handler(criteria));
41891
+ store.push(...handler(criteria, allLogs));
40538
41892
 
40539
41893
  return store
40540
41894
  case 'AND':
40541
- return handler.call({ logs: store }, criteria)
41895
+ return handler(criteria, store)
40542
41896
  default:
40543
41897
  // guard -- should never happens because buildAndValidateFilterCallsOptions is called before
40544
41898
  throw new InvalidArgumentError('options.operator must to be a case insensitive string equal to \'OR\' or \'AND\'')
@@ -40563,14 +41917,14 @@ function requireMockCallHistory () {
40563
41917
  }
40564
41918
 
40565
41919
  function makeFilterCalls (parameterName) {
40566
- return (parameterValue) => {
41920
+ return (parameterValue, logs) => {
40567
41921
  if (typeof parameterValue === 'string' || parameterValue == null) {
40568
- return this.logs.filter((log) => {
41922
+ return logs.filter((log) => {
40569
41923
  return log[parameterName] === parameterValue
40570
41924
  })
40571
41925
  }
40572
41926
  if (parameterValue instanceof RegExp) {
40573
- return this.logs.filter((log) => {
41927
+ return logs.filter((log) => {
40574
41928
  return parameterValue.test(log[parameterName])
40575
41929
  })
40576
41930
  }
@@ -40703,30 +42057,30 @@ function requireMockCallHistory () {
40703
42057
 
40704
42058
  const finalOptions = { operator: 'OR', ...buildAndValidateFilterCallsOptions(options) };
40705
42059
 
40706
- let maybeDuplicatedLogsFiltered = [];
42060
+ let maybeDuplicatedLogsFiltered = finalOptions.operator === 'AND' ? this.logs : [];
40707
42061
  if ('protocol' in criteria) {
40708
- maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered);
42062
+ maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered, this.logs);
40709
42063
  }
40710
42064
  if ('host' in criteria) {
40711
- maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered);
42065
+ maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered, this.logs);
40712
42066
  }
40713
42067
  if ('port' in criteria) {
40714
- maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered);
42068
+ maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered, this.logs);
40715
42069
  }
40716
42070
  if ('origin' in criteria) {
40717
- maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered);
42071
+ maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered, this.logs);
40718
42072
  }
40719
42073
  if ('path' in criteria) {
40720
- maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered);
42074
+ maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered, this.logs);
40721
42075
  }
40722
42076
  if ('hash' in criteria) {
40723
- maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered);
42077
+ maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered, this.logs);
40724
42078
  }
40725
42079
  if ('fullUrl' in criteria) {
40726
- maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered);
42080
+ maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered, this.logs);
40727
42081
  }
40728
42082
  if ('method' in criteria) {
40729
- maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered);
42083
+ maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered, this.logs);
40730
42084
  }
40731
42085
 
40732
42086
  const uniqLogsFiltered = [...new Set(maybeDuplicatedLogsFiltered)];
@@ -40861,7 +42215,7 @@ function requirePendingInterceptorsFormatter () {
40861
42215
  hasRequiredPendingInterceptorsFormatter = 1;
40862
42216
 
40863
42217
  const { Transform } = require$$0$8;
40864
- const { Console } = require$$1$6;
42218
+ const { Console } = require$$1$7;
40865
42219
 
40866
42220
  const PERSISTENT = process.versions.icu ? '✅' : 'Y ';
40867
42221
  const NOT_PERSISTENT = process.versions.icu ? '❌' : 'N ';
@@ -42276,7 +43630,8 @@ function requireGlobal () {
42276
43630
 
42277
43631
  // We include a version number for the Dispatcher API. In case of breaking changes,
42278
43632
  // this version number must be increased to avoid conflicts.
42279
- const globalDispatcher = Symbol.for('undici.globalDispatcher.1');
43633
+ const globalDispatcher = Symbol.for('undici.globalDispatcher.2');
43634
+ const legacyGlobalDispatcher = Symbol.for('undici.globalDispatcher.1');
42280
43635
  const { InvalidArgumentError } = requireErrors();
42281
43636
  const Agent = requireAgent();
42282
43637
 
@@ -42288,16 +43643,24 @@ function requireGlobal () {
42288
43643
  if (!agent || typeof agent.dispatch !== 'function') {
42289
43644
  throw new InvalidArgumentError('Argument agent must implement Agent')
42290
43645
  }
43646
+
42291
43647
  Object.defineProperty(globalThis, globalDispatcher, {
42292
43648
  value: agent,
42293
43649
  writable: true,
42294
43650
  enumerable: false,
42295
43651
  configurable: false
42296
43652
  });
43653
+
43654
+ Object.defineProperty(globalThis, legacyGlobalDispatcher, {
43655
+ value: agent,
43656
+ writable: true,
43657
+ enumerable: false,
43658
+ configurable: false
43659
+ });
42297
43660
  }
42298
43661
 
42299
43662
  function getGlobalDispatcher () {
42300
- return globalThis[globalDispatcher]
43663
+ return globalThis[legacyGlobalDispatcher]
42301
43664
  }
42302
43665
 
42303
43666
  // These are the globals that can be installed by undici.install().
@@ -42611,7 +43974,8 @@ function requireRedirectHandler () {
42611
43974
  }
42612
43975
  }
42613
43976
  } else if (headers && typeof headers === 'object') {
42614
- const entries = typeof headers[Symbol.iterator] === 'function' ? headers : Object.entries(headers);
43977
+ const entries = util.hasSafeIterator(headers) ? headers : Object.entries(headers);
43978
+
42615
43979
  for (const [key, value] of entries) {
42616
43980
  if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {
42617
43981
  ret.push(key, value);
@@ -42912,12 +44276,111 @@ var hasRequiredDns;
42912
44276
  function requireDns () {
42913
44277
  if (hasRequiredDns) return dns;
42914
44278
  hasRequiredDns = 1;
42915
- const { isIP } = require$$0$9;
42916
- const { lookup } = require$$1$7;
44279
+ const { isIP } = require$$1$4;
44280
+ const { lookup } = require$$1$8;
42917
44281
  const DecoratorHandler = requireDecoratorHandler();
42918
44282
  const { InvalidArgumentError, InformationalError } = requireErrors();
42919
44283
  const maxInt = Math.pow(2, 31) - 1;
42920
44284
 
44285
+ function hasSafeIterator (headers) {
44286
+ const prototype = Object.getPrototypeOf(headers);
44287
+ const ownIterator = Object.prototype.hasOwnProperty.call(headers, Symbol.iterator);
44288
+ return ownIterator || (prototype != null && prototype !== Object.prototype && typeof headers[Symbol.iterator] === 'function')
44289
+ }
44290
+
44291
+ function isHostHeader (key) {
44292
+ return typeof key === 'string' && key.toLowerCase() === 'host'
44293
+ }
44294
+
44295
+ function normalizeHeaders (headers) {
44296
+ if (headers == null) {
44297
+ return null
44298
+ }
44299
+
44300
+ if (Array.isArray(headers)) {
44301
+ if (headers.length === 0 || !Array.isArray(headers[0])) {
44302
+ return headers
44303
+ }
44304
+
44305
+ const normalized = [];
44306
+ for (const header of headers) {
44307
+ if (Array.isArray(header) && header.length === 2) {
44308
+ normalized.push(header[0], header[1]);
44309
+ } else {
44310
+ normalized.push(header);
44311
+ }
44312
+ }
44313
+
44314
+ return normalized
44315
+ }
44316
+
44317
+ if (typeof headers === 'object' && hasSafeIterator(headers)) {
44318
+ const normalized = [];
44319
+ for (const header of headers) {
44320
+ if (Array.isArray(header) && header.length === 2) {
44321
+ normalized.push(header[0], header[1]);
44322
+ } else {
44323
+ normalized.push(header);
44324
+ }
44325
+ }
44326
+
44327
+ return normalized
44328
+ }
44329
+
44330
+ return headers
44331
+ }
44332
+
44333
+ function hasHostHeader (headers) {
44334
+ if (headers == null) {
44335
+ return false
44336
+ }
44337
+
44338
+ if (Array.isArray(headers)) {
44339
+ if (headers.length === 0) {
44340
+ return false
44341
+ }
44342
+
44343
+ for (let i = 0; i < headers.length; i += 2) {
44344
+ if (isHostHeader(headers[i])) {
44345
+ return true
44346
+ }
44347
+ }
44348
+
44349
+ return false
44350
+ }
44351
+
44352
+ if (typeof headers === 'object') {
44353
+ for (const key in headers) {
44354
+ if (isHostHeader(key)) {
44355
+ return true
44356
+ }
44357
+ }
44358
+ }
44359
+
44360
+ return false
44361
+ }
44362
+
44363
+ function withHostHeader (host, headers) {
44364
+ const normalizedHeaders = normalizeHeaders(headers);
44365
+
44366
+ if (hasHostHeader(normalizedHeaders)) {
44367
+ return normalizedHeaders
44368
+ }
44369
+
44370
+ if (Array.isArray(normalizedHeaders)) {
44371
+ return ['host', host, ...normalizedHeaders]
44372
+ }
44373
+
44374
+ if (normalizedHeaders && typeof normalizedHeaders === 'object') {
44375
+ return {
44376
+ host,
44377
+ ...normalizedHeaders
44378
+ }
44379
+ }
44380
+
44381
+ return { host }
44382
+ }
44383
+
42921
44384
  class DNSStorage {
42922
44385
  #maxItems = 0
42923
44386
  #records = new Map()
@@ -43246,8 +44709,9 @@ function requireDns () {
43246
44709
  const dispatchOpts = {
43247
44710
  ...this.#opts,
43248
44711
  origin: `${this.#origin.protocol}//${
43249
- ip.family === 6 ? `[${ip.address}]` : ip.address
43250
- }${port}`
44712
+ ip.family === 6 ? `[${ip.address}]` : ip.address
44713
+ }${port}`,
44714
+ headers: withHostHeader(this.#origin.host, this.#opts.headers)
43251
44715
  };
43252
44716
  this.#dispatch(dispatchOpts, this);
43253
44717
  return
@@ -43366,10 +44830,7 @@ function requireDns () {
43366
44830
  ...origDispatchOpts,
43367
44831
  servername: origin.hostname, // For SNI on TLS
43368
44832
  origin: newOrigin.origin,
43369
- headers: {
43370
- host: origin.host,
43371
- ...origDispatchOpts.headers
43372
- }
44833
+ headers: withHostHeader(origin.host, origDispatchOpts.headers)
43373
44834
  };
43374
44835
 
43375
44836
  dispatch(
@@ -43397,7 +44858,8 @@ function requireCache$2 () {
43397
44858
 
43398
44859
  const {
43399
44860
  safeHTTPMethods,
43400
- pathHasQueryOrFragment
44861
+ pathHasQueryOrFragment,
44862
+ hasSafeIterator
43401
44863
  } = requireUtil$5();
43402
44864
 
43403
44865
  const { serializePathWithQuery } = requireUtil$5();
@@ -43412,7 +44874,7 @@ function requireCache$2 () {
43412
44874
 
43413
44875
  let fullPath = opts.path || '/';
43414
44876
 
43415
- if (opts.query && !pathHasQueryOrFragment(opts.path)) {
44877
+ if (opts.query && !pathHasQueryOrFragment(fullPath)) {
43416
44878
  fullPath = serializePathWithQuery(fullPath, opts.query);
43417
44879
  }
43418
44880
 
@@ -43432,23 +44894,24 @@ function requireCache$2 () {
43432
44894
  let headers;
43433
44895
  if (opts.headers == null) {
43434
44896
  headers = {};
43435
- } else if (typeof opts.headers[Symbol.iterator] === 'function') {
43436
- headers = {};
43437
- for (const x of opts.headers) {
43438
- if (!Array.isArray(x)) {
43439
- throw new Error('opts.headers is not a valid header map')
43440
- }
43441
- const [key, val] = x;
43442
- if (typeof key !== 'string' || typeof val !== 'string') {
43443
- throw new Error('opts.headers is not a valid header map')
43444
- }
43445
- headers[key.toLowerCase()] = val;
43446
- }
43447
44897
  } else if (typeof opts.headers === 'object') {
43448
44898
  headers = {};
43449
44899
 
43450
- for (const key of Object.keys(opts.headers)) {
43451
- headers[key.toLowerCase()] = opts.headers[key];
44900
+ if (hasSafeIterator(opts.headers)) {
44901
+ for (const x of opts.headers) {
44902
+ if (!Array.isArray(x)) {
44903
+ throw new Error('opts.headers is not a valid header map')
44904
+ }
44905
+ const [key, val] = x;
44906
+ if (typeof key !== 'string' || typeof val !== 'string') {
44907
+ throw new Error('opts.headers is not a valid header map')
44908
+ }
44909
+ headers[key.toLowerCase()] = val;
44910
+ }
44911
+ } else {
44912
+ for (const key of Object.keys(opts.headers)) {
44913
+ headers[key.toLowerCase()] = opts.headers[key];
44914
+ }
43452
44915
  }
43453
44916
  } else {
43454
44917
  throw new Error('opts.headers is not an object')
@@ -43621,6 +45084,10 @@ function requireCache$2 () {
43621
45084
  headers[headers.length - 1] = lastHeader;
43622
45085
  }
43623
45086
 
45087
+ for (let j = 0; j < headers.length; j++) {
45088
+ headers[j] = headers[j].trim();
45089
+ }
45090
+
43624
45091
  if (key in output) {
43625
45092
  output[key] = output[key].concat(headers);
43626
45093
  } else {
@@ -43629,10 +45096,12 @@ function requireCache$2 () {
43629
45096
  }
43630
45097
  } else {
43631
45098
  // Something like `no-cache="some-header"`
45099
+ const fieldName = value.trim();
45100
+
43632
45101
  if (key in output) {
43633
- output[key] = output[key].concat(value);
45102
+ output[key] = output[key].concat(fieldName);
43634
45103
  } else {
43635
- output[key] = [value];
45104
+ output[key] = [fieldName];
43636
45105
  }
43637
45106
  }
43638
45107
 
@@ -43767,9 +45236,11 @@ function requireCache$2 () {
43767
45236
  * @returns {string}
43768
45237
  */
43769
45238
  function makeDeduplicationKey (cacheKey, excludeHeaders) {
43770
- // Create a deterministic string key from the cache key
43771
- // Include origin, method, path, and sorted headers
43772
- let key = `${cacheKey.origin}:${cacheKey.method}:${cacheKey.path}`;
45239
+ // Use JSON.stringify to produce a collision-resistant key.
45240
+ // Previous format used `:` and `=` delimiters without escaping, which
45241
+ // allowed different header sets to produce identical keys (e.g.
45242
+ // {a:"x:b=y"} vs {a:"x", b:"y"}). See: https://github.com/nodejs/undici/issues/5012
45243
+ const headers = {};
43773
45244
 
43774
45245
  if (cacheKey.headers) {
43775
45246
  const sortedHeaders = Object.keys(cacheKey.headers).sort();
@@ -43778,12 +45249,11 @@ function requireCache$2 () {
43778
45249
  if (excludeHeaders?.has(header.toLowerCase())) {
43779
45250
  continue
43780
45251
  }
43781
- const value = cacheKey.headers[header];
43782
- key += `:${header}=${Array.isArray(value) ? value.join(',') : value}`;
45252
+ headers[header] = cacheKey.headers[header];
43783
45253
  }
43784
45254
  }
43785
45255
 
43786
- return key
45256
+ return JSON.stringify([cacheKey.origin, cacheKey.method, cacheKey.path, headers])
43787
45257
  }
43788
45258
 
43789
45259
  cache$2 = {
@@ -44604,7 +46074,7 @@ function requireCacheHandler () {
44604
46074
  }
44605
46075
 
44606
46076
  const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {};
44607
- if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives)) {
46077
+ if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {
44608
46078
  return downstreamOnHeaders()
44609
46079
  }
44610
46080
 
@@ -44809,8 +46279,9 @@ function requireCacheHandler () {
44809
46279
  * @param {number} statusCode
44810
46280
  * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders
44811
46281
  * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives
46282
+ * @param {import('../../types/header.d.ts').IncomingHttpHeaders} [reqHeaders]
44812
46283
  */
44813
- function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives) {
46284
+ function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
44814
46285
  // Status code must be final and understood.
44815
46286
  if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {
44816
46287
  return false
@@ -44841,8 +46312,16 @@ function requireCacheHandler () {
44841
46312
  }
44842
46313
 
44843
46314
  // https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen
44844
- if (resHeaders.authorization) {
44845
- if (!cacheControlDirectives.public || typeof resHeaders.authorization !== 'string') {
46315
+ if (reqHeaders?.authorization) {
46316
+ if (
46317
+ !cacheControlDirectives.public &&
46318
+ !cacheControlDirectives['s-maxage'] &&
46319
+ !cacheControlDirectives['must-revalidate']
46320
+ ) {
46321
+ return false
46322
+ }
46323
+
46324
+ if (typeof reqHeaders.authorization !== 'string') {
44846
46325
  return false
44847
46326
  }
44848
46327
 
@@ -44962,10 +46441,18 @@ function requireCacheHandler () {
44962
46441
  staleIfError = staleAt + (cacheControlDirectives['stale-if-error'] * 1000);
44963
46442
  }
44964
46443
 
44965
- if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {
46444
+ if (cacheControlDirectives.immutable && staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {
44966
46445
  immutable = now + 31536000000;
44967
46446
  }
44968
46447
 
46448
+ // When no stale directives or immutable flag, add a revalidation buffer
46449
+ // equal to the freshness lifetime so the entry survives past staleAt long
46450
+ // enough to be revalidated instead of silently disappearing.
46451
+ if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {
46452
+ const freshnessLifetime = staleAt - now;
46453
+ return staleAt + freshnessLifetime
46454
+ }
46455
+
44969
46456
  return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable)
44970
46457
  }
44971
46458
 
@@ -46182,12 +47669,26 @@ function requireDeduplicationHandler () {
46182
47669
  if (hasRequiredDeduplicationHandler) return deduplicationHandler;
46183
47670
  hasRequiredDeduplicationHandler = 1;
46184
47671
 
47672
+ const { RequestAbortedError } = requireErrors();
47673
+
46185
47674
  /**
46186
47675
  * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler
46187
47676
  */
46188
47677
 
47678
+ const DEFAULT_MAX_BUFFER_SIZE = 5 * 1024 * 1024;
47679
+
47680
+ /**
47681
+ * @typedef {Object} WaitingHandler
47682
+ * @property {DispatchHandler} handler
47683
+ * @property {import('../../types/dispatcher.d.ts').default.DispatchController} controller
47684
+ * @property {Buffer[]} bufferedChunks
47685
+ * @property {number} bufferedBytes
47686
+ * @property {object | null} pendingTrailers
47687
+ * @property {boolean} done
47688
+ */
47689
+
46189
47690
  /**
46190
- * Handler that buffers response data and notifies multiple waiting handlers.
47691
+ * Handler that forwards response events to multiple waiting handlers.
46191
47692
  * Used for request deduplication.
46192
47693
  *
46193
47694
  * @implements {DispatchHandler}
@@ -46199,14 +47700,14 @@ function requireDeduplicationHandler () {
46199
47700
  #primaryHandler
46200
47701
 
46201
47702
  /**
46202
- * @type {DispatchHandler[]}
47703
+ * @type {WaitingHandler[]}
46203
47704
  */
46204
47705
  #waitingHandlers = []
46205
47706
 
46206
47707
  /**
46207
- * @type {Buffer[]}
47708
+ * @type {number}
46208
47709
  */
46209
- #chunks = []
47710
+ #maxBufferSize = DEFAULT_MAX_BUFFER_SIZE
46210
47711
 
46211
47712
  /**
46212
47713
  * @type {number}
@@ -46228,6 +47729,21 @@ function requireDeduplicationHandler () {
46228
47729
  */
46229
47730
  #aborted = false
46230
47731
 
47732
+ /**
47733
+ * @type {boolean}
47734
+ */
47735
+ #responseStarted = false
47736
+
47737
+ /**
47738
+ * @type {boolean}
47739
+ */
47740
+ #responseDataStarted = false
47741
+
47742
+ /**
47743
+ * @type {boolean}
47744
+ */
47745
+ #completed = false
47746
+
46231
47747
  /**
46232
47748
  * @type {import('../../types/dispatcher.d.ts').default.DispatchController | null}
46233
47749
  */
@@ -46241,22 +47757,60 @@ function requireDeduplicationHandler () {
46241
47757
  /**
46242
47758
  * @param {DispatchHandler} primaryHandler The primary handler
46243
47759
  * @param {() => void} onComplete Callback when request completes
47760
+ * @param {number} [maxBufferSize] Maximum paused buffer size per waiting handler
46244
47761
  */
46245
- constructor (primaryHandler, onComplete) {
47762
+ constructor (primaryHandler, onComplete, maxBufferSize = DEFAULT_MAX_BUFFER_SIZE) {
46246
47763
  this.#primaryHandler = primaryHandler;
46247
47764
  this.#onComplete = onComplete;
47765
+ this.#maxBufferSize = maxBufferSize;
46248
47766
  }
46249
47767
 
46250
47768
  /**
46251
- * Add a waiting handler that will receive the buffered response
47769
+ * Add a waiting handler that will receive response events.
47770
+ * Returns false if deduplication can no longer safely attach this handler.
47771
+ *
46252
47772
  * @param {DispatchHandler} handler
47773
+ * @returns {boolean}
46253
47774
  */
46254
47775
  addWaitingHandler (handler) {
46255
- this.#waitingHandlers.push(handler);
47776
+ if (this.#completed || this.#responseDataStarted) {
47777
+ return false
47778
+ }
47779
+
47780
+ const waitingHandler = this.#createWaitingHandler(handler);
47781
+ const waitingController = waitingHandler.controller;
47782
+
47783
+ try {
47784
+ handler.onRequestStart?.(waitingController, null);
47785
+
47786
+ if (waitingController.aborted) {
47787
+ waitingHandler.done = true;
47788
+ return true
47789
+ }
47790
+
47791
+ if (this.#responseStarted) {
47792
+ handler.onResponseStart?.(
47793
+ waitingController,
47794
+ this.#statusCode,
47795
+ this.#headers,
47796
+ this.#statusMessage
47797
+ );
47798
+ }
47799
+ } catch {
47800
+ // Ignore errors from waiting handlers
47801
+ waitingHandler.done = true;
47802
+ return true
47803
+ }
47804
+
47805
+ if (!waitingController.aborted) {
47806
+ this.#waitingHandlers.push(waitingHandler);
47807
+ }
47808
+
47809
+ return true
46256
47810
  }
46257
47811
 
46258
47812
  /**
46259
- * @param {() => void} abort
47813
+ * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller
46260
47814
  * @param {any} context
46261
47815
  */
46262
47816
  onRequestStart (controller, context) {
@@ -46281,10 +47835,38 @@ function requireDeduplicationHandler () {
46281
47835
  * @param {string} statusMessage
46282
47836
  */
46283
47837
  onResponseStart (controller, statusCode, headers, statusMessage) {
47838
+ this.#responseStarted = true;
46284
47839
  this.#statusCode = statusCode;
46285
47840
  this.#headers = headers;
46286
47841
  this.#statusMessage = statusMessage;
47842
+
46287
47843
  this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage);
47844
+
47845
+ for (const waitingHandler of this.#waitingHandlers) {
47846
+ const { handler, controller: waitingController } = waitingHandler;
47847
+
47848
+ if (waitingHandler.done || waitingController.aborted) {
47849
+ waitingHandler.done = true;
47850
+ continue
47851
+ }
47852
+
47853
+ try {
47854
+ handler.onResponseStart?.(
47855
+ waitingController,
47856
+ statusCode,
47857
+ headers,
47858
+ statusMessage
47859
+ );
47860
+ } catch {
47861
+ // Ignore errors from waiting handlers
47862
+ }
47863
+
47864
+ if (waitingController.aborted) {
47865
+ waitingHandler.done = true;
47866
+ }
47867
+ }
47868
+
47869
+ this.#pruneDoneWaitingHandlers();
46288
47870
  }
46289
47871
 
46290
47872
  /**
@@ -46292,9 +47874,41 @@ function requireDeduplicationHandler () {
46292
47874
  * @param {Buffer} chunk
46293
47875
  */
46294
47876
  onResponseData (controller, chunk) {
46295
- // Buffer the chunk for waiting handlers
46296
- this.#chunks.push(Buffer.from(chunk));
47877
+ if (this.#aborted || this.#completed) {
47878
+ return
47879
+ }
47880
+
47881
+ this.#responseDataStarted = true;
47882
+
46297
47883
  this.#primaryHandler.onResponseData?.(controller, chunk);
47884
+
47885
+ for (const waitingHandler of this.#waitingHandlers) {
47886
+ const { handler, controller: waitingController } = waitingHandler;
47887
+
47888
+ if (waitingHandler.done || waitingController.aborted) {
47889
+ waitingHandler.done = true;
47890
+ continue
47891
+ }
47892
+
47893
+ if (waitingController.paused) {
47894
+ this.#bufferWaitingChunk(waitingHandler, chunk);
47895
+ continue
47896
+ }
47897
+
47898
+ try {
47899
+ handler.onResponseData?.(waitingController, chunk);
47900
+ } catch {
47901
+ // Ignore errors from waiting handlers
47902
+ }
47903
+
47904
+ if (waitingController.aborted) {
47905
+ waitingHandler.done = true;
47906
+ waitingHandler.bufferedChunks = [];
47907
+ waitingHandler.bufferedBytes = 0;
47908
+ }
47909
+ }
47910
+
47911
+ this.#pruneDoneWaitingHandlers();
46298
47912
  }
46299
47913
 
46300
47914
  /**
@@ -46302,8 +47916,41 @@ function requireDeduplicationHandler () {
46302
47916
  * @param {object} trailers
46303
47917
  */
46304
47918
  onResponseEnd (controller, trailers) {
47919
+ if (this.#aborted || this.#completed) {
47920
+ return
47921
+ }
47922
+
47923
+ this.#completed = true;
46305
47924
  this.#primaryHandler.onResponseEnd?.(controller, trailers);
46306
- this.#notifyWaitingHandlers();
47925
+
47926
+ for (const waitingHandler of this.#waitingHandlers) {
47927
+ if (waitingHandler.done || waitingHandler.controller.aborted) {
47928
+ waitingHandler.done = true;
47929
+ continue
47930
+ }
47931
+
47932
+ this.#flushWaitingHandler(waitingHandler);
47933
+
47934
+ if (waitingHandler.done || waitingHandler.controller.aborted) {
47935
+ waitingHandler.done = true;
47936
+ continue
47937
+ }
47938
+
47939
+ if (waitingHandler.controller.paused && waitingHandler.bufferedChunks.length > 0) {
47940
+ waitingHandler.pendingTrailers = trailers;
47941
+ continue
47942
+ }
47943
+
47944
+ try {
47945
+ waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, trailers);
47946
+ } catch {
47947
+ // Ignore errors from waiting handlers
47948
+ }
47949
+
47950
+ waitingHandler.done = true;
47951
+ }
47952
+
47953
+ this.#pruneDoneWaitingHandlers();
46307
47954
  this.#onComplete?.();
46308
47955
  }
46309
47956
 
@@ -46312,86 +47959,170 @@ function requireDeduplicationHandler () {
46312
47959
  * @param {Error} err
46313
47960
  */
46314
47961
  onResponseError (controller, err) {
47962
+ if (this.#completed) {
47963
+ return
47964
+ }
47965
+
46315
47966
  this.#aborted = true;
47967
+ this.#completed = true;
47968
+
46316
47969
  this.#primaryHandler.onResponseError?.(controller, err);
46317
- this.#notifyWaitingHandlersError(err);
47970
+
47971
+ for (const waitingHandler of this.#waitingHandlers) {
47972
+ this.#errorWaitingHandler(waitingHandler, err);
47973
+ }
47974
+
47975
+ this.#waitingHandlers = [];
46318
47976
  this.#onComplete?.();
46319
47977
  }
46320
47978
 
46321
47979
  /**
46322
- * Notify all waiting handlers with the buffered response
47980
+ * @param {DispatchHandler} handler
47981
+ * @returns {WaitingHandler}
46323
47982
  */
46324
- #notifyWaitingHandlers () {
46325
- const body = Buffer.concat(this.#chunks);
46326
-
46327
- for (const handler of this.#waitingHandlers) {
46328
- // Create a simple controller for each waiting handler
46329
- const waitingController = {
46330
- resume () {},
46331
- pause () {},
46332
- get paused () { return false },
46333
- get aborted () { return false },
46334
- get reason () { return null },
46335
- abort () {}
46336
- };
47983
+ #createWaitingHandler (handler) {
47984
+ /** @type {WaitingHandler} */
47985
+ const waitingHandler = {
47986
+ handler,
47987
+ controller: null,
47988
+ bufferedChunks: [],
47989
+ bufferedBytes: 0,
47990
+ pendingTrailers: null,
47991
+ done: false
47992
+ };
46337
47993
 
46338
- try {
46339
- handler.onRequestStart?.(waitingController, null);
47994
+ const state = {
47995
+ aborted: false,
47996
+ paused: false,
47997
+ reason: null
47998
+ };
46340
47999
 
46341
- if (waitingController.aborted) {
46342
- continue
48000
+ waitingHandler.controller = {
48001
+ resume: () => {
48002
+ if (state.aborted) {
48003
+ return
46343
48004
  }
46344
48005
 
46345
- handler.onResponseStart?.(
46346
- waitingController,
46347
- this.#statusCode,
46348
- this.#headers,
46349
- this.#statusMessage
46350
- );
48006
+ state.paused = false;
48007
+ this.#flushWaitingHandler(waitingHandler);
46351
48008
 
46352
- if (waitingController.aborted) {
46353
- continue
46354
- }
48009
+ if (
48010
+ this.#completed &&
48011
+ waitingHandler.pendingTrailers &&
48012
+ waitingHandler.bufferedChunks.length === 0 &&
48013
+ !state.paused &&
48014
+ !state.aborted
48015
+ ) {
48016
+ try {
48017
+ waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, waitingHandler.pendingTrailers);
48018
+ } catch {
48019
+ // Ignore errors from waiting handlers
48020
+ }
46355
48021
 
46356
- if (body.length > 0) {
46357
- handler.onResponseData?.(waitingController, body);
48022
+ waitingHandler.pendingTrailers = null;
48023
+ waitingHandler.done = true;
46358
48024
  }
46359
48025
 
46360
- handler.onResponseEnd?.(waitingController, {});
46361
- } catch {
46362
- // Ignore errors from waiting handlers
48026
+ this.#pruneDoneWaitingHandlers();
48027
+ },
48028
+ pause: () => {
48029
+ if (!state.aborted) {
48030
+ state.paused = true;
48031
+ }
48032
+ },
48033
+ get paused () { return state.paused },
48034
+ get aborted () { return state.aborted },
48035
+ get reason () { return state.reason },
48036
+ abort: (reason) => {
48037
+ state.aborted = true;
48038
+ state.reason = reason ?? null;
48039
+ waitingHandler.done = true;
48040
+ waitingHandler.pendingTrailers = null;
48041
+ waitingHandler.bufferedChunks = [];
48042
+ waitingHandler.bufferedBytes = 0;
46363
48043
  }
48044
+ };
48045
+
48046
+ return waitingHandler
48047
+ }
48048
+
48049
+ /**
48050
+ * @param {WaitingHandler} waitingHandler
48051
+ * @param {Buffer} chunk
48052
+ */
48053
+ #bufferWaitingChunk (waitingHandler, chunk) {
48054
+ if (waitingHandler.done || waitingHandler.controller.aborted) {
48055
+ waitingHandler.done = true;
48056
+ waitingHandler.bufferedChunks = [];
48057
+ waitingHandler.bufferedBytes = 0;
48058
+ return
46364
48059
  }
46365
48060
 
46366
- this.#waitingHandlers = [];
46367
- this.#chunks = [];
48061
+ const bufferedChunk = Buffer.from(chunk);
48062
+ waitingHandler.bufferedChunks.push(bufferedChunk);
48063
+ waitingHandler.bufferedBytes += bufferedChunk.length;
48064
+
48065
+ if (waitingHandler.bufferedBytes > this.#maxBufferSize) {
48066
+ const err = new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`);
48067
+ this.#errorWaitingHandler(waitingHandler, err);
48068
+ }
46368
48069
  }
46369
48070
 
46370
48071
  /**
46371
- * Notify all waiting handlers of an error
46372
- * @param {Error} err
48072
+ * @param {WaitingHandler} waitingHandler
46373
48073
  */
46374
- #notifyWaitingHandlersError (err) {
46375
- for (const handler of this.#waitingHandlers) {
46376
- const waitingController = {
46377
- resume () {},
46378
- pause () {},
46379
- get paused () { return false },
46380
- get aborted () { return true },
46381
- get reason () { return err },
46382
- abort () {}
46383
- };
48074
+ #flushWaitingHandler (waitingHandler) {
48075
+ const { handler, controller } = waitingHandler;
48076
+
48077
+ while (
48078
+ !waitingHandler.done &&
48079
+ !controller.aborted &&
48080
+ !controller.paused &&
48081
+ waitingHandler.bufferedChunks.length > 0
48082
+ ) {
48083
+ const bufferedChunk = waitingHandler.bufferedChunks.shift();
48084
+ waitingHandler.bufferedBytes -= bufferedChunk.length;
46384
48085
 
46385
48086
  try {
46386
- handler.onRequestStart?.(waitingController, null);
46387
- handler.onResponseError?.(waitingController, err);
48087
+ handler.onResponseData?.(controller, bufferedChunk);
46388
48088
  } catch {
46389
48089
  // Ignore errors from waiting handlers
46390
48090
  }
48091
+
48092
+ if (controller.aborted) {
48093
+ waitingHandler.done = true;
48094
+ waitingHandler.pendingTrailers = null;
48095
+ waitingHandler.bufferedChunks = [];
48096
+ waitingHandler.bufferedBytes = 0;
48097
+ break
48098
+ }
46391
48099
  }
48100
+ }
46392
48101
 
46393
- this.#waitingHandlers = [];
46394
- this.#chunks = [];
48102
+ /**
48103
+ * @param {WaitingHandler} waitingHandler
48104
+ * @param {Error} err
48105
+ */
48106
+ #errorWaitingHandler (waitingHandler, err) {
48107
+ if (waitingHandler.done) {
48108
+ return
48109
+ }
48110
+
48111
+ waitingHandler.done = true;
48112
+ waitingHandler.pendingTrailers = null;
48113
+ waitingHandler.bufferedChunks = [];
48114
+ waitingHandler.bufferedBytes = 0;
48115
+
48116
+ try {
48117
+ waitingHandler.controller.abort(err);
48118
+ waitingHandler.handler.onResponseError?.(waitingHandler.controller, err);
48119
+ } catch {
48120
+ // Ignore errors from waiting handlers
48121
+ }
48122
+ }
48123
+
48124
+ #pruneDoneWaitingHandlers () {
48125
+ this.#waitingHandlers = this.#waitingHandlers.filter(waitingHandler => waitingHandler.done === false);
46395
48126
  }
46396
48127
  }
46397
48128
 
@@ -46406,7 +48137,7 @@ function requireDeduplicate () {
46406
48137
  if (hasRequiredDeduplicate) return deduplicate;
46407
48138
  hasRequiredDeduplicate = 1;
46408
48139
 
46409
- const diagnosticsChannel = require$$0$a;
48140
+ const diagnosticsChannel = require$$0$9;
46410
48141
  const util = requireUtil$5();
46411
48142
  const DeduplicationHandler = requireDeduplicationHandler();
46412
48143
  const { normalizeHeaders, makeCacheKey, makeDeduplicationKey } = requireCache$2();
@@ -46421,7 +48152,8 @@ function requireDeduplicate () {
46421
48152
  const {
46422
48153
  methods = ['GET'],
46423
48154
  skipHeaderNames = [],
46424
- excludeHeaderNames = []
48155
+ excludeHeaderNames = [],
48156
+ maxBufferSize = 5 * 1024 * 1024
46425
48157
  } = opts;
46426
48158
 
46427
48159
  if (typeof opts !== 'object' || opts === null) {
@@ -46446,6 +48178,10 @@ function requireDeduplicate () {
46446
48178
  throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`)
46447
48179
  }
46448
48180
 
48181
+ if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) {
48182
+ throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`)
48183
+ }
48184
+
46449
48185
  // Convert to lowercase Set for case-insensitive header matching
46450
48186
  const skipHeaderNamesSet = new Set(skipHeaderNames.map(name => name.toLowerCase()));
46451
48187
 
@@ -46484,9 +48220,13 @@ function requireDeduplicate () {
46484
48220
  // Check if there's already a pending request for this key
46485
48221
  const pendingHandler = pendingRequests.get(dedupeKey);
46486
48222
  if (pendingHandler) {
46487
- // Add this handler to the waiting list
46488
- pendingHandler.addWaitingHandler(handler);
46489
- return true
48223
+ // Add this handler to the waiting list when safe.
48224
+ // If body streaming has already started, this request must be sent independently.
48225
+ if (pendingHandler.addWaitingHandler(handler)) {
48226
+ return true
48227
+ }
48228
+
48229
+ return dispatch(opts, handler)
46490
48230
  }
46491
48231
 
46492
48232
  // Create a new deduplication handler
@@ -46498,7 +48238,8 @@ function requireDeduplicate () {
46498
48238
  if (pendingRequestsChannel.hasSubscribers) {
46499
48239
  pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'removed' });
46500
48240
  }
46501
- }
48241
+ },
48242
+ maxBufferSize
46502
48243
  );
46503
48244
 
46504
48245
  // Register the pending request
@@ -46631,7 +48372,7 @@ function requireSqliteCacheStore () {
46631
48372
  }
46632
48373
 
46633
48374
  if (!DatabaseSync) {
46634
- DatabaseSync = require$$1$4.DatabaseSync;
48375
+ DatabaseSync = require$$1$5.DatabaseSync;
46635
48376
  }
46636
48377
  this.#db = new DatabaseSync(opts?.location ?? ':memory:');
46637
48378
 
@@ -46737,7 +48478,7 @@ function requireSqliteCacheStore () {
46737
48478
  SELECT
46738
48479
  id
46739
48480
  FROM cacheInterceptorV${VERSION}
46740
- ORDER BY cachedAt DESC
48481
+ ORDER BY cachedAt ASC
46741
48482
  LIMIT ?
46742
48483
  )
46743
48484
  `);
@@ -46804,7 +48545,6 @@ function requireSqliteCacheStore () {
46804
48545
  existingValue.id
46805
48546
  );
46806
48547
  } else {
46807
- this.#prune();
46808
48548
  // New response, let's insert it
46809
48549
  this.#insertValueQuery.run(
46810
48550
  url,
@@ -46820,6 +48560,7 @@ function requireSqliteCacheStore () {
46820
48560
  value.cachedAt,
46821
48561
  value.staleAt
46822
48562
  );
48563
+ this.#prune();
46823
48564
  }
46824
48565
  }
46825
48566
 
@@ -46930,7 +48671,7 @@ function requireSqliteCacheStore () {
46930
48671
  const now = Date.now();
46931
48672
  for (const value of values) {
46932
48673
  if (now >= value.deleteAt && !canBeExpired) {
46933
- return undefined
48674
+ continue
46934
48675
  }
46935
48676
 
46936
48677
  let matches = true;
@@ -50051,7 +51792,10 @@ function requireFetch () {
50051
51792
  request,
50052
51793
  processResponseEndOfBody: handleFetchDone,
50053
51794
  processResponse,
50054
- dispatcher: getRequestDispatcher(requestObject) // undici
51795
+ dispatcher: getRequestDispatcher(requestObject), // undici
51796
+ // Keep requestObject alive to prevent its AbortController from being GC'd
51797
+ // See https://github.com/nodejs/undici/issues/4627
51798
+ requestObject
50055
51799
  });
50056
51800
 
50057
51801
  // 14. Return p.
@@ -50170,7 +51914,8 @@ function requireFetch () {
50170
51914
  processResponseEndOfBody,
50171
51915
  processResponseConsumeBody,
50172
51916
  useParallelQueue = false,
50173
- dispatcher = getGlobalDispatcher() // undici
51917
+ dispatcher = getGlobalDispatcher(), // undici
51918
+ requestObject = null // Keep alive to prevent AbortController GC, see #4627
50174
51919
  }) {
50175
51920
  // Ensure that the dispatcher is set accordingly
50176
51921
  assert(dispatcher);
@@ -50224,7 +51969,9 @@ function requireFetch () {
50224
51969
  processResponseConsumeBody,
50225
51970
  processResponseEndOfBody,
50226
51971
  taskDestination,
50227
- crossOriginIsolatedCapability
51972
+ crossOriginIsolatedCapability,
51973
+ // Keep requestObject alive to prevent its AbortController from being GC'd
51974
+ requestObject
50228
51975
  };
50229
51976
 
50230
51977
  // 7. If request’s body is a byte sequence, then set request’s body to
@@ -50588,7 +52335,7 @@ function requireFetch () {
50588
52335
  }
50589
52336
  case 'blob:': {
50590
52337
  if (!resolveObjectURL) {
50591
- resolveObjectURL = require$$0$b.resolveObjectURL;
52338
+ resolveObjectURL = require$$0$a.resolveObjectURL;
50592
52339
  }
50593
52340
 
50594
52341
  // 1. Let blobURLEntry be request’s current URL’s blob URL entry.
@@ -50820,7 +52567,7 @@ function requireFetch () {
50820
52567
  let responseStatus = 0;
50821
52568
 
50822
52569
  // 7. If fetchParams’s request’s mode is not "navigate" or response’s has-cross-origin-redirects is false:
50823
- if (fetchParams.request.mode !== 'navigator' || !response.hasCrossOriginRedirects) {
52570
+ if (fetchParams.request.mode !== 'navigate' || !response.hasCrossOriginRedirects) {
50824
52571
  // 1. Set responseStatus to response’s status.
50825
52572
  responseStatus = response.status;
50826
52573
 
@@ -51212,7 +52959,10 @@ function requireFetch () {
51212
52959
  // 8. If contentLengthHeaderValue is non-null, then append
51213
52960
  // `Content-Length`/contentLengthHeaderValue to httpRequest’s header
51214
52961
  // list.
51215
- if (contentLengthHeaderValue != null) {
52962
+ if (
52963
+ contentLengthHeaderValue != null &&
52964
+ !httpRequest.headersList.contains('content-length', true)
52965
+ ) {
51216
52966
  httpRequest.headersList.append('content-length', contentLengthHeaderValue, true);
51217
52967
  }
51218
52968
 
@@ -51409,12 +53159,25 @@ function requireFetch () {
51409
53159
  // 14. If response’s status is 401, httpRequest’s response tainting is not "cors",
51410
53160
  // includeCredentials is true, and request’s traversable for user prompts is
51411
53161
  // a traversable navigable:
51412
- if (response.status === 401 && httpRequest.responseTainting !== 'cors' && includeCredentials && isTraversableNavigable(request.traversableForUserPrompts)) {
53162
+ //
53163
+ // In Node.js there is no traversable navigable to prompt the user, but we
53164
+ // still need to handle URL-embedded credentials so authentication retries
53165
+ // for WebSocket handshakes continue to work.
53166
+ if (response.status === 401 && httpRequest.responseTainting !== 'cors' && includeCredentials && (
53167
+ request.useURLCredentials !== undefined ||
53168
+ isTraversableNavigable(request.traversableForUserPrompts)
53169
+ )) {
51413
53170
  // 2. If request’s body is non-null, then:
51414
53171
  if (request.body != null) {
51415
53172
  // 1. If request’s body’s source is null, then return a network error.
51416
53173
  if (request.body.source == null) {
51417
- return makeNetworkError('expected non-null body source')
53174
+ // Note: In Node.js, this code path should not be reached because
53175
+ // isTraversableNavigable() returns false for non-navigable contexts.
53176
+ // However, we handle it gracefully by returning the response instead of
53177
+ // a network error, as we won't actually retry the request.
53178
+ // This aligns with the Fetch spec discussion in whatwg/fetch#1132,
53179
+ // which allows implementations flexibility when credentials can't be obtained.
53180
+ return response
51418
53181
  }
51419
53182
 
51420
53183
  // 2. Set request’s body to the body of the result of safely extracting
@@ -51870,9 +53633,12 @@ function requireFetch () {
51870
53633
  /** @type {import('../../..').Agent} */
51871
53634
  const agent = fetchParams.controller.dispatcher;
51872
53635
 
53636
+ const path = url.pathname + url.search;
53637
+ const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === '?';
53638
+
51873
53639
  return new Promise((resolve, reject) => agent.dispatch(
51874
53640
  {
51875
- path: url.pathname + url.search,
53641
+ path: hasTrailingQuestionMark ? `${path}?` : path,
51876
53642
  origin: url.origin,
51877
53643
  method: request.method,
51878
53644
  body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
@@ -51922,7 +53688,15 @@ function requireFetch () {
51922
53688
  const headersList = new HeadersList();
51923
53689
 
51924
53690
  for (let i = 0; i < rawHeaders.length; i += 2) {
51925
- headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true);
53691
+ const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i]);
53692
+ const value = rawHeaders[i + 1];
53693
+ if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {
53694
+ for (const val of value) {
53695
+ headersList.append(nameStr, val.toString('latin1'), true);
53696
+ }
53697
+ } else {
53698
+ headersList.append(nameStr, value.toString('latin1'), true);
53699
+ }
51926
53700
  }
51927
53701
  const location = headersList.get('location', true);
51928
53702
 
@@ -52091,7 +53865,15 @@ function requireFetch () {
52091
53865
  const headersList = new HeadersList();
52092
53866
 
52093
53867
  for (let i = 0; i < rawHeaders.length; i += 2) {
52094
- headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true);
53868
+ const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i]);
53869
+ const value = rawHeaders[i + 1];
53870
+ if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {
53871
+ for (const val of value) {
53872
+ headersList.append(nameStr, val.toString('latin1'), true);
53873
+ }
53874
+ } else {
53875
+ headersList.append(nameStr, value.toString('latin1'), true);
53876
+ }
52095
53877
  }
52096
53878
 
52097
53879
  resolve({
@@ -53523,7 +55305,6 @@ function requireParse$2 () {
53523
55305
  const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$1();
53524
55306
  const { isCTLExcludingHtab } = requireUtil$2();
53525
55307
  const assert = require$$0$7;
53526
- const { unescape: qsUnescape } = require$$5$1;
53527
55308
 
53528
55309
  /**
53529
55310
  * @description Parses the field-value attributes of a set-cookie header string.
@@ -53601,7 +55382,7 @@ function requireParse$2 () {
53601
55382
  // store arbitrary data in a cookie-value SHOULD encode that data, for
53602
55383
  // example, using Base64 [RFC4648].
53603
55384
  return {
53604
- name, value: qsUnescape(value), ...parseUnparsedAttributes(unparsedAttributes)
55385
+ name, value, ...parseUnparsedAttributes(unparsedAttributes)
53605
55386
  }
53606
55387
  }
53607
55388
 
@@ -53799,32 +55580,25 @@ function requireParse$2 () {
53799
55580
  // If the attribute-name case-insensitively matches the string
53800
55581
  // "SameSite", the user agent MUST process the cookie-av as follows:
53801
55582
 
53802
- // 1. Let enforcement be "Default".
53803
- let enforcement = 'Default';
53804
-
53805
55583
  const attributeValueLowercase = attributeValue.toLowerCase();
53806
- // 2. If cookie-av's attribute-value is a case-insensitive match for
53807
- // "None", set enforcement to "None".
53808
- if (attributeValueLowercase.includes('none')) {
53809
- enforcement = 'None';
53810
- }
53811
-
53812
- // 3. If cookie-av's attribute-value is a case-insensitive match for
53813
- // "Strict", set enforcement to "Strict".
53814
- if (attributeValueLowercase.includes('strict')) {
53815
- enforcement = 'Strict';
53816
- }
53817
55584
 
53818
- // 4. If cookie-av's attribute-value is a case-insensitive match for
53819
- // "Lax", set enforcement to "Lax".
53820
- if (attributeValueLowercase.includes('lax')) {
53821
- enforcement = 'Lax';
55585
+ // 1. If cookie-av's attribute-value is a case-insensitive match for
55586
+ // "None", append an attribute to the cookie-attribute-list with an
55587
+ // attribute-name of "SameSite" and an attribute-value of "None".
55588
+ if (attributeValueLowercase === 'none') {
55589
+ cookieAttributeList.sameSite = 'None';
55590
+ } else if (attributeValueLowercase === 'strict') {
55591
+ // 2. If cookie-av's attribute-value is a case-insensitive match for
55592
+ // "Strict", append an attribute to the cookie-attribute-list with
55593
+ // an attribute-name of "SameSite" and an attribute-value of
55594
+ // "Strict".
55595
+ cookieAttributeList.sameSite = 'Strict';
55596
+ } else if (attributeValueLowercase === 'lax') {
55597
+ // 3. If cookie-av's attribute-value is a case-insensitive match for
55598
+ // "Lax", append an attribute to the cookie-attribute-list with an
55599
+ // attribute-name of "SameSite" and an attribute-value of "Lax".
55600
+ cookieAttributeList.sameSite = 'Lax';
53822
55601
  }
53823
-
53824
- // 5. Append an attribute to the cookie-attribute-list with an
53825
- // attribute-name of "SameSite" and an attribute-value of
53826
- // enforcement.
53827
- cookieAttributeList.sameSite = enforcement;
53828
55602
  } else {
53829
55603
  cookieAttributeList.unparsed ??= [];
53830
55604
 
@@ -54530,7 +56304,7 @@ function requireUtil$1 () {
54530
56304
  hasRequiredUtil$1 = 1;
54531
56305
 
54532
56306
  const { states, opcodes } = requireConstants();
54533
- const { isUtf8 } = require$$0$b;
56307
+ const { isUtf8 } = require$$0$a;
54534
56308
  const { removeHTTPWhitespace } = requireDataUrl();
54535
56309
  const { collectASequenceOfCodePointsFast } = requireInfra();
54536
56310
 
@@ -54756,6 +56530,12 @@ function requireUtil$1 () {
54756
56530
  * @returns {boolean}
54757
56531
  */
54758
56532
  function isValidClientWindowBits (value) {
56533
+ // Must have at least one character
56534
+ if (value.length === 0) {
56535
+ return false
56536
+ }
56537
+
56538
+ // Check all characters are ASCII digits
54759
56539
  for (let i = 0; i < value.length; i++) {
54760
56540
  const byte = value.charCodeAt(i);
54761
56541
 
@@ -54764,7 +56544,9 @@ function requireUtil$1 () {
54764
56544
  }
54765
56545
  }
54766
56546
 
54767
- return true
56547
+ // Check numeric range: zlib requires windowBits in range 8-15
56548
+ const num = Number.parseInt(value, 10);
56549
+ return num >= 8 && num <= 15
54768
56550
  }
54769
56551
 
54770
56552
  /**
@@ -55354,6 +57136,7 @@ function requirePermessageDeflate () {
55354
57136
 
55355
57137
  const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require$$3$4;
55356
57138
  const { isValidClientWindowBits } = requireUtil$1();
57139
+ const { MessageSizeExceededError } = requireErrors();
55357
57140
 
55358
57141
  const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]);
55359
57142
  const kBuffer = Symbol('kBuffer');
@@ -55365,17 +57148,29 @@ function requirePermessageDeflate () {
55365
57148
 
55366
57149
  #options = {}
55367
57150
 
55368
- constructor (extensions) {
57151
+ #maxPayloadSize = 0
57152
+
57153
+ /**
57154
+ * @param {Map<string, string>} extensions
57155
+ */
57156
+ constructor (extensions, options) {
55369
57157
  this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover');
55370
57158
  this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits');
57159
+
57160
+ this.#maxPayloadSize = options.maxPayloadSize;
55371
57161
  }
55372
57162
 
57163
+ /**
57164
+ * Decompress a compressed payload.
57165
+ * @param {Buffer} chunk Compressed data
57166
+ * @param {boolean} fin Final fragment flag
57167
+ * @param {Function} callback Callback function
57168
+ */
55373
57169
  decompress (chunk, fin, callback) {
55374
57170
  // An endpoint uses the following algorithm to decompress a message.
55375
57171
  // 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the
55376
57172
  // payload of the message.
55377
57173
  // 2. Decompress the resulting data using DEFLATE.
55378
-
55379
57174
  if (!this.#inflate) {
55380
57175
  let windowBits = Z_DEFAULT_WINDOWBITS;
55381
57176
 
@@ -55388,13 +57183,26 @@ function requirePermessageDeflate () {
55388
57183
  windowBits = Number.parseInt(this.#options.serverMaxWindowBits);
55389
57184
  }
55390
57185
 
55391
- this.#inflate = createInflateRaw({ windowBits });
57186
+ try {
57187
+ this.#inflate = createInflateRaw({ windowBits });
57188
+ } catch (err) {
57189
+ callback(err);
57190
+ return
57191
+ }
55392
57192
  this.#inflate[kBuffer] = [];
55393
57193
  this.#inflate[kLength] = 0;
55394
57194
 
55395
57195
  this.#inflate.on('data', (data) => {
55396
- this.#inflate[kBuffer].push(data);
55397
57196
  this.#inflate[kLength] += data.length;
57197
+
57198
+ if (this.#maxPayloadSize > 0 && this.#inflate[kLength] > this.#maxPayloadSize) {
57199
+ callback(new MessageSizeExceededError());
57200
+ this.#inflate.removeAllListeners();
57201
+ this.#inflate = null;
57202
+ return
57203
+ }
57204
+
57205
+ this.#inflate[kBuffer].push(data);
55398
57206
  });
55399
57207
 
55400
57208
  this.#inflate.on('error', (err) => {
@@ -55409,6 +57217,10 @@ function requirePermessageDeflate () {
55409
57217
  }
55410
57218
 
55411
57219
  this.#inflate.flush(() => {
57220
+ if (!this.#inflate) {
57221
+ return
57222
+ }
57223
+
55412
57224
  const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]);
55413
57225
 
55414
57226
  this.#inflate[kBuffer].length = 0;
@@ -55445,6 +57257,7 @@ function requireReceiver () {
55445
57257
  const { failWebsocketConnection } = requireConnection();
55446
57258
  const { WebsocketFrameSend } = requireFrame();
55447
57259
  const { PerMessageDeflate } = requirePermessageDeflate();
57260
+ const { MessageSizeExceededError } = requireErrors();
55448
57261
 
55449
57262
  // This code was influenced by ws released under the MIT license.
55450
57263
  // Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
@@ -55468,14 +57281,27 @@ function requireReceiver () {
55468
57281
  /** @type {import('./websocket').Handler} */
55469
57282
  #handler
55470
57283
 
55471
- constructor (handler, extensions) {
57284
+ /** @type {number} */
57285
+ #maxFragments
57286
+
57287
+ /** @type {number} */
57288
+ #maxPayloadSize
57289
+
57290
+ /**
57291
+ * @param {import('./websocket').Handler} handler
57292
+ * @param {Map<string, string>|null} extensions
57293
+ * @param {{ maxFragments?: number, maxPayloadSize?: number }} [options]
57294
+ */
57295
+ constructor (handler, extensions, options = {}) {
55472
57296
  super();
55473
57297
 
55474
57298
  this.#handler = handler;
55475
57299
  this.#extensions = extensions == null ? new Map() : extensions;
57300
+ this.#maxFragments = options.maxFragments ?? 0;
57301
+ this.#maxPayloadSize = options.maxPayloadSize ?? 0;
55476
57302
 
55477
57303
  if (this.#extensions.has('permessage-deflate')) {
55478
- this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions));
57304
+ this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions, options));
55479
57305
  }
55480
57306
  }
55481
57307
 
@@ -55491,6 +57317,19 @@ function requireReceiver () {
55491
57317
  this.run(callback);
55492
57318
  }
55493
57319
 
57320
+ #validatePayloadLength () {
57321
+ if (
57322
+ this.#maxPayloadSize > 0 &&
57323
+ !isControlFrame(this.#info.opcode) &&
57324
+ this.#info.payloadLength + this.#fragmentsBytes > this.#maxPayloadSize
57325
+ ) {
57326
+ failWebsocketConnection(this.#handler, 1009, 'Payload size exceeds maximum allowed size');
57327
+ return false
57328
+ }
57329
+
57330
+ return true
57331
+ }
57332
+
55494
57333
  /**
55495
57334
  * Runs whenever a new chunk is received.
55496
57335
  * Callback is called whenever there are no more chunks buffering,
@@ -55579,6 +57418,10 @@ function requireReceiver () {
55579
57418
  if (payloadLength <= 125) {
55580
57419
  this.#info.payloadLength = payloadLength;
55581
57420
  this.#state = parserStates.READ_DATA;
57421
+
57422
+ if (!this.#validatePayloadLength()) {
57423
+ return
57424
+ }
55582
57425
  } else if (payloadLength === 126) {
55583
57426
  this.#state = parserStates.PAYLOADLENGTH_16;
55584
57427
  } else if (payloadLength === 127) {
@@ -55603,6 +57446,10 @@ function requireReceiver () {
55603
57446
 
55604
57447
  this.#info.payloadLength = buffer.readUInt16BE(0);
55605
57448
  this.#state = parserStates.READ_DATA;
57449
+
57450
+ if (!this.#validatePayloadLength()) {
57451
+ return
57452
+ }
55606
57453
  } else if (this.#state === parserStates.PAYLOADLENGTH_64) {
55607
57454
  if (this.#byteOffset < 8) {
55608
57455
  return callback()
@@ -55610,6 +57457,7 @@ function requireReceiver () {
55610
57457
 
55611
57458
  const buffer = this.consume(8);
55612
57459
  const upper = buffer.readUInt32BE(0);
57460
+ const lower = buffer.readUInt32BE(4);
55613
57461
 
55614
57462
  // 2^31 is the maximum bytes an arraybuffer can contain
55615
57463
  // on 32-bit systems. Although, on 64-bit systems, this is
@@ -55617,15 +57465,17 @@ function requireReceiver () {
55617
57465
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length
55618
57466
  // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275
55619
57467
  // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e
55620
- if (upper > 2 ** 31 - 1) {
57468
+ if (upper !== 0 || lower > 2 ** 31 - 1) {
55621
57469
  failWebsocketConnection(this.#handler, 1009, 'Received payload length > 2^31 bytes.');
55622
57470
  return
55623
57471
  }
55624
57472
 
55625
- const lower = buffer.readUInt32BE(4);
55626
-
55627
- this.#info.payloadLength = (upper << 8) + lower;
57473
+ this.#info.payloadLength = lower;
55628
57474
  this.#state = parserStates.READ_DATA;
57475
+
57476
+ if (!this.#validatePayloadLength()) {
57477
+ return
57478
+ }
55629
57479
  } else if (this.#state === parserStates.READ_DATA) {
55630
57480
  if (this.#byteOffset < this.#info.payloadLength) {
55631
57481
  return callback()
@@ -55638,7 +57488,9 @@ function requireReceiver () {
55638
57488
  this.#state = parserStates.INFO;
55639
57489
  } else {
55640
57490
  if (!this.#info.compressed) {
55641
- this.writeFragments(body);
57491
+ if (!this.writeFragments(body)) {
57492
+ return
57493
+ }
55642
57494
 
55643
57495
  // If the frame is not fragmented, a message has been received.
55644
57496
  // If the frame is fragmented, it will terminate with a fin bit set
@@ -55650,27 +57502,41 @@ function requireReceiver () {
55650
57502
 
55651
57503
  this.#state = parserStates.INFO;
55652
57504
  } else {
55653
- this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => {
55654
- if (error) {
55655
- failWebsocketConnection(this.#handler, 1007, error.message);
55656
- return
55657
- }
57505
+ this.#extensions.get('permessage-deflate').decompress(
57506
+ body,
57507
+ this.#info.fin,
57508
+ (error, data) => {
57509
+ if (error) {
57510
+ const code = error instanceof MessageSizeExceededError ? 1009 : 1007;
57511
+ failWebsocketConnection(this.#handler, code, error.message);
57512
+ return
57513
+ }
55658
57514
 
55659
- this.writeFragments(data);
57515
+ if (!this.writeFragments(data)) {
57516
+ return
57517
+ }
55660
57518
 
55661
- if (!this.#info.fin) {
55662
- this.#state = parserStates.INFO;
55663
- this.#loop = true;
55664
- this.run(callback);
55665
- return
55666
- }
57519
+ // Check cumulative fragment size
57520
+ if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) {
57521
+ failWebsocketConnection(this.#handler, 1009, new MessageSizeExceededError().message);
57522
+ return
57523
+ }
55667
57524
 
55668
- websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments());
57525
+ if (!this.#info.fin) {
57526
+ this.#state = parserStates.INFO;
57527
+ this.#loop = true;
57528
+ this.run(callback);
57529
+ return
57530
+ }
55669
57531
 
55670
- this.#loop = true;
55671
- this.#state = parserStates.INFO;
55672
- this.run(callback);
55673
- });
57532
+ websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments());
57533
+
57534
+ this.#loop = true;
57535
+ this.#state = parserStates.INFO;
57536
+ this.run(callback);
57537
+ },
57538
+ this.#fragmentsBytes
57539
+ );
55674
57540
 
55675
57541
  this.#loop = false;
55676
57542
  break
@@ -55729,8 +57595,17 @@ function requireReceiver () {
55729
57595
  }
55730
57596
 
55731
57597
  writeFragments (fragment) {
57598
+ if (
57599
+ this.#maxFragments > 0 &&
57600
+ this.#fragments.length === this.#maxFragments
57601
+ ) {
57602
+ failWebsocketConnection(this.#handler, 1008, 'Too many message fragments');
57603
+ return false
57604
+ }
57605
+
55732
57606
  this.#fragmentsBytes += fragment.length;
55733
57607
  this.#fragments.push(fragment);
57608
+ return true
55734
57609
  }
55735
57610
 
55736
57611
  consumeFragments () {
@@ -56024,6 +57899,18 @@ function requireWebsocket () {
56024
57899
  const { WebsocketFrameSend } = requireFrame();
56025
57900
  const { channels } = requireDiagnostics();
56026
57901
 
57902
+ function getSocketAddress (socket) {
57903
+ if (typeof socket?.address === 'function') {
57904
+ return socket.address()
57905
+ }
57906
+
57907
+ if (typeof socket?.session?.socket?.address === 'function') {
57908
+ return socket.session.socket.address()
57909
+ }
57910
+
57911
+ return null
57912
+ }
57913
+
56027
57914
  /**
56028
57915
  * @typedef {object} Handler
56029
57916
  * @property {(response: any, extensions?: string[]) => void} onConnectionEstablished
@@ -56451,11 +58338,18 @@ function requireWebsocket () {
56451
58338
  * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol
56452
58339
  */
56453
58340
  #onConnectionEstablished (response, parsedExtensions) {
56454
- // processResponse is called when the "responses header list has been received and initialized."
58341
+ // processResponse is called when the "response's header list has been received and initialized."
56455
58342
  // once this happens, the connection is open
56456
58343
  this.#handler.socket = response.socket;
56457
58344
 
56458
- const parser = new ByteParser(this.#handler, parsedExtensions);
58345
+ const webSocketOptions = this.#handler.controller.dispatcher?.webSocketOptions;
58346
+ const maxFragments = webSocketOptions?.maxFragments;
58347
+ const maxPayloadSize = webSocketOptions?.maxPayloadSize;
58348
+
58349
+ const parser = new ByteParser(this.#handler, parsedExtensions, {
58350
+ maxFragments,
58351
+ maxPayloadSize
58352
+ });
56459
58353
  parser.on('drain', () => this.#handler.onParserDrain());
56460
58354
  parser.on('error', (err) => this.#handler.onParserError(err));
56461
58355
 
@@ -56490,7 +58384,7 @@ function requireWebsocket () {
56490
58384
  // Convert headers to a plain object for the event
56491
58385
  const headers = response.headersList.entries;
56492
58386
  channels.open.publish({
56493
- address: response.socket.address(),
58387
+ address: getSocketAddress(response.socket),
56494
58388
  protocol: this.#protocol,
56495
58389
  extensions: this.#extensions,
56496
58390
  websocket: this,
@@ -57116,7 +59010,14 @@ function requireWebsocketstream () {
57116
59010
  #onConnectionEstablished (response, parsedExtensions) {
57117
59011
  this.#handler.socket = response.socket;
57118
59012
 
57119
- const parser = new ByteParser(this.#handler, parsedExtensions);
59013
+ // Get options from dispatcher options
59014
+ const maxFragments = this.#handler.controller.dispatcher?.webSocketOptions?.maxFragments;
59015
+ const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize;
59016
+
59017
+ const parser = new ByteParser(this.#handler, parsedExtensions, {
59018
+ maxFragments,
59019
+ maxPayloadSize
59020
+ });
57120
59021
  parser.on('drain', () => this.#handler.onParserDrain());
57121
59022
  parser.on('error', (err) => this.#handler.onParserError(err));
57122
59023
 
@@ -57142,12 +59043,6 @@ function requireWebsocketstream () {
57142
59043
  start: (controller) => {
57143
59044
  this.#readableStreamController = controller;
57144
59045
  },
57145
- pull (controller) {
57146
- let chunk;
57147
- while (controller.desiredSize > 0 && (chunk = response.socket.read()) !== null) {
57148
- controller.enqueue(chunk);
57149
- }
57150
- },
57151
59046
  cancel: (reason) => this.#cancel(reason)
57152
59047
  });
57153
59048
 
@@ -57196,7 +59091,7 @@ function requireWebsocketstream () {
57196
59091
  try {
57197
59092
  chunk = utf8Decode(data);
57198
59093
  } catch {
57199
- failWebsocketConnection(this.#handler, 'Received invalid UTF-8 in text frame.');
59094
+ failWebsocketConnection(this.#handler, 1007, 'Received invalid UTF-8 in text frame.');
57200
59095
  return
57201
59096
  }
57202
59097
  } else if (type === opcodes.BINARY) {
@@ -58325,6 +60220,7 @@ function requireUndici () {
58325
60220
  const RoundRobinPool = requireRoundRobinPool();
58326
60221
  const Agent = requireAgent();
58327
60222
  const ProxyAgent = requireProxyAgent();
60223
+ const Socks5ProxyAgent = requireSocks5ProxyAgent();
58328
60224
  const EnvHttpProxyAgent = requireEnvHttpProxyAgent();
58329
60225
  const RetryAgent = requireRetryAgent();
58330
60226
  const H2CClient = requireH2cClient();
@@ -58353,6 +60249,7 @@ function requireUndici () {
58353
60249
  module.exports.RoundRobinPool = RoundRobinPool;
58354
60250
  module.exports.Agent = Agent;
58355
60251
  module.exports.ProxyAgent = ProxyAgent;
60252
+ module.exports.Socks5ProxyAgent = Socks5ProxyAgent;
58356
60253
  module.exports.EnvHttpProxyAgent = EnvHttpProxyAgent;
58357
60254
  module.exports.RetryAgent = RetryAgent;
58358
60255
  module.exports.H2CClient = H2CClient;
@@ -62047,7 +63944,7 @@ function requireInternal () {
62047
63944
  //------------------------------------------------------------------------------
62048
63945
 
62049
63946
  // We use node.js internal decoder. Its signature is the same as ours.
62050
- var StringDecoder = require$$1$8.StringDecoder;
63947
+ var StringDecoder = require$$1$9.StringDecoder;
62051
63948
 
62052
63949
  if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
62053
63950
  StringDecoder.prototype.end = function() {};
@@ -85575,11 +87472,7 @@ function requireJson () {
85575
87472
  var partial = '';
85576
87473
 
85577
87474
  if (index !== -1) {
85578
- partial = str.substring(0, index) + JSON_SYNTAX_CHAR;
85579
-
85580
- for (var i = index + 1; i < str.length; i++) {
85581
- partial += JSON_SYNTAX_CHAR;
85582
- }
87475
+ partial = str.substring(0, index) + new Array(str.length - index + 1).join(JSON_SYNTAX_CHAR);
85583
87476
  }
85584
87477
 
85585
87478
  try {
@@ -87972,6 +89865,8 @@ function requireUtils$1 () {
87972
89865
  var newIndex = getMaxIndex(target) + 1;
87973
89866
  target[newIndex] = source;
87974
89867
  setMaxIndex(target, newIndex);
89868
+ } else if (options && options.strictMerge) {
89869
+ return [target, source];
87975
89870
  } else if (
87976
89871
  (options && (options.plainObjects || options.allowPrototypes))
87977
89872
  || !has.call(Object.prototype, source)
@@ -88353,7 +90248,7 @@ function requireStringify () {
88353
90248
 
88354
90249
  if (obj === null) {
88355
90250
  if (strictNullHandling) {
88356
- return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
90251
+ return formatter(encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix);
88357
90252
  }
88358
90253
 
88359
90254
  obj = '';
@@ -88377,7 +90272,9 @@ function requireStringify () {
88377
90272
  if (generateArrayPrefix === 'comma' && isArray(obj)) {
88378
90273
  // we need to join elements in
88379
90274
  if (encodeValuesOnly && encoder) {
88380
- obj = utils.maybeMap(obj, encoder);
90275
+ obj = utils.maybeMap(obj, function (v) {
90276
+ return v == null ? v : encoder(v);
90277
+ });
88381
90278
  }
88382
90279
  objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
88383
90280
  } else if (isArray(filter)) {
@@ -88547,6 +90444,11 @@ function requireStringify () {
88547
90444
  var sideChannel = getSideChannel();
88548
90445
  for (var i = 0; i < objKeys.length; ++i) {
88549
90446
  var key = objKeys[i];
90447
+
90448
+ if (typeof key === 'undefined' || key === null) {
90449
+ continue;
90450
+ }
90451
+
88550
90452
  var value = obj[key];
88551
90453
 
88552
90454
  if (options.skipNulls && value === null) {
@@ -88580,10 +90482,10 @@ function requireStringify () {
88580
90482
  if (options.charsetSentinel) {
88581
90483
  if (options.charset === 'iso-8859-1') {
88582
90484
  // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
88583
- prefix += 'utf8=%26%2310003%3B&';
90485
+ prefix += 'utf8=%26%2310003%3B' + options.delimiter;
88584
90486
  } else {
88585
90487
  // encodeURIComponent('✓')
88586
- prefix += 'utf8=%E2%9C%93&';
90488
+ prefix += 'utf8=%E2%9C%93' + options.delimiter;
88587
90489
  }
88588
90490
  }
88589
90491
 
@@ -88624,6 +90526,7 @@ function requireParse$1 () {
88624
90526
  parseArrays: true,
88625
90527
  plainObjects: false,
88626
90528
  strictDepth: false,
90529
+ strictMerge: true,
88627
90530
  strictNullHandling: false,
88628
90531
  throwOnLimitExceeded: false
88629
90532
  };
@@ -88665,10 +90568,10 @@ function requireParse$1 () {
88665
90568
  var limit = options.parameterLimit === Infinity ? void undefined : options.parameterLimit;
88666
90569
  var parts = cleanStr.split(
88667
90570
  options.delimiter,
88668
- options.throwOnLimitExceeded ? limit + 1 : limit
90571
+ options.throwOnLimitExceeded && typeof limit !== 'undefined' ? limit + 1 : limit
88669
90572
  );
88670
90573
 
88671
- if (options.throwOnLimitExceeded && parts.length > limit) {
90574
+ if (options.throwOnLimitExceeded && typeof limit !== 'undefined' && parts.length > limit) {
88672
90575
  throw new RangeError('Parameter limit exceeded. Only ' + limit + ' parameter' + (limit === 1 ? '' : 's') + ' allowed.');
88673
90576
  }
88674
90577
 
@@ -88738,7 +90641,7 @@ function requireParse$1 () {
88738
90641
 
88739
90642
  if (key !== null) {
88740
90643
  var existing = has.call(obj, key);
88741
- if (existing && options.duplicates === 'combine') {
90644
+ if (existing && (options.duplicates === 'combine' || part.indexOf('[]=') > -1)) {
88742
90645
  obj[key] = utils.combine(
88743
90646
  obj[key],
88744
90647
  val,
@@ -88812,9 +90715,12 @@ function requireParse$1 () {
88812
90715
  return leaf;
88813
90716
  };
88814
90717
 
88815
- var splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) {
88816
- var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;
90718
+ // Split a key like "a[b][c[]]" into ['a', '[b]', '[c[]]'] while preserving
90719
+ // qs parse semantics for depth/prototype guards.
90720
+ var splitKeyIntoSegments = function splitKeyIntoSegments(originalKey, options) {
90721
+ var key = options.allowDots ? originalKey.replace(/\.([^.[]+)/g, '[$1]') : originalKey;
88817
90722
 
90723
+ // depth <= 0 keeps the whole key as one segment
88818
90724
  if (options.depth <= 0) {
88819
90725
  if (!options.plainObjects && has.call(Object.prototype, key)) {
88820
90726
  if (!options.allowPrototypes) {
@@ -88825,14 +90731,11 @@ function requireParse$1 () {
88825
90731
  return [key];
88826
90732
  }
88827
90733
 
88828
- var brackets = /(\[[^[\]]*])/;
88829
- var child = /(\[[^[\]]*])/g;
88830
-
88831
- var segment = brackets.exec(key);
88832
- var parent = segment ? key.slice(0, segment.index) : key;
88833
-
88834
- var keys = [];
90734
+ var segments = [];
88835
90735
 
90736
+ // parent before the first '[' (may be empty if key starts with '[')
90737
+ var first = key.indexOf('[');
90738
+ var parent = first >= 0 ? key.slice(0, first) : key;
88836
90739
  if (parent) {
88837
90740
  if (!options.plainObjects && has.call(Object.prototype, parent)) {
88838
90741
  if (!options.allowPrototypes) {
@@ -88840,32 +90743,62 @@ function requireParse$1 () {
88840
90743
  }
88841
90744
  }
88842
90745
 
88843
- keys[keys.length] = parent;
90746
+ segments[segments.length] = parent;
88844
90747
  }
88845
90748
 
88846
- var i = 0;
88847
- while ((segment = child.exec(key)) !== null && i < options.depth) {
88848
- i += 1;
90749
+ var n = key.length;
90750
+ var open = first;
90751
+ var collected = 0;
88849
90752
 
88850
- var segmentContent = segment[1].slice(1, -1);
88851
- if (!options.plainObjects && has.call(Object.prototype, segmentContent)) {
88852
- if (!options.allowPrototypes) {
88853
- return;
90753
+ while (open >= 0 && collected < options.depth) {
90754
+ var level = 1;
90755
+ var i = open + 1;
90756
+ var close = -1;
90757
+
90758
+ // balance nested '[' and ']' inside this bracket group using a nesting level counter
90759
+ while (i < n && close < 0) {
90760
+ var cu = key.charCodeAt(i);
90761
+ if (cu === 0x5B) { // '['
90762
+ level += 1;
90763
+ } else if (cu === 0x5D) { // ']'
90764
+ level -= 1;
90765
+ if (level === 0) {
90766
+ close = i; // found matching close; loop will exit by condition
90767
+ }
88854
90768
  }
90769
+ i += 1;
90770
+ }
90771
+
90772
+ if (close < 0) {
90773
+ // Unterminated group: wrap the raw remainder in one bracket pair so it stays
90774
+ // a single literal segment (e.g. "[[]b" -> "[[]b]"); we do not infer missing ']'.
90775
+ segments[segments.length] = '[' + key.slice(open) + ']';
90776
+ return segments;
88855
90777
  }
88856
90778
 
88857
- keys[keys.length] = segment[1];
90779
+ var seg = key.slice(open, close + 1);
90780
+ // prototype guard for the content of this group
90781
+ var content = seg.slice(1, -1);
90782
+ if (!options.plainObjects && has.call(Object.prototype, content) && !options.allowPrototypes) {
90783
+ return;
90784
+ }
90785
+
90786
+ segments[segments.length] = seg;
90787
+ collected += 1;
90788
+
90789
+ // find the next '[' after this balanced group
90790
+ open = key.indexOf('[', close + 1);
88858
90791
  }
88859
90792
 
88860
- if (segment) {
90793
+ if (open >= 0) {
88861
90794
  if (options.strictDepth === true) {
88862
90795
  throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true');
88863
90796
  }
88864
90797
 
88865
- keys[keys.length] = '[' + key.slice(segment.index) + ']';
90798
+ segments[segments.length] = '[' + key.slice(open) + ']';
88866
90799
  }
88867
90800
 
88868
- return keys;
90801
+ return segments;
88869
90802
  };
88870
90803
 
88871
90804
  var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
@@ -88938,6 +90871,7 @@ function requireParse$1 () {
88938
90871
  parseArrays: opts.parseArrays !== false,
88939
90872
  plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
88940
90873
  strictDepth: typeof opts.strictDepth === 'boolean' ? !!opts.strictDepth : defaults.strictDepth,
90874
+ strictMerge: typeof opts.strictMerge === 'boolean' ? !!opts.strictMerge : defaults.strictMerge,
88941
90875
  strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling,
88942
90876
  throwOnLimitExceeded: typeof opts.throwOnLimitExceeded === 'boolean' ? opts.throwOnLimitExceeded : false
88943
90877
  };
@@ -89203,16 +91137,15 @@ function requireUrlencoded () {
89203
91137
 
89204
91138
  function parameterCount (body, limit) {
89205
91139
  var count = 0;
89206
- var index = 0;
91140
+ var index = -1;
89207
91141
 
89208
- while ((index = body.indexOf('&', index)) !== -1) {
91142
+ do {
89209
91143
  count++;
89210
- index++;
89211
-
89212
- if (count === limit) {
91144
+ if (count > limit) {
89213
91145
  return undefined
89214
91146
  }
89215
- }
91147
+ index = body.indexOf('&', index + 1);
91148
+ } while (index !== -1)
89216
91149
 
89217
91150
  return count
89218
91151
  }
@@ -90597,6 +92530,7 @@ function requirePathToRegexp () {
90597
92530
  pos = offset + match.length;
90598
92531
 
90599
92532
  if (match === '*') {
92533
+ backtrack = '';
90600
92534
  extraOffset += 3;
90601
92535
  return '(.*)';
90602
92536
  }
@@ -90626,6 +92560,7 @@ function requirePathToRegexp () {
90626
92560
  + ')'
90627
92561
  + optional;
90628
92562
 
92563
+ backtrack = '';
90629
92564
  extraOffset += result.length - match.length;
90630
92565
 
90631
92566
  return result;
@@ -99148,7 +101083,8 @@ function requireUtils () {
99148
101083
 
99149
101084
  function parseExtendedQueryString(str) {
99150
101085
  return qs.parse(str, {
99151
- allowPrototypes: true
101086
+ allowPrototypes: true,
101087
+ arrayLimit: 1000
99152
101088
  });
99153
101089
  }
99154
101090
 
@@ -127658,6 +129594,55 @@ class HuggingFaceClient {
127658
129594
  modelType: data.config?.model_type ?? data.gguf?.architecture
127659
129595
  };
127660
129596
  }
129597
+ async fetchQuantizationFileSize(modelSlug, quantization) {
129598
+ if (!quantization)
129599
+ return null;
129600
+ const listParams = {
129601
+ accessToken: this.apiKey || undefined,
129602
+ recursive: true,
129603
+ repo: modelSlug
129604
+ };
129605
+ const qPattern = quantization.toLowerCase().replace(/[_-]/g, "");
129606
+ const processed = new Set();
129607
+ let found = false;
129608
+ let totalBytes = 0;
129609
+ async function* listGgufFiles() {
129610
+ let lastError;
129611
+ for (let attempt = 0; attempt < 3; attempt++) {
129612
+ try {
129613
+ for await (const file of listFiles(listParams)) {
129614
+ yield file;
129615
+ }
129616
+ return;
129617
+ }
129618
+ catch (error) {
129619
+ lastError = error instanceof Error ? error : new Error(String(error));
129620
+ if (attempt < 2) {
129621
+ const delay = 1000 * Math.pow(2, attempt);
129622
+ await new Promise(resolve => setTimeout(resolve, Math.min(delay, 10000)));
129623
+ }
129624
+ }
129625
+ }
129626
+ if (lastError) {
129627
+ throw lastError;
129628
+ }
129629
+ }
129630
+ for await (const file of listGgufFiles()) {
129631
+ if (processed.has(file.path))
129632
+ continue;
129633
+ processed.add(file.path);
129634
+ if (!file.path.toLowerCase().endsWith(".gguf"))
129635
+ continue;
129636
+ const filePattern = file.path.toLowerCase().replace(/[_-]/g, "");
129637
+ if (!filePattern.includes(qPattern))
129638
+ continue;
129639
+ if (typeof file.size === "number") {
129640
+ totalBytes += file.size;
129641
+ found = true;
129642
+ }
129643
+ }
129644
+ return found ? totalBytes : null;
129645
+ }
127661
129646
  async listModelQuantizations(modelSlug) {
127662
129647
  if (!modelSlug) {
127663
129648
  return [];
@@ -151704,7 +153689,7 @@ async function loadCheckpoint(filePath) {
151704
153689
  }
151705
153690
  }
151706
153691
  async function saveCheckpoint(filePath, checkpoint) {
151707
- await writeFile(filePath, JSON.stringify(checkpoint), "utf-8");
153692
+ await writeFile(filePath, JSON.stringify(checkpoint, null, 4), "utf-8");
151708
153693
  }
151709
153694
  async function removeCheckpoint(filePath) {
151710
153695
  try {
@@ -153586,10 +155571,25 @@ async function provisionResources(options) {
153586
155571
  }
153587
155572
  const modelData = (await modelRes.json());
153588
155573
  const modelID = modelData.id;
155574
+ const engineRes = await fetch(`${apiUrl}/api/v1/engines`, {
155575
+ body: JSON.stringify({
155576
+ name: `inftest_eng_${shortSlug}`,
155577
+ type: options.engine
155578
+ }),
155579
+ headers,
155580
+ method: "POST",
155581
+ signal: AbortSignal.timeout(60_000)
155582
+ });
155583
+ if (!engineRes.ok) {
155584
+ const text = await engineRes.text();
155585
+ throw new Error(`Failed to create engine: ${engineRes.status} ${text}`);
155586
+ }
155587
+ const engineData = (await engineRes.json());
155588
+ const engineId = engineData.id;
153589
155589
  const sourceIDs = [];
153590
155590
  for (let i = 0; i < parallelism; i++) {
153591
155591
  const sourceBody = {
153592
- engine: options.engine,
155592
+ engineId,
153593
155593
  modelID,
153594
155594
  name: `inftest_src_${i}_${shortSlug}`
153595
155595
  };
@@ -153626,7 +155626,7 @@ async function provisionResources(options) {
153626
155626
  }
153627
155627
  const endpointData = (await endpointRes.json());
153628
155628
  const endpointID = endpointData.id;
153629
- return { endpointID, modelID, sourceIDs };
155629
+ return { endpointID, engineID: engineId, modelID, sourceIDs };
153630
155630
  }
153631
155631
 
153632
155632
  async function teardownResources(options) {
@@ -153657,6 +155657,16 @@ async function teardownResources(options) {
153657
155657
  })
153658
155658
  .catch(err => console.error("Failed to delete source:", asError(err).message));
153659
155659
  }
155660
+ await fetch(`${apiUrl}/api/v1/engines/${options.engineID}`, {
155661
+ headers,
155662
+ method: "DELETE"
155663
+ })
155664
+ .then(res => {
155665
+ if (!res.ok) {
155666
+ console.error(`Failed to delete engine: ${res.status} ${res.statusText}`);
155667
+ }
155668
+ })
155669
+ .catch(err => console.error("Failed to delete engine:", asError(err).message));
153660
155670
  await fetch(`${apiUrl}/api/v1/models/${options.modelID}`, {
153661
155671
  headers,
153662
155672
  method: "DELETE"
@@ -153807,6 +155817,7 @@ async function runBenchmark(options) {
153807
155817
  }
153808
155818
  async function runSingleBenchmark(options) {
153809
155819
  const { apiKey, apiUrl, bfclData, concurrency, entry, hardware, humanevalplusProblems, logger, mbppplusProblems, outputDir, parallelism } = options;
155820
+ let fileSizeBytes = null;
153810
155821
  let metadata;
153811
155822
  if (entry.source?.type === "huggingface") {
153812
155823
  console.log(" → Fetching model metadata...");
@@ -153814,6 +155825,9 @@ async function runSingleBenchmark(options) {
153814
155825
  const hfClient = new HuggingFaceClient(process.env.HF_TOKEN);
153815
155826
  const info = await hfClient.fetchModelInfo(entry.slug);
153816
155827
  metadata = { ...info, source: entry.source };
155828
+ if (entry.quantization) {
155829
+ fileSizeBytes = await hfClient.fetchQuantizationFileSize(entry.slug, entry.quantization);
155830
+ }
153817
155831
  }
153818
155832
  catch (err) {
153819
155833
  console.error(` ⚠ Failed to fetch metadata: ${asError(err).message}`);
@@ -153830,7 +155844,7 @@ async function runSingleBenchmark(options) {
153830
155844
  quantization: entry.quantization,
153831
155845
  slug: entry.slug
153832
155846
  });
153833
- console.log(` → Provisioned 1 model, ${parallelism} source(s), 1 endpoint`);
155847
+ console.log(` → Provisioned 1 model, 1 engine, ${parallelism} source(s), 1 endpoint`);
153834
155848
  const sampler = createMemorySampler();
153835
155849
  console.log(" → Sampling memory baseline...");
153836
155850
  await sampler.start();
@@ -153993,6 +156007,7 @@ async function runSingleBenchmark(options) {
153993
156007
  hardware,
153994
156008
  metadata,
153995
156009
  modelMetadata: {
156010
+ fileSizeBytes,
153996
156011
  format: entry.format,
153997
156012
  parameterCount: entry.parameterCount,
153998
156013
  quantization: entry.quantization
@@ -154018,6 +156033,7 @@ async function runSingleBenchmark(options) {
154018
156033
  apiKey,
154019
156034
  apiUrl,
154020
156035
  endpointID: resources.endpointID,
156036
+ engineID: resources.engineID,
154021
156037
  modelID: resources.modelID,
154022
156038
  sourceIDs: resources.sourceIDs
154023
156039
  });