@techextensor/tab-core-utility 2.2.198 → 2.2.200

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/esm2022/index.mjs +5 -1
  2. package/esm2022/lib/tab-core-utility/app/constants/api-constants.mjs +3 -3
  3. package/esm2022/lib/tab-core-utility/app/constants/common.mjs +2 -1
  4. package/esm2022/lib/tab-core-utility/app/crud/tab-blueprint.service.mjs +12 -39
  5. package/esm2022/lib/tab-core-utility/app/crud/tab-release.service.mjs +9 -20
  6. package/esm2022/lib/tab-core-utility/app/enums/common.enum.mjs +12 -1
  7. package/esm2022/lib/tab-core-utility/app/interfaces/notification.interface.mjs +50 -0
  8. package/esm2022/lib/tab-core-utility/app/interfaces/release.interface.mjs +7 -0
  9. package/esm2022/lib/tab-core-utility/app/utils/req-res.util.mjs +13 -2
  10. package/esm2022/lib/tab-core-utility/core/service/notification/notification-inbox.service.mjs +269 -0
  11. package/esm2022/lib/tab-core-utility/core/service/notification/notification-websocket.service.mjs +209 -0
  12. package/esm2022/lib/tab-core-utility/core/service/signalr/operation-tracker.service.mjs +23 -6
  13. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.mjs +53 -7
  14. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr.service.mjs +21 -5
  15. package/index.d.ts +4 -0
  16. package/lib/tab-core-utility/app/constants/api-constants.d.ts +2 -2
  17. package/lib/tab-core-utility/app/constants/common.d.ts +2 -0
  18. package/lib/tab-core-utility/app/crud/tab-blueprint.service.d.ts +0 -16
  19. package/lib/tab-core-utility/app/crud/tab-release.service.d.ts +5 -12
  20. package/lib/tab-core-utility/app/enums/common.enum.d.ts +9 -0
  21. package/lib/tab-core-utility/app/interfaces/notification.interface.d.ts +154 -0
  22. package/lib/tab-core-utility/app/interfaces/release.interface.d.ts +85 -0
  23. package/lib/tab-core-utility/app/utils/req-res.util.d.ts +5 -1
  24. package/lib/tab-core-utility/core/service/notification/notification-inbox.service.d.ts +80 -0
  25. package/lib/tab-core-utility/core/service/notification/notification-websocket.service.d.ts +56 -0
  26. package/lib/tab-core-utility/core/service/signalr/operation-tracker.service.d.ts +9 -1
  27. package/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.d.ts +11 -0
  28. package/lib/tab-core-utility/core/service/signalr/signalr.service.d.ts +15 -3
  29. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { Subject, throwError, TimeoutError } from 'rxjs';
3
- import { filter, take, timeout, catchError } from 'rxjs/operators';
2
+ import { merge, Subject, throwError, TimeoutError } from 'rxjs';
3
+ import { filter, take, timeout, catchError, switchMap } from 'rxjs/operators';
4
4
  import { SIGNALR_CONFIG, } from '../../../app/interfaces/signalr.interface';
5
5
  import * as i0 from "@angular/core";
6
6
  /**
@@ -14,6 +14,8 @@ export class OperationTrackerService {
14
14
  this.pendingOperations = new Map();
15
15
  // Observable for completed operations
16
16
  this.operationCompleted$ = new Subject();
17
+ // Cancellation channel — emitted by cancelAll() to error any open waitForOperation observers
18
+ this.cancellation$ = new Subject();
17
19
  }
18
20
  /**
19
21
  * Register an async operation for tracking
@@ -29,7 +31,8 @@ export class OperationTrackerService {
29
31
  }
30
32
  /**
31
33
  * Wait for operation to complete via SignalR notification
32
- * Returns Observable that emits when notification with matching correlationId is received
34
+ * Returns Observable that emits when notification with matching correlationId is received,
35
+ * or errors if cancelAll() is invoked (e.g. on disconnect / signOut).
33
36
  */
34
37
  waitForOperation(correlationId, timeoutMs = SIGNALR_CONFIG.DEFAULT_TIMEOUT) {
35
38
  // Auto-register so handleNotification can match it
@@ -40,8 +43,10 @@ export class OperationTrackerService {
40
43
  timeout: timeoutMs
41
44
  });
42
45
  }
43
- return this.operationCompleted$.pipe(filter((notification) => notification.correlationId === correlationId), take(1), timeout(timeoutMs), catchError((error) => {
44
- // Cleanup on timeout
46
+ const completed$ = this.operationCompleted$.pipe(filter((notification) => notification.correlationId === correlationId), take(1));
47
+ const cancelled$ = this.cancellation$.pipe(take(1), switchMap((reason) => throwError(() => new Error(`SignalR operation cancelled: ${reason}`))));
48
+ return merge(completed$, cancelled$).pipe(take(1), timeout(timeoutMs), catchError((error) => {
49
+ // Cleanup on timeout / cancellation
45
50
  this.pendingOperations.delete(correlationId);
46
51
  if (error instanceof TimeoutError) {
47
52
  return throwError(() => new Error('Operation timed out'));
@@ -62,6 +67,18 @@ export class OperationTrackerService {
62
67
  this.pendingOperations.delete(notification.correlationId);
63
68
  }
64
69
  }
70
+ /**
71
+ * Cancel all pending operations — errors all open waitForOperation() observers.
72
+ * Called by SignalRService.disconnect() so in-flight CRUD UIs resolve fast
73
+ * instead of stranding until the 120s timeout.
74
+ */
75
+ cancelAll(reason) {
76
+ if (this.pendingOperations.size === 0) {
77
+ return;
78
+ }
79
+ this.pendingOperations.clear();
80
+ this.cancellation$.next(reason);
81
+ }
65
82
  /**
66
83
  * Check if operation is pending
67
84
  */
@@ -87,4 +104,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
87
104
  type: Injectable,
88
105
  args: [{ providedIn: 'root' }]
89
106
  }] });
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLXRyYWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGF0YS1hY2Nlc3Mvc3JjL2xpYi90YWItY29yZS11dGlsaXR5L2NvcmUvc2VydmljZS9zaWduYWxyL29wZXJhdGlvbi10cmFja2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFHTCxjQUFjLEdBQ2YsTUFBTSwyQ0FBMkMsQ0FBQzs7QUFFbkQ7Ozs7R0FJRztBQUVILE1BQU0sT0FBTyx1QkFBdUI7SUFEcEM7UUFFRSx1Q0FBdUM7UUFDL0Isc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFaEUsc0NBQXNDO1FBQzlCLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFvQixDQUFDO0tBZ0YvRDtJQTlFQzs7T0FFRztJQUNILGlCQUFpQixDQUFDLFNBQTJCO1FBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUvRCw2QkFBNkI7UUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUMsRUFBRSxTQUFTLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsYUFBcUIsRUFBRSxZQUFvQixjQUFjLENBQUMsZUFBZTtRQUN4RixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3JCLGFBQWE7Z0JBQ2IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNyQixPQUFPLEVBQUUsU0FBUzthQUNuQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUNsQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLEtBQUssYUFBYSxDQUFDLEVBQ3RFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQ2xCLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLHFCQUFxQjtZQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTdDLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRSxDQUFDO2dCQUNsQyxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsWUFBOEI7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLCtDQUErQztZQUMvQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTVDLFVBQVU7WUFDVixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLGFBQXFCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQzsrR0FwRlUsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FEVixNQUFNOzs0RkFDbkIsdUJBQXVCO2tCQURuQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGhyb3dFcnJvciwgVGltZW91dEVycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGltZW91dCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICBDcnVkTm90aWZpY2F0aW9uLFxyXG4gIFBlbmRpbmdPcGVyYXRpb24sXHJcbiAgU0lHTkFMUl9DT05GSUcsXHJcbn0gZnJvbSAnLi4vLi4vLi4vYXBwL2ludGVyZmFjZXMvc2lnbmFsci5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIE9wZXJhdGlvbiBUcmFja2VyIFNlcnZpY2VcclxuICogVHJhY2tzIGFzeW5jIG9wZXJhdGlvbnMgYnkgY29ycmVsYXRpb25JZCBhbmQgbWF0Y2hlcyB0aGVtIHdpdGggU2lnbmFsUiBub3RpZmljYXRpb25zXHJcbiAqIFVzZWQgYnkgVGFiRm9ybWlvU2VydmljZSBmb3IgaGFuZGxpbmcgYXN5bmMgcHJvY2Vzc1JlcXVlc3Qgb3BlcmF0aW9uc1xyXG4gKi9cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvblRyYWNrZXJTZXJ2aWNlIHtcclxuICAvLyBNYXA8Y29ycmVsYXRpb25JZCwgUGVuZGluZ09wZXJhdGlvbj5cclxuICBwcml2YXRlIHBlbmRpbmdPcGVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFBlbmRpbmdPcGVyYXRpb24+KCk7XHJcblxyXG4gIC8vIE9ic2VydmFibGUgZm9yIGNvbXBsZXRlZCBvcGVyYXRpb25zXHJcbiAgcHJpdmF0ZSBvcGVyYXRpb25Db21wbGV0ZWQkID0gbmV3IFN1YmplY3Q8Q3J1ZE5vdGlmaWNhdGlvbj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgYW4gYXN5bmMgb3BlcmF0aW9uIGZvciB0cmFja2luZ1xyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT3BlcmF0aW9uKG9wZXJhdGlvbjogUGVuZGluZ09wZXJhdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5zZXQob3BlcmF0aW9uLmNvcnJlbGF0aW9uSWQsIG9wZXJhdGlvbik7XHJcblxyXG4gICAgLy8gQXV0by1jbGVhbnVwIGFmdGVyIHRpbWVvdXRcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5oYXMob3BlcmF0aW9uLmNvcnJlbGF0aW9uSWQpKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5kZWxldGUob3BlcmF0aW9uLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICB9XHJcbiAgICB9LCBvcGVyYXRpb24udGltZW91dCB8fCBTSUdOQUxSX0NPTkZJRy5ERUZBVUxUX1RJTUVPVVQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2FpdCBmb3Igb3BlcmF0aW9uIHRvIGNvbXBsZXRlIHZpYSBTaWduYWxSIG5vdGlmaWNhdGlvblxyXG4gICAqIFJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gbm90aWZpY2F0aW9uIHdpdGggbWF0Y2hpbmcgY29ycmVsYXRpb25JZCBpcyByZWNlaXZlZFxyXG4gICAqL1xyXG4gIHdhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZDogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IFNJR05BTFJfQ09ORklHLkRFRkFVTFRfVElNRU9VVCk6IE9ic2VydmFibGU8Q3J1ZE5vdGlmaWNhdGlvbj4ge1xyXG4gICAgLy8gQXV0by1yZWdpc3RlciBzbyBoYW5kbGVOb3RpZmljYXRpb24gY2FuIG1hdGNoIGl0XHJcbiAgICBpZiAoIXRoaXMucGVuZGluZ09wZXJhdGlvbnMuaGFzKGNvcnJlbGF0aW9uSWQpKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJPcGVyYXRpb24oe1xyXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgIHRpbWVvdXQ6IHRpbWVvdXRNc1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbkNvbXBsZXRlZCQucGlwZShcclxuICAgICAgZmlsdGVyKChub3RpZmljYXRpb24pID0+IG5vdGlmaWNhdGlvbi5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkKSxcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgdGltZW91dCh0aW1lb3V0TXMpLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIC8vIENsZWFudXAgb24gdGltZW91dFxyXG4gICAgICAgIHRoaXMucGVuZGluZ09wZXJhdGlvbnMuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignT3BlcmF0aW9uIHRpbWVkIG91dCcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBpbmNvbWluZyBTaWduYWxSIG5vdGlmaWNhdGlvblxyXG4gICAqIENhbGxlZCBieSBTaWduYWxSU2VydmljZSB3aGVuIG5vdGlmaWNhdGlvbiBpcyByZWNlaXZlZFxyXG4gICAqL1xyXG4gIGhhbmRsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IENydWROb3RpZmljYXRpb24pOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMucGVuZGluZ09wZXJhdGlvbnMuZ2V0KG5vdGlmaWNhdGlvbi5jb3JyZWxhdGlvbklkKTtcclxuICAgIGlmIChvcGVyYXRpb24pIHtcclxuICAgICAgLy8gRW1pdCB0byBvYnNlcnZlcnMgd2FpdGluZyBmb3IgdGhpcyBvcGVyYXRpb25cclxuICAgICAgdGhpcy5vcGVyYXRpb25Db21wbGV0ZWQkLm5leHQobm90aWZpY2F0aW9uKTtcclxuXHJcbiAgICAgIC8vIENsZWFudXBcclxuICAgICAgdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5kZWxldGUobm90aWZpY2F0aW9uLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgb3BlcmF0aW9uIGlzIHBlbmRpbmdcclxuICAgKi9cclxuICBpc1BlbmRpbmcoY29ycmVsYXRpb25JZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5oYXMoY29ycmVsYXRpb25JZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgcGVuZGluZyBvcGVyYXRpb25zIGNvdW50IChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldFBlbmRpbmdDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ09wZXJhdGlvbnMuc2l6ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldEFsbFBlbmRpbmcoKTogUGVuZGluZ09wZXJhdGlvbltdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucGVuZGluZ09wZXJhdGlvbnMudmFsdWVzKCkpO1xyXG4gIH1cclxufSJdfQ==
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLXRyYWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGF0YS1hY2Nlc3Mvc3JjL2xpYi90YWItY29yZS11dGlsaXR5L2NvcmUvc2VydmljZS9zaWduYWxyL29wZXJhdGlvbi10cmFja2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUdMLGNBQWMsR0FDZixNQUFNLDJDQUEyQyxDQUFDOztBQUVuRDs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLHVCQUF1QjtJQURwQztRQUVFLHVDQUF1QztRQUMvQixzQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUVoRSxzQ0FBc0M7UUFDOUIsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQW9CLENBQUM7UUFFOUQsNkZBQTZGO1FBQ3JGLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztLQXdHL0M7SUF0R0M7O09BRUc7SUFDSCxpQkFBaUIsQ0FBQyxTQUEyQjtRQUMzQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFL0QsNkJBQTZCO1FBQzdCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxp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QUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1gsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7K0dBL0dVLHVCQUF1QjttSEFBdkIsdUJBQXVCLGNBRFYsTUFBTTs7NEZBQ25CLHVCQUF1QjtrQkFEbkMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0aHJvd0Vycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlLCB0aW1lb3V0LCBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgQ3J1ZE5vdGlmaWNhdGlvbixcclxuICBQZW5kaW5nT3BlcmF0aW9uLFxyXG4gIFNJR05BTFJfQ09ORklHLFxyXG59IGZyb20gJy4uLy4uLy4uL2FwcC9pbnRlcmZhY2VzL3NpZ25hbHIuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBPcGVyYXRpb24gVHJhY2tlciBTZXJ2aWNlXHJcbiAqIFRyYWNrcyBhc3luYyBvcGVyYXRpb25zIGJ5IGNvcnJlbGF0aW9uSWQgYW5kIG1hdGNoZXMgdGhlbSB3aXRoIFNpZ25hbFIgbm90aWZpY2F0aW9uc1xyXG4gKiBVc2VkIGJ5IFRhYkZvcm1pb1NlcnZpY2UgZm9yIGhhbmRsaW5nIGFzeW5jIHByb2Nlc3NSZXF1ZXN0IG9wZXJhdGlvbnNcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25UcmFja2VyU2VydmljZSB7XHJcbiAgLy8gTWFwPGNvcnJlbGF0aW9uSWQsIFBlbmRpbmdPcGVyYXRpb24+XHJcbiAgcHJpdmF0ZSBwZW5kaW5nT3BlcmF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nT3BlcmF0aW9uPigpO1xyXG5cclxuICAvLyBPYnNlcnZhYmxlIGZvciBjb21wbGV0ZWQgb3BlcmF0aW9uc1xyXG4gIHByaXZhdGUgb3BlcmF0aW9uQ29tcGxldGVkJCA9IG5ldyBTdWJqZWN0PENydWROb3RpZmljYXRpb24+KCk7XHJcblxyXG4gIC8vIENhbmNlbGxhdGlvbiBjaGFubmVsIOKAlCBlbWl0dGVkIGJ5IGNhbmNlbEFsbCgpIHRvIGVycm9yIGFueSBvcGVuIHdhaXRGb3JPcGVyYXRpb24gb2JzZXJ2ZXJzXHJcbiAgcHJpdmF0ZSBjYW5jZWxsYXRpb24kID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBhbiBhc3luYyBvcGVyYXRpb24gZm9yIHRyYWNraW5nXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPcGVyYXRpb24ob3BlcmF0aW9uOiBQZW5kaW5nT3BlcmF0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLnNldChvcGVyYXRpb24uY29ycmVsYXRpb25JZCwgb3BlcmF0aW9uKTtcclxuXHJcbiAgICAvLyBBdXRvLWNsZWFudXAgYWZ0ZXIgdGltZW91dFxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmhhcyhvcGVyYXRpb24uY29ycmVsYXRpb25JZCkpIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmRlbGV0ZShvcGVyYXRpb24uY29ycmVsYXRpb25JZCk7XHJcbiAgICAgIH1cclxuICAgIH0sIG9wZXJhdGlvbi50aW1lb3V0IHx8IFNJR05BTFJfQ09ORklHLkRFRkFVTFRfVElNRU9VVCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYWl0IGZvciBvcGVyYXRpb24gdG8gY29tcGxldGUgdmlhIFNpZ25hbFIgbm90aWZpY2F0aW9uXHJcbiAgICogUmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiBub3RpZmljYXRpb24gd2l0aCBtYXRjaGluZyBjb3JyZWxhdGlvbklkIGlzIHJlY2VpdmVkLFxyXG4gICAqIG9yIGVycm9ycyBpZiBjYW5jZWxBbGwoKSBpcyBpbnZva2VkIChlLmcuIG9uIGRpc2Nvbm5lY3QgLyBzaWduT3V0KS5cclxuICAgKi9cclxuICB3YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQ6IHN0cmluZywgdGltZW91dE1zOiBudW1iZXIgPSBTSUdOQUxSX0NPTkZJRy5ERUZBVUxUX1RJTUVPVVQpOiBPYnNlcnZhYmxlPENydWROb3RpZmljYXRpb24+IHtcclxuICAgIC8vIEF1dG8tcmVnaXN0ZXIgc28gaGFuZGxlTm90aWZpY2F0aW9uIGNhbiBtYXRjaCBpdFxyXG4gICAgaWYgKCF0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmhhcyhjb3JyZWxhdGlvbklkKSkge1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyT3BlcmF0aW9uKHtcclxuICAgICAgICBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcclxuICAgICAgICB0aW1lb3V0OiB0aW1lb3V0TXNcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tcGxldGVkJCA9IHRoaXMub3BlcmF0aW9uQ29tcGxldGVkJC5waXBlKFxyXG4gICAgICBmaWx0ZXIoKG5vdGlmaWNhdGlvbikgPT4gbm90aWZpY2F0aW9uLmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWQpLFxyXG4gICAgICB0YWtlKDEpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGNhbmNlbGxlZCQgPSB0aGlzLmNhbmNlbGxhdGlvbiQucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgc3dpdGNoTWFwKChyZWFzb24pID0+IHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBTaWduYWxSIG9wZXJhdGlvbiBjYW5jZWxsZWQ6ICR7cmVhc29ufWApKSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlKGNvbXBsZXRlZCQsIGNhbmNlbGxlZCQpLnBpcGUoXHJcbiAgICAgIHRha2UoMSksXHJcbiAgICAgIHRpbWVvdXQodGltZW91dE1zKSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAvLyBDbGVhbnVwIG9uIHRpbWVvdXQgLyBjYW5jZWxsYXRpb25cclxuICAgICAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcclxuXHJcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ09wZXJhdGlvbiB0aW1lZCBvdXQnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgaW5jb21pbmcgU2lnbmFsUiBub3RpZmljYXRpb25cclxuICAgKiBDYWxsZWQgYnkgU2lnbmFsUlNlcnZpY2Ugd2hlbiBub3RpZmljYXRpb24gaXMgcmVjZWl2ZWRcclxuICAgKi9cclxuICBoYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBDcnVkTm90aWZpY2F0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmdldChub3RpZmljYXRpb24uY29ycmVsYXRpb25JZCk7XHJcbiAgICBpZiAob3BlcmF0aW9uKSB7XHJcbiAgICAgIC8vIEVtaXQgdG8gb2JzZXJ2ZXJzIHdhaXRpbmcgZm9yIHRoaXMgb3BlcmF0aW9uXHJcbiAgICAgIHRoaXMub3BlcmF0aW9uQ29tcGxldGVkJC5uZXh0KG5vdGlmaWNhdGlvbik7XHJcblxyXG4gICAgICAvLyBDbGVhbnVwXHJcbiAgICAgIHRoaXMucGVuZGluZ09wZXJhdGlvbnMuZGVsZXRlKG5vdGlmaWNhdGlvbi5jb3JyZWxhdGlvbklkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbmNlbCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIOKAlCBlcnJvcnMgYWxsIG9wZW4gd2FpdEZvck9wZXJhdGlvbigpIG9ic2VydmVycy5cclxuICAgKiBDYWxsZWQgYnkgU2lnbmFsUlNlcnZpY2UuZGlzY29ubmVjdCgpIHNvIGluLWZsaWdodCBDUlVEIFVJcyByZXNvbHZlIGZhc3RcclxuICAgKiBpbnN0ZWFkIG9mIHN0cmFuZGluZyB1bnRpbCB0aGUgMTIwcyB0aW1lb3V0LlxyXG4gICAqL1xyXG4gIGNhbmNlbEFsbChyZWFzb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGVuZGluZ09wZXJhdGlvbnMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmNsZWFyKCk7XHJcbiAgICB0aGlzLmNhbmNlbGxhdGlvbiQubmV4dChyZWFzb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgb3BlcmF0aW9uIGlzIHBlbmRpbmdcclxuICAgKi9cclxuICBpc1BlbmRpbmcoY29ycmVsYXRpb25JZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5oYXMoY29ycmVsYXRpb25JZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgcGVuZGluZyBvcGVyYXRpb25zIGNvdW50IChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldFBlbmRpbmdDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ09wZXJhdGlvbnMuc2l6ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldEFsbFBlbmRpbmcoKTogUGVuZGluZ09wZXJhdGlvbltdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucGVuZGluZ09wZXJhdGlvbnMudmFsdWVzKCkpO1xyXG4gIH1cclxufSJdfQ==
@@ -15,6 +15,10 @@ import * as i0 from "@angular/core";
15
15
  export class SignalRInfrastructure {
16
16
  constructor() {
17
17
  this.hubConnection = null;
18
+ // In-flight connect() promise — used to dedupe concurrent calls
19
+ this.connectingPromise = null;
20
+ // Set true on explicit disconnect() so scheduled retries don't resurrect the connection
21
+ this.explicitlyDisconnected = false;
18
22
  // Session storage
19
23
  this.sessionStorageService = inject(SessionStorageService);
20
24
  // local storage
@@ -73,11 +77,39 @@ export class SignalRInfrastructure {
73
77
  }
74
78
  /**
75
79
  * Connect to SignalR hub
80
+ *
81
+ * Idempotent and safe to call from multiple sites:
82
+ * - already CONNECTED → returns immediately
83
+ * - already CONNECTING → returns the in-flight promise
84
+ * - any non-Connected leftover hubConnection → torn down before rebuild
76
85
  */
77
86
  async connect() {
87
+ this.explicitlyDisconnected = false;
78
88
  if (this.hubConnection?.state === signalR.HubConnectionState.Connected) {
79
89
  return;
80
90
  }
91
+ if (this.connectingPromise) {
92
+ return this.connectingPromise;
93
+ }
94
+ // Tear down any stale (non-Connected) hubConnection before rebuilding
95
+ if (this.hubConnection) {
96
+ try {
97
+ await this.hubConnection.stop();
98
+ }
99
+ catch {
100
+ // ignore — we're discarding it anyway
101
+ }
102
+ this.hubConnection = null;
103
+ }
104
+ this.connectingPromise = this.doConnect();
105
+ try {
106
+ await this.connectingPromise;
107
+ }
108
+ finally {
109
+ this.connectingPromise = null;
110
+ }
111
+ }
112
+ async doConnect() {
81
113
  // Get hub URL from Common (set during app initialization via Common.init())
82
114
  const hubUrl = Common.signalRHubUrl;
83
115
  if (!hubUrl) {
@@ -110,8 +142,12 @@ export class SignalRInfrastructure {
110
142
  }
111
143
  catch (error) {
112
144
  this.connectionState.set(CONNECTION_STATE.FAILED);
113
- // Retry after 1 minute
114
- setTimeout(() => this.connect(), 60 * 1000);
145
+ // Retry after 1 minute, but only if the caller hasn't explicitly disconnected
146
+ setTimeout(() => {
147
+ if (!this.explicitlyDisconnected) {
148
+ this.connect();
149
+ }
150
+ }, 60 * 1000);
115
151
  }
116
152
  }
117
153
  /**
@@ -168,8 +204,12 @@ export class SignalRInfrastructure {
168
204
  });
169
205
  this.hubConnection.onclose(() => {
170
206
  this.connectionState.set(CONNECTION_STATE.DISCONNECTED);
171
- // Try to reconnect
172
- setTimeout(() => this.connect(), 60 * 1000);
207
+ // Try to reconnect — but only if the caller hasn't explicitly disconnected
208
+ setTimeout(() => {
209
+ if (!this.explicitlyDisconnected) {
210
+ this.connect();
211
+ }
212
+ }, 60 * 1000);
173
213
  });
174
214
  }
175
215
  /**
@@ -237,18 +277,24 @@ export class SignalRInfrastructure {
237
277
  }
238
278
  /**
239
279
  * Disconnect from SignalR hub (cleanup)
280
+ *
281
+ * Sets explicitlyDisconnected so any pending retry timers from connect()/onclose
282
+ * become no-ops, then stops the hub and clears tracked groups.
240
283
  */
241
284
  async disconnect() {
285
+ this.explicitlyDisconnected = true;
286
+ this.connectingPromise = null;
242
287
  if (this.hubConnection) {
243
288
  try {
244
289
  await this.hubConnection.stop();
245
- this.hubConnection = null;
246
- this.connectionState.set(CONNECTION_STATE.DISCONNECTED);
247
290
  }
248
291
  catch (error) {
249
292
  console.error('[SignalR] Error during disconnect:', error);
250
293
  }
294
+ this.hubConnection = null;
251
295
  }
296
+ this.activeGroups.clear();
297
+ this.connectionState.set(CONNECTION_STATE.DISCONNECTED);
252
298
  }
253
299
  /**
254
300
  * Get active groups (for debugging)
@@ -265,4 +311,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
265
311
  providedIn: 'root',
266
312
  }]
267
313
  }] });
268
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci1pbmZyYXN0cnVjdHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvY29yZS9zZXJ2aWNlL3NpZ25hbHIvc2lnbmFsci1pbmZyYXN0cnVjdHVyZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFJTCxtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLGNBQWMsRUFDZCxnQkFBZ0IsR0FDakIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFFMUU7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxxQkFBcUI7SUFIbEM7UUFJVSxrQkFBYSxHQUFpQyxJQUFJLENBQUM7UUFFM0Qsa0JBQWtCO1FBQ1QsMEJBQXFCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFL0QsZ0JBQWdCO1FBQ1Asd0JBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFM0QsNkJBQTZCO1FBQ3BCLG9CQUFlLEdBQUcsTUFBTSxDQUFrQixnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVsRiwyREFBMkQ7UUFDbEQs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SCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssS0FBSyxPQUFPLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDOytHQXpTVSxxQkFBcUI7bUhBQXJCLHFCQUFxQixjQUZwQixNQUFNOzs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgc2lnbmFsUiBmcm9tICdAbWljcm9zb2Z0L3NpZ25hbHInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbW1vbiB9IGZyb20gJy4uLy4uLy4uL2FwcC9jb25zdGFudHMvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb25uZWN0aW9uU3RhdGUsXHJcbiAgQ3J1ZE5vdGlmaWNhdGlvbixcclxuICBTaWduYWxSTWVzc2FnZSxcclxuICBTSUdOQUxSX0hVQl9NRVRIT0RTLFxyXG4gIFNJR05BTFJfRVZFTlRTLFxyXG4gIENSVURfT1BFUkFUSU9OLFxyXG4gIENPTk5FQ1RJT05fU1RBVEUsXHJcbn0gZnJvbSAnLi4vLi4vLi4vYXBwL2ludGVyZmFjZXMvc2lnbmFsci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBTdG9yYWdlQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vYXBwL2NvbnN0YW50cy9zdG9yYWdlLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2F1dGgvc2Vzc2lvbi1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXV0aC9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIFNpZ25hbFIgSW5mcmFzdHJ1Y3R1cmUgU2VydmljZVxyXG4gKiBIYW5kbGVzIGxvdy1sZXZlbCBXZWJTb2NrZXQgY29ubmVjdGlvbiwgZ3JvdXAgbWFuYWdlbWVudCwgYW5kIHJlY29ubmVjdGlvblxyXG4gKiBJbnRlcm5hbCB1c2Ugb25seSAtIGNvbXBvbmVudHMgc2hvdWxkIHVzZSBTaWduYWxSU2VydmljZSBpbnN0ZWFkXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2lnbmFsUkluZnJhc3RydWN0dXJlIHtcclxuICBwcml2YXRlIGh1YkNvbm5lY3Rpb246IHNpZ25hbFIuSHViQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyBTZXNzaW9uIHN0b3JhZ2VcclxuICByZWFkb25seSBzZXNzaW9uU3RvcmFnZVNlcnZpY2UgPSBpbmplY3QoU2Vzc2lvblN0b3JhZ2VTZXJ2aWNlKTtcclxuXHJcbiAgLy8gbG9jYWwgc3RvcmFnZVxyXG4gIHJlYWRvbmx5IGxvY2FsU3RvcmFnZVNlcnZpY2UgPSBpbmplY3QoTG9jYWxTdG9yYWdlU2VydmljZSk7XHJcblxyXG4gIC8vIENvbm5lY3Rpb24gc3RhdGUgYXMgc2lnbmFsXHJcbiAgcmVhZG9ubHkgY29ubmVjdGlvblN0YXRlID0gc2lnbmFsPENvbm5lY3Rpb25TdGF0ZT4oQ09OTkVDVElPTl9TVEFURS5ESVNDT05ORUNURUQpO1xyXG5cclxuICAvLyBOb3RpZmljYXRpb24gc3RyZWFtIChpbnRlcm5hbCAtIGVtaXRzIHRvIFNpZ25hbFJTZXJ2aWNlKVxyXG4gIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnMkID0gbmV3IFN1YmplY3Q8Q3J1ZE5vdGlmaWNhdGlvbj4oKTtcclxuXHJcbiAgLy8gVHJhY2sgYWN0aXZlIGdyb3VwcyB0byByZWpvaW4gYWZ0ZXIgcmVjb25uZWN0aW9uXHJcbiAgcHJpdmF0ZSBhY3RpdmVHcm91cHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdmFsdWUgZnJvbSBzdG9yYWdlXHJcbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc3RvcmFnZSwgJ1Nlc3Npb24nIG9yICdMb2NhbCdcclxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZvclxyXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBmcm9tIHN0b3JhZ2UsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RnJvbVN0b3JhZ2UodHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGluZm86IGFueSA9IG51bGw7XHJcblxyXG4gICAgICBpZiAodHlwZSA9PT0gJ1Nlc3Npb24nKSB7XHJcbiAgICAgICAgLy8gR2V0IHZhbHVlIGZyb20gc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgICAgaW5mbyA9IHRoaXMuc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25TdG9yYWdlKGtleSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlID09PSAnTG9jYWwnKSB7XHJcbiAgICAgICAgLy8gR2V0IHZhbHVlIGZyb20gbG9jYWwgc3RvcmFnZVxyXG4gICAgICAgIGluZm8gPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0TG9jYWxTdG9yYWdlKGtleSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpbmZvICYmIHR5cGVvZiBpbmZvID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIC8vIFBhcnNlIHRoZSB2YWx1ZSBpZiBpdCdzIGEgc3RyaW5nXHJcbiAgICAgICAgaW5mbyA9IEpTT04ucGFyc2UoaW5mbyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBpbmZvO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gTG9nIGVycm9yIGlmIGZhaWxlZCB0byBnZXQgdmFsdWUgZnJvbSBzdG9yYWdlXHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGdldCBjdXJyZW50IGFwcCBJRCBmcm9tIHNlc3Npb246JywgZXJyb3IpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhcHBJZCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IGFwcEluZm8gPSB0aGlzLmdldEZyb21TdG9yYWdlKCdTZXNzaW9uJywgU3RvcmFnZUNvbnN0YW50cy5hcHBJbmZvKTtcclxuICAgIHJldHVybiBhcHBJbmZvPy5JZCB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVudmlyb25tZW50SWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBlbnZJbmZvID0gdGhpcy5nZXRGcm9tU3RvcmFnZSgnU2Vzc2lvbicsIFN0b3JhZ2VDb25zdGFudHMuZW52aXJvbm1lbnRJbmZvKTtcclxuICAgIHJldHVybiBlbnZJbmZvPy5JZCB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRlbmFudElkKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgdGVuYW50SW5mbyA9IHRoaXMuZ2V0RnJvbVN0b3JhZ2UoJ0xvY2FsJywgU3RvcmFnZUNvbnN0YW50cy5vcmdJbmZvKTtcclxuICAgIHJldHVybiB0ZW5hbnRJbmZvPy5JZCB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRva2VuKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgYXV0aEluZm8gPSB0aGlzLmdldEZyb21TdG9yYWdlKCdMb2NhbCcsIFN0b3JhZ2VDb25zdGFudHMudG9rZW5JbmZvKTtcclxuICAgIHJldHVybiBhdXRoSW5mbz8udG9rZW4gfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbm5lY3QgdG8gU2lnbmFsUiBodWJcclxuICAgKi9cclxuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaHViQ29ubmVjdGlvbj8uc3RhdGUgPT09IHNpZ25hbFIuSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IGh1YiBVUkwgZnJvbSBDb21tb24gKHNldCBkdXJpbmcgYXBwIGluaXRpYWxpemF0aW9uIHZpYSBDb21tb24uaW5pdCgpKVxyXG4gICAgY29uc3QgaHViVXJsID0gQ29tbW9uLnNpZ25hbFJIdWJVcmw7XHJcblxyXG4gICAgaWYgKCFodWJVcmwpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1NpZ25hbFJdIEh1YiBVUkwgbm90IGNvbmZpZ3VyZWQuIE1ha2Ugc3VyZSBDb21tb24uaW5pdCgpIGlzIGNhbGxlZCB3aXRoIGVudmlyb25tZW50LicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGUuc2V0KENPTk5FQ1RJT05fU1RBVEUuQ09OTkVDVElORyk7XHJcblxyXG4gICAgICB0aGlzLmh1YkNvbm5lY3Rpb24gPSBuZXcgc2lnbmFsUi5IdWJDb25uZWN0aW9uQnVpbGRlcigpXHJcbiAgICAgICAgLndpdGhVcmwoaHViVXJsLCB7XHJcbiAgICAgICAgICBhY2Nlc3NUb2tlbkZhY3Rvcnk6ICgpID0+IHRoaXMudG9rZW4gfHwgJycsXHJcbiAgICAgICAgICBza2lwTmVnb3RpYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgdHJhbnNwb3J0OiBzaWduYWxSLkh0dHBUcmFuc3BvcnRUeXBlLldlYlNvY2tldHMgfCBzaWduYWxSLkh0dHBUcmFuc3BvcnRUeXBlLlNlcnZlclNlbnRFdmVudHMsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2l0aEF1dG9tYXRpY1JlY29ubmVjdCh7XHJcbiAgICAgICAgICBuZXh0UmV0cnlEZWxheUluTWlsbGlzZWNvbmRzOiAocmV0cnlDb250ZXh0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZjogMHMsIDJzLCAxMHMsIDMwcywgbWF4IDYwc1xyXG4gICAgICAgICAgICBpZiAocmV0cnlDb250ZXh0LmVsYXBzZWRNaWxsaXNlY29uZHMgPCA2MDAwMCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbigxMDAwICogTWF0aC5wb3coMiwgcmV0cnlDb250ZXh0LnByZXZpb3VzUmV0cnlDb3VudCksIDYwMDAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gU3RvcCByZXRyeWluZyBhZnRlciAxIG1pbnV0ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jb25maWd1cmVMb2dnaW5nKHNpZ25hbFIuTG9nTGV2ZWwuSW5mb3JtYXRpb24pXHJcbiAgICAgICAgLmJ1aWxkKCk7XHJcblxyXG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVycygpO1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyQ29ubmVjdGlvbkxpZmVjeWNsZSgpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5odWJDb25uZWN0aW9uLnN0YXJ0KCk7XHJcblxyXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZS5zZXQoQ09OTkVDVElPTl9TVEFURS5DT05ORUNURUQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGUuc2V0KENPTk5FQ1RJT05fU1RBVEUuRkFJTEVEKTtcclxuXHJcbiAgICAgIC8vIFJldHJ5IGFmdGVyIDEgbWludXRlXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb25uZWN0KCksIDYwICogMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBTaWduYWxSIGV2ZW50IGhhbmRsZXJzIGZvciBDUlVEIG5vdGlmaWNhdGlvbnNcclxuICAgKi9cclxuICBwcml2YXRlIHJlZ2lzdGVyRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5odWJDb25uZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgLy8gSU5TRVJUIG5vdGlmaWNhdGlvbnNcclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbihTSUdOQUxSX0VWRU5UUy5JTlNFUlRfQ09NUExFVEVELCAoLi4uYXJnczogYW55W10pID0+IHtcclxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gdGhpcy5leHRyYWN0Tm90aWZpY2F0aW9uKGFyZ3MpO1xyXG4gICAgICBjb25zdCBlbnJpY2hlZCA9IHsgLi4ubm90aWZpY2F0aW9uLCBvcGVyYXRpb246IENSVURfT1BFUkFUSU9OLklOU0VSVCwgcmVjZWl2ZWRBdDogbmV3IERhdGUoKSB9O1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLm5leHQoZW5yaWNoZWQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVVBEQVRFIG5vdGlmaWNhdGlvbnNcclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbihTSUdOQUxSX0VWRU5UUy5VUERBVEVfQ09NUExFVEVELCAoLi4uYXJnczogYW55W10pID0+IHtcclxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gdGhpcy5leHRyYWN0Tm90aWZpY2F0aW9uKGFyZ3MpO1xyXG4gICAgICBjb25zdCBlbnJpY2hlZCA9IHsgLi4ubm90aWZpY2F0aW9uLCBvcGVyYXRpb246IENSVURfT1BFUkFUSU9OLlVQREFURSwgcmVjZWl2ZWRBdDogbmV3IERhdGUoKSB9O1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLm5leHQoZW5yaWNoZWQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gREVMRVRFIG5vdGlmaWNhdGlvbnNcclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbihTSUdOQUxSX0VWRU5UUy5ERUxFVEVfQ09NUExFVEVELCAoLi4uYXJnczogYW55W10pID0+IHtcclxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gdGhpcy5leHRyYWN0Tm90aWZpY2F0aW9uKGFyZ3MpO1xyXG4gICAgICBjb25zdCBlbnJpY2hlZCA9IHsgLi4ubm90aWZpY2F0aW9uLCBvcGVyYXRpb246IENSVURfT1BFUkFUSU9OLkRFTEVURSwgcmVjZWl2ZWRBdDogbmV3IERhdGUoKSB9O1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLm5leHQoZW5yaWNoZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHRyYWN0IG5vdGlmaWNhdGlvbiBmcm9tIFNpZ25hbFIgY2FsbGJhY2sgYXJnc1xyXG4gICAqIEhhbmRsZXMgYm90aCB1bndyYXBwZWQgKGRpcmVjdCBvYmplY3QpIGFuZCB3cmFwcGVkICh7IHR5cGUsIHRhcmdldCwgYXJndW1lbnRzIH0pIGZvcm1hdHNcclxuICAgKi9cclxuICBwcml2YXRlIGV4dHJhY3ROb3RpZmljYXRpb24oYXJnczogYW55W10pOiBDcnVkTm90aWZpY2F0aW9uIHtcclxuICAgIGNvbnN0IGRhdGEgPSBhcmdzWzBdO1xyXG5cclxuICAgIC8vIElmIFNpZ25hbFIgZGlkbid0IHVud3JhcDogZGF0YSBpcyByYXcgU2lnbmFsUk1lc3NhZ2Ugd2l0aCB7IHR5cGUsIHRhcmdldCwgYXJndW1lbnRzOiBbLi4uXSB9XHJcbiAgICBpZiAoZGF0YT8uYXJndW1lbnRzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5hcmd1bWVudHMpKSB7XHJcbiAgICAgIHJldHVybiAoZGF0YSBhcyBTaWduYWxSTWVzc2FnZSkuYXJndW1lbnRzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIFNpZ25hbFIgdW53cmFwcGVkOiBkYXRhIGlzIHRoZSBub3RpZmljYXRpb24gZGlyZWN0bHlcclxuICAgIHJldHVybiBkYXRhIGFzIENydWROb3RpZmljYXRpb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBjb25uZWN0aW9uIGxpZmVjeWNsZSBoYW5kbGVyc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJDb25uZWN0aW9uTGlmZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmh1YkNvbm5lY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24ub25yZWNvbm5lY3RpbmcoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZS5zZXQoQ09OTkVDVElPTl9TVEFURS5SRUNPTk5FQ1RJTkcpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5odWJDb25uZWN0aW9uLm9ucmVjb25uZWN0ZWQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZS5zZXQoQ09OTkVDVElPTl9TVEFURS5DT05ORUNURUQpO1xyXG5cclxuICAgICAgLy8gUmVqb2luIGFsbCBncm91cHMgYWZ0ZXIgcmVjb25uZWN0aW9uXHJcbiAgICAgIHRoaXMucmVqb2luR3JvdXBzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24ub25jbG9zZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlLnNldChDT05ORUNUSU9OX1NUQVRFLkRJU0NPTk5FQ1RFRCk7XHJcblxyXG4gICAgICAvLyBUcnkgdG8gcmVjb25uZWN0XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb25uZWN0KCksIDYwICogMTAwMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEpvaW4gU2lnbmFsUiBncm91cCBmb3IgYW4gQXBwT2JqZWN0XHJcbiAgICovXHJcbiAgYXN5bmMgam9pbkdyb3VwKGFwcE9iamVjdElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5odWJDb25uZWN0aW9uIHx8IHRoaXMuaHViQ29ubmVjdGlvbi5zdGF0ZSAhPT0gc2lnbmFsUi5IdWJDb25uZWN0aW9uU3RhdGUuQ29ubmVjdGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIXRoaXMudGVuYW50SWQgfHwgIXRoaXMuYXBwSWQgfHwgIXRoaXMuZW52aXJvbm1lbnRJZCB8fCAhYXBwT2JqZWN0SWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuaHViQ29ubmVjdGlvbi5pbnZva2UoXHJcbiAgICAgICAgU0lHTkFMUl9IVUJfTUVUSE9EUy5KT0lOX0dST1VQLFxyXG4gICAgICAgIHRoaXMudGVuYW50SWQsXHJcbiAgICAgICAgdGhpcy5hcHBJZCxcclxuICAgICAgICB0aGlzLmVudmlyb25tZW50SWQsXHJcbiAgICAgICAgYXBwT2JqZWN0SWRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIFRyYWNrIHRoaXMgZ3JvdXAgZm9yIHJlY29ubmVjdGlvblxyXG4gICAgICB0aGlzLmFjdGl2ZUdyb3Vwcy5hZGQoYXBwT2JqZWN0SWQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgW1NpZ25hbFJdIEZhaWxlZCB0byBqb2luIGdyb3VwOiAke2FwcE9iamVjdElkfWAsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExlYXZlIFNpZ25hbFIgZ3JvdXBcclxuICAgKi9cclxuICBhc3luYyBsZWF2ZUdyb3VwKGFwcE9iamVjdElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5odWJDb25uZWN0aW9uIHx8IHRoaXMuaHViQ29ubmVjdGlvbi5zdGF0ZSAhPT0gc2lnbmFsUi5IdWJDb25uZWN0aW9uU3RhdGUuQ29ubmVjdGVkKSB7XHJcbiAgICAgIC8vIFJlbW92ZSBmcm9tIHRyYWNraW5nIGV2ZW4gaWYgbm90IGNvbm5lY3RlZFxyXG4gICAgICB0aGlzLmFjdGl2ZUdyb3Vwcy5kZWxldGUoYXBwT2JqZWN0SWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnRlbmFudElkIHx8ICF0aGlzLmFwcElkIHx8ICF0aGlzLmVudmlyb25tZW50SWQgfHwgIWFwcE9iamVjdElkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLmh1YkNvbm5lY3Rpb24uaW52b2tlKFxyXG4gICAgICAgIFNJR05BTFJfSFVCX01FVEhPRFMuTEVBVkVfR1JPVVAsXHJcbiAgICAgICAgdGhpcy50ZW5hbnRJZCxcclxuICAgICAgICB0aGlzLmFwcElkLFxyXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRJZCxcclxuICAgICAgICBhcHBPYmplY3RJZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gUmVtb3ZlIGZyb20gdHJhY2tpbmdcclxuICAgICAgdGhpcy5hY3RpdmVHcm91cHMuZGVsZXRlKGFwcE9iamVjdElkKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtTaWduYWxSXSBGYWlsZWQgdG8gbGVhdmUgZ3JvdXA6ICR7YXBwT2JqZWN0SWR9YCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVqb2luIGFsbCBhY3RpdmUgZ3JvdXBzIGFmdGVyIHJlY29ubmVjdGlvblxyXG4gICAqIFRoaXMgZW5zdXJlcyBjb21wb25lbnRzIGNvbnRpbnVlIHJlY2VpdmluZyBub3RpZmljYXRpb25zIGFmdGVyIG5ldHdvcmsgaW50ZXJydXB0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyByZWpvaW5Hcm91cHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVHcm91cHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IGxpc3Qgb2YgZ3JvdXBzIHRvIHJlam9pblxyXG4gICAgY29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZUdyb3Vwcyk7XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIHNldCAod2lsbCBiZSByZS1hZGRlZCBkdXJpbmcgam9pbkdyb3VwKVxyXG4gICAgdGhpcy5hY3RpdmVHcm91cHMuY2xlYXIoKTtcclxuXHJcbiAgICAvLyBSZWpvaW4gZWFjaCBncm91cFxyXG4gICAgZm9yIChjb25zdCBhcHBPYmplY3RJZCBvZiBncm91cHMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5qb2luR3JvdXAoYXBwT2JqZWN0SWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgY29ubmVjdGVkXHJcbiAgICovXHJcbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5odWJDb25uZWN0aW9uPy5zdGF0ZSA9PT0gc2lnbmFsUi5IdWJDb25uZWN0aW9uU3RhdGUuQ29ubmVjdGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzY29ubmVjdCBmcm9tIFNpZ25hbFIgaHViIChjbGVhbnVwKVxyXG4gICAqL1xyXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5odWJDb25uZWN0aW9uKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5odWJDb25uZWN0aW9uLnN0b3AoKTtcclxuICAgICAgICB0aGlzLmh1YkNvbm5lY3Rpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlLnNldChDT05ORUNUSU9OX1NUQVRFLkRJU0NPTk5FQ1RFRCk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpZ25hbFJdIEVycm9yIGR1cmluZyBkaXNjb25uZWN0OicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFjdGl2ZSBncm91cHMgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0QWN0aXZlR3JvdXBzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlR3JvdXBzKTtcclxuICB9XHJcbn0iXX0=
314
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci1pbmZyYXN0cnVjdHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvY29yZS9zZXJ2aWNlL3NpZ25hbHIvc2lnbmFsci1pbmZyYXN0cnVjdHVyZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFJTCxtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLGNBQWMsRUFDZCxnQkFBZ0IsR0FDakIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFFMUU7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxxQkFBcUI7SUFIbEM7UUFJVSxrQkFBYSxHQUFpQyxJQUFJLENBQUM7UUFFM0QsZ0VBQWdFO1FBQ3hELHNCQUFpQixHQUF5QixJQUFJLENBQUM7UUFFdkQsd0ZBQXdGO1FBQ2hGLDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUV2QyxrQkFBa0I7UUFDVCwwQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUUvRCxnQkFBZ0I7UUFDUCx3QkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUUzRCw2QkFBNkI7UUFDcEIsb0JBQWUsR0FBRyxNQUFNLENBQWtCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWxGLDJEQUEyRDtRQUNsRCxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFvQixDQUFDO1FBRTFELG1EQUFtRDtRQUMzQyxpQkFBWSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7S0F3VTFDO0lBdFVDOzs7OztPQUtHO0lBQ0ssY0FBYyxDQUFDLElBQVksRUFBRSxHQUFXO1FBQzlDLElBQUksQ0FBQztZQUNILElBQUksSUFBSSxHQUFRLElBQUksQ0FBQztZQUVyQixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdkIsaUNBQWlDO2dCQUNqQyxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFFRCxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDckIsK0JBQStCO2dCQUMvQixJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBRUQsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3JDLG1DQUFtQztnQkFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixnREFBZ0Q7WUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekUsT0FBTyxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakYsT0FBTyxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUUsT0FBTyxVQUFVLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsT0FBTyxRQUFRLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxLQUFLLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2RSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDaEMsQ0FBQztRQUVELHNFQUFzRTtRQUN0RSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1Asc0NBQXNDO1lBQ3hDLENBQUM7WUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUMvQixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVM7UUFDckIsNEVBQTRFO1FBQzVFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFFcEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyx1RkFBdUYsQ0FBQyxDQUFDO1lBQ3ZHLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRTtpQkFDcEQsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDZixrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQzFDLGVBQWUsRUFBRSxLQUFLO2dCQUN0QixTQUFTLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCO2FBQzdGLENBQUM7aUJBQ0Qsc0JBQXNCLENBQUM7Z0JBQ3RCLDRCQUE0QixFQUFFLENBQUMsWUFBaUIsRUFBRSxFQUFFO29CQUNsRCxpREFBaUQ7b0JBQ2pELElBQUksWUFBWSxDQUFDLG1CQUFtQixHQUFHLEtBQUssRUFBRSxDQUFDO3dCQUM3QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUM5RSxDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDLENBQUMsK0JBQStCO2dCQUM5QyxDQUFDO2FBQ0YsQ0FBQztpQkFDRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztpQkFDOUMsS0FBSyxFQUFFLENBQUM7WUFFWCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUVuQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVsRCw4RUFBOEU7WUFDOUUsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsQ0FBQztZQUNILENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPO1FBRWhDLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFO1lBQ3hFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDL0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRTtZQUN4RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEQsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLFlBQVksRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQy9GLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUU7WUFDeEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxZQUFZLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMvRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxtQkFBbUIsQ0FBQyxJQUFXO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyQiwrRkFBK0Y7UUFDL0YsSUFBSSxJQUFJLEVBQUUsU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDckQsT0FBUSxJQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsMERBQTBEO1FBQzFELE9BQU8sSUFBd0IsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSywyQkFBMkI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUVoQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUU7WUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFckQsdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUV4RCwyRUFBMkU7WUFDM0UsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsQ0FBQztZQUNILENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQW1CO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3RixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDekUsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUM3QixtQkFBbUIsQ0FBQyxVQUFVLEVBQzlCLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsYUFBYSxFQUNsQixXQUFXLENBQ1osQ0FBQztZQUVGLG9DQUFvQztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQW1CO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3Riw2Q0FBNkM7WUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekUsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUM3QixtQkFBbUIsQ0FBQyxXQUFXLEVBQy9CLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsYUFBYSxFQUNsQixXQUFXLENBQ1osQ0FBQztZQUVGLHVCQUF1QjtZQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFFLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLFlBQVk7UUFDeEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxPQUFPO1FBQ1QsQ0FBQztRQUVELCtCQUErQjtRQUMvQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU3QyxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUxQixvQkFBb0I7UUFDcEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxLQUFLLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDOytHQTdWVSxxQkFBcUI7bUhBQXJCLHFCQUFxQixjQUZwQixNQUFNOzs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgc2lnbmFsUiBmcm9tICdAbWljcm9zb2Z0L3NpZ25hbHInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbW1vbiB9IGZyb20gJy4uLy4uLy4uL2FwcC9jb25zdGFudHMvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb25uZWN0aW9uU3RhdGUsXHJcbiAgQ3J1ZE5vdGlmaWNhdGlvbixcclxuICBTaWduYWxSTWVzc2FnZSxcclxuICBTSUdOQUxSX0hVQl9NRVRIT0RTLFxyXG4gIFNJR05BTFJfRVZFTlRTLFxyXG4gIENSVURfT1BFUkFUSU9OLFxyXG4gIENPTk5FQ1RJT05fU1RBVEUsXHJcbn0gZnJvbSAnLi4vLi4vLi4vYXBwL2ludGVyZmFjZXMvc2lnbmFsci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBTdG9yYWdlQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vYXBwL2NvbnN0YW50cy9zdG9yYWdlLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2F1dGgvc2Vzc2lvbi1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXV0aC9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIFNpZ25hbFIgSW5mcmFzdHJ1Y3R1cmUgU2VydmljZVxyXG4gKiBIYW5kbGVzIGxvdy1sZXZlbCBXZWJTb2NrZXQgY29ubmVjdGlvbiwgZ3JvdXAgbWFuYWdlbWVudCwgYW5kIHJlY29ubmVjdGlvblxyXG4gKiBJbnRlcm5hbCB1c2Ugb25seSAtIGNvbXBvbmVudHMgc2hvdWxkIHVzZSBTaWduYWxSU2VydmljZSBpbnN0ZWFkXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2lnbmFsUkluZnJhc3RydWN0dXJlIHtcclxuICBwcml2YXRlIGh1YkNvbm5lY3Rpb246IHNpZ25hbFIuSHViQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyBJbi1mbGlnaHQgY29ubmVjdCgpIHByb21pc2Ug4oCUIHVzZWQgdG8gZGVkdXBlIGNvbmN1cnJlbnQgY2FsbHNcclxuICBwcml2YXRlIGNvbm5lY3RpbmdQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIFNldCB0cnVlIG9uIGV4cGxpY2l0IGRpc2Nvbm5lY3QoKSBzbyBzY2hlZHVsZWQgcmV0cmllcyBkb24ndCByZXN1cnJlY3QgdGhlIGNvbm5lY3Rpb25cclxuICBwcml2YXRlIGV4cGxpY2l0bHlEaXNjb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8gU2Vzc2lvbiBzdG9yYWdlXHJcbiAgcmVhZG9ubHkgc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlID0gaW5qZWN0KFNlc3Npb25TdG9yYWdlU2VydmljZSk7XHJcblxyXG4gIC8vIGxvY2FsIHN0b3JhZ2VcclxuICByZWFkb25seSBsb2NhbFN0b3JhZ2VTZXJ2aWNlID0gaW5qZWN0KExvY2FsU3RvcmFnZVNlcnZpY2UpO1xyXG5cclxuICAvLyBDb25uZWN0aW9uIHN0YXRlIGFzIHNpZ25hbFxyXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25TdGF0ZSA9IHNpZ25hbDxDb25uZWN0aW9uU3RhdGU+KENPTk5FQ1RJT05fU1RBVEUuRElTQ09OTkVDVEVEKTtcclxuXHJcbiAgLy8gTm90aWZpY2F0aW9uIHN0cmVhbSAoaW50ZXJuYWwgLSBlbWl0cyB0byBTaWduYWxSU2VydmljZSlcclxuICByZWFkb25seSBub3RpZmljYXRpb25zJCA9IG5ldyBTdWJqZWN0PENydWROb3RpZmljYXRpb24+KCk7XHJcblxyXG4gIC8vIFRyYWNrIGFjdGl2ZSBncm91cHMgdG8gcmVqb2luIGFmdGVyIHJlY29ubmVjdGlvblxyXG4gIHByaXZhdGUgYWN0aXZlR3JvdXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHZhbHVlIGZyb20gc3RvcmFnZVxyXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHN0b3JhZ2UsICdTZXNzaW9uJyBvciAnTG9jYWwnXHJcbiAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3JcclxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgZnJvbSBzdG9yYWdlLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEZyb21TdG9yYWdlKHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBpbmZvOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgaWYgKHR5cGUgPT09ICdTZXNzaW9uJykge1xyXG4gICAgICAgIC8vIEdldCB2YWx1ZSBmcm9tIHNlc3Npb24gc3RvcmFnZVxyXG4gICAgICAgIGluZm8gPSB0aGlzLnNlc3Npb25TdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uU3RvcmFnZShrZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZSA9PT0gJ0xvY2FsJykge1xyXG4gICAgICAgIC8vIEdldCB2YWx1ZSBmcm9tIGxvY2FsIHN0b3JhZ2VcclxuICAgICAgICBpbmZvID0gdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldExvY2FsU3RvcmFnZShrZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW5mbyAmJiB0eXBlb2YgaW5mbyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdmFsdWUgaWYgaXQncyBhIHN0cmluZ1xyXG4gICAgICAgIGluZm8gPSBKU09OLnBhcnNlKGluZm8pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gaW5mbztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIExvZyBlcnJvciBpZiBmYWlsZWQgdG8gZ2V0IHZhbHVlIGZyb20gc3RvcmFnZVxyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBnZXQgY3VycmVudCBhcHAgSUQgZnJvbSBzZXNzaW9uOicsIGVycm9yKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXBwSWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBhcHBJbmZvID0gdGhpcy5nZXRGcm9tU3RvcmFnZSgnU2Vzc2lvbicsIFN0b3JhZ2VDb25zdGFudHMuYXBwSW5mbyk7XHJcbiAgICByZXR1cm4gYXBwSW5mbz8uSWQgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBlbnZpcm9ubWVudElkKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgZW52SW5mbyA9IHRoaXMuZ2V0RnJvbVN0b3JhZ2UoJ1Nlc3Npb24nLCBTdG9yYWdlQ29uc3RhbnRzLmVudmlyb25tZW50SW5mbyk7XHJcbiAgICByZXR1cm4gZW52SW5mbz8uSWQgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCB0ZW5hbnRJZCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHRlbmFudEluZm8gPSB0aGlzLmdldEZyb21TdG9yYWdlKCdMb2NhbCcsIFN0b3JhZ2VDb25zdGFudHMub3JnSW5mbyk7XHJcbiAgICByZXR1cm4gdGVuYW50SW5mbz8uSWQgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCB0b2tlbigpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IGF1dGhJbmZvID0gdGhpcy5nZXRGcm9tU3RvcmFnZSgnTG9jYWwnLCBTdG9yYWdlQ29uc3RhbnRzLnRva2VuSW5mbyk7XHJcbiAgICByZXR1cm4gYXV0aEluZm8/LnRva2VuIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25uZWN0IHRvIFNpZ25hbFIgaHViXHJcbiAgICpcclxuICAgKiBJZGVtcG90ZW50IGFuZCBzYWZlIHRvIGNhbGwgZnJvbSBtdWx0aXBsZSBzaXRlczpcclxuICAgKiAtIGFscmVhZHkgQ09OTkVDVEVEIOKGkiByZXR1cm5zIGltbWVkaWF0ZWx5XHJcbiAgICogLSBhbHJlYWR5IENPTk5FQ1RJTkcg4oaSIHJldHVybnMgdGhlIGluLWZsaWdodCBwcm9taXNlXHJcbiAgICogLSBhbnkgbm9uLUNvbm5lY3RlZCBsZWZ0b3ZlciBodWJDb25uZWN0aW9uIOKGkiB0b3JuIGRvd24gYmVmb3JlIHJlYnVpbGRcclxuICAgKi9cclxuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5leHBsaWNpdGx5RGlzY29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuaHViQ29ubmVjdGlvbj8uc3RhdGUgPT09IHNpZ25hbFIuSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29ubmVjdGluZ1Byb21pc2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGluZ1Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGVhciBkb3duIGFueSBzdGFsZSAobm9uLUNvbm5lY3RlZCkgaHViQ29ubmVjdGlvbiBiZWZvcmUgcmVidWlsZGluZ1xyXG4gICAgaWYgKHRoaXMuaHViQ29ubmVjdGlvbikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaHViQ29ubmVjdGlvbi5zdG9wKCk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIC8vIGlnbm9yZSDigJQgd2UncmUgZGlzY2FyZGluZyBpdCBhbnl3YXlcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmh1YkNvbm5lY3Rpb24gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29ubmVjdGluZ1Byb21pc2UgPSB0aGlzLmRvQ29ubmVjdCgpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW5nUHJvbWlzZTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuY29ubmVjdGluZ1Byb21pc2UgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkb0Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBHZXQgaHViIFVSTCBmcm9tIENvbW1vbiAoc2V0IGR1cmluZyBhcHAgaW5pdGlhbGl6YXRpb24gdmlhIENvbW1vbi5pbml0KCkpXHJcbiAgICBjb25zdCBodWJVcmwgPSBDb21tb24uc2lnbmFsUkh1YlVybDtcclxuXHJcbiAgICBpZiAoIWh1YlVybCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbU2lnbmFsUl0gSHViIFVSTCBub3QgY29uZmlndXJlZC4gTWFrZSBzdXJlIENvbW1vbi5pbml0KCkgaXMgY2FsbGVkIHdpdGggZW52aXJvbm1lbnQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZS5zZXQoQ09OTkVDVElPTl9TVEFURS5DT05ORUNUSU5HKTtcclxuXHJcbiAgICAgIHRoaXMuaHViQ29ubmVjdGlvbiA9IG5ldyBzaWduYWxSLkh1YkNvbm5lY3Rpb25CdWlsZGVyKClcclxuICAgICAgICAud2l0aFVybChodWJVcmwsIHtcclxuICAgICAgICAgIGFjY2Vzc1Rva2VuRmFjdG9yeTogKCkgPT4gdGhpcy50b2tlbiB8fCAnJyxcclxuICAgICAgICAgIHNraXBOZWdvdGlhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICB0cmFuc3BvcnQ6IHNpZ25hbFIuSHR0cFRyYW5zcG9ydFR5cGUuV2ViU29ja2V0cyB8IHNpZ25hbFIuSHR0cFRyYW5zcG9ydFR5cGUuU2VydmVyU2VudEV2ZW50cyxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aXRoQXV0b21hdGljUmVjb25uZWN0KHtcclxuICAgICAgICAgIG5leHRSZXRyeURlbGF5SW5NaWxsaXNlY29uZHM6IChyZXRyeUNvbnRleHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmOiAwcywgMnMsIDEwcywgMzBzLCBtYXggNjBzXHJcbiAgICAgICAgICAgIGlmIChyZXRyeUNvbnRleHQuZWxhcHNlZE1pbGxpc2Vjb25kcyA8IDYwMDAwKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKDEwMDAgKiBNYXRoLnBvdygyLCByZXRyeUNvbnRleHQucHJldmlvdXNSZXRyeUNvdW50KSwgNjAwMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBTdG9wIHJldHJ5aW5nIGFmdGVyIDEgbWludXRlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNvbmZpZ3VyZUxvZ2dpbmcoc2lnbmFsUi5Mb2dMZXZlbC5JbmZvcm1hdGlvbilcclxuICAgICAgICAuYnVpbGQoKTtcclxuXHJcbiAgICAgIHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXJzKCk7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJDb25uZWN0aW9uTGlmZWN5Y2xlKCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmh1YkNvbm5lY3Rpb24uc3RhcnQoKTtcclxuXHJcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlLnNldChDT05ORUNUSU9OX1NUQVRFLkNPTk5FQ1RFRCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZS5zZXQoQ09OTkVDVElPTl9TVEFURS5GQUlMRUQpO1xyXG5cclxuICAgICAgLy8gUmV0cnkgYWZ0ZXIgMSBtaW51dGUsIGJ1dCBvbmx5IGlmIHRoZSBjYWxsZXIgaGFzbid0IGV4cGxpY2l0bHkgZGlzY29ubmVjdGVkXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5leHBsaWNpdGx5RGlzY29ubmVjdGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDYwICogMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBTaWduYWxSIGV2ZW50IGhhbmRsZXJzIGZvciBDUlVEIG5vdGlmaWNhdGlvbnNcclxuICAgKi9cclxuICBwcml2YXRlIHJlZ2lzdGVyRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5odWJDb25uZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgLy8gSU5TRVJUIG5vdGlmaWNhdGlvbnNcclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbihTSUdOQUxSX0VWRU5UUy5JTlNFUlRfQ09NUExFVEVELCAoLi4uYXJnczogYW55W10pID0+IHtcclxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gdGhpcy5leHRyYWN0Tm90aWZpY2F0aW9uKGFyZ3MpO1xyXG4gICAgICBjb25zdCBlbnJpY2hlZCA9IHsgLi4ubm90aWZpY2F0aW9uLCBvcGVyYXRpb246IENSVURfT1BFUkFUSU9OLklOU0VSVCwgcmVjZWl2ZWRBdDogbmV3IERhdGUoKSB9O1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLm5leHQoZW5yaWNoZWQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVVBEQVRFIG5vdGlmaWNhdGlvbnNcclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbihTSUdOQUxSX0VWRU5UUy5VUERBVEVfQ09NUExFVEVELCAoLi4uYXJnczogYW55W10pID0+IHtcclxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gdGhpcy5leHRyYWN0Tm90aWZpY2F0aW9uKGFyZ3MpO1xyXG4gICAgICBjb25zdCBlbnJpY2hlZCA9IHsgLi4ubm90aWZpY2F0aW9uLCBvcGVyYXRpb246IENSVURfT1BFUkFUSU9OLlVQREFURSwgcmVjZWl2ZWRBdDogbmV3IERhdGUoKSB9O1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLm5leHQoZW5yaWNoZWQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gREVMRVRFIG5vdGlmaWNhdGlvbnNcclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbihTSUdOQUxSX0VWRU5UUy5ERUxFVEVfQ09NUExFVEVELCAoLi4uYXJnczogYW55W10pID0+IHtcclxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gdGhpcy5leHRyYWN0Tm90aWZpY2F0aW9uKGFyZ3MpO1xyXG4gICAgICBjb25zdCBlbnJpY2hlZCA9IHsgLi4ubm90aWZpY2F0aW9uLCBvcGVyYXRpb246IENSVURfT1BFUkFUSU9OLkRFTEVURSwgcmVjZWl2ZWRBdDogbmV3IERhdGUoKSB9O1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLm5leHQoZW5yaWNoZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHRyYWN0IG5vdGlmaWNhdGlvbiBmcm9tIFNpZ25hbFIgY2FsbGJhY2sgYXJnc1xyXG4gICAqIEhhbmRsZXMgYm90aCB1bndyYXBwZWQgKGRpcmVjdCBvYmplY3QpIGFuZCB3cmFwcGVkICh7IHR5cGUsIHRhcmdldCwgYXJndW1lbnRzIH0pIGZvcm1hdHNcclxuICAgKi9cclxuICBwcml2YXRlIGV4dHJhY3ROb3RpZmljYXRpb24oYXJnczogYW55W10pOiBDcnVkTm90aWZpY2F0aW9uIHtcclxuICAgIGNvbnN0IGRhdGEgPSBhcmdzWzBdO1xyXG5cclxuICAgIC8vIElmIFNpZ25hbFIgZGlkbid0IHVud3JhcDogZGF0YSBpcyByYXcgU2lnbmFsUk1lc3NhZ2Ugd2l0aCB7IHR5cGUsIHRhcmdldCwgYXJndW1lbnRzOiBbLi4uXSB9XHJcbiAgICBpZiAoZGF0YT8uYXJndW1lbnRzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5hcmd1bWVudHMpKSB7XHJcbiAgICAgIHJldHVybiAoZGF0YSBhcyBTaWduYWxSTWVzc2FnZSkuYXJndW1lbnRzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIFNpZ25hbFIgdW53cmFwcGVkOiBkYXRhIGlzIHRoZSBub3RpZmljYXRpb24gZGlyZWN0bHlcclxuICAgIHJldHVybiBkYXRhIGFzIENydWROb3RpZmljYXRpb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBjb25uZWN0aW9uIGxpZmVjeWNsZSBoYW5kbGVyc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJDb25uZWN0aW9uTGlmZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmh1YkNvbm5lY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24ub25yZWNvbm5lY3RpbmcoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZS5zZXQoQ09OTkVDVElPTl9TVEFURS5SRUNPTk5FQ1RJTkcpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5odWJDb25uZWN0aW9uLm9ucmVjb25uZWN0ZWQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZS5zZXQoQ09OTkVDVElPTl9TVEFURS5DT05ORUNURUQpO1xyXG5cclxuICAgICAgLy8gUmVqb2luIGFsbCBncm91cHMgYWZ0ZXIgcmVjb25uZWN0aW9uXHJcbiAgICAgIHRoaXMucmVqb2luR3JvdXBzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24ub25jbG9zZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlLnNldChDT05ORUNUSU9OX1NUQVRFLkRJU0NPTk5FQ1RFRCk7XHJcblxyXG4gICAgICAvLyBUcnkgdG8gcmVjb25uZWN0IOKAlCBidXQgb25seSBpZiB0aGUgY2FsbGVyIGhhc24ndCBleHBsaWNpdGx5IGRpc2Nvbm5lY3RlZFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZXhwbGljaXRseURpc2Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCA2MCAqIDEwMDApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBKb2luIFNpZ25hbFIgZ3JvdXAgZm9yIGFuIEFwcE9iamVjdFxyXG4gICAqL1xyXG4gIGFzeW5jIGpvaW5Hcm91cChhcHBPYmplY3RJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuaHViQ29ubmVjdGlvbiB8fCB0aGlzLmh1YkNvbm5lY3Rpb24uc3RhdGUgIT09IHNpZ25hbFIuSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF0aGlzLnRlbmFudElkIHx8ICF0aGlzLmFwcElkIHx8ICF0aGlzLmVudmlyb25tZW50SWQgfHwgIWFwcE9iamVjdElkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmh1YkNvbm5lY3Rpb24uaW52b2tlKFxyXG4gICAgICAgIFNJR05BTFJfSFVCX01FVEhPRFMuSk9JTl9HUk9VUCxcclxuICAgICAgICB0aGlzLnRlbmFudElkLFxyXG4gICAgICAgIHRoaXMuYXBwSWQsXHJcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudElkLFxyXG4gICAgICAgIGFwcE9iamVjdElkXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBUcmFjayB0aGlzIGdyb3VwIGZvciByZWNvbm5lY3Rpb25cclxuICAgICAgdGhpcy5hY3RpdmVHcm91cHMuYWRkKGFwcE9iamVjdElkKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtTaWduYWxSXSBGYWlsZWQgdG8gam9pbiBncm91cDogJHthcHBPYmplY3RJZH1gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMZWF2ZSBTaWduYWxSIGdyb3VwXHJcbiAgICovXHJcbiAgYXN5bmMgbGVhdmVHcm91cChhcHBPYmplY3RJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuaHViQ29ubmVjdGlvbiB8fCB0aGlzLmh1YkNvbm5lY3Rpb24uc3RhdGUgIT09IHNpZ25hbFIuSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RlZCkge1xyXG4gICAgICAvLyBSZW1vdmUgZnJvbSB0cmFja2luZyBldmVuIGlmIG5vdCBjb25uZWN0ZWRcclxuICAgICAgdGhpcy5hY3RpdmVHcm91cHMuZGVsZXRlKGFwcE9iamVjdElkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy50ZW5hbnRJZCB8fCAhdGhpcy5hcHBJZCB8fCAhdGhpcy5lbnZpcm9ubWVudElkIHx8ICFhcHBPYmplY3RJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5odWJDb25uZWN0aW9uLmludm9rZShcclxuICAgICAgICBTSUdOQUxSX0hVQl9NRVRIT0RTLkxFQVZFX0dST1VQLFxyXG4gICAgICAgIHRoaXMudGVuYW50SWQsXHJcbiAgICAgICAgdGhpcy5hcHBJZCxcclxuICAgICAgICB0aGlzLmVudmlyb25tZW50SWQsXHJcbiAgICAgICAgYXBwT2JqZWN0SWRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIFJlbW92ZSBmcm9tIHRyYWNraW5nXHJcbiAgICAgIHRoaXMuYWN0aXZlR3JvdXBzLmRlbGV0ZShhcHBPYmplY3RJZCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBbU2lnbmFsUl0gRmFpbGVkIHRvIGxlYXZlIGdyb3VwOiAke2FwcE9iamVjdElkfWAsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlam9pbiBhbGwgYWN0aXZlIGdyb3VwcyBhZnRlciByZWNvbm5lY3Rpb25cclxuICAgKiBUaGlzIGVuc3VyZXMgY29tcG9uZW50cyBjb250aW51ZSByZWNlaXZpbmcgbm90aWZpY2F0aW9ucyBhZnRlciBuZXR3b3JrIGludGVycnVwdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVqb2luR3JvdXBzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBzLnNpemUgPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCBsaXN0IG9mIGdyb3VwcyB0byByZWpvaW5cclxuICAgIGNvbnN0IGdyb3VwcyA9IEFycmF5LmZyb20odGhpcy5hY3RpdmVHcm91cHMpO1xyXG5cclxuICAgIC8vIENsZWFyIHRoZSBzZXQgKHdpbGwgYmUgcmUtYWRkZWQgZHVyaW5nIGpvaW5Hcm91cClcclxuICAgIHRoaXMuYWN0aXZlR3JvdXBzLmNsZWFyKCk7XHJcblxyXG4gICAgLy8gUmVqb2luIGVhY2ggZ3JvdXBcclxuICAgIGZvciAoY29uc3QgYXBwT2JqZWN0SWQgb2YgZ3JvdXBzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuam9pbkdyb3VwKGFwcE9iamVjdElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGNvbm5lY3RlZFxyXG4gICAqL1xyXG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHViQ29ubmVjdGlvbj8uc3RhdGUgPT09IHNpZ25hbFIuSHViQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc2Nvbm5lY3QgZnJvbSBTaWduYWxSIGh1YiAoY2xlYW51cClcclxuICAgKlxyXG4gICAqIFNldHMgZXhwbGljaXRseURpc2Nvbm5lY3RlZCBzbyBhbnkgcGVuZGluZyByZXRyeSB0aW1lcnMgZnJvbSBjb25uZWN0KCkvb25jbG9zZVxyXG4gICAqIGJlY29tZSBuby1vcHMsIHRoZW4gc3RvcHMgdGhlIGh1YiBhbmQgY2xlYXJzIHRyYWNrZWQgZ3JvdXBzLlxyXG4gICAqL1xyXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmV4cGxpY2l0bHlEaXNjb25uZWN0ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5jb25uZWN0aW5nUHJvbWlzZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuaHViQ29ubmVjdGlvbikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaHViQ29ubmVjdGlvbi5zdG9wKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpZ25hbFJdIEVycm9yIGR1cmluZyBkaXNjb25uZWN0OicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmh1YkNvbm5lY3Rpb24gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aXZlR3JvdXBzLmNsZWFyKCk7XHJcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZS5zZXQoQ09OTkVDVElPTl9TVEFURS5ESVNDT05ORUNURUQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFjdGl2ZSBncm91cHMgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0QWN0aXZlR3JvdXBzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlR3JvdXBzKTtcclxuICB9XHJcbn0iXX0=
@@ -55,13 +55,29 @@ export class SignalRService {
55
55
  });
56
56
  }
57
57
  /**
58
- * Establish a connection to the SignalR hub
58
+ * Establish a connection to the SignalR hub.
59
+ *
60
+ * Awaitable — the returned promise resolves when the first connection attempt
61
+ * settles (success or failure). Idempotent: repeated calls are de-duplicated;
62
+ * if already CONNECTED, resolves immediately.
59
63
  *
60
- * This method is idempotent - if the connection is already established, it will not be re-established.
61
64
  * Hub URL is read from Common.signalRHubUrl (set during app initialization via Common.init())
62
65
  */
63
- connect() {
64
- this.infrastructure.connect();
66
+ async connect() {
67
+ await this.infrastructure.connect();
68
+ }
69
+ /**
70
+ * Tear down the connection (call from auth signOut or cross-tab logout).
71
+ *
72
+ * - Stops the hub and clears tracked groups
73
+ * - Drops all component registrations (stale once the socket dies)
74
+ * - Errors any in-flight waitForOperation() observers so the UI doesn't
75
+ * strand until the 120s timeout
76
+ */
77
+ async disconnect() {
78
+ await this.infrastructure.disconnect();
79
+ this.componentRegistry.clear();
80
+ this.operationTracker.cancelAll('disconnected');
65
81
  }
66
82
  /**
67
83
  * Register component for real-time notifications
@@ -204,4 +220,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
204
220
  providedIn: 'root',
205
221
  }]
206
222
  }], ctorParameters: () => [] });
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvY29yZS9zZXJ2aWNlL3NpZ25hbHIvc2lnbmFsci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBSUwsZ0JBQWdCLEdBQ2pCLE1BQU0sMkNBQTJDLENBQUM7O0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFpQnpCO1FBaEJRLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MscUJBQWdCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFM0QseURBQXlEO1FBQ2pELHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUE2QyxDQUFDO1FBRWpGOztXQUVHO1FBQ00sb0JBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUUvRDs7V0FFRztRQUNNLGdCQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUczRiw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDNUQsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FB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O0lBQy9DLENBQUM7K0dBNUxVLGNBQWM7bUhBQWQsY0FBYyxjQUZiLE1BQU07OzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNpZ25hbFJJbmZyYXN0cnVjdHVyZSB9IGZyb20gJy4vc2lnbmFsci1pbmZyYXN0cnVjdHVyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3BlcmF0aW9uVHJhY2tlclNlcnZpY2UgfSBmcm9tICcuL29wZXJhdGlvbi10cmFja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIENydWROb3RpZmljYXRpb24sXHJcbiAgTm90aWZpY2F0aW9uQ2FsbGJhY2ssXHJcbiAgUGVuZGluZ09wZXJhdGlvbixcclxuICBDT05ORUNUSU9OX1NUQVRFLFxyXG59IGZyb20gJy4uLy4uLy4uL2FwcC9pbnRlcmZhY2VzL3NpZ25hbHIuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBTaWduYWxSIFNlcnZpY2VcclxuICogUHVibGljIEFQSSBmb3I6XHJcbiAqIDEuIENvbXBvbmVudHMgdG8gcmVnaXN0ZXIgZm9yIHJlYWwtdGltZSBDUlVEIG5vdGlmaWNhdGlvbnNcclxuICogMi4gU2VydmljZXMgKFRhYkZvcm1pb1NlcnZpY2UpIHRvIHRyYWNrIGFzeW5jIG9wZXJhdGlvbnNcclxuICpcclxuICogVXNhZ2UgaW4gY29tcG9uZW50czpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBuZ09uSW5pdCgpIHtcclxuICogICB0aGlzLnNpZ25hbFJTZXJ2aWNlLnJlZ2lzdGVyKFxyXG4gKiAgICAgdGhpcy5jb21wb25lbnRJZCxcclxuICogICAgIHRoaXMuYXBwT2JqZWN0SWQsXHJcbiAqICAgICAobm90aWZpY2F0aW9uKSA9PiB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pXHJcbiAqICAgKTtcclxuICogfVxyXG4gKlxyXG4gKiBuZ09uRGVzdHJveSgpIHtcclxuICogICB0aGlzLnNpZ25hbFJTZXJ2aWNlLnVucmVnaXN0ZXIodGhpcy5jb21wb25lbnRJZCwgdGhpcy5hcHBPYmplY3RJZCk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFVzYWdlIGluIHNlcnZpY2VzIChUYWJGb3JtaW9TZXJ2aWNlKTpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBjb3JyZWxhdGlvbklkID0gcmVzcG9uc2UuY29ycmVsYXRpb25JZDtcclxuICogdGhpcy5zaWduYWxSU2VydmljZS53YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQpLnN1YnNjcmliZShub3RpZmljYXRpb24gPT4ge1xyXG4gKiAgIC8vIEhhbmRsZSBjb21wbGV0ZWQgb3BlcmF0aW9uXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaWduYWxSU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBpbmZyYXN0cnVjdHVyZSA9IGluamVjdChTaWduYWxSSW5mcmFzdHJ1Y3R1cmUpO1xyXG4gIHByaXZhdGUgb3BlcmF0aW9uVHJhY2tlciA9IGluamVjdChPcGVyYXRpb25UcmFja2VyU2VydmljZSk7XHJcblxyXG4gIC8vIFJlZ2lzdHJ5OiBNYXA8YXBwT2JqZWN0SWQsIE1hcDxjb21wb25lbnRJZCwgY2FsbGJhY2s+PlxyXG4gIHByaXZhdGUgY29tcG9uZW50UmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgTm90aWZpY2F0aW9uQ2FsbGJhY2s+PigpO1xyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29ubmVjdGlvbiBzdGF0ZSAoZm9yIFVJIGluZGljYXRvcnMpXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY29ubmVjdGlvblN0YXRlID0gdGhpcy5pbmZyYXN0cnVjdHVyZS5jb25uZWN0aW9uU3RhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGN1cnJlbnRseSBjb25uZWN0ZWRcclxuICAgKi9cclxuICByZWFkb25seSBpc0Nvbm5lY3RlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IENPTk5FQ1RJT05fU1RBVEUuQ09OTkVDVEVEKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAvLyBMaXN0ZW4gdG8gbm90aWZpY2F0aW9ucyBmcm9tIGluZnJhc3RydWN0dXJlIGFuZCByb3V0ZSB0aGVtXHJcbiAgICB0aGlzLmluZnJhc3RydWN0dXJlLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSgobm90aWZpY2F0aW9uKSA9PiB7XHJcbiAgICAgIC8vIDEuIENoZWNrIGlmIHRoaXMgaXMgYSB0cmFja2VkIGFzeW5jIG9wZXJhdGlvbiAocHJvY2Vzc1JlcXVlc3QpXHJcbiAgICAgIHRoaXMub3BlcmF0aW9uVHJhY2tlci5oYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcclxuXHJcbiAgICAgIC8vIDIuIEFsc28gbm90aWZ5IGNvbXBvbmVudHMgc3Vic2NyaWJlZCB0byB0aGlzIGFwcE9iamVjdElkIChHcmlkLCBldGMuKVxyXG4gICAgICB0aGlzLm5vdGlmeUNvbXBvbmVudHMobm90aWZpY2F0aW9uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgU2lnbmFsUiBodWJcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQgLSBpZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLCBpdCB3aWxsIG5vdCBiZSByZS1lc3RhYmxpc2hlZC5cclxuICAgKiBIdWIgVVJMIGlzIHJlYWQgZnJvbSBDb21tb24uc2lnbmFsUkh1YlVybCAoc2V0IGR1cmluZyBhcHAgaW5pdGlhbGl6YXRpb24gdmlhIENvbW1vbi5pbml0KCkpXHJcbiAgICovXHJcbiAgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmUuY29ubmVjdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgY29tcG9uZW50IGZvciByZWFsLXRpbWUgbm90aWZpY2F0aW9uc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbXBvbmVudElkIC0gVW5pcXVlIGNvbXBvbmVudCBpZGVudGlmaWVyIChnZW5lcmF0ZWQgYnkgY29tcG9uZW50KVxyXG4gICAqIEBwYXJhbSBhcHBPYmplY3RJZCAtIEFwcE9iamVjdCBJRCB0byBzdWJzY3JpYmUgdG9cclxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbm90aWZpY2F0aW9uIHJlY2VpdmVkXHJcbiAgICovXHJcbiAgcmVnaXN0ZXIoY29tcG9uZW50SWQ6IHN0cmluZywgYXBwT2JqZWN0SWQ6IHN0cmluZywgY2FsbGJhY2s6IE5vdGlmaWNhdGlvbkNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAvLyBJbml0aWFsaXplIG1hcCBmb3IgdGhpcyBBcHBPYmplY3QgaWYgZG9lc24ndCBleGlzdFxyXG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmhhcyhhcHBPYmplY3RJZCkpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWdpc3RyeS5zZXQoYXBwT2JqZWN0SWQsIG5ldyBNYXAoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZ2V0KGFwcE9iamVjdElkKSE7XHJcblxyXG4gICAgLy8gRmlyc3QgY29tcG9uZW50IGZvciB0aGlzIEFwcE9iamVjdD8gSm9pbiBTaWduYWxSIGdyb3VwXHJcbiAgICBpZiAoY29tcG9uZW50cy5zaXplID09PSAwKSB7XHJcbiAgICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmUuam9pbkdyb3VwKGFwcE9iamVjdElkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgY29tcG9uZW50IHRvIHJlZ2lzdHJ5XHJcbiAgICBjb21wb25lbnRzLnNldChjb21wb25lbnRJZCwgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5yZWdpc3RlciBjb21wb25lbnQgKGNsZWFudXAgb24gY29tcG9uZW50IGRlc3Ryb3kpXHJcbiAgICpcclxuICAgKiBAcGFyYW0gY29tcG9uZW50SWQgLSBDb21wb25lbnQgaWRlbnRpZmllciB0byByZW1vdmVcclxuICAgKiBAcGFyYW0gYXBwT2JqZWN0SWQgLSBBcHBPYmplY3QgSUQgdG8gdW5zdWJzY3JpYmUgZnJvbVxyXG4gICAqL1xyXG4gIHVucmVnaXN0ZXIoY29tcG9uZW50SWQ6IHN0cmluZywgYXBwT2JqZWN0SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZ2V0KGFwcE9iamVjdElkKTtcclxuICAgIGlmICghY29tcG9uZW50cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIGNvbXBvbmVudCBmcm9tIHJlZ2lzdHJ5XHJcbiAgICBjb21wb25lbnRzLmRlbGV0ZShjb21wb25lbnRJZCk7XHJcblxyXG4gICAgLy8gTGFzdCBjb21wb25lbnQgZm9yIHRoaXMgQXBwT2JqZWN0PyBMZWF2ZSBTaWduYWxSIGdyb3VwXHJcbiAgICBpZiAoY29tcG9uZW50cy5zaXplID09PSAwKSB7XHJcbiAgICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmUubGVhdmVHcm91cChhcHBPYmplY3RJZCk7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZGVsZXRlKGFwcE9iamVjdElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdhaXQgZm9yIHNwZWNpZmljIGFzeW5jIG9wZXJhdGlvbiB0byBjb21wbGV0ZVxyXG4gICAqIFVzZWQgYnkgVGFiRm9ybWlvU2VydmljZSBmb3IgYXN5bmMgcHJvY2Vzc1JlcXVlc3Qgb3BlcmF0aW9uc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQgLSBDb3JyZWxhdGlvbiBJRCBmcm9tIGJhY2tlbmQgcmVzcG9uc2VcclxuICAgKiBAcGFyYW0gdGltZW91dCAtIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlc1xyXG4gICAqL1xyXG4gIHdhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZDogc3RyaW5nLCB0aW1lb3V0PzogbnVtYmVyKTogT2JzZXJ2YWJsZTxDcnVkTm90aWZpY2F0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25UcmFja2VyLndhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZCwgdGltZW91dCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBhc3luYyBvcGVyYXRpb24gZm9yIHRyYWNraW5nXHJcbiAgICogT3B0aW9uYWwgLSB3YWl0Rm9yT3BlcmF0aW9uIGhhbmRsZXMgcmVnaXN0cmF0aW9uIGF1dG9tYXRpY2FsbHlcclxuICAgKlxyXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBQZW5kaW5nIG9wZXJhdGlvbiBkZXRhaWxzXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPcGVyYXRpb24ob3BlcmF0aW9uOiBQZW5kaW5nT3BlcmF0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wZXJhdGlvblRyYWNrZXIucmVnaXN0ZXJPcGVyYXRpb24ob3BlcmF0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIG9wZXJhdGlvbiBpcyBwZW5kaW5nXHJcbiAgICovXHJcbiAgaXNPcGVyYXRpb25QZW5kaW5nKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHJhY2tlci5pc1BlbmRpbmcoY29ycmVsYXRpb25JZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOb3RpZnkgYWxsIHJlZ2lzdGVyZWQgY29tcG9uZW50cyBmb3IgYW4gQXBwT2JqZWN0XHJcbiAgICogQ2FsbGVkIHdoZW4gbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZyb20gU2lnbmFsUiBodWJcclxuICAgKi9cclxuICBwcml2YXRlIG5vdGlmeUNvbXBvbmVudHMobm90aWZpY2F0aW9uOiBDcnVkTm90aWZpY2F0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRSZWdpc3RyeS5nZXQobm90aWZpY2F0aW9uLmFwcE9iamVjdElkKTtcclxuXHJcbiAgICBpZiAoIWNvbXBvbmVudHMgfHwgY29tcG9uZW50cy5zaXplID09PSAwKSB7XHJcbiAgICAgIC8vIE5vIGNvbXBvbmVudHMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBBcHBPYmplY3QgLSBpZ25vcmUgbm90aWZpY2F0aW9uXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxsIGVhY2ggY29tcG9uZW50J3MgY2FsbGJhY2tcclxuICAgIGNvbXBvbmVudHMuZm9yRWFjaCgoY2FsbGJhY2ssIGNvbXBvbmVudElkKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY2FsbGJhY2sobm90aWZpY2F0aW9uKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBbU2lnbmFsUiBTZXJ2aWNlXSBDYWxsYmFjayBmYWlsZWQgZm9yIGNvbXBvbmVudCAke2NvbXBvbmVudElkfTpgLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFjdGl2ZSBBcHBPYmplY3QgZ3JvdXBzIChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldEFjdGl2ZUdyb3VwcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmtleXMoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29tcG9uZW50IGNvdW50IGZvciBhbiBBcHBPYmplY3QgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0Q29tcG9uZW50Q291bnQoYXBwT2JqZWN0SWQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRSZWdpc3RyeS5nZXQoYXBwT2JqZWN0SWQpPy5zaXplIHx8IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdG90YWwgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGFjcm9zcyBhbGwgQXBwT2JqZWN0cyAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRUb3RhbENvbXBvbmVudENvdW50KCk6IG51bWJlciB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgdGhpcy5jb21wb25lbnRSZWdpc3RyeS5mb3JFYWNoKChjb21wb25lbnRzKSA9PiB7XHJcbiAgICAgIHRvdGFsICs9IGNvbXBvbmVudHMuc2l6ZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRvdGFsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHJlZ2lzdHJ5IHN0YXRlIChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldFJlZ2lzdHJ5U3RhdGUoKTogeyBhcHBPYmplY3RJZDogc3RyaW5nOyBjb21wb25lbnRDb3VudDogbnVtYmVyIH1bXSB7XHJcbiAgICBjb25zdCBzdGF0ZTogeyBhcHBPYmplY3RJZDogc3RyaW5nOyBjb21wb25lbnRDb3VudDogbnVtYmVyIH1bXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZm9yRWFjaCgoY29tcG9uZW50cywgYXBwT2JqZWN0SWQpID0+IHtcclxuICAgICAgc3RhdGUucHVzaCh7XHJcbiAgICAgICAgYXBwT2JqZWN0SWQsXHJcbiAgICAgICAgY29tcG9uZW50Q291bnQ6IGNvbXBvbmVudHMuc2l6ZSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gc3RhdGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgcGVuZGluZyBvcGVyYXRpb25zIGNvdW50IChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldFBlbmRpbmdPcGVyYXRpb25zQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblRyYWNrZXIuZ2V0UGVuZGluZ0NvdW50KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRQZW5kaW5nT3BlcmF0aW9ucygpOiBQZW5kaW5nT3BlcmF0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHJhY2tlci5nZXRBbGxQZW5kaW5nKCk7XHJcbiAgfVxyXG59Il19
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvY29yZS9zZXJ2aWNlL3NpZ25hbHIvc2lnbmFsci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBSUwsZ0JBQWdCLEdBQ2pCLE1BQU0sMkNBQTJDLENBQUM7O0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFpQnpCO1FBaEJRLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MscUJBQWdCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFM0QseURBQXlEO1FBQ2pELHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUE2QyxDQUFDO1FBRWpGOztXQUVHO1FBQ00sb0JBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUUvRDs7V0FFRztRQUNNLGdCQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUczRiw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDNUQsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FB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QUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDL0MsQ0FBQzsrR0E3TVUsY0FBYzttSEFBZCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2lnbmFsUkluZnJhc3RydWN0dXJlIH0gZnJvbSAnLi9zaWduYWxyLWluZnJhc3RydWN0dXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPcGVyYXRpb25UcmFja2VyU2VydmljZSB9IGZyb20gJy4vb3BlcmF0aW9uLXRyYWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ3J1ZE5vdGlmaWNhdGlvbixcclxuICBOb3RpZmljYXRpb25DYWxsYmFjayxcclxuICBQZW5kaW5nT3BlcmF0aW9uLFxyXG4gIENPTk5FQ1RJT05fU1RBVEUsXHJcbn0gZnJvbSAnLi4vLi4vLi4vYXBwL2ludGVyZmFjZXMvc2lnbmFsci5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIFNpZ25hbFIgU2VydmljZVxyXG4gKiBQdWJsaWMgQVBJIGZvcjpcclxuICogMS4gQ29tcG9uZW50cyB0byByZWdpc3RlciBmb3IgcmVhbC10aW1lIENSVUQgbm90aWZpY2F0aW9uc1xyXG4gKiAyLiBTZXJ2aWNlcyAoVGFiRm9ybWlvU2VydmljZSkgdG8gdHJhY2sgYXN5bmMgb3BlcmF0aW9uc1xyXG4gKlxyXG4gKiBVc2FnZSBpbiBjb21wb25lbnRzOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIG5nT25Jbml0KCkge1xyXG4gKiAgIHRoaXMuc2lnbmFsUlNlcnZpY2UucmVnaXN0ZXIoXHJcbiAqICAgICB0aGlzLmNvbXBvbmVudElkLFxyXG4gKiAgICAgdGhpcy5hcHBPYmplY3RJZCxcclxuICogICAgIChub3RpZmljYXRpb24pID0+IHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcclxuICogICApO1xyXG4gKiB9XHJcbiAqXHJcbiAqIG5nT25EZXN0cm95KCkge1xyXG4gKiAgIHRoaXMuc2lnbmFsUlNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmNvbXBvbmVudElkLCB0aGlzLmFwcE9iamVjdElkKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVXNhZ2UgaW4gc2VydmljZXMgKFRhYkZvcm1pb1NlcnZpY2UpOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByZXNwb25zZS5jb3JyZWxhdGlvbklkO1xyXG4gKiB0aGlzLnNpZ25hbFJTZXJ2aWNlLndhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZCkuc3Vic2NyaWJlKG5vdGlmaWNhdGlvbiA9PiB7XHJcbiAqICAgLy8gSGFuZGxlIGNvbXBsZXRlZCBvcGVyYXRpb25cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpZ25hbFJTZXJ2aWNlIHtcclxuICBwcml2YXRlIGluZnJhc3RydWN0dXJlID0gaW5qZWN0KFNpZ25hbFJJbmZyYXN0cnVjdHVyZSk7XHJcbiAgcHJpdmF0ZSBvcGVyYXRpb25UcmFja2VyID0gaW5qZWN0KE9wZXJhdGlvblRyYWNrZXJTZXJ2aWNlKTtcclxuXHJcbiAgLy8gUmVnaXN0cnk6IE1hcDxhcHBPYmplY3RJZCwgTWFwPGNvbXBvbmVudElkLCBjYWxsYmFjaz4+XHJcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBOb3RpZmljYXRpb25DYWxsYmFjaz4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjb25uZWN0aW9uIHN0YXRlIChmb3IgVUkgaW5kaWNhdG9ycylcclxuICAgKi9cclxuICByZWFkb25seSBjb25uZWN0aW9uU3RhdGUgPSB0aGlzLmluZnJhc3RydWN0dXJlLmNvbm5lY3Rpb25TdGF0ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgY3VycmVudGx5IGNvbm5lY3RlZFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGlzQ29ubmVjdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25uZWN0aW9uU3RhdGUoKSA9PT0gQ09OTkVDVElPTl9TVEFURS5DT05ORUNURUQpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIExpc3RlbiB0byBub3RpZmljYXRpb25zIGZyb20gaW5mcmFzdHJ1Y3R1cmUgYW5kIHJvdXRlIHRoZW1cclxuICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmUubm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKChub3RpZmljYXRpb24pID0+IHtcclxuICAgICAgLy8gMS4gQ2hlY2sgaWYgdGhpcyBpcyBhIHRyYWNrZWQgYXN5bmMgb3BlcmF0aW9uIChwcm9jZXNzUmVxdWVzdClcclxuICAgICAgdGhpcy5vcGVyYXRpb25UcmFja2VyLmhhbmRsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xyXG5cclxuICAgICAgLy8gMi4gQWxzbyBub3RpZnkgY29tcG9uZW50cyBzdWJzY3JpYmVkIHRvIHRoaXMgYXBwT2JqZWN0SWQgKEdyaWQsIGV0Yy4pXHJcbiAgICAgIHRoaXMubm90aWZ5Q29tcG9uZW50cyhub3RpZmljYXRpb24pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIHRoZSBTaWduYWxSIGh1Yi5cclxuICAgKlxyXG4gICAqIEF3YWl0YWJsZSDigJQgdGhlIHJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgd2hlbiB0aGUgZmlyc3QgY29ubmVjdGlvbiBhdHRlbXB0XHJcbiAgICogc2V0dGxlcyAoc3VjY2VzcyBvciBmYWlsdXJlKS4gSWRlbXBvdGVudDogcmVwZWF0ZWQgY2FsbHMgYXJlIGRlLWR1cGxpY2F0ZWQ7XHJcbiAgICogaWYgYWxyZWFkeSBDT05ORUNURUQsIHJlc29sdmVzIGltbWVkaWF0ZWx5LlxyXG4gICAqXHJcbiAgICogSHViIFVSTCBpcyByZWFkIGZyb20gQ29tbW9uLnNpZ25hbFJIdWJVcmwgKHNldCBkdXJpbmcgYXBwIGluaXRpYWxpemF0aW9uIHZpYSBDb21tb24uaW5pdCgpKVxyXG4gICAqL1xyXG4gIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmluZnJhc3RydWN0dXJlLmNvbm5lY3QoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlYXIgZG93biB0aGUgY29ubmVjdGlvbiAoY2FsbCBmcm9tIGF1dGggc2lnbk91dCBvciBjcm9zcy10YWIgbG9nb3V0KS5cclxuICAgKlxyXG4gICAqIC0gU3RvcHMgdGhlIGh1YiBhbmQgY2xlYXJzIHRyYWNrZWQgZ3JvdXBzXHJcbiAgICogLSBEcm9wcyBhbGwgY29tcG9uZW50IHJlZ2lzdHJhdGlvbnMgKHN0YWxlIG9uY2UgdGhlIHNvY2tldCBkaWVzKVxyXG4gICAqIC0gRXJyb3JzIGFueSBpbi1mbGlnaHQgd2FpdEZvck9wZXJhdGlvbigpIG9ic2VydmVycyBzbyB0aGUgVUkgZG9lc24ndFxyXG4gICAqICAgc3RyYW5kIHVudGlsIHRoZSAxMjBzIHRpbWVvdXRcclxuICAgKi9cclxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5pbmZyYXN0cnVjdHVyZS5kaXNjb25uZWN0KCk7XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmNsZWFyKCk7XHJcbiAgICB0aGlzLm9wZXJhdGlvblRyYWNrZXIuY2FuY2VsQWxsKCdkaXNjb25uZWN0ZWQnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGNvbXBvbmVudCBmb3IgcmVhbC10aW1lIG5vdGlmaWNhdGlvbnNcclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb21wb25lbnRJZCAtIFVuaXF1ZSBjb21wb25lbnQgaWRlbnRpZmllciAoZ2VuZXJhdGVkIGJ5IGNvbXBvbmVudClcclxuICAgKiBAcGFyYW0gYXBwT2JqZWN0SWQgLSBBcHBPYmplY3QgSUQgdG8gc3Vic2NyaWJlIHRvXHJcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIG5vdGlmaWNhdGlvbiByZWNlaXZlZFxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyKGNvbXBvbmVudElkOiBzdHJpbmcsIGFwcE9iamVjdElkOiBzdHJpbmcsIGNhbGxiYWNrOiBOb3RpZmljYXRpb25DYWxsYmFjayk6IHZvaWQge1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBtYXAgZm9yIHRoaXMgQXBwT2JqZWN0IGlmIGRvZXNuJ3QgZXhpc3RcclxuICAgIGlmICghdGhpcy5jb21wb25lbnRSZWdpc3RyeS5oYXMoYXBwT2JqZWN0SWQpKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuc2V0KGFwcE9iamVjdElkLCBuZXcgTWFwKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmdldChhcHBPYmplY3RJZCkhO1xyXG5cclxuICAgIC8vIEZpcnN0IGNvbXBvbmVudCBmb3IgdGhpcyBBcHBPYmplY3Q/IEpvaW4gU2lnbmFsUiBncm91cFxyXG4gICAgaWYgKGNvbXBvbmVudHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICB0aGlzLmluZnJhc3RydWN0dXJlLmpvaW5Hcm91cChhcHBPYmplY3RJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGNvbXBvbmVudCB0byByZWdpc3RyeVxyXG4gICAgY29tcG9uZW50cy5zZXQoY29tcG9uZW50SWQsIGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVucmVnaXN0ZXIgY29tcG9uZW50IChjbGVhbnVwIG9uIGNvbXBvbmVudCBkZXN0cm95KVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbXBvbmVudElkIC0gQ29tcG9uZW50IGlkZW50aWZpZXIgdG8gcmVtb3ZlXHJcbiAgICogQHBhcmFtIGFwcE9iamVjdElkIC0gQXBwT2JqZWN0IElEIHRvIHVuc3Vic2NyaWJlIGZyb21cclxuICAgKi9cclxuICB1bnJlZ2lzdGVyKGNvbXBvbmVudElkOiBzdHJpbmcsIGFwcE9iamVjdElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmdldChhcHBPYmplY3RJZCk7XHJcbiAgICBpZiAoIWNvbXBvbmVudHMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSBjb21wb25lbnQgZnJvbSByZWdpc3RyeVxyXG4gICAgY29tcG9uZW50cy5kZWxldGUoY29tcG9uZW50SWQpO1xyXG5cclxuICAgIC8vIExhc3QgY29tcG9uZW50IGZvciB0aGlzIEFwcE9iamVjdD8gTGVhdmUgU2lnbmFsUiBncm91cFxyXG4gICAgaWYgKGNvbXBvbmVudHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICB0aGlzLmluZnJhc3RydWN0dXJlLmxlYXZlR3JvdXAoYXBwT2JqZWN0SWQpO1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmRlbGV0ZShhcHBPYmplY3RJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYWl0IGZvciBzcGVjaWZpYyBhc3luYyBvcGVyYXRpb24gdG8gY29tcGxldGVcclxuICAgKiBVc2VkIGJ5IFRhYkZvcm1pb1NlcnZpY2UgZm9yIGFzeW5jIHByb2Nlc3NSZXF1ZXN0IG9wZXJhdGlvbnNcclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb3JyZWxhdGlvbklkIC0gQ29ycmVsYXRpb24gSUQgZnJvbSBiYWNrZW5kIHJlc3BvbnNlXHJcbiAgICogQHBhcmFtIHRpbWVvdXQgLSBPcHRpb25hbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXNcclxuICAgKi9cclxuICB3YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQ6IHN0cmluZywgdGltZW91dD86IG51bWJlcik6IE9ic2VydmFibGU8Q3J1ZE5vdGlmaWNhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHJhY2tlci53YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQsIHRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgYXN5bmMgb3BlcmF0aW9uIGZvciB0cmFja2luZ1xyXG4gICAqIE9wdGlvbmFsIC0gd2FpdEZvck9wZXJhdGlvbiBoYW5kbGVzIHJlZ2lzdHJhdGlvbiBhdXRvbWF0aWNhbGx5XHJcbiAgICpcclxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gUGVuZGluZyBvcGVyYXRpb24gZGV0YWlsc1xyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT3BlcmF0aW9uKG9wZXJhdGlvbjogUGVuZGluZ09wZXJhdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVyYXRpb25UcmFja2VyLnJlZ2lzdGVyT3BlcmF0aW9uKG9wZXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBvcGVyYXRpb24gaXMgcGVuZGluZ1xyXG4gICAqL1xyXG4gIGlzT3BlcmF0aW9uUGVuZGluZyhjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblRyYWNrZXIuaXNQZW5kaW5nKGNvcnJlbGF0aW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm90aWZ5IGFsbCByZWdpc3RlcmVkIGNvbXBvbmVudHMgZm9yIGFuIEFwcE9iamVjdFxyXG4gICAqIENhbGxlZCB3aGVuIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tIFNpZ25hbFIgaHViXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBub3RpZnlDb21wb25lbnRzKG5vdGlmaWNhdGlvbjogQ3J1ZE5vdGlmaWNhdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZ2V0KG5vdGlmaWNhdGlvbi5hcHBPYmplY3RJZCk7XHJcblxyXG4gICAgaWYgKCFjb21wb25lbnRzIHx8IGNvbXBvbmVudHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICAvLyBObyBjb21wb25lbnRzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgQXBwT2JqZWN0IC0gaWdub3JlIG5vdGlmaWNhdGlvblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FsbCBlYWNoIGNvbXBvbmVudCdzIGNhbGxiYWNrXHJcbiAgICBjb21wb25lbnRzLmZvckVhY2goKGNhbGxiYWNrLCBjb21wb25lbnRJZCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNhbGxiYWNrKG5vdGlmaWNhdGlvbik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NpZ25hbFIgU2VydmljZV0gQ2FsbGJhY2sgZmFpbGVkIGZvciBjb21wb25lbnQgJHtjb21wb25lbnRJZH06YCwgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhY3RpdmUgQXBwT2JqZWN0IGdyb3VwcyAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRBY3RpdmVHcm91cHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb21wb25lbnRSZWdpc3RyeS5rZXlzKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGNvbXBvbmVudCBjb3VudCBmb3IgYW4gQXBwT2JqZWN0IChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldENvbXBvbmVudENvdW50KGFwcE9iamVjdElkOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZ2V0KGFwcE9iamVjdElkKT8uc2l6ZSB8fCAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRvdGFsIHJlZ2lzdGVyZWQgY29tcG9uZW50cyBhY3Jvc3MgYWxsIEFwcE9iamVjdHMgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0VG90YWxDb21wb25lbnRDb3VudCgpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuICAgIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZm9yRWFjaCgoY29tcG9uZW50cykgPT4ge1xyXG4gICAgICB0b3RhbCArPSBjb21wb25lbnRzLnNpemU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0b3RhbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCByZWdpc3RyeSBzdGF0ZSAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRSZWdpc3RyeVN0YXRlKCk6IHsgYXBwT2JqZWN0SWQ6IHN0cmluZzsgY29tcG9uZW50Q291bnQ6IG51bWJlciB9W10ge1xyXG4gICAgY29uc3Qgc3RhdGU6IHsgYXBwT2JqZWN0SWQ6IHN0cmluZzsgY29tcG9uZW50Q291bnQ6IG51bWJlciB9W10gPSBbXTtcclxuXHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmZvckVhY2goKGNvbXBvbmVudHMsIGFwcE9iamVjdElkKSA9PiB7XHJcbiAgICAgIHN0YXRlLnB1c2goe1xyXG4gICAgICAgIGFwcE9iamVjdElkLFxyXG4gICAgICAgIGNvbXBvbmVudENvdW50OiBjb21wb25lbnRzLnNpemUsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHN0YXRlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHBlbmRpbmcgb3BlcmF0aW9ucyBjb3VudCAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRQZW5kaW5nT3BlcmF0aW9uc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25UcmFja2VyLmdldFBlbmRpbmdDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0UGVuZGluZ09wZXJhdGlvbnMoKTogUGVuZGluZ09wZXJhdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblRyYWNrZXIuZ2V0QWxsUGVuZGluZygpO1xyXG4gIH1cclxufSJdfQ==
package/index.d.ts CHANGED
@@ -37,6 +37,8 @@ export * from './lib/tab-core-utility/app/interfaces/orgInfo.interface';
37
37
  export * from './lib/tab-core-utility/app/interfaces/schema.interface';
38
38
  export * from './lib/tab-core-utility/app/interfaces/grid.interface';
39
39
  export * from './lib/tab-core-utility/app/interfaces/signalr.interface';
40
+ export * from './lib/tab-core-utility/app/interfaces/notification.interface';
41
+ export * from './lib/tab-core-utility/app/interfaces/release.interface';
40
42
  export * from './lib/tab-core-utility/app/models/api-query.class';
41
43
  export * from './lib/tab-core-utility/app/models/app-field.model';
42
44
  export * from './lib/tab-core-utility/app/models/app-menu.model';
@@ -70,6 +72,8 @@ export * from './lib/tab-core-utility/core/service/encryption.service';
70
72
  export * from './lib/tab-core-utility/core/service/signalr/signalr.service';
71
73
  export * from './lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service';
72
74
  export * from './lib/tab-core-utility/core/service/signalr/operation-tracker.service';
75
+ export * from './lib/tab-core-utility/core/service/notification/notification-inbox.service';
76
+ export * from './lib/tab-core-utility/core/service/notification/notification-websocket.service';
73
77
  export * from './lib/tab-core-utility/core/pipe/translate.pipe';
74
78
  export * from './lib/tab-core-utility/core/provider/translation.provider';
75
79
  export * from './lib/tab-core-utility/core/provider/notification.provider';
@@ -50,8 +50,8 @@ export declare const API: {
50
50
  RefreshRecordInfoData: string;
51
51
  reportDownload: string;
52
52
  sendReport: string;
53
- GetReleaseJSONDifference: string;
54
- GetDataDifference: string;
53
+ releaseDiffMetadata: string;
54
+ releaseDiffData: string;
55
55
  RegisterTenant: string;
56
56
  databaseExecute: string;
57
57
  GetAllDocumnets: string;
@@ -11,6 +11,8 @@ export declare class Common {
11
11
  static apiServiceUrls: APIServiceUrls;
12
12
  /** SignalR hub URL for real-time notifications */
13
13
  static signalRHubUrl: string;
14
+ /** Notification WebSocket URL for in-app inbox */
15
+ static notificationWebSocketUrl: string;
14
16
  /**
15
17
  * Schema source of truth.
16
18
  * Reading is cheap (returns the backing field).
@@ -4,24 +4,8 @@ import * as i0 from "@angular/core";
4
4
  export declare class TabBlueprintService {
5
5
  private readonly apiService;
6
6
  private readonly metadataHelper;
7
- /**
8
- * Retrieves the next status of a record.
9
- * Uses new crudService endpoint: GET status/available?recordId=...&EntityName=...
10
- */
11
7
  getNextStatus(payload: NextStatusPayload, headers?: any): Observable<CommonApiResponse>;
12
- /**
13
- * Updates the status of a record.
14
- * Uses new crudService endpoint: PUT status/update?recordId=...&nextStatusId=...&EntityName=...
15
- */
16
8
  updateStatus(payload: UpdateStatusPayload, headers?: any): Observable<CommonApiResponse>;
17
- /**
18
- * Builds common HttpParams for status endpoints (recordId + EntityName).
19
- */
20
- private buildStatusParams;
21
- /**
22
- * Resolves appObjectId to EntityName (SystemDBTableName).
23
- * Looks up the app object via MetadataHelper and returns SystemDBTableName or ObjectName.
24
- */
25
9
  private resolveEntityName;
26
10
  static ɵfac: i0.ɵɵFactoryDeclaration<TabBlueprintService, never>;
27
11
  static ɵprov: i0.ɵɵInjectableDeclaration<TabBlueprintService>;
@@ -1,18 +1,11 @@
1
- import { Observable } from "rxjs";
2
- import { CommonApiResponse } from "../interfaces/common.interface";
1
+ import { Observable } from 'rxjs';
2
+ import { CommonApiResponse } from '../interfaces/common.interface';
3
+ import { DiffRequest } from '../interfaces/release.interface';
3
4
  import * as i0 from "@angular/core";
4
5
  export declare class TabReleaseService {
5
6
  private readonly apiService;
6
- /**
7
- * Retrieves the difference between the metadata JSONs of two releases.
8
- * @returns Observable of the API response
9
- */
10
- getMetaDataJsonDiff(): Observable<CommonApiResponse>;
11
- /**
12
- * Retrieves the difference between the data JSONs of two releases.
13
- * @returns Observable of the API response
14
- */
15
- getDataJsonDiff(): Observable<CommonApiResponse>;
7
+ getMetaDataDiff(req?: DiffRequest): Observable<CommonApiResponse>;
8
+ getDataDiff(req?: DiffRequest): Observable<CommonApiResponse>;
16
9
  static ɵfac: i0.ɵɵFactoryDeclaration<TabReleaseService, never>;
17
10
  static ɵprov: i0.ɵɵInjectableDeclaration<TabReleaseService>;
18
11
  }
@@ -13,6 +13,15 @@ export declare enum ResourceType {
13
13
  LanguageTranslation = 2,
14
14
  Settings = 3
15
15
  }
16
+ export declare enum ReleaseType {
17
+ Major = 1,
18
+ Minor = 2,
19
+ Patch = 3
20
+ }
21
+ export declare enum ContentType {
22
+ Metadata = 1,
23
+ Data = 2
24
+ }
16
25
  export declare enum ReleaseContentType {
17
26
  MetaData = 1,
18
27
  Data = 2,