velocious 1.0.678 → 1.0.680

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.
@@ -27,6 +27,11 @@ function truncatePreview(input, limit = 300) {
27
27
  }
28
28
  export default class RequestBuffer {
29
29
  bodyLength = 0;
30
+ /** @type {import("../../../configuration-types.js").ResolvedHttpRequestBodyPolicy | undefined} */
31
+ requestBodyPolicy = undefined;
32
+ /** @type {Buffer | undefined} */
33
+ rawBodyBuffer = undefined;
34
+ destroyed = false;
30
35
  /** @type {Buffer[] | undefined} */
31
36
  postBodyBuffers = undefined;
32
37
  /**
@@ -62,7 +67,7 @@ export default class RequestBuffer {
62
67
  * @returns {void}
63
68
  */
64
69
  assertRequestBodySize(actualBytes) {
65
- const maxBytes = this.configuration.getHttpServerMaxRequestBodyBytes();
70
+ const maxBytes = this.requestBodyPolicy?.maxRequestBodyBytes ?? this.configuration.getHttpServerMaxRequestBodyBytes();
66
71
  if (maxBytes !== undefined && actualBytes > maxBytes) {
67
72
  throw new HttpRequestBodyTooLargeError({ actualBytes, maxBytes });
68
73
  }
@@ -79,7 +84,26 @@ export default class RequestBuffer {
79
84
  this.assertRequestBodySize(this.bodyLength);
80
85
  }
81
86
  destroy() {
82
- // Do nothing for now...
87
+ this.destroyed = true;
88
+ this.rawBodyBuffer = undefined;
89
+ this.postBody = undefined;
90
+ this.postBodyBuffers = undefined;
91
+ this.chunkedBodyChars = undefined;
92
+ this.data = [];
93
+ this.formDataPart = undefined;
94
+ }
95
+ /**
96
+ * Returns exact request body bytes for a completed request whose policy selected raw mode.
97
+ * @returns {Buffer} - A copy of the exact request body bytes.
98
+ */
99
+ getRawBody() {
100
+ if (this.destroyed)
101
+ throw new Error("Raw request body is unavailable after request cleanup");
102
+ if (this.requestBodyPolicy?.mode !== "raw")
103
+ throw new Error("Raw request body is available only when the request body policy selects raw mode");
104
+ if (!this.completed || !this.rawBodyBuffer)
105
+ throw new Error("Raw request body is unavailable before request parsing completes");
106
+ return Buffer.from(this.rawBodyBuffer);
83
107
  }
84
108
  /**
85
109
  * Runs feed.
@@ -180,6 +204,7 @@ export default class RequestBuffer {
180
204
  throw new Error("Chunk size not initialized");
181
205
  if (!chunkedBodyChars)
182
206
  throw new Error("Chunked body not initialized");
207
+ this.assertRequestBodySize(chunkedBodyChars.length + 1);
183
208
  chunkedBodyChars.push(char);
184
209
  /**
185
210
  * Current chunk bytes read.
@@ -382,6 +407,13 @@ export default class RequestBuffer {
382
407
  const httpMethod = this.httpMethod?.toUpperCase();
383
408
  if (!httpMethod)
384
409
  throw new Error("HTTP method not set");
410
+ if (!this.path)
411
+ throw new Error("HTTP path not set");
412
+ this.requestBodyPolicy = this.configuration.resolveHttpRequestBodyPolicy({
413
+ headers: this.getHeadersHash(),
414
+ httpMethod,
415
+ path: this.path
416
+ });
385
417
  if (!this.expectsRequestBody(httpMethod)) {
386
418
  this.completeRequest();
387
419
  }
@@ -398,7 +430,9 @@ export default class RequestBuffer {
398
430
  throw new Error("Content length is invalid");
399
431
  this.assertRequestBodySize(this.contentLength);
400
432
  }
401
- const match = this.getHeader("content-type")?.value?.match(/^multipart\/form-data;\s*boundary=(.+)$/i);
433
+ const match = this.requestBodyPolicy.mode === "parsed"
434
+ ? this.getHeader("content-type")?.value?.match(/^multipart\/form-data;\s*boundary=(.+)$/i)
435
+ : null;
402
436
  if (match) {
403
437
  this.boundary = match[1];
404
438
  this.boundaryLine = `--${this.boundary}\r\n`;
@@ -438,7 +472,13 @@ export default class RequestBuffer {
438
472
  }
439
473
  postRequestDone() {
440
474
  if (this.postBodyBuffers) {
441
- this.postBody = Buffer.concat(this.postBodyBuffers).toString("utf8");
475
+ const bodyBuffer = Buffer.concat(this.postBodyBuffers);
476
+ if (this.requestBodyPolicy?.mode === "raw") {
477
+ this.rawBodyBuffer = bodyBuffer;
478
+ }
479
+ else {
480
+ this.postBody = bodyBuffer.toString("utf8");
481
+ }
442
482
  }
443
483
  this.postBodyBuffers = undefined;
444
484
  this.completeRequest();
@@ -481,8 +521,10 @@ export default class RequestBuffer {
481
521
  const sizeToken = trimmed.split(";")[0]?.trim();
482
522
  if (!sizeToken)
483
523
  throw new Error(`Invalid chunk size line: ${line}`);
524
+ if (!/^[0-9a-f]+$/iu.test(sizeToken))
525
+ throw new Error(`Invalid chunk size: ${sizeToken}`);
484
526
  const size = Number.parseInt(sizeToken, 16);
485
- if (!Number.isFinite(size))
527
+ if (!Number.isSafeInteger(size))
486
528
  throw new Error(`Invalid chunk size: ${sizeToken}`);
487
529
  if (size === 0) {
488
530
  this.setState("chunked-trailer");
@@ -499,7 +541,13 @@ export default class RequestBuffer {
499
541
  */
500
542
  finishChunkedBody() {
501
543
  if (this.chunkedBodyChars) {
502
- this.postBody = Buffer.from(this.chunkedBodyChars).toString("utf8");
544
+ const bodyBuffer = Buffer.from(this.chunkedBodyChars);
545
+ if (this.requestBodyPolicy?.mode === "raw") {
546
+ this.rawBodyBuffer = bodyBuffer;
547
+ }
548
+ else {
549
+ this.postBody = bodyBuffer.toString("utf8");
550
+ }
503
551
  }
504
552
  delete this.chunkedBodyChars;
505
553
  }
@@ -515,7 +563,10 @@ export default class RequestBuffer {
515
563
  completeRequest = () => {
516
564
  this.state = "status"; // Reset state to new request
517
565
  this.completed = true;
518
- if (this.getHeader("content-type")?.value?.startsWith("application/json")) {
566
+ if (this.requestBodyPolicy?.mode === "raw") {
567
+ this.rawBodyBuffer ||= Buffer.alloc(0);
568
+ }
569
+ else if (this.getHeader("content-type")?.value?.startsWith("application/json")) {
519
570
  this.parseApplicationJsonParams();
520
571
  }
521
572
  else if (this.multiPartyFormData) {
@@ -567,4 +618,4 @@ export default class RequestBuffer {
567
618
  }
568
619
  }
569
620
  }
570
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtYnVmZmVyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSxpQ0FBaUMsQ0FBQTtBQUMxRCxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ3pELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUE7QUFDdkMsT0FBTyxjQUFjLE1BQU0sd0JBQXdCLENBQUE7QUFDbkQsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFBO0FBRXJDOzs7eUJBR3lCO0FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7QUFFNUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLEdBQUc7SUFDekMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV2QyxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQTtBQUN0QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxhQUFhO0lBQ2hDLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFFZCxtQ0FBbUM7SUFDbkMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtJQUUzQjs7MEJBRXNCO0lBQ3RCLElBQUksR0FBRyxFQUFFLENBQUE7SUFFVCxNQUFN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LFlBQVksQ0FBQyxnQkFBZ0IsR0FBRztvQkFDOUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7b0JBQ3hDLGNBQWMsRUFBRTt3QkFDZCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLO3dCQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7d0JBQzNCLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM1RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsZUFBZSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3dCQUMvQyxLQUFLLEVBQUUsMEJBQTBCO3FCQUNsQztpQkFDRixDQUFBO2dCQUVELE1BQU0sWUFBWSxDQUFBO1lBQ3BCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IEZvcm1EYXRhUGFydCBmcm9tIFwiLi9mb3JtLWRhdGEtcGFydC5qc1wiXG5pbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlci5qc1wiXG5pbXBvcnQge0h0dHBSZXF1ZXN0Qm9keVRvb0xhcmdlRXJyb3J9IGZyb20gXCIuLi9lcnJvcnMuanNcIlxuaW1wb3J0IHtpbmNvcnBvcmF0ZX0gZnJvbSBcImluY29ycG9yYXRvclwiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFBhcmFtc1RvT2JqZWN0IGZyb20gXCIuLi9wYXJhbXMtdG8tb2JqZWN0LmpzXCJcbmltcG9ydCBxdWVyeXN0cmluZyBmcm9tIFwicXVlcnlzdHJpbmdcIlxuXG4vKipcbiAqIFJlcXVlc3QgaGVhZGVyIGZpZWxkcyB3aG9zZSByZXBlYXRlZCB3aXJlIGZpZWxkcyBjb21iaW5lIGludG8gb25lIHZhbHVlXG4gKiAoUkZDIDkxMTAgwqc1LjMpIGJlZm9yZSB0aGUgc2VydmVyIGNvbnN1bWVzIHRoZW0uXG4gKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG5jb25zdCBDT01CSU5JTkdfSEVBREVSX0ZJRUxEUyA9IG5ldyBTZXQoW1wiYWNjZXB0LWVuY29kaW5nXCJdKVxuXG4vKipcbiAqIFJ1bnMgdHJ1bmNhdGUgcHJldmlldy5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBpbnB1dCAtIElucHV0IHN0cmluZy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gTWF4IHByZXZpZXcgbGVuZ3RoLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUcnVuY2F0ZWQgcHJldmlldy5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVQcmV2aWV3KGlucHV0LCBsaW1pdCA9IDMwMCkge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmIChpbnB1dC5sZW5ndGggPD0gbGltaXQpIHJldHVybiBpbnB1dFxuXG4gIHJldHVybiBgJHtpbnB1dC5zbGljZSgwLCBsaW1pdCl9Li4uYFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXF1ZXN0QnVmZmVyIHtcbiAgYm9keUxlbmd0aCA9IDBcblxuICAvKiogQHR5cGUge0J1ZmZlcltdIHwgdW5kZWZpbmVkfSAqL1xuICBwb3N0Qm9keUJ1ZmZlcnMgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGF0YS5cbiAgICogQHR5cGUge251bWJlcltdfSAqL1xuICBkYXRhID0gW11cblxuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAvKipcbiAgICogSGVhZGVycyBieSBuYW1lLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgSGVhZGVyPn0gKi9cbiAgaGVhZGVyc0J5TmFtZSA9IHt9XG4gIC8qKlxuICAgKiBDaHVua2VkIGJvZHkgY2hhcnMuXG4gICAqIEB0eXBlIHtudW1iZXJbXSB8IHVuZGVmaW5lZH0gKi9cbiAgY2h1bmtlZEJvZHlDaGFycyA9IHVuZGVmaW5lZFxuXG4gIG11bHRpUGFydHlGb3JtRGF0YSA9IGZhbHNlXG5cbiAgY29tcGxldGVkID0gZmFsc2VcbiAgcGFyYW1zID0ge31cbiAgcmVhZGluZ0JvZHkgPSBmYWxzZVxuICBzdGF0ZSA9IFwic3RhdHVzXCJcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbn0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMsIHtkZWJ1ZzogZmFsc2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJhaXNlcyBiZWZvcmUgYnVmZmVyaW5nIGEgcmVxdWVzdCBib2R5IGJleW9uZCB0aGUgY29uZmlndXJlZCBib3VuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFjdHVhbEJ5dGVzIC0gRGVjbGFyZWQgb3IgYWNjdW11bGF0ZWQgZGVjb2RlZCBib2R5IGJ5dGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2VydFJlcXVlc3RCb2R5U2l6ZShhY3R1YWxCeXRlcykge1xuICAgIGNvbnN0IG1heEJ5dGVzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEh0dHBTZXJ2ZXJNYXhSZXF1ZXN0Qm9keUJ5dGVzKClcblxuICAgIGlmIChtYXhCeXRlcyAhPT0gdW5kZWZpbmVkICYmIGFjdHVhbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBIdHRwUmVxdWVzdEJvZHlUb29MYXJnZUVycm9yKHthY3R1YWxCeXRlcywgbWF4Qnl0ZXN9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGJ5dGVzIGNvbnN1bWVkIGFmdGVyIHJlcXVlc3QgaGVhZGVycy4gTXVsdGlwYXJ0IHBhcnNpbmcgY2FuIGFjY2VwdFxuICAgKiBhbiB1bmZyYW1lZCBib2R5LCBzbyBlbmZvcmNlIGl0cyBjb25maWd1cmVkIGJvdW5kIGR1cmluZyBhY2N1bXVsYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBieXRlcyAtIE5ld2x5IGNvbnN1bWVkIGJvZHkgYnl0ZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVjb3JkQm9keUJ5dGVzKGJ5dGVzKSB7XG4gICAgdGhpcy5ib2R5TGVuZ3RoICs9IGJ5dGVzXG5cbiAgICBpZiAodGhpcy5tdWx0aVBhcnR5Rm9ybURhdGEpIHRoaXMuYXNzZXJ0UmVxdWVzdEJvZHlTaXplKHRoaXMuYm9keUxlbmd0aClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgLy8gRG8gbm90aGluZyBmb3Igbm93Li4uXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmZWVkLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0J1ZmZlciB8IHVuZGVmaW5lZH0gLSBSZW1haW5pbmcgZGF0YSwgaWYgYW55LlxuICAgKi9cbiAgZmVlZChkYXRhKSB7XG4gICAgbGV0IGluZGV4ID0gMFxuXG4gICAgd2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgIHN3aXRjaCh0aGlzLnN0YXRlKSB7XG4gICAgICAgIGNhc2UgXCJzdGF0dXNcIjpcbiAgICAgICAgY2FzZSBcImhlYWRlcnNcIjpcbiAgICAgICAgY2FzZSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhXCI6XG4gICAgICAgIGNhc2UgXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YS1oZWFkZXJcIjpcbiAgICAgICAgY2FzZSBcImNodW5rZWQtc2l6ZVwiOlxuICAgICAgICBjYXNlIFwiY2h1bmtlZC10cmFpbGVyXCI6XG4gICAgICAgICAgaW5kZXggPSB0aGlzLmZlZWRMaW5lKGRhdGEsIGluZGV4KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgXCJwb3N0LWJvZHlcIjpcbiAgICAgICAgICBpbmRleCA9IHRoaXMuZmVlZFBvc3RCb2R5KGRhdGEsIGluZGV4KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaW5kZXggPSB0aGlzLmZlZWRCeXRlKGRhdGEsIGluZGV4KVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoaW5kZXgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGJ5dGVzIGZvciB0aGUgbGluZS1iYXNlZCBzdGF0ZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgbmV4dCBuZXdsaW5lLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gUmVhZCBwb3NpdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBOZXcgcmVhZCBwb3NpdGlvbi5cbiAgICovXG4gIGZlZWRMaW5lKGRhdGEsIGluZGV4KSB7XG4gICAgY29uc3QgbmV3bGluZUluZGV4ID0gZGF0YS5pbmRleE9mKDEwLCBpbmRleClcblxuICAgIGlmIChuZXdsaW5lSW5kZXggPT09IC0xKSB7XG4gICAgICBpZiAodGhpcy5yZWFkaW5nQm9keSkgdGhpcy5yZWNvcmRCb2R5Qnl0ZXMoZGF0YS5sZW5ndGggLSBpbmRleClcblxuICAgICAgZm9yIChsZXQgZGF0YUluZGV4ID0gaW5kZXg7IGRhdGFJbmRleCA8IGRhdGEubGVuZ3RoOyBkYXRhSW5kZXggKz0gMSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaChkYXRhW2RhdGFJbmRleF0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhLmxlbmd0aFxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRpbmdCb2R5KSB0aGlzLnJlY29yZEJvZHlCeXRlcyhuZXdsaW5lSW5kZXggKyAxIC0gaW5kZXgpXG5cbiAgICBsZXQgbGluZVxuXG4gICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT0gMCkge1xuICAgICAgbGluZSA9IGRhdGEudG9TdHJpbmcoXCJsYXRpbjFcIiwgaW5kZXgsIG5ld2xpbmVJbmRleCArIDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXN0IG9mIGEgbGluZSB0aGF0IHN0YXJ0ZWQgaW4gYSBwcmV2aW91cyBjaHVuay5cbiAgICAgIGZvciAobGV0IGRhdGFJbmRleCA9IGluZGV4OyBkYXRhSW5kZXggPD0gbmV3bGluZUluZGV4OyBkYXRhSW5kZXggKz0gMSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaChkYXRhW2RhdGFJbmRleF0pXG4gICAgICB9XG5cbiAgICAgIGxpbmUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHRoaXMuZGF0YSlcbiAgICAgIHRoaXMuZGF0YSA9IFtdXG4gICAgfVxuXG4gICAgdGhpcy5wYXJzZShsaW5lKVxuXG4gICAgcmV0dXJuIG5ld2xpbmVJbmRleCArIDFcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBmaXhlZC1sZW5ndGggcmVxdWVzdCBib2R5IGJ5dGVzIGluIGJ1bGsuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBSZWFkIHBvc2l0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIE5ldyByZWFkIHBvc2l0aW9uLlxuICAgKi9cbiAgZmVlZFBvc3RCb2R5KGRhdGEsIGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLnBvc3RCb2R5QnVmZmVycykgdGhyb3cgbmV3IEVycm9yKFwicG9zdEJvZHlCdWZmZXJzIG5vdCBpbml0aWFsaXplZFwiKVxuICAgIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiQ29udGVudCBsZW5ndGggbm90IHNldFwiKVxuXG4gICAgY29uc3QgcmVtYWluaW5nQm9keUJ5dGVzID0gTWF0aC5tYXgoMSwgdGhpcy5jb250ZW50TGVuZ3RoIC0gdGhpcy5ib2R5TGVuZ3RoKVxuICAgIGNvbnN0IGVuZEluZGV4ID0gTWF0aC5taW4oZGF0YS5sZW5ndGgsIGluZGV4ICsgcmVtYWluaW5nQm9keUJ5dGVzKVxuXG4gICAgdGhpcy5wb3N0Qm9keUJ1ZmZlcnMucHVzaChkYXRhLnN1YmFycmF5KGluZGV4LCBlbmRJbmRleCkpXG4gICAgdGhpcy5yZWNvcmRCb2R5Qnl0ZXMoZW5kSW5kZXggLSBpbmRleClcblxuICAgIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggJiYgdGhpcy5ib2R5TGVuZ3RoID49IHRoaXMuY29udGVudExlbmd0aCkge1xuICAgICAgdGhpcy5wb3N0UmVxdWVzdERvbmUoKVxuICAgIH1cblxuICAgIHJldHVybiBlbmRJbmRleFxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGEgc2luZ2xlIGJ5dGUgZm9yIHRoZSBieXRlLWJhc2VkIHBhcnNlciBzdGF0ZXMuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBSZWFkIHBvc2l0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIE5ldyByZWFkIHBvc2l0aW9uLlxuICAgKi9cbiAgZmVlZEJ5dGUoZGF0YSwgaW5kZXgpIHtcbiAgICBjb25zdCBjaGFyID0gZGF0YVtpbmRleF1cblxuICAgIGlmICh0aGlzLnJlYWRpbmdCb2R5KSB0aGlzLnJlY29yZEJvZHlCeXRlcygxKVxuXG4gICAgc3dpdGNoKHRoaXMuc3RhdGUpIHtcbiAgICAgIGNhc2UgXCJjaHVua2VkLWRhdGFcIjoge1xuICAgICAgICBjb25zdCBjaHVua2VkQm9keUNoYXJzID0gdGhpcy5jaHVua2VkQm9keUNoYXJzXG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENodW5rU2l6ZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDaHVuayBzaXplIG5vdCBpbml0aWFsaXplZFwiKVxuICAgICAgICBpZiAoIWNodW5rZWRCb2R5Q2hhcnMpIHRocm93IG5ldyBFcnJvcihcIkNodW5rZWQgYm9keSBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgICBjaHVua2VkQm9keUNoYXJzLnB1c2goY2hhcilcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnQgY2h1bmsgYnl0ZXMgcmVhZC5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgY29uc3QgY3VycmVudENodW5rQnl0ZXNSZWFkID0gKHRoaXMuY3VycmVudENodW5rQnl0ZXNSZWFkIHx8IDApICsgMVxuXG4gICAgICAgIHRoaXMuY3VycmVudENodW5rQnl0ZXNSZWFkID0gY3VycmVudENodW5rQnl0ZXNSZWFkXG5cbiAgICAgICAgaWYgKGN1cnJlbnRDaHVua0J5dGVzUmVhZCA+PSB0aGlzLmN1cnJlbnRDaHVua1NpemUpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkID0gMFxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJjaHVua2VkLWRhdGEtY3JsZlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJjaHVua2VkLWRhdGEtY3JsZlwiOlxuICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkID0gKHRoaXMuY3VycmVudENodW5rQ3JsZlJlYWQgfHwgMCkgKyAxXG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENodW5rQ3JsZlJlYWQgPj0gMikge1xuICAgICAgICAgIHRoaXMuY3VycmVudENodW5rQnl0ZXNSZWFkID0gMFxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJjaHVua2VkLXNpemVcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibXVsdGktcGFydC1mb3JtLWRhdGEtYm9keVwiOiB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtRGF0YVBhcnQpIHRocm93IG5ldyBFcnJvcihcIkZvcm1EYXRhIHBhcnQgbm90IGluaXRpYWxpemVkXCIpXG4gICAgICAgIGlmICghdGhpcy5ib3VuZGFyeUxpbmVFbmQpIHRocm93IG5ldyBFcnJvcihcIkJvdW5kYXJ5IGxpbmUgZW5kIG5vdCBpbml0aWFsaXplZFwiKVxuICAgICAgICBpZiAoIXRoaXMuYm91bmRhcnlMaW5lTmV4dCkgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRhcnkgbGluZSBuZXh0IG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZvcm1EYXRhUGFydC5ib2R5XG5cbiAgICAgICAgYm9keS5wdXNoKGNoYXIpXG5cbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeUVuZFBvc2l0aW9uID0gYm9keS5sZW5ndGggLSB0aGlzLmJvdW5kYXJ5TGluZUVuZC5sZW5ndGhcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeUVuZENoYXJzID0gYm9keS5zbGljZShwb3NzaWJsZUJvdW5kYXJ5RW5kUG9zaXRpb24sIGJvZHkubGVuZ3RoKVxuICAgICAgICBjb25zdCBwb3NzaWJsZUJvdW5kYXJ5RW5kID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBwb3NzaWJsZUJvdW5kYXJ5RW5kQ2hhcnMpXG5cbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeU5leHRQb3NpdGlvbiA9IGJvZHkubGVuZ3RoIC0gdGhpcy5ib3VuZGFyeUxpbmVOZXh0Lmxlbmd0aFxuICAgICAgICBjb25zdCBwb3NzaWJsZUJvdW5kYXJ5TmV4dENoYXJzID0gYm9keS5zbGljZShwb3NzaWJsZUJvdW5kYXJ5TmV4dFBvc2l0aW9uLCBib2R5Lmxlbmd0aClcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeU5leHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHBvc3NpYmxlQm91bmRhcnlOZXh0Q2hhcnMpXG5cbiAgICAgICAgaWYgKHBvc3NpYmxlQm91bmRhcnlFbmQgPT0gdGhpcy5ib3VuZGFyeUxpbmVFbmQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydC5yZW1vdmVGcm9tQm9keShwb3NzaWJsZUJvdW5kYXJ5RW5kKVxuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHBvc3NpYmxlQm91bmRhcnlOZXh0ID09IHRoaXMuYm91bmRhcnlMaW5lTmV4dCkge1xuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0LnJlbW92ZUZyb21Cb2R5KHBvc3NpYmxlQm91bmRhcnlOZXh0KVxuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG4gICAgICAgICAgdGhpcy5uZXdGb3JtRGF0YVBhcnQoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudExlbmd0aCAmJiB0aGlzLmJvZHlMZW5ndGggPj0gdGhpcy5jb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnREb25lKClcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtRGF0YVBhcnQuY29udGVudExlbmd0aCAmJiB0aGlzLmJvZHlMZW5ndGggPj0gdGhpcy5mb3JtRGF0YVBhcnQuY29udGVudExlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHViXCIpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BVbmtub3duIHN0YXRlIGZvciByZXF1ZXN0IGJ1ZmZlcmAsIHtzdGF0ZTogdGhpcy5zdGF0ZX1dKVxuICAgIH1cblxuICAgIHJldHVybiBpbmRleCArIDFcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZS5cbiAgICogQHJldHVybnMge0hlYWRlcn0gLSBUaGUgaGVhZGVyLlxuICAgKi9cbiAgZ2V0SGVhZGVyKG5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhlYWRlcnNCeU5hbWVbbmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKV1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gW2BnZXRIZWFkZXIgJHtuYW1lfWAsIHtyZXN1bHQ6IHJlc3VsdD8udG9TdHJpbmcoKX1dKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGhlYWRlcnMgaGFzaC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gVGhlIGhlYWRlcnMgaGFzaC5cbiAgICovXG4gIGdldEhlYWRlcnNIYXNoKCkge1xuICAgIC8qKlxuICAgICAqIFJlc3VsdC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJGb3JtYXR0ZWROYW1lIGluIHRoaXMuaGVhZGVyc0J5TmFtZSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5oZWFkZXJzQnlOYW1lW2hlYWRlckZvcm1hdHRlZE5hbWVdXG5cbiAgICAgIHJlc3VsdFtoZWFkZXIuZ2V0TmFtZSgpXSA9IGhlYWRlci5nZXRWYWx1ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZm9ybSBkYXRhIHBhcnQgZG9uZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZm9ybURhdGFQYXJ0RG9uZSgpIHtcbiAgICBjb25zdCBmb3JtRGF0YVBhcnQgPSB0aGlzLmZvcm1EYXRhUGFydFxuXG4gICAgaWYgKCFmb3JtRGF0YVBhcnQpIHRocm93IG5ldyBFcnJvcihcImZvcm1EYXRhUGFydCB3YXNudCBzZXRcIilcblxuICAgIHRoaXMuZm9ybURhdGFQYXJ0ID0gdW5kZWZpbmVkXG4gICAgZm9ybURhdGFQYXJ0LmZpbmlzaCgpXG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiZm9ybS1kYXRhLXBhcnRcIiwgZm9ybURhdGFQYXJ0KVxuICB9XG5cbiAgaXNNdWx0aVBhcnR5Rm9ybURhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlQYXJ0eUZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogUnVucyBuZXcgZm9ybSBkYXRhIHBhcnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG5ld0Zvcm1EYXRhUGFydCgpIHtcbiAgICB0aGlzLmZvcm1EYXRhUGFydCA9IG5ldyBGb3JtRGF0YVBhcnQoKVxuICAgIHRoaXMuc2V0U3RhdGUoXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YS1oZWFkZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBhcnNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHBhcnNlKGxpbmUpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PSBcInN0YXR1c1wiKSB7XG4gICAgICB0aGlzLnBhcnNlU3RhdHVzTGluZShsaW5lKVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcImhlYWRlcnNcIikge1xuICAgICAgdGhpcy5wYXJzZUhlYWRlcihsaW5lKVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcImNodW5rZWQtc2l6ZVwiKSB7XG4gICAgICB0aGlzLnBhcnNlQ2h1bmtTaXplTGluZShsaW5lKVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcImNodW5rZWQtdHJhaWxlclwiKSB7XG4gICAgICBpZiAobGluZSA9PSBcIlxcclxcblwiKSB7XG4gICAgICAgIHRoaXMuZmluaXNoQ2h1bmtlZEJvZHkoKVxuICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwibXVsdGktcGFydC1mb3JtLWRhdGFcIikge1xuICAgICAgaWYgKGxpbmUgPT0gdGhpcy5ib3VuZGFyeUxpbmUpIHtcbiAgICAgICAgdGhpcy5uZXdGb3JtRGF0YVBhcnQoKVxuICAgICAgfSBlbHNlIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcImRvbmVcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYm91bmRhcnkgbGluZSBidXQgZGlkbid0IGdldCBpdDogJHtsaW5lfWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwibXVsdGktcGFydC1mb3JtLWRhdGEtaGVhZGVyXCIpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMucmVhZEhlYWRlckZyb21MaW5lKGxpbmUpXG5cbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1EYXRhUGFydCkgdGhyb3cgbmV3IEVycm9yKFwiZm9ybURhdGFQYXJ0IG5vdCBzZXRcIilcblxuICAgICAgICB0aGlzLmZvcm1EYXRhUGFydC5hZGRIZWFkZXIoaGVhZGVyKVxuICAgICAgICAvL3RoaXMuc3RhdGUgPT0gXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YVwiXG4gICAgICB9IGVsc2UgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFwibXVsdGktcGFydC1mb3JtLWRhdGEtYm9keVwiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhdGUgcGFyc2luZyBsaW5lOiAke3RoaXMuc3RhdGV9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWFkIGhlYWRlciBmcm9tIGxpbmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gTGluZS5cbiAgICogQHJldHVybnMge0hlYWRlciB8IHVuZGVmaW5lZH0gLSBUaGUgaGVhZGVyIGZyb20gbGluZS5cbiAgICovXG4gIHJlYWRIZWFkZXJGcm9tTGluZShsaW5lKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKC4rKTogKC4rKVxcclxcbi8pXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IG5ldyBIZWFkZXIobWF0Y2hbMV0sIG1hdGNoWzJdKVxuXG4gICAgICByZXR1cm4gaGVhZGVyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGhlYWRlci5cbiAgICogQHBhcmFtIHtIZWFkZXJ9IGhlYWRlciAtIEhlYWRlciB2YWx1ZS5cbiAgICovXG4gIGFkZEhlYWRlcihoZWFkZXIpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWROYW1lID0gaGVhZGVyLmdldEZvcm1hdHRlZE5hbWUoKVxuICAgIGNvbnN0IGV4aXN0aW5nSGVhZGVyID0gdGhpcy5oZWFkZXJzQnlOYW1lW2Zvcm1hdHRlZE5hbWVdXG5cbiAgICAvLyBSRkMgOTExMCDCpzUuMzogYSBmaWVsZCBtYXkgYmUgcmVwZWF0ZWQ7IGl0cyB2YWx1ZSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZlxuICAgIC8vIGFsbCBmaWVsZCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgaW4gd2lyZSBvcmRlci4gT25seSBBY2NlcHQtRW5jb2RpbmdcbiAgICAvLyBpcyBjb25zdW1lZCBhcyBhIGNvbWJpbmVkIGZpZWxkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAgaWYgKGV4aXN0aW5nSGVhZGVyICYmIENPTUJJTklOR19IRUFERVJfRklFTERTLmhhcyhmb3JtYXR0ZWROYW1lKSkge1xuICAgICAgZXhpc3RpbmdIZWFkZXIudmFsdWUgKz0gYCwgJHtoZWFkZXIuZ2V0VmFsdWUoKX1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyc0J5TmFtZVtmb3JtYXR0ZWROYW1lXSA9IGhlYWRlclxuICAgIH1cblxuICAgIGlmIChmb3JtYXR0ZWROYW1lID09IFwiY29udGVudC1sZW5ndGhcIikgdGhpcy5jb250ZW50TGVuZ3RoID0gcGFyc2VJbnQoaGVhZGVyLmdldFZhbHVlKCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZSBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gTGluZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcGFyc2VIZWFkZXIobGluZSkge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMucmVhZEhlYWRlckZyb21MaW5lKGxpbmUpXG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBQYXJzZWQgaGVhZGVyOiAke2hlYWRlci50b1N0cmluZygpfWApXG4gICAgICB0aGlzLmFkZEhlYWRlcihoZWFkZXIpXG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiaGVhZGVyXCIsIGhlYWRlcilcbiAgICB9IGVsc2UgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgY29uc3QgaHR0cE1ldGhvZCA9IHRoaXMuaHR0cE1ldGhvZD8udG9VcHBlckNhc2UoKVxuXG4gICAgICBpZiAoIWh0dHBNZXRob2QpIHRocm93IG5ldyBFcnJvcihcIkhUVFAgbWV0aG9kIG5vdCBzZXRcIilcblxuICAgICAgaWYgKCF0aGlzLmV4cGVjdHNSZXF1ZXN0Qm9keShodHRwTWV0aG9kKSkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaHVua2VkRW5jb2RpbmcoKSkge1xuICAgICAgICB0aGlzLnJlYWRpbmdCb2R5ID0gdHJ1ZVxuICAgICAgICB0aGlzLmJvZHlMZW5ndGggPSAwXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNodW5rZWRCb2R5KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVhZGluZ0JvZHkgPSB0cnVlXG4gICAgICAgIHRoaXMuYm9keUxlbmd0aCA9IDBcblxuICAgICAgICBpZiAodGhpcy5jb250ZW50TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHRoaXMuY29udGVudExlbmd0aCkpIHRocm93IG5ldyBFcnJvcihcIkNvbnRlbnQgbGVuZ3RoIGlzIGludmFsaWRcIilcblxuICAgICAgICAgIHRoaXMuYXNzZXJ0UmVxdWVzdEJvZHlTaXplKHRoaXMuY29udGVudExlbmd0aClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5nZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIik/LnZhbHVlPy5tYXRjaCgvXm11bHRpcGFydFxcL2Zvcm0tZGF0YTtcXHMqYm91bmRhcnk9KC4rKSQvaSlcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5ID0gbWF0Y2hbMV1cbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5TGluZSA9IGAtLSR7dGhpcy5ib3VuZGFyeX1cXHJcXG5gXG4gICAgICAgICAgdGhpcy5ib3VuZGFyeUxpbmVOZXh0ID0gYFxcclxcbi0tJHt0aGlzLmJvdW5kYXJ5fVxcclxcbmBcbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5TGluZUVuZCA9IGBcXHJcXG4tLSR7dGhpcy5ib3VuZGFyeX0tLWBcbiAgICAgICAgICB0aGlzLm11bHRpUGFydHlGb3JtRGF0YSA9IHRydWVcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwibXVsdGktcGFydC1mb3JtLWRhdGFcIilcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggPT09IDAgfHwgdGhpcy5jb250ZW50TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAqIEB0eXBlIHtCdWZmZXJbXX0gKi9cbiAgICAgICAgICB0aGlzLnBvc3RCb2R5QnVmZmVycyA9IFtdXG5cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwicG9zdC1ib2R5XCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZSBzdGF0dXMgbGluZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBMaW5lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwYXJzZVN0YXR1c0xpbmUobGluZSkge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXihbQS1aLV0rKSAoLis/KSBIVFRQXFwvKC4rKVxcclxcbi8pXG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IG1hdGNoIHN0YXR1cyBsaW5lIGZyb206ICR7bGluZX1gKVxuICAgIH1cblxuICAgIHRoaXMuaHR0cE1ldGhvZCA9IG1hdGNoWzFdXG4gICAgdGhpcy5odHRwVmVyc2lvbiA9IG1hdGNoWzNdXG4gICAgdGhpcy5wYXRoID0gbWF0Y2hbMl1cbiAgICB0aGlzLnNldFN0YXRlKFwiaGVhZGVyc1wiKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gW1wiUGFyc2VkIHN0YXR1cyBsaW5lXCIsIHtodHRwTWV0aG9kOiB0aGlzLmh0dHBNZXRob2QsIGh0dHBWZXJzaW9uOiB0aGlzLmh0dHBWZXJzaW9uLCBwYXRoOiB0aGlzLnBhdGh9XSlcbiAgfVxuXG4gIHBvc3RSZXF1ZXN0RG9uZSgpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keUJ1ZmZlcnMpIHtcbiAgICAgIHRoaXMucG9zdEJvZHkgPSBCdWZmZXIuY29uY2F0KHRoaXMucG9zdEJvZHlCdWZmZXJzKS50b1N0cmluZyhcInV0ZjhcIilcbiAgICB9XG5cbiAgICB0aGlzLnBvc3RCb2R5QnVmZmVycyA9IHVuZGVmaW5lZFxuXG4gICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhwZWN0cyByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodHRwTWV0aG9kIC0gSFRUUCBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlcXVlc3QgZXhwZWN0cyBhIGJvZHkuXG4gICAqL1xuICBleHBlY3RzUmVxdWVzdEJvZHkoaHR0cE1ldGhvZCkge1xuICAgIHJldHVybiAhW1wiR0VUXCIsIFwiT1BUSU9OU1wiLCBcIkhFQURcIl0uaW5jbHVkZXMoaHR0cE1ldGhvZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGNodW5rZWQgZW5jb2RpbmcuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlcXVlc3QgdXNlcyBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLlxuICAgKi9cbiAgaXNDaHVua2VkRW5jb2RpbmcoKSB7XG4gICAgY29uc3QgdHJhbnNmZXJFbmNvZGluZyA9IHRoaXMuZ2V0SGVhZGVyKFwidHJhbnNmZXItZW5jb2RpbmdcIik/LnZhbHVlPy50b0xvd2VyQ2FzZSgpXG5cbiAgICByZXR1cm4gQm9vbGVhbih0cmFuc2ZlckVuY29kaW5nPy5pbmNsdWRlcyhcImNodW5rZWRcIikpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbml0aWFsaXplIGNodW5rZWQgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgaW5pdGlhbGl6ZUNodW5rZWRCb2R5KCkge1xuICAgIHRoaXMuY2h1bmtlZEJvZHlDaGFycyA9IFtdXG4gICAgdGhpcy5jdXJyZW50Q2h1bmtTaXplID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50Q2h1bmtCeXRlc1JlYWQgPSAwXG4gICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtc2l6ZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGFyc2UgY2h1bmsgc2l6ZSBsaW5lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIENodW5rIHNpemUgbGluZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcGFyc2VDaHVua1NpemVMaW5lKGxpbmUpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKClcblxuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuXG5cbiAgICBjb25zdCBzaXplVG9rZW4gPSB0cmltbWVkLnNwbGl0KFwiO1wiKVswXT8udHJpbSgpXG5cbiAgICBpZiAoIXNpemVUb2tlbikgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNodW5rIHNpemUgbGluZTogJHtsaW5lfWApXG5cbiAgICBjb25zdCBzaXplID0gTnVtYmVyLnBhcnNlSW50KHNpemVUb2tlbiwgMTYpXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzaXplKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNodW5rIHNpemU6ICR7c2l6ZVRva2VufWApXG5cbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtdHJhaWxlclwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnRSZXF1ZXN0Qm9keVNpemUoKHRoaXMuY2h1bmtlZEJvZHlDaGFycz8ubGVuZ3RoIHx8IDApICsgc2l6ZSlcblxuICAgIHRoaXMuY3VycmVudENodW5rU2l6ZSA9IHNpemVcbiAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1kYXRhXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5pc2ggY2h1bmtlZCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBmaW5pc2hDaHVua2VkQm9keSgpIHtcbiAgICBpZiAodGhpcy5jaHVua2VkQm9keUNoYXJzKSB7XG4gICAgICB0aGlzLnBvc3RCb2R5ID0gQnVmZmVyLmZyb20odGhpcy5jaHVua2VkQm9keUNoYXJzKS50b1N0cmluZyhcInV0ZjhcIilcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5jaHVua2VkQm9keUNoYXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgc3RhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdTdGF0ZSAtIE5ldyBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBDaGFuZ2luZyBzdGF0ZSBmcm9tICR7dGhpcy5zdGF0ZX0gdG8gJHtuZXdTdGF0ZX1gKVxuICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZVxuICB9XG5cbiAgY29tcGxldGVSZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHRoaXMuc3RhdGUgPSBcInN0YXR1c1wiIC8vIFJlc2V0IHN0YXRlIHRvIG5ldyByZXF1ZXN0XG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlXG5cbiAgICBpZiAodGhpcy5nZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIik/LnZhbHVlPy5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgdGhpcy5wYXJzZUFwcGxpY2F0aW9uSnNvblBhcmFtcygpXG4gICAgfSBlbHNlIGlmICh0aGlzLm11bHRpUGFydHlGb3JtRGF0YSkge1xuICAgICAgLy8gRG9uZSBhZnRlciBlYWNoIG5ldyBmb3JtIGRhdGEgcGFydFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnNlUXVlcnlTdHJpbmdQb3N0UGFyYW1zKClcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY29tcGxldGVkXCIpXG4gIH1cblxuICBwYXJzZUFwcGxpY2F0aW9uSnNvblBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keSkge1xuICAgICAgY29uc3QgbmV3UGFyYW1zID0gSlNPTi5wYXJzZSh0aGlzLnBvc3RCb2R5KVxuXG4gICAgICBpbmNvcnBvcmF0ZSh0aGlzLnBhcmFtcywgbmV3UGFyYW1zKVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlUXVlcnlTdHJpbmdQb3N0UGFyYW1zKCkge1xuICAgIGlmICh0aGlzLnBvc3RCb2R5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucG9zdEJvZHkpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbnBhcnNlZCBwYXJhbXMuXG4gICAgICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT59ICovXG4gICAgICAgIGNvbnN0IHVucGFyc2VkUGFyYW1zID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWRRdWVyeSkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB1bnBhcnNlZFBhcmFtc1trZXldID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXNUb09iamVjdCA9IG5ldyBQYXJhbXNUb09iamVjdCh1bnBhcnNlZFBhcmFtcylcbiAgICAgICAgY29uc3QgbmV3UGFyYW1zID0gcGFyYW1zVG9PYmplY3QudG9PYmplY3QoKVxuXG4gICAgICAgIGluY29ycG9yYXRlKHRoaXMucGFyYW1zLCBuZXdQYXJhbXMpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSAvKiogQHR5cGUge0Vycm9yICYge3ZlbG9jaW91c0NvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSAqLyAoZXJyb3IpXG5cbiAgICAgICAgZW5zdXJlZEVycm9yLnZlbG9jaW91c0NvbnRleHQgPSB7XG4gICAgICAgICAgLi4uKGVuc3VyZWRFcnJvci52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgICByZXF1ZXN0UGFyc2luZzoge1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHRoaXMuZ2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIpPy52YWx1ZSxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IHRoaXMuaHR0cE1ldGhvZCxcbiAgICAgICAgICAgIHBhcmFtZXRlcktleXM6IE9iamVjdC5rZXlzKHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucG9zdEJvZHkpKSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aCxcbiAgICAgICAgICAgIHBvc3RCb2R5UHJldmlldzogdHJ1bmNhdGVQcmV2aWV3KHRoaXMucG9zdEJvZHkpLFxuICAgICAgICAgICAgc3RhZ2U6IFwicXVlcnktc3RyaW5nLXBvc3QtcGFyYW1zXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlbnN1cmVkRXJyb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
621
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtYnVmZmVyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSxpQ0FBaUMsQ0FBQTtBQUMxRCxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ3pELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUE7QUFDdkMsT0FBTyxjQUFjLE1BQU0sd0JBQXdCLENBQUE7QUFDbkQsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFBO0FBRXJDOzs7eUJBR3lCO0FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7QUFFNUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLEdBQUc7SUFDekMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV2QyxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQTtBQUN0QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxhQUFhO0lBQ2hDLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFFZCxrR0FBa0c7SUFDbEcsaUJBQWlCLEdBQUcsU0FBUyxDQUFBO0lBRTdCLGlDQUFpQztJQUNqQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0lBRXpCLFNB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QUFJLENBQUMsVUFBVTt3QkFDM0IsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzVELElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDZixlQUFlLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7d0JBQy9DLEtBQUssRUFBRSwwQkFBMEI7cUJBQ2xDO2lCQUNGLENBQUE7Z0JBRUQsTUFBTSxZQUFZLENBQUE7WUFDcEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgRm9ybURhdGFQYXJ0IGZyb20gXCIuL2Zvcm0tZGF0YS1wYXJ0LmpzXCJcbmltcG9ydCBIZWFkZXIgZnJvbSBcIi4vaGVhZGVyLmpzXCJcbmltcG9ydCB7SHR0cFJlcXVlc3RCb2R5VG9vTGFyZ2VFcnJvcn0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiXG5pbXBvcnQge2luY29ycG9yYXRlfSBmcm9tIFwiaW5jb3Jwb3JhdG9yXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUGFyYW1zVG9PYmplY3QgZnJvbSBcIi4uL3BhcmFtcy10by1vYmplY3QuanNcIlxuaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gXCJxdWVyeXN0cmluZ1wiXG5cbi8qKlxuICogUmVxdWVzdCBoZWFkZXIgZmllbGRzIHdob3NlIHJlcGVhdGVkIHdpcmUgZmllbGRzIGNvbWJpbmUgaW50byBvbmUgdmFsdWVcbiAqIChSRkMgOTExMCDCpzUuMykgYmVmb3JlIHRoZSBzZXJ2ZXIgY29uc3VtZXMgdGhlbS5cbiAqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbmNvbnN0IENPTUJJTklOR19IRUFERVJfRklFTERTID0gbmV3IFNldChbXCJhY2NlcHQtZW5jb2RpbmdcIl0pXG5cbi8qKlxuICogUnVucyB0cnVuY2F0ZSBwcmV2aWV3LlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGlucHV0IC0gSW5wdXQgc3RyaW5nLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gLSBNYXggcHJldmlldyBsZW5ndGguXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRydW5jYXRlZCBwcmV2aWV3LlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZVByZXZpZXcoaW5wdXQsIGxpbWl0ID0gMzAwKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKGlucHV0Lmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIGlucHV0XG5cbiAgcmV0dXJuIGAke2lucHV0LnNsaWNlKDAsIGxpbWl0KX0uLi5gXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcXVlc3RCdWZmZXIge1xuICBib2R5TGVuZ3RoID0gMFxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5SZXNvbHZlZEh0dHBSZXF1ZXN0Qm9keVBvbGljeSB8IHVuZGVmaW5lZH0gKi9cbiAgcmVxdWVzdEJvZHlQb2xpY3kgPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge0J1ZmZlciB8IHVuZGVmaW5lZH0gKi9cbiAgcmF3Qm9keUJ1ZmZlciA9IHVuZGVmaW5lZFxuXG4gIGRlc3Ryb3llZCA9IGZhbHNlXG5cbiAgLyoqIEB0eXBlIHtCdWZmZXJbXSB8IHVuZGVmaW5lZH0gKi9cbiAgcG9zdEJvZHlCdWZmZXJzID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIERhdGEuXG4gICAqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgZGF0YSA9IFtdXG5cbiAgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgLyoqXG4gICAqIEhlYWRlcnMgYnkgbmFtZS5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIEhlYWRlcj59ICovXG4gIGhlYWRlcnNCeU5hbWUgPSB7fVxuICAvKipcbiAgICogQ2h1bmtlZCBib2R5IGNoYXJzLlxuICAgKiBAdHlwZSB7bnVtYmVyW10gfCB1bmRlZmluZWR9ICovXG4gIGNodW5rZWRCb2R5Q2hhcnMgPSB1bmRlZmluZWRcblxuICBtdWx0aVBhcnR5Rm9ybURhdGEgPSBmYWxzZVxuXG4gIGNvbXBsZXRlZCA9IGZhbHNlXG4gIHBhcmFtcyA9IHt9XG4gIHJlYWRpbmdCb2R5ID0gZmFsc2VcbiAgc3RhdGUgPSBcInN0YXR1c1wiXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb259KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzLCB7ZGVidWc6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSYWlzZXMgYmVmb3JlIGJ1ZmZlcmluZyBhIHJlcXVlc3QgYm9keSBiZXlvbmQgdGhlIGNvbmZpZ3VyZWQgYm91bmQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhY3R1YWxCeXRlcyAtIERlY2xhcmVkIG9yIGFjY3VtdWxhdGVkIGRlY29kZWQgYm9keSBieXRlcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnRSZXF1ZXN0Qm9keVNpemUoYWN0dWFsQnl0ZXMpIHtcbiAgICBjb25zdCBtYXhCeXRlcyA9IHRoaXMucmVxdWVzdEJvZHlQb2xpY3k/Lm1heFJlcXVlc3RCb2R5Qnl0ZXMgPz8gdGhpcy5jb25maWd1cmF0aW9uLmdldEh0dHBTZXJ2ZXJNYXhSZXF1ZXN0Qm9keUJ5dGVzKClcblxuICAgIGlmIChtYXhCeXRlcyAhPT0gdW5kZWZpbmVkICYmIGFjdHVhbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBIdHRwUmVxdWVzdEJvZHlUb29MYXJnZUVycm9yKHthY3R1YWxCeXRlcywgbWF4Qnl0ZXN9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGJ5dGVzIGNvbnN1bWVkIGFmdGVyIHJlcXVlc3QgaGVhZGVycy4gTXVsdGlwYXJ0IHBhcnNpbmcgY2FuIGFjY2VwdFxuICAgKiBhbiB1bmZyYW1lZCBib2R5LCBzbyBlbmZvcmNlIGl0cyBjb25maWd1cmVkIGJvdW5kIGR1cmluZyBhY2N1bXVsYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBieXRlcyAtIE5ld2x5IGNvbnN1bWVkIGJvZHkgYnl0ZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVjb3JkQm9keUJ5dGVzKGJ5dGVzKSB7XG4gICAgdGhpcy5ib2R5TGVuZ3RoICs9IGJ5dGVzXG5cbiAgICBpZiAodGhpcy5tdWx0aVBhcnR5Rm9ybURhdGEpIHRoaXMuYXNzZXJ0UmVxdWVzdEJvZHlTaXplKHRoaXMuYm9keUxlbmd0aClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlXG4gICAgdGhpcy5yYXdCb2R5QnVmZmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wb3N0Qm9keSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucG9zdEJvZHlCdWZmZXJzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jaHVua2VkQm9keUNoYXJzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5kYXRhID0gW11cbiAgICB0aGlzLmZvcm1EYXRhUGFydCA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZXhhY3QgcmVxdWVzdCBib2R5IGJ5dGVzIGZvciBhIGNvbXBsZXRlZCByZXF1ZXN0IHdob3NlIHBvbGljeSBzZWxlY3RlZCByYXcgbW9kZS5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBBIGNvcHkgb2YgdGhlIGV4YWN0IHJlcXVlc3QgYm9keSBieXRlcy5cbiAgICovXG4gIGdldFJhd0JvZHkoKSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB0aHJvdyBuZXcgRXJyb3IoXCJSYXcgcmVxdWVzdCBib2R5IGlzIHVuYXZhaWxhYmxlIGFmdGVyIHJlcXVlc3QgY2xlYW51cFwiKVxuICAgIGlmICh0aGlzLnJlcXVlc3RCb2R5UG9saWN5Py5tb2RlICE9PSBcInJhd1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJSYXcgcmVxdWVzdCBib2R5IGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gdGhlIHJlcXVlc3QgYm9keSBwb2xpY3kgc2VsZWN0cyByYXcgbW9kZVwiKVxuICAgIGlmICghdGhpcy5jb21wbGV0ZWQgfHwgIXRoaXMucmF3Qm9keUJ1ZmZlcikgdGhyb3cgbmV3IEVycm9yKFwiUmF3IHJlcXVlc3QgYm9keSBpcyB1bmF2YWlsYWJsZSBiZWZvcmUgcmVxdWVzdCBwYXJzaW5nIGNvbXBsZXRlc1wiKVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRoaXMucmF3Qm9keUJ1ZmZlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZlZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyIHwgdW5kZWZpbmVkfSAtIFJlbWFpbmluZyBkYXRhLCBpZiBhbnkuXG4gICAqL1xuICBmZWVkKGRhdGEpIHtcbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICB3aGlsZSAoaW5kZXggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgc3dpdGNoKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgY2FzZSBcInN0YXR1c1wiOlxuICAgICAgICBjYXNlIFwiaGVhZGVyc1wiOlxuICAgICAgICBjYXNlIFwibXVsdGktcGFydC1mb3JtLWRhdGFcIjpcbiAgICAgICAgY2FzZSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWhlYWRlclwiOlxuICAgICAgICBjYXNlIFwiY2h1bmtlZC1zaXplXCI6XG4gICAgICAgIGNhc2UgXCJjaHVua2VkLXRyYWlsZXJcIjpcbiAgICAgICAgICBpbmRleCA9IHRoaXMuZmVlZExpbmUoZGF0YSwgaW5kZXgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInBvc3QtYm9keVwiOlxuICAgICAgICAgIGluZGV4ID0gdGhpcy5mZWVkUG9zdEJvZHkoZGF0YSwgaW5kZXgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbmRleCA9IHRoaXMuZmVlZEJ5dGUoZGF0YSwgaW5kZXgpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbXBsZXRlZCkge1xuICAgICAgICByZXR1cm4gZGF0YS5zdWJhcnJheShpbmRleClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgYnl0ZXMgZm9yIHRoZSBsaW5lLWJhc2VkIHN0YXRlcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBuZXh0IG5ld2xpbmUuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBSZWFkIHBvc2l0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIE5ldyByZWFkIHBvc2l0aW9uLlxuICAgKi9cbiAgZmVlZExpbmUoZGF0YSwgaW5kZXgpIHtcbiAgICBjb25zdCBuZXdsaW5lSW5kZXggPSBkYXRhLmluZGV4T2YoMTAsIGluZGV4KVxuXG4gICAgaWYgKG5ld2xpbmVJbmRleCA9PT0gLTEpIHtcbiAgICAgIGlmICh0aGlzLnJlYWRpbmdCb2R5KSB0aGlzLnJlY29yZEJvZHlCeXRlcyhkYXRhLmxlbmd0aCAtIGluZGV4KVxuXG4gICAgICBmb3IgKGxldCBkYXRhSW5kZXggPSBpbmRleDsgZGF0YUluZGV4IDwgZGF0YS5sZW5ndGg7IGRhdGFJbmRleCArPSAxKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGRhdGFbZGF0YUluZGV4XSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZGluZ0JvZHkpIHRoaXMucmVjb3JkQm9keUJ5dGVzKG5ld2xpbmVJbmRleCArIDEgLSBpbmRleClcblxuICAgIGxldCBsaW5lXG5cbiAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA9PSAwKSB7XG4gICAgICBsaW5lID0gZGF0YS50b1N0cmluZyhcImxhdGluMVwiLCBpbmRleCwgbmV3bGluZUluZGV4ICsgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlc3Qgb2YgYSBsaW5lIHRoYXQgc3RhcnRlZCBpbiBhIHByZXZpb3VzIGNodW5rLlxuICAgICAgZm9yIChsZXQgZGF0YUluZGV4ID0gaW5kZXg7IGRhdGFJbmRleCA8PSBuZXdsaW5lSW5kZXg7IGRhdGFJbmRleCArPSAxKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGRhdGFbZGF0YUluZGV4XSlcbiAgICAgIH1cblxuICAgICAgbGluZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdGhpcy5kYXRhKVxuICAgICAgdGhpcy5kYXRhID0gW11cbiAgICB9XG5cbiAgICB0aGlzLnBhcnNlKGxpbmUpXG5cbiAgICByZXR1cm4gbmV3bGluZUluZGV4ICsgMVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGZpeGVkLWxlbmd0aCByZXF1ZXN0IGJvZHkgYnl0ZXMgaW4gYnVsay5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFJlYWQgcG9zaXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTmV3IHJlYWQgcG9zaXRpb24uXG4gICAqL1xuICBmZWVkUG9zdEJvZHkoZGF0YSwgaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMucG9zdEJvZHlCdWZmZXJzKSB0aHJvdyBuZXcgRXJyb3IoXCJwb3N0Qm9keUJ1ZmZlcnMgbm90IGluaXRpYWxpemVkXCIpXG4gICAgaWYgKHRoaXMuY29udGVudExlbmd0aCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZW50IGxlbmd0aCBub3Qgc2V0XCIpXG5cbiAgICBjb25zdCByZW1haW5pbmdCb2R5Qnl0ZXMgPSBNYXRoLm1heCgxLCB0aGlzLmNvbnRlbnRMZW5ndGggLSB0aGlzLmJvZHlMZW5ndGgpXG4gICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihkYXRhLmxlbmd0aCwgaW5kZXggKyByZW1haW5pbmdCb2R5Qnl0ZXMpXG5cbiAgICB0aGlzLnBvc3RCb2R5QnVmZmVycy5wdXNoKGRhdGEuc3ViYXJyYXkoaW5kZXgsIGVuZEluZGV4KSlcbiAgICB0aGlzLnJlY29yZEJvZHlCeXRlcyhlbmRJbmRleCAtIGluZGV4KVxuXG4gICAgaWYgKHRoaXMuY29udGVudExlbmd0aCAmJiB0aGlzLmJvZHlMZW5ndGggPj0gdGhpcy5jb250ZW50TGVuZ3RoKSB7XG4gICAgICB0aGlzLnBvc3RSZXF1ZXN0RG9uZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVuZEluZGV4XG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgYSBzaW5nbGUgYnl0ZSBmb3IgdGhlIGJ5dGUtYmFzZWQgcGFyc2VyIHN0YXRlcy5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFJlYWQgcG9zaXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTmV3IHJlYWQgcG9zaXRpb24uXG4gICAqL1xuICBmZWVkQnl0ZShkYXRhLCBpbmRleCkge1xuICAgIGNvbnN0IGNoYXIgPSBkYXRhW2luZGV4XVxuXG4gICAgaWYgKHRoaXMucmVhZGluZ0JvZHkpIHRoaXMucmVjb3JkQm9keUJ5dGVzKDEpXG5cbiAgICBzd2l0Y2godGhpcy5zdGF0ZSkge1xuICAgICAgY2FzZSBcImNodW5rZWQtZGF0YVwiOiB7XG4gICAgICAgIGNvbnN0IGNodW5rZWRCb2R5Q2hhcnMgPSB0aGlzLmNodW5rZWRCb2R5Q2hhcnNcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2h1bmtTaXplID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIkNodW5rIHNpemUgbm90IGluaXRpYWxpemVkXCIpXG4gICAgICAgIGlmICghY2h1bmtlZEJvZHlDaGFycykgdGhyb3cgbmV3IEVycm9yKFwiQ2h1bmtlZCBib2R5IG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgICAgIHRoaXMuYXNzZXJ0UmVxdWVzdEJvZHlTaXplKGNodW5rZWRCb2R5Q2hhcnMubGVuZ3RoICsgMSlcbiAgICAgICAgY2h1bmtlZEJvZHlDaGFycy5wdXNoKGNoYXIpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDdXJyZW50IGNodW5rIGJ5dGVzIHJlYWQuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDaHVua0J5dGVzUmVhZCA9ICh0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCB8fCAwKSArIDFcblxuICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IGN1cnJlbnRDaHVua0J5dGVzUmVhZFxuXG4gICAgICAgIGlmIChjdXJyZW50Q2h1bmtCeXRlc1JlYWQgPj0gdGhpcy5jdXJyZW50Q2h1bmtTaXplKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmtDcmxmUmVhZCA9IDBcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1kYXRhLWNybGZcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIFwiY2h1bmtlZC1kYXRhLWNybGZcIjpcbiAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmtDcmxmUmVhZCA9ICh0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkIHx8IDApICsgMVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkID49IDIpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1zaXplXCIpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWJvZHlcIjoge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybURhdGFQYXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJGb3JtRGF0YSBwYXJ0IG5vdCBpbml0aWFsaXplZFwiKVxuICAgICAgICBpZiAoIXRoaXMuYm91bmRhcnlMaW5lRW5kKSB0aHJvdyBuZXcgRXJyb3IoXCJCb3VuZGFyeSBsaW5lIGVuZCBub3QgaW5pdGlhbGl6ZWRcIilcbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kYXJ5TGluZU5leHQpIHRocm93IG5ldyBFcnJvcihcIkJvdW5kYXJ5IGxpbmUgbmV4dCBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5mb3JtRGF0YVBhcnQuYm9keVxuXG4gICAgICAgIGJvZHkucHVzaChjaGFyKVxuXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlFbmRQb3NpdGlvbiA9IGJvZHkubGVuZ3RoIC0gdGhpcy5ib3VuZGFyeUxpbmVFbmQubGVuZ3RoXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlFbmRDaGFycyA9IGJvZHkuc2xpY2UocG9zc2libGVCb3VuZGFyeUVuZFBvc2l0aW9uLCBib2R5Lmxlbmd0aClcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeUVuZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgcG9zc2libGVCb3VuZGFyeUVuZENoYXJzKVxuXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlOZXh0UG9zaXRpb24gPSBib2R5Lmxlbmd0aCAtIHRoaXMuYm91bmRhcnlMaW5lTmV4dC5sZW5ndGhcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeU5leHRDaGFycyA9IGJvZHkuc2xpY2UocG9zc2libGVCb3VuZGFyeU5leHRQb3NpdGlvbiwgYm9keS5sZW5ndGgpXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlOZXh0ID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBwb3NzaWJsZUJvdW5kYXJ5TmV4dENoYXJzKVxuXG4gICAgICAgIGlmIChwb3NzaWJsZUJvdW5kYXJ5RW5kID09IHRoaXMuYm91bmRhcnlMaW5lRW5kKSB7XG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnQucmVtb3ZlRnJvbUJvZHkocG9zc2libGVCb3VuZGFyeUVuZClcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuICAgICAgICAgIHRoaXMuY29tcGxldGVSZXF1ZXN0KClcbiAgICAgICAgfSBlbHNlIGlmIChwb3NzaWJsZUJvdW5kYXJ5TmV4dCA9PSB0aGlzLmJvdW5kYXJ5TGluZU5leHQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydC5yZW1vdmVGcm9tQm9keShwb3NzaWJsZUJvdW5kYXJ5TmV4dClcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuICAgICAgICAgIHRoaXMubmV3Rm9ybURhdGFQYXJ0KClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggJiYgdGhpcy5ib2R5TGVuZ3RoID49IHRoaXMuY29udGVudExlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybURhdGFQYXJ0LmNvbnRlbnRMZW5ndGggJiYgdGhpcy5ib2R5TGVuZ3RoID49IHRoaXMuZm9ybURhdGFQYXJ0LmNvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3R1YlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgVW5rbm93biBzdGF0ZSBmb3IgcmVxdWVzdCBidWZmZXJgLCB7c3RhdGU6IHRoaXMuc3RhdGV9XSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXggKyAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUuXG4gICAqIEByZXR1cm5zIHtIZWFkZXJ9IC0gVGhlIGhlYWRlci5cbiAgICovXG4gIGdldEhlYWRlcihuYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oZWFkZXJzQnlOYW1lW25hbWUudG9Mb3dlckNhc2UoKS50cmltKCldXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IFtgZ2V0SGVhZGVyICR7bmFtZX1gLCB7cmVzdWx0OiByZXN1bHQ/LnRvU3RyaW5nKCl9XSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBoZWFkZXJzIGhhc2guXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIFRoZSBoZWFkZXJzIGhhc2guXG4gICAqL1xuICBnZXRIZWFkZXJzSGFzaCgpIHtcbiAgICAvKipcbiAgICAgKiBSZXN1bHQuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgcmVzdWx0ID0ge31cblxuICAgIGZvciAoY29uc3QgaGVhZGVyRm9ybWF0dGVkTmFtZSBpbiB0aGlzLmhlYWRlcnNCeU5hbWUpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuaGVhZGVyc0J5TmFtZVtoZWFkZXJGb3JtYXR0ZWROYW1lXVxuXG4gICAgICByZXN1bHRbaGVhZGVyLmdldE5hbWUoKV0gPSBoZWFkZXIuZ2V0VmFsdWUoKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm0gZGF0YSBwYXJ0IGRvbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGZvcm1EYXRhUGFydERvbmUoKSB7XG4gICAgY29uc3QgZm9ybURhdGFQYXJ0ID0gdGhpcy5mb3JtRGF0YVBhcnRcblxuICAgIGlmICghZm9ybURhdGFQYXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJmb3JtRGF0YVBhcnQgd2FzbnQgc2V0XCIpXG5cbiAgICB0aGlzLmZvcm1EYXRhUGFydCA9IHVuZGVmaW5lZFxuICAgIGZvcm1EYXRhUGFydC5maW5pc2goKVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImZvcm0tZGF0YS1wYXJ0XCIsIGZvcm1EYXRhUGFydClcbiAgfVxuXG4gIGlzTXVsdGlQYXJ0eUZvcm1EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpUGFydHlGb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmV3IGZvcm0gZGF0YSBwYXJ0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBuZXdGb3JtRGF0YVBhcnQoKSB7XG4gICAgdGhpcy5mb3JtRGF0YVBhcnQgPSBuZXcgRm9ybURhdGFQYXJ0KClcbiAgICB0aGlzLnNldFN0YXRlKFwibXVsdGktcGFydC1mb3JtLWRhdGEtaGVhZGVyXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBMaW5lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwYXJzZShsaW5lKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT0gXCJzdGF0dXNcIikge1xuICAgICAgdGhpcy5wYXJzZVN0YXR1c0xpbmUobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJoZWFkZXJzXCIpIHtcbiAgICAgIHRoaXMucGFyc2VIZWFkZXIobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJjaHVua2VkLXNpemVcIikge1xuICAgICAgdGhpcy5wYXJzZUNodW5rU2l6ZUxpbmUobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJjaHVua2VkLXRyYWlsZXJcIikge1xuICAgICAgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgICB0aGlzLmZpbmlzaENodW5rZWRCb2R5KClcbiAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhXCIpIHtcbiAgICAgIGlmIChsaW5lID09IHRoaXMuYm91bmRhcnlMaW5lKSB7XG4gICAgICAgIHRoaXMubmV3Rm9ybURhdGFQYXJ0KClcbiAgICAgIH0gZWxzZSBpZiAobGluZSA9PSBcIlxcclxcblwiKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXCJkb25lXCIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJvdW5kYXJ5IGxpbmUgYnV0IGRpZG4ndCBnZXQgaXQ6ICR7bGluZX1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWhlYWRlclwiKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnJlYWRIZWFkZXJGcm9tTGluZShsaW5lKVxuXG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtRGF0YVBhcnQpIHRocm93IG5ldyBFcnJvcihcImZvcm1EYXRhUGFydCBub3Qgc2V0XCIpXG5cbiAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnQuYWRkSGVhZGVyKGhlYWRlcilcbiAgICAgICAgLy90aGlzLnN0YXRlID09IFwibXVsdGktcGFydC1mb3JtLWRhdGFcIlxuICAgICAgfSBlbHNlIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWJvZHlcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXRlIHBhcnNpbmcgbGluZTogJHt0aGlzLnN0YXRlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVhZCBoZWFkZXIgZnJvbSBsaW5lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHtIZWFkZXIgfCB1bmRlZmluZWR9IC0gVGhlIGhlYWRlciBmcm9tIGxpbmUuXG4gICAqL1xuICByZWFkSGVhZGVyRnJvbUxpbmUobGluZSkge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXiguKyk6ICguKylcXHJcXG4vKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBuZXcgSGVhZGVyKG1hdGNoWzFdLCBtYXRjaFsyXSlcblxuICAgICAgcmV0dXJuIGhlYWRlclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7SGVhZGVyfSBoZWFkZXIgLSBIZWFkZXIgdmFsdWUuXG4gICAqL1xuICBhZGRIZWFkZXIoaGVhZGVyKSB7XG4gICAgY29uc3QgZm9ybWF0dGVkTmFtZSA9IGhlYWRlci5nZXRGb3JtYXR0ZWROYW1lKClcbiAgICBjb25zdCBleGlzdGluZ0hlYWRlciA9IHRoaXMuaGVhZGVyc0J5TmFtZVtmb3JtYXR0ZWROYW1lXVxuXG4gICAgLy8gUkZDIDkxMTAgwqc1LjM6IGEgZmllbGQgbWF5IGJlIHJlcGVhdGVkOyBpdHMgdmFsdWUgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2ZcbiAgICAvLyBhbGwgZmllbGQgdmFsdWVzIHNlcGFyYXRlZCBieSBjb21tYXMsIGluIHdpcmUgb3JkZXIuIE9ubHkgQWNjZXB0LUVuY29kaW5nXG4gICAgLy8gaXMgY29uc3VtZWQgYXMgYSBjb21iaW5lZCBmaWVsZCBieSB0aGUgc2VydmVyLlxuICAgIGlmIChleGlzdGluZ0hlYWRlciAmJiBDT01CSU5JTkdfSEVBREVSX0ZJRUxEUy5oYXMoZm9ybWF0dGVkTmFtZSkpIHtcbiAgICAgIGV4aXN0aW5nSGVhZGVyLnZhbHVlICs9IGAsICR7aGVhZGVyLmdldFZhbHVlKCl9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNCeU5hbWVbZm9ybWF0dGVkTmFtZV0gPSBoZWFkZXJcbiAgICB9XG5cbiAgICBpZiAoZm9ybWF0dGVkTmFtZSA9PSBcImNvbnRlbnQtbGVuZ3RoXCIpIHRoaXMuY29udGVudExlbmd0aCA9IHBhcnNlSW50KGhlYWRlci5nZXRWYWx1ZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGFyc2UgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHBhcnNlSGVhZGVyKGxpbmUpIHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnJlYWRIZWFkZXJGcm9tTGluZShsaW5lKVxuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgUGFyc2VkIGhlYWRlcjogJHtoZWFkZXIudG9TdHJpbmcoKX1gKVxuICAgICAgdGhpcy5hZGRIZWFkZXIoaGVhZGVyKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImhlYWRlclwiLCBoZWFkZXIpXG4gICAgfSBlbHNlIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgIGNvbnN0IGh0dHBNZXRob2QgPSB0aGlzLmh0dHBNZXRob2Q/LnRvVXBwZXJDYXNlKClcblxuICAgICAgaWYgKCFodHRwTWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJIVFRQIG1ldGhvZCBub3Qgc2V0XCIpXG4gICAgICBpZiAoIXRoaXMucGF0aCkgdGhyb3cgbmV3IEVycm9yKFwiSFRUUCBwYXRoIG5vdCBzZXRcIilcblxuICAgICAgdGhpcy5yZXF1ZXN0Qm9keVBvbGljeSA9IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlSHR0cFJlcXVlc3RCb2R5UG9saWN5KHtcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzSGFzaCgpLFxuICAgICAgICBodHRwTWV0aG9kLFxuICAgICAgICBwYXRoOiB0aGlzLnBhdGhcbiAgICAgIH0pXG5cbiAgICAgIGlmICghdGhpcy5leHBlY3RzUmVxdWVzdEJvZHkoaHR0cE1ldGhvZCkpIHtcbiAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ2h1bmtlZEVuY29kaW5nKCkpIHtcbiAgICAgICAgdGhpcy5yZWFkaW5nQm9keSA9IHRydWVcbiAgICAgICAgdGhpcy5ib2R5TGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluaXRpYWxpemVDaHVua2VkQm9keSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlYWRpbmdCb2R5ID0gdHJ1ZVxuICAgICAgICB0aGlzLmJvZHlMZW5ndGggPSAwXG5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudExlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKE51bWJlci5pc05hTih0aGlzLmNvbnRlbnRMZW5ndGgpKSB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZW50IGxlbmd0aCBpcyBpbnZhbGlkXCIpXG5cbiAgICAgICAgICB0aGlzLmFzc2VydFJlcXVlc3RCb2R5U2l6ZSh0aGlzLmNvbnRlbnRMZW5ndGgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMucmVxdWVzdEJvZHlQb2xpY3kubW9kZSA9PT0gXCJwYXJzZWRcIlxuICAgICAgICAgID8gdGhpcy5nZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIik/LnZhbHVlPy5tYXRjaCgvXm11bHRpcGFydFxcL2Zvcm0tZGF0YTtcXHMqYm91bmRhcnk9KC4rKSQvaSlcbiAgICAgICAgICA6IG51bGxcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5ID0gbWF0Y2hbMV1cbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5TGluZSA9IGAtLSR7dGhpcy5ib3VuZGFyeX1cXHJcXG5gXG4gICAgICAgICAgdGhpcy5ib3VuZGFyeUxpbmVOZXh0ID0gYFxcclxcbi0tJHt0aGlzLmJvdW5kYXJ5fVxcclxcbmBcbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5TGluZUVuZCA9IGBcXHJcXG4tLSR7dGhpcy5ib3VuZGFyeX0tLWBcbiAgICAgICAgICB0aGlzLm11bHRpUGFydHlGb3JtRGF0YSA9IHRydWVcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwibXVsdGktcGFydC1mb3JtLWRhdGFcIilcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggPT09IDAgfHwgdGhpcy5jb250ZW50TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAqIEB0eXBlIHtCdWZmZXJbXX0gKi9cbiAgICAgICAgICB0aGlzLnBvc3RCb2R5QnVmZmVycyA9IFtdXG5cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwicG9zdC1ib2R5XCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZSBzdGF0dXMgbGluZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBMaW5lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwYXJzZVN0YXR1c0xpbmUobGluZSkge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXihbQS1aLV0rKSAoLis/KSBIVFRQXFwvKC4rKVxcclxcbi8pXG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IG1hdGNoIHN0YXR1cyBsaW5lIGZyb206ICR7bGluZX1gKVxuICAgIH1cblxuICAgIHRoaXMuaHR0cE1ldGhvZCA9IG1hdGNoWzFdXG4gICAgdGhpcy5odHRwVmVyc2lvbiA9IG1hdGNoWzNdXG4gICAgdGhpcy5wYXRoID0gbWF0Y2hbMl1cbiAgICB0aGlzLnNldFN0YXRlKFwiaGVhZGVyc1wiKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gW1wiUGFyc2VkIHN0YXR1cyBsaW5lXCIsIHtodHRwTWV0aG9kOiB0aGlzLmh0dHBNZXRob2QsIGh0dHBWZXJzaW9uOiB0aGlzLmh0dHBWZXJzaW9uLCBwYXRoOiB0aGlzLnBhdGh9XSlcbiAgfVxuXG4gIHBvc3RSZXF1ZXN0RG9uZSgpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keUJ1ZmZlcnMpIHtcbiAgICAgIGNvbnN0IGJvZHlCdWZmZXIgPSBCdWZmZXIuY29uY2F0KHRoaXMucG9zdEJvZHlCdWZmZXJzKVxuXG4gICAgICBpZiAodGhpcy5yZXF1ZXN0Qm9keVBvbGljeT8ubW9kZSA9PT0gXCJyYXdcIikge1xuICAgICAgICB0aGlzLnJhd0JvZHlCdWZmZXIgPSBib2R5QnVmZmVyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc3RCb2R5ID0gYm9keUJ1ZmZlci50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBvc3RCb2R5QnVmZmVycyA9IHVuZGVmaW5lZFxuXG4gICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhwZWN0cyByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodHRwTWV0aG9kIC0gSFRUUCBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlcXVlc3QgZXhwZWN0cyBhIGJvZHkuXG4gICAqL1xuICBleHBlY3RzUmVxdWVzdEJvZHkoaHR0cE1ldGhvZCkge1xuICAgIHJldHVybiAhW1wiR0VUXCIsIFwiT1BUSU9OU1wiLCBcIkhFQURcIl0uaW5jbHVkZXMoaHR0cE1ldGhvZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGNodW5rZWQgZW5jb2RpbmcuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlcXVlc3QgdXNlcyBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLlxuICAgKi9cbiAgaXNDaHVua2VkRW5jb2RpbmcoKSB7XG4gICAgY29uc3QgdHJhbnNmZXJFbmNvZGluZyA9IHRoaXMuZ2V0SGVhZGVyKFwidHJhbnNmZXItZW5jb2RpbmdcIik/LnZhbHVlPy50b0xvd2VyQ2FzZSgpXG5cbiAgICByZXR1cm4gQm9vbGVhbih0cmFuc2ZlckVuY29kaW5nPy5pbmNsdWRlcyhcImNodW5rZWRcIikpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbml0aWFsaXplIGNodW5rZWQgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgaW5pdGlhbGl6ZUNodW5rZWRCb2R5KCkge1xuICAgIHRoaXMuY2h1bmtlZEJvZHlDaGFycyA9IFtdXG4gICAgdGhpcy5jdXJyZW50Q2h1bmtTaXplID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50Q2h1bmtCeXRlc1JlYWQgPSAwXG4gICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtc2l6ZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGFyc2UgY2h1bmsgc2l6ZSBsaW5lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIENodW5rIHNpemUgbGluZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcGFyc2VDaHVua1NpemVMaW5lKGxpbmUpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKClcblxuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuXG5cbiAgICBjb25zdCBzaXplVG9rZW4gPSB0cmltbWVkLnNwbGl0KFwiO1wiKVswXT8udHJpbSgpXG5cbiAgICBpZiAoIXNpemVUb2tlbikgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNodW5rIHNpemUgbGluZTogJHtsaW5lfWApXG5cbiAgICBpZiAoIS9eWzAtOWEtZl0rJC9pdS50ZXN0KHNpemVUb2tlbikpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaHVuayBzaXplOiAke3NpemVUb2tlbn1gKVxuXG4gICAgY29uc3Qgc2l6ZSA9IE51bWJlci5wYXJzZUludChzaXplVG9rZW4sIDE2KVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihzaXplKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNodW5rIHNpemU6ICR7c2l6ZVRva2VufWApXG5cbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtdHJhaWxlclwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnRSZXF1ZXN0Qm9keVNpemUoKHRoaXMuY2h1bmtlZEJvZHlDaGFycz8ubGVuZ3RoIHx8IDApICsgc2l6ZSlcblxuICAgIHRoaXMuY3VycmVudENodW5rU2l6ZSA9IHNpemVcbiAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1kYXRhXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5pc2ggY2h1bmtlZCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBmaW5pc2hDaHVua2VkQm9keSgpIHtcbiAgICBpZiAodGhpcy5jaHVua2VkQm9keUNoYXJzKSB7XG4gICAgICBjb25zdCBib2R5QnVmZmVyID0gQnVmZmVyLmZyb20odGhpcy5jaHVua2VkQm9keUNoYXJzKVxuXG4gICAgICBpZiAodGhpcy5yZXF1ZXN0Qm9keVBvbGljeT8ubW9kZSA9PT0gXCJyYXdcIikge1xuICAgICAgICB0aGlzLnJhd0JvZHlCdWZmZXIgPSBib2R5QnVmZmVyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc3RCb2R5ID0gYm9keUJ1ZmZlci50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5jaHVua2VkQm9keUNoYXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgc3RhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdTdGF0ZSAtIE5ldyBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBDaGFuZ2luZyBzdGF0ZSBmcm9tICR7dGhpcy5zdGF0ZX0gdG8gJHtuZXdTdGF0ZX1gKVxuICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZVxuICB9XG5cbiAgY29tcGxldGVSZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHRoaXMuc3RhdGUgPSBcInN0YXR1c1wiIC8vIFJlc2V0IHN0YXRlIHRvIG5ldyByZXF1ZXN0XG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlXG5cbiAgICBpZiAodGhpcy5yZXF1ZXN0Qm9keVBvbGljeT8ubW9kZSA9PT0gXCJyYXdcIikge1xuICAgICAgdGhpcy5yYXdCb2R5QnVmZmVyIHx8PSBCdWZmZXIuYWxsb2MoMClcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIpPy52YWx1ZT8uc3RhcnRzV2l0aChcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICAgIHRoaXMucGFyc2VBcHBsaWNhdGlvbkpzb25QYXJhbXMoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aVBhcnR5Rm9ybURhdGEpIHtcbiAgICAgIC8vIERvbmUgYWZ0ZXIgZWFjaCBuZXcgZm9ybSBkYXRhIHBhcnRcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJzZVF1ZXJ5U3RyaW5nUG9zdFBhcmFtcygpXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNvbXBsZXRlZFwiKVxuICB9XG5cbiAgcGFyc2VBcHBsaWNhdGlvbkpzb25QYXJhbXMoKSB7XG4gICAgaWYgKHRoaXMucG9zdEJvZHkpIHtcbiAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IEpTT04ucGFyc2UodGhpcy5wb3N0Qm9keSlcblxuICAgICAgaW5jb3Jwb3JhdGUodGhpcy5wYXJhbXMsIG5ld1BhcmFtcylcbiAgICB9XG4gIH1cblxuICBwYXJzZVF1ZXJ5U3RyaW5nUG9zdFBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnBvc3RCb2R5KVxuICAgICAgICAvKipcbiAgICAgICAgICogVW5wYXJzZWQgcGFyYW1zLlxuICAgICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+fSAqL1xuICAgICAgICBjb25zdCB1bnBhcnNlZFBhcmFtcyA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkUXVlcnkpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdW5wYXJzZWRQYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zVG9PYmplY3QgPSBuZXcgUGFyYW1zVG9PYmplY3QodW5wYXJzZWRQYXJhbXMpXG4gICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IHBhcmFtc1RvT2JqZWN0LnRvT2JqZWN0KClcblxuICAgICAgICBpbmNvcnBvcmF0ZSh0aGlzLnBhcmFtcywgbmV3UGFyYW1zKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZW5zdXJlZEVycm9yID0gLyoqIEB0eXBlIHtFcnJvciAmIHt2ZWxvY2lvdXNDb250ZXh0PzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gKi8gKGVycm9yKVxuXG4gICAgICAgIGVuc3VyZWRFcnJvci52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAgIC4uLihlbnN1cmVkRXJyb3IudmVsb2Npb3VzQ29udGV4dCB8fCB7fSksXG4gICAgICAgICAgcmVxdWVzdFBhcnNpbmc6IHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmdldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiKT8udmFsdWUsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiB0aGlzLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBwYXJhbWV0ZXJLZXlzOiBPYmplY3Qua2V5cyhxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnBvc3RCb2R5KSksXG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgICAgICBwb3N0Qm9keVByZXZpZXc6IHRydW5jYXRlUHJldmlldyh0aGlzLnBvc3RCb2R5KSxcbiAgICAgICAgICAgIHN0YWdlOiBcInF1ZXJ5LXN0cmluZy1wb3N0LXBhcmFtc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZW5zdXJlZEVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -52,6 +52,11 @@ export default class VelociousHttpServerClientRequest {
52
52
  queryParams(): Record<string, string | string[]>;
53
53
  protocol(): string | null;
54
54
  remoteAddress(): string | undefined;
55
+ /**
56
+ * Returns exact body bytes for requests whose header-stage body policy selected raw mode.
57
+ * @returns {Buffer} - A copy of the exact request body bytes.
58
+ */
59
+ rawBody(): Buffer;
55
60
  socketRemoteAddress(): string | undefined;
56
61
  getRequestBuffer(): import("./request-buffer/index.js").default;
57
62
  getRequestParser(): RequestParser;
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/request.js"],"names":[],"mappings":"AAIA,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAI/C,MAAM,CAAC,OAAO,OAAO,gCAAgC;IAU5C,MAAM;IACN,aAAa;IACb,aAAa;IAXpB;;;;;OAKG;IACH,YAAY,EAAC,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAC,EAH7C;QAA2C,MAAM,EAAzC,OAAO,YAAY,EAAE,OAAO,CACpC;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAClD;KAC+C,EAM/C;IAED,OAAO,WAA2D;IAElE;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAHE,MAGF,GAFI,MAAM,GAAG,SAAS,CAEoB;IAEnD;;;;OAIG;IACH,MAAM,CAAC,UAAU,EAHN,MAGM,GAFJ,MAAM,GAAG,IAAI,CAE6D;IACvF,OAAO,2BAAsD;IAC7D,UAAU,WAAgD;IAC1D,WAAW,WAAiD;IAC5D,IAAI,kBAA0C;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,GAAG,AAHT,CACA,EADQ,MAGC,GAFC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAMzC;IAED,YAAY,WAcX;IAED,MAAM,kBAAmC;IACzC,IAAI,WAA0C;IAC9C;;;OAGG;IACH,MAAM,IAFO,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAExF;IACzD,IAAI,kBAA0C;IAE9C;;;OAGG;IACH,WAAW,IAFE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAoB7C;IACD,QAAQ,kBAA8C;IACtD,aAAa,uBAMZ;IACD,mBAAmB,uBAAwC;IAE3D,gBAAgB,gDAAwD;IACxE,gBAAgB,kBAAgC;CACjD"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/request.js"],"names":[],"mappings":"AAIA,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAI/C,MAAM,CAAC,OAAO,OAAO,gCAAgC;IAU5C,MAAM;IACN,aAAa;IACb,aAAa;IAXpB;;;;;OAKG;IACH,YAAY,EAAC,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAC,EAH7C;QAA2C,MAAM,EAAzC,OAAO,YAAY,EAAE,OAAO,CACpC;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAClD;KAC+C,EAM/C;IAED,OAAO,WAA2D;IAElE;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAHE,MAGF,GAFI,MAAM,GAAG,SAAS,CAEoB;IAEnD;;;;OAIG;IACH,MAAM,CAAC,UAAU,EAHN,MAGM,GAFJ,MAAM,GAAG,IAAI,CAE6D;IACvF,OAAO,2BAAsD;IAC7D,UAAU,WAAgD;IAC1D,WAAW,WAAiD;IAC5D,IAAI,kBAA0C;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,GAAG,AAHT,CACA,EADQ,MAGC,GAFC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAMzC;IAED,YAAY,WAcX;IAED,MAAM,kBAAmC;IACzC,IAAI,WAA0C;IAC9C;;;OAGG;IACH,MAAM,IAFO,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAExF;IACzD,IAAI,kBAA0C;IAE9C;;;OAGG;IACH,WAAW,IAFE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAoB7C;IACD,QAAQ,kBAA8C;IACtD,aAAa,uBAMZ;IACD;;;OAGG;IACH,OAAO,IAFM,MAAM,CAEsC;IACzD,mBAAmB,uBAAwC;IAE3D,gBAAgB,gDAAwD;IACxE,gBAAgB,kBAAgC;CACjD"}
@@ -95,8 +95,13 @@ export default class VelociousHttpServerClientRequest {
95
95
  socketRemoteAddress: this.socketRemoteAddress()
96
96
  });
97
97
  }
98
+ /**
99
+ * Returns exact body bytes for requests whose header-stage body policy selected raw mode.
100
+ * @returns {Buffer} - A copy of the exact request body bytes.
101
+ */
102
+ rawBody() { return this.getRequestBuffer().getRawBody(); }
98
103
  socketRemoteAddress() { return this.client?.remoteAddress; }
99
104
  getRequestBuffer() { return this.getRequestParser().getRequestBuffer(); }
100
105
  getRequestParser() { return this.requestParser; }
101
106
  }
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxvQkFBb0IsTUFBTSxzQkFBc0IsQ0FBQTtBQUN2RCxPQUFPLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUUxRCxNQUFNLENBQUMsT0FBTyxPQUFPLGdDQUFnQztJQUNuRDs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQzlDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQsT0FBTyxLQUFLLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUEsQ0FBQyxDQUFDO0lBRWxFOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRW5EOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsVUFBVSxJQUFJLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFBLENBQUMsQ0FB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LEVBQUU7U0FDaEQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELG1CQUFtQixLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUEsQ0FBQyxDQUFDO0lBRTNELGdCQUFnQixLQUFLLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFDeEUsZ0JBQWdCLEtBQUssT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFBLENBQUMsQ0FBQztDQUNqRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gXCJxdWVyeXN0cmluZ1wiXG5pbXBvcnQgUmVxdWVzdFBhcnNlciBmcm9tIFwiLi9yZXF1ZXN0LXBhcnNlci5qc1wiXG5pbXBvcnQgcmVzb2x2ZVJlbW90ZUFkZHJlc3MgZnJvbSBcIi4uL3JlbW90ZS1hZGRyZXNzLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi8uLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5jbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NsaWVudCwgY29uZmlndXJhdGlvbiwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMucmVxdWVzdFBhcnNlciA9IG5ldyBSZXF1ZXN0UGFyc2VyKHtjb25maWd1cmF0aW9ufSlcbiAgfVxuXG4gIGJhc2VVUkwoKSB7IHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9Oi8vJHt0aGlzLmhvc3RXaXRoUG9ydCgpfWAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZlZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyIHwgdW5kZWZpbmVkfSAtIFJlbWFpbmluZyBkYXRhLCBpZiBhbnkuXG4gICAqL1xuICBmZWVkKGRhdGEpIHsgcmV0dXJuIHRoaXMucmVxdWVzdFBhcnNlci5mZWVkKGRhdGEpIH1cblxuICAvKipcbiAgICogUnVucyBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJOYW1lIC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIFRoZSBoZWFkZXIuXG4gICAqL1xuICBoZWFkZXIoaGVhZGVyTmFtZSkgeyByZXR1cm4gdGhpcy5nZXRSZXF1ZXN0QnVmZmVyKCkuZ2V0SGVhZGVyKGhlYWRlck5hbWUpPy5nZXRWYWx1ZSgpIH1cbiAgaGVhZGVycygpIHsgcmV0dXJuIHRoaXMuZ2V0UmVxdWVzdEJ1ZmZlcigpLmdldEhlYWRlcnNIYXNoKCkgfVxuICBodHRwTWV0aG9kKCkgeyByZXR1cm4gdGhpcy5yZXF1ZXN0UGFyc2VyLmdldEh0dHBNZXRob2QoKSB9XG4gIGh0dHBWZXJzaW9uKCkgeyByZXR1cm4gdGhpcy5yZXF1ZXN0UGFyc2VyLmdldEh0dHBWZXJzaW9uKCkgfVxuICBob3N0KCkgeyByZXR1cm4gdGhpcy5yZXF1ZXN0UGFyc2VyLmdldEhvc3QoKSB9XG4gIC8qKlxuICAgKiBSdW5zIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBNZXRhZGF0YSBrZXkuXG4gICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBNZXRhZGF0YSB2YWx1ZSBmb3IgYSBrZXksIG9yIHRoZSBmdWxsIG1ldGFkYXRhIG9iamVjdC5cbiAgICovXG4gIG1ldGFkYXRhKGtleSkge1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBob3N0V2l0aFBvcnQoKSB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMucG9ydCgpXG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLnByb3RvY29sKClcbiAgICBsZXQgaG9zdFdpdGhQb3J0ID0gYCR7dGhpcy5ob3N0KCl9YFxuXG4gICAgaWYgKHBvcnQgPT0gODAgJiYgcHJvdG9jb2wgPT0gXCJodHRwXCIpIHtcbiAgICAgIC8vIERvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKHBvcnQgPT0gNDQzICYmIHByb3RvY29sID09IFwiaHR0cHNcIikge1xuICAgICAgLy8gRG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAocG9ydCkge1xuICAgICAgaG9zdFdpdGhQb3J0ICs9IGA6JHtwb3J0fWBcbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdFdpdGhQb3J0XG4gIH1cblxuICBvcmlnaW4oKSB7IHJldHVybiB0aGlzLmhlYWRlcihcIm9yaWdpblwiKSB9XG4gIHBhdGgoKSB7IHJldHVybiB0aGlzLnJlcXVlc3RQYXJzZXIuZ2V0UGF0aCgpIH1cbiAgLyoqXG4gICAqIFJ1bnMgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAtIFRoZSByZXF1ZXN0IHBhcmFtcy5cbiAgICovXG4gIHBhcmFtcygpIHsgcmV0dXJuIGRpZ2codGhpcywgXCJyZXF1ZXN0UGFyc2VyXCIsIFwicGFyYW1zXCIpIH1cbiAgcG9ydCgpIHsgcmV0dXJuIHRoaXMucmVxdWVzdFBhcnNlci5nZXRQb3J0KCkgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1ZXJ5IHBhcmFtcy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPn0gLSBQYXJzZWQgcXVlcnkgcGFyYW1ldGVycyBmcm9tIHRoZSBVUkwuXG4gICAqL1xuICBxdWVyeVBhcmFtcygpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucGF0aCgpLnNwbGl0KFwiP1wiKVsxXVxuXG4gICAgaWYgKCFxdWVyeSkgcmV0dXJuIE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGNvbnN0IHBhcnNlZCA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHF1ZXJ5KVxuICAgIC8qKlxuICAgICAqIFBhcmFtcy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+fSAqL1xuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXNcbiAgfVxuICBwcm90b2NvbCgpIHsgcmV0dXJuIHRoaXMucmVxdWVzdFBhcnNlci5nZXRQcm90b2NvbCgpIH1cbiAgcmVtb3RlQWRkcmVzcygpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJlbW90ZUFkZHJlc3Moe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzKCksXG4gICAgICBzb2NrZXRSZW1vdGVBZGRyZXNzOiB0aGlzLnNvY2tldFJlbW90ZUFkZHJlc3MoKVxuICAgIH0pXG4gIH1cbiAgc29ja2V0UmVtb3RlQWRkcmVzcygpIHsgcmV0dXJuIHRoaXMuY2xpZW50Py5yZW1vdGVBZGRyZXNzIH1cblxuICBnZXRSZXF1ZXN0QnVmZmVyKCkgeyByZXR1cm4gdGhpcy5nZXRSZXF1ZXN0UGFyc2VyKCkuZ2V0UmVxdWVzdEJ1ZmZlcigpIH1cbiAgZ2V0UmVxdWVzdFBhcnNlcigpIHsgcmV0dXJuIHRoaXMucmVxdWVzdFBhcnNlciB9XG59XG4iXX0=
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxvQkFBb0IsTUFBTSxzQkFBc0IsQ0FBQTtBQUN2RCxPQUFPLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUUxRCxNQUFNLENBQUMsT0FBTyxPQUFPLGdDQUFnQztJQUNuRDs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQzlDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQsT0FBTyxLQUFLLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUEsQ0FBQyxDQUFDO0lBRWxFOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRW5EOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsVUFBVSxJQUFJLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFBLENBQUMsQ0FBQztJQUN2RixPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFDN0QsVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFDMUQsV0FBVyxLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFDNUQsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFDOUM7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxHQUFHO1FBQ1YsSUFBSSxHQUFHLEtBQUssU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFBO1FBRXZDLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2hDLElBQUksWUFBWSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUE7UUFFbkMsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNyQyxhQUFhO1FBQ2YsQ0FBQzthQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7WUFDOUMsYUFBYTtRQUNmLENBQUM7YUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hCLFlBQVksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzVCLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0lBRUQsTUFBTSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDekMsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFDOUM7OztPQUdHO0lBQ0gsTUFBTSxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ3pELElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUEsQ0FBQyxDQUFDO0lBRTlDOzs7T0FHRztJQUNILFdBQVc7UUFDVCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXZDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXRDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdkM7O3VEQUUrQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRWxDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUNyQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUNELFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUEsQ0FBQyxDQUFDO0lBQ3RELGFBQWE7UUFDWCxPQUFPLG9CQUFvQixDQUFDO1lBQzFCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN2QixtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7U0FDaEQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNEOzs7T0FHRztJQUNILE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFBLENBQUMsQ0FBQztJQUN6RCxtQkFBbUIsS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFBLENBQUMsQ0FBQztJQUUzRCxnQkFBZ0IsS0FBSyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUEsQ0FBQyxDQUFDO0lBQ3hFLGdCQUFnQixLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQSxDQUFDLENBQUM7Q0FDakQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBxdWVyeXN0cmluZyBmcm9tIFwicXVlcnlzdHJpbmdcIlxuaW1wb3J0IFJlcXVlc3RQYXJzZXIgZnJvbSBcIi4vcmVxdWVzdC1wYXJzZXIuanNcIlxuaW1wb3J0IHJlc29sdmVSZW1vdGVBZGRyZXNzIGZyb20gXCIuLi9yZW1vdGUtYWRkcmVzcy5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFJlcXVlc3Qge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnQsIGNvbmZpZ3VyYXRpb24sIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnJlcXVlc3RQYXJzZXIgPSBuZXcgUmVxdWVzdFBhcnNlcih7Y29uZmlndXJhdGlvbn0pXG4gIH1cblxuICBiYXNlVVJMKCkgeyByZXR1cm4gYCR7dGhpcy5wcm90b2NvbCgpfTovLyR7dGhpcy5ob3N0V2l0aFBvcnQoKX1gIH1cblxuICAvKipcbiAgICogUnVucyBmZWVkLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0J1ZmZlciB8IHVuZGVmaW5lZH0gLSBSZW1haW5pbmcgZGF0YSwgaWYgYW55LlxuICAgKi9cbiAgZmVlZChkYXRhKSB7IHJldHVybiB0aGlzLnJlcXVlc3RQYXJzZXIuZmVlZChkYXRhKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyTmFtZSAtIEhlYWRlciBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBUaGUgaGVhZGVyLlxuICAgKi9cbiAgaGVhZGVyKGhlYWRlck5hbWUpIHsgcmV0dXJuIHRoaXMuZ2V0UmVxdWVzdEJ1ZmZlcigpLmdldEhlYWRlcihoZWFkZXJOYW1lKT8uZ2V0VmFsdWUoKSB9XG4gIGhlYWRlcnMoKSB7IHJldHVybiB0aGlzLmdldFJlcXVlc3RCdWZmZXIoKS5nZXRIZWFkZXJzSGFzaCgpIH1cbiAgaHR0cE1ldGhvZCgpIHsgcmV0dXJuIHRoaXMucmVxdWVzdFBhcnNlci5nZXRIdHRwTWV0aG9kKCkgfVxuICBodHRwVmVyc2lvbigpIHsgcmV0dXJuIHRoaXMucmVxdWVzdFBhcnNlci5nZXRIdHRwVmVyc2lvbigpIH1cbiAgaG9zdCgpIHsgcmV0dXJuIHRoaXMucmVxdWVzdFBhcnNlci5nZXRIb3N0KCkgfVxuICAvKipcbiAgICogUnVucyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gTWV0YWRhdGEga2V5LlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IC0gTWV0YWRhdGEgdmFsdWUgZm9yIGEga2V5LCBvciB0aGUgZnVsbCBtZXRhZGF0YSBvYmplY3QuXG4gICAqL1xuICBtZXRhZGF0YShrZXkpIHtcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgaG9zdFdpdGhQb3J0KCkge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnBvcnQoKVxuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5wcm90b2NvbCgpXG4gICAgbGV0IGhvc3RXaXRoUG9ydCA9IGAke3RoaXMuaG9zdCgpfWBcblxuICAgIGlmIChwb3J0ID09IDgwICYmIHByb3RvY29sID09IFwiaHR0cFwiKSB7XG4gICAgICAvLyBEbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChwb3J0ID09IDQ0MyAmJiBwcm90b2NvbCA9PSBcImh0dHBzXCIpIHtcbiAgICAgIC8vIERvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKHBvcnQpIHtcbiAgICAgIGhvc3RXaXRoUG9ydCArPSBgOiR7cG9ydH1gXG4gICAgfVxuXG4gICAgcmV0dXJuIGhvc3RXaXRoUG9ydFxuICB9XG5cbiAgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5oZWFkZXIoXCJvcmlnaW5cIikgfVxuICBwYXRoKCkgeyByZXR1cm4gdGhpcy5yZXF1ZXN0UGFyc2VyLmdldFBhdGgoKSB9XG4gIC8qKlxuICAgKiBSdW5zIHBhcmFtcy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gLSBUaGUgcmVxdWVzdCBwYXJhbXMuXG4gICAqL1xuICBwYXJhbXMoKSB7IHJldHVybiBkaWdnKHRoaXMsIFwicmVxdWVzdFBhcnNlclwiLCBcInBhcmFtc1wiKSB9XG4gIHBvcnQoKSB7IHJldHVybiB0aGlzLnJlcXVlc3RQYXJzZXIuZ2V0UG9ydCgpIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT59IC0gUGFyc2VkIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgVVJMLlxuICAgKi9cbiAgcXVlcnlQYXJhbXMoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnBhdGgoKS5zcGxpdChcIj9cIilbMV1cblxuICAgIGlmICghcXVlcnkpIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgICBjb25zdCBwYXJzZWQgPSBxdWVyeXN0cmluZy5wYXJzZShxdWVyeSlcbiAgICAvKipcbiAgICAgKiBQYXJhbXMuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHBhcmFtc1trZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zXG4gIH1cbiAgcHJvdG9jb2woKSB7IHJldHVybiB0aGlzLnJlcXVlc3RQYXJzZXIuZ2V0UHJvdG9jb2woKSB9XG4gIHJlbW90ZUFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVSZW1vdGVBZGRyZXNzKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycygpLFxuICAgICAgc29ja2V0UmVtb3RlQWRkcmVzczogdGhpcy5zb2NrZXRSZW1vdGVBZGRyZXNzKClcbiAgICB9KVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4YWN0IGJvZHkgYnl0ZXMgZm9yIHJlcXVlc3RzIHdob3NlIGhlYWRlci1zdGFnZSBib2R5IHBvbGljeSBzZWxlY3RlZCByYXcgbW9kZS5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBBIGNvcHkgb2YgdGhlIGV4YWN0IHJlcXVlc3QgYm9keSBieXRlcy5cbiAgICovXG4gIHJhd0JvZHkoKSB7IHJldHVybiB0aGlzLmdldFJlcXVlc3RCdWZmZXIoKS5nZXRSYXdCb2R5KCkgfVxuICBzb2NrZXRSZW1vdGVBZGRyZXNzKCkgeyByZXR1cm4gdGhpcy5jbGllbnQ/LnJlbW90ZUFkZHJlc3MgfVxuXG4gIGdldFJlcXVlc3RCdWZmZXIoKSB7IHJldHVybiB0aGlzLmdldFJlcXVlc3RQYXJzZXIoKS5nZXRSZXF1ZXN0QnVmZmVyKCkgfVxuICBnZXRSZXF1ZXN0UGFyc2VyKCkgeyByZXR1cm4gdGhpcy5yZXF1ZXN0UGFyc2VyIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.678",
6
+ "version": "1.0.680",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -82,7 +82,7 @@
82
82
  "proxy-addr": "^2.0.7",
83
83
  "pure-uuid": "^2.0.0",
84
84
  "require-context": "^1.1.0",
85
- "snapreq": "^0.0.15",
85
+ "snapreq": "^0.0.17",
86
86
  "sql-escape-string": "^1.1.0",
87
87
  "sql.js": "^1.12.0",
88
88
  "strftime": "^0.10.2",
@@ -128,7 +128,7 @@
128
128
  "eslint-plugin-jsdoc": "^64.0.2",
129
129
  "eslint-plugin-jsdoc-inline-type-casts": "https://github.com/kaspernj/eslint-plugin-jsdoc-inline-type-casts/archive/refs/heads/master.tar.gz",
130
130
  "eslint-plugin-jsdoc-tag-lines": "^1.0.1",
131
- "fallow": "3.16.0",
131
+ "fallow": "3.27.0",
132
132
  "globals": "^17.0.0",
133
133
  "mssql": "^12.0.0",
134
134
  "mysql": "^2.18.1",
@@ -288,6 +288,27 @@
288
288
  * @property {number} gzipLevel - Gzip compression level (0-9).
289
289
  */
290
290
 
291
+ /**
292
+ * @typedef {object} HttpRequestBodyPolicyResolverArgs
293
+ * @property {Record<string, string>} headers - Complete request headers as received by the parser.
294
+ * @property {string} httpMethod - Uppercase HTTP method.
295
+ * @property {string} path - Request target, including its query string when present.
296
+ */
297
+
298
+ /**
299
+ * @typedef {object} HttpRequestBodyPolicy
300
+ * @property {number} [maxRequestBodyBytes] - Per-request decoded body limit. Falls back to the global limit when omitted.
301
+ * @property {"parsed" | "raw"} [mode] - Parsed params by default; raw preserves exact bytes and skips body decoding.
302
+ */
303
+
304
+ /** @typedef {(args: HttpRequestBodyPolicyResolverArgs) => HttpRequestBodyPolicy | undefined} HttpRequestBodyPolicyResolver */
305
+
306
+ /**
307
+ * @typedef {object} ResolvedHttpRequestBodyPolicy
308
+ * @property {number | undefined} maxRequestBodyBytes - Effective decoded body limit.
309
+ * @property {"parsed" | "raw"} mode - Effective body handling mode.
310
+ */
311
+
291
312
  /**
292
313
  * @typedef {object} HttpServerConfiguration
293
314
  * @property {boolean | HttpCompressionConfiguration} [compression] - Buffered response compression. Enabled with documented defaults when absent; false or {enabled: false} disables it globally.
@@ -295,6 +316,7 @@
295
316
  * @property {boolean} [inProcess] - Run HTTP handlers in the main thread instead of worker threads.
296
317
  * @property {number} [maxBufferedResponseBodyBytes] - Maximum UTF-8/binary byte length accepted by buffered response bodies. Unbounded when absent; streamed file responses are unaffected.
297
318
  * @property {number} [maxRequestBodyBytes] - Maximum decoded request-body bytes accepted before routing. Unbounded when absent.
319
+ * @property {HttpRequestBodyPolicyResolver} [requestBodyPolicyResolver] - Optional synchronous header-stage resolver for per-request limits and raw-body handling.
298
320
  * @property {number} [maxWorkers] - Backward-compatible alias for workers.
299
321
  * @property {number} [port] - Port to bind the HTTP server to.
300
322
  * @property {{maxPendingBytes?: number, maxPendingMessages?: number}} [websocketInboundQueue] - Per-session retained inbound WebSocket message limits.
@@ -356,14 +356,20 @@ export default class VelociousConfiguration {
356
356
  this._initializePromise = undefined
357
357
  /** @type {number | undefined} */
358
358
  this._initializePromiseGeneration = undefined
359
+ const requestBodyPolicyResolver = httpServer?.requestBodyPolicyResolver
359
360
  const websocketInboundQueue = httpServer?.websocketInboundQueue
360
361
  const websocketOutboundQueue = httpServer?.websocketOutboundQueue
361
362
 
363
+ if (requestBodyPolicyResolver !== undefined && typeof requestBodyPolicyResolver !== "function") {
364
+ throw new TypeError("httpServer.requestBodyPolicyResolver must be a function")
365
+ }
366
+
362
367
  this.httpServer = {
363
368
  ...(httpServer || {}),
364
369
  compression: normalizeHttpCompression(httpServer?.compression),
365
370
  maxBufferedResponseBodyBytes: optionalPositiveSafeInteger(httpServer?.maxBufferedResponseBodyBytes, "httpServer.maxBufferedResponseBodyBytes"),
366
371
  maxRequestBodyBytes: optionalPositiveSafeInteger(httpServer?.maxRequestBodyBytes, "httpServer.maxRequestBodyBytes"),
372
+ requestBodyPolicyResolver,
367
373
  websocketInboundQueue: {
368
374
  maxPendingBytes: positiveSafeInteger(websocketInboundQueue?.maxPendingBytes, "httpServer.websocketInboundQueue.maxPendingBytes", DEFAULT_WEBSOCKET_INBOUND_MAX_PENDING_BYTES),
369
375
  maxPendingMessages: positiveSafeInteger(websocketInboundQueue?.maxPendingMessages, "httpServer.websocketInboundQueue.maxPendingMessages", DEFAULT_WEBSOCKET_INBOUND_MAX_PENDING_MESSAGES)
@@ -684,6 +690,42 @@ export default class VelociousConfiguration {
684
690
  return this.httpServer.maxRequestBodyBytes
685
691
  }
686
692
 
693
+ /**
694
+ * Resolves request-body handling after the request line and headers are complete,
695
+ * before body bytes are retained or decoded.
696
+ * @param {import("./configuration-types.js").HttpRequestBodyPolicyResolverArgs} args - Parsed request head.
697
+ * @returns {import("./configuration-types.js").ResolvedHttpRequestBodyPolicy} - Effective request policy.
698
+ */
699
+ resolveHttpRequestBodyPolicy(args) {
700
+ const resolver = this.httpServer.requestBodyPolicyResolver
701
+ const configuredPolicy = resolver ? resolver(args) : undefined
702
+
703
+ if (configuredPolicy === undefined) {
704
+ return {maxRequestBodyBytes: this.httpServer.maxRequestBodyBytes, mode: "parsed"}
705
+ }
706
+
707
+ if (!configuredPolicy || typeof configuredPolicy !== "object" || Array.isArray(configuredPolicy)) {
708
+ throw new TypeError("httpServer.requestBodyPolicyResolver must return an object or undefined")
709
+ }
710
+
711
+ const {maxRequestBodyBytes, mode = "parsed", ...restPolicy} = configuredPolicy
712
+ const unknownKeys = Object.keys(restPolicy)
713
+
714
+ if (unknownKeys.length > 0) {
715
+ throw new TypeError(`httpServer.requestBodyPolicyResolver returned unknown keys: ${unknownKeys.join(", ")} (supported: maxRequestBodyBytes, mode)`)
716
+ }
717
+ if (mode !== "parsed" && mode !== "raw") {
718
+ throw new TypeError(`httpServer.requestBodyPolicyResolver mode must be "parsed" or "raw", got: ${String(mode)}`)
719
+ }
720
+
721
+ return {
722
+ maxRequestBodyBytes: maxRequestBodyBytes === undefined
723
+ ? this.httpServer.maxRequestBodyBytes
724
+ : optionalPositiveSafeInteger(maxRequestBodyBytes, "httpServer.requestBodyPolicyResolver maxRequestBodyBytes"),
725
+ mode
726
+ }
727
+ }
728
+
687
729
  /**
688
730
  * Runs get cookie secret.
689
731
  * @returns {string | undefined} - Cookie secret.