tas-uell-sdk 0.1.3 → 0.3.0

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/README.md +3 -0
  2. package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +17 -15
  3. package/esm2020/lib/components/tas-feedback-modal/tas-feedback-modal.component.mjs +229 -0
  4. package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +38 -3
  5. package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +46 -8
  6. package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +163 -43
  7. package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +150 -34
  8. package/esm2020/lib/icons/tas-icons.mjs +17 -0
  9. package/esm2020/lib/interfaces/tas.interfaces.mjs +13 -1
  10. package/esm2020/lib/services/tas.service.mjs +127 -26
  11. package/esm2020/lib/tas-uell-sdk.module.mjs +8 -3
  12. package/esm2020/public-api.mjs +2 -1
  13. package/fesm2015/tas-uell-sdk.mjs +794 -124
  14. package/fesm2015/tas-uell-sdk.mjs.map +1 -1
  15. package/fesm2020/tas-uell-sdk.mjs +787 -123
  16. package/fesm2020/tas-uell-sdk.mjs.map +1 -1
  17. package/lib/components/tas-btn/tas-btn.component.d.ts +1 -0
  18. package/lib/components/tas-feedback-modal/tas-feedback-modal.component.d.ts +101 -0
  19. package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +5 -0
  20. package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +12 -1
  21. package/lib/components/tas-videocall/tas-videocall.component.d.ts +49 -6
  22. package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +40 -12
  23. package/lib/icons/tas-icons.d.ts +8 -0
  24. package/lib/interfaces/tas.interfaces.d.ts +36 -3
  25. package/lib/services/tas.service.d.ts +27 -2
  26. package/lib/tas-uell-sdk.module.d.ts +5 -4
  27. package/package.json +1 -1
  28. package/public-api.d.ts +1 -0
  29. package/src/lib/styles/tas-global.scss +17 -0
@@ -1,18 +1,32 @@
1
1
  import { Component, Input, ViewChild, } from '@angular/core';
2
- import { CallState, ViewMode, TasBusinessRole, UserCallAction, } from '../../interfaces/tas.interfaces';
2
+ import { TasFeedbackModalComponent } from '../tas-feedback-modal/tas-feedback-modal.component';
3
+ import { CallState, ViewMode, TasBusinessRole, UserCallAction, GeoStatus, } from '../../interfaces/tas.interfaces';
4
+ import { TAS_ICONS } from '../../icons/tas-icons';
3
5
  import { Subscription } from 'rxjs';
4
6
  import interact from 'interactjs';
5
7
  import * as i0 from "@angular/core";
6
8
  import * as i1 from "@ng-bootstrap/ng-bootstrap";
7
9
  import * as i2 from "../../services/tas.service";
8
10
  import * as i3 from "../../services/geolocation.service";
9
- import * as i4 from "../tas-avatar/tas-avatar.component";
10
- import * as i5 from "@angular/common";
11
+ import * as i4 from "@angular/platform-browser";
12
+ import * as i5 from "../tas-avatar/tas-avatar.component";
13
+ import * as i6 from "@angular/common";
14
+ /** User geolocation panel view states */
15
+ export var UserGeoViewState;
16
+ (function (UserGeoViewState) {
17
+ UserGeoViewState["HIDDEN"] = "HIDDEN";
18
+ UserGeoViewState["INITIAL"] = "INITIAL";
19
+ UserGeoViewState["VERIFYING"] = "VERIFYING";
20
+ UserGeoViewState["VERIFIED"] = "VERIFIED";
21
+ UserGeoViewState["DENIED"] = "DENIED";
22
+ })(UserGeoViewState || (UserGeoViewState = {}));
11
23
  export class TasVideocallComponent {
12
- constructor(activeModal, tasService, geolocationService) {
24
+ constructor(activeModal, tasService, geolocationService, sanitizer, modalService) {
13
25
  this.activeModal = activeModal;
14
26
  this.tasService = tasService;
15
27
  this.geolocationService = geolocationService;
28
+ this.sanitizer = sanitizer;
29
+ this.modalService = modalService;
16
30
  this.participantName = '';
17
31
  this.tenant = '';
18
32
  this.businessRole = TasBusinessRole.USER;
@@ -30,11 +44,23 @@ export class TasVideocallComponent {
30
44
  // Geo panel states for owner
31
45
  this.geoRequestActive = false; // Owner sent request, waiting for user
32
46
  this.allGeoGranted = false; // All users responded with geo
47
+ this.userGeoInfo = []; // Individual user geo status
48
+ // User geo panel state (for owners)
49
+ this.userGeoViewState = UserGeoViewState.HIDDEN;
50
+ this.UserGeoViewState = UserGeoViewState; // Expose enum to template
51
+ this.devModeEnabled = false; // Enable dev controls for testing
52
+ this.geoPanelDismissed = false; // Track if owner manually closed the panel
53
+ this.feedbackShown = false; // Track if feedback modal has been shown
33
54
  this.subscriptions = new Subscription();
55
+ this.homeIcon = this.sanitizer.bypassSecurityTrustHtml(TAS_ICONS.home);
34
56
  }
35
57
  ngOnInit() {
36
58
  this.setupSubscriptions();
37
59
  this.initializeCall();
60
+ // For owners: show the geo panel to request user location (unless dismissed)
61
+ if (this.canAdmitUsers && !this.geoPanelDismissed) {
62
+ this.userGeoViewState = UserGeoViewState.INITIAL;
63
+ }
38
64
  }
39
65
  ngAfterViewInit() {
40
66
  this.initInteract();
@@ -52,6 +78,37 @@ export class TasVideocallComponent {
52
78
  hangUp() {
53
79
  this.tasService.disconnectSession();
54
80
  }
81
+ /**
82
+ * Open feedback modal when call ends
83
+ */
84
+ openFeedbackModal() {
85
+ // Prevent opening feedback modal multiple times
86
+ if (this.feedbackShown) {
87
+ this.activeModal.close('hangup');
88
+ return;
89
+ }
90
+ // Get videoCallId from input or service
91
+ const videoCallId = this.videoCallId ?? this.tasService.videoCallId;
92
+ // If no videoCallId, skip feedback and close directly
93
+ if (!videoCallId) {
94
+ this.activeModal.close('hangup');
95
+ return;
96
+ }
97
+ this.feedbackShown = true;
98
+ const modalRef = this.modalService.open(TasFeedbackModalComponent, {
99
+ centered: true,
100
+ backdrop: true,
101
+ keyboard: true,
102
+ windowClass: 'tas-feedback-modal-wrapper',
103
+ });
104
+ modalRef.componentInstance.videoCallId = videoCallId;
105
+ modalRef.componentInstance.tenant = this.tenant;
106
+ modalRef.componentInstance.businessRole = this.businessRole;
107
+ // Close videocall modal after feedback modal is closed/dismissed
108
+ modalRef.result.finally(() => {
109
+ this.activeModal.close('hangup');
110
+ });
111
+ }
55
112
  toggleMute() {
56
113
  this.tasService.toggleMute();
57
114
  }
@@ -76,6 +133,43 @@ export class TasVideocallComponent {
76
133
  this.businessRole === TasBusinessRole.ADMIN_MANAGER ||
77
134
  this.businessRole === TasBusinessRole.MANAGER);
78
135
  }
136
+ /** Users with pending geo status */
137
+ get pendingUsers() {
138
+ return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.PENDING);
139
+ }
140
+ /** Users who granted geo */
141
+ get grantedUsers() {
142
+ return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.GRANTED);
143
+ }
144
+ /** Users who denied geo */
145
+ get deniedUsers() {
146
+ return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.DENIED);
147
+ }
148
+ /** Show location panel only if owner and there are users who haven't granted */
149
+ get shouldShowLocationPanel() {
150
+ if (!this.canAdmitUsers || this.userGeoInfo.length === 0) {
151
+ return false;
152
+ }
153
+ // Hide if all users have granted
154
+ const allGranted = this.userGeoInfo.every(u => u.geoStatus === GeoStatus.GRANTED);
155
+ return !allGranted;
156
+ }
157
+ /** Check if any user has denied geo */
158
+ get hasAnyDenied() {
159
+ return this.deniedUsers.length > 0;
160
+ }
161
+ /** Show user geo panel for owners when not hidden */
162
+ get shouldShowUserGeoPanel() {
163
+ return this.canAdmitUsers && this.userGeoViewState !== UserGeoViewState.HIDDEN;
164
+ }
165
+ /** Set user geo view state (for dev controls or close button) */
166
+ setUserGeoViewState(state) {
167
+ this.userGeoViewState = state;
168
+ // Track if owner manually dismissed the panel
169
+ if (state === UserGeoViewState.HIDDEN) {
170
+ this.geoPanelDismissed = true;
171
+ }
172
+ }
79
173
  /**
80
174
  * Admit a user from the waiting room
81
175
  */
@@ -114,7 +208,7 @@ export class TasVideocallComponent {
114
208
  this.showLocationPanel = false;
115
209
  }
116
210
  /**
117
- * Request the user to share their location
211
+ * Request the user to share their location (called by owner)
118
212
  */
119
213
  requestUserLocation() {
120
214
  if (!this.videoCallId) {
@@ -125,9 +219,12 @@ export class TasVideocallComponent {
125
219
  videoCallId: this.videoCallId,
126
220
  action: UserCallAction.REQUEST_GEOLOCALIZATION,
127
221
  };
128
- // TODO: Send location request action to backend when endpoint is ready
129
222
  this.tasService.modifyProxyVideoUser(body).subscribe({
130
- next: () => console.log('Location request sent'),
223
+ next: () => {
224
+ console.log('Location request sent');
225
+ // Set panel to verifying state while waiting for user response
226
+ this.userGeoViewState = UserGeoViewState.VERIFYING;
227
+ },
131
228
  error: (err) => console.error('Error requesting location:', err),
132
229
  });
133
230
  }
@@ -137,7 +234,7 @@ export class TasVideocallComponent {
137
234
  this.subscriptions.add(this.tasService.callState$.subscribe((state) => {
138
235
  this.callState = state;
139
236
  if (state === CallState.DISCONNECTED) {
140
- this.activeModal.close('hangup');
237
+ this.openFeedbackModal();
141
238
  }
142
239
  // Track if we have an active video stream
143
240
  this.hasVideoStream = state === CallState.CONNECTED;
@@ -164,69 +261,82 @@ export class TasVideocallComponent {
164
261
  // Owner left subscription - disconnect non-owners
165
262
  this.subscriptions.add(this.tasService.ownerHasLeft$.subscribe((hasLeft) => {
166
263
  if (hasLeft && !this.canAdmitUsers) { // Non-owner user
167
- console.log('[TAS DEBUG] Owner left, disconnecting user');
264
+ // hangUp() triggers DISCONNECTED state, which opens feedback modal
265
+ // then closes videocall modal after feedback is done
168
266
  this.hangUp();
169
- this.activeModal.close('owner_left');
170
267
  }
171
268
  }));
172
269
  // ActivateGeo subscription - only for non-owners (users)
173
270
  this.subscriptions.add(this.tasService.activateGeo$.subscribe((activateGeo) => {
174
271
  if (activateGeo && !this.canAdmitUsers) {
175
- console.log('[TAS DEBUG] activateGeo=true, checking geo status for user...');
176
272
  this.handleActivateGeo();
177
273
  }
178
274
  }));
179
275
  // GeoRequestActive subscription - for owners
180
276
  this.subscriptions.add(this.tasService.geoRequestActive$.subscribe((active) => {
181
- console.log('[TAS DEBUG] geoRequestActive changed:', active);
182
277
  this.geoRequestActive = active;
183
278
  }));
184
- // AllGeoGranted subscription - for owners
279
+ // AllGeoGranted subscription - for owners to update panel state
185
280
  this.subscriptions.add(this.tasService.allGeoGranted$.subscribe((granted) => {
186
- console.log('[TAS DEBUG] allGeoGranted changed:', granted);
187
281
  this.allGeoGranted = granted;
282
+ // For owners: update panel state based on geo status
283
+ if (this.canAdmitUsers && granted) {
284
+ this.userGeoViewState = UserGeoViewState.VERIFIED;
285
+ }
286
+ }));
287
+ // UserGeoInfo subscription - for owner geo panel
288
+ this.subscriptions.add(this.tasService.userGeoInfo$.subscribe((info) => {
289
+ this.userGeoInfo = info;
290
+ // Note: We don't auto-switch to DENIED here - that only happens
291
+ // after owner requests and user denies (via geoRequestActive flow)
188
292
  }));
189
293
  }
190
294
  /**
191
295
  * Handle activateGeo request from backend (for non-owner users).
192
- * If geo is already active, report it. If not, prompt user.
296
+ * Directly prompts browser for geolocation - no panel for users.
193
297
  */
194
298
  async handleActivateGeo() {
195
- console.log('[TAS DEBUG] handleActivateGeo - current status:', this.geoLocationStatus);
196
- // Check if we already have a cached position
197
- const cachedPosition = this.geolocationService.getCachedPosition();
198
- if (cachedPosition) {
199
- console.log('[TAS DEBUG] Geolocation already active, reporting to backend:', cachedPosition);
299
+ // Clear any cached position to force re-prompting
300
+ this.geolocationService.clearCache();
301
+ // Request geolocation from user (browser will prompt)
302
+ const position = await this.geolocationService.getCurrentPosition();
303
+ if (position) {
200
304
  this.geoLocationStatus = 'active';
201
- this.reportGeoStatus(cachedPosition.latitude, cachedPosition.longitude);
202
- return;
305
+ this.reportGeoStatus(position.latitude, position.longitude);
203
306
  }
204
- // Try to get position
205
- console.log('[TAS DEBUG] Requesting geolocation from user...');
307
+ else {
308
+ this.geoLocationStatus = 'denied';
309
+ this.denyGeoLocation();
310
+ }
311
+ }
312
+ /** Start geolocation verification (called from template button) */
313
+ async startGeoVerification() {
314
+ this.userGeoViewState = UserGeoViewState.VERIFYING;
315
+ // Clear any cached position to force re-prompting
316
+ this.geolocationService.clearCache();
317
+ // Request geolocation from user (browser will prompt)
206
318
  const position = await this.geolocationService.getCurrentPosition();
207
319
  if (position) {
208
- console.log('[TAS DEBUG] Geolocation obtained:', position);
209
320
  this.geoLocationStatus = 'active';
321
+ this.userGeoViewState = UserGeoViewState.VERIFIED;
210
322
  this.reportGeoStatus(position.latitude, position.longitude);
211
323
  }
212
324
  else {
213
- console.log('[TAS DEBUG] Geolocation denied or unavailable');
214
325
  this.geoLocationStatus = 'denied';
215
- // Report that geo is not available (with no coordinates)
216
- this.reportGeoStatus();
326
+ this.userGeoViewState = UserGeoViewState.DENIED;
327
+ this.denyGeoLocation();
217
328
  }
218
329
  }
219
330
  /**
220
- * Report geolocation status to backend.
331
+ * Report granted geolocation to backend.
332
+ * IMPORTANT: Only call with valid coordinates.
221
333
  */
222
334
  reportGeoStatus(latitude, longitude) {
223
335
  if (!this.videoCallId) {
224
- console.error('[TAS DEBUG] Cannot report geo status: videoCallId not set');
225
336
  return;
226
337
  }
227
- // TODO: If the permission for geo location is not granted, we should not report it to the backend
228
- if (!this.geoLocationStatus) {
229
- console.error('[TAS DEBUG] Cannot report geo status: geoLocationStatus not set');
338
+ // Validate coordinates are present
339
+ if (latitude === undefined || latitude === null || longitude === undefined || longitude === null) {
230
340
  return;
231
341
  }
232
342
  const body = {
@@ -236,11 +346,21 @@ export class TasVideocallComponent {
236
346
  latitude,
237
347
  longitude,
238
348
  };
239
- console.log('[TAS DEBUG] Reporting geo status to backend:', body);
240
- this.tasService.modifyProxyVideoUser(body).subscribe({
241
- next: () => console.log('[TAS DEBUG] Geo status reported successfully'),
242
- error: (err) => console.error('[TAS DEBUG] Error reporting geo status:', err),
243
- });
349
+ this.tasService.modifyProxyVideoUser(body).subscribe({});
350
+ }
351
+ /**
352
+ * Report denied geolocation to backend.
353
+ */
354
+ denyGeoLocation() {
355
+ if (!this.videoCallId) {
356
+ return;
357
+ }
358
+ const body = {
359
+ userId: this.userId,
360
+ videoCallId: this.videoCallId,
361
+ action: UserCallAction.DENY_GEOLOCATION,
362
+ };
363
+ this.tasService.modifyProxyVideoUser(body).subscribe({});
244
364
  }
245
365
  initializeCall() {
246
366
  if (this.isReturningFromPip) {
@@ -329,12 +449,12 @@ export class TasVideocallComponent {
329
449
  });
330
450
  }
331
451
  }
332
- TasVideocallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasVideocallComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }, { token: i3.GeolocationService }], target: i0.ɵɵFactoryTarget.Component });
333
- TasVideocallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasVideocallComponent, selector: "tas-videocall", inputs: { sessionId: "sessionId", token: "token", appointmentId: "appointmentId", videoCallId: "videoCallId", userId: "userId", participantName: "participantName", tenant: "tenant", businessRole: "businessRole", isReturningFromPip: "isReturningFromPip" }, viewQueries: [{ propertyName: "publisherContainer", first: true, predicate: ["publisherContainer"], descendants: true }, { propertyName: "subscriberContainer", first: true, predicate: ["subscriberContainer"], descendants: true }], ngImport: i0, template: "<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} est\u00E1 en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificaci\u00F3n\"\n >\n \u00D7\n </button>\n </div>\n </div>\n\n <!-- Location panel (shown for owners when user hasn't allowed location) -->\n <div class=\"location-panel\" *ngIf=\"showLocationPanel && canAdmitUsers\">\n <div class=\"location-header\">\n <i class=\"fa fa-map-marker header-icon\"></i>\n <h3>Ubicaci\u00F3n del colaborador</h3>\n <button class=\"close-btn\" (click)=\"closeLocationPanel()\" aria-label=\"Cerrar\">\u00D7</button>\n </div>\n <div class=\"location-description\">\n <p>El colaborador tiene la ubicaci\u00F3n desactivada, solicita que la active.</p>\n <p>Esta acci\u00F3n nos permitir\u00E1 disponibilizar algunas alertas.</p>\n </div>\n <div class=\"location-content\">\n <!-- Initial state: Show verify button -->\n <ng-container *ngIf=\"!geoRequestActive && !allGeoGranted\">\n <button class=\"verify-location-btn\" (click)=\"requestUserLocation()\">\n Verificar ubicaci\u00F3n\n </button>\n </ng-container>\n\n <!-- Loading state: Spinner while waiting for user response -->\n <ng-container *ngIf=\"geoRequestActive && !allGeoGranted\">\n <div class=\"geo-loading-container\">\n <div class=\"geo-spinner\"></div>\n <p class=\"loading-title\">Verificando ubicaci\u00F3n...</p>\n <p class=\"loading-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n <button class=\"verify-location-btn disabled\" disabled>\n Verificar ubicaci\u00F3n\n </button>\n </ng-container>\n\n <!-- Success state: Location verified -->\n <ng-container *ngIf=\"allGeoGranted\">\n <div class=\"geo-success-container\">\n <div class=\"success-icon\">\n <i class=\"fa fa-check\"></i>\n </div>\n <p class=\"success-title\">La ubicaci\u00F3n fue verificada</p>\n </div>\n </ng-container>\n </div>\n <div class=\"location-footer\">\n <span class=\"footer-icon\"><i class=\"fa fa-clock-o\"></i></span>\n <span class=\"footer-icon location-icon\"><i class=\"fa fa-map-marker\"></i></span>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;width:100vw;height:100vh;box-sizing:border-box;padding:2rem;background:linear-gradient(281deg,rgba(29,164,177,.2) 6.96%,rgba(0,0,0,0) 70.44%),#212532}.tas-videocall-wrapper{display:flex;flex:1;gap:1rem;height:100%}.tas-videocall-container{position:relative;flex:1;height:100%;overflow:hidden;border-radius:8px;border:1px solid var(--Neutral-GreyLight, #dadfe9);background:linear-gradient(180deg,#e5f1f7 0%,#0072ac 100%)}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#0000004d;overflow:hidden}.tas-videocall-container .avatar-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;display:flex;align-items:center;justify-content:center}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:12px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#33475bb3;padding:12px 20px;border-radius:30px;backdrop-filter:blur(8px)}.tas-videocall-container .controls-container .control-btn{width:44px;height:44px;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:18px;border:none;background:transparent;cursor:pointer;transition:all .2s ease}.tas-videocall-container .controls-container .control-btn i{color:#fff}.tas-videocall-container .controls-container .control-btn:hover{transform:scale(1.05);filter:brightness(1.1)}.tas-videocall-container .controls-container .control-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .controls-container .hangup-btn{background:#f44336}.tas-videocall-container .controls-container .hangup-btn i{transform:rotate(135deg)}.tas-videocall-container .controls-container .hangup-btn:hover{background:#d32f2f}.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{background:transparent}.tas-videocall-container .controls-container .swap-btn:hover,.tas-videocall-container .controls-container .pip-btn:hover,.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.15)}.tas-videocall-container .waiting-notification{position:absolute;bottom:100px;left:16px;display:flex;align-items:center;gap:12px;background-color:#33475be6;padding:10px 16px;border-radius:8px;z-index:4;backdrop-filter:blur(4px);max-width:calc(100% - 32px)}.tas-videocall-container .waiting-notification .waiting-text{color:#fff;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tas-videocall-container .waiting-notification .admit-btn{background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:4px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;white-space:nowrap}.tas-videocall-container .waiting-notification .admit-btn:hover{background:#178e99}.tas-videocall-container .waiting-notification .admit-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .waiting-notification .dismiss-btn{background:transparent;color:#fff;border:none;font-size:20px;line-height:1;cursor:pointer;padding:0 4px;opacity:.7;transition:opacity .2s ease}.tas-videocall-container .waiting-notification .dismiss-btn:hover{opacity:1}.tas-videocall-container .waiting-notification .dismiss-btn:focus{outline:2px solid #fff;outline-offset:2px}.location-panel{width:280px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.location-panel .location-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.location-panel .location-header h3{font-size:16px;font-weight:600;margin:0;color:#fff}.location-panel .location-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.location-panel .location-header .close-btn:hover{opacity:1}.location-panel .location-description{font-size:14px;color:#fffc;line-height:1.5;margin-bottom:.5rem}.location-panel .location-description p{margin:0 0 .5rem}.location-panel .location-content{flex:1;display:flex;flex-direction:column;justify-content:flex-end}.location-panel .verify-location-btn{width:100%;padding:12px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;margin-bottom:1rem}.location-panel .verify-location-btn:hover{background:#178e99}.location-panel .verify-location-btn:disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.location-panel .location-footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.1)}.location-panel .location-footer .footer-icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff;font-size:14px}.location-panel .location-footer .footer-icon.location-icon{background:var(--Primary-Uell, #1da4b1)}.location-panel .header-icon{color:#fff;font-size:16px}.location-panel .geo-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-loading-container .geo-spinner{width:64px;height:64px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite}.location-panel .geo-loading-container .loading-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 .25rem}.location-panel .geo-loading-container .loading-subtitle{color:#ffffffb3;font-size:14px;margin:0}.location-panel .geo-success-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-success-container .success-icon{width:80px;height:80px;border-radius:50%;background:var(--Primary-Uell, #1da4b1);display:flex;align-items:center;justify-content:center;position:relative}.location-panel .geo-success-container .success-icon i{color:#fff;font-size:32px}.location-panel .geo-success-container .success-icon:before,.location-panel .geo-success-container .success-icon:after{content:\"\\2726\";position:absolute;color:#fff;font-size:10px}.location-panel .geo-success-container .success-icon:before{top:-8px;right:-4px}.location-panel .geo-success-container .success-icon:after{bottom:-4px;left:-8px}.location-panel .geo-success-container .success-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 0}.location-panel .verify-location-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}@keyframes geo-spin{to{transform:rotate(360deg)}}\n"], components: [{ type: i4.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
452
+ TasVideocallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasVideocallComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }, { token: i3.GeolocationService }, { token: i4.DomSanitizer }, { token: i1.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
453
+ TasVideocallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasVideocallComponent, selector: "tas-videocall", inputs: { sessionId: "sessionId", token: "token", appointmentId: "appointmentId", videoCallId: "videoCallId", userId: "userId", participantName: "participantName", tenant: "tenant", businessRole: "businessRole", isReturningFromPip: "isReturningFromPip" }, viewQueries: [{ propertyName: "publisherContainer", first: true, predicate: ["publisherContainer"], descendants: true }, { propertyName: "subscriberContainer", first: true, predicate: ["subscriberContainer"], descendants: true }], ngImport: i0, template: "<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} est\u00E1 en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificaci\u00F3n\"\n >\n \u00D7\n </button>\n </div>\n </div>\n\n <!-- Owner geolocation panel (for owners to request user location) -->\n <div class=\"user-geo-panel\" *ngIf=\"shouldShowUserGeoPanel || devModeEnabled\">\n <div class=\"user-geo-header\">\n <div class=\"header-title-row\">\n <i class=\"fa fa-map-marker header-icon\" *ngIf=\"userGeoViewState !== UserGeoViewState.INITIAL\"></i>\n <h3>Ubicaci\u00F3n del colaborador</h3>\n </div>\n <button class=\"close-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\" aria-label=\"Cerrar\">\u00D7</button>\n </div>\n\n <div class=\"user-geo-description\" *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\">\n <p>El colaborador tiene la ubicaci\u00F3n desactivada, solicita que la active.</p>\n <p>Esta acci\u00F3n nos permitir\u00E1 disponibilizar algunas alertas.</p>\n </div>\n\n <div class=\"user-geo-content\">\n <!-- INITIAL state: just the button -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.INITIAL\">\n <!-- spacer -->\n </ng-container>\n\n <!-- VERIFYING state: spinner + loading message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFYING\">\n <div class=\"user-geo-verifying\">\n <div class=\"geo-spinner-large\"></div>\n <p class=\"verifying-title\">Verificando ubicaci\u00F3n...</p>\n <p class=\"verifying-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n </ng-container>\n\n <!-- VERIFIED state: home icon with sparkles -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFIED\">\n <div class=\"user-geo-verified\">\n <div class=\"verified-icon-container\">\n <span class=\"home-icon\" [innerHTML]=\"homeIcon\"></span>\n </div>\n <p class=\"verified-title\">La ubicaci\u00F3n fue verificada</p>\n </div>\n </ng-container>\n\n <!-- DENIED state: error icon and message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.DENIED\">\n <div class=\"user-geo-denied\">\n <div class=\"denied-icon-container\">\n <i class=\"fa fa-times-circle\"></i>\n </div>\n <p class=\"denied-title\">La ubicaci\u00F3n fue rechazada</p>\n <p class=\"denied-subtitle\">El colaborador no permiti\u00F3 el acceso a su ubicaci\u00F3n.</p>\n </div>\n </ng-container>\n </div>\n\n <!-- Button (hidden in verified and denied states) -->\n <button \n class=\"user-geo-btn\" \n *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\"\n [class.disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n [disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n (click)=\"requestUserLocation()\">\n Verificar ubicaci\u00F3n\n </button>\n\n <!-- Dev controls -->\n <div class=\"dev-controls\" *ngIf=\"devModeEnabled\">\n <span class=\"dev-label\">Dev:</span>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.INITIAL)\">Initial</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFYING)\">Verifying</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFIED)\">Verified</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.DENIED)\">Denied</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\">Hide</button>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";:host{display:flex;width:100vw;height:100vh;box-sizing:border-box;padding:2rem;background:linear-gradient(281deg,rgba(29,164,177,.2) 6.96%,rgba(0,0,0,0) 70.44%),#212532}.tas-videocall-wrapper{display:flex;flex:1;gap:1rem;height:100%}.tas-videocall-container{position:relative;flex:1;height:100%;overflow:hidden;border-radius:8px;border:1px solid var(--Neutral-GreyLight, #dadfe9);background:linear-gradient(180deg,#e5f1f7 0%,#0072ac 100%)}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#0000004d;overflow:hidden}.tas-videocall-container .avatar-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;display:flex;align-items:center;justify-content:center}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:12px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#33475bb3;padding:12px 20px;border-radius:30px;backdrop-filter:blur(8px)}.tas-videocall-container .controls-container .control-btn{width:44px;height:44px;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:18px;border:none;background:transparent;cursor:pointer;transition:all .2s ease}.tas-videocall-container .controls-container .control-btn i{color:#fff}.tas-videocall-container .controls-container .control-btn:hover{transform:scale(1.05);filter:brightness(1.1)}.tas-videocall-container .controls-container .control-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .controls-container .hangup-btn{background:#f44336}.tas-videocall-container .controls-container .hangup-btn i{transform:rotate(135deg)}.tas-videocall-container .controls-container .hangup-btn:hover{background:#d32f2f}.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{background:transparent}.tas-videocall-container .controls-container .swap-btn:hover,.tas-videocall-container .controls-container .pip-btn:hover,.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.15)}.tas-videocall-container .waiting-notification{position:absolute;bottom:100px;left:16px;display:flex;align-items:center;gap:12px;background-color:#33475be6;padding:10px 16px;border-radius:8px;z-index:4;backdrop-filter:blur(4px);max-width:calc(100% - 32px)}.tas-videocall-container .waiting-notification .waiting-text{color:#fff;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tas-videocall-container .waiting-notification .admit-btn{background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:4px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;white-space:nowrap}.tas-videocall-container .waiting-notification .admit-btn:hover{background:#178e99}.tas-videocall-container .waiting-notification .admit-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .waiting-notification .dismiss-btn{background:transparent;color:#fff;border:none;font-size:20px;line-height:1;cursor:pointer;padding:0 4px;opacity:.7;transition:opacity .2s ease}.tas-videocall-container .waiting-notification .dismiss-btn:hover{opacity:1}.tas-videocall-container .waiting-notification .dismiss-btn:focus{outline:2px solid #fff;outline-offset:2px}.location-panel{width:280px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.location-panel .location-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.location-panel .location-header h3{font-size:16px;font-weight:600;margin:0;color:#fff}.location-panel .location-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.location-panel .location-header .close-btn:hover{opacity:1}.location-panel .location-description{font-size:14px;color:#fffc;line-height:1.5;margin-bottom:.5rem}.location-panel .location-description p{margin:0 0 .5rem}.location-panel .location-user-list{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem;max-height:200px;overflow-y:auto}.location-panel .location-user-list .user-geo-item{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:rgba(255,255,255,.05);border-radius:6px}.location-panel .location-user-list .user-geo-item .user-icon{color:#fff9;font-size:14px}.location-panel .location-user-list .user-geo-item .user-name{flex:1;font-size:14px;color:#fff}.location-panel .location-user-list .user-geo-item .geo-status{display:flex;align-items:center;gap:.35rem;font-size:12px;padding:2px 8px;border-radius:12px}.location-panel .location-user-list .user-geo-item .geo-status.pending{color:#ffc107;background:rgba(255,193,7,.15)}.location-panel .location-user-list .user-geo-item .geo-status.granted{color:#4caf50;background:rgba(76,175,80,.15)}.location-panel .location-user-list .user-geo-item .geo-status.denied{color:#f44336;background:rgba(244,67,54,.15)}.location-panel .location-user-list .user-geo-item .geo-status i{font-size:10px}.location-panel .geo-denied-warning{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:rgba(244,67,54,.15);border-radius:6px;margin-bottom:1rem;color:#f44336;font-size:13px}.location-panel .geo-denied-warning i{font-size:14px}.location-panel .location-content{flex:1;display:flex;flex-direction:column;justify-content:flex-end}.location-panel .verify-location-btn{width:100%;padding:12px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;margin-bottom:1rem}.location-panel .verify-location-btn:hover{background:#178e99}.location-panel .verify-location-btn:disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.location-panel .location-footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.1)}.location-panel .location-footer .footer-icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff;font-size:14px}.location-panel .location-footer .footer-icon.location-icon{background:var(--Primary-Uell, #1da4b1)}.location-panel .header-icon{color:#fff;font-size:16px}.location-panel .geo-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-loading-container .geo-spinner{width:64px;height:64px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite}.location-panel .geo-loading-container .loading-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 .25rem}.location-panel .geo-loading-container .loading-subtitle{color:#ffffffb3;font-size:14px;margin:0}.location-panel .geo-success-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-success-container .success-icon{width:80px;height:80px;border-radius:50%;background:var(--Primary-Uell, #1da4b1);display:flex;align-items:center;justify-content:center;position:relative}.location-panel .geo-success-container .success-icon i{color:#fff;font-size:32px}.location-panel .geo-success-container .success-icon:before,.location-panel .geo-success-container .success-icon:after{content:\"\\2726\";position:absolute;color:#fff;font-size:10px}.location-panel .geo-success-container .success-icon:before{top:-8px;right:-4px}.location-panel .geo-success-container .success-icon:after{bottom:-4px;left:-8px}.location-panel .geo-success-container .success-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 0}.location-panel .verify-location-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}@keyframes geo-spin{to{transform:rotate(360deg)}}.user-geo-panel{width:360px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.user-geo-panel .user-geo-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:2.5rem;padding-top:2rem}.user-geo-panel .user-geo-header .header-title-row{display:flex;align-items:center;gap:.5rem}.user-geo-panel .user-geo-header .header-title-row .header-icon{font-size:16px;color:#fff}.user-geo-panel .user-geo-header .header-title-row h3{font-size:18px;font-weight:600;margin:0;color:#fff}.user-geo-panel .user-geo-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.user-geo-panel .user-geo-header .close-btn:hover{opacity:1}.user-geo-panel .user-geo-description{font-size:14px;color:#fffc;line-height:1.6;margin-bottom:1rem}.user-geo-panel .user-geo-description p{margin:0 0 .75rem}.user-geo-panel .user-geo-content{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.user-geo-panel .user-geo-verifying{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-verifying .geo-spinner-large{width:80px;height:80px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite;margin-bottom:1.5rem}.user-geo-panel .user-geo-verifying .verifying-title{color:#fff;font-size:16px;font-weight:600;margin:0 0 .25rem}.user-geo-panel .user-geo-verifying .verifying-subtitle{color:#fff9;font-size:14px;margin:0}.user-geo-panel .user-geo-verified{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-verified .verified-icon-container{margin-bottom:1rem}.user-geo-panel .user-geo-verified .verified-icon-container .home-icon{display:block}.user-geo-panel .user-geo-verified .verified-icon-container .home-icon svg{width:120px;height:100px}.user-geo-panel .user-geo-verified .verified-title{color:#fff;font-size:16px;font-weight:600;margin:0}.user-geo-panel .user-geo-denied{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-denied .denied-icon-container{width:100px;height:100px;border-radius:50%;background:rgba(244,67,54,.2);display:flex;align-items:center;justify-content:center;margin-bottom:1.5rem}.user-geo-panel .user-geo-denied .denied-icon-container i{font-size:48px;color:#f44336}.user-geo-panel .user-geo-denied .denied-title{color:#fff;font-size:16px;font-weight:600;margin:0 0 .5rem}.user-geo-panel .user-geo-denied .denied-subtitle{color:#fff9;font-size:14px;margin:0}.user-geo-panel .user-geo-btn{width:100%;padding:14px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:24px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;margin-top:auto;margin-bottom:1rem}.user-geo-panel .user-geo-btn:hover:not(.disabled){background:#178e99}.user-geo-panel .user-geo-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.user-geo-panel .dev-controls{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:rgba(0,0,0,.3);border-radius:6px;margin-bottom:1rem;flex-wrap:wrap}.user-geo-panel .dev-controls .dev-label{font-size:12px;color:#fff9;font-weight:600}.user-geo-panel .dev-controls .dev-btn{padding:4px 8px;font-size:11px;background:rgba(255,255,255,.1);color:#fff;border:1px solid rgba(255,255,255,.2);border-radius:4px;cursor:pointer;transition:all .2s ease}.user-geo-panel .dev-controls .dev-btn:hover{background:rgba(255,255,255,.2)}.user-geo-panel .user-geo-footer{display:flex;justify-content:center;gap:.75rem;padding-top:.5rem}.user-geo-panel .user-geo-footer .footer-icon{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff9;font-size:16px}.user-geo-panel .user-geo-footer .footer-icon.active{background:var(--Primary-Uell, #1da4b1);color:#fff}\n"], components: [{ type: i5.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
334
454
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasVideocallComponent, decorators: [{
335
455
  type: Component,
336
- args: [{ selector: 'tas-videocall', template: "<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} est\u00E1 en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificaci\u00F3n\"\n >\n \u00D7\n </button>\n </div>\n </div>\n\n <!-- Location panel (shown for owners when user hasn't allowed location) -->\n <div class=\"location-panel\" *ngIf=\"showLocationPanel && canAdmitUsers\">\n <div class=\"location-header\">\n <i class=\"fa fa-map-marker header-icon\"></i>\n <h3>Ubicaci\u00F3n del colaborador</h3>\n <button class=\"close-btn\" (click)=\"closeLocationPanel()\" aria-label=\"Cerrar\">\u00D7</button>\n </div>\n <div class=\"location-description\">\n <p>El colaborador tiene la ubicaci\u00F3n desactivada, solicita que la active.</p>\n <p>Esta acci\u00F3n nos permitir\u00E1 disponibilizar algunas alertas.</p>\n </div>\n <div class=\"location-content\">\n <!-- Initial state: Show verify button -->\n <ng-container *ngIf=\"!geoRequestActive && !allGeoGranted\">\n <button class=\"verify-location-btn\" (click)=\"requestUserLocation()\">\n Verificar ubicaci\u00F3n\n </button>\n </ng-container>\n\n <!-- Loading state: Spinner while waiting for user response -->\n <ng-container *ngIf=\"geoRequestActive && !allGeoGranted\">\n <div class=\"geo-loading-container\">\n <div class=\"geo-spinner\"></div>\n <p class=\"loading-title\">Verificando ubicaci\u00F3n...</p>\n <p class=\"loading-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n <button class=\"verify-location-btn disabled\" disabled>\n Verificar ubicaci\u00F3n\n </button>\n </ng-container>\n\n <!-- Success state: Location verified -->\n <ng-container *ngIf=\"allGeoGranted\">\n <div class=\"geo-success-container\">\n <div class=\"success-icon\">\n <i class=\"fa fa-check\"></i>\n </div>\n <p class=\"success-title\">La ubicaci\u00F3n fue verificada</p>\n </div>\n </ng-container>\n </div>\n <div class=\"location-footer\">\n <span class=\"footer-icon\"><i class=\"fa fa-clock-o\"></i></span>\n <span class=\"footer-icon location-icon\"><i class=\"fa fa-map-marker\"></i></span>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;width:100vw;height:100vh;box-sizing:border-box;padding:2rem;background:linear-gradient(281deg,rgba(29,164,177,.2) 6.96%,rgba(0,0,0,0) 70.44%),#212532}.tas-videocall-wrapper{display:flex;flex:1;gap:1rem;height:100%}.tas-videocall-container{position:relative;flex:1;height:100%;overflow:hidden;border-radius:8px;border:1px solid var(--Neutral-GreyLight, #dadfe9);background:linear-gradient(180deg,#e5f1f7 0%,#0072ac 100%)}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#0000004d;overflow:hidden}.tas-videocall-container .avatar-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;display:flex;align-items:center;justify-content:center}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:12px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#33475bb3;padding:12px 20px;border-radius:30px;backdrop-filter:blur(8px)}.tas-videocall-container .controls-container .control-btn{width:44px;height:44px;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:18px;border:none;background:transparent;cursor:pointer;transition:all .2s ease}.tas-videocall-container .controls-container .control-btn i{color:#fff}.tas-videocall-container .controls-container .control-btn:hover{transform:scale(1.05);filter:brightness(1.1)}.tas-videocall-container .controls-container .control-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .controls-container .hangup-btn{background:#f44336}.tas-videocall-container .controls-container .hangup-btn i{transform:rotate(135deg)}.tas-videocall-container .controls-container .hangup-btn:hover{background:#d32f2f}.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{background:transparent}.tas-videocall-container .controls-container .swap-btn:hover,.tas-videocall-container .controls-container .pip-btn:hover,.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.15)}.tas-videocall-container .waiting-notification{position:absolute;bottom:100px;left:16px;display:flex;align-items:center;gap:12px;background-color:#33475be6;padding:10px 16px;border-radius:8px;z-index:4;backdrop-filter:blur(4px);max-width:calc(100% - 32px)}.tas-videocall-container .waiting-notification .waiting-text{color:#fff;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tas-videocall-container .waiting-notification .admit-btn{background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:4px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;white-space:nowrap}.tas-videocall-container .waiting-notification .admit-btn:hover{background:#178e99}.tas-videocall-container .waiting-notification .admit-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .waiting-notification .dismiss-btn{background:transparent;color:#fff;border:none;font-size:20px;line-height:1;cursor:pointer;padding:0 4px;opacity:.7;transition:opacity .2s ease}.tas-videocall-container .waiting-notification .dismiss-btn:hover{opacity:1}.tas-videocall-container .waiting-notification .dismiss-btn:focus{outline:2px solid #fff;outline-offset:2px}.location-panel{width:280px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.location-panel .location-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.location-panel .location-header h3{font-size:16px;font-weight:600;margin:0;color:#fff}.location-panel .location-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.location-panel .location-header .close-btn:hover{opacity:1}.location-panel .location-description{font-size:14px;color:#fffc;line-height:1.5;margin-bottom:.5rem}.location-panel .location-description p{margin:0 0 .5rem}.location-panel .location-content{flex:1;display:flex;flex-direction:column;justify-content:flex-end}.location-panel .verify-location-btn{width:100%;padding:12px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;margin-bottom:1rem}.location-panel .verify-location-btn:hover{background:#178e99}.location-panel .verify-location-btn:disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.location-panel .location-footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.1)}.location-panel .location-footer .footer-icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff;font-size:14px}.location-panel .location-footer .footer-icon.location-icon{background:var(--Primary-Uell, #1da4b1)}.location-panel .header-icon{color:#fff;font-size:16px}.location-panel .geo-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-loading-container .geo-spinner{width:64px;height:64px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite}.location-panel .geo-loading-container .loading-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 .25rem}.location-panel .geo-loading-container .loading-subtitle{color:#ffffffb3;font-size:14px;margin:0}.location-panel .geo-success-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-success-container .success-icon{width:80px;height:80px;border-radius:50%;background:var(--Primary-Uell, #1da4b1);display:flex;align-items:center;justify-content:center;position:relative}.location-panel .geo-success-container .success-icon i{color:#fff;font-size:32px}.location-panel .geo-success-container .success-icon:before,.location-panel .geo-success-container .success-icon:after{content:\"\\2726\";position:absolute;color:#fff;font-size:10px}.location-panel .geo-success-container .success-icon:before{top:-8px;right:-4px}.location-panel .geo-success-container .success-icon:after{bottom:-4px;left:-8px}.location-panel .geo-success-container .success-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 0}.location-panel .verify-location-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}@keyframes geo-spin{to{transform:rotate(360deg)}}\n"] }]
337
- }], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }, { type: i3.GeolocationService }]; }, propDecorators: { sessionId: [{
456
+ args: [{ selector: 'tas-videocall', template: "<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} est\u00E1 en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificaci\u00F3n\"\n >\n \u00D7\n </button>\n </div>\n </div>\n\n <!-- Owner geolocation panel (for owners to request user location) -->\n <div class=\"user-geo-panel\" *ngIf=\"shouldShowUserGeoPanel || devModeEnabled\">\n <div class=\"user-geo-header\">\n <div class=\"header-title-row\">\n <i class=\"fa fa-map-marker header-icon\" *ngIf=\"userGeoViewState !== UserGeoViewState.INITIAL\"></i>\n <h3>Ubicaci\u00F3n del colaborador</h3>\n </div>\n <button class=\"close-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\" aria-label=\"Cerrar\">\u00D7</button>\n </div>\n\n <div class=\"user-geo-description\" *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\">\n <p>El colaborador tiene la ubicaci\u00F3n desactivada, solicita que la active.</p>\n <p>Esta acci\u00F3n nos permitir\u00E1 disponibilizar algunas alertas.</p>\n </div>\n\n <div class=\"user-geo-content\">\n <!-- INITIAL state: just the button -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.INITIAL\">\n <!-- spacer -->\n </ng-container>\n\n <!-- VERIFYING state: spinner + loading message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFYING\">\n <div class=\"user-geo-verifying\">\n <div class=\"geo-spinner-large\"></div>\n <p class=\"verifying-title\">Verificando ubicaci\u00F3n...</p>\n <p class=\"verifying-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n </ng-container>\n\n <!-- VERIFIED state: home icon with sparkles -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFIED\">\n <div class=\"user-geo-verified\">\n <div class=\"verified-icon-container\">\n <span class=\"home-icon\" [innerHTML]=\"homeIcon\"></span>\n </div>\n <p class=\"verified-title\">La ubicaci\u00F3n fue verificada</p>\n </div>\n </ng-container>\n\n <!-- DENIED state: error icon and message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.DENIED\">\n <div class=\"user-geo-denied\">\n <div class=\"denied-icon-container\">\n <i class=\"fa fa-times-circle\"></i>\n </div>\n <p class=\"denied-title\">La ubicaci\u00F3n fue rechazada</p>\n <p class=\"denied-subtitle\">El colaborador no permiti\u00F3 el acceso a su ubicaci\u00F3n.</p>\n </div>\n </ng-container>\n </div>\n\n <!-- Button (hidden in verified and denied states) -->\n <button \n class=\"user-geo-btn\" \n *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\"\n [class.disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n [disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n (click)=\"requestUserLocation()\">\n Verificar ubicaci\u00F3n\n </button>\n\n <!-- Dev controls -->\n <div class=\"dev-controls\" *ngIf=\"devModeEnabled\">\n <span class=\"dev-label\">Dev:</span>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.INITIAL)\">Initial</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFYING)\">Verifying</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFIED)\">Verified</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.DENIED)\">Denied</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\">Hide</button>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";:host{display:flex;width:100vw;height:100vh;box-sizing:border-box;padding:2rem;background:linear-gradient(281deg,rgba(29,164,177,.2) 6.96%,rgba(0,0,0,0) 70.44%),#212532}.tas-videocall-wrapper{display:flex;flex:1;gap:1rem;height:100%}.tas-videocall-container{position:relative;flex:1;height:100%;overflow:hidden;border-radius:8px;border:1px solid var(--Neutral-GreyLight, #dadfe9);background:linear-gradient(180deg,#e5f1f7 0%,#0072ac 100%)}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#0000004d;overflow:hidden}.tas-videocall-container .avatar-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;display:flex;align-items:center;justify-content:center}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:12px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#33475bb3;padding:12px 20px;border-radius:30px;backdrop-filter:blur(8px)}.tas-videocall-container .controls-container .control-btn{width:44px;height:44px;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:18px;border:none;background:transparent;cursor:pointer;transition:all .2s ease}.tas-videocall-container .controls-container .control-btn i{color:#fff}.tas-videocall-container .controls-container .control-btn:hover{transform:scale(1.05);filter:brightness(1.1)}.tas-videocall-container .controls-container .control-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .controls-container .hangup-btn{background:#f44336}.tas-videocall-container .controls-container .hangup-btn i{transform:rotate(135deg)}.tas-videocall-container .controls-container .hangup-btn:hover{background:#d32f2f}.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{background:transparent}.tas-videocall-container .controls-container .swap-btn:hover,.tas-videocall-container .controls-container .pip-btn:hover,.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.15)}.tas-videocall-container .waiting-notification{position:absolute;bottom:100px;left:16px;display:flex;align-items:center;gap:12px;background-color:#33475be6;padding:10px 16px;border-radius:8px;z-index:4;backdrop-filter:blur(4px);max-width:calc(100% - 32px)}.tas-videocall-container .waiting-notification .waiting-text{color:#fff;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tas-videocall-container .waiting-notification .admit-btn{background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:4px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;white-space:nowrap}.tas-videocall-container .waiting-notification .admit-btn:hover{background:#178e99}.tas-videocall-container .waiting-notification .admit-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .waiting-notification .dismiss-btn{background:transparent;color:#fff;border:none;font-size:20px;line-height:1;cursor:pointer;padding:0 4px;opacity:.7;transition:opacity .2s ease}.tas-videocall-container .waiting-notification .dismiss-btn:hover{opacity:1}.tas-videocall-container .waiting-notification .dismiss-btn:focus{outline:2px solid #fff;outline-offset:2px}.location-panel{width:280px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.location-panel .location-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.location-panel .location-header h3{font-size:16px;font-weight:600;margin:0;color:#fff}.location-panel .location-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.location-panel .location-header .close-btn:hover{opacity:1}.location-panel .location-description{font-size:14px;color:#fffc;line-height:1.5;margin-bottom:.5rem}.location-panel .location-description p{margin:0 0 .5rem}.location-panel .location-user-list{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem;max-height:200px;overflow-y:auto}.location-panel .location-user-list .user-geo-item{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:rgba(255,255,255,.05);border-radius:6px}.location-panel .location-user-list .user-geo-item .user-icon{color:#fff9;font-size:14px}.location-panel .location-user-list .user-geo-item .user-name{flex:1;font-size:14px;color:#fff}.location-panel .location-user-list .user-geo-item .geo-status{display:flex;align-items:center;gap:.35rem;font-size:12px;padding:2px 8px;border-radius:12px}.location-panel .location-user-list .user-geo-item .geo-status.pending{color:#ffc107;background:rgba(255,193,7,.15)}.location-panel .location-user-list .user-geo-item .geo-status.granted{color:#4caf50;background:rgba(76,175,80,.15)}.location-panel .location-user-list .user-geo-item .geo-status.denied{color:#f44336;background:rgba(244,67,54,.15)}.location-panel .location-user-list .user-geo-item .geo-status i{font-size:10px}.location-panel .geo-denied-warning{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:rgba(244,67,54,.15);border-radius:6px;margin-bottom:1rem;color:#f44336;font-size:13px}.location-panel .geo-denied-warning i{font-size:14px}.location-panel .location-content{flex:1;display:flex;flex-direction:column;justify-content:flex-end}.location-panel .verify-location-btn{width:100%;padding:12px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;margin-bottom:1rem}.location-panel .verify-location-btn:hover{background:#178e99}.location-panel .verify-location-btn:disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.location-panel .location-footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.1)}.location-panel .location-footer .footer-icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff;font-size:14px}.location-panel .location-footer .footer-icon.location-icon{background:var(--Primary-Uell, #1da4b1)}.location-panel .header-icon{color:#fff;font-size:16px}.location-panel .geo-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-loading-container .geo-spinner{width:64px;height:64px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite}.location-panel .geo-loading-container .loading-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 .25rem}.location-panel .geo-loading-container .loading-subtitle{color:#ffffffb3;font-size:14px;margin:0}.location-panel .geo-success-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-success-container .success-icon{width:80px;height:80px;border-radius:50%;background:var(--Primary-Uell, #1da4b1);display:flex;align-items:center;justify-content:center;position:relative}.location-panel .geo-success-container .success-icon i{color:#fff;font-size:32px}.location-panel .geo-success-container .success-icon:before,.location-panel .geo-success-container .success-icon:after{content:\"\\2726\";position:absolute;color:#fff;font-size:10px}.location-panel .geo-success-container .success-icon:before{top:-8px;right:-4px}.location-panel .geo-success-container .success-icon:after{bottom:-4px;left:-8px}.location-panel .geo-success-container .success-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 0}.location-panel .verify-location-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}@keyframes geo-spin{to{transform:rotate(360deg)}}.user-geo-panel{width:360px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.user-geo-panel .user-geo-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:2.5rem;padding-top:2rem}.user-geo-panel .user-geo-header .header-title-row{display:flex;align-items:center;gap:.5rem}.user-geo-panel .user-geo-header .header-title-row .header-icon{font-size:16px;color:#fff}.user-geo-panel .user-geo-header .header-title-row h3{font-size:18px;font-weight:600;margin:0;color:#fff}.user-geo-panel .user-geo-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.user-geo-panel .user-geo-header .close-btn:hover{opacity:1}.user-geo-panel .user-geo-description{font-size:14px;color:#fffc;line-height:1.6;margin-bottom:1rem}.user-geo-panel .user-geo-description p{margin:0 0 .75rem}.user-geo-panel .user-geo-content{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.user-geo-panel .user-geo-verifying{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-verifying .geo-spinner-large{width:80px;height:80px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite;margin-bottom:1.5rem}.user-geo-panel .user-geo-verifying .verifying-title{color:#fff;font-size:16px;font-weight:600;margin:0 0 .25rem}.user-geo-panel .user-geo-verifying .verifying-subtitle{color:#fff9;font-size:14px;margin:0}.user-geo-panel .user-geo-verified{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-verified .verified-icon-container{margin-bottom:1rem}.user-geo-panel .user-geo-verified .verified-icon-container .home-icon{display:block}.user-geo-panel .user-geo-verified .verified-icon-container .home-icon svg{width:120px;height:100px}.user-geo-panel .user-geo-verified .verified-title{color:#fff;font-size:16px;font-weight:600;margin:0}.user-geo-panel .user-geo-denied{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-denied .denied-icon-container{width:100px;height:100px;border-radius:50%;background:rgba(244,67,54,.2);display:flex;align-items:center;justify-content:center;margin-bottom:1.5rem}.user-geo-panel .user-geo-denied .denied-icon-container i{font-size:48px;color:#f44336}.user-geo-panel .user-geo-denied .denied-title{color:#fff;font-size:16px;font-weight:600;margin:0 0 .5rem}.user-geo-panel .user-geo-denied .denied-subtitle{color:#fff9;font-size:14px;margin:0}.user-geo-panel .user-geo-btn{width:100%;padding:14px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:24px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;margin-top:auto;margin-bottom:1rem}.user-geo-panel .user-geo-btn:hover:not(.disabled){background:#178e99}.user-geo-panel .user-geo-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.user-geo-panel .dev-controls{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:rgba(0,0,0,.3);border-radius:6px;margin-bottom:1rem;flex-wrap:wrap}.user-geo-panel .dev-controls .dev-label{font-size:12px;color:#fff9;font-weight:600}.user-geo-panel .dev-controls .dev-btn{padding:4px 8px;font-size:11px;background:rgba(255,255,255,.1);color:#fff;border:1px solid rgba(255,255,255,.2);border-radius:4px;cursor:pointer;transition:all .2s ease}.user-geo-panel .dev-controls .dev-btn:hover{background:rgba(255,255,255,.2)}.user-geo-panel .user-geo-footer{display:flex;justify-content:center;gap:.75rem;padding-top:.5rem}.user-geo-panel .user-geo-footer .footer-icon{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff9;font-size:16px}.user-geo-panel .user-geo-footer .footer-icon.active{background:var(--Primary-Uell, #1da4b1);color:#fff}\n"] }]
457
+ }], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }, { type: i3.GeolocationService }, { type: i4.DomSanitizer }, { type: i1.NgbModal }]; }, propDecorators: { sessionId: [{
338
458
  type: Input
339
459
  }], token: [{
340
460
  type: Input
@@ -359,4 +479,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
359
479
  type: ViewChild,
360
480
  args: ['subscriberContainer']
361
481
  }] } });
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXZpZGVvY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULEtBQUssRUFDTCxTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUdmLGNBQWMsR0FFZixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDOzs7Ozs7O0FBT2xDLE1BQU0sT0FBTyxxQkFBcUI7SUErQmhDLFlBQ1MsV0FBMkIsRUFDMUIsVUFBc0IsRUFDdEIsa0JBQXNDO1FBRnZDLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUE1QnZDLG9CQUFlLEdBQVcsRUFBRSxDQUFDO1FBQzdCLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDcEIsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQUNyRCx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFLdEMscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQzNCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIscUJBQWdCLEdBQXNCLEVB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QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFMkIsa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQjtnQkFDRyxtQkFBbUI7c0JBQXBELFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQgeyBHZW9sb2NhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9nZW9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENhbGxTdGF0ZSxcbiAgVmlld01vZGUsXG4gIFRhc0J1c2luZXNzUm9sZSxcbiAgV2FpdGluZ1Jvb21Vc2VyLFxuICBSb29tVXNlclN0YXR1cyxcbiAgVXNlckNhbGxBY3Rpb24sXG4gIFByb3h5VmlkZW9Vc2VyTW9kaWZ5UmVxdWVzdCxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCBpbnRlcmFjdCBmcm9tICdpbnRlcmFjdGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLXZpZGVvY2FsbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXMtdmlkZW9jYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNWaWRlb2NhbGxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIHNlc3Npb25JZCE6IHN0cmluZztcbiAgQElucHV0KCkgdG9rZW4hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwcG9pbnRtZW50SWQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHZpZGVvQ2FsbElkPzogbnVtYmVyO1xuICBASW5wdXQoKSB1c2VySWQ/OiBudW1iZXI7IC8vIEN1cnJlbnQgdXNlcidzIElEIGZvciBnZW8gcmVwb3J0aW5nXG4gIEBJbnB1dCgpIHBhcnRpY2lwYW50TmFtZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRlbmFudDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVI7XG4gIEBJbnB1dCgpIGlzUmV0dXJuaW5nRnJvbVBpcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3B1Ymxpc2hlckNvbnRhaW5lcicpIHB1Ymxpc2hlckNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3N1YnNjcmliZXJDb250YWluZXInKSBzdWJzY3JpYmVyQ29udGFpbmVyITogRWxlbWVudFJlZjtcblxuICBwdWJsaWMgaXNQdWJsaXNoZXJTbWFsbCA9IHRydWU7XG4gIHB1YmxpYyBjYWxsU3RhdGUgPSBDYWxsU3RhdGUuSURMRTtcbiAgcHVibGljIGlzTXV0ZWQgPSBmYWxzZTtcbiAgcHVibGljIHdhaXRpbmdSb29tVXNlcnM6IFdhaXRpbmdSb29tVXNlcltdID0gW107XG4gIHB1YmxpYyBvd25lckhhc0pvaW5lZCA9IGZhbHNlO1xuICBwdWJsaWMgaGFzVmlkZW9TdHJlYW0gPSBmYWxzZTtcbiAgcHVibGljIGRpc21pc3NlZFVzZXJzOiBudW1iZXJbXSA9IFtdO1xuICBwdWJsaWMgc2hvd0xvY2F0aW9uUGFuZWwgPSB0cnVlOyAvLyBTaG93IGJ5IGRlZmF1bHQgZm9yIG93bmVycywgd2lsbCBiZSB1cGRhdGVkIGJhc2VkIG9uIHVzZXIncyBsb2NhdGlvbiBzdGF0dXNcbiAgcHVibGljIHVzZXJIYXNMb2NhdGlvbiA9IGZhbHNlOyAvLyBUcmFja3MgaWYgdGhlIHVzZXIgaGFzIHNoYXJlZCB0aGVpciBsb2NhdGlvblxuICBwdWJsaWMgZ2VvTG9jYXRpb25TdGF0dXM6ICd1bmtub3duJyB8ICdhY3RpdmUnIHwgJ2RlbmllZCcgPSAndW5rbm93bic7XG4gIFxuICAvLyBHZW8gcGFuZWwgc3RhdGVzIGZvciBvd25lclxuICBwdWJsaWMgZ2VvUmVxdWVzdEFjdGl2ZSA9IGZhbHNlOyAvLyBPd25lciBzZW50IHJlcXVlc3QsIHdhaXRpbmcgZm9yIHVzZXJcbiAgcHVibGljIGFsbEdlb0dyYW50ZWQgPSBmYWxzZTsgLy8gQWxsIHVzZXJzIHJlc3BvbmRlZCB3aXRoIGdlb1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgdGFzU2VydmljZTogVGFzU2VydmljZSxcbiAgICBwcml2YXRlIGdlb2xvY2F0aW9uU2VydmljZTogR2VvbG9jYXRpb25TZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHVwU3Vic2NyaXB0aW9ucygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNhbGwoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRJbnRlcmFjdCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy50YXNTZXJ2aWNlLnJlc2V0UG9sbGluZ1N0YXRlKCk7XG5cbiAgICAvLyBPbmx5IGRpc2Nvbm5lY3QgaWYgbm90IGluIFBpUCBtb2RlIChrZWVwIHNlc3Npb24gYWxpdmUgZm9yIGZsb2F0aW5nIHdpbmRvdylcbiAgICBpZiAoIXRoaXMudGFzU2VydmljZS5pc1BpcE1vZGUoKSkge1xuICAgICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgaW50ZXJhY3QoJy5wdWJsaXNoZXItdmlldycpLnVuc2V0KCk7XG4gIH1cblxuICAvLyBQdWJsaWMgTWV0aG9kc1xuICBoYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gIH1cblxuICB0b2dnbGVNdXRlKCk6IHZvaWQge1xuICAgIHRoaXMudGFzU2VydmljZS50b2dnbGVNdXRlKCk7XG4gIH1cblxuICBtaW5pbWl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhc1NlcnZpY2UubW92ZU1haW5WaWRlb1RvKCdwaXAtbWFpbi12aWRlbycpO1xuICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSB2aWRlbyBpcyBtb3ZlZCBiZWZvcmUgY2xvc2luZyBtb2RhbFxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50YXNTZXJ2aWNlLmVudGVyUGlwTW9kZSgpLCA1MCk7XG4gIH1cblxuICB0b2dnbGVTd2FwKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQdWJsaXNoZXJTbWFsbCA9ICF0aGlzLmlzUHVibGlzaGVyU21hbGw7XG4gICAgdGhpcy5yZXNldFZpZGVvUG9zaXRpb25zKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXRJbnRlcmFjdCgpKTtcbiAgfVxuXG4gIG9uRG91YmxlQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVTd2FwKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCB1c2VyIGNhbiBhZG1pdCBvdGhlcnMgKE9XTkVSLCBCQUNLT0ZGSUNFLCBvciBNT0RFUkFUT1IpXG4gICAqL1xuICBnZXQgY2FuQWRtaXRVc2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5CQUNLT0ZGSUNFIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkFETUlOX01BTkFHRVIgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuTUFOQUdFUlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRtaXQgYSB1c2VyIGZyb20gdGhlIHdhaXRpbmcgcm9vbVxuICAgKi9cbiAgYWRtaXRVc2VyKHVzZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgYWRtaXQgdXNlcjogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgLm1vZGlmeVByb3h5VmlkZW9Vc2VyKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgICAgYWN0aW9uOiBVc2VyQ2FsbEFjdGlvbi5XQUlUSU5HX1JPT01fTEVBVkUsXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvLyBSZW1vdmUgdXNlciBmcm9tIHdhaXRpbmcgbGlzdCBhZnRlciBzdWNjZXNzZnVsIGFkbWl0XG4gICAgICAgICAgdGhpcy53YWl0aW5nUm9vbVVzZXJzID0gdGhpcy53YWl0aW5nUm9vbVVzZXJzLmZpbHRlcihcbiAgICAgICAgICAgICh1KSA9PiB1LnVzZXJJZCAhPT0gdXNlcklkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZG1pdHRpbmcgdXNlcjonLCBlcnIpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzcyB0aGUgd2FpdGluZyByb29tIG5vdGlmaWNhdGlvbiBmb3IgYSB1c2VyXG4gICAqL1xuICBkaXNtaXNzV2FpdGluZ05vdGlmaWNhdGlvbih1c2VySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkVXNlcnMucHVzaCh1c2VySWQpO1xuICAgIHRoaXMud2FpdGluZ1Jvb21Vc2VycyA9IHRoaXMud2FpdGluZ1Jvb21Vc2Vycy5maWx0ZXIoXG4gICAgICAodSkgPT4gdS51c2VySWQgIT09IHVzZXJJZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGxvY2F0aW9uIHBhbmVsXG4gICAqL1xuICBjbG9zZUxvY2F0aW9uUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TG9jYXRpb25QYW5lbCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHVzZXIgdG8gc2hhcmUgdGhlaXIgbG9jYXRpb25cbiAgICovXG4gIHJlcXVlc3RVc2VyTG9jYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcmVxdWVzdCBsb2NhdGlvbjogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBib2R5OiBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QgPSB7XG4gICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgIGFjdGlvbjogVXNlckNhbGxBY3Rpb24uUkVRVUVTVF9HRU9MT0NBTElaQVRJT04sXG4gICAgfTtcblxuICAgIC8vIFRPRE86IFNlbmQgbG9jYXRpb24gcmVxdWVzdCBhY3Rpb24gdG8gYmFja2VuZCB3aGVuIGVuZHBvaW50IGlzIHJlYWR5XG4gICAgdGhpcy50YXNTZXJ2aWNlLm1vZGlmeVByb3h5VmlkZW9Vc2VyKGJvZHkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiBjb25zb2xlLmxvZygnTG9jYXRpb24gcmVxdWVzdCBzZW50JyksXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignRXJyb3IgcmVxdWVzdGluZyBsb2NhdGlvbjonLCBlcnIpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gIHByaXZhdGUgc2V0dXBTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENhbGwgc3RhdGUgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5jYWxsU3RhdGUkLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSBDYWxsU3RhdGUuRElTQ09OTkVDVEVEKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnaGFuZ3VwJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgaWYgd2UgaGF2ZSBhbiBhY3RpdmUgdmlkZW8gc3RyZWFtXG4gICAgICAgIHRoaXMuaGFzVmlkZW9TdHJlYW0gPSBzdGF0ZSA9PT0gQ2FsbFN0YXRlLkNPTk5FQ1RFRDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFZpZXcgbW9kZSBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLnZpZXdNb2RlJC5zdWJzY3JpYmUoKG1vZGUpID0+IHtcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3BpcCcpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBNdXRlIHN0YXRlIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2UuaXNNdXRlZCQuc3Vic2NyaWJlKChtdXRlZCkgPT4ge1xuICAgICAgICB0aGlzLmlzTXV0ZWQgPSBtdXRlZDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFdhaXRpbmcgcm9vbSB1c2VycyBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLndhaXRpbmdSb29tVXNlcnMkLnN1YnNjcmliZSgodXNlcnMpID0+IHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBkaXNtaXNzZWQgdXNlcnNcbiAgICAgICAgdGhpcy53YWl0aW5nUm9vbVVzZXJzID0gdXNlcnMuZmlsdGVyKFxuICAgICAgICAgICh1KSA9PiAhdGhpcy5kaXNtaXNzZWRVc2Vycy5pbmNsdWRlcyh1LnVzZXJJZClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIE93bmVyIGpvaW4gc3RhdHVzIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uub3duZXJIYXNKb2luZWQkLnN1YnNjcmliZSgoam9pbmVkKSA9PiB7XG4gICAgICAgIHRoaXMub3duZXJIYXNKb2luZWQgPSBqb2luZWQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBPd25lciBsZWZ0IHN1YnNjcmlwdGlvbiAtIGRpc2Nvbm5lY3Qgbm9uLW93bmVyc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uub3duZXJIYXNMZWZ0JC5zdWJzY3JpYmUoKGhhc0xlZnQpID0+IHtcbiAgICAgICAgaWYgKGhhc0xlZnQgJiYgIXRoaXMuY2FuQWRtaXRVc2VycykgeyAvLyBOb24tb3duZXIgdXNlclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBPd25lciBsZWZ0LCBkaXNjb25uZWN0aW5nIHVzZXInKTtcbiAgICAgICAgICB0aGlzLmhhbmdVcCgpO1xuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ293bmVyX2xlZnQnKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gQWN0aXZhdGVHZW8gc3Vic2NyaXB0aW9uIC0gb25seSBmb3Igbm9uLW93bmVycyAodXNlcnMpXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5hY3RpdmF0ZUdlbyQuc3Vic2NyaWJlKChhY3RpdmF0ZUdlbykgPT4ge1xuICAgICAgICBpZiAoYWN0aXZhdGVHZW8gJiYgIXRoaXMuY2FuQWRtaXRVc2Vycykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBhY3RpdmF0ZUdlbz10cnVlLCBjaGVja2luZyBnZW8gc3RhdHVzIGZvciB1c2VyLi4uJyk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVBY3RpdmF0ZUdlbygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBHZW9SZXF1ZXN0QWN0aXZlIHN1YnNjcmlwdGlvbiAtIGZvciBvd25lcnNcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmdlb1JlcXVlc3RBY3RpdmUkLnN1YnNjcmliZSgoYWN0aXZlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBnZW9SZXF1ZXN0QWN0aXZlIGNoYW5nZWQ6JywgYWN0aXZlKTtcbiAgICAgICAgdGhpcy5nZW9SZXF1ZXN0QWN0aXZlID0gYWN0aXZlO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gQWxsR2VvR3JhbnRlZCBzdWJzY3JpcHRpb24gLSBmb3Igb3duZXJzXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5hbGxHZW9HcmFudGVkJC5zdWJzY3JpYmUoKGdyYW50ZWQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGFsbEdlb0dyYW50ZWQgY2hhbmdlZDonLCBncmFudGVkKTtcbiAgICAgICAgdGhpcy5hbGxHZW9HcmFudGVkID0gZ3JhbnRlZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYWN0aXZhdGVHZW8gcmVxdWVzdCBmcm9tIGJhY2tlbmQgKGZvciBub24tb3duZXIgdXNlcnMpLlxuICAgKiBJZiBnZW8gaXMgYWxyZWFkeSBhY3RpdmUsIHJlcG9ydCBpdC4gSWYgbm90LCBwcm9tcHQgdXNlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQWN0aXZhdGVHZW8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGhhbmRsZUFjdGl2YXRlR2VvIC0gY3VycmVudCBzdGF0dXM6JywgdGhpcy5nZW9Mb2NhdGlvblN0YXR1cyk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBjYWNoZWQgcG9zaXRpb25cbiAgICBjb25zdCBjYWNoZWRQb3NpdGlvbiA9IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldENhY2hlZFBvc2l0aW9uKCk7XG4gICAgaWYgKGNhY2hlZFBvc2l0aW9uKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gR2VvbG9jYXRpb24gYWxyZWFkeSBhY3RpdmUsIHJlcG9ydGluZyB0byBiYWNrZW5kOicsIGNhY2hlZFBvc2l0aW9uKTtcbiAgICAgIHRoaXMuZ2VvTG9jYXRpb25TdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgIHRoaXMucmVwb3J0R2VvU3RhdHVzKGNhY2hlZFBvc2l0aW9uLmxhdGl0dWRlLCBjYWNoZWRQb3NpdGlvbi5sb25naXR1ZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBnZXQgcG9zaXRpb25cbiAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gUmVxdWVzdGluZyBnZW9sb2NhdGlvbiBmcm9tIHVzZXIuLi4nKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGF3YWl0IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIFxuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIEdlb2xvY2F0aW9uIG9idGFpbmVkOicsIHBvc2l0aW9uKTtcbiAgICAgIHRoaXMuZ2VvTG9jYXRpb25TdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgIHRoaXMucmVwb3J0R2VvU3RhdHVzKHBvc2l0aW9uLmxhdGl0dWRlLCBwb3NpdGlvbi5sb25naXR1ZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gR2VvbG9jYXRpb24gZGVuaWVkIG9yIHVuYXZhaWxhYmxlJyk7XG4gICAgICB0aGlzLmdlb0xvY2F0aW9uU3RhdHVzID0gJ2RlbmllZCc7XG4gICAgICAvLyBSZXBvcnQgdGhhdCBnZW8gaXMgbm90IGF2YWlsYWJsZSAod2l0aCBubyBjb29yZGluYXRlcylcbiAgICAgIHRoaXMucmVwb3J0R2VvU3RhdHVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBnZW9sb2NhdGlvbiBzdGF0dXMgdG8gYmFja2VuZC5cbiAgICovXG4gIHByaXZhdGUgcmVwb3J0R2VvU3RhdHVzKGxhdGl0dWRlPzogbnVtYmVyLCBsb25naXR1ZGU/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlkZW9DYWxsSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIENhbm5vdCByZXBvcnQgZ2VvIHN0YXR1czogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRPRE86IElmIHRoZSBwZXJtaXNzaW9uIGZvciBnZW8gbG9jYXRpb24gaXMgbm90IGdyYW50ZWQsIHdlIHNob3VsZCBub3QgcmVwb3J0IGl0IHRvIHRoZSBiYWNrZW5kXG4gICAgaWYgKCF0aGlzLmdlb0xvY2F0aW9uU3RhdHVzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBDYW5ub3QgcmVwb3J0IGdlbyBzdGF0dXM6IGdlb0xvY2F0aW9uU3RhdHVzIG5vdCBzZXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5OiBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QgPSB7XG4gICAgICB1c2VySWQ6IHRoaXMudXNlcklkLFxuICAgICAgdmlkZW9DYWxsSWQ6IHRoaXMudmlkZW9DYWxsSWQsXG4gICAgICBhY3Rpb246IFVzZXJDYWxsQWN0aW9uLkFDVElWQVRFX0dFT0xPQ0FUSU9OLFxuICAgICAgbGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGUsXG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBSZXBvcnRpbmcgZ2VvIHN0YXR1cyB0byBiYWNrZW5kOicsIGJvZHkpO1xuICAgIHRoaXMudGFzU2VydmljZS5tb2RpZnlQcm94eVZpZGVvVXNlcihib2R5KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gY29uc29sZS5sb2coJ1tUQVMgREVCVUddIEdlbyBzdGF0dXMgcmVwb3J0ZWQgc3VjY2Vzc2Z1bGx5JyksXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gRXJyb3IgcmVwb3J0aW5nIGdlbyBzdGF0dXM6JywgZXJyKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNhbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZXR1cm5pbmdGcm9tUGlwKSB7XG4gICAgICAvLyBSZXR1cm5pbmcgZnJvbSBQaVAgLSBqdXN0IG1vdmUgdmlkZW9zIGJhY2tcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50YXNTZXJ2aWNlLm1vdmVWaWRlb3NUb0Z1bGxzY3JlZW4oKSwgMTAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2Vzc2lvbklkICYmIHRoaXMudG9rZW4pIHtcbiAgICAgIC8vIE5ldyBjYWxsIC0gY29ubmVjdCB0byBzZXNzaW9uXG4gICAgICB0aGlzLnRhc1NlcnZpY2VcbiAgICAgICAgLmNvbm5lY3RTZXNzaW9uKFxuICAgICAgICAgIHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHRoaXMudG9rZW4sXG4gICAgICAgICAgJ3B1Ymxpc2hlci1jb250YWluZXInLFxuICAgICAgICAgICdzdWJzY3JpYmVyLWNvbnRhaW5lcicsXG4gICAgICAgICAgdGhpcy5idXNpbmVzc1JvbGVcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbm5lY3RpbmcgdG8gdmlkZW8gY2FsbDonLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gU3RhcnQgc3RhdHVzIHBvbGxpbmcgd2l0aCBzaG9ydGVyIGludGVydmFsICg1cykgdG8gZGV0ZWN0IG93bmVyIGxlYXZpbmcvbG9jYXRpb24gcmVxdWVzdHNcbiAgICAgIGlmICh0aGlzLmFwcG9pbnRtZW50SWQpIHtcbiAgICAgICAgdGhpcy50YXNTZXJ2aWNlLnN0YXJ0U3RhdHVzUG9sbGluZyh7XG4gICAgICAgICAgYXBwb2ludG1lbnRJZDogdGhpcy5hcHBvaW50bWVudElkLFxuICAgICAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICAgICAgYnVzaW5lc3NSb2xlOiB0aGlzLmJ1c2luZXNzUm9sZSxcbiAgICAgICAgICByb29tVHlwZTogdW5kZWZpbmVkLCAvLyBSb29tVHlwZSBtaWdodCBiZSBuZWVkZWQgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgZW50aXR5SWQ6IHVuZGVmaW5lZCwgLy8gRW50aXR5SWQgbWlnaHQgYmUgbmVlZGVkIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWRcbiAgICAgICAgfSwgNTAwMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldFZpZGVvUG9zaXRpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IHB1Ymxpc2hlckVsID0gdGhpcy5wdWJsaXNoZXJDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgc3Vic2NyaWJlckVsID0gdGhpcy5zdWJzY3JpYmVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKHB1Ymxpc2hlckVsKSB7XG4gICAgICBwdWJsaXNoZXJFbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICBwdWJsaXNoZXJFbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEteCcpO1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXknKTtcbiAgICB9XG5cbiAgICBpZiAoc3Vic2NyaWJlckVsKSB7XG4gICAgICBzdWJzY3JpYmVyRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgc3Vic2NyaWJlckVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS14Jyk7XG4gICAgICBzdWJzY3JpYmVyRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXknKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRJbnRlcmFjdCgpOiB2b2lkIHtcbiAgICBpbnRlcmFjdCgnLnB1Ymxpc2hlci12aWV3JykudW5zZXQoKTtcblxuICAgIGludGVyYWN0KCcucHVibGlzaGVyLXZpZXcnKVxuICAgICAgLmRyYWdnYWJsZSh7XG4gICAgICAgIGluZXJ0aWE6IHRydWUsXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdFJlY3Qoe1xuICAgICAgICAgICAgcmVzdHJpY3Rpb246ICdwYXJlbnQnLFxuICAgICAgICAgICAgZW5kT25seTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgYXV0b1Njcm9sbDogdHJ1ZSxcbiAgICAgICAgbGlzdGVuZXJzOiB7XG4gICAgICAgICAgbW92ZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCB4ID0gKHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS14JykpIHx8IDApICsgZXZlbnQuZHg7XG4gICAgICAgICAgICBjb25zdCB5ID0gKHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS15JykpIHx8IDApICsgZXZlbnQuZHk7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXgnLCBTdHJpbmcoeCkpO1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS15JywgU3RyaW5nKHkpKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5yZXNpemFibGUoe1xuICAgICAgICBlZGdlczogeyBsZWZ0OiBmYWxzZSwgcmlnaHQ6IHRydWUsIGJvdHRvbTogdHJ1ZSwgdG9wOiBmYWxzZSB9LFxuICAgICAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgICBtb3ZlOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGxldCB4ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXgnKSkgfHwgMDtcbiAgICAgICAgICAgIGxldCB5ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXknKSkgfHwgMDtcblxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gYCR7ZXZlbnQucmVjdC53aWR0aH1weGA7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gYCR7ZXZlbnQucmVjdC5oZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICB4ICs9IGV2ZW50LmRlbHRhUmVjdC5sZWZ0O1xuICAgICAgICAgICAgeSArPSBldmVudC5kZWx0YVJlY3QudG9wO1xuXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsICR7eX1weClgO1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS14JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0RWRnZXMoeyBvdXRlcjogJ3BhcmVudCcgfSksXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0U2l6ZSh7IG1pbjogeyB3aWR0aDogMTUwLCBoZWlnaHQ6IDEwMCB9IH0pLFxuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5hc3BlY3RSYXRpbyh7IHJhdGlvOiAncHJlc2VydmUnIH0pLFxuICAgICAgICBdLFxuICAgICAgICBpbmVydGlhOiB0cnVlLFxuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YXMtdmlkZW9jYWxsLXdyYXBwZXJcIj5cbiAgPGRpdiBjbGFzcz1cInRhcy12aWRlb2NhbGwtY29udGFpbmVyXCI+XG4gICAgPCEtLSBTdWJzY3JpYmVyIHZpZGVvIChsYXJnZSwgYmFja2dyb3VuZCkgLS0+XG4gICAgPGRpdlxuICAgICAgaWQ9XCJzdWJzY3JpYmVyLWNvbnRhaW5lclwiXG4gICAgICBbY2xhc3Muc3Vic2NyaWJlci12aWV3XT1cImlzUHVibGlzaGVyU21hbGxcIlxuICAgICAgW2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cIiFpc1B1Ymxpc2hlclNtYWxsXCJcbiAgICAgICNzdWJzY3JpYmVyQ29udGFpbmVyXG4gICAgICAoZGJsY2xpY2spPVwib25Eb3VibGVDbGljaygpXCJcbiAgICA+PC9kaXY+XG5cbiAgICA8IS0tIFB1Ymxpc2hlciB2aWRlbyAoc21hbGwsIG92ZXJsYXkpIC0tPlxuICAgIDxkaXZcbiAgICAgIGlkPVwicHVibGlzaGVyLWNvbnRhaW5lclwiXG4gICAgICBbY2xhc3MucHVibGlzaGVyLXZpZXddPVwiaXNQdWJsaXNoZXJTbWFsbFwiXG4gICAgICBbY2xhc3Muc3Vic2NyaWJlci12aWV3XT1cIiFpc1B1Ymxpc2hlclNtYWxsXCJcbiAgICAgICNwdWJsaXNoZXJDb250YWluZXJcbiAgICAgIChkYmxjbGljayk9XCJvbkRvdWJsZUNsaWNrKClcIlxuICAgID48L2Rpdj5cblxuICAgIDwhLS0gQ2VudGVyZWQgYXZhdGFyIChzaG93biB3aGVuIG5vIHZpZGVvIHN0cmVhbSkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImF2YXRhci1jb250YWluZXJcIiAqbmdJZj1cIiFoYXNWaWRlb1N0cmVhbVwiPlxuICAgICAgPHRhcy1hdmF0YXIgW25hbWVdPVwicGFydGljaXBhbnROYW1lXCIgW3NpemVdPVwiODBcIj48L3Rhcy1hdmF0YXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENvbnRyb2xzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9scy1jb250YWluZXJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gY29udHJvbC1idG4gbXV0ZS1idG5cIlxuICAgICAgICBbY2xhc3MubXV0ZWRdPVwiaXNNdXRlZFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIlxuICAgICAgICBbdGl0bGVdPVwiaXNNdXRlZCA/ICdBY3RpdmFyIG1pY3LDs2Zvbm8nIDogJ1NpbGVuY2lhciBtaWNyw7Nmb25vJ1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNNdXRlZCA/ICdBY3RpdmFyIG1pY3LDs2Zvbm8nIDogJ1NpbGVuY2lhciBtaWNyw7Nmb25vJ1wiXG4gICAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJmYVwiXG4gICAgICAgICAgW2NsYXNzLmZhLW1pY3JvcGhvbmVdPVwiIWlzTXV0ZWRcIlxuICAgICAgICAgIFtjbGFzcy5mYS1taWNyb3Bob25lLXNsYXNoXT1cImlzTXV0ZWRcIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGNvbnRyb2wtYnRuIHN3YXAtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVN3YXAoKVwiXG4gICAgICAgIHRpdGxlPVwiSW50ZXJjYW1iaWFyIHZpc3RhXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkludGVyY2FtYmlhciB2aXN0YVwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcmVmcmVzaFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBjb250cm9sLWJ0biBwaXAtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cIm1pbmltaXplKClcIlxuICAgICAgICB0aXRsZT1cIk1pbmltaXphciAoUGljdHVyZSBpbiBQaWN0dXJlKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJNaW5pbWl6YXIgdmlkZW9sbGFtYWRhXCJcbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb21wcmVzc1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBjb250cm9sLWJ0biBoYW5ndXAtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmdVcCgpXCJcbiAgICAgICAgdGl0bGU9XCJGaW5hbGl6YXIgbGxhbWFkYVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJGaW5hbGl6YXIgbGxhbWFkYVwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGhvbmVcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gV2FpdGluZyByb29tIG5vdGlmaWNhdGlvbiAoc2hvd24gZm9yIE9XTkVSL0JBQ0tPRkZJQ0Ugb25seSkgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ3YWl0aW5nLW5vdGlmaWNhdGlvblwiXG4gICAgICAqbmdJZj1cIndhaXRpbmdSb29tVXNlcnMubGVuZ3RoID4gMCAmJiBjYW5BZG1pdFVzZXJzXCJcbiAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwid2FpdGluZy10ZXh0XCI+XG4gICAgICAgIHt7IHdhaXRpbmdSb29tVXNlcnNbMF0ubmFtZSB9fSBlc3TDoSBlbiBsYSBzYWxhIGRlIGVzcGVyYS5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJhZG1pdC1idG5cIlxuICAgICAgICAoY2xpY2spPVwiYWRtaXRVc2VyKHdhaXRpbmdSb29tVXNlcnNbMF0udXNlcklkKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJBZG1pdGlyIHVzdWFyaW9cIlxuICAgICAgPlxuICAgICAgICBBZG1pdGlyXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJkaXNtaXNzLWJ0blwiXG4gICAgICAgIChjbGljayk9XCJkaXNtaXNzV2FpdGluZ05vdGlmaWNhdGlvbih3YWl0aW5nUm9vbVVzZXJzWzBdLnVzZXJJZClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQ2VycmFyIG5vdGlmaWNhY2nDs25cIlxuICAgICAgPlxuICAgICAgICDDl1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTG9jYXRpb24gcGFuZWwgKHNob3duIGZvciBvd25lcnMgd2hlbiB1c2VyIGhhc24ndCBhbGxvd2VkIGxvY2F0aW9uKSAtLT5cbiAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLXBhbmVsXCIgKm5nSWY9XCJzaG93TG9jYXRpb25QYW5lbCAmJiBjYW5BZG1pdFVzZXJzXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWhlYWRlclwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1tYXAtbWFya2VyIGhlYWRlci1pY29uXCI+PC9pPlxuICAgICAgPGgzPlViaWNhY2nDs24gZGVsIGNvbGFib3JhZG9yPC9oMz5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1idG5cIiAoY2xpY2spPVwiY2xvc2VMb2NhdGlvblBhbmVsKClcIiBhcmlhLWxhYmVsPVwiQ2VycmFyXCI+w5c8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tZGVzY3JpcHRpb25cIj5cbiAgICAgIDxwPkVsIGNvbGFib3JhZG9yIHRpZW5lIGxhIHViaWNhY2nDs24gZGVzYWN0aXZhZGEsIHNvbGljaXRhIHF1ZSBsYSBhY3RpdmUuPC9wPlxuICAgICAgPHA+RXN0YSBhY2Npw7NuIG5vcyBwZXJtaXRpcsOhIGRpc3BvbmliaWxpemFyIGFsZ3VuYXMgYWxlcnRhcy48L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNvbnRlbnRcIj5cbiAgICAgIDwhLS0gSW5pdGlhbCBzdGF0ZTogU2hvdyB2ZXJpZnkgYnV0dG9uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFnZW9SZXF1ZXN0QWN0aXZlICYmICFhbGxHZW9HcmFudGVkXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ2ZXJpZnktbG9jYXRpb24tYnRuXCIgKGNsaWNrKT1cInJlcXVlc3RVc2VyTG9jYXRpb24oKVwiPlxuICAgICAgICAgIFZlcmlmaWNhciB1YmljYWNpw7NuXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gTG9hZGluZyBzdGF0ZTogU3Bpbm5lciB3aGlsZSB3YWl0aW5nIGZvciB1c2VyIHJlc3BvbnNlIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdlb1JlcXVlc3RBY3RpdmUgJiYgIWFsbEdlb0dyYW50ZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdlby1sb2FkaW5nLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tc3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwibG9hZGluZy10aXRsZVwiPlZlcmlmaWNhbmRvIHViaWNhY2nDs24uLi48L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJsb2FkaW5nLXN1YnRpdGxlXCI+RXN0byBwdWVkZSB0YXJkYXIgdW5vcyBzZWd1bmRvcy48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidmVyaWZ5LWxvY2F0aW9uLWJ0biBkaXNhYmxlZFwiIGRpc2FibGVkPlxuICAgICAgICAgIFZlcmlmaWNhciB1YmljYWNpw7NuXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU3VjY2VzcyBzdGF0ZTogTG9jYXRpb24gdmVyaWZpZWQgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWxsR2VvR3JhbnRlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvLXN1Y2Nlc3MtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1Y2Nlc3MtaWNvblwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGVja1wiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cInN1Y2Nlc3MtdGl0bGVcIj5MYSB1YmljYWNpw7NuIGZ1ZSB2ZXJpZmljYWRhPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1mb290ZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZm9vdGVyLWljb25cIj48aSBjbGFzcz1cImZhIGZhLWNsb2NrLW9cIj48L2k+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJmb290ZXItaWNvbiBsb2NhdGlvbi1pY29uXCI+PGkgY2xhc3M9XCJmYSBmYS1tYXAtbWFya2VyXCI+PC9pPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
482
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXZpZGVvY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULEtBQUssRUFDTCxTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFHL0YsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUdmLGNBQWMsRUFHZCxTQUFTLEdBQ1YsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVVwQyxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7O0FBUmxDLHlDQUF5QztBQUN6QyxNQUFNLENBQU4sSUFBWSxnQkFNWDtBQU5ELFdBQVksZ0JBQWdCO0lBQzFCLHFDQUFpQixDQUFBO0lBQ2pCLHVDQUFtQixDQUFBO0lBQ25CLDJDQUF1QixDQUFBO0lBQ3ZCLHlDQUFxQixDQUFBO0lBQ3JCLHFDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFOVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBTTNCO0FBUUQsTUFBTSxPQUFPLHFCQUFxQjtJQXdDaEMsWUFDUyxXQUEyQixFQUMxQixVQUFzQixFQUN0QixrQkFBc0MsRUFDdEMsU0FBdUIsRUFDdkIsWUFBc0I7UUFKdkIs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Z0JBQ3JFLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO2FBQ3REO1lBQ0QsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUM7SUFDUCxDQUFDOzttSEF4aUJVLHFCQUFxQjt1R0FBckIscUJBQXFCLDRoQkMzQ2xDLDY2TUF1S0E7NEZENUhhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxlQUFlO2lOQUtoQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUUyQixrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNHLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBJbnB1dCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsLCBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRhc0ZlZWRiYWNrTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtZmVlZGJhY2stbW9kYWwvdGFzLWZlZWRiYWNrLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2VvbG9jYXRpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBDYWxsU3RhdGUsXG4gIFZpZXdNb2RlLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFdhaXRpbmdSb29tVXNlcixcbiAgUm9vbVVzZXJTdGF0dXMsXG4gIFVzZXJDYWxsQWN0aW9uLFxuICBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QsXG4gIFVzZXJHZW9JbmZvLFxuICBHZW9TdGF0dXMsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgVEFTX0lDT05TIH0gZnJvbSAnLi4vLi4vaWNvbnMvdGFzLWljb25zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKiogVXNlciBnZW9sb2NhdGlvbiBwYW5lbCB2aWV3IHN0YXRlcyAqL1xuZXhwb3J0IGVudW0gVXNlckdlb1ZpZXdTdGF0ZSB7XG4gIEhJRERFTiA9ICdISURERU4nLFxuICBJTklUSUFMID0gJ0lOSVRJQUwnLFxuICBWRVJJRllJTkcgPSAnVkVSSUZZSU5HJyxcbiAgVkVSSUZJRUQgPSAnVkVSSUZJRUQnLFxuICBERU5JRUQgPSAnREVOSUVEJyxcbn1cbmltcG9ydCBpbnRlcmFjdCBmcm9tICdpbnRlcmFjdGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLXZpZGVvY2FsbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXMtdmlkZW9jYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNWaWRlb2NhbGxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIHNlc3Npb25JZCE6IHN0cmluZztcbiAgQElucHV0KCkgdG9rZW4hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwcG9pbnRtZW50SWQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHZpZGVvQ2FsbElkPzogbnVtYmVyO1xuICBASW5wdXQoKSB1c2VySWQ/OiBudW1iZXI7IC8vIEN1cnJlbnQgdXNlcidzIElEIGZvciBnZW8gcmVwb3J0aW5nXG4gIEBJbnB1dCgpIHBhcnRpY2lwYW50TmFtZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRlbmFudDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVI7XG4gIEBJbnB1dCgpIGlzUmV0dXJuaW5nRnJvbVBpcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3B1Ymxpc2hlckNvbnRhaW5lcicpIHB1Ymxpc2hlckNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3N1YnNjcmliZXJDb250YWluZXInKSBzdWJzY3JpYmVyQ29udGFpbmVyITogRWxlbWVudFJlZjtcblxuICBwdWJsaWMgaXNQdWJsaXNoZXJTbWFsbCA9IHRydWU7XG4gIHB1YmxpYyBjYWxsU3RhdGUgPSBDYWxsU3RhdGUuSURMRTtcbiAgcHVibGljIGlzTXV0ZWQgPSBmYWxzZTtcbiAgcHVibGljIHdhaXRpbmdSb29tVXNlcnM6IFdhaXRpbmdSb29tVXNlcltdID0gW107XG4gIHB1YmxpYyBvd25lckhhc0pvaW5lZCA9IGZhbHNlO1xuICBwdWJsaWMgaGFzVmlkZW9TdHJlYW0gPSBmYWxzZTtcbiAgcHVibGljIGRpc21pc3NlZFVzZXJzOiBudW1iZXJbXSA9IFtdO1xuICBwdWJsaWMgc2hvd0xvY2F0aW9uUGFuZWwgPSB0cnVlOyAvLyBTaG93IGJ5IGRlZmF1bHQgZm9yIG93bmVycywgd2lsbCBiZSB1cGRhdGVkIGJhc2VkIG9uIHVzZXIncyBsb2NhdGlvbiBzdGF0dXNcbiAgcHVibGljIHVzZXJIYXNMb2NhdGlvbiA9IGZhbHNlOyAvLyBUcmFja3MgaWYgdGhlIHVzZXIgaGFzIHNoYXJlZCB0aGVpciBsb2NhdGlvblxuICBwdWJsaWMgZ2VvTG9jYXRpb25TdGF0dXM6ICd1bmtub3duJyB8ICdhY3RpdmUnIHwgJ2RlbmllZCcgPSAndW5rbm93bic7XG4gIFxuICAvLyBHZW8gcGFuZWwgc3RhdGVzIGZvciBvd25lclxuICBwdWJsaWMgZ2VvUmVxdWVzdEFjdGl2ZSA9IGZhbHNlOyAvLyBPd25lciBzZW50IHJlcXVlc3QsIHdhaXRpbmcgZm9yIHVzZXJcbiAgcHVibGljIGFsbEdlb0dyYW50ZWQgPSBmYWxzZTsgLy8gQWxsIHVzZXJzIHJlc3BvbmRlZCB3aXRoIGdlb1xuICBwdWJsaWMgdXNlckdlb0luZm86IFVzZXJHZW9JbmZvW10gPSBbXTsgLy8gSW5kaXZpZHVhbCB1c2VyIGdlbyBzdGF0dXNcblxuICAvLyBVc2VyIGdlbyBwYW5lbCBzdGF0ZSAoZm9yIG93bmVycylcbiAgcHVibGljIHVzZXJHZW9WaWV3U3RhdGU6IFVzZXJHZW9WaWV3U3RhdGUgPSBVc2VyR2VvVmlld1N0YXRlLkhJRERFTjtcbiAgcHVibGljIFVzZXJHZW9WaWV3U3RhdGUgPSBVc2VyR2VvVmlld1N0YXRlOyAvLyBFeHBvc2UgZW51bSB0byB0ZW1wbGF0ZVxuICBwdWJsaWMgaG9tZUljb246IFNhZmVIdG1sO1xuICBwdWJsaWMgZGV2TW9kZUVuYWJsZWQgPSBmYWxzZTsgLy8gRW5hYmxlIGRldiBjb250cm9scyBmb3IgdGVzdGluZ1xuICBwcml2YXRlIGdlb1BhbmVsRGlzbWlzc2VkID0gZmFsc2U7IC8vIFRyYWNrIGlmIG93bmVyIG1hbnVhbGx5IGNsb3NlZCB0aGUgcGFuZWxcbiAgcHJpdmF0ZSBmZWVkYmFja1Nob3duID0gZmFsc2U7IC8vIFRyYWNrIGlmIGZlZWRiYWNrIG1vZGFsIGhhcyBiZWVuIHNob3duXG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXG4gICAgcHJpdmF0ZSB0YXNTZXJ2aWNlOiBUYXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ2VvbG9jYXRpb25TZXJ2aWNlOiBHZW9sb2NhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWxcbiAgKSB7XG4gICAgdGhpcy5ob21lSWNvbiA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKFRBU19JQ09OUy5ob21lKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBTdWJzY3JpcHRpb25zKCk7XG4gICAgdGhpcy5pbml0aWFsaXplQ2FsbCgpO1xuICAgIFxuICAgIC8vIEZvciBvd25lcnM6IHNob3cgdGhlIGdlbyBwYW5lbCB0byByZXF1ZXN0IHVzZXIgbG9jYXRpb24gKHVubGVzcyBkaXNtaXNzZWQpXG4gICAgaWYgKHRoaXMuY2FuQWRtaXRVc2VycyAmJiAhdGhpcy5nZW9QYW5lbERpc21pc3NlZCkge1xuICAgICAgdGhpcy51c2VyR2VvVmlld1N0YXRlID0gVXNlckdlb1ZpZXdTdGF0ZS5JTklUSUFMO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRJbnRlcmFjdCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy50YXNTZXJ2aWNlLnJlc2V0UG9sbGluZ1N0YXRlKCk7XG5cbiAgICAvLyBPbmx5IGRpc2Nvbm5lY3QgaWYgbm90IGluIFBpUCBtb2RlIChrZWVwIHNlc3Npb24gYWxpdmUgZm9yIGZsb2F0aW5nIHdpbmRvdylcbiAgICBpZiAoIXRoaXMudGFzU2VydmljZS5pc1BpcE1vZGUoKSkge1xuICAgICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgaW50ZXJhY3QoJy5wdWJsaXNoZXItdmlldycpLnVuc2V0KCk7XG4gIH1cblxuICAvLyBQdWJsaWMgTWV0aG9kc1xuICBoYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBmZWVkYmFjayBtb2RhbCB3aGVuIGNhbGwgZW5kc1xuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRmVlZGJhY2tNb2RhbCgpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG9wZW5pbmcgZmVlZGJhY2sgbW9kYWwgbXVsdGlwbGUgdGltZXNcbiAgICBpZiAodGhpcy5mZWVkYmFja1Nob3duKSB7XG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdoYW5ndXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdmlkZW9DYWxsSWQgZnJvbSBpbnB1dCBvciBzZXJ2aWNlXG4gICAgY29uc3QgdmlkZW9DYWxsSWQgPSB0aGlzLnZpZGVvQ2FsbElkID8/IHRoaXMudGFzU2VydmljZS52aWRlb0NhbGxJZDtcblxuICAgIC8vIElmIG5vIHZpZGVvQ2FsbElkLCBza2lwIGZlZWRiYWNrIGFuZCBjbG9zZSBkaXJlY3RseVxuICAgIGlmICghdmlkZW9DYWxsSWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2hhbmd1cCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmVlZGJhY2tTaG93biA9IHRydWU7XG5cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzRmVlZGJhY2tNb2RhbENvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICBiYWNrZHJvcDogdHJ1ZSxcbiAgICAgIGtleWJvYXJkOiB0cnVlLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtZmVlZGJhY2stbW9kYWwtd3JhcHBlcicsXG4gICAgfSk7XG5cbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS52aWRlb0NhbGxJZCA9IHZpZGVvQ2FsbElkO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRlbmFudCA9IHRoaXMudGVuYW50O1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuXG4gICAgLy8gQ2xvc2UgdmlkZW9jYWxsIG1vZGFsIGFmdGVyIGZlZWRiYWNrIG1vZGFsIGlzIGNsb3NlZC9kaXNtaXNzZWRcbiAgICBtb2RhbFJlZi5yZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdoYW5ndXAnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZU11dGUoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLnRvZ2dsZU11dGUoKTtcbiAgfVxuXG4gIG1pbmltaXplKCk6IHZvaWQge1xuICAgIHRoaXMudGFzU2VydmljZS5tb3ZlTWFpblZpZGVvVG8oJ3BpcC1tYWluLXZpZGVvJyk7XG4gICAgLy8gU21hbGwgZGVsYXkgdG8gZW5zdXJlIHZpZGVvIGlzIG1vdmVkIGJlZm9yZSBjbG9zaW5nIG1vZGFsXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRhc1NlcnZpY2UuZW50ZXJQaXBNb2RlKCksIDUwKTtcbiAgfVxuXG4gIHRvZ2dsZVN3YXAoKTogdm9pZCB7XG4gICAgdGhpcy5pc1B1Ymxpc2hlclNtYWxsID0gIXRoaXMuaXNQdWJsaXNoZXJTbWFsbDtcbiAgICB0aGlzLnJlc2V0VmlkZW9Qb3NpdGlvbnMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdEludGVyYWN0KCkpO1xuICB9XG5cbiAgb25Eb3VibGVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVN3YXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IHVzZXIgY2FuIGFkbWl0IG90aGVycyAoT1dORVIsIEJBQ0tPRkZJQ0UsIG9yIE1PREVSQVRPUilcbiAgICovXG4gIGdldCBjYW5BZG1pdFVzZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkJBQ0tPRkZJQ0UgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQURNSU5fTUFOQUdFUiB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5NQU5BR0VSXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBVc2VycyB3aXRoIHBlbmRpbmcgZ2VvIHN0YXR1cyAqL1xuICBnZXQgcGVuZGluZ1VzZXJzKCk6IFVzZXJHZW9JbmZvW10ge1xuICAgIHJldHVybiB0aGlzLnVzZXJHZW9JbmZvLmZpbHRlcih1ID0+IHUuZ2VvU3RhdHVzID09PSBHZW9TdGF0dXMuUEVORElORyk7XG4gIH1cblxuICAvKiogVXNlcnMgd2hvIGdyYW50ZWQgZ2VvICovXG4gIGdldCBncmFudGVkVXNlcnMoKTogVXNlckdlb0luZm9bXSB7XG4gICAgcmV0dXJuIHRoaXMudXNlckdlb0luZm8uZmlsdGVyKHUgPT4gdS5nZW9TdGF0dXMgPT09IEdlb1N0YXR1cy5HUkFOVEVEKTtcbiAgfVxuXG4gIC8qKiBVc2VycyB3aG8gZGVuaWVkIGdlbyAqL1xuICBnZXQgZGVuaWVkVXNlcnMoKTogVXNlckdlb0luZm9bXSB7XG4gICAgcmV0dXJuIHRoaXMudXNlckdlb0luZm8uZmlsdGVyKHUgPT4gdS5nZW9TdGF0dXMgPT09IEdlb1N0YXR1cy5ERU5JRUQpO1xuICB9XG5cbiAgLyoqIFNob3cgbG9jYXRpb24gcGFuZWwgb25seSBpZiBvd25lciBhbmQgdGhlcmUgYXJlIHVzZXJzIHdobyBoYXZlbid0IGdyYW50ZWQgKi9cbiAgZ2V0IHNob3VsZFNob3dMb2NhdGlvblBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jYW5BZG1pdFVzZXJzIHx8IHRoaXMudXNlckdlb0luZm8ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEhpZGUgaWYgYWxsIHVzZXJzIGhhdmUgZ3JhbnRlZFxuICAgIGNvbnN0IGFsbEdyYW50ZWQgPSB0aGlzLnVzZXJHZW9JbmZvLmV2ZXJ5KHUgPT4gdS5nZW9TdGF0dXMgPT09IEdlb1N0YXR1cy5HUkFOVEVEKTtcbiAgICByZXR1cm4gIWFsbEdyYW50ZWQ7XG4gIH1cblxuICAvKiogQ2hlY2sgaWYgYW55IHVzZXIgaGFzIGRlbmllZCBnZW8gKi9cbiAgZ2V0IGhhc0FueURlbmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZW5pZWRVc2Vycy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIFNob3cgdXNlciBnZW8gcGFuZWwgZm9yIG93bmVycyB3aGVuIG5vdCBoaWRkZW4gKi9cbiAgZ2V0IHNob3VsZFNob3dVc2VyR2VvUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuQWRtaXRVc2VycyAmJiB0aGlzLnVzZXJHZW9WaWV3U3RhdGUgIT09IFVzZXJHZW9WaWV3U3RhdGUuSElEREVOO1xuICB9XG5cbiAgLyoqIFNldCB1c2VyIGdlbyB2aWV3IHN0YXRlIChmb3IgZGV2IGNvbnRyb2xzIG9yIGNsb3NlIGJ1dHRvbikgKi9cbiAgc2V0VXNlckdlb1ZpZXdTdGF0ZShzdGF0ZTogVXNlckdlb1ZpZXdTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMudXNlckdlb1ZpZXdTdGF0ZSA9IHN0YXRlO1xuICAgIC8vIFRyYWNrIGlmIG93bmVyIG1hbnVhbGx5IGRpc21pc3NlZCB0aGUgcGFuZWxcbiAgICBpZiAoc3RhdGUgPT09IFVzZXJHZW9WaWV3U3RhdGUuSElEREVOKSB7XG4gICAgICB0aGlzLmdlb1BhbmVsRGlzbWlzc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRtaXQgYSB1c2VyIGZyb20gdGhlIHdhaXRpbmcgcm9vbVxuICAgKi9cbiAgYWRtaXRVc2VyKHVzZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgYWRtaXQgdXNlcjogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgLm1vZGlmeVByb3h5VmlkZW9Vc2VyKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgICAgYWN0aW9uOiBVc2VyQ2FsbEFjdGlvbi5XQUlUSU5HX1JPT01fTEVBVkUsXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvLyBSZW1vdmUgdXNlciBmcm9tIHdhaXRpbmcgbGlzdCBhZnRlciBzdWNjZXNzZnVsIGFkbWl0XG4gICAgICAgICAgdGhpcy53YWl0aW5nUm9vbVVzZXJzID0gdGhpcy53YWl0aW5nUm9vbVVzZXJzLmZpbHRlcihcbiAgICAgICAgICAgICh1KSA9PiB1LnVzZXJJZCAhPT0gdXNlcklkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZG1pdHRpbmcgdXNlcjonLCBlcnIpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzcyB0aGUgd2FpdGluZyByb29tIG5vdGlmaWNhdGlvbiBmb3IgYSB1c2VyXG4gICAqL1xuICBkaXNtaXNzV2FpdGluZ05vdGlmaWNhdGlvbih1c2VySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkVXNlcnMucHVzaCh1c2VySWQpO1xuICAgIHRoaXMud2FpdGluZ1Jvb21Vc2VycyA9IHRoaXMud2FpdGluZ1Jvb21Vc2Vycy5maWx0ZXIoXG4gICAgICAodSkgPT4gdS51c2VySWQgIT09IHVzZXJJZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGxvY2F0aW9uIHBhbmVsXG4gICAqL1xuICBjbG9zZUxvY2F0aW9uUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TG9jYXRpb25QYW5lbCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHVzZXIgdG8gc2hhcmUgdGhlaXIgbG9jYXRpb24gKGNhbGxlZCBieSBvd25lcilcbiAgICovXG4gIHJlcXVlc3RVc2VyTG9jYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcmVxdWVzdCBsb2NhdGlvbjogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBib2R5OiBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QgPSB7XG4gICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgIGFjdGlvbjogVXNlckNhbGxBY3Rpb24uUkVRVUVTVF9HRU9MT0NBTElaQVRJT04sXG4gICAgfTtcblxuICAgIHRoaXMudGFzU2VydmljZS5tb2RpZnlQcm94eVZpZGVvVXNlcihib2R5KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnTG9jYXRpb24gcmVxdWVzdCBzZW50Jyk7XG4gICAgICAgIC8vIFNldCBwYW5lbCB0byB2ZXJpZnlpbmcgc3RhdGUgd2hpbGUgd2FpdGluZyBmb3IgdXNlciByZXNwb25zZVxuICAgICAgICB0aGlzLnVzZXJHZW9WaWV3U3RhdGUgPSBVc2VyR2VvVmlld1N0YXRlLlZFUklGWUlORztcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignRXJyb3IgcmVxdWVzdGluZyBsb2NhdGlvbjonLCBlcnIpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gIHByaXZhdGUgc2V0dXBTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENhbGwgc3RhdGUgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5jYWxsU3RhdGUkLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSBDYWxsU3RhdGUuRElTQ09OTkVDVEVEKSB7XG4gICAgICAgICAgdGhpcy5vcGVuRmVlZGJhY2tNb2RhbCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyYWNrIGlmIHdlIGhhdmUgYW4gYWN0aXZlIHZpZGVvIHN0cmVhbVxuICAgICAgICB0aGlzLmhhc1ZpZGVvU3RyZWFtID0gc3RhdGUgPT09IENhbGxTdGF0ZS5DT05ORUNURUQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBWaWV3IG1vZGUgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS52aWV3TW9kZSQuc3Vic2NyaWJlKChtb2RlKSA9PiB7XG4gICAgICAgIGlmIChtb2RlID09PSBWaWV3TW9kZS5QSVApIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdwaXAnKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gTXV0ZSBzdGF0ZSBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmlzTXV0ZWQkLnN1YnNjcmliZSgobXV0ZWQpID0+IHtcbiAgICAgICAgdGhpcy5pc011dGVkID0gbXV0ZWQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBXYWl0aW5nIHJvb20gdXNlcnMgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS53YWl0aW5nUm9vbVVzZXJzJC5zdWJzY3JpYmUoKHVzZXJzKSA9PiB7XG4gICAgICAgIC8vIEZpbHRlciBvdXQgZGlzbWlzc2VkIHVzZXJzXG4gICAgICAgIHRoaXMud2FpdGluZ1Jvb21Vc2VycyA9IHVzZXJzLmZpbHRlcihcbiAgICAgICAgICAodSkgPT4gIXRoaXMuZGlzbWlzc2VkVXNlcnMuaW5jbHVkZXModS51c2VySWQpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBPd25lciBqb2luIHN0YXR1cyBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLm93bmVySGFzSm9pbmVkJC5zdWJzY3JpYmUoKGpvaW5lZCkgPT4ge1xuICAgICAgICB0aGlzLm93bmVySGFzSm9pbmVkID0gam9pbmVkO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gT3duZXIgbGVmdCBzdWJzY3JpcHRpb24gLSBkaXNjb25uZWN0IG5vbi1vd25lcnNcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLm93bmVySGFzTGVmdCQuc3Vic2NyaWJlKChoYXNMZWZ0KSA9PiB7XG4gICAgICAgIGlmIChoYXNMZWZ0ICYmICF0aGlzLmNhbkFkbWl0VXNlcnMpIHsgLy8gTm9uLW93bmVyIHVzZXJcbiAgICAgICAgICAvLyBoYW5nVXAoKSB0cmlnZ2VycyBESVNDT05ORUNURUQgc3RhdGUsIHdoaWNoIG9wZW5zIGZlZWRiYWNrIG1vZGFsXG4gICAgICAgICAgLy8gdGhlbiBjbG9zZXMgdmlkZW9jYWxsIG1vZGFsIGFmdGVyIGZlZWRiYWNrIGlzIGRvbmVcbiAgICAgICAgICB0aGlzLmhhbmdVcCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBY3RpdmF0ZUdlbyBzdWJzY3JpcHRpb24gLSBvbmx5IGZvciBub24tb3duZXJzICh1c2VycylcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmFjdGl2YXRlR2VvJC5zdWJzY3JpYmUoKGFjdGl2YXRlR2VvKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmF0ZUdlbyAmJiAhdGhpcy5jYW5BZG1pdFVzZXJzKSB7XG5cbiAgICAgICAgICB0aGlzLmhhbmRsZUFjdGl2YXRlR2VvKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIEdlb1JlcXVlc3RBY3RpdmUgc3Vic2NyaXB0aW9uIC0gZm9yIG93bmVyc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2UuZ2VvUmVxdWVzdEFjdGl2ZSQuc3Vic2NyaWJlKChhY3RpdmUpID0+IHtcblxuICAgICAgICB0aGlzLmdlb1JlcXVlc3RBY3RpdmUgPSBhY3RpdmU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBbGxHZW9HcmFudGVkIHN1YnNjcmlwdGlvbiAtIGZvciBvd25lcnMgdG8gdXBkYXRlIHBhbmVsIHN0YXRlXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5hbGxHZW9HcmFudGVkJC5zdWJzY3JpYmUoKGdyYW50ZWQpID0+IHtcbiAgICAgICAgdGhpcy5hbGxHZW9HcmFudGVkID0gZ3JhbnRlZDtcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBvd25lcnM6IHVwZGF0ZSBwYW5lbCBzdGF0ZSBiYXNlZCBvbiBnZW8gc3RhdHVzXG4gICAgICAgIGlmICh0aGlzLmNhbkFkbWl0VXNlcnMgJiYgZ3JhbnRlZCkge1xuICAgICAgICAgIHRoaXMudXNlckdlb1ZpZXdTdGF0ZSA9IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZJRUQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVzZXJHZW9JbmZvIHN1YnNjcmlwdGlvbiAtIGZvciBvd25lciBnZW8gcGFuZWxcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLnVzZXJHZW9JbmZvJC5zdWJzY3JpYmUoKGluZm8pID0+IHtcbiAgICAgICAgdGhpcy51c2VyR2VvSW5mbyA9IGluZm87XG4gICAgICAgIC8vIE5vdGU6IFdlIGRvbid0IGF1dG8tc3dpdGNoIHRvIERFTklFRCBoZXJlIC0gdGhhdCBvbmx5IGhhcHBlbnMgXG4gICAgICAgIC8vIGFmdGVyIG93bmVyIHJlcXVlc3RzIGFuZCB1c2VyIGRlbmllcyAodmlhIGdlb1JlcXVlc3RBY3RpdmUgZmxvdylcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYWN0aXZhdGVHZW8gcmVxdWVzdCBmcm9tIGJhY2tlbmQgKGZvciBub24tb3duZXIgdXNlcnMpLlxuICAgKiBEaXJlY3RseSBwcm9tcHRzIGJyb3dzZXIgZm9yIGdlb2xvY2F0aW9uIC0gbm8gcGFuZWwgZm9yIHVzZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVBY3RpdmF0ZUdlbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDbGVhciBhbnkgY2FjaGVkIHBvc2l0aW9uIHRvIGZvcmNlIHJlLXByb21wdGluZ1xuICAgIHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcbiAgICBcbiAgICAvLyBSZXF1ZXN0IGdlb2xvY2F0aW9uIGZyb20gdXNlciAoYnJvd3NlciB3aWxsIHByb21wdClcbiAgICBjb25zdCBwb3NpdGlvbiA9IGF3YWl0IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIFxuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgdGhpcy5nZW9Mb2NhdGlvblN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgdGhpcy5yZXBvcnRHZW9TdGF0dXMocG9zaXRpb24ubGF0aXR1ZGUsIHBvc2l0aW9uLmxvbmdpdHVkZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VvTG9jYXRpb25TdGF0dXMgPSAnZGVuaWVkJztcbiAgICAgIHRoaXMuZGVueUdlb0xvY2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0YXJ0IGdlb2xvY2F0aW9uIHZlcmlmaWNhdGlvbiAoY2FsbGVkIGZyb20gdGVtcGxhdGUgYnV0dG9uKSAqL1xuICBwdWJsaWMgYXN5bmMgc3RhcnRHZW9WZXJpZmljYXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy51c2VyR2VvVmlld1N0YXRlID0gVXNlckdlb1ZpZXdTdGF0ZS5WRVJJRllJTkc7XG5cbiAgICAvLyBDbGVhciBhbnkgY2FjaGVkIHBvc2l0aW9uIHRvIGZvcmNlIHJlLXByb21wdGluZ1xuICAgIHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcbiAgICBcbiAgICAvLyBSZXF1ZXN0IGdlb2xvY2F0aW9uIGZyb20gdXNlciAoYnJvd3NlciB3aWxsIHByb21wdClcbiAgICBjb25zdCBwb3NpdGlvbiA9IGF3YWl0IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIFxuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgdGhpcy5nZW9Mb2NhdGlvblN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgdGhpcy51c2VyR2VvVmlld1N0YXRlID0gVXNlckdlb1ZpZXdTdGF0ZS5WRVJJRklFRDtcbiAgICAgIHRoaXMucmVwb3J0R2VvU3RhdHVzKHBvc2l0aW9uLmxhdGl0dWRlLCBwb3NpdGlvbi5sb25naXR1ZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdlb0xvY2F0aW9uU3RhdHVzID0gJ2RlbmllZCc7XG4gICAgICB0aGlzLnVzZXJHZW9WaWV3U3RhdGUgPSBVc2VyR2VvVmlld1N0YXRlLkRFTklFRDtcbiAgICAgIHRoaXMuZGVueUdlb0xvY2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBncmFudGVkIGdlb2xvY2F0aW9uIHRvIGJhY2tlbmQuXG4gICAqIElNUE9SVEFOVDogT25seSBjYWxsIHdpdGggdmFsaWQgY29vcmRpbmF0ZXMuXG4gICAqL1xuICBwcml2YXRlIHJlcG9ydEdlb1N0YXR1cyhsYXRpdHVkZTogbnVtYmVyLCBsb25naXR1ZGU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWRlb0NhbGxJZCkge1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29vcmRpbmF0ZXMgYXJlIHByZXNlbnRcbiAgICBpZiAobGF0aXR1ZGUgPT09IHVuZGVmaW5lZCB8fCBsYXRpdHVkZSA9PT0gbnVsbCB8fCBsb25naXR1ZGUgPT09IHVuZGVmaW5lZCB8fCBsb25naXR1ZGUgPT09IG51bGwpIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IFByb3h5VmlkZW9Vc2VyTW9kaWZ5UmVxdWVzdCA9IHtcbiAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXG4gICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgIGFjdGlvbjogVXNlckNhbGxBY3Rpb24uQUNUSVZBVEVfR0VPTE9DQVRJT04sXG4gICAgICBsYXRpdHVkZSxcbiAgICAgIGxvbmdpdHVkZSxcbiAgICB9O1xuXG5cbiAgICB0aGlzLnRhc1NlcnZpY2UubW9kaWZ5UHJveHlWaWRlb1VzZXIoYm9keSkuc3Vic2NyaWJlKHtcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBkZW5pZWQgZ2VvbG9jYXRpb24gdG8gYmFja2VuZC5cbiAgICovXG4gIHByaXZhdGUgZGVueUdlb0xvY2F0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWRlb0NhbGxJZCkge1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm9keTogUHJveHlWaWRlb1VzZXJNb2RpZnlSZXF1ZXN0ID0ge1xuICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCxcbiAgICAgIHZpZGVvQ2FsbElkOiB0aGlzLnZpZGVvQ2FsbElkLFxuICAgICAgYWN0aW9uOiBVc2VyQ2FsbEFjdGlvbi5ERU5ZX0dFT0xPQ0FUSU9OLFxuICAgIH07XG5cblxuICAgIHRoaXMudGFzU2VydmljZS5tb2RpZnlQcm94eVZpZGVvVXNlcihib2R5KS5zdWJzY3JpYmUoe1xuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDYWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUmV0dXJuaW5nRnJvbVBpcCkge1xuICAgICAgLy8gUmV0dXJuaW5nIGZyb20gUGlQIC0ganVzdCBtb3ZlIHZpZGVvcyBiYWNrXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFzU2VydmljZS5tb3ZlVmlkZW9zVG9GdWxsc2NyZWVuKCksIDEwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlc3Npb25JZCAmJiB0aGlzLnRva2VuKSB7XG4gICAgICAvLyBOZXcgY2FsbCAtIGNvbm5lY3QgdG8gc2Vzc2lvblxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5jb25uZWN0U2Vzc2lvbihcbiAgICAgICAgICB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICB0aGlzLnRva2VuLFxuICAgICAgICAgICdwdWJsaXNoZXItY29udGFpbmVyJyxcbiAgICAgICAgICAnc3Vic2NyaWJlci1jb250YWluZXInLFxuICAgICAgICAgIHRoaXMuYnVzaW5lc3NSb2xlXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjb25uZWN0aW5nIHRvIHZpZGVvIGNhbGw6JywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFN0YXJ0IHN0YXR1cyBwb2xsaW5nIHdpdGggc2hvcnRlciBpbnRlcnZhbCAoNXMpIHRvIGRldGVjdCBvd25lciBsZWF2aW5nL2xvY2F0aW9uIHJlcXVlc3RzXG4gICAgICBpZiAodGhpcy5hcHBvaW50bWVudElkKSB7XG4gICAgICAgIHRoaXMudGFzU2VydmljZS5zdGFydFN0YXR1c1BvbGxpbmcoe1xuICAgICAgICAgIGFwcG9pbnRtZW50SWQ6IHRoaXMuYXBwb2ludG1lbnRJZCxcbiAgICAgICAgICB0ZW5hbnQ6IHRoaXMudGVuYW50LFxuICAgICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICAgICAgcm9vbVR5cGU6IHVuZGVmaW5lZCwgLy8gUm9vbVR5cGUgbWlnaHQgYmUgbmVlZGVkIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGVudGl0eUlkOiB1bmRlZmluZWQsIC8vIEVudGl0eUlkIG1pZ2h0IGJlIG5lZWRlZCBpZiBhdmFpbGFibGVcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkXG4gICAgICAgIH0sIDUwMDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRWaWRlb1Bvc2l0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBwdWJsaXNoZXJFbCA9IHRoaXMucHVibGlzaGVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHN1YnNjcmliZXJFbCA9IHRoaXMuc3Vic2NyaWJlckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmIChwdWJsaXNoZXJFbCkge1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXgnKTtcbiAgICAgIHB1Ymxpc2hlckVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS15Jyk7XG4gICAgfVxuXG4gICAgaWYgKHN1YnNjcmliZXJFbCkge1xuICAgICAgc3Vic2NyaWJlckVsLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgIHN1YnNjcmliZXJFbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEteCcpO1xuICAgICAgc3Vic2NyaWJlckVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS15Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0SW50ZXJhY3QoKTogdm9pZCB7XG4gICAgaW50ZXJhY3QoJy5wdWJsaXNoZXItdmlldycpLnVuc2V0KCk7XG5cbiAgICBpbnRlcmFjdCgnLnB1Ymxpc2hlci12aWV3JylcbiAgICAgIC5kcmFnZ2FibGUoe1xuICAgICAgICBpbmVydGlhOiB0cnVlLFxuICAgICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgICBpbnRlcmFjdC5tb2RpZmllcnMucmVzdHJpY3RSZWN0KHtcbiAgICAgICAgICAgIHJlc3RyaWN0aW9uOiAncGFyZW50JyxcbiAgICAgICAgICAgIGVuZE9ubHk6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICAgIGF1dG9TY3JvbGw6IHRydWUsXG4gICAgICAgIGxpc3RlbmVyczoge1xuICAgICAgICAgIG1vdmU6IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgY29uc3QgeCA9IChwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEteCcpKSB8fCAwKSArIGV2ZW50LmR4O1xuICAgICAgICAgICAgY29uc3QgeSA9IChwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEteScpKSB8fCAwKSArIGV2ZW50LmR5O1xuXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsICR7eX1weClgO1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS14JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAucmVzaXphYmxlKHtcbiAgICAgICAgZWRnZXM6IHsgbGVmdDogZmFsc2UsIHJpZ2h0OiB0cnVlLCBib3R0b206IHRydWUsIHRvcDogZmFsc2UgfSxcbiAgICAgICAgbGlzdGVuZXJzOiB7XG4gICAgICAgICAgbW92ZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBsZXQgeCA9IHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS14JykpIHx8IDA7XG4gICAgICAgICAgICBsZXQgeSA9IHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS15JykpIHx8IDA7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS53aWR0aCA9IGAke2V2ZW50LnJlY3Qud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IGAke2V2ZW50LnJlY3QuaGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgeCArPSBldmVudC5kZWx0YVJlY3QubGVmdDtcbiAgICAgICAgICAgIHkgKz0gZXZlbnQuZGVsdGFSZWN0LnRvcDtcblxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHt4fXB4LCAke3l9cHgpYDtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteCcsIFN0cmluZyh4KSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXknLCBTdHJpbmcoeSkpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdEVkZ2VzKHsgb3V0ZXI6ICdwYXJlbnQnIH0pLFxuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdFNpemUoeyBtaW46IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxMDAgfSB9KSxcbiAgICAgICAgICBpbnRlcmFjdC5tb2RpZmllcnMuYXNwZWN0UmF0aW8oeyByYXRpbzogJ3ByZXNlcnZlJyB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5lcnRpYTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFzLXZpZGVvY2FsbC13cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0YXMtdmlkZW9jYWxsLWNvbnRhaW5lclwiPlxuICAgIDwhLS0gU3Vic2NyaWJlciB2aWRlbyAobGFyZ2UsIGJhY2tncm91bmQpIC0tPlxuICAgIDxkaXZcbiAgICAgIGlkPVwic3Vic2NyaWJlci1jb250YWluZXJcIlxuICAgICAgW2NsYXNzLnN1YnNjcmliZXItdmlld109XCJpc1B1Ymxpc2hlclNtYWxsXCJcbiAgICAgIFtjbGFzcy5wdWJsaXNoZXItdmlld109XCIhaXNQdWJsaXNoZXJTbWFsbFwiXG4gICAgICAjc3Vic2NyaWJlckNvbnRhaW5lclxuICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2soKVwiXG4gICAgPjwvZGl2PlxuXG4gICAgPCEtLSBQdWJsaXNoZXIgdmlkZW8gKHNtYWxsLCBvdmVybGF5KSAtLT5cbiAgICA8ZGl2XG4gICAgICBpZD1cInB1Ymxpc2hlci1jb250YWluZXJcIlxuICAgICAgW2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cImlzUHVibGlzaGVyU21hbGxcIlxuICAgICAgW2NsYXNzLnN1YnNjcmliZXItdmlld109XCIhaXNQdWJsaXNoZXJTbWFsbFwiXG4gICAgICAjcHVibGlzaGVyQ29udGFpbmVyXG4gICAgICAoZGJsY2xpY2spPVwib25Eb3VibGVDbGljaygpXCJcbiAgICA+PC9kaXY+XG5cbiAgICA8IS0tIENlbnRlcmVkIGF2YXRhciAoc2hvd24gd2hlbiBubyB2aWRlbyBzdHJlYW0pIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItY29udGFpbmVyXCIgKm5nSWY9XCIhaGFzVmlkZW9TdHJlYW1cIj5cbiAgICAgIDx0YXMtYXZhdGFyIFtuYW1lXT1cInBhcnRpY2lwYW50TmFtZVwiIFtzaXplXT1cIjgwXCI+PC90YXMtYXZhdGFyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb250cm9scyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbHMtY29udGFpbmVyXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGNvbnRyb2wtYnRuIG11dGUtYnRuXCJcbiAgICAgICAgW2NsYXNzLm11dGVkXT1cImlzTXV0ZWRcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCJcbiAgICAgICAgW3RpdGxlXT1cImlzTXV0ZWQgPyAnQWN0aXZhciBtaWNyw7Nmb25vJyA6ICdTaWxlbmNpYXIgbWljcsOzZm9ubydcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImlzTXV0ZWQgPyAnQWN0aXZhciBtaWNyw7Nmb25vJyA6ICdTaWxlbmNpYXIgbWljcsOzZm9ubydcIlxuICAgICAgPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiZmFcIlxuICAgICAgICAgIFtjbGFzcy5mYS1taWNyb3Bob25lXT1cIiFpc011dGVkXCJcbiAgICAgICAgICBbY2xhc3MuZmEtbWljcm9waG9uZS1zbGFzaF09XCJpc011dGVkXCJcbiAgICAgICAgPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBjb250cm9sLWJ0biBzd2FwLWJ0blwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVTd2FwKClcIlxuICAgICAgICB0aXRsZT1cIkludGVyY2FtYmlhciB2aXN0YVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJJbnRlcmNhbWJpYXIgdmlzdGFcIlxuICAgICAgPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXJlZnJlc2hcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gY29udHJvbC1idG4gcGlwLWJ0blwiXG4gICAgICAgIChjbGljayk9XCJtaW5pbWl6ZSgpXCJcbiAgICAgICAgdGl0bGU9XCJNaW5pbWl6YXIgKFBpY3R1cmUgaW4gUGljdHVyZSlcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiTWluaW1pemFyIHZpZGVvbGxhbWFkYVwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29tcHJlc3NcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gY29udHJvbC1idG4gaGFuZ3VwLWJ0blwiXG4gICAgICAgIChjbGljayk9XCJoYW5nVXAoKVwiXG4gICAgICAgIHRpdGxlPVwiRmluYWxpemFyIGxsYW1hZGFcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiRmluYWxpemFyIGxsYW1hZGFcIlxuICAgICAgPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBob25lXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFdhaXRpbmcgcm9vbSBub3RpZmljYXRpb24gKHNob3duIGZvciBPV05FUi9CQUNLT0ZGSUNFIG9ubHkpIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwid2FpdGluZy1ub3RpZmljYXRpb25cIlxuICAgICAgKm5nSWY9XCJ3YWl0aW5nUm9vbVVzZXJzLmxlbmd0aCA+IDAgJiYgY2FuQWRtaXRVc2Vyc1wiXG4gICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cIndhaXRpbmctdGV4dFwiPlxuICAgICAgICB7eyB3YWl0aW5nUm9vbVVzZXJzWzBdLm5hbWUgfX0gZXN0w6EgZW4gbGEgc2FsYSBkZSBlc3BlcmEuXG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYWRtaXQtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cImFkbWl0VXNlcih3YWl0aW5nUm9vbVVzZXJzWzBdLnVzZXJJZClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQWRtaXRpciB1c3VhcmlvXCJcbiAgICAgID5cbiAgICAgICAgQWRtaXRpclxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiZGlzbWlzcy1idG5cIlxuICAgICAgICAoY2xpY2spPVwiZGlzbWlzc1dhaXRpbmdOb3RpZmljYXRpb24od2FpdGluZ1Jvb21Vc2Vyc1swXS51c2VySWQpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNlcnJhciBub3RpZmljYWNpw7NuXCJcbiAgICAgID5cbiAgICAgICAgw5dcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIE93bmVyIGdlb2xvY2F0aW9uIHBhbmVsIChmb3Igb3duZXJzIHRvIHJlcXVlc3QgdXNlciBsb2NhdGlvbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJ1c2VyLWdlby1wYW5lbFwiICpuZ0lmPVwic2hvdWxkU2hvd1VzZXJHZW9QYW5lbCB8fCBkZXZNb2RlRW5hYmxlZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWdlby1oZWFkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItdGl0bGUtcm93XCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbWFwLW1hcmtlciBoZWFkZXItaWNvblwiICpuZ0lmPVwidXNlckdlb1ZpZXdTdGF0ZSAhPT0gVXNlckdlb1ZpZXdTdGF0ZS5JTklUSUFMXCI+PC9pPlxuICAgICAgICA8aDM+VWJpY2FjacOzbiBkZWwgY29sYWJvcmFkb3I8L2gzPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNldFVzZXJHZW9WaWV3U3RhdGUoVXNlckdlb1ZpZXdTdGF0ZS5ISURERU4pXCIgYXJpYS1sYWJlbD1cIkNlcnJhclwiPsOXPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1nZW8tZGVzY3JpcHRpb25cIiAqbmdJZj1cInVzZXJHZW9WaWV3U3RhdGUgIT09IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZJRUQgJiYgdXNlckdlb1ZpZXdTdGF0ZSAhPT0gVXNlckdlb1ZpZXdTdGF0ZS5ERU5JRURcIj5cbiAgICAgIDxwPkVsIGNvbGFib3JhZG9yIHRpZW5lIGxhIHViaWNhY2nDs24gZGVzYWN0aXZhZGEsIHNvbGljaXRhIHF1ZSBsYSBhY3RpdmUuPC9wPlxuICAgICAgPHA+RXN0YSBhY2Npw7NuIG5vcyBwZXJtaXRpcsOhIGRpc3BvbmliaWxpemFyIGFsZ3VuYXMgYWxlcnRhcy48L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1nZW8tY29udGVudFwiPlxuICAgICAgPCEtLSBJTklUSUFMIHN0YXRlOiBqdXN0IHRoZSBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlckdlb1ZpZXdTdGF0ZSA9PT0gVXNlckdlb1ZpZXdTdGF0ZS5JTklUSUFMXCI+XG4gICAgICAgIDwhLS0gc3BhY2VyIC0tPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gVkVSSUZZSU5HIHN0YXRlOiBzcGlubmVyICsgbG9hZGluZyBtZXNzYWdlIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXJHZW9WaWV3U3RhdGUgPT09IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZZSU5HXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWdlby12ZXJpZnlpbmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvLXNwaW5uZXItbGFyZ2VcIj48L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cInZlcmlmeWluZy10aXRsZVwiPlZlcmlmaWNhbmRvIHViaWNhY2nDs24uLi48L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ2ZXJpZnlpbmctc3VidGl0bGVcIj5Fc3RvIHB1ZWRlIHRhcmRhciB1bm9zIHNlZ3VuZG9zLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBWRVJJRklFRCBzdGF0ZTogaG9tZSBpY29uIHdpdGggc3BhcmtsZXMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlckdlb1ZpZXdTdGF0ZSA9PT0gVXNlckdlb1ZpZXdTdGF0ZS5WRVJJRklFRFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1nZW8tdmVyaWZpZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVyaWZpZWQtaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaG9tZS1pY29uXCIgW2lubmVySFRNTF09XCJob21lSWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cInZlcmlmaWVkLXRpdGxlXCI+TGEgdWJpY2FjacOzbiBmdWUgdmVyaWZpY2FkYTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBERU5JRUQgc3RhdGU6IGVycm9yIGljb24gYW5kIG1lc3NhZ2UgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlckdlb1ZpZXdTdGF0ZSA9PT0gVXNlckdlb1ZpZXdTdGF0ZS5ERU5JRURcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItZ2VvLWRlbmllZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZW5pZWQtaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZGVuaWVkLXRpdGxlXCI+TGEgdWJpY2FjacOzbiBmdWUgcmVjaGF6YWRhPC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwiZGVuaWVkLXN1YnRpdGxlXCI+RWwgY29sYWJvcmFkb3Igbm8gcGVybWl0acOzIGVsIGFjY2VzbyBhIHN1IHViaWNhY2nDs24uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBCdXR0b24gKGhpZGRlbiBpbiB2ZXJpZmllZCBhbmQgZGVuaWVkIHN0YXRlcykgLS0+XG4gICAgPGJ1dHRvbiBcbiAgICAgIGNsYXNzPVwidXNlci1nZW8tYnRuXCIgXG4gICAgICAqbmdJZj1cInVzZXJHZW9WaWV3U3RhdGUgIT09IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZJRUQgJiYgdXNlckdlb1ZpZXdTdGF0ZSAhPT0gVXNlckdlb1ZpZXdTdGF0ZS5ERU5JRURcIlxuICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInVzZXJHZW9WaWV3U3RhdGUgPT09IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZZSU5HXCJcbiAgICAgIFtkaXNhYmxlZF09XCJ1c2VyR2VvVmlld1N0YXRlID09PSBVc2VyR2VvVmlld1N0YXRlLlZFUklGWUlOR1wiXG4gICAgICAoY2xpY2spPVwicmVxdWVzdFVzZXJMb2NhdGlvbigpXCI+XG4gICAgICBWZXJpZmljYXIgdWJpY2FjacOzblxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBEZXYgY29udHJvbHMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImRldi1jb250cm9sc1wiICpuZ0lmPVwiZGV2TW9kZUVuYWJsZWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZGV2LWxhYmVsXCI+RGV2Ojwvc3Bhbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJkZXYtYnRuXCIgKGNsaWNrKT1cInNldFVzZXJHZW9WaWV3U3RhdGUoVXNlckdlb1ZpZXdTdGF0ZS5JTklUSUFMKVwiPkluaXRpYWw8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJkZXYtYnRuXCIgKGNsaWNrKT1cInNldFVzZXJHZW9WaWV3U3RhdGUoVXNlckdlb1ZpZXdTdGF0ZS5WRVJJRllJTkcpXCI+VmVyaWZ5aW5nPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZGV2LWJ0blwiIChjbGljayk9XCJzZXRVc2VyR2VvVmlld1N0YXRlKFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZJRUQpXCI+VmVyaWZpZWQ8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJkZXYtYnRuXCIgKGNsaWNrKT1cInNldFVzZXJHZW9WaWV3U3RhdGUoVXNlckdlb1ZpZXdTdGF0ZS5ERU5JRUQpXCI+RGVuaWVkPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZGV2LWJ0blwiIChjbGljayk9XCJzZXRVc2VyR2VvVmlld1N0YXRlKFVzZXJHZW9WaWV3U3RhdGUuSElEREVOKVwiPkhpZGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19