@progress-chef/platform-http-interceptor 0.0.15 → 0.0.17

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.
@@ -13,13 +13,9 @@ export class HttpAuthInterceptor {
13
13
  this.authTokenSet = new Set();
14
14
  this.isSessionExpired = false;
15
15
  }
16
- // private currentBaseUrlFromLocalStorage: string = 'currentServerBaseUrl';
17
- // private refreshTokenExpireTimeStorageKey: string = 'refreshTokenExpireTime';
18
16
  intercept(request, next) {
19
- const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME);
20
- if (getRefreshTokenHalfTime) {
21
- this.manageTokenRefresh();
22
- }
17
+ // function to check for the refresh token using referesh token service
18
+ this.refreshTokenService.checkForRefresh();
23
19
  let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);
24
20
  let authReq = request;
25
21
  if (authToken) {
@@ -72,102 +68,6 @@ export class HttpAuthInterceptor {
72
68
  return throwError(() => error);
73
69
  }));
74
70
  }
75
- async manageRefreshTokenExpireTime() {
76
- const newExpireTime = await this.getExpireAtTime();
77
- const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime);
78
- LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString);
79
- }
80
- manageTokenRefresh() {
81
- const { isHalfTimeGreater } = this.checkHalfTimeIsGreater();
82
- if (isHalfTimeGreater) {
83
- this.refreshToken();
84
- this.manageRefreshTokenExpireTime();
85
- // const newExpireTime = this.getExpireAtTime()
86
- // const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)
87
- // localStorage.setItem(this.refreshTokenExpireTimeStorageKey, halfwayTimeString)
88
- // LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)
89
- }
90
- }
91
- refreshToken() {
92
- // const baseUrl: string = localStorage.getItem(this.currentBaseUrlFromLocalStorage) as string;
93
- const baseUrl = LocalStorageService.getItem(StorageKeys.CURRENT_SERVER_BASE_URL);
94
- if (!baseUrl)
95
- throw new Error('The backend or server base URL is missing in Local Storage');
96
- this.refreshTokenService.refreshToken({ platformServiceApiBaseUrls: baseUrl });
97
- }
98
- async getExpireAtTime() {
99
- await this.delay(2000);
100
- let isIdentityToken = LocalStorageService.getItem(StorageKeys.IDENTITY_TOKEN);
101
- console.log('======= check is token availabe --------', isIdentityToken);
102
- if (!isIdentityToken)
103
- throw new Error('identity token is missing in the local storage');
104
- const { expireAt } = isIdentityToken;
105
- const date = new Date(expireAt * 1000);
106
- const hours = date.getUTCHours().toString().padStart(2, '0');
107
- const minutes = date.getUTCMinutes().toString().padStart(2, '0');
108
- const seconds = date.getUTCSeconds().toString().padStart(2, '0');
109
- const latestRefreshTokenExpireTime = `${hours}:${minutes}:${seconds}`; //10:00:00
110
- return latestRefreshTokenExpireTime;
111
- }
112
- getCurrentTime() {
113
- const now = new Date();
114
- const options = { timeZone: 'Asia/Kolkata' };
115
- const formattedTime = now.toLocaleString('en-IN', { hour12: true, ...options });
116
- const [time, period] = formattedTime.split(', ')[1].split(' ');
117
- const [hours, minutes, seconds] = time.split(':').map(Number);
118
- return { hours, minutes, seconds, period };
119
- }
120
- timeToSeconds(hours, minutes, seconds) {
121
- return hours * 3600 + minutes * 60 + seconds;
122
- }
123
- secondsToTimeString(seconds) {
124
- const hours = Math.floor(seconds / 3600) % 12 || 12;
125
- const minutes = Math.floor((seconds % 3600) / 60);
126
- const secondsPart = seconds % 60;
127
- return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secondsPart.toString().padStart(2, '0')}`;
128
- }
129
- handleCalulateHalfTime(expireTime, isHalfTime = false) {
130
- const [expireHours, expireMinutes, expireSeconds] = expireTime.split(':').map(Number);
131
- const { hours: currentHours, minutes: currentMinutes, seconds: currentSeconds, period: currentPeriod } = this.getCurrentTime();
132
- const expireTimeInSeconds = this.timeToSeconds(expireHours, expireMinutes, expireSeconds);
133
- const currentTimeInSeconds = this.timeToSeconds(currentHours, currentMinutes, currentSeconds);
134
- let halfwayTimeInSeconds;
135
- if (isHalfTime) {
136
- halfwayTimeInSeconds = expireTimeInSeconds + currentTimeInSeconds;
137
- }
138
- else {
139
- halfwayTimeInSeconds = Math.floor((expireTimeInSeconds + currentTimeInSeconds) / 2);
140
- }
141
- if (halfwayTimeInSeconds < 0) {
142
- halfwayTimeInSeconds += 12 * 3600;
143
- }
144
- else if (halfwayTimeInSeconds >= 12 * 3600) {
145
- halfwayTimeInSeconds -= 12 * 3600;
146
- }
147
- const halfwayTimeString = this.secondsToTimeString(halfwayTimeInSeconds);
148
- let isHalfTimeGreater = false;
149
- if (halfwayTimeString.endsWith('AM') && expireTime.endsWith('PM')) {
150
- isHalfTimeGreater = false;
151
- }
152
- else if (halfwayTimeString.endsWith('PM') && expireTime.endsWith('AM')) {
153
- isHalfTimeGreater = true;
154
- }
155
- else {
156
- isHalfTimeGreater = halfwayTimeString > expireTime;
157
- }
158
- return { halfwayTimeString, isHalfTimeGreater };
159
- }
160
- checkHalfTimeIsGreater() {
161
- // const getRefreshTokenHalfTime: string = localStorage.getItem(this.refreshTokenExpireTimeStorageKey) as string;
162
- const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME);
163
- if (!getRefreshTokenHalfTime)
164
- throw new Error('Refresh token half time is missing');
165
- const { isHalfTimeGreater, halfwayTimeString } = this.handleCalulateHalfTime(getRefreshTokenHalfTime, true);
166
- return { isHalfTimeGreater, halfwayTimeString };
167
- }
168
- delay(ms) {
169
- return new Promise(resolve => setTimeout(resolve, ms));
170
- }
171
71
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, deps: [{ token: i1.Router }, { token: i2.ToastNotificationService }, { token: i3.RefreshTokenService }], target: i0.ɵɵFactoryTarget.Injectable }); }
172
72
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, providedIn: 'root' }); }
173
73
  }
@@ -177,4 +77,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
177
77
  providedIn: 'root'
178
78
  }]
179
79
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.ToastNotificationService }, { type: i3.RefreshTokenService }]; } });
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hdXRoLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGxhdGZvcm0taHR0cC1pbnRlcmNlcHRvci9zcmMvbGliL2h0dHAtYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0YsT0FBTyxFQUFjLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFNM0MsTUFBTSxPQUFPLG1CQUFtQjtJQUc5QixZQUNVLE1BQWMsRUFDZCx3QkFBa0QsRUFDbEQsbUJBQXdDO1FBRnhDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFMbEQsaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQUtyQixDQUFDO0lBRUwsMkVBQTJFO0lBQzNFLCtFQUErRTtJQUMvRSxTQUFTLENBQUMsT0FBNkIsRUFBRSxJQUFpQjtRQUV4RCxNQUFNLHVCQUF1QixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtRQUN0RyxJQUFJLHVCQUF1QixFQUFFO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO1FBRUQsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdEIsSUFBSSxTQUFTLEVBQUU7WUFDYixPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDdEIsVUFBVSxFQUFFO29CQUNWLGFBQWEsRUFBRSxVQUFVLFNBQVMsRUFBRTtpQkFDckM7YUFDRixDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7YUFDL0I7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNsQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzlCLFVBQVUsQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRTtZQUN0QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO2dCQUN4QixNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLFNBQVMsS0FBSyxNQUFNLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRTtvQkFDakQsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDdEQsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDNUQ7Z0JBQ0QsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekUsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdEUsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkQsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkQsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0QsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUNwRSxxQkFBcUI7Z0JBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7b0JBQzFCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQzt3QkFDbEQsT0FBTyxFQUFFLHdCQUF3QjtxQkFDbEMsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7aUJBQzlCO2dCQUVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTthQUNqQztZQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbEQsT0FBTyxFQUFFLDJDQUEyQztvQkFDcEQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO29CQUNwQyxRQUFRLEVBQUUsSUFBSTtpQkFDZixDQUFDLENBQUE7YUFDSDtZQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbEQsT0FBTyxFQUFFLHlDQUF5QztvQkFDbEQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO29CQUNwQyxRQUFRLEVBQUUsSUFBSTtpQkFDZixDQUFDLENBQUE7YUFDSDtZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLDRCQUE0QjtRQUNoQyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUNsRCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDeEUsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0lBQzNGLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDNUQsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDcEMsK0NBQStDO1lBQy9DLDJFQUEyRTtZQUMzRSxpRkFBaUY7WUFDakYsNEZBQTRGO1NBQzdGO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDViwrRkFBK0Y7UUFDL0YsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsRUFBRSwwQkFBMEIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdEIsSUFBSSxlQUFlLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBQ3hFLElBQUksQ0FBQyxlQUFlO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxlQUFlLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sNEJBQTRCLEdBQUcsR0FBRyxLQUFLLElBQUksT0FBTyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsVUFBVTtRQUNqRixPQUFPLDRCQUE0QixDQUFDO0lBQ3RDLENBQUM7SUFFRCxjQUFjO1FBQ1osTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLE9BQU8sR0FBRyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUM3QyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYSxFQUFFLE9BQWUsRUFBRSxPQUFlO1FBQzNELE9BQU8sS0FBSyxHQUFHLElBQUksR0FBRyxPQUFPLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUMvQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsT0FBZTtRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNsSSxDQUFDO0lBRUQsc0JBQXNCLENBQUMsVUFBa0IsRUFBRSxhQUFzQixLQUFLO1FBQ3BFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRS9ILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRTlGLElBQUksb0JBQTRCLENBQUM7UUFDakMsSUFBSSxVQUFVLEVBQUU7WUFDZCxvQkFBb0IsR0FBRyxtQkFBbUIsR0FBRyxvQkFBb0IsQ0FBQztTQUNuRTthQUFNO1lBQ0wsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDckY7UUFFRCxJQUFJLG9CQUFvQixHQUFHLENBQUMsRUFBRTtZQUM1QixvQkFBb0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1NBQ25DO2FBQU0sSUFBSSxvQkFBb0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFO1lBQzVDLG9CQUFvQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7U0FDbkM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXpFLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakUsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1NBQzNCO2FBQU0sSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4RSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDMUI7YUFBTTtZQUNMLGlCQUFpQixHQUFHLGlCQUFpQixHQUFHLFVBQVUsQ0FBQztTQUNwRDtRQUVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsaUhBQWlIO1FBQ2pILE1BQU0sdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBQ3RHLElBQUksQ0FBQyx1QkFBdUI7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDcEYsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCxLQUFLLENBQUMsRUFBVTtRQUNkLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQzsrR0FqTFUsbUJBQW1CO21IQUFuQixtQkFBbUIsY0FIbEIsTUFBTTs7NEZBR1AsbUJBQW1CO2tCQUovQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEh0dHBFcnJvclJlc3BvbnNlLFxuICBIdHRwRXZlbnQsXG4gIEh0dHBIYW5kbGVyLFxuICBIdHRwSW50ZXJjZXB0b3IsXG4gIEh0dHBSZXF1ZXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbi8vIGltcG9ydCB7IFJlZnJlc2hUb2tlblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9kaXN0L3BsYXRmb3JtLXJlZnJlc2gtdG9rZW4tc2VydmljZS9pbmRleCc7XG5pbXBvcnQgeyBSZWZyZXNoVG9rZW5TZXJ2aWNlIH0gZnJvbSAnQHByb2dyZXNzLWNoZWYvcGxhdGZvcm0tcmVmcmVzaC10b2tlbi1zZXJ2aWNlJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRvYXN0Tm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy1jaGVmL3BsYXRmb3JtLXNoYXJlZC1jb21wb25lbnRzJztcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNlcnZpY2UsIFN0b3JhZ2VLZXlzIH0gZnJvbSAnQHByb2dyZXNzLWNoZWYvcGxhdGZvcm0tc3RvcmFnZS1zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNhdGNoRXJyb3IsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5cbmV4cG9ydCBjbGFzcyBIdHRwQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgYXV0aFRva2VuU2V0ID0gbmV3IFNldCgpO1xuICBpc1Nlc3Npb25FeHBpcmVkID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSB0b2FzdE5vdGlmaWNhdGlvblNlcnZpY2U6IFRvYXN0Tm90aWZpY2F0aW9uU2VydmljZSwgXG4gICAgcHJpdmF0ZSByZWZyZXNoVG9rZW5TZXJ2aWNlOiBSZWZyZXNoVG9rZW5TZXJ2aWNlLFxuICApIHsgfVxuXG4gIC8vIHByaXZhdGUgY3VycmVudEJhc2VVcmxGcm9tTG9jYWxTdG9yYWdlOiBzdHJpbmcgPSAnY3VycmVudFNlcnZlckJhc2VVcmwnO1xuICAvLyBwcml2YXRlIHJlZnJlc2hUb2tlbkV4cGlyZVRpbWVTdG9yYWdlS2V5OiBzdHJpbmcgPSAncmVmcmVzaFRva2VuRXhwaXJlVGltZSc7XG4gIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuXG4gICAgY29uc3QgZ2V0UmVmcmVzaFRva2VuSGFsZlRpbWUgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuUkVGUkVTSF9UT0tFTl9IQUxGX0VYUFJFX1RJTUUpXG4gICAgaWYgKGdldFJlZnJlc2hUb2tlbkhhbGZUaW1lKSB7XG4gICAgICB0aGlzLm1hbmFnZVRva2VuUmVmcmVzaCgpO1xuICAgIH1cblxuICAgIGxldCBhdXRoVG9rZW4gPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuQVVUSF9UT0tFTik7XG4gICAgbGV0IGF1dGhSZXEgPSByZXF1ZXN0O1xuICAgIGlmIChhdXRoVG9rZW4pIHtcbiAgICAgIGF1dGhSZXEgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgc2V0SGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoVG9rZW59YFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKCF0aGlzLmF1dGhUb2tlblNldC5oYXMoYXV0aFRva2VuKSkge1xuICAgICAgICB0aGlzLmlzU2Vzc2lvbkV4cGlyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXV0aFRva2VuU2V0LmFkZChhdXRoVG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoYXV0aFJlcSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICBjb25zdCBsb2dpblR5cGUgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuTE9HSU5fVFlQRSk7XG4gICAgICAgICAgaWYgKGxvZ2luVHlwZSA9PT0gJ3NhbWwnIHx8IGxvZ2luVHlwZSA9PT0gJ29hdXRoJykge1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlVTRVJfTkFNRSk7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuSVNfUkVNRU1CRVJfTUUpOyBcbiAgICAgICAgICB9XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLklTX1VTRVJfT1JHX0FORF9ST0xFX1NFVCwgZmFsc2UpO1xuICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5JU19VU0VSX0FVVEhFTlRJQ0FURUQsIGZhbHNlKTtcbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuQVVUSF9UT0tFTik7XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLkxPR0lOX1RZUEUpO1xuICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5JREVOVElUWV9UT0tFTik7XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlVTRVJfT1JHX0FORF9ST0xFX1RPS0VOKTtcbiAgICAgICAgICAvLyBjYWxsIGxvZ291dCBhY3Rpb25cbiAgICAgICAgICBpZiAoIXRoaXMuaXNTZXNzaW9uRXhwaXJlZCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgY29udGVudDogJ1RoZSBzZXNzaW9uIGhhcyBlbmRlZC4nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNTZXNzaW9uRXhwaXJlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2xvZ2luJ10pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gMCB8fCBlcnJvci5zdGF0dXMgPT09IDUwNCkge1xuICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICBjb250ZW50OiBgVW5hYmxlIHRvIHJlYWNoIHNlcnZlci4gUGxlYXNlIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICBjb250ZW50OiBgU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4uYCxcbiAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcilcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG1hbmFnZVJlZnJlc2hUb2tlbkV4cGlyZVRpbWUoKSB7XG4gICAgY29uc3QgbmV3RXhwaXJlVGltZSA9IGF3YWl0IHRoaXMuZ2V0RXhwaXJlQXRUaW1lKClcbiAgICBjb25zdCB7IGhhbGZ3YXlUaW1lU3RyaW5nIH0gPSB0aGlzLmhhbmRsZUNhbHVsYXRlSGFsZlRpbWUobmV3RXhwaXJlVGltZSlcbiAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oU3RvcmFnZUtleXMuUkVGUkVTSF9UT0tFTl9IQUxGX0VYUFJFX1RJTUUsIGhhbGZ3YXlUaW1lU3RyaW5nKVxuICB9XG5cbiAgbWFuYWdlVG9rZW5SZWZyZXNoKCkge1xuICAgIGNvbnN0IHsgaXNIYWxmVGltZUdyZWF0ZXIgfSA9IHRoaXMuY2hlY2tIYWxmVGltZUlzR3JlYXRlcigpO1xuICAgIGlmIChpc0hhbGZUaW1lR3JlYXRlcikge1xuICAgICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgIHRoaXMubWFuYWdlUmVmcmVzaFRva2VuRXhwaXJlVGltZSgpO1xuICAgICAgLy8gY29uc3QgbmV3RXhwaXJlVGltZSA9IHRoaXMuZ2V0RXhwaXJlQXRUaW1lKClcbiAgICAgIC8vIGNvbnN0IHsgaGFsZndheVRpbWVTdHJpbmcgfSA9IHRoaXMuaGFuZGxlQ2FsdWxhdGVIYWxmVGltZShuZXdFeHBpcmVUaW1lKVxuICAgICAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5yZWZyZXNoVG9rZW5FeHBpcmVUaW1lU3RvcmFnZUtleSwgaGFsZndheVRpbWVTdHJpbmcpXG4gICAgICAvLyBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oU3RvcmFnZUtleXMuUkVGUkVTSF9UT0tFTl9IQUxGX0VYUFJFX1RJTUUsIGhhbGZ3YXlUaW1lU3RyaW5nKVxuICAgIH1cbiAgfVxuXG4gIHJlZnJlc2hUb2tlbigpIHtcbiAgICAvLyBjb25zdCBiYXNlVXJsOiBzdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmN1cnJlbnRCYXNlVXJsRnJvbUxvY2FsU3RvcmFnZSkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuQ1VSUkVOVF9TRVJWRVJfQkFTRV9VUkwpO1xuICAgIGlmICghYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgYmFja2VuZCBvciBzZXJ2ZXIgYmFzZSBVUkwgaXMgbWlzc2luZyBpbiBMb2NhbCBTdG9yYWdlJyk7XG4gICAgdGhpcy5yZWZyZXNoVG9rZW5TZXJ2aWNlLnJlZnJlc2hUb2tlbih7IHBsYXRmb3JtU2VydmljZUFwaUJhc2VVcmxzOiBiYXNlVXJsIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0RXhwaXJlQXRUaW1lKCkge1xuICAgIGF3YWl0IHRoaXMuZGVsYXkoMjAwMClcbiAgICBsZXQgaXNJZGVudGl0eVRva2VuID0gTG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLklERU5USVRZX1RPS0VOKTtcbiAgICBjb25zb2xlLmxvZygnPT09PT09PSBjaGVjayBpcyB0b2tlbiBhdmFpbGFiZSAtLS0tLS0tLScsIGlzSWRlbnRpdHlUb2tlbikgIFxuICAgIGlmICghaXNJZGVudGl0eVRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2lkZW50aXR5IHRva2VuIGlzIG1pc3NpbmcgaW4gdGhlIGxvY2FsIHN0b3JhZ2UnKTtcbiAgICBjb25zdCB7IGV4cGlyZUF0IH0gPSBpc0lkZW50aXR5VG9rZW47XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGV4cGlyZUF0ICogMTAwMCk7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBsYXRlc3RSZWZyZXNoVG9rZW5FeHBpcmVUaW1lID0gYCR7aG91cnN9OiR7bWludXRlc306JHtzZWNvbmRzfWA7IC8vMTA6MDA6MDBcbiAgICByZXR1cm4gbGF0ZXN0UmVmcmVzaFRva2VuRXhwaXJlVGltZTtcbiAgfVxuXG4gIGdldEN1cnJlbnRUaW1lKCkge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgdGltZVpvbmU6ICdBc2lhL0tvbGthdGEnIH07XG4gICAgY29uc3QgZm9ybWF0dGVkVGltZSA9IG5vdy50b0xvY2FsZVN0cmluZygnZW4tSU4nLCB7IGhvdXIxMjogdHJ1ZSwgLi4ub3B0aW9ucyB9KTtcbiAgICBjb25zdCBbdGltZSwgcGVyaW9kXSA9IGZvcm1hdHRlZFRpbWUuc3BsaXQoJywgJylbMV0uc3BsaXQoJyAnKTtcbiAgICBjb25zdCBbaG91cnMsIG1pbnV0ZXMsIHNlY29uZHNdID0gdGltZS5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xuICAgIHJldHVybiB7IGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBwZXJpb2QgfTtcbiAgfVxuXG4gIHRpbWVUb1NlY29uZHMoaG91cnM6IG51bWJlciwgbWludXRlczogbnVtYmVyLCBzZWNvbmRzOiBudW1iZXIpIHtcbiAgICByZXR1cm4gaG91cnMgKiAzNjAwICsgbWludXRlcyAqIDYwICsgc2Vjb25kcztcbiAgfVxuXG4gIHNlY29uZHNUb1RpbWVTdHJpbmcoc2Vjb25kczogbnVtYmVyKSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyAzNjAwKSAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKChzZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2Vjb25kc1BhcnQgPSBzZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIGAke2hvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHttaW51dGVzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHtzZWNvbmRzUGFydC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIGhhbmRsZUNhbHVsYXRlSGFsZlRpbWUoZXhwaXJlVGltZTogc3RyaW5nLCBpc0hhbGZUaW1lOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBbZXhwaXJlSG91cnMsIGV4cGlyZU1pbnV0ZXMsIGV4cGlyZVNlY29uZHNdID0gZXhwaXJlVGltZS5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xuICAgIGNvbnN0IHsgaG91cnM6IGN1cnJlbnRIb3VycywgbWludXRlczogY3VycmVudE1pbnV0ZXMsIHNlY29uZHM6IGN1cnJlbnRTZWNvbmRzLCBwZXJpb2Q6IGN1cnJlbnRQZXJpb2QgfSA9IHRoaXMuZ2V0Q3VycmVudFRpbWUoKTtcblxuICAgIGNvbnN0IGV4cGlyZVRpbWVJblNlY29uZHMgPSB0aGlzLnRpbWVUb1NlY29uZHMoZXhwaXJlSG91cnMsIGV4cGlyZU1pbnV0ZXMsIGV4cGlyZVNlY29uZHMpO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lSW5TZWNvbmRzID0gdGhpcy50aW1lVG9TZWNvbmRzKGN1cnJlbnRIb3VycywgY3VycmVudE1pbnV0ZXMsIGN1cnJlbnRTZWNvbmRzKTtcblxuICAgIGxldCBoYWxmd2F5VGltZUluU2Vjb25kczogbnVtYmVyO1xuICAgIGlmIChpc0hhbGZUaW1lKSB7XG4gICAgICBoYWxmd2F5VGltZUluU2Vjb25kcyA9IGV4cGlyZVRpbWVJblNlY29uZHMgKyBjdXJyZW50VGltZUluU2Vjb25kcztcbiAgICB9IGVsc2Uge1xuICAgICAgaGFsZndheVRpbWVJblNlY29uZHMgPSBNYXRoLmZsb29yKChleHBpcmVUaW1lSW5TZWNvbmRzICsgY3VycmVudFRpbWVJblNlY29uZHMpIC8gMik7XG4gICAgfVxuXG4gICAgaWYgKGhhbGZ3YXlUaW1lSW5TZWNvbmRzIDwgMCkge1xuICAgICAgaGFsZndheVRpbWVJblNlY29uZHMgKz0gMTIgKiAzNjAwO1xuICAgIH0gZWxzZSBpZiAoaGFsZndheVRpbWVJblNlY29uZHMgPj0gMTIgKiAzNjAwKSB7XG4gICAgICBoYWxmd2F5VGltZUluU2Vjb25kcyAtPSAxMiAqIDM2MDA7XG4gICAgfVxuXG4gICAgY29uc3QgaGFsZndheVRpbWVTdHJpbmcgPSB0aGlzLnNlY29uZHNUb1RpbWVTdHJpbmcoaGFsZndheVRpbWVJblNlY29uZHMpO1xuXG4gICAgbGV0IGlzSGFsZlRpbWVHcmVhdGVyID0gZmFsc2U7XG4gICAgaWYgKGhhbGZ3YXlUaW1lU3RyaW5nLmVuZHNXaXRoKCdBTScpICYmIGV4cGlyZVRpbWUuZW5kc1dpdGgoJ1BNJykpIHtcbiAgICAgIGlzSGFsZlRpbWVHcmVhdGVyID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChoYWxmd2F5VGltZVN0cmluZy5lbmRzV2l0aCgnUE0nKSAmJiBleHBpcmVUaW1lLmVuZHNXaXRoKCdBTScpKSB7XG4gICAgICBpc0hhbGZUaW1lR3JlYXRlciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzSGFsZlRpbWVHcmVhdGVyID0gaGFsZndheVRpbWVTdHJpbmcgPiBleHBpcmVUaW1lO1xuICAgIH1cblxuICAgIHJldHVybiB7IGhhbGZ3YXlUaW1lU3RyaW5nLCBpc0hhbGZUaW1lR3JlYXRlciB9O1xuICB9XG5cbiAgY2hlY2tIYWxmVGltZUlzR3JlYXRlcigpIHtcbiAgICAvLyBjb25zdCBnZXRSZWZyZXNoVG9rZW5IYWxmVGltZTogc3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5yZWZyZXNoVG9rZW5FeHBpcmVUaW1lU3RvcmFnZUtleSkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGdldFJlZnJlc2hUb2tlbkhhbGZUaW1lID0gTG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLlJFRlJFU0hfVE9LRU5fSEFMRl9FWFBSRV9USU1FKVxuICAgIGlmICghZ2V0UmVmcmVzaFRva2VuSGFsZlRpbWUpIHRocm93IG5ldyBFcnJvcignUmVmcmVzaCB0b2tlbiBoYWxmIHRpbWUgaXMgbWlzc2luZycpO1xuICAgIGNvbnN0IHsgaXNIYWxmVGltZUdyZWF0ZXIsIGhhbGZ3YXlUaW1lU3RyaW5nIH0gPSB0aGlzLmhhbmRsZUNhbHVsYXRlSGFsZlRpbWUoZ2V0UmVmcmVzaFRva2VuSGFsZlRpbWUsIHRydWUpO1xuICAgIHJldHVybiB7IGlzSGFsZlRpbWVHcmVhdGVyLCBoYWxmd2F5VGltZVN0cmluZyB9O1xuICB9XG5cbiAgZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxufVxuIl19
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hdXRoLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGxhdGZvcm0taHR0cC1pbnRlcmNlcHRvci9zcmMvbGliL2h0dHAtYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0YsT0FBTyxFQUFjLFVBQVUsRUFBRSxVQUFVLEVBQVMsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFNM0MsTUFBTSxPQUFPLG1CQUFtQjtJQUc5QixZQUNVLE1BQWMsRUFDZCx3QkFBa0QsRUFDbEQsbUJBQXdDO1FBRnhDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFMbEQsaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQUtyQixDQUFDO0lBRUwsU0FBUyxDQUFDLE9BQTZCLEVBQUUsSUFBaUI7UUFDeEQsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksT0FBTyxHQUFJLE9BQU8sQ0FBQztRQUN2QixJQUFJLFNBQVMsRUFBRTtZQUNiLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN0QixVQUFVLEVBQUU7b0JBQ1YsYUFBYSxFQUFFLFVBQVUsU0FBUyxFQUFFO2lCQUNyQzthQUNGLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzthQUMvQjtZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDOUIsVUFBVSxDQUFDLENBQUMsS0FBd0IsRUFBRSxFQUFFO1lBQ3RDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7Z0JBQ3hCLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksU0FBUyxLQUFLLE1BQU0sSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO29CQUNqRCxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN0RCxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUM1RDtnQkFDRCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN6RSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0RSxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RCxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RCxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMzRCxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQ3BFLHFCQUFxQjtnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDO3dCQUNsRCxPQUFPLEVBQUUsd0JBQXdCO3FCQUNsQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztpQkFDOUI7Z0JBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO2FBQ2pDO1lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDO29CQUNsRCxPQUFPLEVBQUUsMkNBQTJDO29CQUNwRCxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7b0JBQ3BDLFFBQVEsRUFBRSxJQUFJO2lCQUNmLENBQUMsQ0FBQTthQUNIO1lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDO29CQUNsRCxPQUFPLEVBQUUseUNBQXlDO29CQUNsRCxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7b0JBQ3BDLFFBQVEsRUFBRSxJQUFJO2lCQUNmLENBQUMsQ0FBQTthQUNIO1lBQ0QsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7K0dBbEVVLG1CQUFtQjttSEFBbkIsbUJBQW1CLGNBSGxCLE1BQU07OzRGQUdQLG1CQUFtQjtrQkFKL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBIdHRwRXJyb3JSZXNwb25zZSxcbiAgSHR0cEV2ZW50LFxuICBIdHRwSGFuZGxlcixcbiAgSHR0cEludGVyY2VwdG9yLFxuICBIdHRwUmVxdWVzdFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBSZWZyZXNoVG9rZW5TZXJ2aWNlIH0gZnJvbSAnQHByb2dyZXNzLWNoZWYvcGxhdGZvcm0tcmVmcmVzaC10b2tlbi1zZXJ2aWNlJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRvYXN0Tm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy1jaGVmL3BsYXRmb3JtLXNoYXJlZC1jb21wb25lbnRzJztcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNlcnZpY2UsIFN0b3JhZ2VLZXlzIH0gZnJvbSAnQHByb2dyZXNzLWNoZWYvcGxhdGZvcm0tc3RvcmFnZS1zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNhdGNoRXJyb3IsIHRocm93RXJyb3IsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuXG5leHBvcnQgY2xhc3MgSHR0cEF1dGhJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gIGF1dGhUb2tlblNldCA9IG5ldyBTZXQoKTtcbiAgaXNTZXNzaW9uRXhwaXJlZCA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlOiBUb2FzdE5vdGlmaWNhdGlvblNlcnZpY2UsIFxuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuU2VydmljZTogUmVmcmVzaFRva2VuU2VydmljZSxcbiAgKSB7IH1cblxuICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcbiAgICAvLyBmdW5jdGlvbiB0byBjaGVjayBmb3IgdGhlIHJlZnJlc2ggdG9rZW4gdXNpbmcgcmVmZXJlc2ggdG9rZW4gc2VydmljZVxuICAgIHRoaXMucmVmcmVzaFRva2VuU2VydmljZS5jaGVja0ZvclJlZnJlc2goKTtcbiAgICBsZXQgYXV0aFRva2VuID0gTG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLkFVVEhfVE9LRU4pO1xuICAgIGxldCBhdXRoUmVxID0gIHJlcXVlc3Q7XG4gICAgaWYgKGF1dGhUb2tlbikge1xuICAgICAgYXV0aFJlcSA9IHJlcXVlc3QuY2xvbmUoe1xuICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGhUb2tlbn1gXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAoIXRoaXMuYXV0aFRva2VuU2V0LmhhcyhhdXRoVG9rZW4pKSB7XG4gICAgICAgIHRoaXMuaXNTZXNzaW9uRXhwaXJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5hdXRoVG9rZW5TZXQuYWRkKGF1dGhUb2tlbik7XG4gICAgfVxuICAgIHJldHVybiBuZXh0LmhhbmRsZShhdXRoUmVxKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgIGNvbnN0IGxvZ2luVHlwZSA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5MT0dJTl9UWVBFKTtcbiAgICAgICAgICBpZiAobG9naW5UeXBlID09PSAnc2FtbCcgfHwgbG9naW5UeXBlID09PSAnb2F1dGgnKSB7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVVNFUl9OQU1FKTtcbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5JU19SRU1FTUJFUl9NRSk7IFxuICAgICAgICAgIH1cbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oU3RvcmFnZUtleXMuSVNfVVNFUl9PUkdfQU5EX1JPTEVfU0VULCBmYWxzZSk7XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLklTX1VTRVJfQVVUSEVOVElDQVRFRCwgZmFsc2UpO1xuICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5BVVRIX1RPS0VOKTtcbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuTE9HSU5fVFlQRSk7XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLklERU5USVRZX1RPS0VOKTtcbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVVNFUl9PUkdfQU5EX1JPTEVfVE9LRU4pO1xuICAgICAgICAgIC8vIGNhbGwgbG9nb3V0IGFjdGlvblxuICAgICAgICAgIGlmICghdGhpcy5pc1Nlc3Npb25FeHBpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICBjb250ZW50OiAnVGhlIHNlc3Npb24gaGFzIGVuZGVkLidcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pc1Nlc3Npb25FeHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbG9naW4nXSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSAwIHx8IGVycm9yLnN0YXR1cyA9PT0gNTA0KSB7XG4gICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBVbmFibGUgdG8gcmVhY2ggc2VydmVyLiBQbGVhc2UgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy8gcmVmcmVzaFRva2VuKCkge1xuICAvLyAgIGNvbnN0IGJhc2VVcmwgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuQ1VSUkVOVF9TRVJWRVJfQkFTRV9VUkwpO1xuICAvLyAgIGlmICghYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgYmFja2VuZCBvciBzZXJ2ZXIgYmFzZSBVUkwgaXMgbWlzc2luZyBpbiBMb2NhbCBTdG9yYWdlJyk7XG4gIC8vICAgdGhpcy5yZWZyZXNoVG9rZW5TZXJ2aWNlLnJlZnJlc2hUb2tlbih7IHBsYXRmb3JtU2VydmljZUFwaUJhc2VVcmw6IGJhc2VVcmwgfSk7XG4gIC8vIH1cblxuICAvLyB0cmlnZ2VyUmVmcmVzaFRva2VuVGltZXIoKSB7XG4gIC8vICAgY29uc3QgcmVmcmVzaFRva2VuVGltZSA9IDIwICogMTAwMDtcbiAgLy8gICB0aW1lcigwLCByZWZyZXNoVG9rZW5UaW1lKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAvLyAgICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgLy8gICB9KVxuICAvLyB9XG59XG4iXX0=
@@ -14,13 +14,9 @@ class HttpAuthInterceptor {
14
14
  this.authTokenSet = new Set();
15
15
  this.isSessionExpired = false;
16
16
  }
17
- // private currentBaseUrlFromLocalStorage: string = 'currentServerBaseUrl';
18
- // private refreshTokenExpireTimeStorageKey: string = 'refreshTokenExpireTime';
19
17
  intercept(request, next) {
20
- const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME);
21
- if (getRefreshTokenHalfTime) {
22
- this.manageTokenRefresh();
23
- }
18
+ // function to check for the refresh token using referesh token service
19
+ this.refreshTokenService.checkForRefresh();
24
20
  let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);
25
21
  let authReq = request;
26
22
  if (authToken) {
@@ -73,102 +69,6 @@ class HttpAuthInterceptor {
73
69
  return throwError(() => error);
74
70
  }));
75
71
  }
76
- async manageRefreshTokenExpireTime() {
77
- const newExpireTime = await this.getExpireAtTime();
78
- const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime);
79
- LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString);
80
- }
81
- manageTokenRefresh() {
82
- const { isHalfTimeGreater } = this.checkHalfTimeIsGreater();
83
- if (isHalfTimeGreater) {
84
- this.refreshToken();
85
- this.manageRefreshTokenExpireTime();
86
- // const newExpireTime = this.getExpireAtTime()
87
- // const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)
88
- // localStorage.setItem(this.refreshTokenExpireTimeStorageKey, halfwayTimeString)
89
- // LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)
90
- }
91
- }
92
- refreshToken() {
93
- // const baseUrl: string = localStorage.getItem(this.currentBaseUrlFromLocalStorage) as string;
94
- const baseUrl = LocalStorageService.getItem(StorageKeys.CURRENT_SERVER_BASE_URL);
95
- if (!baseUrl)
96
- throw new Error('The backend or server base URL is missing in Local Storage');
97
- this.refreshTokenService.refreshToken({ platformServiceApiBaseUrls: baseUrl });
98
- }
99
- async getExpireAtTime() {
100
- await this.delay(2000);
101
- let isIdentityToken = LocalStorageService.getItem(StorageKeys.IDENTITY_TOKEN);
102
- console.log('======= check is token availabe --------', isIdentityToken);
103
- if (!isIdentityToken)
104
- throw new Error('identity token is missing in the local storage');
105
- const { expireAt } = isIdentityToken;
106
- const date = new Date(expireAt * 1000);
107
- const hours = date.getUTCHours().toString().padStart(2, '0');
108
- const minutes = date.getUTCMinutes().toString().padStart(2, '0');
109
- const seconds = date.getUTCSeconds().toString().padStart(2, '0');
110
- const latestRefreshTokenExpireTime = `${hours}:${minutes}:${seconds}`; //10:00:00
111
- return latestRefreshTokenExpireTime;
112
- }
113
- getCurrentTime() {
114
- const now = new Date();
115
- const options = { timeZone: 'Asia/Kolkata' };
116
- const formattedTime = now.toLocaleString('en-IN', { hour12: true, ...options });
117
- const [time, period] = formattedTime.split(', ')[1].split(' ');
118
- const [hours, minutes, seconds] = time.split(':').map(Number);
119
- return { hours, minutes, seconds, period };
120
- }
121
- timeToSeconds(hours, minutes, seconds) {
122
- return hours * 3600 + minutes * 60 + seconds;
123
- }
124
- secondsToTimeString(seconds) {
125
- const hours = Math.floor(seconds / 3600) % 12 || 12;
126
- const minutes = Math.floor((seconds % 3600) / 60);
127
- const secondsPart = seconds % 60;
128
- return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secondsPart.toString().padStart(2, '0')}`;
129
- }
130
- handleCalulateHalfTime(expireTime, isHalfTime = false) {
131
- const [expireHours, expireMinutes, expireSeconds] = expireTime.split(':').map(Number);
132
- const { hours: currentHours, minutes: currentMinutes, seconds: currentSeconds, period: currentPeriod } = this.getCurrentTime();
133
- const expireTimeInSeconds = this.timeToSeconds(expireHours, expireMinutes, expireSeconds);
134
- const currentTimeInSeconds = this.timeToSeconds(currentHours, currentMinutes, currentSeconds);
135
- let halfwayTimeInSeconds;
136
- if (isHalfTime) {
137
- halfwayTimeInSeconds = expireTimeInSeconds + currentTimeInSeconds;
138
- }
139
- else {
140
- halfwayTimeInSeconds = Math.floor((expireTimeInSeconds + currentTimeInSeconds) / 2);
141
- }
142
- if (halfwayTimeInSeconds < 0) {
143
- halfwayTimeInSeconds += 12 * 3600;
144
- }
145
- else if (halfwayTimeInSeconds >= 12 * 3600) {
146
- halfwayTimeInSeconds -= 12 * 3600;
147
- }
148
- const halfwayTimeString = this.secondsToTimeString(halfwayTimeInSeconds);
149
- let isHalfTimeGreater = false;
150
- if (halfwayTimeString.endsWith('AM') && expireTime.endsWith('PM')) {
151
- isHalfTimeGreater = false;
152
- }
153
- else if (halfwayTimeString.endsWith('PM') && expireTime.endsWith('AM')) {
154
- isHalfTimeGreater = true;
155
- }
156
- else {
157
- isHalfTimeGreater = halfwayTimeString > expireTime;
158
- }
159
- return { halfwayTimeString, isHalfTimeGreater };
160
- }
161
- checkHalfTimeIsGreater() {
162
- // const getRefreshTokenHalfTime: string = localStorage.getItem(this.refreshTokenExpireTimeStorageKey) as string;
163
- const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME);
164
- if (!getRefreshTokenHalfTime)
165
- throw new Error('Refresh token half time is missing');
166
- const { isHalfTimeGreater, halfwayTimeString } = this.handleCalulateHalfTime(getRefreshTokenHalfTime, true);
167
- return { isHalfTimeGreater, halfwayTimeString };
168
- }
169
- delay(ms) {
170
- return new Promise(resolve => setTimeout(resolve, ms));
171
- }
172
72
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, deps: [{ token: i1.Router }, { token: i2.ToastNotificationService }, { token: i3.RefreshTokenService }], target: i0.ɵɵFactoryTarget.Injectable }); }
173
73
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, providedIn: 'root' }); }
174
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"progress-chef-platform-http-interceptor.mjs","sources":["../../../projects/platform-http-interceptor/src/lib/http-auth.interceptor.ts","../../../projects/platform-http-interceptor/src/public-api.ts","../../../projects/platform-http-interceptor/src/progress-chef-platform-http-interceptor.ts"],"sourcesContent":["import {\n HttpErrorResponse,\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest\n} from '@angular/common/http';\n// import { RefreshTokenService } from '../../../../dist/platform-refresh-token-service/index';\nimport { RefreshTokenService } from '@progress-chef/platform-refresh-token-service'\nimport { Router } from '@angular/router';\nimport { ToastNotificationService } from '@progress-chef/platform-shared-components';\nimport { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';\nimport { Observable, catchError, throwError } from 'rxjs';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\n\nexport class HttpAuthInterceptor implements HttpInterceptor {\n authTokenSet = new Set();\n isSessionExpired = false;\n constructor(\n private router: Router,\n private toastNotificationService: ToastNotificationService, \n private refreshTokenService: RefreshTokenService,\n ) { }\n\n // private currentBaseUrlFromLocalStorage: string = 'currentServerBaseUrl';\n // private refreshTokenExpireTimeStorageKey: string = 'refreshTokenExpireTime';\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n\n const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME)\n if (getRefreshTokenHalfTime) {\n this.manageTokenRefresh();\n }\n\n let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);\n let authReq = request;\n if (authToken) {\n authReq = request.clone({\n setHeaders: {\n Authorization: `Bearer ${authToken}`\n }\n })\n if (!this.authTokenSet.has(authToken)) {\n this.isSessionExpired = false;\n }\n this.authTokenSet.add(authToken);\n }\n return next.handle(authReq).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n const loginType = LocalStorageService.getItem(StorageKeys.LOGIN_TYPE);\n if (loginType === 'saml' || loginType === 'oauth') {\n LocalStorageService.removeItem(StorageKeys.USER_NAME);\n LocalStorageService.removeItem(StorageKeys.IS_REMEMBER_ME); \n }\n LocalStorageService.setItem(StorageKeys.IS_USER_ORG_AND_ROLE_SET, false);\n LocalStorageService.setItem(StorageKeys.IS_USER_AUTHENTICATED, false);\n LocalStorageService.removeItem(StorageKeys.AUTH_TOKEN);\n LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);\n LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);\n LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);\n // call logout action\n if (!this.isSessionExpired) {\n this.toastNotificationService.showToastNotification({\n content: 'The session has ended.'\n });\n this.isSessionExpired = true;\n }\n \n this.router.navigate(['/login'])\n }\n if (error.status === 0 || error.status === 504) {\n this.toastNotificationService.showToastNotification({\n content: `Unable to reach server. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true\n })\n }\n if (error.status === 500) {\n this.toastNotificationService.showToastNotification({\n content: `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true\n })\n }\n return throwError(() => error)\n })\n );\n }\n\n async manageRefreshTokenExpireTime() {\n const newExpireTime = await this.getExpireAtTime()\n const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)\n LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)\n }\n\n manageTokenRefresh() {\n const { isHalfTimeGreater } = this.checkHalfTimeIsGreater();\n if (isHalfTimeGreater) {\n this.refreshToken();\n this.manageRefreshTokenExpireTime();\n // const newExpireTime = this.getExpireAtTime()\n // const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)\n // localStorage.setItem(this.refreshTokenExpireTimeStorageKey, halfwayTimeString)\n // LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)\n }\n }\n\n refreshToken() {\n // const baseUrl: string = localStorage.getItem(this.currentBaseUrlFromLocalStorage) as string;\n const baseUrl = LocalStorageService.getItem(StorageKeys.CURRENT_SERVER_BASE_URL);\n if (!baseUrl) throw new Error('The backend or server base URL is missing in Local Storage');\n this.refreshTokenService.refreshToken({ platformServiceApiBaseUrls: baseUrl });\n }\n\n async getExpireAtTime() {\n await this.delay(2000)\n let isIdentityToken = LocalStorageService.getItem(StorageKeys.IDENTITY_TOKEN);\n console.log('======= check is token availabe --------', isIdentityToken) \n if (!isIdentityToken) throw new Error('identity token is missing in the local storage');\n const { expireAt } = isIdentityToken;\n const date = new Date(expireAt * 1000);\n const hours = date.getUTCHours().toString().padStart(2, '0');\n const minutes = date.getUTCMinutes().toString().padStart(2, '0');\n const seconds = date.getUTCSeconds().toString().padStart(2, '0');\n const latestRefreshTokenExpireTime = `${hours}:${minutes}:${seconds}`; //10:00:00\n return latestRefreshTokenExpireTime;\n }\n\n getCurrentTime() {\n const now = new Date();\n const options = { timeZone: 'Asia/Kolkata' };\n const formattedTime = now.toLocaleString('en-IN', { hour12: true, ...options });\n const [time, period] = formattedTime.split(', ')[1].split(' ');\n const [hours, minutes, seconds] = time.split(':').map(Number);\n return { hours, minutes, seconds, period };\n }\n\n timeToSeconds(hours: number, minutes: number, seconds: number) {\n return hours * 3600 + minutes * 60 + seconds;\n }\n\n secondsToTimeString(seconds: number) {\n const hours = Math.floor(seconds / 3600) % 12 || 12;\n const minutes = Math.floor((seconds % 3600) / 60);\n const secondsPart = seconds % 60;\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secondsPart.toString().padStart(2, '0')}`;\n }\n\n handleCalulateHalfTime(expireTime: string, isHalfTime: boolean = false) {\n const [expireHours, expireMinutes, expireSeconds] = expireTime.split(':').map(Number);\n const { hours: currentHours, minutes: currentMinutes, seconds: currentSeconds, period: currentPeriod } = this.getCurrentTime();\n\n const expireTimeInSeconds = this.timeToSeconds(expireHours, expireMinutes, expireSeconds);\n const currentTimeInSeconds = this.timeToSeconds(currentHours, currentMinutes, currentSeconds);\n\n let halfwayTimeInSeconds: number;\n if (isHalfTime) {\n halfwayTimeInSeconds = expireTimeInSeconds + currentTimeInSeconds;\n } else {\n halfwayTimeInSeconds = Math.floor((expireTimeInSeconds + currentTimeInSeconds) / 2);\n }\n\n if (halfwayTimeInSeconds < 0) {\n halfwayTimeInSeconds += 12 * 3600;\n } else if (halfwayTimeInSeconds >= 12 * 3600) {\n halfwayTimeInSeconds -= 12 * 3600;\n }\n\n const halfwayTimeString = this.secondsToTimeString(halfwayTimeInSeconds);\n\n let isHalfTimeGreater = false;\n if (halfwayTimeString.endsWith('AM') && expireTime.endsWith('PM')) {\n isHalfTimeGreater = false;\n } else if (halfwayTimeString.endsWith('PM') && expireTime.endsWith('AM')) {\n isHalfTimeGreater = true;\n } else {\n isHalfTimeGreater = halfwayTimeString > expireTime;\n }\n\n return { halfwayTimeString, isHalfTimeGreater };\n }\n\n checkHalfTimeIsGreater() {\n // const getRefreshTokenHalfTime: string = localStorage.getItem(this.refreshTokenExpireTimeStorageKey) as string;\n const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME)\n if (!getRefreshTokenHalfTime) throw new Error('Refresh token half time is missing');\n const { isHalfTimeGreater, halfwayTimeString } = this.handleCalulateHalfTime(getRefreshTokenHalfTime, true);\n return { isHalfTimeGreater, halfwayTimeString };\n }\n\n delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n","/*\n * Public API Surface of platform-http-interceptor\n */\n\nexport * from './lib/http-auth.interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"progress-chef-platform-http-interceptor.mjs","sources":["../../../projects/platform-http-interceptor/src/lib/http-auth.interceptor.ts","../../../projects/platform-http-interceptor/src/public-api.ts","../../../projects/platform-http-interceptor/src/progress-chef-platform-http-interceptor.ts"],"sourcesContent":["import {\n HttpErrorResponse,\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest\n} from '@angular/common/http';\nimport { RefreshTokenService } from '@progress-chef/platform-refresh-token-service'\nimport { Router } from '@angular/router';\nimport { ToastNotificationService } from '@progress-chef/platform-shared-components';\nimport { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';\nimport { Observable, catchError, throwError, timer } from 'rxjs';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\n\nexport class HttpAuthInterceptor implements HttpInterceptor {\n authTokenSet = new Set();\n isSessionExpired = false;\n constructor(\n private router: Router,\n private toastNotificationService: ToastNotificationService, \n private refreshTokenService: RefreshTokenService,\n ) { }\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n // function to check for the refresh token using referesh token service\n this.refreshTokenService.checkForRefresh();\n let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);\n let authReq = request;\n if (authToken) {\n authReq = request.clone({\n setHeaders: {\n Authorization: `Bearer ${authToken}`\n }\n })\n if (!this.authTokenSet.has(authToken)) {\n this.isSessionExpired = false;\n }\n this.authTokenSet.add(authToken);\n }\n return next.handle(authReq).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n const loginType = LocalStorageService.getItem(StorageKeys.LOGIN_TYPE);\n if (loginType === 'saml' || loginType === 'oauth') {\n LocalStorageService.removeItem(StorageKeys.USER_NAME);\n LocalStorageService.removeItem(StorageKeys.IS_REMEMBER_ME); \n }\n LocalStorageService.setItem(StorageKeys.IS_USER_ORG_AND_ROLE_SET, false);\n LocalStorageService.setItem(StorageKeys.IS_USER_AUTHENTICATED, false);\n LocalStorageService.removeItem(StorageKeys.AUTH_TOKEN);\n LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);\n LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);\n LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);\n // call logout action\n if (!this.isSessionExpired) {\n this.toastNotificationService.showToastNotification({\n content: 'The session has ended.'\n });\n this.isSessionExpired = true;\n }\n \n this.router.navigate(['/login'])\n }\n if (error.status === 0 || error.status === 504) {\n this.toastNotificationService.showToastNotification({\n content: `Unable to reach server. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true\n })\n }\n if (error.status === 500) {\n this.toastNotificationService.showToastNotification({\n content: `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true\n })\n }\n return throwError(() => error)\n })\n );\n }\n\n // refreshToken() {\n // const baseUrl = LocalStorageService.getItem(StorageKeys.CURRENT_SERVER_BASE_URL);\n // if (!baseUrl) throw new Error('The backend or server base URL is missing in Local Storage');\n // this.refreshTokenService.refreshToken({ platformServiceApiBaseUrl: baseUrl });\n // }\n\n // triggerRefreshTokenTimer() {\n // const refreshTokenTime = 20 * 1000;\n // timer(0, refreshTokenTime).subscribe(() => {\n // this.refreshToken();\n // })\n // }\n}\n","/*\n * Public API Surface of platform-http-interceptor\n */\n\nexport * from './lib/http-auth.interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -12,27 +12,6 @@ export declare class HttpAuthInterceptor implements HttpInterceptor {
12
12
  isSessionExpired: boolean;
13
13
  constructor(router: Router, toastNotificationService: ToastNotificationService, refreshTokenService: RefreshTokenService);
14
14
  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
15
- manageRefreshTokenExpireTime(): Promise<void>;
16
- manageTokenRefresh(): void;
17
- refreshToken(): void;
18
- getExpireAtTime(): Promise<string>;
19
- getCurrentTime(): {
20
- hours: number;
21
- minutes: number;
22
- seconds: number;
23
- period: string;
24
- };
25
- timeToSeconds(hours: number, minutes: number, seconds: number): number;
26
- secondsToTimeString(seconds: number): string;
27
- handleCalulateHalfTime(expireTime: string, isHalfTime?: boolean): {
28
- halfwayTimeString: string;
29
- isHalfTimeGreater: boolean;
30
- };
31
- checkHalfTimeIsGreater(): {
32
- isHalfTimeGreater: boolean;
33
- halfwayTimeString: string;
34
- };
35
- delay(ms: number): Promise<void>;
36
15
  static ɵfac: i0.ɵɵFactoryDeclaration<HttpAuthInterceptor, never>;
37
16
  static ɵprov: i0.ɵɵInjectableDeclaration<HttpAuthInterceptor>;
38
17
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress-chef/platform-http-interceptor",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^16.2.0",
6
6
  "@angular/core": "^16.2.0"