@kaspernj/api-maker 1.0.2151 → 1.0.2153

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -143,6 +143,24 @@ current_command.increment!
143
143
  current_command.progress = 0.5
144
144
  ```
145
145
 
146
+ ### Waiting for websocket requests to go idle
147
+
148
+ For app/test cleanup flows that need to avoid leaking in-flight websocket command work into later state, use the realtime reset helper that waits for pending websocket requests before disconnecting the realtime runtime:
149
+
150
+ ```js
151
+ import {waitForRealtimeRuntimeIdleAndReset} from "@kaspernj/api-maker/build/reset-realtime-runtime-state"
152
+
153
+ await waitForRealtimeRuntimeIdleAndReset({timeoutMs: 5000})
154
+ ```
155
+
156
+ The synchronous default export still exists for immediate resets where waiting is not required:
157
+
158
+ ```js
159
+ import resetRealtimeRuntimeState from "@kaspernj/api-maker/build/reset-realtime-runtime-state"
160
+
161
+ resetRealtimeRuntimeState()
162
+ ```
163
+
146
164
  ## Realtime model events
147
165
 
148
166
  For model-specific websocket events in React/ShapeComponent UI code, prefer `useModelEvent` over manual `ModelEvents.connect(...)` subscriptions. The hook handles subscription lifecycle automatically and avoids leaked listeners.
@@ -1,3 +1,14 @@
1
+ export default resetRealtimeRuntimeState;
2
+ /**
3
+ * Waits for websocket-backed Api Maker requests to complete before resetting the realtime runtime.
4
+ *
5
+ * @param {object} [args]
6
+ * @param {number} [args.timeoutMs]
7
+ * @returns {Promise<void>}
8
+ */
9
+ export function waitForRealtimeRuntimeIdleAndReset({ timeoutMs }?: {
10
+ timeoutMs?: number;
11
+ }): Promise<void>;
1
12
  /** @returns {void} */
2
- export default function resetRealtimeRuntimeState(): void;
13
+ declare function resetRealtimeRuntimeState(): void;
3
14
  //# sourceMappingURL=reset-realtime-runtime-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reset-realtime-runtime-state.d.ts","sourceRoot":"/src/","sources":["reset-realtime-runtime-state.js"],"names":[],"mappings":"AAIA,sBAAsB;AACtB,qDADc,IAAI,CAKjB"}
1
+ {"version":3,"file":"reset-realtime-runtime-state.d.ts","sourceRoot":"/src/","sources":["reset-realtime-runtime-state.js"],"names":[],"mappings":";AAWA;;;;;;GAMG;AACH,mEAHG;IAAsB,SAAS,GAAvB,MAAM;CACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAKzB;AAjBD,sBAAsB;AACtB,8CADc,IAAI,CAKjB"}
@@ -2,9 +2,22 @@ import ApiMakerCableConnectionPool from "./cable-connection-pool.js";
2
2
  import ApiMakerWebsocketRequestClient from "./websocket-request-client.js";
3
3
  import { resetChannelsConsumer } from "./channels-consumer.js";
4
4
  /** @returns {void} */
5
- export default function resetRealtimeRuntimeState() {
5
+ const resetRealtimeRuntimeState = () => {
6
6
  ApiMakerWebsocketRequestClient.resetCurrent();
7
7
  ApiMakerCableConnectionPool.resetCurrent();
8
8
  resetChannelsConsumer();
9
- }
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcmVhbHRpbWUtcnVudGltZS1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsicmVzZXQtcmVhbHRpbWUtcnVudGltZS1zdGF0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLDJCQUEyQixNQUFNLDRCQUE0QixDQUFBO0FBQ3BFLE9BQU8sOEJBQThCLE1BQU0sK0JBQStCLENBQUE7QUFDMUUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFNUQsc0JBQXNCO0FBQ3RCLE1BQU0sQ0FBQyxPQUFPLFVBQVUseUJBQXlCO0lBQy9DLDhCQUE4QixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzdDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzFDLHFCQUFxQixFQUFFLENBQUE7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBcGlNYWtlckNhYmxlQ29ubmVjdGlvblBvb2wgZnJvbSBcIi4vY2FibGUtY29ubmVjdGlvbi1wb29sLmpzXCJcbmltcG9ydCBBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQgZnJvbSBcIi4vd2Vic29ja2V0LXJlcXVlc3QtY2xpZW50LmpzXCJcbmltcG9ydCB7cmVzZXRDaGFubmVsc0NvbnN1bWVyfSBmcm9tIFwiLi9jaGFubmVscy1jb25zdW1lci5qc1wiXG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlc2V0UmVhbHRpbWVSdW50aW1lU3RhdGUoKSB7XG4gIEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudC5yZXNldEN1cnJlbnQoKVxuICBBcGlNYWtlckNhYmxlQ29ubmVjdGlvblBvb2wucmVzZXRDdXJyZW50KClcbiAgcmVzZXRDaGFubmVsc0NvbnN1bWVyKClcbn1cbiJdfQ==
9
+ };
10
+ /**
11
+ * Waits for websocket-backed Api Maker requests to complete before resetting the realtime runtime.
12
+ *
13
+ * @param {object} [args]
14
+ * @param {number} [args.timeoutMs]
15
+ * @returns {Promise<void>}
16
+ */
17
+ const waitForRealtimeRuntimeIdleAndReset = async ({ timeoutMs = 5000 } = {}) => {
18
+ await ApiMakerWebsocketRequestClient.current().waitForIdle({ timeoutMs });
19
+ resetRealtimeRuntimeState();
20
+ };
21
+ export { waitForRealtimeRuntimeIdleAndReset };
22
+ export default resetRealtimeRuntimeState;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcmVhbHRpbWUtcnVudGltZS1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsicmVzZXQtcmVhbHRpbWUtcnVudGltZS1zdGF0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLDJCQUEyQixNQUFNLDRCQUE0QixDQUFBO0FBQ3BFLE9BQU8sOEJBQThCLE1BQU0sK0JBQStCLENBQUE7QUFDMUUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFNUQsc0JBQXNCO0FBQ3RCLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxFQUFFO0lBQ3JDLDhCQUE4QixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzdDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzFDLHFCQUFxQixFQUFFLENBQUE7QUFDekIsQ0FBQyxDQUFBO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxrQ0FBa0MsR0FBRyxLQUFLLEVBQUMsRUFBQyxTQUFTLEdBQUcsSUFBSSxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDMUUsTUFBTSw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZFLHlCQUF5QixFQUFFLENBQUE7QUFDN0IsQ0FBQyxDQUFBO0FBRUQsT0FBTyxFQUFDLGtDQUFrQyxFQUFDLENBQUE7QUFDM0MsZUFBZSx5QkFBeUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBcGlNYWtlckNhYmxlQ29ubmVjdGlvblBvb2wgZnJvbSBcIi4vY2FibGUtY29ubmVjdGlvbi1wb29sLmpzXCJcbmltcG9ydCBBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQgZnJvbSBcIi4vd2Vic29ja2V0LXJlcXVlc3QtY2xpZW50LmpzXCJcbmltcG9ydCB7cmVzZXRDaGFubmVsc0NvbnN1bWVyfSBmcm9tIFwiLi9jaGFubmVscy1jb25zdW1lci5qc1wiXG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmNvbnN0IHJlc2V0UmVhbHRpbWVSdW50aW1lU3RhdGUgPSAoKSA9PiB7XG4gIEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudC5yZXNldEN1cnJlbnQoKVxuICBBcGlNYWtlckNhYmxlQ29ubmVjdGlvblBvb2wucmVzZXRDdXJyZW50KClcbiAgcmVzZXRDaGFubmVsc0NvbnN1bWVyKClcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3Igd2Vic29ja2V0LWJhY2tlZCBBcGkgTWFrZXIgcmVxdWVzdHMgdG8gY29tcGxldGUgYmVmb3JlIHJlc2V0dGluZyB0aGUgcmVhbHRpbWUgcnVudGltZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudGltZW91dE1zXVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0IHdhaXRGb3JSZWFsdGltZVJ1bnRpbWVJZGxlQW5kUmVzZXQgPSBhc3luYyh7dGltZW91dE1zID0gNTAwMH0gPSB7fSkgPT4ge1xuICBhd2FpdCBBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQuY3VycmVudCgpLndhaXRGb3JJZGxlKHt0aW1lb3V0TXN9KVxuICByZXNldFJlYWx0aW1lUnVudGltZVN0YXRlKClcbn1cblxuZXhwb3J0IHt3YWl0Rm9yUmVhbHRpbWVSdW50aW1lSWRsZUFuZFJlc2V0fVxuZXhwb3J0IGRlZmF1bHQgcmVzZXRSZWFsdGltZVJ1bnRpbWVTdGF0ZVxuIl19
@@ -4,12 +4,25 @@ export default class ApiMakerWebsocketRequestClient {
4
4
  static current(): ApiMakerWebsocketRequestClient;
5
5
  /** @returns {void} */
6
6
  static resetCurrent(): void;
7
+ idleWaiters: any[];
7
8
  currentRequestId: number;
8
9
  skipReconnect: boolean;
9
10
  pendingRequests: {};
10
11
  pendingRequestsByFingerprint: {};
11
12
  responseCache: {};
12
13
  subscriptionState: string;
14
+ /** @returns {number} */
15
+ pendingRequestsCount(): number;
16
+ /**
17
+ * Waits for all in-flight websocket requests to complete.
18
+ *
19
+ * @param {object} [args]
20
+ * @param {number} [args.timeoutMs]
21
+ * @returns {Promise<void>}
22
+ */
23
+ waitForIdle({ timeoutMs }?: {
24
+ timeoutMs?: number;
25
+ }): Promise<void>;
13
26
  /**
14
27
  * @param {object} args
15
28
  * @param {boolean} [args.cacheResponse]
@@ -67,6 +80,8 @@ export default class ApiMakerWebsocketRequestClient {
67
80
  */
68
81
  rejectPendingRequests(error: Error): void;
69
82
  /** @returns {void} */
83
+ resolveIdleWaitersIfIdle(): void;
84
+ /** @returns {void} */
70
85
  reset(): void;
71
86
  }
72
87
  //# sourceMappingURL=websocket-request-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-request-client.d.ts","sourceRoot":"/src/","sources":["websocket-request-client.js"],"names":[],"mappings":"AAOA,8EAA8E;AAC9E;IACE,gDAAgD;IAChD,kBADc,8BAA8B,CAO3C;IAED,sBAAsB;IACtB,uBADc,IAAI,CAQjB;IAIC,yBAAyB;IACzB,uBAA0B;IAC1B,oBAAyB;IACzB,iCAAsC;IACtC,kBAAuB;IACvB,0BAA8B;IAGhC;;;;;;;;;OASG;IACH,2EARG;QAAuB,aAAa,GAA5B,OAAO;QACoB,MAAM,GAAjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;QACY,KAAK,GAApC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;QACqB,UAAU,GAAtD,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI;QACQ,UAAU,GAAtD,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI;QACV,OAAO,EAAjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAmDxC;IAED,qBAAqB;IACrB,sBADc,GAAG,CAmBhB;IAZG,kBAQC;IAML,+BAA+B;IAC/B,uBADc,OAAO,CAAC,IAAI,CAAC,CAa1B;IAED,sBAAsB;IACtB,iCADc,IAAI,CAMjB;IAJC,uCAGE;IAFA,sDAA8C;IAC9C,uDAA4C;IAIhD;;;OAGG;IACH,8BAHW,MAAM,GACJ,MAAM,CAQlB;IAED;;;OAGG;IACH,8BAHW,MAAM,GACJ,IAAI,CAqDhB;IAED,sBAAsB;IACtB,wBADc,IAAI,CAOjB;IAED,sBAAsB;IACtB,mBADc,IAAI,CAMjB;IAED,sBAAsB;IACtB,sBADc,IAAI,CAmBjB;IAED,sBAAsB;IACtB,kBADc,IAAI,CAgBjB;IAED;;;OAGG;IACH,aAAc,MAHH,MAAM,CAAC,MAAM,EAAE,GAAG,CAGX,KAFL,IAAI,CA0ChB;IAED;;;OAGG;IACH,6BAHW,KAAK,GACH,IAAI,CAWhB;IAED,sBAAsB;IACtB,SADc,IAAI,CAmBjB;CACF"}
1
+ {"version":3,"file":"websocket-request-client.d.ts","sourceRoot":"/src/","sources":["websocket-request-client.js"],"names":[],"mappings":"AAOA,8EAA8E;AAC9E;IAGE,gDAAgD;IAChD,kBADc,8BAA8B,CAO3C;IAED,sBAAsB;IACtB,uBADc,IAAI,CAQjB;IAnBD,mBAAgB;IAuBd,yBAAyB;IACzB,uBAA0B;IAC1B,oBAAyB;IACzB,iCAAsC;IACtC,kBAAuB;IACvB,0BAA8B;IAGhC,wBAAwB;IACxB,wBADc,MAAM,CAGnB;IAED;;;;;;OAMG;IACH,4BAHG;QAAsB,SAAS,GAAvB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAqBzB;IAED;;;;;;;;;OASG;IACH,2EARG;QAAuB,aAAa,GAA5B,OAAO;QACoB,MAAM,GAAjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;QACY,KAAK,GAApC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;QACqB,UAAU,GAAtD,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI;QACQ,UAAU,GAAtD,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI;QACV,OAAO,EAAjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAmDxC;IAED,qBAAqB;IACrB,sBADc,GAAG,CAmBhB;IAZG,kBAQC;IAML,+BAA+B;IAC/B,uBADc,OAAO,CAAC,IAAI,CAAC,CAa1B;IAED,sBAAsB;IACtB,iCADc,IAAI,CAMjB;IAJC,uCAGE;IAFA,sDAA8C;IAC9C,uDAA4C;IAIhD;;;OAGG;IACH,8BAHW,MAAM,GACJ,MAAM,CAQlB;IAED;;;OAGG;IACH,8BAHW,MAAM,GACJ,IAAI,CAqDhB;IAED,sBAAsB;IACtB,wBADc,IAAI,CAOjB;IAED,sBAAsB;IACtB,mBADc,IAAI,CAMjB;IAED,sBAAsB;IACtB,sBADc,IAAI,CAmBjB;IAED,sBAAsB;IACtB,kBADc,IAAI,CAgBjB;IAED;;;OAGG;IACH,aAAc,MAHH,MAAM,CAAC,MAAM,EAAE,GAAG,CAGX,KAFL,IAAI,CA6ChB;IAED;;;OAGG;IACH,6BAHW,KAAK,GACH,IAAI,CAahB;IAED,sBAAsB;IACtB,4BADc,IAAI,CAUjB;IAED,sBAAsB;IACtB,SADc,IAAI,CAmBjB;CACF"}
@@ -5,6 +5,7 @@ const logger = new Logger({ name: "ApiMaker / WebsocketRequestClient" });
5
5
  const shared = {};
6
6
  /** Shared websocket request client for ApiMaker command/service execution. */
7
7
  export default class ApiMakerWebsocketRequestClient {
8
+ idleWaiters = [];
8
9
  /** @returns {ApiMakerWebsocketRequestClient} */
9
10
  static current() {
10
11
  if (!shared.currentApiMakerWebsocketRequestClient) {
@@ -29,6 +30,35 @@ export default class ApiMakerWebsocketRequestClient {
29
30
  this.responseCache = {};
30
31
  this.subscriptionState = "new";
31
32
  }
33
+ /** @returns {number} */
34
+ pendingRequestsCount() {
35
+ return Object.keys(this.pendingRequests).length;
36
+ }
37
+ /**
38
+ * Waits for all in-flight websocket requests to complete.
39
+ *
40
+ * @param {object} [args]
41
+ * @param {number} [args.timeoutMs]
42
+ * @returns {Promise<void>}
43
+ */
44
+ waitForIdle({ timeoutMs = 5000 } = {}) {
45
+ if (this.pendingRequestsCount() == 0) {
46
+ return Promise.resolve();
47
+ }
48
+ return new Promise((resolve, reject) => {
49
+ const timeout = setTimeout(() => {
50
+ this.idleWaiters = this.idleWaiters.filter((idleWaiter) => idleWaiter.reject != reject);
51
+ reject(new Error(`Timed out while waiting for websocket requests to finish. Pending requests: ${this.pendingRequestsCount()}`));
52
+ }, timeoutMs);
53
+ this.idleWaiters.push({
54
+ reject,
55
+ resolve: () => {
56
+ clearTimeout(timeout);
57
+ resolve();
58
+ }
59
+ });
60
+ });
61
+ }
32
62
  /**
33
63
  * @param {object} args
34
64
  * @param {boolean} [args.cacheResponse]
@@ -251,14 +281,17 @@ export default class ApiMakerWebsocketRequestClient {
251
281
  this.responseCache[pendingRequest.fingerprint] = data.response;
252
282
  }
253
283
  pendingRequest.resolve(data.response);
284
+ this.resolveIdleWaitersIfIdle();
254
285
  }
255
286
  else if (data.type == "api_maker_request_error") {
256
287
  delete this.pendingRequests[data.request_id];
257
288
  pendingRequest.reject(new CustomError("Websocket request failed", { response: data.response }));
289
+ this.resolveIdleWaitersIfIdle();
258
290
  }
259
291
  else {
260
292
  delete this.pendingRequests[data.request_id];
261
293
  pendingRequest.reject(new Error(`Unknown websocket request response type: ${data.type}`));
294
+ this.resolveIdleWaitersIfIdle();
262
295
  }
263
296
  };
264
297
  /**
@@ -272,6 +305,16 @@ export default class ApiMakerWebsocketRequestClient {
272
305
  Object.values(pendingRequests).forEach((pendingRequest) => {
273
306
  queueMicrotask(() => pendingRequest.reject(error));
274
307
  });
308
+ this.resolveIdleWaitersIfIdle();
309
+ }
310
+ /** @returns {void} */
311
+ resolveIdleWaitersIfIdle() {
312
+ if (this.pendingRequestsCount() > 0 || this.idleWaiters.length == 0) {
313
+ return;
314
+ }
315
+ const idleWaiters = this.idleWaiters;
316
+ this.idleWaiters = [];
317
+ idleWaiters.forEach((idleWaiter) => idleWaiter.resolve());
275
318
  }
276
319
  /** @returns {void} */
277
320
  reset() {
@@ -291,4 +334,4 @@ export default class ApiMakerWebsocketRequestClient {
291
334
  this.subscriptionReadyPromise = undefined;
292
335
  }
293
336
  }
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXJlcXVlc3QtY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ3ZWJzb2NrZXQtcmVxdWVzdC1jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFFckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsbUNBQW1DLEVBQUMsQ0FBQyxDQUFBO0FBQ3RFLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtBQUVqQiw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE9BQU8sT0FBTyw4QkFBOEI7SUFDakQsZ0RBQWdEO0lBQ2hELE1BQU0sQ0FBQyxPQUFPO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxxQ0FBcUMsR0FBRyxJQUFJLDhCQUE4QixFQUFFLENBQUE7UUFDckYsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLHFDQUFxQyxDQUFBO0lBQ3JELENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsTUFBTSxDQUFDLFlBQVk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDO1lBQ2xELE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BELE9BQU8sTUFBTSxDQUFDLHFDQUFxQyxDQUFBO0lBQ3JELENBQUM7SUFFRCxtQkFBbUI7SUFDbkI7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFBO1FBQ3pCLElBQUksQ0FBQyw0QkFBNEIsR0FB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QywrQkFBK0IsR0FBRyxTQUFTLENBQUE7UUFDaEQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLFNBQVMsQ0FBQTtRQUMvQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFBO0lBQzNDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDdXN0b21FcnJvciBmcm9tIFwiLi9jdXN0b20tZXJyb3IuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi9sb2dnZXIuanNcIlxuaW1wb3J0IGNoYW5uZWxzQ29uc3VtZXIgZnJvbSBcIi4vY2hhbm5lbHMtY29uc3VtZXIuanNcIlxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHtuYW1lOiBcIkFwaU1ha2VyIC8gV2Vic29ja2V0UmVxdWVzdENsaWVudFwifSlcbmNvbnN0IHNoYXJlZCA9IHt9XG5cbi8qKiBTaGFyZWQgd2Vic29ja2V0IHJlcXVlc3QgY2xpZW50IGZvciBBcGlNYWtlciBjb21tYW5kL3NlcnZpY2UgZXhlY3V0aW9uLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50IHtcbiAgLyoqIEByZXR1cm5zIHtBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnR9ICovXG4gIHN0YXRpYyBjdXJyZW50ICgpIHtcbiAgICBpZiAoIXNoYXJlZC5jdXJyZW50QXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50KSB7XG4gICAgICBzaGFyZWQuY3VycmVudEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudCA9IG5ldyBBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQoKVxuICAgIH1cblxuICAgIHJldHVybiBzaGFyZWQuY3VycmVudEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBzdGF0aWMgcmVzZXRDdXJyZW50ICgpIHtcbiAgICBpZiAoIXNoYXJlZC5jdXJyZW50QXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzaGFyZWQuY3VycmVudEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudC5yZXNldCgpXG4gICAgZGVsZXRlIHNoYXJlZC5jdXJyZW50QXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50XG4gIH1cblxuICAvKiogQ29uc3RydWN0b3IuICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0SWQgPSAxXG4gICAgdGhpcy5za2lwUmVjb25uZWN0ID0gZmFsc2VcbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IHt9XG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHNCeUZpbmdlcnByaW50ID0ge31cbiAgICB0aGlzLnJlc3BvbnNlQ2FjaGUgPSB7fVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPSBcIm5ld1wiXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5jYWNoZVJlc3BvbnNlXVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthcmdzLmdsb2JhbF1cbiAgICogQHBhcmFtIHsodmFsdWU6IHN0cmluZykgPT4gdm9pZH0gW2FyZ3Mub25Mb2ddXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSBbYXJncy5vblByb2dyZXNzXVxuICAgKiBAcGFyYW0geyh2YWx1ZTogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gW2FyZ3Mub25SZWNlaXZlZF1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLnJlcXVlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59XG4gICAqL1xuICBwZXJmb3JtICh7Y2FjaGVSZXNwb25zZSwgZ2xvYmFsLCBvbkxvZywgb25Qcm9ncmVzcywgb25SZWNlaXZlZCwgcmVxdWVzdH0pIHtcbiAgICBjb25zdCBmaW5nZXJwcmludCA9IEpTT04uc3RyaW5naWZ5KHtnbG9iYWwsIHJlcXVlc3R9KVxuXG4gICAgaWYgKGNhY2hlUmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZUNhY2hlW2ZpbmdlcnByaW50XSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnJlc3BvbnNlQ2FjaGVbZmluZ2VycHJpbnRdKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0c0J5RmluZ2VycHJpbnRbZmluZ2VycHJpbnRdKSB7XG4gICAgICBjb25zdCBwZW5kaW5nUmVxdWVzdERhdGEgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c0J5RmluZ2VycHJpbnRbZmluZ2VycHJpbnRdXG4gICAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3BlbmRpbmdSZXF1ZXN0RGF0YS5yZXF1ZXN0SWRdXG5cbiAgICAgIGlmIChvbkxvZykgcGVuZGluZ1JlcXVlc3Q/Lm9uTG9nQ2FsbGJhY2tzLnB1c2gob25Mb2cpXG4gICAgICBpZiAob25Qcm9ncmVzcykgcGVuZGluZ1JlcXVlc3Q/Lm9uUHJvZ3Jlc3NDYWxsYmFja3MucHVzaChvblByb2dyZXNzKVxuICAgICAgaWYgKG9uUmVjZWl2ZWQpIHBlbmRpbmdSZXF1ZXN0Py5vblJlY2VpdmVkQ2FsbGJhY2tzLnB1c2gob25SZWNlaXZlZClcblxuICAgICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0RGF0YS5wcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuY3VycmVudFJlcXVlc3RJZFxuICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdElkICs9IDFcblxuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdElkXSA9IHtcbiAgICAgICAgY2FjaGVSZXNwb25zZSxcbiAgICAgICAgZGVsaXZlcnlTdGF0ZTogXCJxdWV1ZWRcIixcbiAgICAgICAgZmluZ2VycHJpbnQsXG4gICAgICAgIGxhc3RDb21tYW5kRXZlbnRTZXF1ZW5jZTogMCxcbiAgICAgICAgb25Mb2dDYWxsYmFja3M6IG9uTG9nID8gW29uTG9nXSA6IFtdLFxuICAgICAgICBvblByb2dyZXNzQ2FsbGJhY2tzOiBvblByb2dyZXNzID8gW29uUHJvZ3Jlc3NdIDogW10sXG4gICAgICAgIG9uUmVjZWl2ZWRDYWxsYmFja3M6IG9uUmVjZWl2ZWQgPyBbb25SZWNlaXZlZF0gOiBbXSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXF1ZXN0VWlkOiB0aGlzLmdlbmVyYXRlUmVxdWVzdFVpZChyZXF1ZXN0SWQpLFxuICAgICAgICByZWplY3QsXG4gICAgICAgIHJlc29sdmVcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZW5kUGVuZGluZ1JlcXVlc3QocmVxdWVzdElkKVxuICAgIH0pXG5cbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0c0J5RmluZ2VycHJpbnRbZmluZ2VycHJpbnRdID0ge3Byb21pc2UsIHJlcXVlc3RJZDogdGhpcy5jdXJyZW50UmVxdWVzdElkIC0gMX1cblxuICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNCeUZpbmdlcnByaW50W2ZpbmdlcnByaW50XVxuICAgIH0sICgpID0+IHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c0J5RmluZ2VycHJpbnRbZmluZ2VycHJpbnRdXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKiogQHJldHVybnMge2FueX0gKi9cbiAgZW5zdXJlU3Vic2NyaXB0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJDcmVhdGluZyB3ZWJzb2NrZXQgcmVxdWVzdCBzdWJzY3JpcHRpb25cIilcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPSBcImNvbm5lY3RpbmdcIlxuICAgICAgdGhpcy5yZXNldFN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSgpXG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gY2hhbm5lbHNDb25zdW1lcigpLnN1YnNjcmlwdGlvbnMuY3JlYXRlKFxuICAgICAgICB7Y2hhbm5lbDogXCJBcGlNYWtlcjo6UmVxdWVzdHNDaGFubmVsXCJ9LFxuICAgICAgICB7XG4gICAgICAgICAgY29ubmVjdGVkOiB0aGlzLm9uQ29ubmVjdGVkLFxuICAgICAgICAgIGRpc2Nvbm5lY3RlZDogdGhpcy5vbkRpc2Nvbm5lY3RlZCxcbiAgICAgICAgICByZWNlaXZlZDogdGhpcy5vblJlY2VpdmVkLFxuICAgICAgICAgIHJlamVjdGVkOiB0aGlzLm9uUmVqZWN0ZWRcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICB3YWl0Rm9yU3Vic2NyaXB0aW9uICgpIHtcbiAgICB0aGlzLmVuc3VyZVN1YnNjcmlwdGlvbigpXG5cbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9PSBcImNvbm5lY3RlZFwiKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlKSB7XG4gICAgICB0aGlzLnJlc2V0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlKClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25SZWFkeVByb21pc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgcmVzZXRTdWJzY3JpcHRpb25SZWFkeVByb21pc2UgKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlU3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlID0gcmVzb2x2ZVxuICAgICAgdGhpcy5yZWplY3RTdWJzY3JpcHRpb25SZWFkeVByb21pc2UgPSByZWplY3RcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXF1ZXN0SWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdlbmVyYXRlUmVxdWVzdFVpZCAocmVxdWVzdElkKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuY3J5cHRvPy5yYW5kb21VVUlEKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGBhcGktbWFrZXItcmVxdWVzdC0ke0RhdGUubm93KCl9LSR7cmVxdWVzdElkfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVxdWVzdElkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2VuZFBlbmRpbmdSZXF1ZXN0IChyZXF1ZXN0SWQpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3JlcXVlc3RJZF1cblxuICAgIGlmICghcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChwZW5kaW5nUmVxdWVzdC5kZWxpdmVyeVN0YXRlICE9IFwicXVldWVkXCIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmdSZXF1ZXN0LmRlbGl2ZXJ5U3RhdGUgPSBcIndhaXRpbmdfZm9yX2Nvbm5lY3Rpb25cIlxuXG4gICAgdGhpcy53YWl0Rm9yU3Vic2NyaXB0aW9uKClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgbGF0ZXN0UGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdXG5cbiAgICAgICAgaWYgKCFsYXRlc3RQZW5kaW5nUmVxdWVzdCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhdGVzdFBlbmRpbmdSZXF1ZXN0LmRlbGl2ZXJ5U3RhdGUgIT0gXCJ3YWl0aW5nX2Zvcl9jb25uZWN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGxhdGVzdFBlbmRpbmdSZXF1ZXN0LmRlbGl2ZXJ5U3RhdGUgPSBcInNlbnRcIlxuXG4gICAgICAgIHRoaXMuZW5zdXJlU3Vic2NyaXB0aW9uKCkucGVyZm9ybShcImV4ZWN1dGVcIiwge1xuICAgICAgICAgIGNhY2hlX3Jlc3BvbnNlOiBsYXRlc3RQZW5kaW5nUmVxdWVzdC5jYWNoZVJlc3BvbnNlLFxuICAgICAgICAgIGdsb2JhbDogbGF0ZXN0UGVuZGluZ1JlcXVlc3QuZ2xvYmFsLFxuICAgICAgICAgIGxhc3RfY29tbWFuZF9ldmVudF9zZXF1ZW5jZTogbGF0ZXN0UGVuZGluZ1JlcXVlc3QubGFzdENvbW1hbmRFdmVudFNlcXVlbmNlLFxuICAgICAgICAgIHJlcXVlc3Q6IGxhdGVzdFBlbmRpbmdSZXF1ZXN0LnJlcXVlc3QsXG4gICAgICAgICAgcmVxdWVzdF9pZDogcmVxdWVzdElkLFxuICAgICAgICAgIHJlcXVlc3RfdWlkOiBsYXRlc3RQZW5kaW5nUmVxdWVzdC5yZXF1ZXN0VWlkXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBsYXRlc3RQZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3JlcXVlc3RJZF1cblxuICAgICAgICBpZiAoIWxhdGVzdFBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdElkXVxuICAgICAgICAgIGxhdGVzdFBlbmRpbmdSZXF1ZXN0LnJlamVjdChlcnJvcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGxhdGVzdFBlbmRpbmdSZXF1ZXN0LmRlbGl2ZXJ5U3RhdGUgPSBcInF1ZXVlZFwiXG4gICAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICByZXNlbmRRdWV1ZWRSZXF1ZXN0cyAoKSB7XG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5wZW5kaW5nUmVxdWVzdHMpLmZvckVhY2goKFtyZXF1ZXN0SWQsIHBlbmRpbmdSZXF1ZXN0XSkgPT4ge1xuICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0LmRlbGl2ZXJ5U3RhdGUgPT0gXCJxdWV1ZWRcIikge1xuICAgICAgICB0aGlzLnNlbmRQZW5kaW5nUmVxdWVzdChwYXJzZUludChyZXF1ZXN0SWQsIDEwKSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvbkNvbm5lY3RlZCA9ICgpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJXZWJzb2NrZXQgcmVxdWVzdCBzdWJzY3JpcHRpb24gY29ubmVjdGVkXCIpXG4gICAgdGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9IFwiY29ubmVjdGVkXCJcbiAgICB0aGlzLnJlc29sdmVTdWJzY3JpcHRpb25SZWFkeVByb21pc2U/LigpXG4gICAgdGhpcy5yZXNlbmRRdWV1ZWRSZXF1ZXN0cygpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uRGlzY29ubmVjdGVkID0gKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIldlYnNvY2tldCByZXF1ZXN0IHN1YnNjcmlwdGlvbiBkaXNjb25uZWN0ZWRcIilcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGxcblxuICAgIGlmICh0aGlzLnNraXBSZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPSBcInJlc2V0XCJcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIE9iamVjdC52YWx1ZXModGhpcy5wZW5kaW5nUmVxdWVzdHMpLmZvckVhY2goKHBlbmRpbmdSZXF1ZXN0KSA9PiB7XG4gICAgICBpZiAocGVuZGluZ1JlcXVlc3QuZGVsaXZlcnlTdGF0ZSAhPSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0LmRlbGl2ZXJ5U3RhdGUgPSBcInF1ZXVlZFwiXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPSBcImRpc2Nvbm5lY3RlZFwiXG4gICAgdGhpcy5yZXNldFN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSgpXG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpcHRpb24oKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvblJlamVjdGVkID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnNraXBSZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPSBcInJlc2V0XCJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgcmVxdWVzdCBzdWJzY3JpcHRpb24gd2FzIHJlamVjdGVkXCIpXG5cbiAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgdGhpcy5yZWplY3RQZW5kaW5nUmVxdWVzdHMoZXJyb3IpXG4gICAgdGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9IFwicmVqZWN0ZWRcIlxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbFxuICAgIHRoaXMucmVqZWN0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlPy4oZXJyb3IpXG4gICAgdGhpcy5yZXNldFN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBkYXRhXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25SZWNlaXZlZCA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tkYXRhLnJlcXVlc3RfaWRdXG5cbiAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICBsb2dnZXIuZGVidWcoKCkgPT4gW1wiSWdub3Jpbmcgd2Vic29ja2V0IHJlc3BvbnNlIHdpdGhvdXQgYSBwZW5kaW5nIHJlcXVlc3RcIiwge2RhdGF9XSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChkYXRhLmNvbW1hbmRfZXZlbnRfc2VxdWVuY2UgJiYgZGF0YS5jb21tYW5kX2V2ZW50X3NlcXVlbmNlID4gcGVuZGluZ1JlcXVlc3QubGFzdENvbW1hbmRFdmVudFNlcXVlbmNlKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5sYXN0Q29tbWFuZEV2ZW50U2VxdWVuY2UgPSBkYXRhLmNvbW1hbmRfZXZlbnRfc2VxdWVuY2VcbiAgICB9XG5cbiAgICBpZiAoZGF0YS50eXBlID09IFwiYXBpX21ha2VyX2NvbW1hbmRfbG9nXCIpIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uTG9nQ2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayhkYXRhLm1lc3NhZ2UpKVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwiYXBpX21ha2VyX2NvbW1hbmRfcHJvZ3Jlc3NcIikge1xuICAgICAgY29uc3QgcHJvZ3Jlc3NEYXRhID0ge1xuICAgICAgICBjb3VudDogZGF0YS5jb3VudCxcbiAgICAgICAgcHJvZ3Jlc3M6IGRhdGEucHJvZ3Jlc3MsXG4gICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsXG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3NDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKHByb2dyZXNzRGF0YSkpXG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJhcGlfbWFrZXJfcmVxdWVzdF9yZWNlaXZlZFwiKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5kZWxpdmVyeVN0YXRlID0gXCJyZWNlaXZlZFwiXG4gICAgICBwZW5kaW5nUmVxdWVzdC5vblJlY2VpdmVkQ2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayhkYXRhKSlcbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcImFwaV9tYWtlcl9yZXF1ZXN0X3Jlc3BvbnNlXCIpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tkYXRhLnJlcXVlc3RfaWRdXG5cbiAgICAgIGlmIChwZW5kaW5nUmVxdWVzdC5jYWNoZVJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VDYWNoZVtwZW5kaW5nUmVxdWVzdC5maW5nZXJwcmludF0gPSBkYXRhLnJlc3BvbnNlXG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdSZXF1ZXN0LnJlc29sdmUoZGF0YS5yZXNwb25zZSlcbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcImFwaV9tYWtlcl9yZXF1ZXN0X2Vycm9yXCIpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tkYXRhLnJlcXVlc3RfaWRdXG4gICAgICBwZW5kaW5nUmVxdWVzdC5yZWplY3QobmV3IEN1c3RvbUVycm9yKFwiV2Vic29ja2V0IHJlcXVlc3QgZmFpbGVkXCIsIHtyZXNwb25zZTogZGF0YS5yZXNwb25zZX0pKVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbZGF0YS5yZXF1ZXN0X2lkXVxuICAgICAgcGVuZGluZ1JlcXVlc3QucmVqZWN0KG5ldyBFcnJvcihgVW5rbm93biB3ZWJzb2NrZXQgcmVxdWVzdCByZXNwb25zZSB0eXBlOiAke2RhdGEudHlwZX1gKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWplY3RQZW5kaW5nUmVxdWVzdHMgKGVycm9yKSB7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3RzID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNcblxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0ge31cbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0c0J5RmluZ2VycHJpbnQgPSB7fVxuXG4gICAgT2JqZWN0LnZhbHVlcyhwZW5kaW5nUmVxdWVzdHMpLmZvckVhY2goKHBlbmRpbmdSZXF1ZXN0KSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBwZW5kaW5nUmVxdWVzdC5yZWplY3QoZXJyb3IpKVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHJlc2V0ICgpIHtcbiAgICBjb25zdCByZXNldEVycm9yID0gbmV3IEVycm9yKFwiV2Vic29ja2V0IHJlcXVlc3QgY2xpZW50IHdhcyByZXNldFwiKVxuXG4gICAgdGhpcy5za2lwUmVjb25uZWN0ID0gdHJ1ZVxuICAgIHRoaXMucmVqZWN0UGVuZGluZ1JlcXVlc3RzKHJlc2V0RXJyb3IpXG4gICAgdGhpcy5yZXNwb25zZUNhY2hlID0ge31cbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0SWQgPSAxXG4gICAgdGhpcy5yZWplY3RTdWJzY3JpcHRpb25SZWFkeVByb21pc2U/LihyZXNldEVycm9yKVxuXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbFxuICAgIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPSBcIm5ld1wiXG4gICAgdGhpcy5yZXNvbHZlU3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5yZWplY3RTdWJzY3JpcHRpb25SZWFkeVByb21pc2UgPSB1bmRlZmluZWRcbiAgICB0aGlzLnN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSA9IHVuZGVmaW5lZFxuICB9XG59XG4iXX0=
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXJlcXVlc3QtY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ3ZWJzb2NrZXQtcmVxdWVzdC1jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFFckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsbUNBQW1DLEVBQUMsQ0FBQyxDQUFBO0FBQ3RFLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtBQUVqQiw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE9BQU8sT0FBTyw4QkFBOEI7SUFDakQsV0FBVyxHQUFHLEVBQUUsQ0FBQTtJQUVoQixnREFBZ0Q7SUFDaEQsTUFBTSxDQUFDLE9BQU87UUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxDQUFDLHFDQUFxQyxHQUFHLElBQUksOEJBQThCLEVBQUUsQ0FBQTtRQUNyRixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMscUNBQXFDLENBQUE7SUFDckQsQ0FBQztJQUVELHNCQUFzQjtJQUN0QixNQUFNLENBQUMsWUFBWTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxFQUFFLENBQUM7WUFDbEQsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLENBQUMscUNBQXFDLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDcEQsT0FBTyxNQUFNLENBQUMscUNBQXFDLENBQUE7SUFDckQsQ0FBQztJQUVELG1CQUFtQjtJQUNuQjtRQUNFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUE7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7UUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUE7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Q0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRWpELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2pDLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtRQUN4QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFBO1FBQzlCLElBQUksQ0FBQywrQkFBK0IsR0FBRyxTQUFTLENBQUE7UUFDaEQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLFNBQVMsQ0FBQTtRQUMvQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFBO0lBQzNDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDdXN0b21FcnJvciBmcm9tIFwiLi9jdXN0b20tZXJyb3IuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi9sb2dnZXIuanNcIlxuaW1wb3J0IGNoYW5uZWxzQ29uc3VtZXIgZnJvbSBcIi4vY2hhbm5lbHMtY29uc3VtZXIuanNcIlxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHtuYW1lOiBcIkFwaU1ha2VyIC8gV2Vic29ja2V0UmVxdWVzdENsaWVudFwifSlcbmNvbnN0IHNoYXJlZCA9IHt9XG5cbi8qKiBTaGFyZWQgd2Vic29ja2V0IHJlcXVlc3QgY2xpZW50IGZvciBBcGlNYWtlciBjb21tYW5kL3NlcnZpY2UgZXhlY3V0aW9uLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50IHtcbiAgaWRsZVdhaXRlcnMgPSBbXVxuXG4gIC8qKiBAcmV0dXJucyB7QXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50fSAqL1xuICBzdGF0aWMgY3VycmVudCAoKSB7XG4gICAgaWYgKCFzaGFyZWQuY3VycmVudEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudCkge1xuICAgICAgc2hhcmVkLmN1cnJlbnRBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQgPSBuZXcgQXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50KClcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhcmVkLmN1cnJlbnRBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgc3RhdGljIHJlc2V0Q3VycmVudCAoKSB7XG4gICAgaWYgKCFzaGFyZWQuY3VycmVudEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2hhcmVkLmN1cnJlbnRBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQucmVzZXQoKVxuICAgIGRlbGV0ZSBzaGFyZWQuY3VycmVudEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudFxuICB9XG5cbiAgLyoqIENvbnN0cnVjdG9yLiAqL1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5jdXJyZW50UmVxdWVzdElkID0gMVxuICAgIHRoaXMuc2tpcFJlY29ubmVjdCA9IGZhbHNlXG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSB7fVxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludCA9IHt9XG4gICAgdGhpcy5yZXNwb25zZUNhY2hlID0ge31cbiAgICB0aGlzLnN1YnNjcmlwdGlvblN0YXRlID0gXCJuZXdcIlxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gIHBlbmRpbmdSZXF1ZXN0c0NvdW50ICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wZW5kaW5nUmVxdWVzdHMpLmxlbmd0aFxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhbGwgaW4tZmxpZ2h0IHdlYnNvY2tldCByZXF1ZXN0cyB0byBjb21wbGV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudGltZW91dE1zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHdhaXRGb3JJZGxlICh7dGltZW91dE1zID0gNTAwMH0gPSB7fSkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0c0NvdW50KCkgPT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pZGxlV2FpdGVycyA9IHRoaXMuaWRsZVdhaXRlcnMuZmlsdGVyKChpZGxlV2FpdGVyKSA9PiBpZGxlV2FpdGVyLnJlamVjdCAhPSByZWplY3QpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB3ZWJzb2NrZXQgcmVxdWVzdHMgdG8gZmluaXNoLiBQZW5kaW5nIHJlcXVlc3RzOiAke3RoaXMucGVuZGluZ1JlcXVlc3RzQ291bnQoKX1gKSlcbiAgICAgIH0sIHRpbWVvdXRNcylcblxuICAgICAgdGhpcy5pZGxlV2FpdGVycy5wdXNoKHtcbiAgICAgICAgcmVqZWN0LFxuICAgICAgICByZXNvbHZlOiAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmNhY2hlUmVzcG9uc2VdXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2FyZ3MuZ2xvYmFsXVxuICAgKiBAcGFyYW0geyh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkfSBbYXJncy5vbkxvZ11cbiAgICogQHBhcmFtIHsodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSBbYXJncy5vblJlY2VpdmVkXVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucmVxdWVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn1cbiAgICovXG4gIHBlcmZvcm0gKHtjYWNoZVJlc3BvbnNlLCBnbG9iYWwsIG9uTG9nLCBvblByb2dyZXNzLCBvblJlY2VpdmVkLCByZXF1ZXN0fSkge1xuICAgIGNvbnN0IGZpbmdlcnByaW50ID0gSlNPTi5zdHJpbmdpZnkoe2dsb2JhbCwgcmVxdWVzdH0pXG5cbiAgICBpZiAoY2FjaGVSZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlQ2FjaGVbZmluZ2VycHJpbnRdKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMucmVzcG9uc2VDYWNoZVtmaW5nZXJwcmludF0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludFtmaW5nZXJwcmludF0pIHtcbiAgICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0RGF0YSA9IHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludFtmaW5nZXJwcmludF1cbiAgICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbcGVuZGluZ1JlcXVlc3REYXRhLnJlcXVlc3RJZF1cblxuICAgICAgaWYgKG9uTG9nKSBwZW5kaW5nUmVxdWVzdD8ub25Mb2dDYWxsYmFja3MucHVzaChvbkxvZylcbiAgICAgIGlmIChvblByb2dyZXNzKSBwZW5kaW5nUmVxdWVzdD8ub25Qcm9ncmVzc0NhbGxiYWNrcy5wdXNoKG9uUHJvZ3Jlc3MpXG4gICAgICBpZiAob25SZWNlaXZlZCkgcGVuZGluZ1JlcXVlc3Q/Lm9uUmVjZWl2ZWRDYWxsYmFja3MucHVzaChvblJlY2VpdmVkKVxuXG4gICAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3REYXRhLnByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5jdXJyZW50UmVxdWVzdElkXG4gICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0SWQgKz0gMVxuXG4gICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdID0ge1xuICAgICAgICBjYWNoZVJlc3BvbnNlLFxuICAgICAgICBkZWxpdmVyeVN0YXRlOiBcInF1ZXVlZFwiLFxuICAgICAgICBmaW5nZXJwcmludCxcbiAgICAgICAgbGFzdENvbW1hbmRFdmVudFNlcXVlbmNlOiAwLFxuICAgICAgICBvbkxvZ0NhbGxiYWNrczogb25Mb2cgPyBbb25Mb2ddIDogW10sXG4gICAgICAgIG9uUHJvZ3Jlc3NDYWxsYmFja3M6IG9uUHJvZ3Jlc3MgPyBbb25Qcm9ncmVzc10gOiBbXSxcbiAgICAgICAgb25SZWNlaXZlZENhbGxiYWNrczogb25SZWNlaXZlZCA/IFtvblJlY2VpdmVkXSA6IFtdLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlcXVlc3RVaWQ6IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0VWlkKHJlcXVlc3RJZCksXG4gICAgICAgIHJlamVjdCxcbiAgICAgICAgcmVzb2x2ZVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbmRQZW5kaW5nUmVxdWVzdChyZXF1ZXN0SWQpXG4gICAgfSlcblxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludFtmaW5nZXJwcmludF0gPSB7cHJvbWlzZSwgcmVxdWVzdElkOiB0aGlzLmN1cnJlbnRSZXF1ZXN0SWQgLSAxfVxuXG4gICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c0J5RmluZ2VycHJpbnRbZmluZ2VycHJpbnRdXG4gICAgfSwgKCkgPT4ge1xuICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludFtmaW5nZXJwcmludF1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7YW55fSAqL1xuICBlbnN1cmVTdWJzY3JpcHRpb24gKCkge1xuICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIkNyZWF0aW5nIHdlYnNvY2tldCByZXF1ZXN0IHN1YnNjcmlwdGlvblwiKVxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9IFwiY29ubmVjdGluZ1wiXG4gICAgICB0aGlzLnJlc2V0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlKClcblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBjaGFubmVsc0NvbnN1bWVyKCkuc3Vic2NyaXB0aW9ucy5jcmVhdGUoXG4gICAgICAgIHtjaGFubmVsOiBcIkFwaU1ha2VyOjpSZXF1ZXN0c0NoYW5uZWxcIn0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb25uZWN0ZWQ6IHRoaXMub25Db25uZWN0ZWQsXG4gICAgICAgICAgZGlzY29ubmVjdGVkOiB0aGlzLm9uRGlzY29ubmVjdGVkLFxuICAgICAgICAgIHJlY2VpdmVkOiB0aGlzLm9uUmVjZWl2ZWQsXG4gICAgICAgICAgcmVqZWN0ZWQ6IHRoaXMub25SZWplY3RlZFxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIHdhaXRGb3JTdWJzY3JpcHRpb24gKCkge1xuICAgIHRoaXMuZW5zdXJlU3Vic2NyaXB0aW9uKClcblxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblN0YXRlID09IFwiY29ubmVjdGVkXCIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25SZWFkeVByb21pc2UpIHtcbiAgICAgIHRoaXMucmVzZXRTdWJzY3JpcHRpb25SZWFkeVByb21pc2UoKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICByZXNldFN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSAoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25SZWFkeVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVTdWJzY3JpcHRpb25SZWFkeVByb21pc2UgPSByZXNvbHZlXG4gICAgICB0aGlzLnJlamVjdFN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSA9IHJlamVjdFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlcXVlc3RJZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2VuZXJhdGVSZXF1ZXN0VWlkIChyZXF1ZXN0SWQpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSUQpIHtcbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG5cbiAgICByZXR1cm4gYGFwaS1tYWtlci1yZXF1ZXN0LSR7RGF0ZS5ub3coKX0tJHtyZXF1ZXN0SWR9YFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXF1ZXN0SWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZW5kUGVuZGluZ1JlcXVlc3QgKHJlcXVlc3RJZCkge1xuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdElkXVxuXG4gICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHBlbmRpbmdSZXF1ZXN0LmRlbGl2ZXJ5U3RhdGUgIT0gXCJxdWV1ZWRcIikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ1JlcXVlc3QuZGVsaXZlcnlTdGF0ZSA9IFwid2FpdGluZ19mb3JfY29ubmVjdGlvblwiXG5cbiAgICB0aGlzLndhaXRGb3JTdWJzY3JpcHRpb24oKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBsYXRlc3RQZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3JlcXVlc3RJZF1cblxuICAgICAgICBpZiAoIWxhdGVzdFBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGF0ZXN0UGVuZGluZ1JlcXVlc3QuZGVsaXZlcnlTdGF0ZSAhPSBcIndhaXRpbmdfZm9yX2Nvbm5lY3Rpb25cIikge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbGF0ZXN0UGVuZGluZ1JlcXVlc3QuZGVsaXZlcnlTdGF0ZSA9IFwic2VudFwiXG5cbiAgICAgICAgdGhpcy5lbnN1cmVTdWJzY3JpcHRpb24oKS5wZXJmb3JtKFwiZXhlY3V0ZVwiLCB7XG4gICAgICAgICAgY2FjaGVfcmVzcG9uc2U6IGxhdGVzdFBlbmRpbmdSZXF1ZXN0LmNhY2hlUmVzcG9uc2UsXG4gICAgICAgICAgZ2xvYmFsOiBsYXRlc3RQZW5kaW5nUmVxdWVzdC5nbG9iYWwsXG4gICAgICAgICAgbGFzdF9jb21tYW5kX2V2ZW50X3NlcXVlbmNlOiBsYXRlc3RQZW5kaW5nUmVxdWVzdC5sYXN0Q29tbWFuZEV2ZW50U2VxdWVuY2UsXG4gICAgICAgICAgcmVxdWVzdDogbGF0ZXN0UGVuZGluZ1JlcXVlc3QucmVxdWVzdCxcbiAgICAgICAgICByZXF1ZXN0X2lkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgcmVxdWVzdF91aWQ6IGxhdGVzdFBlbmRpbmdSZXF1ZXN0LnJlcXVlc3RVaWRcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGxhdGVzdFBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdElkXVxuXG4gICAgICAgIGlmICghbGF0ZXN0UGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblN0YXRlID09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdXG4gICAgICAgICAgbGF0ZXN0UGVuZGluZ1JlcXVlc3QucmVqZWN0KGVycm9yKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbGF0ZXN0UGVuZGluZ1JlcXVlc3QuZGVsaXZlcnlTdGF0ZSA9IFwicXVldWVkXCJcbiAgICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHJlc2VuZFF1ZXVlZFJlcXVlc3RzICgpIHtcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLnBlbmRpbmdSZXF1ZXN0cykuZm9yRWFjaCgoW3JlcXVlc3RJZCwgcGVuZGluZ1JlcXVlc3RdKSA9PiB7XG4gICAgICBpZiAocGVuZGluZ1JlcXVlc3QuZGVsaXZlcnlTdGF0ZSA9PSBcInF1ZXVlZFwiKSB7XG4gICAgICAgIHRoaXMuc2VuZFBlbmRpbmdSZXF1ZXN0KHBhcnNlSW50KHJlcXVlc3RJZCwgMTApKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uQ29ubmVjdGVkID0gKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIldlYnNvY2tldCByZXF1ZXN0IHN1YnNjcmlwdGlvbiBjb25uZWN0ZWRcIilcbiAgICB0aGlzLnN1YnNjcmlwdGlvblN0YXRlID0gXCJjb25uZWN0ZWRcIlxuICAgIHRoaXMucmVzb2x2ZVN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZT8uKClcbiAgICB0aGlzLnJlc2VuZFF1ZXVlZFJlcXVlc3RzKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb25EaXNjb25uZWN0ZWQgPSAoKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiV2Vic29ja2V0IHJlcXVlc3Qgc3Vic2NyaXB0aW9uIGRpc2Nvbm5lY3RlZFwiKVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuc2tpcFJlY29ubmVjdCkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9IFwicmVzZXRcIlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnBlbmRpbmdSZXF1ZXN0cykuZm9yRWFjaCgocGVuZGluZ1JlcXVlc3QpID0+IHtcbiAgICAgIGlmIChwZW5kaW5nUmVxdWVzdC5kZWxpdmVyeVN0YXRlICE9IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3QuZGVsaXZlcnlTdGF0ZSA9IFwicXVldWVkXCJcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9IFwiZGlzY29ubmVjdGVkXCJcbiAgICB0aGlzLnJlc2V0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlKClcbiAgICB0aGlzLmVuc3VyZVN1YnNjcmlwdGlvbigpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uUmVqZWN0ZWQgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc2tpcFJlY29ubmVjdCkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9IFwicmVzZXRcIlxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcIldlYnNvY2tldCByZXF1ZXN0IHN1YnNjcmlwdGlvbiB3YXMgcmVqZWN0ZWRcIilcblxuICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICB0aGlzLnJlamVjdFBlbmRpbmdSZXF1ZXN0cyhlcnJvcilcbiAgICB0aGlzLnN1YnNjcmlwdGlvblN0YXRlID0gXCJyZWplY3RlZFwiXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsXG4gICAgdGhpcy5yZWplY3RTdWJzY3JpcHRpb25SZWFkeVByb21pc2U/LihlcnJvcilcbiAgICB0aGlzLnJlc2V0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvblJlY2VpdmVkID0gKGRhdGEpID0+IHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW2RhdGEucmVxdWVzdF9pZF1cblxuICAgIGlmICghcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJJZ25vcmluZyB3ZWJzb2NrZXQgcmVzcG9uc2Ugd2l0aG91dCBhIHBlbmRpbmcgcmVxdWVzdFwiLCB7ZGF0YX1dKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGRhdGEuY29tbWFuZF9ldmVudF9zZXF1ZW5jZSAmJiBkYXRhLmNvbW1hbmRfZXZlbnRfc2VxdWVuY2UgPiBwZW5kaW5nUmVxdWVzdC5sYXN0Q29tbWFuZEV2ZW50U2VxdWVuY2UpIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lmxhc3RDb21tYW5kRXZlbnRTZXF1ZW5jZSA9IGRhdGEuY29tbWFuZF9ldmVudF9zZXF1ZW5jZVxuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgPT0gXCJhcGlfbWFrZXJfY29tbWFuZF9sb2dcIikge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25Mb2dDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKGRhdGEubWVzc2FnZSkpXG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJhcGlfbWFrZXJfY29tbWFuZF9wcm9ncmVzc1wiKSB7XG4gICAgICBjb25zdCBwcm9ncmVzc0RhdGEgPSB7XG4gICAgICAgIGNvdW50OiBkYXRhLmNvdW50LFxuICAgICAgICBwcm9ncmVzczogZGF0YS5wcm9ncmVzcyxcbiAgICAgICAgdG90YWw6IGRhdGEudG90YWxcbiAgICAgIH1cblxuICAgICAgcGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzc0NhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2socHJvZ3Jlc3NEYXRhKSlcbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcImFwaV9tYWtlcl9yZXF1ZXN0X3JlY2VpdmVkXCIpIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0LmRlbGl2ZXJ5U3RhdGUgPSBcInJlY2VpdmVkXCJcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUmVjZWl2ZWRDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKGRhdGEpKVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwiYXBpX21ha2VyX3JlcXVlc3RfcmVzcG9uc2VcIikge1xuICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW2RhdGEucmVxdWVzdF9pZF1cblxuICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0LmNhY2hlUmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZUNhY2hlW3BlbmRpbmdSZXF1ZXN0LmZpbmdlcnByaW50XSA9IGRhdGEucmVzcG9uc2VcbiAgICAgIH1cblxuICAgICAgcGVuZGluZ1JlcXVlc3QucmVzb2x2ZShkYXRhLnJlc3BvbnNlKVxuICAgICAgdGhpcy5yZXNvbHZlSWRsZVdhaXRlcnNJZklkbGUoKVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwiYXBpX21ha2VyX3JlcXVlc3RfZXJyb3JcIikge1xuICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW2RhdGEucmVxdWVzdF9pZF1cbiAgICAgIHBlbmRpbmdSZXF1ZXN0LnJlamVjdChuZXcgQ3VzdG9tRXJyb3IoXCJXZWJzb2NrZXQgcmVxdWVzdCBmYWlsZWRcIiwge3Jlc3BvbnNlOiBkYXRhLnJlc3BvbnNlfSkpXG4gICAgICB0aGlzLnJlc29sdmVJZGxlV2FpdGVyc0lmSWRsZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tkYXRhLnJlcXVlc3RfaWRdXG4gICAgICBwZW5kaW5nUmVxdWVzdC5yZWplY3QobmV3IEVycm9yKGBVbmtub3duIHdlYnNvY2tldCByZXF1ZXN0IHJlc3BvbnNlIHR5cGU6ICR7ZGF0YS50eXBlfWApKVxuICAgICAgdGhpcy5yZXNvbHZlSWRsZVdhaXRlcnNJZklkbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlamVjdFBlbmRpbmdSZXF1ZXN0cyAoZXJyb3IpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdHMgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1xuXG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSB7fVxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludCA9IHt9XG5cbiAgICBPYmplY3QudmFsdWVzKHBlbmRpbmdSZXF1ZXN0cykuZm9yRWFjaCgocGVuZGluZ1JlcXVlc3QpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHBlbmRpbmdSZXF1ZXN0LnJlamVjdChlcnJvcikpXG4gICAgfSlcblxuICAgIHRoaXMucmVzb2x2ZUlkbGVXYWl0ZXJzSWZJZGxlKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgcmVzb2x2ZUlkbGVXYWl0ZXJzSWZJZGxlICgpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdHNDb3VudCgpID4gMCB8fCB0aGlzLmlkbGVXYWl0ZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpZGxlV2FpdGVycyA9IHRoaXMuaWRsZVdhaXRlcnNcblxuICAgIHRoaXMuaWRsZVdhaXRlcnMgPSBbXVxuICAgIGlkbGVXYWl0ZXJzLmZvckVhY2goKGlkbGVXYWl0ZXIpID0+IGlkbGVXYWl0ZXIucmVzb2x2ZSgpKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICByZXNldCAoKSB7XG4gICAgY29uc3QgcmVzZXRFcnJvciA9IG5ldyBFcnJvcihcIldlYnNvY2tldCByZXF1ZXN0IGNsaWVudCB3YXMgcmVzZXRcIilcblxuICAgIHRoaXMuc2tpcFJlY29ubmVjdCA9IHRydWVcbiAgICB0aGlzLnJlamVjdFBlbmRpbmdSZXF1ZXN0cyhyZXNldEVycm9yKVxuICAgIHRoaXMucmVzcG9uc2VDYWNoZSA9IHt9XG4gICAgdGhpcy5jdXJyZW50UmVxdWVzdElkID0gMVxuICAgIHRoaXMucmVqZWN0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlPy4ocmVzZXRFcnJvcilcblxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGxcbiAgICB0aGlzLnN1YnNjcmlwdGlvblN0YXRlID0gXCJuZXdcIlxuICAgIHRoaXMucmVzb2x2ZVN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucmVqZWN0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zdWJzY3JpcHRpb25SZWFkeVByb21pc2UgPSB1bmRlZmluZWRcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kaspernj/api-maker",
3
3
  "type": "module",
4
- "version": "1.0.2151",
4
+ "version": "1.0.2153",
5
5
  "description": "My new module",
6
6
  "files": [
7
7
  "build/**"