velocious 1.0.653 → 1.0.655

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +4 -2
  2. package/build/environment-handlers/node/cli/commands/test.js +2 -1
  3. package/build/http-server/client/index.js +67 -5
  4. package/build/http-server/client/request-buffer/index.js +15 -1
  5. package/build/http-server/client/response-compression.js +6 -8
  6. package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
  7. package/build/src/environment-handlers/node/cli/commands/test.js +4 -2
  8. package/build/src/http-server/client/index.d.ts +9 -1
  9. package/build/src/http-server/client/index.d.ts.map +1 -1
  10. package/build/src/http-server/client/index.js +68 -6
  11. package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
  12. package/build/src/http-server/client/request-buffer/index.js +16 -2
  13. package/build/src/http-server/client/response-compression.d.ts +4 -2
  14. package/build/src/http-server/client/response-compression.d.ts.map +1 -1
  15. package/build/src/http-server/client/response-compression.js +7 -8
  16. package/build/src/testing/test-runner.d.ts +23 -0
  17. package/build/src/testing/test-runner.d.ts.map +1 -1
  18. package/build/src/testing/test-runner.js +29 -2
  19. package/build/src/testing/velocious-runner-reporter.d.ts +7 -0
  20. package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -1
  21. package/build/src/testing/velocious-runner-reporter.js +54 -12
  22. package/build/testing/test-runner.js +33 -1
  23. package/build/testing/velocious-runner-reporter.js +52 -11
  24. package/package.json +4 -4
  25. package/scripts/browser-test-session.js +21 -23
  26. package/src/environment-handlers/node/cli/commands/test.js +2 -1
  27. package/src/http-server/client/index.js +67 -5
  28. package/src/http-server/client/request-buffer/index.js +15 -1
  29. package/src/http-server/client/response-compression.js +6 -8
  30. package/src/testing/test-runner.js +33 -1
  31. package/src/testing/velocious-runner-reporter.js +52 -11
package/README.md CHANGED
@@ -178,7 +178,7 @@ Baselines are generated against a fresh checkout (no generated dummy `configurat
178
178
  # Testing
179
179
 
180
180
  Application tests may import the testing DSL from the independent public package.
181
- `@velocious/testing` `0.0.9` is the declaration and execution engine. Compatible
181
+ `@velocious/testing` `0.0.12` is the declaration and execution engine. Compatible
182
182
  installed copies share one protocol-1/schema-3 default registry. Velocious adapts each
183
183
  package-owned attempt with its database, request, profiling, and cleanup behavior; the
184
184
  existing Velocious facade exports the same declaration DSL and remains supported.
@@ -327,6 +327,8 @@ Use `consoleOutput: "live"` to preserve the previous passthrough behavior where
327
327
 
328
328
  Listen for attempt and retry events if you need to reset shared state after a failed attempt or log retry lifecycle details. `testAttemptFailed` fires after every failed attempt, including the final failed attempt when no retries remain. `testRetrying` only fires before a retry, and `testFailed` only fires after retries are exhausted.
329
329
 
330
+ A shared resource owner may throw an error carrying `terminalResource: {scope: "run", name: "shared-resource"}`. With a compatible `@velocious/testing` runner, Velocious preserves this contract through causes and aggregate errors, reports the originating failure with full causal stacks, suppresses retries, and emits `testNotRun` for later selected cases instead of running their callbacks. `testNotRun` receives `{configuration, test, testRunner}`; `test` has `status: "not-run"`, `fullName`, `location`, and the originating `reason`. `testRunner.getNotRunTests()` and `getNotRunTestDetails()` expose this separate accounting. Entered suites clean up once; the CLI exits unsuccessfully even for terminal setup with zero executed cases. Unmatched filters retain their explanatory message and `no-tests` profile status, independently of terminal setup failures. This does not restart a browser or cancel already-issued work. Upgrade the shared runner and this reporter adapter together before enabling terminal resource owners; earlier shared runners ignore the marker. See [terminal resource reporting](docs/terminal-resource-reporting.md).
331
+
330
332
  ```js
331
333
  import {testEvents} from "velocious/build/src/testing/test.js"
332
334
 
@@ -2887,7 +2889,7 @@ When the server runs in the `development` environment, Velocious watches applica
2887
2889
 
2888
2890
  Starting the HTTP server creates `tmp/server.lock` under the configured application directory before Beacon, workers, or the TCP listener start. A second server for the same app fails fast with the lock owner details instead of partially starting. Normal shutdown removes the lock; stale locks with a dead local PID are reclaimed automatically, while locks from another host or unreadable metadata should be removed manually only after confirming no server is running. See [docs/http-server.md](docs/http-server.md#server-lock).
2889
2891
 
2890
- Buffered string and `Uint8Array` responses are compressed with Brotli (`br`) or gzip by default whenever request negotiation and response eligibility allow — no opt-in is required. Disable compression globally with `httpServer.compression: false` or `httpServer.compression: {enabled: false}`, and tune it with `threshold`/`brotliQuality`/`gzipLevel` overrides. Negotiation honors `Accept-Encoding` q-values, wildcards, and identity semantics (empty `406` when no acceptable representation exists), merges `Accept-Encoding` into `Vary`, and skips streamed `sendFile` responses, already-encoded or `no-transform` responses, server-sent events, partial/range responses, bodyless statuses, and non-allowlisted content types. Transformation is additionally excluded automatically for credentialed traffic and validator-carrying responses — requests with `Authorization`/`Cookie` and responses with `Set-Cookie`, `ETag`, `Digest`, or `Content-Digest` are never compressed (compression-oracle protection, and validators stay application-owned). Controllers opt out per response with `response.disableCompression()`, and HEAD requests compute GET-equivalent representation headers without emitting a body. See [docs/http-server.md](docs/http-server.md#response-compression).
2892
+ Buffered string and `Uint8Array` responses are compressed with Brotli (`br`) or gzip by default whenever request negotiation and response eligibility allow — no opt-in is required. Disable compression globally with `httpServer.compression: false` or `httpServer.compression: {enabled: false}`, and tune it with `threshold`/`brotliQuality`/`gzipLevel` overrides. Negotiation honors `Accept-Encoding` q-values, wildcards, and identity semantics (empty `406` when no acceptable representation exists), combines repeated `Accept-Encoding` header fields in wire order, and advertises a framework-owned `Vary: Accept-Encoding` on every framework-selected representation (transformed, identity, `406`, and file) so caches key on the field. Streamed `sendFile` responses are never buffered or re-encoded: they are sent identity, so when the client forbids identity the server answers with the same empty `406` without opening or streaming the file. Transformation also skips already-encoded or `no-transform` responses, server-sent events, partial/range responses, bodyless statuses, and non-allowlisted content types. Transformation is additionally excluded automatically for credentialed traffic and validator-carrying responses — requests with `Authorization`/`Cookie` and responses with `Set-Cookie`, `ETag`, `Digest`, or `Content-Digest` are never compressed (compression-oracle protection, and validators stay application-owned). Controllers opt out per response with `response.disableCompression()`, and HEAD requests compute GET-equivalent representation headers without emitting a body. See [docs/http-server.md](docs/http-server.md#response-compression).
2891
2893
 
2892
2894
  # Authorization (CanCan-style)
2893
2895
 
@@ -203,7 +203,7 @@ export default class VelociousCliCommandsTest extends BaseCommand {
203
203
  const hasExampleFilters = examplePatterns.length > 0
204
204
  const hasTagFilters = includeTags.length > 0 || effectiveExcludeTagCount > 0
205
205
 
206
- if ((hasTagFilters || hasLineFilters || hasExampleFilters) && executedTests === 0) {
206
+ if ((hasTagFilters || hasLineFilters || hasExampleFilters) && testRunner.hasNoMatches()) {
207
207
  console.error(picocolors.red("\nNo tests matched the provided filters"))
208
208
  await finalizeProfile("no-tests")
209
209
  process.exit(1)
@@ -247,6 +247,7 @@ export default class VelociousCliCommandsTest extends BaseCommand {
247
247
  }
248
248
  }
249
249
 
250
+ if (testRunner.getNotRunTests() > 0) console.error(`${testRunner.getNotRunTests()} tests not run because a shared resource failed`)
250
251
  console.error(picocolors.red(`\nTest run failed with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`))
251
252
  await finalizeProfile("failed")
252
253
  process.exit(1)
@@ -8,7 +8,7 @@ import EventEmitter from "../../utils/event-emitter.js"
8
8
  import Logger from "../../logger.js"
9
9
  import Request from "./request.js"
10
10
  import RequestRunner from "./request-runner.js"
11
- import {applyResponseCompression} from "./response-compression.js"
11
+ import {addAcceptEncodingToVary, applyResponseCompression, negotiateContentEncoding} from "./response-compression.js"
12
12
  import WebsocketSession from "./websocket-session.js"
13
13
 
14
14
  /**
@@ -384,7 +384,15 @@ export default class VeoliciousHttpServerClient {
384
384
  }
385
385
 
386
386
  /**
387
- * Runs send response.
387
+ * Sends a finished response to the client. Owns the framework-owned
388
+ * `Vary: Accept-Encoding` dimension (emitted for every selected
389
+ * representation — transformed, identity, 406, and file — and for
390
+ * header-present and header-absent requests alike, so it is stable across
391
+ * requests on the same connection; never added when compression is disabled,
392
+ * the response is truly bodyless, or the application supplied a fixed
393
+ * `Content-Encoding`) and the file 406 rule (a sendFile response whose
394
+ * client forbids identity is answered with the empty 406, the file is never
395
+ * opened or streamed, and `onFinished` settles once as "completed").
388
396
  * @param {RequestRunner} requestRunner - Request runner.
389
397
  * @returns {Promise<void>} - Resolves when complete.
390
398
  */
@@ -436,12 +444,41 @@ export default class VeoliciousHttpServerClient {
436
444
  /** @type {string | Uint8Array | null} */
437
445
  let bodyToEmit = body
438
446
 
447
+ // The response representation can depend on the client's Accept-Encoding:
448
+ // the same request is answered with an identity body (or a file) when
449
+ // identity is acceptable and with an empty 406 when it is forbidden.
450
+ const compression = this.configuration.getHttpServerCompression()
451
+ const negotiated = compression.enabled ? negotiateContentEncoding(request.header("accept-encoding")) : undefined
452
+ // An application-supplied Content-Encoding is an application-owned
453
+ // representation contract, captured before the framework may add its own.
454
+ // A file carrying one is a fixed, application-owned representation: the
455
+ // framework neither negotiates it nor re-advertises it, so it is never a
456
+ // candidate for the identity-only 406.
457
+ const hasApplicationContentEncoding = response.getHeader("Content-Encoding").length > 0
458
+ // A file response only ever serves the identity representation: whenever
459
+ // the client forbids identity (including the not-acceptable case where no
460
+ // coding applies) and the file does not carry an application-supplied
461
+ // Content-Encoding, the file is rejected with the empty 406. A truly
462
+ // bodyless status selects no representation, so it is never rejected here.
463
+ const isFileNotAcceptable = hasFilePath && !!negotiated && ("notAcceptable" in negotiated || negotiated.identityAcceptable === false) && hasApplicationContentEncoding === false && !isBodylessStatus
464
+
439
465
  if (!isBodylessStatus) {
440
466
  let contentLength
441
467
 
442
468
  if (hasFilePath) {
443
- const stats = await fs.stat(filePath)
444
- contentLength = stats.size
469
+ if (isFileNotAcceptable) {
470
+ // The client forbids identity and files are only ever sent identity:
471
+ // answer with the same empty 406 every other representation path
472
+ // uses. The file is never opened or streamed; onFinished is settled
473
+ // below, after the committed 406 headers are emitted.
474
+ response.setStatus(406)
475
+ response.setBody("")
476
+ bodyToEmit = ""
477
+ contentLength = 0
478
+ } else {
479
+ const stats = await fs.stat(filePath)
480
+ contentLength = stats.size
481
+ }
445
482
  } else {
446
483
  // String bodies are UTF-8 framed, so the buffered bytes are the UTF-8 encoding;
447
484
  // Uint8Array bodies are already the exact wire bytes.
@@ -474,6 +511,18 @@ export default class VeoliciousHttpServerClient {
474
511
  response.setHeader("Content-Length", contentLength)
475
512
  }
476
513
 
514
+ // Framework-owned Vary dimension: whenever compression is enabled and a
515
+ // representation was selected, the response depends on Accept-Encoding,
516
+ // so caches must key on it. Applied identically for every outcome
517
+ // (transformed, identity, 406, file) and for header-present and
518
+ // header-absent requests alike, so the header is stable across requests on
519
+ // the same connection. A truly bodyless response selects no representation
520
+ // and carries no dimension; an application-supplied Content-Encoding keeps
521
+ // the representation contract application-owned and is never re-advertised.
522
+ if (negotiated && !isBodylessStatus && hasApplicationContentEncoding === false) {
523
+ addAcceptEncodingToVary(response)
524
+ }
525
+
477
526
  response.setHeader("Date", date.toUTCString())
478
527
  response.setHeader("Server", "Velocious")
479
528
 
@@ -492,8 +541,21 @@ export default class VeoliciousHttpServerClient {
492
541
  this.events.emit("output", headers)
493
542
  this.logger.debug(() => ["sendResponse headers emitted", {clientCount: this.clientCount, headersLength: headers.length}])
494
543
 
495
- if (isBodylessStatus) {
544
+ // A negotiated file 406 is committed above (status 406, empty body) and its
545
+ // headers were just emitted: settle onFinished now, so the callback runs
546
+ // after the response is committed — a slow or app-stopping callback cannot
547
+ // delay or block delivery of the already-emitted 406. The file is never
548
+ // opened, streamed, or reported (no file event), and the callback settles
549
+ // exactly once as "completed".
550
+ if (isFileNotAcceptable) {
551
+ this.logger.debug(() => ["sendResponse file body suppressed for 406", {clientCount: this.clientCount, filePath}])
552
+ await this.runFileOnFinished({filePath, onFinished: fileOnFinished, result: "completed"})
553
+ } else if (isBodylessStatus) {
496
554
  this.logger.debug(() => ["sendResponse body suppressed for no-body status", {clientCount: this.clientCount, statusCode: response.getStatusCode()}])
555
+ // A bodyless status (1xx/204/304) selects no representation, so no file
556
+ // body or framework Vary is emitted. The file-ownership path still settles
557
+ // onFinished exactly once as "completed" (nothing was aborted) — even when
558
+ // the client forbids identity — preserving the pre-change settlement.
497
559
  if (hasFilePath) await this.sendFileOutput(filePath, false, fileOnFinished)
498
560
  } else if (isHeadRequest) {
499
561
  this.logger.debug(() => ["sendResponse body suppressed for HEAD request", {clientCount: this.clientCount}])
@@ -8,6 +8,12 @@ import Logger from "../../../logger.js"
8
8
  import ParamsToObject from "../params-to-object.js"
9
9
  import querystring from "querystring"
10
10
 
11
+ /**
12
+ * Request header fields whose repeated wire fields combine into one value
13
+ * (RFC 9110 §5.3) before the server consumes them.
14
+ * @type {Set<string>} */
15
+ const COMBINING_HEADER_FIELDS = new Set(["accept-encoding"])
16
+
11
17
  /**
12
18
  * Runs truncate preview.
13
19
  * @param {string | undefined} input - Input string.
@@ -367,8 +373,16 @@ export default class RequestBuffer {
367
373
  */
368
374
  addHeader(header) {
369
375
  const formattedName = header.getFormattedName()
376
+ const existingHeader = this.headersByName[formattedName]
370
377
 
371
- this.headersByName[formattedName] = header
378
+ // RFC 9110 §5.3: a field may be repeated; its value is the concatenation of
379
+ // all field values separated by commas, in wire order. Only Accept-Encoding
380
+ // is consumed as a combined field by the server.
381
+ if (existingHeader && COMBINING_HEADER_FIELDS.has(formattedName)) {
382
+ existingHeader.value += `, ${header.getValue()}`
383
+ } else {
384
+ this.headersByName[formattedName] = header
385
+ }
372
386
 
373
387
  if (formattedName == "content-length") this.contentLength = parseInt(header.getValue())
374
388
  }
@@ -22,9 +22,9 @@ const COMPRESSIBLE_EXACT_MEDIA_TYPES = new Set([
22
22
 
23
23
  /**
24
24
  * RFC 9110 §12.4.2 qvalue grammar: `0` or `1` with at most three fractional
25
- * digits, and only zeros after `1`.
25
+ * digits (the boundary forms `0.` and `1.` are valid), and only zeros after `1`.
26
26
  * @type {RegExp} */
27
- const QVALUE_PATTERN = /^(?:0(?:\.\d{1,3})?|1(?:\.0{1,3})?)$/u
27
+ const QVALUE_PATTERN = /^(?:0(?:\.\d{0,3})?|1(?:\.0{0,3})?)$/u
28
28
 
29
29
  /**
30
30
  * Runs parse accept encoding.
@@ -118,7 +118,9 @@ export function isCompressibleContentType(contentType) {
118
118
  /**
119
119
  * Merges Accept-Encoding into the response Vary header case-insensitively and
120
120
  * without duplicates. An existing `Vary: *` already covers every request header
121
- * and is preserved as-is.
121
+ * and is preserved as-is. Called by the response sender for every
122
+ * framework-selected representation so the header is identical for every
123
+ * request on the same connection.
122
124
  * @param {import("./response.js").default} response - Response instance.
123
125
  * @returns {void} - No return value.
124
126
  */
@@ -160,7 +162,7 @@ export function addAcceptEncodingToVary(response) {
160
162
  * @param {import("../../configuration-types.js").NormalizedHttpCompressionConfiguration} args.compression - Normalized compression configuration.
161
163
  * @param {import("./request.js").default | import("./websocket-request.js").default} args.request - Request object.
162
164
  * @param {import("./response.js").default} args.response - Response instance.
163
- * @returns {Promise<{outcome: "identity"} | {outcome: "compressed", body: Buffer} | {outcome: "not-acceptable"}>} - Compression outcome.
165
+ * @returns {Promise<{outcome: "identity"} | {outcome: "compressed", body: Buffer} | {outcome: "not-acceptable"}>} - Compression outcome. The caller owns the Vary header and the file/406 representation decisions.
164
166
  */
165
167
  export async function applyResponseCompression({bodyBuffer, compression, request, response}) {
166
168
  if (!compression.enabled) return {outcome: "identity"}
@@ -203,10 +205,6 @@ export async function applyResponseCompression({bodyBuffer, compression, request
203
205
  return negotiated.identityAcceptable ? {outcome: "identity"} : {outcome: "not-acceptable"}
204
206
  }
205
207
 
206
- // The representation now depends on the request's Accept-Encoding, even when this
207
- // particular response ends up identity (missing header, higher-q identity, below threshold).
208
- addAcceptEncodingToVary(response)
209
-
210
208
  if (negotiated.encoding == "identity") return {outcome: "identity"}
211
209
 
212
210
  // Below the threshold the smaller identity representation is sent instead — but only
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/test.js"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,iCAAiC,CAAA;AAiBzD,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,WAAW;IACzD,OAAO,kBA0PZ;CACF;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,EAAC,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,wBAAwB,EAAC,EAPpH;IAAqB,GAAG,EAAhB,MAAM,CACd;IAAsB,OAAO,EAArB,OAAO,CACf;IAAsB,eAAe,AAArC,CACA,EADQ,MAAM,CACd;IAAsB,kBAAkB,AAAxC,CACA,EADQ,MAAM,CACd;IAAsB,wBAAwB,AAA9C,CACA,EADQ,MAAM,CACd;CAEoH,GAF1G;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,CA0BzJ;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,kBAAkB,EAHhD,MAAM,GAAG,SAGuC,GAF9C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAsBvD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAHrC,MAAM,GAAG,SAG4B,GAFnC,MAAM,CAMlB"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/test.js"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,iCAAiC,CAAA;AAiBzD,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,WAAW;IACzD,OAAO,kBA2PZ;CACF;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,EAAC,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,wBAAwB,EAAC,EAPpH;IAAqB,GAAG,EAAhB,MAAM,CACd;IAAsB,OAAO,EAArB,OAAO,CACf;IAAsB,eAAe,AAArC,CACA,EADQ,MAAM,CACd;IAAsB,kBAAkB,AAAxC,CACA,EADQ,MAAM,CACd;IAAsB,wBAAwB,AAA9C,CACA,EADQ,MAAM,CACd;CAEoH,GAF1G;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,CA0BzJ;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,kBAAkB,EAHhD,MAAM,GAAG,SAGuC,GAF9C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAsBvD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAHrC,MAAM,GAAG,SAG4B,GAFnC,MAAM,CAMlB"}
@@ -165,7 +165,7 @@ export default class VelociousCliCommandsTest extends BaseCommand {
165
165
  const hasLineFilters = Object.keys(lineFilters).length > 0;
166
166
  const hasExampleFilters = examplePatterns.length > 0;
167
167
  const hasTagFilters = includeTags.length > 0 || effectiveExcludeTagCount > 0;
168
- if ((hasTagFilters || hasLineFilters || hasExampleFilters) && executedTests === 0) {
168
+ if ((hasTagFilters || hasLineFilters || hasExampleFilters) && testRunner.hasNoMatches()) {
169
169
  console.error(picocolors.red("\nNo tests matched the provided filters"));
170
170
  await finalizeProfile("no-tests");
171
171
  process.exit(1);
@@ -199,6 +199,8 @@ export default class VelociousCliCommandsTest extends BaseCommand {
199
199
  }
200
200
  }
201
201
  }
202
+ if (testRunner.getNotRunTests() > 0)
203
+ console.error(`${testRunner.getNotRunTests()} tests not run because a shared resource failed`);
202
204
  console.error(picocolors.red(`\nTest run failed with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`));
203
205
  await finalizeProfile("failed");
204
206
  process.exit(1);
@@ -291,4 +293,4 @@ export function resolveSlowTestCount(rawEnvValue) {
291
293
  return 10;
292
294
  return Math.max(0, Math.floor(Number(rawEnvValue)) || 0);
293
295
  }
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLGVBQWUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUN0RSxPQUFPLFlBQVksTUFBTSxzQ0FBc0MsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQTtBQUM5RyxPQUFPLFVBQVUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMzRCxPQUFPLGlCQUFpQixNQUFNLDRDQUE0QyxDQUFBO0FBQzFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQTtBQUNsRyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdkIsTUFBTSx3Q0FBd0MsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUV2RSxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF5QixTQUFRLFdBQVc7SUFDL0QsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLHdCQUF3QixFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTlDLElBQUksU0FBUyxDQUFBO1FBQ2IsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBRXRCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lB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LENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxrQkFBa0IsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7SUFDMUYsQ0FBQztJQUVELElBQUksTUFBTSxDQUFBO0lBRVYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxrQkFBa0IsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7SUFDM0YsQ0FBQztJQUVELE9BQU8sc0JBQXNCLENBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLG1CQUFtQixrQkFBa0IsRUFBRSxFQUFDLENBQUMsQ0FBQTtBQUMxRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQVc7SUFDOUMsSUFBSSxXQUFXLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXhDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHBpY29jb2xvcnMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IFRlc3RGaWxlc0ZpbmRlciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LWZpbGVzLWZpbmRlci5qc1wiXG5pbXBvcnQgVGVzdFByb2ZpbGVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcHJvZmlsZXIuanNcIlxuaW1wb3J0IHsgZm9ybWF0VGVzdFByb2ZpbGVTdW1tYXJ5LCB3cml0ZVRlc3RQcm9maWxlT3V0cHV0cyB9IGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcHJvZmlsZS1vdXRwdXQuanNcIlxuaW1wb3J0IFRlc3RSdW5uZXIgZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1ydW5uZXIuanNcIlxuaW1wb3J0IFRlc3RTdWl0ZVNwbGl0dGVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3Qtc3VpdGUtc3BsaXR0ZXIuanNcIlxuaW1wb3J0IHsgbm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zLCBwYXJzZUZpbHRlcnMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LWZpbHRlci1wYXJzZXIuanNcIlxuaW1wb3J0IHtcbiAgY2Fub25pY2FsVGltaW5nTWFuaWZlc3RQYXRoLFxuICB0aW1pbmdNYW5pZmVzdEZpbGVTZXRIYXNoLFxuICB2YWxpZGF0ZVRpbWluZ01hbmlmZXN0XG59IGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3RpbWluZy1tYW5pZmVzdC5qc1wiXG5pbXBvcnQgeyBwcmVwYXJlU291cmNlUGVlclBhY2thZ2UgfSBmcm9tIFwiLi4vLi4vc291cmNlLXBlZXItcGFja2FnZS5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0NsaUNvbW1hbmRzVGVzdCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCBwcmVwYXJlU291cmNlUGVlclBhY2thZ2UoKVxuICAgIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnNldEVudmlyb25tZW50KFwidGVzdFwiKVxuXG4gICAgbGV0IGRpcmVjdG9yeVxuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gW11cblxuICAgIGlmIChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpIHtcbiAgICAgIGRpcmVjdG9yeSA9IHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUlxuICAgICAgZGlyZWN0b3JpZXMucHVzaChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5KClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vX190ZXN0c19fYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vdGVzdHNgKVxuICAgICAgZGlyZWN0b3JpZXMucHVzaChgJHt0aGlzLmRpcmVjdG9yeSgpfS9zcGVjYClcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBpbmNsdWRlVGFncyxcbiAgICAgIGV4Y2x1ZGVUYWdzLFxuICAgICAgZXhhbXBsZVBhdHRlcm5zLFxuICAgICAgZmlsdGVyZWRQcm9jZXNzQXJncyxcbiAgICAgIGdyb3VwcyxcbiAgICAgIGdyb3VwTnVtYmVyLFxuICAgICAgcHJvZmlsZSxcbiAgICAgIHByb2ZpbGVKc29uUGF0aCxcbiAgICAgIHRpbWluZ01hbmlmZXN0UGF0aCxcbiAgICAgIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICAgIH0gPSBwYXJzZUZpbHRlcnModGhpcy5wcm9jZXNzQXJncyB8fCBbXSlcbiAgICBjb25zdCBwcm9maWxlT3B0aW9ucyA9IHJlc29sdmVUZXN0UHJvZmlsZU9wdGlvbnMoe1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgcHJvZmlsZSxcbiAgICAgIHByb2ZpbGVKc29uUGF0aCxcbiAgICAgIHRpbWluZ01hbmlmZXN0UGF0aCxcbiAgICAgIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICAgIH0pXG4gICAgY29uc3Qgc2VsZWN0aW9uID0ge1xuICAgICAgZXhjbHVkZVRhZ0NvdW50OiBleGNsdWRlVGFncy5sZW5ndGgsXG4gICAgICBoYXNFeGFtcGxlRmlsdGVyczogZXhhbXBsZVBhdHRlcm5zLmxlbmd0aCA+IDAsXG4gICAgICBpbmNsdWRlVGFnQ291bnQ6IGluY2x1ZGVUYWdzLmxlbmd0aCxcbiAgICAgIHNoYXJkOiBncm91cHMgIT09IHVuZGVmaW5lZCAmJiBncm91cE51bWJlciAhPT0gdW5kZWZpbmVkID8ge2dyb3VwcywgZ3JvdXBOdW1iZXJ9IDogdW5kZWZpbmVkXG4gICAgfVxuICAgIGNvbnN0IHByb2ZpbGVyID0gcHJvZmlsZU9wdGlvbnMucHJvZmlsZVxuICAgICAgPyBuZXcgVGVzdFByb2ZpbGVyKHtjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSwgcHJvamVjdERpcmVjdG9yeTogZGlyZWN0b3J5LCBzZWxlY3Rpb259KVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCB0ZXN0RmlsZXNGaW5kZXIgPSBuZXcgVGVzdEZpbGVzRmluZGVyKHtkaXJlY3RvcnksIGRpcmVjdG9yaWVzLCBwcm9jZXNzQXJnczogZmlsdGVyZWRQcm9jZXNzQXJnc30pXG4gICAgLyoqIEB0eXBlIHtUZXN0UnVubmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCB0ZXN0UnVubmVyXG4gICAgbGV0IHByb2ZpbGVGaW5hbGl6ZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogRmluYWxpemVzIHJlcXVlc3RlZCBvdXRwdXRzIG9uY2UgZm9yIGV2ZXJ5IGNvbW1hbmQgb3V0Y29tZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzIC0gUnVuIHN0YXR1cy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciByZXF1ZXN0ZWQgb3V0cHV0cyBhcmUgd3JpdHRlbi5cbiAgICAgKi9cbiAgICBjb25zdCBmaW5hbGl6ZVByb2ZpbGUgPSBhc3luYyAoc3RhdHVzKSA9PiB7XG4gICAgICBpZiAoIXByb2ZpbGVyIHx8IHByb2ZpbGVGaW5hbGl6ZWQpIHJldHVyblxuXG4gICAgICBwcm9maWxlRmluYWxpemVkID0gdHJ1ZVxuICAgICAgY29uc3QgZmFpbGVkID0gdGVzdFJ1bm5lcj8uZ2V0RmFpbGVkVGVzdHMoKSA/PyAwXG4gICAgICBjb25zdCBwYXNzZWQgPSB0ZXN0UnVubmVyPy5nZXRTdWNjZXNzZnVsVGVzdHMoKSA/PyAwXG4gICAgICBjb25zdCBwcm9maWxlRG9jdW1lbnQgPSBwcm9maWxlci5maW5pc2goe1xuICAgICAgICBjb3VudHM6IHtcbiAgICAgICAgICBkaXNjb3ZlcmVkOiB0ZXN0UnVubmVyPy5nZXRUZXN0c0NvdW50KCkgPz8gMCxcbiAgICAgICAgICBleGVjdXRlZDogdGVzdFJ1bm5lcj8uZ2V0RXhlY3V0ZWRUZXN0c0NvdW50KCkgPz8gMCxcbiAgICAgICAgICBmYWlsZWQsXG4gICAgICAgICAgcGFzc2VkXG4gICAgICAgIH0sXG4gICAgICAgIGZvY3VzZWQ6IEJvb2xlYW4odGVzdFJ1bm5lcj8uYW55VGVzdHNGb2N1c3NlZCksXG4gICAgICAgIHN0YXR1c1xuICAgICAgfSlcblxuICAgICAgYXdhaXQgd3JpdGVUZXN0UHJvZmlsZU91dHB1dHMoe1xuICAgICAgICBwcm9maWxlOiBwcm9maWxlRG9jdW1lbnQsXG4gICAgICAgIHByb2ZpbGVKc29uUGF0aDogcHJvZmlsZU9wdGlvbnMucHJvZmlsZUpzb25QYXRoLFxuICAgICAgICB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGg6IHByb2ZpbGVPcHRpb25zLnRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICAgICAgfSlcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4ke2Zvcm1hdFRlc3RQcm9maWxlU3VtbWFyeShwcm9maWxlRG9jdW1lbnQsIHByb2ZpbGVPcHRpb25zKX1gKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkaXNjb3ZlclRlc3RGaWxlcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGltaW5nTWFuaWZlc3QgPSBhd2FpdCBsb2FkVGltaW5nTWFuaWZlc3QocHJvZmlsZU9wdGlvbnMudGltaW5nTWFuaWZlc3RQYXRoKVxuICAgICAgICBsZXQgZGlzY292ZXJlZFRlc3RGaWxlcyA9IGF3YWl0IHRlc3RGaWxlc0ZpbmRlci5maW5kVGVzdEZpbGVzKClcbiAgICAgICAgY29uc3QgbGluZUZpbHRlcnMgPSB0ZXN0RmlsZXNGaW5kZXIuZ2V0TGluZUZpbHRlcnNCeUZpbGUoKVxuXG4gICAgICAgIGlmIChwcm9maWxlcikge1xuICAgICAgICAgIGNvbnN0IGRpc2NvdmVyZWRGaWxlUGF0aHMgPSBkaXNjb3ZlcmVkVGVzdEZpbGVzLm1hcCgoZmlsZVBhdGgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxUaW1pbmdNYW5pZmVzdFBhdGgocGF0aC5yZWxhdGl2ZShkaXJlY3RvcnksIGZpbGVQYXRoKSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcHJvZmlsZXIuc2V0U2VsZWN0aW9uKHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRGaWxlQ291bnQ6IGRpc2NvdmVyZWRUZXN0RmlsZXMubGVuZ3RoLFxuICAgICAgICAgICAgaGFzTGluZUZpbHRlcnM6IE9iamVjdC5rZXlzKGxpbmVGaWx0ZXJzKS5sZW5ndGggPiAwLFxuICAgICAgICAgICAgcGF0aEJhc2U6IHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUiA/IFwidGVzdC1kaXJlY3RvcnlcIiA6IFwiY29uZmlndXJhdGlvbi1kaXJlY3RvcnlcIixcbiAgICAgICAgICAgIHRlc3RGaWxlU2V0SGFzaDogdGltaW5nTWFuaWZlc3RGaWxlU2V0SGFzaChkaXNjb3ZlcmVkRmlsZVBhdGhzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ3JvdXBzICE9PSB1bmRlZmluZWQgfHwgZ3JvdXBOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChncm91cHMgPT09IHVuZGVmaW5lZCB8fCBncm91cE51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCb3RoIC0tZ3JvdXBzIGFuZCAtLWdyb3VwLW51bWJlciBtdXN0IGJlIHByb3ZpZGVkIHRvZ2V0aGVyXCIpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgVGVzdFN1aXRlU3BsaXR0ZXIoe1xuICAgICAgICAgICAgZ3JvdXBzLFxuICAgICAgICAgICAgZ3JvdXBOdW1iZXIsXG4gICAgICAgICAgICB0ZXN0RmlsZXM6IGRpc2NvdmVyZWRUZXN0RmlsZXMsXG4gICAgICAgICAgICBiYXNlRGlyZWN0b3J5OiBkaXJlY3RvcnksXG4gICAgICAgICAgICB0aW1pbmdNYW5pZmVzdFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAocHJvZmlsZU9wdGlvbnMudGltaW5nTWFuaWZlc3RQYXRoKSB7XG4gICAgICAgICAgICBjb25zdCBjb3ZlcmFnZSA9IHNwbGl0dGVyLmdldFRpbWluZ01hbmlmZXN0Q292ZXJhZ2UoKVxuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmN5YW4oXG4gICAgICAgICAgICAgIGBUaW1pbmcgbWFuaWZlc3QgY292ZXJhZ2U6IG1lYXN1cmVkPSR7Y292ZXJhZ2UubWVhc3VyZWRGaWxlc30gYCArXG4gICAgICAgICAgICAgIGBoZXVyaXN0aWM9JHtjb3ZlcmFnZS5oZXVyaXN0aWNGaWxlc30gc3RhbGU9JHtjb3ZlcmFnZS5zdGFsZUVudHJpZXN9YFxuICAgICAgICAgICAgKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaXNjb3ZlcmVkVGVzdEZpbGVzID0gc3BsaXR0ZXIuZ2V0R3JvdXBGaWxlcygpXG4gICAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5jeWFuKGBSdW5uaW5nIGdyb3VwICR7Z3JvdXBOdW1iZXJ9IG9mICR7Z3JvdXBzfSAoJHtkaXNjb3ZlcmVkVGVzdEZpbGVzLmxlbmd0aH0gZmlsZXMpYCkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGlzY292ZXJlZFRlc3RGaWxlc1xuICAgICAgfVxuICAgICAgY29uc3QgdGVzdEZpbGVzID0gcHJvZmlsZXJcbiAgICAgICAgPyBhd2FpdCBwcm9maWxlci5tZWFzdXJlUGhhc2UoXCJkaXNjb3ZlcnlcIiwgZGlzY292ZXJUZXN0RmlsZXMpXG4gICAgICAgIDogYXdhaXQgZGlzY292ZXJUZXN0RmlsZXMoKVxuXG4gICAgICBwcm9maWxlcj8uc2V0U2VsZWN0aW9uKHtmaWxlQ291bnQ6IHRlc3RGaWxlcy5sZW5ndGh9KVxuICAgICAgdGVzdFJ1bm5lciA9IG5ldyBUZXN0UnVubmVyKHtcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCksXG4gICAgICAgIGV4Y2x1ZGVUYWdzLFxuICAgICAgICBpbmNsdWRlVGFncyxcbiAgICAgICAgdGVzdEZpbGVzLFxuICAgICAgICBsaW5lRmlsdGVyczogdGVzdEZpbGVzRmluZGVyLmdldExpbmVGaWx0ZXJzQnlGaWxlKCksXG4gICAgICAgIGV4YW1wbGVQYXR0ZXJuczogbm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zKGV4YW1wbGVQYXR0ZXJucyksXG4gICAgICAgIHByb2ZpbGVyXG4gICAgICB9KVxuICAgICAgY29uc3QgYWN0aXZlVGVzdFJ1bm5lciA9IHRlc3RSdW5uZXJcbiAgICAgIGxldCBzaWduYWxIYW5kbGVkID0gZmFsc2VcblxuICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gYXN5bmMgKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBzaWduYWwpID0+IHtcbiAgICAgICAgaWYgKHNpZ25hbEhhbmRsZWQpIHJldHVyblxuICAgICAgICBzaWduYWxIYW5kbGVkID0gdHJ1ZVxuICAgICAgICBwcm9maWxlcj8uaW50ZXJydXB0KClcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxuUmVjZWl2ZWQgJHtzaWduYWx9LCBydW5uaW5nIGFmdGVyQWxsIGhvb2tzIGJlZm9yZSBleGl0Li4uYClcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFjdGl2ZVRlc3RSdW5uZXIucnVuQWZ0ZXJBbGxzRm9yQWN0aXZlU2NvcGVzKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHJ1bm5pbmcgYWZ0ZXJBbGwgaG9va3M6XCIsIGVycm9yKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJpbnRlcnJ1cHRlZFwiKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHdyaXRpbmcgaW50ZXJydXB0ZWQgdGVzdCBwcm9maWxlOlwiLCBlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEzMClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm9uY2UoXCJTSUdJTlRcIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR0lOVFwiKSB9KVxuICAgICAgcHJvY2Vzcy5vbmNlKFwiU0lHVEVSTVwiLCAoKSA9PiB7IHZvaWQgaGFuZGxlU2lnbmFsKFwiU0lHVEVSTVwiKSB9KVxuXG4gICAgICBhd2FpdCB0ZXN0UnVubmVyLnByZXBhcmUoKVxuICAgICAgY29uc3QgZWZmZWN0aXZlRXhjbHVkZVRhZ0NvdW50ID0gdGVzdFJ1bm5lci5nZXRFeGNsdWRlVGFnU2V0KCkuc2l6ZVxuXG4gICAgICBwcm9maWxlcj8uc2V0U2VsZWN0aW9uKHtleGNsdWRlVGFnQ291bnQ6IGVmZmVjdGl2ZUV4Y2x1ZGVUYWdDb3VudH0pXG5cbiAgICAgIGlmICh0ZXN0UnVubmVyLmdldFRlc3RzQ291bnQoKSA9PT0gMCkge1xuICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJuby10ZXN0c1wiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCl9IHRlc3RzIHdhcyBmb3VuZCBpbiAke3Rlc3RGaWxlcy5sZW5ndGh9IGZpbGUocylgKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0ZXN0UnVubmVyLnJ1bigpXG5cbiAgICAgIGNvbnN0IGV4ZWN1dGVkVGVzdHMgPSB0ZXN0UnVubmVyLmdldEV4ZWN1dGVkVGVzdHNDb3VudCgpXG4gICAgICBjb25zdCBsaW5lRmlsdGVycyA9IHRlc3RSdW5uZXIuZ2V0TGluZUZpbHRlcnMoKVxuICAgICAgY29uc3QgaGFzTGluZUZpbHRlcnMgPSBPYmplY3Qua2V5cyhsaW5lRmlsdGVycykubGVuZ3RoID4gMFxuICAgICAgY29uc3QgaGFzRXhhbXBsZUZpbHRlcnMgPSBleGFtcGxlUGF0dGVybnMubGVuZ3RoID4gMFxuICAgICAgY29uc3QgaGFzVGFnRmlsdGVycyA9IGluY2x1ZGVUYWdzLmxlbmd0aCA+IDAgfHwgZWZmZWN0aXZlRXhjbHVkZVRhZ0NvdW50ID4gMFxuXG4gICAgICBpZiAoKGhhc1RhZ0ZpbHRlcnMgfHwgaGFzTGluZUZpbHRlcnMgfHwgaGFzRXhhbXBsZUZpbHRlcnMpICYmIGV4ZWN1dGVkVGVzdHMgPT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChcIlxcbk5vIHRlc3RzIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGZpbHRlcnNcIikpXG4gICAgICAgIGF3YWl0IGZpbmFsaXplUHJvZmlsZShcIm5vLXRlc3RzXCIpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuXG4gICAgICAvLyBSZXBvcnQgdGhlIHNsb3dlc3QgdGVzdHMgc28gc3VpdGUgaG90c3BvdHMgYXJlIHZpc2libGUgZXZlcnkgcnVuLiBEZWZhdWx0cyB0b1xuICAgICAgLy8gdGhlIHRvcCAxMDsgdHVuZSB3aXRoIFZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlQgKDAgZGlzYWJsZXMpLiBTa2lwcGVkIGZvclxuICAgICAgLy8gc2luZ2xlLXRlc3QgcnVucyB3aGVyZSBpdCB3b3VsZCBqdXN0IGJlIG5vaXNlLlxuICAgICAgY29uc3Qgc2xvd1Rlc3RDb3VudCA9IHJlc29sdmVTbG93VGVzdENvdW50KHByb2Nlc3MuZW52LlZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlQpXG5cbiAgICAgIGlmIChzbG93VGVzdENvdW50ID4gMCAmJiBleGVjdXRlZFRlc3RzID4gMSkge1xuICAgICAgICBjb25zdCBzbG93ZXN0VGVzdHMgPSB0ZXN0UnVubmVyLmdldFNsb3dlc3RUZXN0cyhzbG93VGVzdENvdW50KVxuXG4gICAgICAgIGlmIChzbG93ZXN0VGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgXFxuU2xvd2VzdCAke3Nsb3dlc3RUZXN0cy5sZW5ndGh9IHRlc3RzOmApKVxuXG4gICAgICAgICAgZm9yIChjb25zdCBzbG93VGVzdCBvZiBzbG93ZXN0VGVzdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gc2xvd1Rlc3QuZmlsZVBhdGggJiYgc2xvd1Rlc3QubGluZSA/IGAgKCR7c2xvd1Rlc3QuZmlsZVBhdGh9OiR7c2xvd1Rlc3QubGluZX0pYCA6IFwiXCJcblxuICAgICAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5jeWFuKGAgICR7U3RyaW5nKHNsb3dUZXN0LmR1cmF0aW9uTXMpLnBhZFN0YXJ0KDYpfW1zICAke3Nsb3dUZXN0LmZ1bGxEZXNjcmlwdGlvbn0ke2xvY2F0aW9ufWApKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGVzdFJ1bm5lci5pc0ZhaWxlZCgpKSB7XG4gICAgICAgIGF3YWl0IHRlc3RSdW5uZXIucGVyc2lzdEZhaWxlZFRlc3RDb25zb2xlT3V0cHV0c1RvQXNzZXRzKClcbiAgICAgICAgY29uc3QgZmFpbGVkVGVzdHMgPSB0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3REZXRhaWxzKClcblxuICAgICAgICBpZiAoZmFpbGVkVGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoXCJcXG5GYWlsZWQgdGVzdHM6XCIpKVxuXG4gICAgICAgICAgZm9yIChjb25zdCBmYWlsZWQgb2YgZmFpbGVkVGVzdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZmFpbGVkLmZpbGVQYXRoICYmIGZhaWxlZC5saW5lXG4gICAgICAgICAgICAgID8gYCAoJHtmYWlsZWQuZmlsZVBhdGh9OiR7ZmFpbGVkLmxpbmV9KWBcbiAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGAtICR7ZmFpbGVkLmZ1bGxEZXNjcmlwdGlvbn0ke2xvY2F0aW9ufWApKVxuXG4gICAgICAgICAgICBpZiAoZmFpbGVkLmNvbnNvbGVMb2dQYXRoKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoYCAgQ29uc29sZSBsb2c6ICR7ZmFpbGVkLmNvbnNvbGVMb2dQYXRofWApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoYFxcblRlc3QgcnVuIGZhaWxlZCB3aXRoICR7dGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0cygpfSBmYWlsZWQgdGVzdHMgYW5kICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bGxgKSlcbiAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwiZmFpbGVkXCIpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfSBlbHNlIGlmICh0ZXN0UnVubmVyLmFyZUFueVRlc3RzRm9jdXNzZWQoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGBcXG5Gb2N1c3NlZCBydW4gd2l0aCAke3Rlc3RSdW5uZXIuZ2V0RmFpbGVkVGVzdHMoKX0gZmFpbGVkIHRlc3RzIGFuZCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWxsYCkpXG4gICAgICAgIGF3YWl0IGZpbmFsaXplUHJvZmlsZShcImZvY3VzZWRcIilcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmdyZWVuKGBcXG5UZXN0IHJ1biBzdWNjZWVkZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWwgdGVzdHNgKSlcbiAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwicGFzc2VkXCIpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJlcnJvclwiKVxuICAgICAgfSBjYXRjaCAocHJvZmlsZUVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihbZXJyb3IsIHByb2ZpbGVFcnJvcl0sIFwiVGVzdCBjb21tYW5kIGFuZCBwcm9maWxlIGZpbmFsaXphdGlvbiBib3RoIGZhaWxlZFwiLCB7Y2F1c2U6IHByb2ZpbGVFcnJvcn0pXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyBwcm9maWxpbmcgcGF0aHMgYmVmb3JlIHRlc3QgZGlzY292ZXJ5IHN0YXJ0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmF3IHByb2ZpbGluZyBvcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY3dkIC0gQ29tbWFuZCB3b3JraW5nIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5wcm9maWxlIC0gV2hldGhlciBjb25zb2xlIHByb2ZpbGluZyB3YXMgcmVxdWVzdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnByb2ZpbGVKc29uUGF0aF0gLSBSaWNoIHByb2ZpbGUgb3V0cHV0IHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudGltaW5nTWFuaWZlc3RQYXRoXSAtIFRpbWluZyBtYW5pZmVzdCBpbnB1dCBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aF0gLSBUaW1pbmcgbWFuaWZlc3Qgb3V0cHV0IHBhdGguXG4gKiBAcmV0dXJucyB7e3Byb2ZpbGU6IGJvb2xlYW4sIHByb2ZpbGVKc29uUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCB0aW1pbmdNYW5pZmVzdFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWR9fSAtIFJlc29sdmVkIHByb2ZpbGluZyBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlc3RQcm9maWxlT3B0aW9ucyh7Y3dkLCBwcm9maWxlLCBwcm9maWxlSnNvblBhdGgsIHRpbWluZ01hbmlmZXN0UGF0aCwgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRofSkge1xuICBjb25zdCByZXNvbHZlZFByb2ZpbGVKc29uUGF0aCA9IHByb2ZpbGVKc29uUGF0aCA/IHBhdGgucmVzb2x2ZShjd2QsIHByb2ZpbGVKc29uUGF0aCkgOiB1bmRlZmluZWRcbiAgY29uc3QgcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGggPSB0aW1pbmdNYW5pZmVzdFBhdGggPyBwYXRoLnJlc29sdmUoY3dkLCB0aW1pbmdNYW5pZmVzdFBhdGgpIDogdW5kZWZpbmVkXG4gIGNvbnN0IHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoID0gdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoXG4gICAgPyBwYXRoLnJlc29sdmUoY3dkLCB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGgpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAocmVzb2x2ZWRQcm9maWxlSnNvblBhdGggJiYgcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdE91dHB1dFBhdGggJiYgcmVzb2x2ZWRQcm9maWxlSnNvblBhdGggPT09IHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGVzdCBwcm9maWxpbmcgb3V0cHV0IHBhdGhzIG11c3QgYmUgZGlmZmVyZW50XCIpXG4gIH1cblxuICBpZiAocmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGggJiYgKFxuICAgIHJlc29sdmVkUHJvZmlsZUpzb25QYXRoID09PSByZXNvbHZlZFRpbWluZ01hbmlmZXN0UGF0aCB8fFxuICAgIHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoID09PSByZXNvbHZlZFRpbWluZ01hbmlmZXN0UGF0aFxuICApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGVzdCBwcm9maWxpbmcgb3V0cHV0cyBtdXN0IG5vdCBvdmVyd3JpdGUgLS10aW1pbmctbWFuaWZlc3QgaW5wdXRcIilcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcHJvZmlsZTogcHJvZmlsZSB8fCBCb29sZWFuKHJlc29sdmVkUHJvZmlsZUpzb25QYXRoIHx8IHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoKSxcbiAgICBwcm9maWxlSnNvblBhdGg6IHJlc29sdmVkUHJvZmlsZUpzb25QYXRoLFxuICAgIHRpbWluZ01hbmlmZXN0UGF0aDogcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGgsXG4gICAgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoOiByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICB9XG59XG5cbi8qKlxuICogTG9hZHMgYW5kIHZhbGlkYXRlcyBhbiBleHBsaWNpdGx5IHN1cHBsaWVkIHBsYWluIEpTT04gdGltaW5nIG1hbmlmZXN0LlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHRpbWluZ01hbmlmZXN0UGF0aCAtIFRpbWluZyBtYW5pZmVzdCBwYXRoLlxuICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IHVuZGVmaW5lZD59IC0gQ2Fub25pY2FsIG1hbmlmZXN0LCBvciB1bmRlZmluZWQgd2hlbiBub3QgcmVxdWVzdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRpbWluZ01hbmlmZXN0KHRpbWluZ01hbmlmZXN0UGF0aCkge1xuICBpZiAoIXRpbWluZ01hbmlmZXN0UGF0aCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGxldCBjb250ZW50XG5cbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGltaW5nTWFuaWZlc3RQYXRoLCBcInV0ZjhcIilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWFkIHRpbWluZyBtYW5pZmVzdDogJHt0aW1pbmdNYW5pZmVzdFBhdGh9YCwge2NhdXNlOiBlcnJvcn0pXG4gIH1cblxuICBsZXQgcGFyc2VkXG5cbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgdGltaW5nIG1hbmlmZXN0OiAke3RpbWluZ01hbmlmZXN0UGF0aH1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZVRpbWluZ01hbmlmZXN0KHBhcnNlZCwge3NvdXJjZTogYFRpbWluZyBtYW5pZmVzdCAke3RpbWluZ01hbmlmZXN0UGF0aH1gfSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBob3cgbWFueSBzbG93ZXN0IHRlc3RzIHRvIHJlcG9ydCBmcm9tIHRoZSBgVkVMT0NJT1VTX1NMT1dfVEVTVF9DT1VOVGBcbiAqIGVudiB2YWx1ZTogZGVmYXVsdHMgdG8gMTAgd2hlbiB1bnNldDsgMCAob3IgYW4gdW5wYXJzZWFibGUgdmFsdWUpIGRpc2FibGVzIHRoZVxuICogcmVwb3J0OyBvdGhlcndpc2UgdGhlIGZsb29yZWQsIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHJhd0VudlZhbHVlIC0gUmF3IGVudiB2YWx1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTnVtYmVyIG9mIHNsb3dlc3QgdGVzdHMgdG8gcmVwb3J0ICgwIGRpc2FibGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTbG93VGVzdENvdW50KHJhd0VudlZhbHVlKSB7XG4gIGlmIChyYXdFbnZWYWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTBcblxuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihOdW1iZXIocmF3RW52VmFsdWUpKSB8fCAwKVxufVxuIl19
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLGVBQWUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUN0RSxPQUFPLFlBQVksTUFBTSxzQ0FBc0MsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQTtBQUM5RyxPQUFPLFVBQVUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMzRCxPQUFPLGlCQUFpQixNQUFNLDRDQUE0QyxDQUFBO0FBQzFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQTtBQUNsRyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdkIsTUFBTSx3Q0FBd0MsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUV2RSxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF5QixTQUFRLFdBQVc7SUFDL0QsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLHdCQUF3QixFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTlDLElBQUksU0FBUyxDQUFBO1FBQ2IsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBRXRCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lB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QjtJQUN6RCxJQUFJLENBQUMsa0JBQWtCO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFFekMsSUFBSSxPQUFPLENBQUE7SUFFWCxJQUFJLENBQUM7UUFDSCxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsa0JBQWtCLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQzFGLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQTtJQUVWLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0Msa0JBQWtCLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQzNGLENBQUM7SUFFRCxPQUFPLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxtQkFBbUIsa0JBQWtCLEVBQUUsRUFBQyxDQUFDLENBQUE7QUFDMUYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxXQUFXO0lBQzlDLElBQUksV0FBVyxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUV4QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBwaWNvY29sb3JzIGZyb20gXCJwaWNvY29sb3JzXCJcbmltcG9ydCBUZXN0RmlsZXNGaW5kZXIgZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1maWxlcy1maW5kZXIuanNcIlxuaW1wb3J0IFRlc3RQcm9maWxlciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LXByb2ZpbGVyLmpzXCJcbmltcG9ydCB7IGZvcm1hdFRlc3RQcm9maWxlU3VtbWFyeSwgd3JpdGVUZXN0UHJvZmlsZU91dHB1dHMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LXByb2ZpbGUtb3V0cHV0LmpzXCJcbmltcG9ydCBUZXN0UnVubmVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcnVubmVyLmpzXCJcbmltcG9ydCBUZXN0U3VpdGVTcGxpdHRlciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LXN1aXRlLXNwbGl0dGVyLmpzXCJcbmltcG9ydCB7IG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJucywgcGFyc2VGaWx0ZXJzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1maWx0ZXItcGFyc2VyLmpzXCJcbmltcG9ydCB7XG4gIGNhbm9uaWNhbFRpbWluZ01hbmlmZXN0UGF0aCxcbiAgdGltaW5nTWFuaWZlc3RGaWxlU2V0SGFzaCxcbiAgdmFsaWRhdGVUaW1pbmdNYW5pZmVzdFxufSBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90aW1pbmctbWFuaWZlc3QuanNcIlxuaW1wb3J0IHsgcHJlcGFyZVNvdXJjZVBlZXJQYWNrYWdlIH0gZnJvbSBcIi4uLy4uL3NvdXJjZS1wZWVyLXBhY2thZ2UuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNDbGlDb21tYW5kc1Rlc3QgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgcHJlcGFyZVNvdXJjZVBlZXJQYWNrYWdlKClcbiAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zZXRFbnZpcm9ubWVudChcInRlc3RcIilcblxuICAgIGxldCBkaXJlY3RvcnlcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFtdXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSKSB7XG4gICAgICBkaXJlY3RvcnkgPSBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVJcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2gocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeSgpXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L19fdGVzdHNfX2ApXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L3Rlc3RzYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vc3BlY2ApXG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgaW5jbHVkZVRhZ3MsXG4gICAgICBleGNsdWRlVGFncyxcbiAgICAgIGV4YW1wbGVQYXR0ZXJucyxcbiAgICAgIGZpbHRlcmVkUHJvY2Vzc0FyZ3MsXG4gICAgICBncm91cHMsXG4gICAgICBncm91cE51bWJlcixcbiAgICAgIHByb2ZpbGUsXG4gICAgICBwcm9maWxlSnNvblBhdGgsXG4gICAgICB0aW1pbmdNYW5pZmVzdFBhdGgsXG4gICAgICB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcbiAgICB9ID0gcGFyc2VGaWx0ZXJzKHRoaXMucHJvY2Vzc0FyZ3MgfHwgW10pXG4gICAgY29uc3QgcHJvZmlsZU9wdGlvbnMgPSByZXNvbHZlVGVzdFByb2ZpbGVPcHRpb25zKHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIHByb2ZpbGUsXG4gICAgICBwcm9maWxlSnNvblBhdGgsXG4gICAgICB0aW1pbmdNYW5pZmVzdFBhdGgsXG4gICAgICB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcbiAgICB9KVxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHtcbiAgICAgIGV4Y2x1ZGVUYWdDb3VudDogZXhjbHVkZVRhZ3MubGVuZ3RoLFxuICAgICAgaGFzRXhhbXBsZUZpbHRlcnM6IGV4YW1wbGVQYXR0ZXJucy5sZW5ndGggPiAwLFxuICAgICAgaW5jbHVkZVRhZ0NvdW50OiBpbmNsdWRlVGFncy5sZW5ndGgsXG4gICAgICBzaGFyZDogZ3JvdXBzICE9PSB1bmRlZmluZWQgJiYgZ3JvdXBOdW1iZXIgIT09IHVuZGVmaW5lZCA/IHtncm91cHMsIGdyb3VwTnVtYmVyfSA6IHVuZGVmaW5lZFxuICAgIH1cbiAgICBjb25zdCBwcm9maWxlciA9IHByb2ZpbGVPcHRpb25zLnByb2ZpbGVcbiAgICAgID8gbmV3IFRlc3RQcm9maWxlcih7Y29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCksIHByb2plY3REaXJlY3Rvcnk6IGRpcmVjdG9yeSwgc2VsZWN0aW9ufSlcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3QgdGVzdEZpbGVzRmluZGVyID0gbmV3IFRlc3RGaWxlc0ZpbmRlcih7ZGlyZWN0b3J5LCBkaXJlY3RvcmllcywgcHJvY2Vzc0FyZ3M6IGZpbHRlcmVkUHJvY2Vzc0FyZ3N9KVxuICAgIC8qKiBAdHlwZSB7VGVzdFJ1bm5lciB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgdGVzdFJ1bm5lclxuICAgIGxldCBwcm9maWxlRmluYWxpemVkID0gZmFsc2VcblxuICAgIC8qKlxuICAgICAqIEZpbmFsaXplcyByZXF1ZXN0ZWQgb3V0cHV0cyBvbmNlIGZvciBldmVyeSBjb21tYW5kIG91dGNvbWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXR1cyAtIFJ1biBzdGF0dXMuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcmVxdWVzdGVkIG91dHB1dHMgYXJlIHdyaXR0ZW4uXG4gICAgICovXG4gICAgY29uc3QgZmluYWxpemVQcm9maWxlID0gYXN5bmMgKHN0YXR1cykgPT4ge1xuICAgICAgaWYgKCFwcm9maWxlciB8fCBwcm9maWxlRmluYWxpemVkKSByZXR1cm5cblxuICAgICAgcHJvZmlsZUZpbmFsaXplZCA9IHRydWVcbiAgICAgIGNvbnN0IGZhaWxlZCA9IHRlc3RSdW5uZXI/LmdldEZhaWxlZFRlc3RzKCkgPz8gMFxuICAgICAgY29uc3QgcGFzc2VkID0gdGVzdFJ1bm5lcj8uZ2V0U3VjY2Vzc2Z1bFRlc3RzKCkgPz8gMFxuICAgICAgY29uc3QgcHJvZmlsZURvY3VtZW50ID0gcHJvZmlsZXIuZmluaXNoKHtcbiAgICAgICAgY291bnRzOiB7XG4gICAgICAgICAgZGlzY292ZXJlZDogdGVzdFJ1bm5lcj8uZ2V0VGVzdHNDb3VudCgpID8/IDAsXG4gICAgICAgICAgZXhlY3V0ZWQ6IHRlc3RSdW5uZXI/LmdldEV4ZWN1dGVkVGVzdHNDb3VudCgpID8/IDAsXG4gICAgICAgICAgZmFpbGVkLFxuICAgICAgICAgIHBhc3NlZFxuICAgICAgICB9LFxuICAgICAgICBmb2N1c2VkOiBCb29sZWFuKHRlc3RSdW5uZXI/LmFueVRlc3RzRm9jdXNzZWQpLFxuICAgICAgICBzdGF0dXNcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHdyaXRlVGVzdFByb2ZpbGVPdXRwdXRzKHtcbiAgICAgICAgcHJvZmlsZTogcHJvZmlsZURvY3VtZW50LFxuICAgICAgICBwcm9maWxlSnNvblBhdGg6IHByb2ZpbGVPcHRpb25zLnByb2ZpbGVKc29uUGF0aCxcbiAgICAgICAgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoOiBwcm9maWxlT3B0aW9ucy50aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcbiAgICAgIH0pXG4gICAgICBjb25zb2xlLmxvZyhgXFxuJHtmb3JtYXRUZXN0UHJvZmlsZVN1bW1hcnkocHJvZmlsZURvY3VtZW50LCBwcm9maWxlT3B0aW9ucyl9YClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzY292ZXJUZXN0RmlsZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWluZ01hbmlmZXN0ID0gYXdhaXQgbG9hZFRpbWluZ01hbmlmZXN0KHByb2ZpbGVPcHRpb25zLnRpbWluZ01hbmlmZXN0UGF0aClcbiAgICAgICAgbGV0IGRpc2NvdmVyZWRUZXN0RmlsZXMgPSBhd2FpdCB0ZXN0RmlsZXNGaW5kZXIuZmluZFRlc3RGaWxlcygpXG4gICAgICAgIGNvbnN0IGxpbmVGaWx0ZXJzID0gdGVzdEZpbGVzRmluZGVyLmdldExpbmVGaWx0ZXJzQnlGaWxlKClcblxuICAgICAgICBpZiAocHJvZmlsZXIpIHtcbiAgICAgICAgICBjb25zdCBkaXNjb3ZlcmVkRmlsZVBhdGhzID0gZGlzY292ZXJlZFRlc3RGaWxlcy5tYXAoKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsVGltaW5nTWFuaWZlc3RQYXRoKHBhdGgucmVsYXRpdmUoZGlyZWN0b3J5LCBmaWxlUGF0aCkpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHByb2ZpbGVyLnNldFNlbGVjdGlvbih7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkRmlsZUNvdW50OiBkaXNjb3ZlcmVkVGVzdEZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgIGhhc0xpbmVGaWx0ZXJzOiBPYmplY3Qua2V5cyhsaW5lRmlsdGVycykubGVuZ3RoID4gMCxcbiAgICAgICAgICAgIHBhdGhCYXNlOiBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIgPyBcInRlc3QtZGlyZWN0b3J5XCIgOiBcImNvbmZpZ3VyYXRpb24tZGlyZWN0b3J5XCIsXG4gICAgICAgICAgICB0ZXN0RmlsZVNldEhhc2g6IHRpbWluZ01hbmlmZXN0RmlsZVNldEhhc2goZGlzY292ZXJlZEZpbGVQYXRocylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdyb3VwcyAhPT0gdW5kZWZpbmVkIHx8IGdyb3VwTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoZ3JvdXBzID09PSB1bmRlZmluZWQgfHwgZ3JvdXBOdW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQm90aCAtLWdyb3VwcyBhbmQgLS1ncm91cC1udW1iZXIgbXVzdCBiZSBwcm92aWRlZCB0b2dldGhlclwiKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNwbGl0dGVyID0gbmV3IFRlc3RTdWl0ZVNwbGl0dGVyKHtcbiAgICAgICAgICAgIGdyb3VwcyxcbiAgICAgICAgICAgIGdyb3VwTnVtYmVyLFxuICAgICAgICAgICAgdGVzdEZpbGVzOiBkaXNjb3ZlcmVkVGVzdEZpbGVzLFxuICAgICAgICAgICAgYmFzZURpcmVjdG9yeTogZGlyZWN0b3J5LFxuICAgICAgICAgICAgdGltaW5nTWFuaWZlc3RcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgaWYgKHByb2ZpbGVPcHRpb25zLnRpbWluZ01hbmlmZXN0UGF0aCkge1xuICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBzcGxpdHRlci5nZXRUaW1pbmdNYW5pZmVzdENvdmVyYWdlKClcblxuICAgICAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5jeWFuKFxuICAgICAgICAgICAgICBgVGltaW5nIG1hbmlmZXN0IGNvdmVyYWdlOiBtZWFzdXJlZD0ke2NvdmVyYWdlLm1lYXN1cmVkRmlsZXN9IGAgK1xuICAgICAgICAgICAgICBgaGV1cmlzdGljPSR7Y292ZXJhZ2UuaGV1cmlzdGljRmlsZXN9IHN0YWxlPSR7Y292ZXJhZ2Uuc3RhbGVFbnRyaWVzfWBcbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlzY292ZXJlZFRlc3RGaWxlcyA9IHNwbGl0dGVyLmdldEdyb3VwRmlsZXMoKVxuICAgICAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgUnVubmluZyBncm91cCAke2dyb3VwTnVtYmVyfSBvZiAke2dyb3Vwc30gKCR7ZGlzY292ZXJlZFRlc3RGaWxlcy5sZW5ndGh9IGZpbGVzKWApKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRpc2NvdmVyZWRUZXN0RmlsZXNcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRlc3RGaWxlcyA9IHByb2ZpbGVyXG4gICAgICAgID8gYXdhaXQgcHJvZmlsZXIubWVhc3VyZVBoYXNlKFwiZGlzY292ZXJ5XCIsIGRpc2NvdmVyVGVzdEZpbGVzKVxuICAgICAgICA6IGF3YWl0IGRpc2NvdmVyVGVzdEZpbGVzKClcblxuICAgICAgcHJvZmlsZXI/LnNldFNlbGVjdGlvbih7ZmlsZUNvdW50OiB0ZXN0RmlsZXMubGVuZ3RofSlcbiAgICAgIHRlc3RSdW5uZXIgPSBuZXcgVGVzdFJ1bm5lcih7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLFxuICAgICAgICBleGNsdWRlVGFncyxcbiAgICAgICAgaW5jbHVkZVRhZ3MsXG4gICAgICAgIHRlc3RGaWxlcyxcbiAgICAgICAgbGluZUZpbHRlcnM6IHRlc3RGaWxlc0ZpbmRlci5nZXRMaW5lRmlsdGVyc0J5RmlsZSgpLFxuICAgICAgICBleGFtcGxlUGF0dGVybnM6IG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJucyhleGFtcGxlUGF0dGVybnMpLFxuICAgICAgICBwcm9maWxlclxuICAgICAgfSlcbiAgICAgIGNvbnN0IGFjdGl2ZVRlc3RSdW5uZXIgPSB0ZXN0UnVubmVyXG4gICAgICBsZXQgc2lnbmFsSGFuZGxlZCA9IGZhbHNlXG5cbiAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9IGFzeW5jICgvKiogQHR5cGUge3N0cmluZ30gKi8gc2lnbmFsKSA9PiB7XG4gICAgICAgIGlmIChzaWduYWxIYW5kbGVkKSByZXR1cm5cbiAgICAgICAgc2lnbmFsSGFuZGxlZCA9IHRydWVcbiAgICAgICAgcHJvZmlsZXI/LmludGVycnVwdCgpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcblJlY2VpdmVkICR7c2lnbmFsfSwgcnVubmluZyBhZnRlckFsbCBob29rcyBiZWZvcmUgZXhpdC4uLmApXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhY3RpdmVUZXN0UnVubmVyLnJ1bkFmdGVyQWxsc0ZvckFjdGl2ZVNjb3BlcygpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB3aGlsZSBydW5uaW5nIGFmdGVyQWxsIGhvb2tzOlwiLCBlcnJvcilcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwiaW50ZXJydXB0ZWRcIilcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB3aGlsZSB3cml0aW5nIGludGVycnVwdGVkIHRlc3QgcHJvZmlsZTpcIiwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxMzApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5vbmNlKFwiU0lHSU5UXCIsICgpID0+IHsgdm9pZCBoYW5kbGVTaWduYWwoXCJTSUdJTlRcIikgfSlcbiAgICAgIHByb2Nlc3Mub25jZShcIlNJR1RFUk1cIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR1RFUk1cIikgfSlcblxuICAgICAgYXdhaXQgdGVzdFJ1bm5lci5wcmVwYXJlKClcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUV4Y2x1ZGVUYWdDb3VudCA9IHRlc3RSdW5uZXIuZ2V0RXhjbHVkZVRhZ1NldCgpLnNpemVcblxuICAgICAgcHJvZmlsZXI/LnNldFNlbGVjdGlvbih7ZXhjbHVkZVRhZ0NvdW50OiBlZmZlY3RpdmVFeGNsdWRlVGFnQ291bnR9KVxuXG4gICAgICBpZiAodGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCkgPT09IDApIHtcbiAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwibm8tdGVzdHNcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Rlc3RSdW5uZXIuZ2V0VGVzdHNDb3VudCgpfSB0ZXN0cyB3YXMgZm91bmQgaW4gJHt0ZXN0RmlsZXMubGVuZ3RofSBmaWxlKHMpYClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGVzdFJ1bm5lci5ydW4oKVxuXG4gICAgICBjb25zdCBleGVjdXRlZFRlc3RzID0gdGVzdFJ1bm5lci5nZXRFeGVjdXRlZFRlc3RzQ291bnQoKVxuICAgICAgY29uc3QgbGluZUZpbHRlcnMgPSB0ZXN0UnVubmVyLmdldExpbmVGaWx0ZXJzKClcbiAgICAgIGNvbnN0IGhhc0xpbmVGaWx0ZXJzID0gT2JqZWN0LmtleXMobGluZUZpbHRlcnMpLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGhhc0V4YW1wbGVGaWx0ZXJzID0gZXhhbXBsZVBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGhhc1RhZ0ZpbHRlcnMgPSBpbmNsdWRlVGFncy5sZW5ndGggPiAwIHx8IGVmZmVjdGl2ZUV4Y2x1ZGVUYWdDb3VudCA+IDBcblxuICAgICAgaWYgKChoYXNUYWdGaWx0ZXJzIHx8IGhhc0xpbmVGaWx0ZXJzIHx8IGhhc0V4YW1wbGVGaWx0ZXJzKSAmJiB0ZXN0UnVubmVyLmhhc05vTWF0Y2hlcygpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoXCJcXG5ObyB0ZXN0cyBtYXRjaGVkIHRoZSBwcm92aWRlZCBmaWx0ZXJzXCIpKVxuICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJuby10ZXN0c1wiKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgLy8gUmVwb3J0IHRoZSBzbG93ZXN0IHRlc3RzIHNvIHN1aXRlIGhvdHNwb3RzIGFyZSB2aXNpYmxlIGV2ZXJ5IHJ1bi4gRGVmYXVsdHMgdG9cbiAgICAgIC8vIHRoZSB0b3AgMTA7IHR1bmUgd2l0aCBWRUxPQ0lPVVNfU0xPV19URVNUX0NPVU5UICgwIGRpc2FibGVzKS4gU2tpcHBlZCBmb3JcbiAgICAgIC8vIHNpbmdsZS10ZXN0IHJ1bnMgd2hlcmUgaXQgd291bGQganVzdCBiZSBub2lzZS5cbiAgICAgIGNvbnN0IHNsb3dUZXN0Q291bnQgPSByZXNvbHZlU2xvd1Rlc3RDb3VudChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfU0xPV19URVNUX0NPVU5UKVxuXG4gICAgICBpZiAoc2xvd1Rlc3RDb3VudCA+IDAgJiYgZXhlY3V0ZWRUZXN0cyA+IDEpIHtcbiAgICAgICAgY29uc3Qgc2xvd2VzdFRlc3RzID0gdGVzdFJ1bm5lci5nZXRTbG93ZXN0VGVzdHMoc2xvd1Rlc3RDb3VudClcblxuICAgICAgICBpZiAoc2xvd2VzdFRlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmN5YW4oYFxcblNsb3dlc3QgJHtzbG93ZXN0VGVzdHMubGVuZ3RofSB0ZXN0czpgKSlcblxuICAgICAgICAgIGZvciAoY29uc3Qgc2xvd1Rlc3Qgb2Ygc2xvd2VzdFRlc3RzKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHNsb3dUZXN0LmZpbGVQYXRoICYmIHNsb3dUZXN0LmxpbmUgPyBgICgke3Nsb3dUZXN0LmZpbGVQYXRofToke3Nsb3dUZXN0LmxpbmV9KWAgOiBcIlwiXG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgICAke1N0cmluZyhzbG93VGVzdC5kdXJhdGlvbk1zKS5wYWRTdGFydCg2KX1tcyAgJHtzbG93VGVzdC5mdWxsRGVzY3JpcHRpb259JHtsb2NhdGlvbn1gKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRlc3RSdW5uZXIuaXNGYWlsZWQoKSkge1xuICAgICAgICBhd2FpdCB0ZXN0UnVubmVyLnBlcnNpc3RGYWlsZWRUZXN0Q29uc29sZU91dHB1dHNUb0Fzc2V0cygpXG4gICAgICAgIGNvbnN0IGZhaWxlZFRlc3RzID0gdGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0RGV0YWlscygpXG5cbiAgICAgICAgaWYgKGZhaWxlZFRlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKFwiXFxuRmFpbGVkIHRlc3RzOlwiKSlcblxuICAgICAgICAgIGZvciAoY29uc3QgZmFpbGVkIG9mIGZhaWxlZFRlc3RzKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGZhaWxlZC5maWxlUGF0aCAmJiBmYWlsZWQubGluZVxuICAgICAgICAgICAgICA/IGAgKCR7ZmFpbGVkLmZpbGVQYXRofToke2ZhaWxlZC5saW5lfSlgXG4gICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChgLSAke2ZhaWxlZC5mdWxsRGVzY3JpcHRpb259JHtsb2NhdGlvbn1gKSlcblxuICAgICAgICAgICAgaWYgKGZhaWxlZC5jb25zb2xlTG9nUGF0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGAgIENvbnNvbGUgbG9nOiAke2ZhaWxlZC5jb25zb2xlTG9nUGF0aH1gKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdFJ1bm5lci5nZXROb3RSdW5UZXN0cygpID4gMCkgY29uc29sZS5lcnJvcihgJHt0ZXN0UnVubmVyLmdldE5vdFJ1blRlc3RzKCl9IHRlc3RzIG5vdCBydW4gYmVjYXVzZSBhIHNoYXJlZCByZXNvdXJjZSBmYWlsZWRgKVxuICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGBcXG5UZXN0IHJ1biBmYWlsZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0RmFpbGVkVGVzdHMoKX0gZmFpbGVkIHRlc3RzIGFuZCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWxsYCkpXG4gICAgICAgIGF3YWl0IGZpbmFsaXplUHJvZmlsZShcImZhaWxlZFwiKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH0gZWxzZSBpZiAodGVzdFJ1bm5lci5hcmVBbnlUZXN0c0ZvY3Vzc2VkKCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChgXFxuRm9jdXNzZWQgcnVuIHdpdGggJHt0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3RzKCl9IGZhaWxlZCB0ZXN0cyBhbmQgJHt0ZXN0UnVubmVyLmdldFN1Y2Nlc3NmdWxUZXN0cygpfSBzdWNjZXNzZnVsbGApKVxuICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJmb2N1c2VkXCIpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5ncmVlbihgXFxuVGVzdCBydW4gc3VjY2VlZGVkIHdpdGggJHt0ZXN0UnVubmVyLmdldFN1Y2Nlc3NmdWxUZXN0cygpfSBzdWNjZXNzZnVsIHRlc3RzYCkpXG4gICAgICAgIGF3YWl0IGZpbmFsaXplUHJvZmlsZShcInBhc3NlZFwiKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwiZXJyb3JcIilcbiAgICAgIH0gY2F0Y2ggKHByb2ZpbGVFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoW2Vycm9yLCBwcm9maWxlRXJyb3JdLCBcIlRlc3QgY29tbWFuZCBhbmQgcHJvZmlsZSBmaW5hbGl6YXRpb24gYm90aCBmYWlsZWRcIiwge2NhdXNlOiBwcm9maWxlRXJyb3J9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgcHJvZmlsaW5nIHBhdGhzIGJlZm9yZSB0ZXN0IGRpc2NvdmVyeSBzdGFydHMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJhdyBwcm9maWxpbmcgb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmN3ZCAtIENvbW1hbmQgd29ya2luZyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MucHJvZmlsZSAtIFdoZXRoZXIgY29uc29sZSBwcm9maWxpbmcgd2FzIHJlcXVlc3RlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5wcm9maWxlSnNvblBhdGhdIC0gUmljaCBwcm9maWxlIG91dHB1dCBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnRpbWluZ01hbmlmZXN0UGF0aF0gLSBUaW1pbmcgbWFuaWZlc3QgaW5wdXQgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhdIC0gVGltaW5nIG1hbmlmZXN0IG91dHB1dCBwYXRoLlxuICogQHJldHVybnMge3twcm9maWxlOiBib29sZWFuLCBwcm9maWxlSnNvblBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGltaW5nTWFuaWZlc3RQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkfX0gLSBSZXNvbHZlZCBwcm9maWxpbmcgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0UHJvZmlsZU9wdGlvbnMoe2N3ZCwgcHJvZmlsZSwgcHJvZmlsZUpzb25QYXRoLCB0aW1pbmdNYW5pZmVzdFBhdGgsIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aH0pIHtcbiAgY29uc3QgcmVzb2x2ZWRQcm9maWxlSnNvblBhdGggPSBwcm9maWxlSnNvblBhdGggPyBwYXRoLnJlc29sdmUoY3dkLCBwcm9maWxlSnNvblBhdGgpIDogdW5kZWZpbmVkXG4gIGNvbnN0IHJlc29sdmVkVGltaW5nTWFuaWZlc3RQYXRoID0gdGltaW5nTWFuaWZlc3RQYXRoID8gcGF0aC5yZXNvbHZlKGN3ZCwgdGltaW5nTWFuaWZlc3RQYXRoKSA6IHVuZGVmaW5lZFxuICBjb25zdCByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCA9IHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICAgID8gcGF0aC5yZXNvbHZlKGN3ZCwgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKHJlc29sdmVkUHJvZmlsZUpzb25QYXRoICYmIHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoICYmIHJlc29sdmVkUHJvZmlsZUpzb25QYXRoID09PSByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRlc3QgcHJvZmlsaW5nIG91dHB1dCBwYXRocyBtdXN0IGJlIGRpZmZlcmVudFwiKVxuICB9XG5cbiAgaWYgKHJlc29sdmVkVGltaW5nTWFuaWZlc3RQYXRoICYmIChcbiAgICByZXNvbHZlZFByb2ZpbGVKc29uUGF0aCA9PT0gcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGggfHxcbiAgICByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCA9PT0gcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGhcbiAgKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRlc3QgcHJvZmlsaW5nIG91dHB1dHMgbXVzdCBub3Qgb3ZlcndyaXRlIC0tdGltaW5nLW1hbmlmZXN0IGlucHV0XCIpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByb2ZpbGU6IHByb2ZpbGUgfHwgQm9vbGVhbihyZXNvbHZlZFByb2ZpbGVKc29uUGF0aCB8fCByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCksXG4gICAgcHJvZmlsZUpzb25QYXRoOiByZXNvbHZlZFByb2ZpbGVKc29uUGF0aCxcbiAgICB0aW1pbmdNYW5pZmVzdFBhdGg6IHJlc29sdmVkVGltaW5nTWFuaWZlc3RQYXRoLFxuICAgIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aDogcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcbiAgfVxufVxuXG4vKipcbiAqIExvYWRzIGFuZCB2YWxpZGF0ZXMgYW4gZXhwbGljaXRseSBzdXBwbGllZCBwbGFpbiBKU09OIHRpbWluZyBtYW5pZmVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0aW1pbmdNYW5pZmVzdFBhdGggLSBUaW1pbmcgbWFuaWZlc3QgcGF0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCB1bmRlZmluZWQ+fSAtIENhbm9uaWNhbCBtYW5pZmVzdCwgb3IgdW5kZWZpbmVkIHdoZW4gbm90IHJlcXVlc3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUaW1pbmdNYW5pZmVzdCh0aW1pbmdNYW5pZmVzdFBhdGgpIHtcbiAgaWYgKCF0aW1pbmdNYW5pZmVzdFBhdGgpIHJldHVybiB1bmRlZmluZWRcblxuICBsZXQgY29udGVudFxuXG4gIHRyeSB7XG4gICAgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHRpbWluZ01hbmlmZXN0UGF0aCwgXCJ1dGY4XCIpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVhZCB0aW1pbmcgbWFuaWZlc3Q6ICR7dGltaW5nTWFuaWZlc3RQYXRofWAsIHtjYXVzZTogZXJyb3J9KVxuICB9XG5cbiAgbGV0IHBhcnNlZFxuXG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHRpbWluZyBtYW5pZmVzdDogJHt0aW1pbmdNYW5pZmVzdFBhdGh9YCwge2NhdXNlOiBlcnJvcn0pXG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVUaW1pbmdNYW5pZmVzdChwYXJzZWQsIHtzb3VyY2U6IGBUaW1pbmcgbWFuaWZlc3QgJHt0aW1pbmdNYW5pZmVzdFBhdGh9YH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgaG93IG1hbnkgc2xvd2VzdCB0ZXN0cyB0byByZXBvcnQgZnJvbSB0aGUgYFZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlRgXG4gKiBlbnYgdmFsdWU6IGRlZmF1bHRzIHRvIDEwIHdoZW4gdW5zZXQ7IDAgKG9yIGFuIHVucGFyc2VhYmxlIHZhbHVlKSBkaXNhYmxlcyB0aGVcbiAqIHJlcG9ydDsgb3RoZXJ3aXNlIHRoZSBmbG9vcmVkLCBub24tbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSByYXdFbnZWYWx1ZSAtIFJhdyBlbnYgdmFsdWUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIE51bWJlciBvZiBzbG93ZXN0IHRlc3RzIHRvIHJlcG9ydCAoMCBkaXNhYmxlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2xvd1Rlc3RDb3VudChyYXdFbnZWYWx1ZSkge1xuICBpZiAocmF3RW52VmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDEwXG5cbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoTnVtYmVyKHJhd0VudlZhbHVlKSkgfHwgMClcbn1cbiJdfQ==
@@ -84,7 +84,15 @@ export default class VeoliciousHttpServerClient {
84
84
  _drainDoneRequests(): Promise<void>;
85
85
  sendDoneRequests(): Promise<void>;
86
86
  /**
87
- * Runs send response.
87
+ * Sends a finished response to the client. Owns the framework-owned
88
+ * `Vary: Accept-Encoding` dimension (emitted for every selected
89
+ * representation — transformed, identity, 406, and file — and for
90
+ * header-present and header-absent requests alike, so it is stable across
91
+ * requests on the same connection; never added when compression is disabled,
92
+ * the response is truly bodyless, or the application supplied a fixed
93
+ * `Content-Encoding`) and the file 406 rule (a sendFile response whose
94
+ * client forbids identity is answered with the empty 406, the file is never
95
+ * opened or streamed, and `onFinished` settles once as "completed").
88
96
  * @param {RequestRunner} requestRunner - Request runner.
89
97
  * @returns {Promise<void>} - Resolves when complete.
90
98
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"AAOA,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAE/C,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AAerD,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAwBtC,MAAM;IACN,WAAW;IACX,aAAa;IACb,aAAa;IAElB;;iCAE6B;IACxB,cAAc,EADT,aAAa,EAAE;IAGzB,sEAAsE;IACjE,oBAAoB,EADd,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IA4D7D,cAAc;IA2Kd,gBAAgB;IAxQvB,MAAM,6DAAqB;IAC3B,KAAK,SAAY;IAEjB;;yBAEqB;IACrB,wBAAwB,EADd,OAAO,CACe;IAEhC;;yBAEqB;IACrB,yBAAyB,EADf,OAAO,CACgB;IAEjC;;;;;;OAMG;IACH,YAAY,EAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAC,EAJpD;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAChD;QAAsB,aAAa,AAAnC,CACF,EADU,MAAM,CAChB;KACsD,EAetD;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAHpB,MAGoB,GAFlB,IAAI,CAgBhB;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAHpB,MAGoB,GAFlB,IAAI,CAgBhB;IAED;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAHX,KAGW,GAFT,IAAI,CAehB;IAED,qBAAqB,aAkCpB;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAHD,MAGC,GAFC,IAAI,CAgEhB;IAED;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAHhB,OAAO,cAAc,EAAE,OAGP,GAFd,OAAO,CAOnB;IAED;;;OAGG;IACH,mBAAmB,IAFN,IAAI,CAyEhB;IAED,WAAW,sBAOV;IAED;;;;;;OAMG;IACG,kBAAkB,IAFX,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAEK,gBAAgB,kBA6BrB;IAED;;;;OAIG;IACG,YAAY,CAAC,aAAa,EAHrB,aAGqB,GAFnB,OAAO,CAAC,IAAI,CAAC,CA6HzB;IAED;;;;;;OAMG;IACG,cAAc,CAAC,QAAQ,EALlB,MAKkB,EAAE,QAAQ,EAJ5B,OAI4B,EAAE,UAAU,EAHxC,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAGtB,GAFtC,OAAO,CAAC,IAAI,CAAC,CAuBzB;IAED;;;;;;;OAOG;IACG,iBAAiB,CAAC,EAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAC,EALnD;QAAqB,QAAQ,EAArB,MAAM,CACd;QAAiF,UAAU,EAAnF,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAC1E;QAAsC,MAAM,EAApC,WAAW,GAAG,SAAS,CAC/B;KAEmD,GAFzC,OAAO,CAAC,IAAI,CAAC,CAoBzB;IAED;;;OAGG;IACG,yBAAyB,IAFlB,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAHlB,OAAO,cAAc,EAAE,OAAO,GAAG,OAAO,wBAAwB,EAAE,OAGhD,GAFhB,OAAO,CAenB;CACF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"AAOA,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAE/C,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AAerD,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAwBtC,MAAM;IACN,WAAW;IACX,aAAa;IACb,aAAa;IAElB;;iCAE6B;IACxB,cAAc,EADT,aAAa,EAAE;IAGzB,sEAAsE;IACjE,oBAAoB,EADd,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IA4D7D,cAAc;IA2Kd,gBAAgB;IAxQvB,MAAM,6DAAqB;IAC3B,KAAK,SAAY;IAEjB;;yBAEqB;IACrB,wBAAwB,EADd,OAAO,CACe;IAEhC;;yBAEqB;IACrB,yBAAyB,EADf,OAAO,CACgB;IAEjC;;;;;;OAMG;IACH,YAAY,EAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAC,EAJpD;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAChD;QAAsB,aAAa,AAAnC,CACF,EADU,MAAM,CAChB;KACsD,EAetD;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAHpB,MAGoB,GAFlB,IAAI,CAgBhB;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAHpB,MAGoB,GAFlB,IAAI,CAgBhB;IAED;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAHX,KAGW,GAFT,IAAI,CAehB;IAED,qBAAqB,aAkCpB;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAHD,MAGC,GAFC,IAAI,CAgEhB;IAED;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAHhB,OAAO,cAAc,EAAE,OAGP,GAFd,OAAO,CAOnB;IAED;;;OAGG;IACH,mBAAmB,IAFN,IAAI,CAyEhB;IAED,WAAW,sBAOV;IAED;;;;;;OAMG;IACG,kBAAkB,IAFX,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAEK,gBAAgB,kBA6BrB;IAED;;;;;;;;;;;;OAYG;IACG,YAAY,CAAC,aAAa,EAHrB,aAGqB,GAFnB,OAAO,CAAC,IAAI,CAAC,CAmLzB;IAED;;;;;;OAMG;IACG,cAAc,CAAC,QAAQ,EALlB,MAKkB,EAAE,QAAQ,EAJ5B,OAI4B,EAAE,UAAU,EAHxC,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAGtB,GAFtC,OAAO,CAAC,IAAI,CAAC,CAuBzB;IAED;;;;;;;OAOG;IACG,iBAAiB,CAAC,EAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAC,EALnD;QAAqB,QAAQ,EAArB,MAAM,CACd;QAAiF,UAAU,EAAnF,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAC1E;QAAsC,MAAM,EAApC,WAAW,GAAG,SAAS,CAC/B;KAEmD,GAFzC,OAAO,CAAC,IAAI,CAAC,CAoBzB;IAED;;;OAGG;IACG,yBAAyB,IAFlB,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAHlB,OAAO,cAAc,EAAE,OAAO,GAAG,OAAO,wBAAwB,EAAE,OAGhD,GAFhB,OAAO,CAenB;CACF"}