@tiba-spark/client-shared-lib 10.4.0-319 → 10.4.0-331

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.
@@ -0,0 +1,602 @@
1
+ import { __decorate } from "tslib";
2
+ import { DatePipe } from '@angular/common';
3
+ import { Injectable } from '@angular/core';
4
+ import { Action, Selector, State } from '@ngxs/store';
5
+ import { tap } from 'rxjs/operators';
6
+ import { NotificationClass } from '../../components/notification/notification-config';
7
+ import { Localization, ProfileTypeText } from '../../enums';
8
+ import { Cloud, Edge } from '../../service-proxy';
9
+ import { createMessageText, getAddress, lowerCaseFirstLetter, markEntitiesAsChanged, markEntityAsUnchanged, RowOperation } from '../../utils';
10
+ import { SendEmailFromEntityAction } from '../email-server/email-server.actions';
11
+ import { FacilityState } from '../facility/facility.state';
12
+ import { ClearGuestAction, ClearGuestProfilesAction, ClearGuestsListAction, CollapsedGuestsByBatchIdAction, CreateBasicBatchAction, CreateBasicGuestAction, CreateBatchAction, CreateGuestAction, DeleteGuestAction, ExpandGuestsByBatchIdAction, ExportGuestsAction, LoadGuestByIdAction, LoadGuestProfilesAction, LoadGuestsAction, LoadGuestsByBatchIdAction, LoadGuestsByBatchIdCancelledAction, SendEmailToGuest, SendGuestPassesToEmailAction, SetGuestsAction, UpdateBasicGuestAction, UpdateBasicGuestTempAction, UpdateGuestAction, UpdateGuestLocationAction } from './guest.actions';
13
+ var GuestEntityParams = Edge.GuestEntityParams;
14
+ var ProfileType = Edge.ProfileType;
15
+ var VGuestWithBatchDto = Edge.VGuestWithBatchDto;
16
+ var SendEmailRequestDto = Cloud.SendEmailRequestDto;
17
+ var TemplateType = Cloud.TemplateType;
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "@ngxs/store";
20
+ import * as i2 from "../../service-proxy";
21
+ import * as i3 from "@ngx-translate/core";
22
+ import * as i4 from "../../components/message-bar/message-bar.service";
23
+ import * as i5 from "../../components/notification/command-notification/command-notification.service";
24
+ import * as i6 from "../../services/tenant.service";
25
+ import * as i7 from "../../services/export-file.service";
26
+ import * as i8 from "../parker/parker.service";
27
+ export class VGuestWithBatchTableData extends VGuestWithBatchDto {
28
+ }
29
+ ;
30
+ let GuestState = class GuestState {
31
+ constructor(store, guestServiceProxy, translate, batchServiceProxy, messageBarService, commandNotificationService, translateService, tenantService, exportFileService, parkerService) {
32
+ this.store = store;
33
+ this.guestServiceProxy = guestServiceProxy;
34
+ this.translate = translate;
35
+ this.batchServiceProxy = batchServiceProxy;
36
+ this.messageBarService = messageBarService;
37
+ this.commandNotificationService = commandNotificationService;
38
+ this.translateService = translateService;
39
+ this.tenantService = tenantService;
40
+ this.exportFileService = exportFileService;
41
+ this.parkerService = parkerService;
42
+ this.datePipe = new DatePipe('en-US');
43
+ this.L = Localization;
44
+ this.toDateString = (value) => this.datePipe.transform(value.toDate(), this.tenantService.secondaryDateTimeFormat) || '-';
45
+ this.isGuestChild = (guest) => guest.guestID !== null && guest.batchID > 0;
46
+ }
47
+ static guestCounter(state) {
48
+ return state.counter;
49
+ }
50
+ static archivedGuests(state) {
51
+ return state.archived;
52
+ }
53
+ static displayedGuests(state) {
54
+ return state.displayed;
55
+ }
56
+ static profiles(state) {
57
+ return state.profiles;
58
+ }
59
+ static selected(state) {
60
+ return state.selected;
61
+ }
62
+ onLoadGuestByIdAction(ctx, action) {
63
+ const getGuest$ = this.guestServiceProxy.getGuestById(action.guestId, action.parkId, action.guid);
64
+ return getGuest$.pipe(tap(guest => {
65
+ ctx.patchState({
66
+ selected: guest.data
67
+ });
68
+ }));
69
+ }
70
+ onClearGuestAction(ctx) {
71
+ ctx.patchState({
72
+ selected: null
73
+ });
74
+ }
75
+ onLoadGuestsAction(ctx, action) {
76
+ const getGuests$ = this.guestServiceProxy.getGuests(action.parkId, action.guid, action.guestsFilterDto);
77
+ return getGuests$.pipe(tap((guestsWrapper) => {
78
+ ctx.patchState({
79
+ archived: guestsWrapper.data.entities,
80
+ counter: guestsWrapper.data.counter,
81
+ });
82
+ }));
83
+ }
84
+ onSetGuestsAction(ctx, action) {
85
+ ctx.patchState({
86
+ displayed: action.guests || [],
87
+ });
88
+ }
89
+ onClearGuestListAction(ctx) {
90
+ ctx.patchState({
91
+ archived: [],
92
+ displayed: [],
93
+ counter: 0,
94
+ });
95
+ }
96
+ onCreateGuestAction(ctx, action) {
97
+ const messageBarPayload = {
98
+ entity: this.translate.instant(Localization.guest),
99
+ entityName: `${action.guest.firstName} ${action.guest.lastName}`,
100
+ action: lowerCaseFirstLetter(this.translate.instant(Localization.created)),
101
+ };
102
+ this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
103
+ return this.guestServiceProxy.createGuest(action.guid, action.guest).pipe(tap({
104
+ next: (handled) => {
105
+ const displayNewGuestInTable = this.isGuestCreatedFromSelectedFacility(handled.data, action.guid);
106
+ this.addGuestToStore(ctx, handled.data, displayNewGuestInTable);
107
+ this.messageBarService.success(displayNewGuestInTable ? Localization.entity_success : Localization.entity_success_not_currently_visible, createMessageText(messageBarPayload));
108
+ },
109
+ error: () => {
110
+ messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
111
+ messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.create));
112
+ this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
113
+ }
114
+ }));
115
+ }
116
+ onCreateBatchAction(ctx, action) {
117
+ const messageBarPayload = {
118
+ entity: this.translate.instant(Localization.guest_group),
119
+ entityName: action.batchCommand.name,
120
+ action: lowerCaseFirstLetter(this.translate.instant(Localization.created)),
121
+ };
122
+ this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
123
+ return this.batchServiceProxy.createBatch(action.facilityWithGuid.guid, action.batchCommand).pipe(tap({
124
+ next: (newGuests) => {
125
+ const displayNewGuestInTable = this.isGuestCreatedFromSelectedFacility(newGuests.data[0], action.facilityWithGuid.guid);
126
+ this.messageBarService.success(displayNewGuestInTable ? Localization.entity_success : Localization.entity_success_not_currently_visible, createMessageText(messageBarPayload));
127
+ if (displayNewGuestInTable) {
128
+ const newBatch = this.convertGuestsToTableData(newGuests.data);
129
+ markEntitiesAsChanged([newBatch], RowOperation.Insert);
130
+ markEntitiesAsChanged(newBatch.entities, RowOperation.Insert);
131
+ const displayedGuests = ctx.getState().displayed;
132
+ displayedGuests.unshift(...newBatch.entities);
133
+ displayedGuests.unshift(newBatch);
134
+ ctx.patchState({
135
+ displayed: [...displayedGuests],
136
+ counter: ctx.getState().counter + 1,
137
+ });
138
+ }
139
+ },
140
+ error: (e) => {
141
+ action.errorMessage = e.data.detail;
142
+ }
143
+ }));
144
+ }
145
+ onCreateBasicBatchAction(ctx, action) {
146
+ const messageBarPayload = {
147
+ entity: this.translate.instant(Localization.guest_group),
148
+ entityName: action.batchCommand.name,
149
+ action: lowerCaseFirstLetter(this.translate.instant(Localization.created)),
150
+ };
151
+ this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
152
+ return this.batchServiceProxy.createBasicBatch(action.facilityWithGuid.guid, action.batchCommand).pipe(tap({
153
+ next: (newGuests) => {
154
+ const displayNewGuestInTable = this.isGuestCreatedFromSelectedFacility(newGuests.data[0], action.facilityWithGuid.guid);
155
+ this.messageBarService.success(displayNewGuestInTable ? Localization.entity_success : Localization.entity_success_not_currently_visible, createMessageText(messageBarPayload));
156
+ if (displayNewGuestInTable) {
157
+ const newBatch = this.convertGuestsToTableData(newGuests.data);
158
+ markEntitiesAsChanged([newBatch], RowOperation.Insert);
159
+ markEntitiesAsChanged(newBatch.entities, RowOperation.Insert);
160
+ const displayedGuests = ctx.getState().displayed;
161
+ displayedGuests.unshift(...newBatch.entities);
162
+ displayedGuests.unshift(newBatch);
163
+ ctx.patchState({
164
+ displayed: [...displayedGuests],
165
+ counter: ctx.getState().counter + 1,
166
+ });
167
+ }
168
+ },
169
+ error: (e) => {
170
+ action.errorMessage = e.data.detail;
171
+ }
172
+ }));
173
+ }
174
+ onUpdateGuestAction(ctx, action) {
175
+ const messageBarPayload = {
176
+ entity: this.translate.instant(Localization.guest),
177
+ entityName: `${action.guest.firstName} ${action.guest.lastName}`,
178
+ action: this.translate.instant(Localization.updated),
179
+ };
180
+ this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
181
+ return this.guestServiceProxy.updateGuest(action.guid, action.guest).pipe(tap({
182
+ next: (handled) => {
183
+ this.updateGuestInStore(ctx, handled.data, action.guid);
184
+ this.messageBarService.success(Localization.entity_success, createMessageText(messageBarPayload));
185
+ },
186
+ error: () => {
187
+ messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
188
+ messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.update));
189
+ this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
190
+ }
191
+ }));
192
+ }
193
+ onUpdateGuestLocationAction(ctx, action) {
194
+ debugger;
195
+ const config = {
196
+ messages: [{ value: action.updateGuestLocationCommand.name, class: NotificationClass.body }],
197
+ command: this.translateService.instant(Localization.update_location)
198
+ };
199
+ const guest$ = this.guestServiceProxy.updateGuestLocation(action.guid, action.updateGuestLocationCommand);
200
+ return guest$.pipe(this.commandNotificationService.display(config));
201
+ }
202
+ onDeleteGuestAction(ctx, action) {
203
+ const interpolatedGuestName = action.guest.name.trim() === Localization.card_holder ?
204
+ this.translateService.instant(Localization.card_holder) : action.guest.name;
205
+ const messageBarPayload = {
206
+ entity: this.translate.instant(Localization.guest),
207
+ entityName: interpolatedGuestName,
208
+ action: this.translate.instant(Localization.deleted),
209
+ };
210
+ this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
211
+ return this.guestServiceProxy.deleteGuest(action.guest.guestID, action.guest.parkID, action.guid).pipe(tap(() => {
212
+ this.messageBarService.success(Localization.entity_success, createMessageText(messageBarPayload));
213
+ action.guest.deleted = 1;
214
+ this.deleteGuestFromStore(ctx, action.guest, action.guid);
215
+ }, () => {
216
+ messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
217
+ messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.delete));
218
+ this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
219
+ }));
220
+ }
221
+ onCreateBasicGuestAction(ctx, action) {
222
+ const messageBarPayload = {
223
+ entity: this.translate.instant(Localization.guest),
224
+ entityName: `${action.guest.firstName} ${action.guest.lastName}`,
225
+ action: lowerCaseFirstLetter(this.translate.instant(Localization.created)),
226
+ };
227
+ this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
228
+ return this.guestServiceProxy.createBasicGuest(action.guid, action.guest).pipe(tap({
229
+ next: (handled) => {
230
+ const displayNewGuestInTable = this.isGuestCreatedFromSelectedFacility(handled.data, action.guid);
231
+ this.addGuestToStore(ctx, handled.data, displayNewGuestInTable);
232
+ this.messageBarService.success(displayNewGuestInTable ? Localization.entity_success : Localization.entity_success_not_currently_visible, createMessageText(messageBarPayload));
233
+ },
234
+ error: () => {
235
+ messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
236
+ messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.create));
237
+ this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
238
+ }
239
+ }));
240
+ }
241
+ onUpdateBasicGuestAction(ctx, action) {
242
+ const messageBarPayload = {
243
+ entity: this.translate.instant(Localization.guest),
244
+ entityName: `${action.guest.firstName} ${action.guest.lastName}`,
245
+ action: this.translate.instant(Localization.updated),
246
+ };
247
+ this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
248
+ return this.guestServiceProxy.updateBasicGuest(action.guid, action.guest).pipe(tap({
249
+ next: (handled) => this.onUpdateBasicGuestNext(ctx, action, handled, messageBarPayload),
250
+ error: () => this.onUpdateBasicGuestError(messageBarPayload)
251
+ }));
252
+ }
253
+ onUpdateBasicGuestTempAction(ctx, action) {
254
+ const messageBarPayload = {
255
+ entity: this.translate.instant(Localization.guest),
256
+ entityName: `${action.guest.firstName} ${action.guest.lastName}`,
257
+ action: this.translate.instant(Localization.updated),
258
+ };
259
+ this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
260
+ return this.guestServiceProxy.updateBasicGuestTemp(action.guid, action.guest).pipe(tap({
261
+ next: (handled) => this.onUpdateBasicGuestNext(ctx, action, handled, messageBarPayload),
262
+ error: () => this.onUpdateBasicGuestError(messageBarPayload)
263
+ }));
264
+ }
265
+ onSendEmailToGuestAction(ctx, action) {
266
+ return this.guestServiceProxy.sendGuestEmail(action.guid, action.sendEmailCommand).pipe(tap({
267
+ next: () => this.messageBarService.success(Localization.email_sent_successfully),
268
+ error: () => this.messageBarService.error(Localization.email_sending_failed),
269
+ }));
270
+ }
271
+ onLoadGuestsByBatchId(ctx, action) {
272
+ const results$ = this.guestServiceProxy.getGuestsByBatchID(action.parkId, action.batchID, action.guid, action.guestsFilterDto);
273
+ return results$.pipe(tap((guests) => {
274
+ this.addGuestsByBatchIdToStore(ctx, action.batchID, guests.data);
275
+ }));
276
+ }
277
+ onLoadGuestsByBatchIdCancelledAction(ctx, action) {
278
+ const displayedGuestsBatches = ctx.getState().displayed;
279
+ const guestBatchIndex = displayedGuestsBatches.findIndex(guest => guest instanceof VGuestWithBatchDto && guest.batchID === action.batchId);
280
+ if (guestBatchIndex !== -1) {
281
+ const guestBatch = markEntityAsUnchanged(displayedGuestsBatches[guestBatchIndex]);
282
+ displayedGuestsBatches[guestBatchIndex] = Object.assign(new VGuestWithBatchDto(), guestBatch);
283
+ ctx.patchState({
284
+ displayed: [...displayedGuestsBatches]
285
+ });
286
+ }
287
+ }
288
+ onExpandGuestsByBatchIdAction(ctx, action) {
289
+ this.addGuestsByBatchIdToStore(ctx, action.batchID, action.guests);
290
+ }
291
+ onCollapsedGuestsByBatchIdAction(ctx, action) {
292
+ let displayedGusetBatches = ctx.getState().displayed;
293
+ const guestBatchIndex = displayedGusetBatches.findIndex(gb => gb.batchID === action.batchID);
294
+ if (guestBatchIndex !== -1) {
295
+ displayedGusetBatches = displayedGusetBatches.filter(entity => entity.batchID !== action.batchID || !entity.guestID);
296
+ ctx.patchState({
297
+ displayed: [...displayedGusetBatches],
298
+ });
299
+ }
300
+ }
301
+ onLoadGuestProfilesAction(ctx, action) {
302
+ const guestProfiles$ = this.guestServiceProxy.getProfiles(action.parkId, action.searchParamsDto?.maxResults, action.searchParamsDto?.searchTerm, action.searchParamsDto?.orderBy.column, action.searchParamsDto?.orderBy.orderDirection, action.guid);
303
+ return guestProfiles$.pipe(tap(profiles => {
304
+ ctx.patchState({
305
+ profiles: profiles.data,
306
+ });
307
+ }));
308
+ }
309
+ onClearGuestProfilesAction(ctx) {
310
+ ctx.patchState({
311
+ profiles: [],
312
+ });
313
+ }
314
+ async onSendGuestPassesToEmail(ctx, action) {
315
+ const data = {
316
+ modalTitle: this.translate.instant(Localization.send_stickers_to_email),
317
+ sendEmail: false,
318
+ sendEmailReqeust: await this.populateSendEmailRequest(action) // only version >= 8.1 support this feature
319
+ };
320
+ data.sendEmailReqeust.to = action.email;
321
+ ctx.dispatch(new SendEmailFromEntityAction(data.sendEmailReqeust));
322
+ }
323
+ onExportGuestsAction(ctx, action) {
324
+ const getGuests$ = this.guestServiceProxy.getGuests(action.parkId, action.guid, action.guestsFilterDto);
325
+ return getGuests$.pipe(tap({
326
+ next: (guestsWrapper) => {
327
+ const tableRows = [];
328
+ const guestWithBatchDtoList = guestsWrapper.data.entities;
329
+ guestWithBatchDtoList.forEach((guest) => {
330
+ tableRows.push([guest.name,
331
+ this.translate.instant(ProfileTypeText[ProfileType[guest.mType]]),
332
+ guest.mobile,
333
+ guest.carPlate,
334
+ this.exportFileService.getDateFieldValue(action.fileType, guest, 'validFromDate'),
335
+ this.exportFileService.getDateFieldValue(action.fileType, guest, 'validToDate'),
336
+ guest.companyName,
337
+ guest.subCompanyName,
338
+ this.parkerService.getHistoryItemAction(guest.location, null),
339
+ this.exportFileService.getDateFieldValue(action.fileType, guest, 'producedDate')]);
340
+ });
341
+ this.exportFileService.export(action.fileType, tableRows, action.columnsHeader, Localization.guests);
342
+ },
343
+ error: () => {
344
+ this.messageBarService.error(this.translateService.instant(this.L.failed_export_file));
345
+ }
346
+ }));
347
+ }
348
+ addGuestsByBatchIdToStore(ctx, batchID, guests) {
349
+ const displayedGusetBatches = ctx.getState().displayed;
350
+ const guestBatchIndex = displayedGusetBatches.findIndex(gb => gb.batchID === batchID);
351
+ if (guestBatchIndex !== -1) {
352
+ displayedGusetBatches[guestBatchIndex].entities = guests;
353
+ displayedGusetBatches.splice(guestBatchIndex + 1, 0, ...guests);
354
+ ctx.patchState({
355
+ displayed: [...displayedGusetBatches],
356
+ });
357
+ }
358
+ }
359
+ convertGuestsToTableData(guests) {
360
+ const batch = guests.find(g => g.batchID > 0 && g.guestID === null);
361
+ batch.isRowExpandable = true;
362
+ batch.entities = guests.filter(g => g.batchID !== null && g.guestID !== null);
363
+ return batch;
364
+ }
365
+ addGuestToStore(ctx, guest, displayNewGuestInTable) {
366
+ if (displayNewGuestInTable) {
367
+ const displayedGuests = ctx.getState().displayed;
368
+ markEntitiesAsChanged([guest], RowOperation.Insert);
369
+ displayedGuests.unshift(guest);
370
+ ctx.patchState({
371
+ displayed: [...displayedGuests],
372
+ counter: ctx.getState().counter + 1,
373
+ });
374
+ }
375
+ }
376
+ isGuestCreatedFromSelectedFacility(guest, guid) {
377
+ const selectedParkID = this.store.selectSnapshot(FacilityState.parkId);
378
+ const selectedGuid = this.store.selectSnapshot(FacilityState.guid);
379
+ return selectedParkID === guest.parkID && selectedGuid === guid;
380
+ }
381
+ getParantAndChildIndex(ctx, guestDto) {
382
+ const displayedGuests = ctx.getState().displayed;
383
+ // if I am children find my parent, after that find me
384
+ const parent = displayedGuests.findIndex(guest => guest.batchID === guestDto.batchID && guest.guestID === null);
385
+ const child = (displayedGuests[parent].entities || []).findIndex(guest => guest.guestID === guestDto.guestID);
386
+ return { parent, child };
387
+ }
388
+ updateGuestInStore(ctx, guest, guid) {
389
+ const displayedGuests = ctx.getState().displayed;
390
+ const guestIndex = this.getGuestIndex(displayedGuests, guest.guestID);
391
+ if (guestIndex !== -1) {
392
+ displayedGuests[guestIndex] = guest;
393
+ markEntitiesAsChanged([guest], RowOperation.Update);
394
+ }
395
+ if (this.isGuestChild(guest)) {
396
+ const { child, parent } = this.getParantAndChildIndex(ctx, guest);
397
+ if (parent !== -1) {
398
+ if (child !== -1) {
399
+ displayedGuests[parent].entities[child] = guest;
400
+ }
401
+ markEntitiesAsChanged([displayedGuests[parent]]);
402
+ }
403
+ }
404
+ ctx.patchState({
405
+ displayed: [...displayedGuests],
406
+ });
407
+ }
408
+ deleteGuestFromStore(ctx, guest, guid) {
409
+ let counter = ctx.getState().counter;
410
+ const displayedGuests = ctx.getState().displayed;
411
+ const guestIndex = this.getGuestIndex(displayedGuests, guest.guestID);
412
+ if (guestIndex !== -1) {
413
+ displayedGuests.splice(guestIndex, 1);
414
+ markEntitiesAsChanged([guest], RowOperation.Delete);
415
+ }
416
+ if (this.isGuestChild(guest)) {
417
+ const { child, parent } = this.getParantAndChildIndex(ctx, guest);
418
+ if (parent !== -1) {
419
+ if (child !== -1) {
420
+ displayedGuests[parent].entities.splice(child, 1);
421
+ }
422
+ markEntitiesAsChanged([displayedGuests[parent]]);
423
+ }
424
+ }
425
+ else {
426
+ counter--;
427
+ }
428
+ ctx.patchState({
429
+ displayed: [...displayedGuests],
430
+ counter: counter,
431
+ });
432
+ }
433
+ async populateSendEmailRequest(action) {
434
+ let pdfPagesParametersList = [];
435
+ let guestEmailTemplate = '';
436
+ if (action.guest.entities && action.guest.entities.length > 0) {
437
+ pdfPagesParametersList = [];
438
+ action.guest.entities.forEach(guest => {
439
+ const paramList = this.getParameters(guest, action.facility);
440
+ pdfPagesParametersList.push(paramList);
441
+ });
442
+ guestEmailTemplate = action.guest.batchName;
443
+ }
444
+ else {
445
+ pdfPagesParametersList.push(this.getParameters(action.guest, action.facility));
446
+ guestEmailTemplate = action.guest.name;
447
+ }
448
+ const sendEmailRequest = new SendEmailRequestDto({
449
+ entity: new GuestEntityParams({
450
+ qrPlainText: action.guest.qrPlainText,
451
+ id: action.guest.guestID || action.guest.batchID,
452
+ qrCode: action.guest.qrCode
453
+ }),
454
+ to: action.email,
455
+ templateType: TemplateType.Guest,
456
+ pdfPagesParametersList,
457
+ pdfPagesParameters: null,
458
+ parameters: {
459
+ guestEmailTemplate,
460
+ }
461
+ });
462
+ return sendEmailRequest;
463
+ }
464
+ getParameters(guest, facility) {
465
+ const parameters = {
466
+ validFromDateTime: this.toDateString(guest.validFromDate),
467
+ validToDateTime: this.toDateString(guest.validToDate),
468
+ companyName: guest.companyName,
469
+ subCompanyName: guest.subCompanyName,
470
+ parkName: facility?.data?.name,
471
+ producedDateTime: this.toDateString(guest.producedDate),
472
+ id: guest.guestID,
473
+ firstName: guest.firstName,
474
+ lastName: guest.lastName,
475
+ plateId: guest.carPlate,
476
+ name: guest.name,
477
+ card: guest.credit,
478
+ address: getAddress(guest.city, guest.street),
479
+ qrCode: guest.qrCode,
480
+ guid: facility.guid,
481
+ parkId: facility.data.id,
482
+ qrPlainText: guest.qrPlainText
483
+ };
484
+ return parameters;
485
+ }
486
+ getGuestIndex(displayedGuests, guestId) {
487
+ return displayedGuests.findIndex(guest => guest.guestID === guestId);
488
+ }
489
+ onUpdateBasicGuestNext(ctx, action, handled, messageBarPayload) {
490
+ this.updateGuestInStore(ctx, handled.data, action.guid);
491
+ this.messageBarService.success(Localization.entity_success, createMessageText(messageBarPayload));
492
+ }
493
+ onUpdateBasicGuestError(messageBarPayload) {
494
+ messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
495
+ messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.update));
496
+ this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
497
+ }
498
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuestState, deps: [{ token: i1.Store }, { token: i2.Edge.GuestServiceProxy }, { token: i3.TranslateService }, { token: i2.Edge.BatchServiceProxy }, { token: i4.MessageBarService }, { token: i5.CommandNotificationService }, { token: i3.TranslateService }, { token: i6.TenantService }, { token: i7.ExportFileService }, { token: i8.ParkerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
499
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuestState }); }
500
+ };
501
+ __decorate([
502
+ Action(LoadGuestByIdAction, { cancelUncompleted: true })
503
+ ], GuestState.prototype, "onLoadGuestByIdAction", null);
504
+ __decorate([
505
+ Action(ClearGuestAction, { cancelUncompleted: true })
506
+ ], GuestState.prototype, "onClearGuestAction", null);
507
+ __decorate([
508
+ Action(LoadGuestsAction, { cancelUncompleted: true })
509
+ ], GuestState.prototype, "onLoadGuestsAction", null);
510
+ __decorate([
511
+ Action(SetGuestsAction)
512
+ ], GuestState.prototype, "onSetGuestsAction", null);
513
+ __decorate([
514
+ Action(ClearGuestsListAction)
515
+ ], GuestState.prototype, "onClearGuestListAction", null);
516
+ __decorate([
517
+ Action(CreateGuestAction)
518
+ ], GuestState.prototype, "onCreateGuestAction", null);
519
+ __decorate([
520
+ Action(CreateBatchAction)
521
+ ], GuestState.prototype, "onCreateBatchAction", null);
522
+ __decorate([
523
+ Action(CreateBasicBatchAction)
524
+ ], GuestState.prototype, "onCreateBasicBatchAction", null);
525
+ __decorate([
526
+ Action(UpdateGuestAction)
527
+ ], GuestState.prototype, "onUpdateGuestAction", null);
528
+ __decorate([
529
+ Action(UpdateGuestLocationAction)
530
+ ], GuestState.prototype, "onUpdateGuestLocationAction", null);
531
+ __decorate([
532
+ Action(DeleteGuestAction)
533
+ ], GuestState.prototype, "onDeleteGuestAction", null);
534
+ __decorate([
535
+ Action(CreateBasicGuestAction)
536
+ ], GuestState.prototype, "onCreateBasicGuestAction", null);
537
+ __decorate([
538
+ Action(UpdateBasicGuestAction)
539
+ ], GuestState.prototype, "onUpdateBasicGuestAction", null);
540
+ __decorate([
541
+ Action(UpdateBasicGuestTempAction)
542
+ ], GuestState.prototype, "onUpdateBasicGuestTempAction", null);
543
+ __decorate([
544
+ Action(SendEmailToGuest)
545
+ ], GuestState.prototype, "onSendEmailToGuestAction", null);
546
+ __decorate([
547
+ Action(LoadGuestsByBatchIdAction, { cancelUncompleted: true })
548
+ ], GuestState.prototype, "onLoadGuestsByBatchId", null);
549
+ __decorate([
550
+ Action(LoadGuestsByBatchIdCancelledAction, { cancelUncompleted: false })
551
+ ], GuestState.prototype, "onLoadGuestsByBatchIdCancelledAction", null);
552
+ __decorate([
553
+ Action(ExpandGuestsByBatchIdAction)
554
+ ], GuestState.prototype, "onExpandGuestsByBatchIdAction", null);
555
+ __decorate([
556
+ Action(CollapsedGuestsByBatchIdAction)
557
+ ], GuestState.prototype, "onCollapsedGuestsByBatchIdAction", null);
558
+ __decorate([
559
+ Action(LoadGuestProfilesAction, { cancelUncompleted: true })
560
+ ], GuestState.prototype, "onLoadGuestProfilesAction", null);
561
+ __decorate([
562
+ Action(ClearGuestProfilesAction)
563
+ ], GuestState.prototype, "onClearGuestProfilesAction", null);
564
+ __decorate([
565
+ Action(SendGuestPassesToEmailAction)
566
+ ], GuestState.prototype, "onSendGuestPassesToEmail", null);
567
+ __decorate([
568
+ Action(ExportGuestsAction, { cancelUncompleted: true })
569
+ ], GuestState.prototype, "onExportGuestsAction", null);
570
+ __decorate([
571
+ Selector()
572
+ ], GuestState, "guestCounter", null);
573
+ __decorate([
574
+ Selector()
575
+ ], GuestState, "archivedGuests", null);
576
+ __decorate([
577
+ Selector()
578
+ ], GuestState, "displayedGuests", null);
579
+ __decorate([
580
+ Selector()
581
+ ], GuestState, "profiles", null);
582
+ __decorate([
583
+ Selector()
584
+ ], GuestState, "selected", null);
585
+ GuestState = __decorate([
586
+ State({
587
+ name: 'guest',
588
+ defaults: {
589
+ archived: [],
590
+ displayed: [],
591
+ counter: 0,
592
+ guest: null,
593
+ profiles: [],
594
+ selected: null,
595
+ },
596
+ })
597
+ ], GuestState);
598
+ export { GuestState };
599
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuestState, decorators: [{
600
+ type: Injectable
601
+ }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.Edge.GuestServiceProxy }, { type: i3.TranslateService }, { type: i2.Edge.BatchServiceProxy }, { type: i4.MessageBarService }, { type: i5.CommandNotificationService }, { type: i3.TranslateService }, { type: i6.TenantService }, { type: i7.ExportFileService }, { type: i8.ParkerService }]; }, propDecorators: { onLoadGuestByIdAction: [], onClearGuestAction: [], onLoadGuestsAction: [], onSetGuestsAction: [], onClearGuestListAction: [], onCreateGuestAction: [], onCreateBatchAction: [], onCreateBasicBatchAction: [], onUpdateGuestAction: [], onUpdateGuestLocationAction: [], onDeleteGuestAction: [], onCreateBasicGuestAction: [], onUpdateBasicGuestAction: [], onUpdateBasicGuestTempAction: [], onSendEmailToGuestAction: [], onLoadGuestsByBatchId: [], onLoadGuestsByBatchIdCancelledAction: [], onExpandGuestsByBatchIdAction: [], onCollapsedGuestsByBatchIdAction: [], onLoadGuestProfilesAction: [], onClearGuestProfilesAction: [], onSendGuestPassesToEmail: [], onExportGuestsAction: [] } });
602
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Vlc3Quc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtc2hhcmVkLWxpYi9zcmMvbGlicmFyaWVzL21vZHVsZXMvZ3Vlc3QvZ3Vlc3Quc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBdUIsTUFBTSxhQUFhLENBQUM7QUFHM0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3JDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUksT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sRUFDTCxnQkFBZ0IsRUFBRSx3QkFBd0IsRUFBRSxxQkFBcUIsRUFBRSw4QkFBOEIsRUFDakcsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3ZHLDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUMvRyx5QkFBeUIsRUFB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LENBQUM7R0FDVyxVQUFVLENBb21CdEI7U0FwbUJZLFVBQVU7NEZBQVYsVUFBVTtrQkFadEIsVUFBVTtxWUF1RFQscUJBQXFCLE1BVXJCLGtCQUFrQixNQU9sQixrQkFBa0IsTUFXbEIsaUJBQWlCLE1BT2pCLHNCQUFzQixNQVN0QixtQkFBbUIsTUFnQ25CLG1CQUFtQixNQW1DbkIsd0JBQXdCLE1BbUN4QixtQkFBbUIsTUErQm5CLDJCQUEyQixNQVkzQixtQkFBbUIsTUErQm5CLHdCQUF3QixNQWdDeEIsd0JBQXdCLE1BY3hCLDRCQUE0QixNQWM1Qix3QkFBd0IsTUFReEIscUJBQXFCLE1BUXJCLG9DQUFvQyxNQWdCcEMsNkJBQTZCLE1BSzdCLGdDQUFnQyxNQVloQyx5QkFBeUIsTUFZekIsMEJBQTBCLE1BT3BCLHdCQUF3QixNQVc5QixvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb24sIFNlbGVjdG9yLCBTdGF0ZSwgU3RhdGVDb250ZXh0LCBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNZXNzYWdlQmFyUGF5bG9hZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbWVzc2FnZS1iYXIvbWVzc2FnZS1iYXItdGV4dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWVzc2FnZUJhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21lc3NhZ2UtYmFyL21lc3NhZ2UtYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbWFuZE5vdGlmaWNhdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL2NvbW1hbmQtbm90aWZpY2F0aW9uL2NvbW1hbmQtbm90aWZpY2F0aW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBDb21tYW5kTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL2NvbW1hbmQtbm90aWZpY2F0aW9uL2NvbW1hbmQtbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uQ2xhc3MgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24tY29uZmlnJztcbmltcG9ydCB7IExvY2FsaXphdGlvbiwgUHJvZmlsZVR5cGVUZXh0IH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgQ2xvdWQsIEVkZ2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlLXByb3h5JztcbmltcG9ydCB7IEV4cG9ydEZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhwb3J0LWZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBUZW5hbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVuYW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZVRleHQsIGdldEFkZHJlc3MsIGxvd2VyQ2FzZUZpcnN0TGV0dGVyLCBtYXJrRW50aXRpZXNBc0NoYW5nZWQsIG1hcmtFbnRpdHlBc1VuY2hhbmdlZCwgUm93T3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgU2VuZEVtYWlsRnJvbUVudGl0eUFjdGlvbiB9IGZyb20gJy4uL2VtYWlsLXNlcnZlci9lbWFpbC1zZXJ2ZXIuYWN0aW9ucyc7XG5pbXBvcnQgeyBGYWNpbGl0eVdpdGhHdWlkIH0gZnJvbSAnLi4vZmFjaWxpdHkvZmFjaWxpdHktd2l0aC1ndWlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGYWNpbGl0eVN0YXRlIH0gZnJvbSAnLi4vZmFjaWxpdHkvZmFjaWxpdHkuc3RhdGUnO1xuaW1wb3J0IHsgUGFya2VyU2VydmljZSB9IGZyb20gJy4uL3Bhcmtlci9wYXJrZXIuc2VydmljZSc7XG5pbXBvcnQge1xuICBDbGVhckd1ZXN0QWN0aW9uLCBDbGVhckd1ZXN0UHJvZmlsZXNBY3Rpb24sIENsZWFyR3Vlc3RzTGlzdEFjdGlvbiwgQ29sbGFwc2VkR3Vlc3RzQnlCYXRjaElkQWN0aW9uLFxuICBDcmVhdGVCYXNpY0JhdGNoQWN0aW9uLCBDcmVhdGVCYXNpY0d1ZXN0QWN0aW9uLCBDcmVhdGVCYXRjaEFjdGlvbiwgQ3JlYXRlR3Vlc3RBY3Rpb24sIERlbGV0ZUd1ZXN0QWN0aW9uLFxuICBFeHBhbmRHdWVzdHNCeUJhdGNoSWRBY3Rpb24sIEV4cG9ydEd1ZXN0c0FjdGlvbiwgTG9hZEd1ZXN0QnlJZEFjdGlvbiwgTG9hZEd1ZXN0UHJvZmlsZXNBY3Rpb24sIExvYWRHdWVzdHNBY3Rpb24sXG4gIExvYWRHdWVzdHNCeUJhdGNoSWRBY3Rpb24sIExvYWRHdWVzdHNCeUJhdGNoSWRDYW5jZWxsZWRBY3Rpb24sIFNlbmRFbWFpbFRvR3Vlc3QsIFNlbmRHdWVzdFBhc3Nlc1RvRW1haWxBY3Rpb24sXG4gIFNldEd1ZXN0c0FjdGlvbiwgVXBkYXRlQmFzaWNHdWVzdEFjdGlvbiwgVXBkYXRlQmFzaWNHdWVzdFRlbXBBY3Rpb24sIFVwZGF0ZUd1ZXN0QWN0aW9uLCBVcGRhdGVHdWVzdExvY2F0aW9uQWN0aW9uXG59IGZyb20gJy4vZ3Vlc3QuYWN0aW9ucyc7XG5cbmltcG9ydCBHdWVzdEVudGl0eVBhcmFtcyA9IEVkZ2UuR3Vlc3RFbnRpdHlQYXJhbXM7XG5pbXBvcnQgR3Vlc3RQcm9maWxlRHRvID0gRWRnZS5HdWVzdFByb2ZpbGVEdG87XG5pbXBvcnQgSW50MzJIdHRwUmVzcG9uc2VEYXRhID0gRWRnZS5JbnQzMkh0dHBSZXNwb25zZURhdGE7XG5pbXBvcnQgUHJvYmxlbURldGFpbHNIdHRwUmVzcG9uc2VEYXRhID0gRWRnZS5Qcm9ibGVtRGV0YWlsc0h0dHBSZXNwb25zZURhdGE7XG5pbXBvcnQgUHJvZmlsZVR5cGUgPSBFZGdlLlByb2ZpbGVUeXBlO1xuaW1wb3J0IFZHdWVzdFdpdGhCYXRjaER0byA9IEVkZ2UuVkd1ZXN0V2l0aEJhdGNoRHRvO1xuaW1wb3J0IFZHdWVzdFdpdGhCYXRjaER0b0VudGl0eVdyYXBwZXJEdG9IdHRwUmVzcG9uc2VEYXRhID0gRWRnZS5WR3Vlc3RXaXRoQmF0Y2hEdG9FbnRpdHlXcmFwcGVyRHRvSHR0cFJlc3BvbnNlRGF0YTtcbmltcG9ydCBWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhID0gRWRnZS5WR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhO1xuaW1wb3J0IFZHdWVzdFdpdGhCYXRjaER0b0lFbnVtZXJhYmxlSHR0cFJlc3BvbnNlRGF0YSA9IEVkZ2UuVkd1ZXN0V2l0aEJhdGNoRHRvSUVudW1lcmFibGVIdHRwUmVzcG9uc2VEYXRhO1xuaW1wb3J0IFNlbmRFbWFpbFJlcXVlc3REdG8gPSBDbG91ZC5TZW5kRW1haWxSZXF1ZXN0RHRvO1xuaW1wb3J0IFRlbXBsYXRlVHlwZSA9IENsb3VkLlRlbXBsYXRlVHlwZTtcblxuZXhwb3J0IGNsYXNzIFZHdWVzdFdpdGhCYXRjaFRhYmxlRGF0YSBleHRlbmRzIFZHdWVzdFdpdGhCYXRjaER0byB7XG4gIGVudGl0aWVzOiBWR3Vlc3RXaXRoQmF0Y2hEdG9bXVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBHdWVzdFN0YXRlTW9kZWwge1xuICBhcmNoaXZlZDogVkd1ZXN0V2l0aEJhdGNoRHRvW107XG4gIGRpc3BsYXllZDogVkd1ZXN0V2l0aEJhdGNoRHRvW107XG4gIGNvdW50ZXI6IG51bWJlcjtcbiAgZ3Vlc3Q6IFZHdWVzdFdpdGhCYXRjaER0bztcbiAgcHJvZmlsZXM6IEd1ZXN0UHJvZmlsZUR0b1tdO1xuICBzZWxlY3RlZDogVkd1ZXN0V2l0aEJhdGNoRHRvO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5AU3RhdGU8R3Vlc3RTdGF0ZU1vZGVsPih7XG4gIG5hbWU6ICdndWVzdCcsXG4gIGRlZmF1bHRzOiB7XG4gICAgYXJjaGl2ZWQ6IFtdLFxuICAgIGRpc3BsYXllZDogW10sXG4gICAgY291bnRlcjogMCxcbiAgICBndWVzdDogbnVsbCxcbiAgICBwcm9maWxlczogW10sXG4gICAgc2VsZWN0ZWQ6IG51bGwsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEd1ZXN0U3RhdGUge1xuICBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgnZW4tVVMnKTtcbiAgTCA9IExvY2FsaXphdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZSxcbiAgICBwcml2YXRlIGd1ZXN0U2VydmljZVByb3h5OiBFZGdlLkd1ZXN0U2VydmljZVByb3h5LFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYmF0Y2hTZXJ2aWNlUHJveHk6IEVkZ2UuQmF0Y2hTZXJ2aWNlUHJveHksXG4gICAgcHJpdmF0ZSBtZXNzYWdlQmFyU2VydmljZTogTWVzc2FnZUJhclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21tYW5kTm90aWZpY2F0aW9uU2VydmljZTogQ29tbWFuZE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50U2VydmljZTogVGVuYW50U2VydmljZSxcbiAgICBwcml2YXRlIGV4cG9ydEZpbGVTZXJ2aWNlOiBFeHBvcnRGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIHBhcmtlclNlcnZpY2U6IFBhcmtlclNlcnZpY2UpIHtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHB1YmxpYyBzdGF0aWMgZ3Vlc3RDb3VudGVyKHN0YXRlOiBHdWVzdFN0YXRlTW9kZWwpOiBudW1iZXIge1xuICAgIHJldHVybiBzdGF0ZS5jb3VudGVyO1xuICB9XG5cbiAgQFNlbGVjdG9yKClcbiAgcHVibGljIHN0YXRpYyBhcmNoaXZlZEd1ZXN0cyhzdGF0ZTogR3Vlc3RTdGF0ZU1vZGVsKTogVkd1ZXN0V2l0aEJhdGNoRHRvW10ge1xuICAgIHJldHVybiBzdGF0ZS5hcmNoaXZlZDtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHB1YmxpYyBzdGF0aWMgZGlzcGxheWVkR3Vlc3RzKHN0YXRlOiBHdWVzdFN0YXRlTW9kZWwpOiBWR3Vlc3RXaXRoQmF0Y2hEdG9bXSB7XG4gICAgcmV0dXJuIHN0YXRlLmRpc3BsYXllZDtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHB1YmxpYyBzdGF0aWMgcHJvZmlsZXMoc3RhdGU6IEd1ZXN0U3RhdGVNb2RlbCk6IEd1ZXN0UHJvZmlsZUR0b1tdIHtcbiAgICByZXR1cm4gc3RhdGUucHJvZmlsZXM7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBwdWJsaWMgc3RhdGljIHNlbGVjdGVkKHN0YXRlOiBHdWVzdFN0YXRlTW9kZWwpOiBWR3Vlc3RXaXRoQmF0Y2hEdG8ge1xuICAgIHJldHVybiBzdGF0ZS5zZWxlY3RlZDtcbiAgfVxuXG4gIEBBY3Rpb24oTG9hZEd1ZXN0QnlJZEFjdGlvbiwgeyBjYW5jZWxVbmNvbXBsZXRlZDogdHJ1ZSB9KVxuICBvbkxvYWRHdWVzdEJ5SWRBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBMb2FkR3Vlc3RCeUlkQWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgZ2V0R3Vlc3QkID0gdGhpcy5ndWVzdFNlcnZpY2VQcm94eS5nZXRHdWVzdEJ5SWQoYWN0aW9uLmd1ZXN0SWQsIGFjdGlvbi5wYXJrSWQsIGFjdGlvbi5ndWlkKTtcbiAgICByZXR1cm4gZ2V0R3Vlc3QkLnBpcGUodGFwKGd1ZXN0ID0+IHtcbiAgICAgIGN0eC5wYXRjaFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWQ6IGd1ZXN0LmRhdGFcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfVxuXG4gIEBBY3Rpb24oQ2xlYXJHdWVzdEFjdGlvbiwgeyBjYW5jZWxVbmNvbXBsZXRlZDogdHJ1ZSB9KVxuICBvbkNsZWFyR3Vlc3RBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8Q2xlYXJHdWVzdEFjdGlvbj4pOiB2b2lkIHtcbiAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICBzZWxlY3RlZDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgQEFjdGlvbihMb2FkR3Vlc3RzQWN0aW9uLCB7IGNhbmNlbFVuY29tcGxldGVkOiB0cnVlIH0pXG4gIG9uTG9hZEd1ZXN0c0FjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IExvYWRHdWVzdHNBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0VudGl0eVdyYXBwZXJEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgZ2V0R3Vlc3RzJCA9IHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkuZ2V0R3Vlc3RzKGFjdGlvbi5wYXJrSWQsIGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3RzRmlsdGVyRHRvKTtcbiAgICByZXR1cm4gZ2V0R3Vlc3RzJC5waXBlKHRhcCgoZ3Vlc3RzV3JhcHBlcjogVkd1ZXN0V2l0aEJhdGNoRHRvRW50aXR5V3JhcHBlckR0b0h0dHBSZXNwb25zZURhdGEpID0+IHtcbiAgICAgIGN0eC5wYXRjaFN0YXRlKHtcbiAgICAgICAgYXJjaGl2ZWQ6IGd1ZXN0c1dyYXBwZXIuZGF0YS5lbnRpdGllcyxcbiAgICAgICAgY291bnRlcjogZ3Vlc3RzV3JhcHBlci5kYXRhLmNvdW50ZXIsXG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH1cblxuICBAQWN0aW9uKFNldEd1ZXN0c0FjdGlvbilcbiAgb25TZXRHdWVzdHNBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBTZXRHdWVzdHNBY3Rpb24pIHtcbiAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICBkaXNwbGF5ZWQ6IGFjdGlvbi5ndWVzdHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBAQWN0aW9uKENsZWFyR3Vlc3RzTGlzdEFjdGlvbilcbiAgb25DbGVhckd1ZXN0TGlzdEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+KSB7XG4gICAgY3R4LnBhdGNoU3RhdGUoe1xuICAgICAgYXJjaGl2ZWQ6IFtdLFxuICAgICAgZGlzcGxheWVkOiBbXSxcbiAgICAgIGNvdW50ZXI6IDAsXG4gICAgfSk7XG4gIH1cblxuICBAQWN0aW9uKENyZWF0ZUd1ZXN0QWN0aW9uKVxuICBvbkNyZWF0ZUd1ZXN0QWN0aW9uKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGFjdGlvbjogQ3JlYXRlR3Vlc3RBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICBjb25zdCBtZXNzYWdlQmFyUGF5bG9hZDogTWVzc2FnZUJhclBheWxvYWQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmd1ZXN0KSxcbiAgICAgIGVudGl0eU5hbWU6IGAke2FjdGlvbi5ndWVzdC5maXJzdE5hbWV9ICR7YWN0aW9uLmd1ZXN0Lmxhc3ROYW1lfWAsXG4gICAgICBhY3Rpb246IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmNyZWF0ZWQpKSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuaW5mbyhMb2NhbGl6YXRpb24uZW50aXR5X2luX3Byb2dyZXNzLCBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZCkpO1xuICAgIHJldHVybiB0aGlzLmd1ZXN0U2VydmljZVByb3h5LmNyZWF0ZUd1ZXN0KGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3QpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6IChoYW5kbGVkOiBWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPSB0aGlzLmlzR3Vlc3RDcmVhdGVkRnJvbVNlbGVjdGVkRmFjaWxpdHkoaGFuZGxlZC5kYXRhLCBhY3Rpb24uZ3VpZCk7XG4gICAgICAgIHRoaXMuYWRkR3Vlc3RUb1N0b3JlKGN0eCwgaGFuZGxlZC5kYXRhLCBkaXNwbGF5TmV3R3Vlc3RJblRhYmxlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5zdWNjZXNzKFxuICAgICAgICAgIGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPyBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MgOiBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3Nfbm90X2N1cnJlbnRseV92aXNpYmxlLFxuICAgICAgICAgIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eSA9IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKFxuICAgICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eVxuICAgICAgICApO1xuICAgICAgICBtZXNzYWdlQmFyUGF5bG9hZC5hY3Rpb24gPSBsb3dlckNhc2VGaXJzdExldHRlcihcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5jcmVhdGUpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgTG9jYWxpemF0aW9uLmVudGl0eV9mYWlsZWQsXG4gICAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihDcmVhdGVCYXRjaEFjdGlvbilcbiAgb25DcmVhdGVCYXRjaEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IENyZWF0ZUJhdGNoQWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9JRW51bWVyYWJsZUh0dHBSZXNwb25zZURhdGE+IHtcbiAgICBjb25zdCBtZXNzYWdlQmFyUGF5bG9hZDogTWVzc2FnZUJhclBheWxvYWQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmd1ZXN0X2dyb3VwKSxcbiAgICAgIGVudGl0eU5hbWU6IGFjdGlvbi5iYXRjaENvbW1hbmQubmFtZSxcbiAgICAgIGFjdGlvbjogbG93ZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy50cmFuc2xhdGUuaW5zdGFudChMb2NhbGl6YXRpb24uY3JlYXRlZCkpLFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5pbmZvKExvY2FsaXphdGlvbi5lbnRpdHlfaW5fcHJvZ3Jlc3MsIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKSk7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hTZXJ2aWNlUHJveHkuY3JlYXRlQmF0Y2goYWN0aW9uLmZhY2lsaXR5V2l0aEd1aWQuZ3VpZCwgYWN0aW9uLmJhdGNoQ29tbWFuZCkucGlwZSh0YXAoe1xuICAgICAgbmV4dDogKG5ld0d1ZXN0czogVkd1ZXN0V2l0aEJhdGNoRHRvSUVudW1lcmFibGVIdHRwUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPSB0aGlzLmlzR3Vlc3RDcmVhdGVkRnJvbVNlbGVjdGVkRmFjaWxpdHkobmV3R3Vlc3RzLmRhdGFbMF0sIGFjdGlvbi5mYWNpbGl0eVdpdGhHdWlkLmd1aWQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICAgICAgZGlzcGxheU5ld0d1ZXN0SW5UYWJsZSA/IExvY2FsaXphdGlvbi5lbnRpdHlfc3VjY2VzcyA6IExvY2FsaXphdGlvbi5lbnRpdHlfc3VjY2Vzc19ub3RfY3VycmVudGx5X3Zpc2libGUsXG4gICAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRpc3BsYXlOZXdHdWVzdEluVGFibGUpIHtcbiAgICAgICAgICBjb25zdCBuZXdCYXRjaCA9IHRoaXMuY29udmVydEd1ZXN0c1RvVGFibGVEYXRhKG5ld0d1ZXN0cy5kYXRhKTtcbiAgICAgICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW25ld0JhdGNoXSwgUm93T3BlcmF0aW9uLkluc2VydCk7XG4gICAgICAgICAgbWFya0VudGl0aWVzQXNDaGFuZ2VkKG5ld0JhdGNoLmVudGl0aWVzLCBSb3dPcGVyYXRpb24uSW5zZXJ0KTtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5ZWRHdWVzdHMgPSBjdHguZ2V0U3RhdGUoKS5kaXNwbGF5ZWQ7XG4gICAgICAgICAgZGlzcGxheWVkR3Vlc3RzLnVuc2hpZnQoLi4ubmV3QmF0Y2guZW50aXRpZXMpO1xuICAgICAgICAgIGRpc3BsYXllZEd1ZXN0cy51bnNoaWZ0KG5ld0JhdGNoKTtcbiAgICAgICAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICAgICAgICBkaXNwbGF5ZWQ6IFsuLi5kaXNwbGF5ZWRHdWVzdHNdLFxuICAgICAgICAgICAgY291bnRlcjogY3R4LmdldFN0YXRlKCkuY291bnRlciArIDEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGU6IFByb2JsZW1EZXRhaWxzSHR0cFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBhY3Rpb24uZXJyb3JNZXNzYWdlID0gZS5kYXRhLmRldGFpbDtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBAQWN0aW9uKENyZWF0ZUJhc2ljQmF0Y2hBY3Rpb24pXG4gIG9uQ3JlYXRlQmFzaWNCYXRjaEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IENyZWF0ZUJhc2ljQmF0Y2hBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0lFbnVtZXJhYmxlSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VCYXJQYXlsb2FkOiBNZXNzYWdlQmFyUGF5bG9hZCA9IHtcbiAgICAgIGVudGl0eTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChMb2NhbGl6YXRpb24uZ3Vlc3RfZ3JvdXApLFxuICAgICAgZW50aXR5TmFtZTogYWN0aW9uLmJhdGNoQ29tbWFuZC5uYW1lLFxuICAgICAgYWN0aW9uOiBsb3dlckNhc2VGaXJzdExldHRlcih0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5jcmVhdGVkKSksXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLmluZm8oTG9jYWxpemF0aW9uLmVudGl0eV9pbl9wcm9ncmVzcywgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpKTtcbiAgICByZXR1cm4gdGhpcy5iYXRjaFNlcnZpY2VQcm94eS5jcmVhdGVCYXNpY0JhdGNoKGFjdGlvbi5mYWNpbGl0eVdpdGhHdWlkLmd1aWQsIGFjdGlvbi5iYXRjaENvbW1hbmQpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6IChuZXdHdWVzdHM6IFZHdWVzdFdpdGhCYXRjaER0b0lFbnVtZXJhYmxlSHR0cFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBjb25zdCBkaXNwbGF5TmV3R3Vlc3RJblRhYmxlID0gdGhpcy5pc0d1ZXN0Q3JlYXRlZEZyb21TZWxlY3RlZEZhY2lsaXR5KG5ld0d1ZXN0cy5kYXRhWzBdLCBhY3Rpb24uZmFjaWxpdHlXaXRoR3VpZC5ndWlkKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5zdWNjZXNzKFxuICAgICAgICAgIGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPyBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MgOiBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3Nfbm90X2N1cnJlbnRseV92aXNpYmxlLFxuICAgICAgICAgIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkaXNwbGF5TmV3R3Vlc3RJblRhYmxlKSB7XG4gICAgICAgICAgY29uc3QgbmV3QmF0Y2ggPSB0aGlzLmNvbnZlcnRHdWVzdHNUb1RhYmxlRGF0YShuZXdHdWVzdHMuZGF0YSk7XG4gICAgICAgICAgbWFya0VudGl0aWVzQXNDaGFuZ2VkKFtuZXdCYXRjaF0sIFJvd09wZXJhdGlvbi5JbnNlcnQpO1xuICAgICAgICAgIG1hcmtFbnRpdGllc0FzQ2hhbmdlZChuZXdCYXRjaC5lbnRpdGllcywgUm93T3BlcmF0aW9uLkluc2VydCk7XG4gICAgICAgICAgY29uc3QgZGlzcGxheWVkR3Vlc3RzID0gY3R4LmdldFN0YXRlKCkuZGlzcGxheWVkO1xuICAgICAgICAgIGRpc3BsYXllZEd1ZXN0cy51bnNoaWZ0KC4uLm5ld0JhdGNoLmVudGl0aWVzKTtcbiAgICAgICAgICBkaXNwbGF5ZWRHdWVzdHMudW5zaGlmdChuZXdCYXRjaCk7XG4gICAgICAgICAgY3R4LnBhdGNoU3RhdGUoe1xuICAgICAgICAgICAgZGlzcGxheWVkOiBbLi4uZGlzcGxheWVkR3Vlc3RzXSxcbiAgICAgICAgICAgIGNvdW50ZXI6IGN0eC5nZXRTdGF0ZSgpLmNvdW50ZXIgKyAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlOiBQcm9ibGVtRGV0YWlsc0h0dHBSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgYWN0aW9uLmVycm9yTWVzc2FnZSA9IGUuZGF0YS5kZXRhaWw7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihVcGRhdGVHdWVzdEFjdGlvbilcbiAgb25VcGRhdGVHdWVzdEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IFVwZGF0ZUd1ZXN0QWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5ndWVzdCksXG4gICAgICBlbnRpdHlOYW1lOiBgJHthY3Rpb24uZ3Vlc3QuZmlyc3ROYW1lfSAke2FjdGlvbi5ndWVzdC5sYXN0TmFtZX1gLFxuICAgICAgYWN0aW9uOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi51cGRhdGVkKSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuaW5mbyhMb2NhbGl6YXRpb24uZW50aXR5X2luX3Byb2dyZXNzLCBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZCkpO1xuICAgIHJldHVybiB0aGlzLmd1ZXN0U2VydmljZVByb3h5LnVwZGF0ZUd1ZXN0KGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3QpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6IChoYW5kbGVkOiBWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlR3Vlc3RJblN0b3JlKGN0eCwgaGFuZGxlZC5kYXRhLCBhY3Rpb24uZ3VpZCk7XG4gICAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgICAgICBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MsXG4gICAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgbWVzc2FnZUJhclBheWxvYWQuZW50aXR5ID0gbG93ZXJDYXNlRmlyc3RMZXR0ZXIoXG4gICAgICAgICAgbWVzc2FnZUJhclBheWxvYWQuZW50aXR5XG4gICAgICAgICk7XG4gICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmFjdGlvbiA9IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKFxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLnVwZGF0ZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5lcnJvcihcbiAgICAgICAgICBMb2NhbGl6YXRpb24uZW50aXR5X2ZhaWxlZCxcbiAgICAgICAgICBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBAQWN0aW9uKFVwZGF0ZUd1ZXN0TG9jYXRpb25BY3Rpb24pXG4gIG9uVXBkYXRlR3Vlc3RMb2NhdGlvbkFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IFVwZGF0ZUd1ZXN0TG9jYXRpb25BY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICBkZWJ1Z2dlcjtcbiAgICBjb25zdCBjb25maWc6IENvbW1hbmROb3RpZmljYXRpb25Db25maWcgPSB7XG4gICAgICBtZXNzYWdlczogW3sgdmFsdWU6IGFjdGlvbi51cGRhdGVHdWVzdExvY2F0aW9uQ29tbWFuZC5uYW1lLCBjbGFzczogTm90aWZpY2F0aW9uQ2xhc3MuYm9keSB9XSxcbiAgICAgIGNvbW1hbmQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KExvY2FsaXphdGlvbi51cGRhdGVfbG9jYXRpb24pXG4gICAgfTtcblxuICAgIGNvbnN0IGd1ZXN0JCA9IHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkudXBkYXRlR3Vlc3RMb2NhdGlvbihhY3Rpb24uZ3VpZCwgYWN0aW9uLnVwZGF0ZUd1ZXN0TG9jYXRpb25Db21tYW5kKTtcbiAgICByZXR1cm4gZ3Vlc3QkLnBpcGUodGhpcy5jb21tYW5kTm90aWZpY2F0aW9uU2VydmljZS5kaXNwbGF5KGNvbmZpZykpO1xuICB9XG5cbiAgQEFjdGlvbihEZWxldGVHdWVzdEFjdGlvbilcbiAgb25EZWxldGVHdWVzdEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IERlbGV0ZUd1ZXN0QWN0aW9uKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBpbnRlcnBvbGF0ZWRHdWVzdE5hbWUgPSBhY3Rpb24uZ3Vlc3QubmFtZS50cmltKCkgPT09IExvY2FsaXphdGlvbi5jYXJkX2hvbGRlciA/XG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChMb2NhbGl6YXRpb24uY2FyZF9ob2xkZXIpIDogYWN0aW9uLmd1ZXN0Lm5hbWU7XG4gICAgY29uc3QgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5ndWVzdCksXG4gICAgICBlbnRpdHlOYW1lOiBpbnRlcnBvbGF0ZWRHdWVzdE5hbWUsXG4gICAgICBhY3Rpb246IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmRlbGV0ZWQpLFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5pbmZvKExvY2FsaXphdGlvbi5lbnRpdHlfaW5fcHJvZ3Jlc3MsIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKSk7XG4gICAgcmV0dXJuIHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkuZGVsZXRlR3Vlc3QoYWN0aW9uLmd1ZXN0Lmd1ZXN0SUQsIGFjdGlvbi5ndWVzdC5wYXJrSUQsIGFjdGlvbi5ndWlkKS5waXBlKHRhcCgoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICAgIExvY2FsaXphdGlvbi5lbnRpdHlfc3VjY2VzcyxcbiAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICApO1xuICAgICAgKGFjdGlvbi5ndWVzdCBhcyBWR3Vlc3RXaXRoQmF0Y2hEdG8pLmRlbGV0ZWQgPSAxO1xuICAgICAgdGhpcy5kZWxldGVHdWVzdEZyb21TdG9yZShjdHgsIGFjdGlvbi5ndWVzdCwgYWN0aW9uLmd1aWQpO1xuICAgIH0sICgpID0+IHtcbiAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eSA9IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKFxuICAgICAgICBtZXNzYWdlQmFyUGF5bG9hZC5lbnRpdHlcbiAgICAgICk7XG4gICAgICBtZXNzYWdlQmFyUGF5bG9hZC5hY3Rpb24gPSBsb3dlckNhc2VGaXJzdExldHRlcihcbiAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChMb2NhbGl6YXRpb24uZGVsZXRlKVxuICAgICAgKTtcbiAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuZXJyb3IoXG4gICAgICAgIExvY2FsaXphdGlvbi5lbnRpdHlfZmFpbGVkLFxuICAgICAgICBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZClcbiAgICAgICk7XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihDcmVhdGVCYXNpY0d1ZXN0QWN0aW9uKVxuICBvbkNyZWF0ZUJhc2ljR3Vlc3RBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBDcmVhdGVCYXNpY0d1ZXN0QWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5ndWVzdCksXG4gICAgICBlbnRpdHlOYW1lOiBgJHthY3Rpb24uZ3Vlc3QuZmlyc3ROYW1lfSAke2FjdGlvbi5ndWVzdC5sYXN0TmFtZX1gLFxuICAgICAgYWN0aW9uOiBsb3dlckNhc2VGaXJzdExldHRlcih0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5jcmVhdGVkKSksXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLmluZm8oTG9jYWxpemF0aW9uLmVudGl0eV9pbl9wcm9ncmVzcywgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpKTtcbiAgICByZXR1cm4gdGhpcy5ndWVzdFNlcnZpY2VQcm94eS5jcmVhdGVCYXNpY0d1ZXN0KGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3QpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6IChoYW5kbGVkOiBWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPSB0aGlzLmlzR3Vlc3RDcmVhdGVkRnJvbVNlbGVjdGVkRmFjaWxpdHkoaGFuZGxlZC5kYXRhLCBhY3Rpb24uZ3VpZCk7XG4gICAgICAgIHRoaXMuYWRkR3Vlc3RUb1N0b3JlKGN0eCwgaGFuZGxlZC5kYXRhLCBkaXNwbGF5TmV3R3Vlc3RJblRhYmxlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5zdWNjZXNzKFxuICAgICAgICAgIGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPyBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MgOiBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3Nfbm90X2N1cnJlbnRseV92aXNpYmxlLFxuICAgICAgICAgIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eSA9IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKFxuICAgICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eVxuICAgICAgICApO1xuICAgICAgICBtZXNzYWdlQmFyUGF5bG9hZC5hY3Rpb24gPSBsb3dlckNhc2VGaXJzdExldHRlcihcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5jcmVhdGUpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgTG9jYWxpemF0aW9uLmVudGl0eV9mYWlsZWQsXG4gICAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihVcGRhdGVCYXNpY0d1ZXN0QWN0aW9uKVxuICBvblVwZGF0ZUJhc2ljR3Vlc3RBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBVcGRhdGVCYXNpY0d1ZXN0QWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5ndWVzdCksXG4gICAgICBlbnRpdHlOYW1lOiBgJHthY3Rpb24uZ3Vlc3QuZmlyc3ROYW1lfSAke2FjdGlvbi5ndWVzdC5sYXN0TmFtZX1gLFxuICAgICAgYWN0aW9uOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi51cGRhdGVkKSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuaW5mbyhMb2NhbGl6YXRpb24uZW50aXR5X2luX3Byb2dyZXNzLCBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZCkpO1xuICAgIHJldHVybiB0aGlzLmd1ZXN0U2VydmljZVByb3h5LnVwZGF0ZUJhc2ljR3Vlc3QoYWN0aW9uLmd1aWQsIGFjdGlvbi5ndWVzdCkucGlwZSh0YXAoe1xuICAgICAgbmV4dDogKGhhbmRsZWQ6IFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGEpID0+IHRoaXMub25VcGRhdGVCYXNpY0d1ZXN0TmV4dChjdHgsIGFjdGlvbiwgaGFuZGxlZCwgbWVzc2FnZUJhclBheWxvYWQpLFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMub25VcGRhdGVCYXNpY0d1ZXN0RXJyb3IobWVzc2FnZUJhclBheWxvYWQpXG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihVcGRhdGVCYXNpY0d1ZXN0VGVtcEFjdGlvbilcbiAgb25VcGRhdGVCYXNpY0d1ZXN0VGVtcEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IFVwZGF0ZUJhc2ljR3Vlc3RBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICBjb25zdCBtZXNzYWdlQmFyUGF5bG9hZDogTWVzc2FnZUJhclBheWxvYWQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmd1ZXN0KSxcbiAgICAgIGVudGl0eU5hbWU6IGAke2FjdGlvbi5ndWVzdC5maXJzdE5hbWV9ICR7YWN0aW9uLmd1ZXN0Lmxhc3ROYW1lfWAsXG4gICAgICBhY3Rpb246IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLnVwZGF0ZWQpLFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5pbmZvKExvY2FsaXphdGlvbi5lbnRpdHlfaW5fcHJvZ3Jlc3MsIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKSk7XG4gICAgcmV0dXJuIHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkudXBkYXRlQmFzaWNHdWVzdFRlbXAoYWN0aW9uLmd1aWQsIGFjdGlvbi5ndWVzdCkucGlwZSh0YXAoe1xuICAgICAgbmV4dDogKGhhbmRsZWQ6IFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGEpID0+IHRoaXMub25VcGRhdGVCYXNpY0d1ZXN0TmV4dChjdHgsIGFjdGlvbiwgaGFuZGxlZCwgbWVzc2FnZUJhclBheWxvYWQpLFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMub25VcGRhdGVCYXNpY0d1ZXN0RXJyb3IobWVzc2FnZUJhclBheWxvYWQpXG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihTZW5kRW1haWxUb0d1ZXN0KVxuICBvblNlbmRFbWFpbFRvR3Vlc3RBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBTZW5kRW1haWxUb0d1ZXN0KTogT2JzZXJ2YWJsZTxJbnQzMkh0dHBSZXNwb25zZURhdGE+IHtcbiAgICByZXR1cm4gdGhpcy5ndWVzdFNlcnZpY2VQcm94eS5zZW5kR3Vlc3RFbWFpbChhY3Rpb24uZ3VpZCwgYWN0aW9uLnNlbmRFbWFpbENvbW1hbmQpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMubWVzc2FnZUJhclNlcnZpY2Uuc3VjY2VzcyhMb2NhbGl6YXRpb24uZW1haWxfc2VudF9zdWNjZXNzZnVsbHkpLFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMubWVzc2FnZUJhclNlcnZpY2UuZXJyb3IoTG9jYWxpemF0aW9uLmVtYWlsX3NlbmRpbmdfZmFpbGVkKSxcbiAgICB9KSk7XG4gIH1cblxuICBAQWN0aW9uKExvYWRHdWVzdHNCeUJhdGNoSWRBY3Rpb24sIHsgY2FuY2VsVW5jb21wbGV0ZWQ6IHRydWUgfSlcbiAgb25Mb2FkR3Vlc3RzQnlCYXRjaElkKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGFjdGlvbjogTG9hZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbik6IE9ic2VydmFibGU8Vkd1ZXN0V2l0aEJhdGNoRHRvSUVudW1lcmFibGVIdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgcmVzdWx0cyQgPSB0aGlzLmd1ZXN0U2VydmljZVByb3h5LmdldEd1ZXN0c0J5QmF0Y2hJRChhY3Rpb24ucGFya0lkLCBhY3Rpb24uYmF0Y2hJRCwgYWN0aW9uLmd1aWQsIGFjdGlvbi5ndWVzdHNGaWx0ZXJEdG8pO1xuICAgIHJldHVybiByZXN1bHRzJC5waXBlKHRhcCgoZ3Vlc3RzOiBWR3Vlc3RXaXRoQmF0Y2hEdG9JRW51bWVyYWJsZUh0dHBSZXNwb25zZURhdGEpID0+IHtcbiAgICAgIHRoaXMuYWRkR3Vlc3RzQnlCYXRjaElkVG9TdG9yZShjdHgsIGFjdGlvbi5iYXRjaElELCBndWVzdHMuZGF0YSk7XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihMb2FkR3Vlc3RzQnlCYXRjaElkQ2FuY2VsbGVkQWN0aW9uLCB7IGNhbmNlbFVuY29tcGxldGVkOiBmYWxzZSB9KVxuICBvbkxvYWRHdWVzdHNCeUJhdGNoSWRDYW5jZWxsZWRBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBMb2FkR3Vlc3RzQnlCYXRjaElkQ2FuY2VsbGVkQWN0aW9uKSB7XG4gICAgY29uc3QgZGlzcGxheWVkR3Vlc3RzQmF0Y2hlcyA9IGN0eC5nZXRTdGF0ZSgpLmRpc3BsYXllZDtcbiAgICBjb25zdCBndWVzdEJhdGNoSW5kZXggPSBkaXNwbGF5ZWRHdWVzdHNCYXRjaGVzLmZpbmRJbmRleChndWVzdCA9PiBndWVzdCBpbnN0YW5jZW9mIFZHdWVzdFdpdGhCYXRjaER0byAmJiBndWVzdC5iYXRjaElEID09PSBhY3Rpb24uYmF0Y2hJZCk7XG5cbiAgICBpZiAoZ3Vlc3RCYXRjaEluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgZ3Vlc3RCYXRjaCA9IG1hcmtFbnRpdHlBc1VuY2hhbmdlZChkaXNwbGF5ZWRHdWVzdHNCYXRjaGVzW2d1ZXN0QmF0Y2hJbmRleF0pO1xuXG4gICAgICBkaXNwbGF5ZWRHdWVzdHNCYXRjaGVzW2d1ZXN0QmF0Y2hJbmRleF0gPSBPYmplY3QuYXNzaWduKG5ldyBWR3Vlc3RXaXRoQmF0Y2hEdG8oKSwgZ3Vlc3RCYXRjaCk7XG5cbiAgICAgIGN0eC5wYXRjaFN0YXRlKHtcbiAgICAgICAgZGlzcGxheWVkOiBbLi4uZGlzcGxheWVkR3Vlc3RzQmF0Y2hlc11cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBBY3Rpb24oRXhwYW5kR3Vlc3RzQnlCYXRjaElkQWN0aW9uKVxuICBvbkV4cGFuZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IEV4cGFuZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYWRkR3Vlc3RzQnlCYXRjaElkVG9TdG9yZShjdHgsIGFjdGlvbi5iYXRjaElELCBhY3Rpb24uZ3Vlc3RzKTtcbiAgfVxuXG4gIEBBY3Rpb24oQ29sbGFwc2VkR3Vlc3RzQnlCYXRjaElkQWN0aW9uKVxuICBvbkNvbGxhcHNlZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IENvbGxhcHNlZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbik6IHZvaWQge1xuICAgIGxldCBkaXNwbGF5ZWRHdXNldEJhdGNoZXMgPSBjdHguZ2V0U3RhdGUoKS5kaXNwbGF5ZWQ7XG4gICAgY29uc3QgZ3Vlc3RCYXRjaEluZGV4ID0gZGlzcGxheWVkR3VzZXRCYXRjaGVzLmZpbmRJbmRleChnYiA9PiBnYi5iYXRjaElEID09PSBhY3Rpb24uYmF0Y2hJRCk7XG4gICAgaWYgKGd1ZXN0QmF0Y2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIGRpc3BsYXllZEd1c2V0QmF0Y2hlcyA9IGRpc3BsYXllZEd1c2V0QmF0Y2hlcy5maWx0ZXIoZW50aXR5ID0+IGVudGl0eS5iYXRjaElEICE9PSBhY3Rpb24uYmF0Y2hJRCB8fCAhZW50aXR5Lmd1ZXN0SUQpO1xuICAgICAgY3R4LnBhdGNoU3RhdGUoe1xuICAgICAgICBkaXNwbGF5ZWQ6IFsuLi5kaXNwbGF5ZWRHdXNldEJhdGNoZXNdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQEFjdGlvbihMb2FkR3Vlc3RQcm9maWxlc0FjdGlvbiwgeyBjYW5jZWxVbmNvbXBsZXRlZDogdHJ1ZSB9KVxuICBvbkxvYWRHdWVzdFByb2ZpbGVzQWN0aW9uKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGFjdGlvbjogTG9hZEd1ZXN0UHJvZmlsZXNBY3Rpb24pIHtcbiAgICBjb25zdCBndWVzdFByb2ZpbGVzJCA9IHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkuZ2V0UHJvZmlsZXMoYWN0aW9uLnBhcmtJZCwgYWN0aW9uLnNlYXJjaFBhcmFtc0R0bz8ubWF4UmVzdWx0cyxcbiAgICAgIGFjdGlvbi5zZWFyY2hQYXJhbXNEdG8/LnNlYXJjaFRlcm0sIGFjdGlvbi5zZWFyY2hQYXJhbXNEdG8/Lm9yZGVyQnkuY29sdW1uLFxuICAgICAgYWN0aW9uLnNlYXJjaFBhcmFtc0R0bz8ub3JkZXJCeS5vcmRlckRpcmVjdGlvbiwgYWN0aW9uLmd1aWQpO1xuICAgIHJldHVybiBndWVzdFByb2ZpbGVzJC5waXBlKHRhcChwcm9maWxlcyA9PiB7XG4gICAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICAgIHByb2ZpbGVzOiBwcm9maWxlcy5kYXRhLFxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihDbGVhckd1ZXN0UHJvZmlsZXNBY3Rpb24pXG4gIG9uQ2xlYXJHdWVzdFByb2ZpbGVzQWN0aW9uKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4pIHtcbiAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICBwcm9maWxlczogW10sXG4gICAgfSk7XG4gIH1cblxuICBAQWN0aW9uKFNlbmRHdWVzdFBhc3Nlc1RvRW1haWxBY3Rpb24pXG4gIGFzeW5jIG9uU2VuZEd1ZXN0UGFzc2VzVG9FbWFpbChjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IFNlbmRHdWVzdFBhc3Nlc1RvRW1haWxBY3Rpb24pIHtcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7XG4gICAgICBtb2RhbFRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5zZW5kX3N0aWNrZXJzX3RvX2VtYWlsKSxcbiAgICAgIHNlbmRFbWFpbDogZmFsc2UsXG4gICAgICBzZW5kRW1haWxSZXFldXN0OiBhd2FpdCB0aGlzLnBvcHVsYXRlU2VuZEVtYWlsUmVxdWVzdChhY3Rpb24pICAvLyBvbmx5IHZlcnNpb24gPj0gOC4xIHN1cHBvcnQgdGhpcyBmZWF0dXJlXG4gICAgfTtcbiAgICBkYXRhLnNlbmRFbWFpbFJlcWV1c3QudG8gPSBhY3Rpb24uZW1haWw7XG4gICAgY3R4LmRpc3BhdGNoKG5ldyBTZW5kRW1haWxGcm9tRW50aXR5QWN0aW9uKGRhdGEuc2VuZEVtYWlsUmVxZXVzdCkpO1xuICB9XG5cbiAgQEFjdGlvbihFeHBvcnRHdWVzdHNBY3Rpb24sIHsgY2FuY2VsVW5jb21wbGV0ZWQ6IHRydWUgfSlcbiAgb25FeHBvcnRHdWVzdHNBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBFeHBvcnRHdWVzdHNBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0VudGl0eVdyYXBwZXJEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgZ2V0R3Vlc3RzJCA9IHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkuZ2V0R3Vlc3RzKGFjdGlvbi5wYXJrSWQsIGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3RzRmlsdGVyRHRvKTtcbiAgICByZXR1cm4gZ2V0R3Vlc3RzJC5waXBlKHRhcCh7XG4gICAgICBuZXh0OiAoZ3Vlc3RzV3JhcHBlcjogVkd1ZXN0V2l0aEJhdGNoRHRvRW50aXR5V3JhcHBlckR0b0h0dHBSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgY29uc3QgdGFibGVSb3dzOiBhbnlbXVtdID0gW107XG4gICAgICAgIGNvbnN0IGd1ZXN0V2l0aEJhdGNoRHRvTGlzdDogVkd1ZXN0V2l0aEJhdGNoRHRvW10gPSBndWVzdHNXcmFwcGVyLmRhdGEuZW50aXRpZXM7XG4gICAgICAgIGd1ZXN0V2l0aEJhdGNoRHRvTGlzdC5mb3JFYWNoKChndWVzdCkgPT4ge1xuICAgICAgICAgIHRhYmxlUm93cy5wdXNoKFtndWVzdC5uYW1lLFxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoUHJvZmlsZVR5cGVUZXh0W1Byb2ZpbGVUeXBlW2d1ZXN0Lm1UeXBlXV0pLFxuICAgICAgICAgIGd1ZXN0Lm1vYmlsZSxcbiAgICAgICAgICBndWVzdC5jYXJQbGF0ZSxcbiAgICAgICAgICB0aGlzLmV4cG9ydEZpbGVTZXJ2aWNlLmdldERhdGVGaWVsZFZhbHVlKGFjdGlvbi5maWxlVHlwZSwgZ3Vlc3QsICd2YWxpZEZyb21EYXRlJyksXG4gICAgICAgICAgdGhpcy5leHBvcnRGaWxlU2VydmljZS5nZXREYXRlRmllbGRWYWx1ZShhY3Rpb24uZmlsZVR5cGUsIGd1ZXN0LCAndmFsaWRUb0RhdGUnKSxcbiAgICAgICAgICBndWVzdC5jb21wYW55TmFtZSxcbiAgICAgICAgICBndWVzdC5zdWJDb21wYW55TmFtZSxcbiAgICAgICAgICB0aGlzLnBhcmtlclNlcnZpY2UuZ2V0SGlzdG9yeUl0ZW1BY3Rpb24oZ3Vlc3QubG9jYXRpb24sIG51bGwpLFxuICAgICAgICAgIHRoaXMuZXhwb3J0RmlsZVNlcnZpY2UuZ2V0RGF0ZUZpZWxkVmFsdWUoYWN0aW9uLmZpbGVUeXBlLCBndWVzdCwgJ3Byb2R1Y2VkRGF0ZScpXSlcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXhwb3J0RmlsZVNlcnZpY2UuZXhwb3J0KGFjdGlvbi5maWxlVHlwZSwgdGFibGVSb3dzLCBhY3Rpb24uY29sdW1uc0hlYWRlciwgTG9jYWxpemF0aW9uLmd1ZXN0cyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5lcnJvcih0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLkwuZmFpbGVkX2V4cG9ydF9maWxlKSk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgdG9EYXRlU3RyaW5nID0gKHZhbHVlOiBNb21lbnQpID0+IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLnRvRGF0ZSgpLCB0aGlzLnRlbmFudFNlcnZpY2Uuc2Vjb25kYXJ5RGF0ZVRpbWVGb3JtYXQpIHx8ICctJztcblxuICBwcml2YXRlIGFkZEd1ZXN0c0J5QmF0Y2hJZFRvU3RvcmUoY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYmF0Y2hJRDogbnVtYmVyLCBndWVzdHM6IFZHdWVzdFdpdGhCYXRjaER0b1tdKSB7XG4gICAgY29uc3QgZGlzcGxheWVkR3VzZXRCYXRjaGVzID0gY3R4LmdldFN0YXRlKCkuZGlzcGxheWVkO1xuICAgIGNvbnN0IGd1ZXN0QmF0Y2hJbmRleCA9IGRpc3BsYXllZEd1c2V0QmF0Y2hlcy5maW5kSW5kZXgoZ2IgPT4gZ2IuYmF0Y2hJRCA9PT0gYmF0Y2hJRCk7XG4gICAgaWYgKGd1ZXN0QmF0Y2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIGRpc3BsYXllZEd1c2V0QmF0Y2hlc1tndWVzdEJhdGNoSW5kZXhdLmVudGl0aWVzID0gZ3Vlc3RzO1xuICAgICAgZGlzcGxheWVkR3VzZXRCYXRjaGVzLnNwbGljZShndWVzdEJhdGNoSW5kZXggKyAxLCAwLCAuLi5ndWVzdHMpO1xuXG4gICAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICAgIGRpc3BsYXllZDogWy4uLmRpc3BsYXllZEd1c2V0QmF0Y2hlc10sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRHdWVzdHNUb1RhYmxlRGF0YShndWVzdHM6IFZHdWVzdFdpdGhCYXRjaER0b1tdKTogVkd1ZXN0V2l0aEJhdGNoVGFibGVEYXRhIHtcbiAgICBjb25zdCBiYXRjaDogVkd1ZXN0V2l0aEJhdGNoVGFibGVEYXRhID0gZ3Vlc3RzLmZpbmQoZyA9PiBnLmJhdGNoSUQgPiAwICYmIGcuZ3Vlc3RJRCA9PT0gbnVsbCkgYXMgYW55O1xuICAgIGJhdGNoLmlzUm93RXhwYW5kYWJsZSA9IHRydWU7XG4gICAgYmF0Y2guZW50aXRpZXMgPSBndWVzdHMuZmlsdGVyKGcgPT4gZy5iYXRjaElEICE9PSBudWxsICYmIGcuZ3Vlc3RJRCAhPT0gbnVsbCk7XG4gICAgcmV0dXJuIGJhdGNoO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRHdWVzdFRvU3RvcmUoY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgZ3Vlc3Q6IFZHdWVzdFdpdGhCYXRjaER0bywgZGlzcGxheU5ld0d1ZXN0SW5UYWJsZTogYm9vbGVhbikge1xuICAgIGlmIChkaXNwbGF5TmV3R3Vlc3RJblRhYmxlKSB7XG4gICAgICBjb25zdCBkaXNwbGF5ZWRHdWVzdHMgPSBjdHguZ2V0U3RhdGUoKS5kaXNwbGF5ZWQ7XG4gICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW2d1ZXN0XSwgUm93T3BlcmF0aW9uLkluc2VydCk7XG4gICAgICBkaXNwbGF5ZWRHdWVzdHMudW5zaGlmdChndWVzdCk7XG4gICAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICAgIGRpc3BsYXllZDogWy4uLmRpc3BsYXllZEd1ZXN0c10sXG4gICAgICAgIGNvdW50ZXI6IGN0eC5nZXRTdGF0ZSgpLmNvdW50ZXIgKyAxLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0d1ZXN0Q3JlYXRlZEZyb21TZWxlY3RlZEZhY2lsaXR5KGd1ZXN0OiBWR3Vlc3RXaXRoQmF0Y2hEdG8sIGd1aWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbGVjdGVkUGFya0lEID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLnBhcmtJZCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRHdWlkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgIHJldHVybiBzZWxlY3RlZFBhcmtJRCA9PT0gZ3Vlc3QucGFya0lEICYmIHNlbGVjdGVkR3VpZCA9PT0gZ3VpZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW50QW5kQ2hpbGRJbmRleChjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBndWVzdER0bzogVkd1ZXN0V2l0aEJhdGNoRHRvKTogeyBwYXJlbnQ6IG51bWJlciwgY2hpbGQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBkaXNwbGF5ZWRHdWVzdHMgPSBjdHguZ2V0U3RhdGUoKS5kaXNwbGF5ZWQ7XG4gICAgLy8gaWYgSSBhbSBjaGlsZHJlbiBmaW5kIG15IHBhcmVudCwgYWZ0ZXIgdGhhdCBmaW5kIG1lXG4gICAgY29uc3QgcGFyZW50ID0gZGlzcGxheWVkR3Vlc3RzLmZpbmRJbmRleChndWVzdCA9PiBndWVzdC5iYXRjaElEID09PSBndWVzdER0by5iYXRjaElEICYmIGd1ZXN0Lmd1ZXN0SUQgPT09IG51bGwpO1xuICAgIGNvbnN0IGNoaWxkID0gKGRpc3BsYXllZEd1ZXN0c1twYXJlbnRdLmVudGl0aWVzIHx8IFtdKS5maW5kSW5kZXgoZ3Vlc3QgPT4gZ3Vlc3QuZ3Vlc3RJRCA9PT0gZ3Vlc3REdG8uZ3Vlc3RJRCk7XG4gICAgcmV0dXJuIHsgcGFyZW50LCBjaGlsZCB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVHdWVzdEluU3RvcmUoY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgZ3Vlc3Q6IFZHdWVzdFdpdGhCYXRjaER0bywgZ3VpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlzcGxheWVkR3Vlc3RzID0gY3R4LmdldFN0YXRlKCkuZGlzcGxheWVkO1xuICAgIGNvbnN0IGd1ZXN0SW5kZXggPSB0aGlzLmdldEd1ZXN0SW5kZXgoZGlzcGxheWVkR3Vlc3RzLCBndWVzdC5ndWVzdElEKTtcblxuICAgIGlmIChndWVzdEluZGV4ICE9PSAtMSkge1xuICAgICAgZGlzcGxheWVkR3Vlc3RzW2d1ZXN0SW5kZXhdID0gZ3Vlc3Q7XG4gICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW2d1ZXN0XSwgUm93T3BlcmF0aW9uLlVwZGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNHdWVzdENoaWxkKGd1ZXN0KSkge1xuICAgICAgY29uc3QgeyBjaGlsZCwgcGFyZW50IH0gPSB0aGlzLmdldFBhcmFudEFuZENoaWxkSW5kZXgoY3R4LCBndWVzdCk7XG4gICAgICBpZiAocGFyZW50ICE9PSAtMSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IC0xKSB7XG4gICAgICAgICAgZGlzcGxheWVkR3Vlc3RzW3BhcmVudF0uZW50aXRpZXNbY2hpbGRdID0gZ3Vlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0VudGl0aWVzQXNDaGFuZ2VkKFtkaXNwbGF5ZWRHdWVzdHNbcGFyZW50XV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN0eC5wYXRjaFN0YXRlKHtcbiAgICAgIGRpc3BsYXllZDogWy4uLmRpc3BsYXllZEd1ZXN0c10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZUd1ZXN0RnJvbVN0b3JlKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGd1ZXN0OiBWR3Vlc3RXaXRoQmF0Y2hEdG8sIGd1aWQ6IHN0cmluZykge1xuICAgIGxldCBjb3VudGVyID0gY3R4LmdldFN0YXRlKCkuY291bnRlcjtcblxuICAgIGNvbnN0IGRpc3BsYXllZEd1ZXN0cyA9IGN0eC5nZXRTdGF0ZSgpLmRpc3BsYXllZDtcbiAgICBjb25zdCBndWVzdEluZGV4ID0gdGhpcy5nZXRHdWVzdEluZGV4KGRpc3BsYXllZEd1ZXN0cywgZ3Vlc3QuZ3Vlc3RJRCk7XG5cbiAgICBpZiAoZ3Vlc3RJbmRleCAhPT0gLTEpIHtcbiAgICAgIGRpc3BsYXllZEd1ZXN0cy5zcGxpY2UoZ3Vlc3RJbmRleCwgMSk7XG4gICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW2d1ZXN0XSwgUm93T3BlcmF0aW9uLkRlbGV0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNHdWVzdENoaWxkKGd1ZXN0KSkge1xuICAgICAgY29uc3QgeyBjaGlsZCwgcGFyZW50IH0gPSB0aGlzLmdldFBhcmFudEFuZENoaWxkSW5kZXgoY3R4LCBndWVzdCk7XG4gICAgICBpZiAocGFyZW50ICE9PSAtMSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IC0xKSB7XG4gICAgICAgICAgZGlzcGxheWVkR3Vlc3RzW3BhcmVudF0uZW50aXRpZXMuc3BsaWNlKGNoaWxkLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW2Rpc3BsYXllZEd1ZXN0c1twYXJlbnRdXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ZXItLTtcbiAgICB9XG5cbiAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICBkaXNwbGF5ZWQ6IFsuLi5kaXNwbGF5ZWRHdWVzdHNdLFxuICAgICAgY291bnRlcjogY291bnRlcixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9wdWxhdGVTZW5kRW1haWxSZXF1ZXN0KGFjdGlvbjogU2VuZEd1ZXN0UGFzc2VzVG9FbWFpbEFjdGlvbikge1xuICAgIGxldCBwZGZQYWdlc1BhcmFtZXRlcnNMaXN0OiB7IFtrZXk6IHN0cmluZ106IGFueTsgfVtdID0gW107XG4gICAgbGV0IGd1ZXN0RW1haWxUZW1wbGF0ZSA9ICcnO1xuICAgIGlmIChhY3Rpb24uZ3Vlc3QuZW50aXRpZXMgJiYgYWN0aW9uLmd1ZXN0LmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBkZlBhZ2VzUGFyYW1ldGVyc0xpc3QgPSBbXTtcbiAgICAgIGFjdGlvbi5ndWVzdC5lbnRpdGllcy5mb3JFYWNoKGd1ZXN0ID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1MaXN0ID0gdGhpcy5nZXRQYXJhbWV0ZXJzKGd1ZXN0LCBhY3Rpb24uZmFjaWxpdHkpO1xuICAgICAgICBwZGZQYWdlc1BhcmFtZXRlcnNMaXN0LnB1c2gocGFyYW1MaXN0KTtcbiAgICAgIH0pO1xuICAgICAgZ3Vlc3RFbWFpbFRlbXBsYXRlID0gYWN0aW9uLmd1ZXN0LmJhdGNoTmFtZTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBwZGZQYWdlc1BhcmFtZXRlcnNMaXN0LnB1c2godGhpcy5nZXRQYXJhbWV0ZXJzKGFjdGlvbi5ndWVzdCwgYWN0aW9uLmZhY2lsaXR5KSk7XG4gICAgICBndWVzdEVtYWlsVGVtcGxhdGUgPSBhY3Rpb24uZ3Vlc3QubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZW5kRW1haWxSZXF1ZXN0ID0gbmV3IFNlbmRFbWFpbFJlcXVlc3REdG8oe1xuICAgICAgZW50aXR5OiBuZXcgR3Vlc3RFbnRpdHlQYXJhbXMoe1xuICAgICAgICBxclBsYWluVGV4dDogYWN0aW9uLmd1ZXN0LnFyUGxhaW5UZXh0LFxuICAgICAgICBpZDogYWN0aW9uLmd1ZXN0Lmd1ZXN0SUQgfHwgYWN0aW9uLmd1ZXN0LmJhdGNoSUQsXG4gICAgICAgIHFyQ29kZTogYWN0aW9uLmd1ZXN0LnFyQ29kZVxuICAgICAgfSksXG4gICAgICB0bzogYWN0aW9uLmVtYWlsLFxuICAgICAgdGVtcGxhdGVUeXBlOiBUZW1wbGF0ZVR5cGUuR3Vlc3QsXG4gICAgICBwZGZQYWdlc1BhcmFtZXRlcnNMaXN0LFxuICAgICAgcGRmUGFnZXNQYXJhbWV0ZXJzOiBudWxsLCAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB2ZXJzaW9uIDguMlxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBndWVzdEVtYWlsVGVtcGxhdGUsXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbmRFbWFpbFJlcXVlc3Q7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmFtZXRlcnMoZ3Vlc3Q6IFZHdWVzdFdpdGhCYXRjaER0bywgZmFjaWxpdHk6IEZhY2lsaXR5V2l0aEd1aWQpOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIHZhbGlkRnJvbURhdGVUaW1lOiB0aGlzLnRvRGF0ZVN0cmluZyhndWVzdC52YWxpZEZyb21EYXRlKSxcbiAgICAgIHZhbGlkVG9EYXRlVGltZTogdGhpcy50b0RhdGVTdHJpbmcoZ3Vlc3QudmFsaWRUb0RhdGUpLFxuICAgICAgY29tcGFueU5hbWU6IGd1ZXN0LmNvbXBhbnlOYW1lLFxuICAgICAgc3ViQ29tcGFueU5hbWU6IGd1ZXN0LnN1YkNvbXBhbnlOYW1lLFxuICAgICAgcGFya05hbWU6IGZhY2lsaXR5Py5kYXRhPy5uYW1lLFxuICAgICAgcHJvZHVjZWREYXRlVGltZTogdGhpcy50b0RhdGVTdHJpbmcoZ3Vlc3QucHJvZHVjZWREYXRlKSxcbiAgICAgIGlkOiBndWVzdC5ndWVzdElELFxuICAgICAgZmlyc3ROYW1lOiBndWVzdC5maXJzdE5hbWUsXG4gICAgICBsYXN0TmFtZTogZ3Vlc3QubGFzdE5hbWUsXG4gICAgICBwbGF0ZUlkOiBndWVzdC5jYXJQbGF0ZSxcbiAgICAgIG5hbWU6IGd1ZXN0Lm5hbWUsXG4gICAgICBjYXJkOiBndWVzdC5jcmVkaXQsXG4gICAgICBhZGRyZXNzOiBnZXRBZGRyZXNzKGd1ZXN0LmNpdHksIGd1ZXN0LnN0cmVldCksXG4gICAgICBxckNvZGU6IGd1ZXN0LnFyQ29kZSxcbiAgICAgIGd1aWQ6IGZhY2lsaXR5Lmd1aWQsXG4gICAgICBwYXJrSWQ6IGZhY2lsaXR5LmRhdGEuaWQsXG4gICAgICBxclBsYWluVGV4dDogZ3Vlc3QucXJQbGFpblRleHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gIH1cblxuICBwcml2YXRlIGlzR3Vlc3RDaGlsZCA9IChndWVzdDogVkd1ZXN0V2l0aEJhdGNoRHRvKSA9PiBndWVzdC5ndWVzdElEICE9PSBudWxsICYmIGd1ZXN0LmJhdGNoSUQgPiAwO1xuXG4gIHByaXZhdGUgZ2V0R3Vlc3RJbmRleChkaXNwbGF5ZWRHdWVzdHM6IFZHdWVzdFdpdGhCYXRjaER0b1tdLCBndWVzdElkOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBkaXNwbGF5ZWRHdWVzdHMuZmluZEluZGV4KGd1ZXN0ID0+IGd1ZXN0Lmd1ZXN0SUQgPT09IGd1ZXN0SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblVwZGF0ZUJhc2ljR3Vlc3ROZXh0KGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGFjdGlvbjogVXBkYXRlQmFzaWNHdWVzdEFjdGlvbiwgaGFuZGxlZDogVkd1ZXN0V2l0aEJhdGNoRHRvSHR0cFJlc3BvbnNlRGF0YSwgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkKSB7XG4gICAgdGhpcy51cGRhdGVHdWVzdEluU3RvcmUoY3R4LCBoYW5kbGVkLmRhdGEsIGFjdGlvbi5ndWlkKTtcbiAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MsXG4gICAgICBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvblVwZGF0ZUJhc2ljR3Vlc3RFcnJvcihtZXNzYWdlQmFyUGF5bG9hZDogTWVzc2FnZUJhclBheWxvYWQpIHtcbiAgICBtZXNzYWdlQmFyUGF5bG9hZC5lbnRpdHkgPSBsb3dlckNhc2VGaXJzdExldHRlcihcbiAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eVxuICAgICk7XG4gICAgbWVzc2FnZUJhclBheWxvYWQuYWN0aW9uID0gbG93ZXJDYXNlRmlyc3RMZXR0ZXIoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi51cGRhdGUpXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLmVycm9yKFxuICAgICAgTG9jYWxpemF0aW9uLmVudGl0eV9mYWlsZWQsXG4gICAgICBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZClcbiAgICApO1xuICB9XG59XG4iXX0=