@sinequa/assistant 3.8.3 → 3.8.5-rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/chat/styles/assistant.scss +102 -102
- package/chat/styles/references.scss +22 -22
- package/chat/websocket-chat.service.d.ts +4 -2
- package/esm2020/chat/charts/chart/chart.component.mjs +3 -3
- package/esm2020/chat/chat-message/chat-message.component.mjs +3 -3
- package/esm2020/chat/chat-reference/chat-reference.component.mjs +3 -3
- package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +3 -3
- package/esm2020/chat/chat.component.mjs +3 -3
- package/esm2020/chat/chat.service.mjs +1 -1
- package/esm2020/chat/debug-message/debug-message.component.mjs +3 -3
- package/esm2020/chat/documents-upload/document-list/document-list.component.mjs +3 -3
- package/esm2020/chat/documents-upload/document-overview/document-overview.component.mjs +3 -3
- package/esm2020/chat/documents-upload/document-upload/document-upload.component.mjs +3 -3
- package/esm2020/chat/documents-upload/documents-upload.model.mjs +1 -1
- package/esm2020/chat/documents-upload/documents-upload.service.mjs +1 -1
- package/esm2020/chat/format-icon/format-icon.component.mjs +1 -1
- package/esm2020/chat/format-icon/icons.mjs +1 -1
- package/esm2020/chat/initials-avatar/initials-avatar.component.mjs +3 -3
- package/esm2020/chat/instance-manager.service.mjs +1 -1
- package/esm2020/chat/messages/de.mjs +1 -1
- package/esm2020/chat/messages/en.mjs +1 -1
- package/esm2020/chat/messages/fr.mjs +1 -1
- package/esm2020/chat/messages/index.mjs +1 -1
- package/esm2020/chat/prompt.component.mjs +23 -23
- package/esm2020/chat/public-api.mjs +1 -1
- package/esm2020/chat/rest-chat.service.mjs +1 -1
- package/esm2020/chat/saved-chats/saved-chats.component.mjs +3 -3
- package/esm2020/chat/token-progress-bar/token-progress-bar.component.mjs +3 -3
- package/esm2020/chat/types.mjs +1 -1
- package/esm2020/chat/websocket-chat.service.mjs +41 -70
- package/esm2020/public-api.mjs +1 -1
- package/fesm2015/sinequa-assistant-chat.mjs +85 -114
- package/fesm2015/sinequa-assistant-chat.mjs.map +1 -1
- package/fesm2015/sinequa-assistant.mjs.map +1 -1
- package/fesm2020/sinequa-assistant-chat.mjs +85 -114
- package/fesm2020/sinequa-assistant-chat.mjs.map +1 -1
- package/fesm2020/sinequa-assistant.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import { Injectable, inject } from "@angular/core";
|
|
|
2
2
|
import { HttpTransportType, LogLevel } from "@microsoft/signalr";
|
|
3
3
|
import { Observable, Subject, catchError, defer, forkJoin, from, fromEvent, map, merge, mergeMap, of, switchMap, take, takeUntil, tap, throwError } from "rxjs";
|
|
4
4
|
import { AuthenticationService } from "@sinequa/core/login";
|
|
5
|
-
import { SignalRWebService } from "@sinequa/core/web-services";
|
|
5
|
+
import { JsonMethodPluginService, SignalRWebService } from "@sinequa/core/web-services";
|
|
6
6
|
import { ChatService } from "./chat.service";
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export class WebSocketChatService extends ChatService {
|
|
@@ -15,6 +15,8 @@ export class WebSocketChatService extends ChatService {
|
|
|
15
15
|
this._debugMessages = [];
|
|
16
16
|
this.signalRService = inject(SignalRWebService);
|
|
17
17
|
this.authenticationService = inject(AuthenticationService);
|
|
18
|
+
this.jsonMethodWebService = inject(JsonMethodPluginService);
|
|
19
|
+
this.restUrl = "SinequaAssistantREST";
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
22
|
* Initialize the assistant process.
|
|
@@ -281,65 +283,48 @@ export class WebSocketChatService extends ChatService {
|
|
|
281
283
|
return;
|
|
282
284
|
}
|
|
283
285
|
const data = {
|
|
286
|
+
action: "SavedChatList",
|
|
284
287
|
instanceId: this.chatInstanceId,
|
|
285
288
|
debug: this.assistantConfig$.value.defaultValues.debug
|
|
286
289
|
};
|
|
287
|
-
this.
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
// Invoke the method SavedChatList
|
|
291
|
-
this.connection.invoke('SavedChatList', data)
|
|
292
|
-
.catch(error => {
|
|
293
|
-
console.error('Error invoking SavedChatList:', error);
|
|
294
|
-
return Promise.resolve();
|
|
290
|
+
this.jsonMethodWebService.get(this.restUrl, data).subscribe(res => this.savedChats$.next(res.savedChats), error => {
|
|
291
|
+
console.error('Error occurred while calling the SavedChatList API:', error.error.errorMessage);
|
|
292
|
+
this.notificationsService.error('Error occurred while calling the SavedChatList API:', error.error.errorMessage);
|
|
295
293
|
});
|
|
296
294
|
}
|
|
297
|
-
|
|
298
|
-
const savedChatSubject$ = new Subject();
|
|
295
|
+
addSavedChat(messages) {
|
|
299
296
|
const data = {
|
|
297
|
+
action: "SavedChatAdd",
|
|
300
298
|
instanceId: this.chatInstanceId,
|
|
301
|
-
savedChatId:
|
|
299
|
+
savedChatId: this.chatId,
|
|
300
|
+
history: messages,
|
|
302
301
|
debug: this.assistantConfig$.value.defaultValues.debug
|
|
303
302
|
};
|
|
304
|
-
this.
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
})
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
savedChatSubject$.error(new Error(error));
|
|
313
|
-
return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection when no further error handling exists downstream
|
|
314
|
-
});
|
|
315
|
-
return savedChatSubject$.asObservable();
|
|
303
|
+
return this.jsonMethodWebService.post(this.restUrl, data).pipe(map(res => res.savedChat), tap((savedChat) => {
|
|
304
|
+
this.setSavedChatId(savedChat.id); // Persist the savedChatId
|
|
305
|
+
this.generateAuditEvent('saved-chat.add', {}, savedChat.id); // Generate audit event
|
|
306
|
+
}), catchError((error) => {
|
|
307
|
+
console.error('Error occurred while calling the SavedChatAdd API:', error.error.errorMessage);
|
|
308
|
+
this.notificationsService.error('Error occurred while calling the SavedChatAdd API:', error.error.errorMessage);
|
|
309
|
+
return throwError(() => error);
|
|
310
|
+
}));
|
|
316
311
|
}
|
|
317
|
-
|
|
318
|
-
const addSavedChatSubject$ = new Subject();
|
|
312
|
+
getSavedChat(id) {
|
|
319
313
|
const data = {
|
|
314
|
+
action: "SavedChatGet",
|
|
320
315
|
instanceId: this.chatInstanceId,
|
|
321
|
-
savedChatId:
|
|
322
|
-
history: messages,
|
|
316
|
+
savedChatId: id,
|
|
323
317
|
debug: this.assistantConfig$.value.defaultValues.debug
|
|
324
318
|
};
|
|
325
|
-
this.
|
|
326
|
-
|
|
327
|
-
this.
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
});
|
|
331
|
-
// Invoke the method SavedChatAdd
|
|
332
|
-
this.connection.invoke('SavedChatAdd', data)
|
|
333
|
-
.catch(error => {
|
|
334
|
-
console.error('Error invoking SavedChatAdd:', error);
|
|
335
|
-
addSavedChatSubject$.error(new Error(error));
|
|
336
|
-
return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection when no further error handling exists downstream
|
|
337
|
-
});
|
|
338
|
-
return addSavedChatSubject$.asObservable();
|
|
319
|
+
return this.jsonMethodWebService.get(this.restUrl, data).pipe(map(res => res.savedChat), catchError((error) => {
|
|
320
|
+
console.error('Error occurred while calling the SavedChatGet API:', error.error.errorMessage);
|
|
321
|
+
this.notificationsService.error('Error occurred while calling the SavedChatGet API:', error.error.errorMessage);
|
|
322
|
+
return throwError(() => error);
|
|
323
|
+
}));
|
|
339
324
|
}
|
|
340
325
|
updateSavedChat(id, name, messages) {
|
|
341
|
-
const updateSavedChatSubject$ = new Subject();
|
|
342
326
|
const data = {
|
|
327
|
+
action: "SavedChatUpdate",
|
|
343
328
|
instanceId: this.chatInstanceId,
|
|
344
329
|
savedChatId: id,
|
|
345
330
|
debug: this.assistantConfig$.value.defaultValues.debug
|
|
@@ -348,38 +333,24 @@ export class WebSocketChatService extends ChatService {
|
|
|
348
333
|
data["title"] = name;
|
|
349
334
|
if (messages)
|
|
350
335
|
data["history"] = messages;
|
|
351
|
-
this.
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
this.connection.invoke('SavedChatUpdate', data)
|
|
357
|
-
.catch(error => {
|
|
358
|
-
console.error('Error invoking SavedChatUpdate:', error);
|
|
359
|
-
updateSavedChatSubject$.error(new Error(error));
|
|
360
|
-
return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection when no further error handling exists downstream
|
|
361
|
-
});
|
|
362
|
-
return updateSavedChatSubject$.asObservable();
|
|
336
|
+
return this.jsonMethodWebService.post(this.restUrl, data).pipe(map(res => res.savedChat), catchError((error) => {
|
|
337
|
+
console.error('Error occurred while calling the SavedChatUpdate API:', error.error.errorMessage);
|
|
338
|
+
this.notificationsService.error('Error occurred while calling the SavedChatUpdate API:', error.error.errorMessage);
|
|
339
|
+
return throwError(() => error);
|
|
340
|
+
}));
|
|
363
341
|
}
|
|
364
342
|
deleteSavedChat(ids) {
|
|
365
|
-
const deleteSavedChatSubject$ = new Subject();
|
|
366
343
|
const data = {
|
|
344
|
+
action: "SavedChatDelete",
|
|
367
345
|
instanceId: this.chatInstanceId,
|
|
368
|
-
|
|
346
|
+
savedChatIds: ids,
|
|
369
347
|
debug: this.assistantConfig$.value.defaultValues.debug
|
|
370
348
|
};
|
|
371
|
-
this.
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
this.connection.invoke('SavedChatDelete', data)
|
|
377
|
-
.catch(error => {
|
|
378
|
-
console.error('Error invoking SavedChatDelete:', error);
|
|
379
|
-
deleteSavedChatSubject$.error(new Error(error));
|
|
380
|
-
return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection when no further error handling exists downstream
|
|
381
|
-
});
|
|
382
|
-
return deleteSavedChatSubject$.asObservable();
|
|
349
|
+
return this.jsonMethodWebService.post(this.restUrl, data).pipe(map(res => res.deletedCount), catchError((error) => {
|
|
350
|
+
console.error('Error occurred while calling the SavedChatDelete API:', error.error.errorMessage);
|
|
351
|
+
this.notificationsService.error('Error occurred while calling the SavedChatDelete API:', error.error.errorMessage);
|
|
352
|
+
return throwError(() => error);
|
|
353
|
+
}));
|
|
383
354
|
}
|
|
384
355
|
/**
|
|
385
356
|
* Initialize out-of-the-box handlers
|
|
@@ -641,4 +612,4 @@ WebSocketChatService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0",
|
|
|
641
612
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WebSocketChatService, decorators: [{
|
|
642
613
|
type: Injectable
|
|
643
614
|
}], ctorParameters: function () { return []; } });
|
|
644
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3dlYnNvY2tldC1jaGF0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFpQixRQUFRLEVBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFDaEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdoSyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQXFCLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUk3QyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsV0FBVztJQWVuRDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBWkYscUJBQWdCLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFL0QsZUFBVSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQzlDLGNBQVMsR0FBK0IsU0FBUyxDQUFDO1FBRWxELGlCQUFZLEdBQTRCLEVBQUUsQ0FBQztRQUMzQyxtQkFBYyxHQUFtQixFQUFFLENBQUM7UUFFckMsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzQywwQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FB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LFNBQVMsSUFBSSxFQUFFO1NBQ2pHLENBQUE7SUFDSCxDQUFDOztpSEE5dUJVLG9CQUFvQjtxSEFBcEIsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSHR0cFRyYW5zcG9ydFR5cGUsIEh1YkNvbm5lY3Rpb24sIExvZ0xldmVsLCBNZXNzYWdlSGVhZGVycyB9IGZyb20gXCJAbWljcm9zb2Z0L3NpZ25hbHJcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGNhdGNoRXJyb3IsIGRlZmVyLCBmb3JrSm9pbiwgZnJvbSwgZnJvbUV2ZW50LCBtYXAsIG1lcmdlLCBtZXJnZU1hcCwgb2YsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsLCB0YXAsIHRocm93RXJyb3IgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvbG9naW5cIjtcbmltcG9ydCB7IENvbm5lY3Rpb25PcHRpb25zLCBTaWduYWxSV2ViU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL3dlYi1zZXJ2aWNlc1wiO1xuXG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuL2NoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgQWN0aW9uTWVzc2FnZSwgQWN0aW9uUmVzdWx0RXZlbnQsIEFjdGlvblN0YXJ0RXZlbnQsIEFjdGlvblN0b3BFdmVudCwgQ2hhdENvbnRleHRBdHRhY2htZW50LCBDaGF0TWVzc2FnZSwgQ2hhdFBheWxvYWQsIENoYXRQcm9ncmVzcywgQ2hhdFJlc3BvbnNlLCBDb250ZXh0TWVzc2FnZUV2ZW50LCBEZWJ1Z01lc3NhZ2UsIERlYnVnTWVzc2FnZUV2ZW50LCBFcnJvckV2ZW50LCBHbGxtRnVuY3Rpb24sIEdsbG1Nb2RlbERlc2NyaXB0aW9uLCBIaXN0b3J5RXZlbnQsIE1lc3NhZ2VFdmVudCwgTWVzc2FnZUhhbmRsZXIsIFF1b3RhRXZlbnQsIFNhdmVkQ2hhdCwgU2F2ZWRDaGF0SGlzdG9yeSwgU3VnZ2VzdGVkQWN0aW9uc0V2ZW50IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldENoYXRTZXJ2aWNlIGV4dGVuZHMgQ2hhdFNlcnZpY2Uge1xuXG4gIHB1YmxpYyBjb25uZWN0aW9uOiBIdWJDb25uZWN0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX21lc3NhZ2VIYW5kbGVyczogTWFwPHN0cmluZywgTWVzc2FnZUhhbmRsZXI8YW55Pj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3Jlc3BvbnNlOiBDaGF0TWVzc2FnZVtdO1xuICBwcml2YXRlIF9hY3Rpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgQWN0aW9uTWVzc2FnZT4oKTtcbiAgcHJpdmF0ZSBfcHJvZ3Jlc3M6IENoYXRQcm9ncmVzc1tdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9leGVjdXRpb25UaW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX2F0dGFjaG1lbnRzOiBDaGF0Q29udGV4dEF0dGFjaG1lbnRbXSA9IFtdO1xuICBwcml2YXRlIF9kZWJ1Z01lc3NhZ2VzOiBEZWJ1Z01lc3NhZ2VbXSA9IFtdO1xuXG4gIHB1YmxpYyBzaWduYWxSU2VydmljZSA9IGluamVjdChTaWduYWxSV2ViU2VydmljZSk7XG4gIHB1YmxpYyBhdXRoZW50aWNhdGlvblNlcnZpY2UgPSBpbmplY3QoQXV0aGVudGljYXRpb25TZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGFzc2lzdGFudCBwcm9jZXNzLlxuICAgKiBJdCBpbmNsdWRlcyBidWlsZGluZyBhbmQgc3RhcnRpbmcgYSBjb25uZWN0aW9uLCBleGVjdXRpbmcgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zLCBhbmQgaGFuZGxpbmcgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2Vzcy5cbiAgICog4pqg77iPIFRoaXMgbWV0aG9kIE1VU1QgYmUgY2FsbGVkIE9OTFkgaWYgdGhlIHVzZXIgaXMgbG9nZ2VkSW4gYW5kIG9uY2Ugd2hlbiB0aGUgYXNzaXN0YW50IGlzIGluaXRpYWxpemVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlPGJvb2xlYW4+IGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb2YgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBpbml0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIC8vIEVuc3VyZSBhbGwgbG9naWMgaXMgZXhlY3V0ZWQgd2hlbiBzdWJzY3JpYmVkIHRvIHRoZSBvYnNlcnZhYmxlXG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgIHRoaXMuZ2V0UmVxdWVzdHNVcmwoKTtcblxuICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuYnVpbGRDb25uZWN0aW9uKClcbiAgICAgICAgKS5waXBlKFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5pbml0TWVzc2FnZUhhbmRsZXJzKCkpLFxuICAgICAgICAvLyBTdGFydCB0aGUgY29ubmVjdGlvblxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zdGFydENvbm5lY3Rpb24oKSksXG4gICAgICAgIC8vIEV4ZWN1dGUgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgIGZvcmtKb2luKFtcbiAgICAgICAgICAgIHRoaXMubGlzdE1vZGVscygpLFxuICAgICAgICAgICAgdGhpcy5saXN0RnVuY3Rpb25zKClcbiAgICAgICAgICBdKVxuICAgICAgICApLFxuICAgICAgICAvLyBNYXAgdGhlIHJlc3VsdHMgb2YgcGFyYWxsZWwgcmVxdWVzdHMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzc1xuICAgICAgICBtYXAoKFttb2RlbHMsIGZ1bmN0aW9uc10pID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSAhIW1vZGVscyAmJiAhIWZ1bmN0aW9ucztcbiAgICAgICAgICB0aGlzLmluaXRQcm9jZXNzJC5uZXh0KHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSksXG4gICAgICAgIC8vIEFueSBlcnJvcnMgZHVyaW5nIHRoZSBwcm9jZXNzIGFyZSBjYXVnaHQsIGxvZ2dlZCwgYW5kIHJlLXRocm93biB0byBwcm9wYWdhdGUgdGhlIGVycm9yIGZ1cnRoZXJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZDonLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIGFzc2lzdGFudCBlbmRwb2ludCB0byB1c2UgZm9yIHRoZSB3ZWJzb2NrZXQgcmVxdWVzdHNcbiAgICogSXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcCBjb25maWdcbiAgICovXG4gIGdldFJlcXVlc3RzVXJsKCkge1xuICAgIGlmICh0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmNvbm5lY3Rpb25TZXR0aW5ncy53ZWJzb2NrZXRFbmRwb2ludCkge1xuICAgICAgdGhpcy5SRVFVRVNUX1VSTCA9IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuY29ubmVjdGlvblNldHRpbmdzLndlYnNvY2tldEVuZHBvaW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSAnd2Vic29ja2V0RW5kcG9pbnQnIG11c3QgYmUgcHJvdmlkZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHVzZSAnV2ViU29ja2V0JyBpbiBhc3Npc3RhbnQgaW5zdGFuY2VgKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZVVzZXIoKTogdm9pZCB7XG4gICAgaWYgKCEodGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UudXNlck92ZXJyaWRlQWN0aXZlICYmIHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnVzZXJPdmVycmlkZSkpIHtcbiAgICAgIHRoaXMudXNlck92ZXJyaWRlJC5uZXh0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIE92ZXJyaWRlVXNlciBtZXRob2RcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIHVzZXI6IHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnVzZXJPdmVycmlkZS51c2VyTmFtZSxcbiAgICAgIGRvbWFpbjogdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UudXNlck92ZXJyaWRlLmRvbWFpblxuICAgIH1cblxuICAgIC8vIEludm9rZSB0aGUgT3ZlcnJpZGVVc2VyIG1ldGhvZCBhbmQgaGFuZGxlIGVycm9yc1xuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdPdmVycmlkZVVzZXInLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlcykgPT4gdGhpcy51c2VyT3ZlcnJpZGUkLm5leHQoISFyZXMpKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgT3ZlcnJpZGVVc2VyOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyAvLyBSZXR1cm4gYSByZXNvbHZlZCBwcm9taXNlIHRvIGhhbmRsZSB0aGUgZXJyb3IgYW5kIHByZXZlbnQgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIHdoZW4gbm8gZnVydGhlciBlcnJvciBoYW5kbGluZyBleGlzdHMgZG93bnN0cmVhbVxuICAgICAgfSk7XG5cbiAgfVxuXG4gIGxpc3RNb2RlbHMoKTogT2JzZXJ2YWJsZTxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbW9kZWxzU3ViamVjdCQgPSBuZXcgU3ViamVjdDxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uIS5vbignTGlzdE1vZGVscycsIChyZXMpID0+IHtcbiAgICAgIHRoaXMubW9kZWxzID0gKHJlcy5tb2RlbHMgYXMgR2xsbU1vZGVsRGVzY3JpcHRpb25bXSB8IHVuZGVmaW5lZCk/LmZpbHRlcihtb2RlbCA9PiAhIW1vZGVsLmVuYWJsZSk7XG4gICAgICBtb2RlbHNTdWJqZWN0JC5uZXh0KHRoaXMubW9kZWxzKTtcbiAgICAgIG1vZGVsc1N1YmplY3QkLmNvbXBsZXRlKClcbiAgICB9KTtcblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBsaXN0IG9mIG1vZGVsc1xuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdMaXN0TW9kZWxzJywgeyBkZWJ1ZzogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBMaXN0TW9kZWxzOicsIGVycm9yKTtcbiAgICAgICAgbW9kZWxzU3ViamVjdCQuZXJyb3IobmV3IEVycm9yKGVycm9yKSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gUmV0dXJuIGEgcmVzb2x2ZWQgcHJvbWlzZSB0byBoYW5kbGUgdGhlIGVycm9yIGFuZCBwcmV2ZW50IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiB3aGVuIG5vIGZ1cnRoZXIgZXJyb3IgaGFuZGxpbmcgZXhpc3RzIGRvd25zdHJlYW1cbiAgICAgIH0pXG5cbiAgICByZXR1cm4gbW9kZWxzU3ViamVjdCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBsaXN0RnVuY3Rpb25zKCk6IE9ic2VydmFibGU8R2xsbUZ1bmN0aW9uW10gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBmdW5jdGlvbnNTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkPigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uIS5vbignTGlzdEZ1bmN0aW9ucycsIChyZXMpID0+IHtcbiAgICAgIHRoaXMuZnVuY3Rpb25zID0gKHJlcy5mdW5jdGlvbnMgYXMgR2xsbUZ1bmN0aW9uW10gfCB1bmRlZmluZWQpPy5maWx0ZXIoZnVuYyA9PiBmdW5jLmVuYWJsZWQpO1xuICAgICAgZnVuY3Rpb25zU3ViamVjdCQubmV4dCh0aGlzLmZ1bmN0aW9ucyk7XG4gICAgICBmdW5jdGlvbnNTdWJqZWN0JC5jb21wbGV0ZSgpXG4gICAgfSk7XG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0IHRvIGdldCB0aGUgbGlzdCBvZiBmdW5jdGlvbnNcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnTGlzdEZ1bmN0aW9ucycsIHsgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1ZyB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgTGlzdEZ1bmN0aW9uczonLCBlcnJvcik7XG4gICAgICAgIGZ1bmN0aW9uc1N1YmplY3QkLmVycm9yKG5ldyBFcnJvcihlcnJvcikpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2hlbiBubyBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nIGV4aXN0cyBkb3duc3RyZWFtXG4gICAgICB9KVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uc1N1YmplY3QkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZmV0Y2gobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHF1ZXJ5OiBRdWVyeSk6IE9ic2VydmFibGU8Q2hhdFJlc3BvbnNlPiB7XG4gICAgLy8gU3RhcnQgc3RyZWFtaW5nIGJ5IGludm9raW5nIHRoZSBDaGF0IG1ldGhvZFxuICAgIHRoaXMuc3RyZWFtaW5nJC5uZXh0KHRydWUpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgcGF5bG9hZCB0byBzZW5kIHRvIHRoZSBDaGF0IG1ldGhvZFxuICAgIGNvbnN0IGRhdGE6IENoYXRQYXlsb2FkID0ge1xuICAgICAgaGlzdG9yeTogbWVzc2FnZXMsXG4gICAgICBmdW5jdGlvbnM6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5mdW5jdGlvbnM/LmZpbHRlcihmdW5jID0+IGZ1bmMuZW5hYmxlZCkubWFwKGZ1bmMgPT4gZnVuYy5uYW1lKSxcbiAgICAgIGRlYnVnOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWcsXG4gICAgICBzZXJ2aWNlU2V0dGluZ3M6IHtcbiAgICAgICAgc2VydmljZV9pZDogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLnNlcnZpY2VfaWQsXG4gICAgICAgIG1vZGVsX2lkOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMubW9kZWxfaWQsXG4gICAgICAgIHRvcF9wOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMudG9wX3AsXG4gICAgICAgIHRlbXBlcmF0dXJlOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMudGVtcGVyYXR1cmUsXG4gICAgICAgIG1heF90b2tlbnM6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5tYXhfdG9rZW5zLFxuICAgICAgICAuLi50aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmFkZGl0aW9uYWxTZXJ2aWNlU2V0dGluZ3NcbiAgICAgIH0sXG4gICAgICBhcHBRdWVyeToge1xuICAgICAgICBhcHA6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgICBxdWVyeVxuICAgICAgfSxcbiAgICAgIGdlbmVyaWNDaGF0RXJyb3JNZXNzYWdlOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmdsb2JhbFNldHRpbmdzLmdlbmVyaWNDaGF0RXJyb3JNZXNzYWdlXG4gICAgfVxuICAgIGlmICh0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLnNhdmVkQ2hhdFNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIGRhdGEuaW5zdGFuY2VJZCA9IHRoaXMuY2hhdEluc3RhbmNlSWQ7XG4gICAgICBkYXRhLnNhdmVkQ2hhdElkID0gdGhpcy5zYXZlZENoYXRJZDtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSByZXNwb25zZSB3aXRoIGFuIGVtcHR5IGFzc2lzdGFudCBtZXNzYWdlXG4gICAgdGhpcy5fcmVzcG9uc2UgPSBbe3JvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IFwiXCIsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdHJ1ZX19XSAvLyBoZXJlIGRpc3BsYXk6IHRydWUgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gc2hvdyB0aGUgcHJvZ3Jlc3NcblxuICAgIC8vIENyZWF0ZSBhIFN1YmplY3QgdG8gc2lnbmFsIGNvbXBsZXRpb25cbiAgICBjb25zdCBjb21wbGV0aW9uJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvLyBDcmVhdGUgb2JzZXJ2YWJsZXMgZm9yIGVhY2ggbm9uLWdsb2JhbCBoYW5kbGVyIGluIHRoZSBfbWVzc2FnZUhhbmRsZXJzIG1hcCAoZGVmYXVsdCBhbmQgZXZlbnR1YWwgY3VzdG9tIG9uZXMpIG9uY2UgaXQgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBodWIgY29ubmVjdGlvblxuICAgIGNvbnN0IG9ic2VydmFibGVzID0gQXJyYXlcbiAgICAgIC5mcm9tKHRoaXMuX21lc3NhZ2VIYW5kbGVycy5lbnRyaWVzKCkpXG4gICAgICAuZmlsdGVyKChbZXZlbnROYW1lLCBldmVudEhhbmRsZXJdKSA9PiAhZXZlbnRIYW5kbGVyLmlzR2xvYmFsSGFuZGxlcilcbiAgICAgIC5tYXAoKFtldmVudE5hbWUsIGV2ZW50SGFuZGxlcl0pID0+IHtcbiAgICAgICAgcmV0dXJuIGZyb21FdmVudDxhbnk+KHRoaXMuY29ubmVjdGlvbiEsIGV2ZW50TmFtZSkucGlwZShcbiAgICAgICAgICBtZXJnZU1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFdyYXAgdGhlIGhhbmRsZXIgaW4gYSB0cnktY2F0Y2ggYmxvY2sgdG8gcHJldmVudCB0aGUgZW50aXJlIHN0cmVhbSBmcm9tIGZhaWxpbmcgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgc2luZ2xlIGhhbmRsZXJcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIGhhbmRsZXIgYW5kIGVtaXQgdGhlIHJlc3VsdFxuICAgICAgICAgICAgICAvLyBOQjogaGVyZSB3ZSBjb3VsZCB1c2UgW2V2ZW50SGFuZGxlci5oYW5kbGVyKGV2ZW50KV0gd2hpY2ggYmVoaW5kIHRoZSBzY2VuZXMgbWVyZ2VNYXAgaW50ZXJwcmV0cyB0aGlzIGFycmF5IGFzIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCBvbmUgaXRlbSwgd2hpY2ggaXQgdGhlbiBlbWl0c1xuICAgICAgICAgICAgICByZXR1cm4gb2YoZXZlbnRIYW5kbGVyLmhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIGV2ZW50IGhhbmRsZXIgZm9yICR7ZXZlbnROYW1lfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgIC8vIFVzZSB0aHJvd0Vycm9yIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgZG93bnN0cmVhbVxuICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoYEVycm9yIGluIGV2ZW50IGhhbmRsZXIgZm9yICR7ZXZlbnROYW1lfTogJHtlcnJvcn1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gVGhlbiBtZXJnZSB0aGVtIGludG8gYSBzaW5nbGUgb2JzZXJ2YWJsZSBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgc3RyZWFtaW5nIGJlaGF2aW9yXG4gICAgY29uc3QgY29tYmluZWQkID0gbWVyZ2UoLi4ub2JzZXJ2YWJsZXMpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAvLyBEZWZpbmUgJHByb2dyZXNzIGZyb20gdGhlIF9hY3Rpb25NYXBcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IEFycmF5LmZyb20odGhpcy5fYWN0aW9uTWFwLnZhbHVlcygpKTtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3MgPSBhY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhY3Rpb25zLm1hcCgoYSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGEuZGlzcGxheU5hbWUgPz8gXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogYS5kaXNwbGF5VmFsdWUgPz8gXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogYS5leGVjdXRpb25UaW1lICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IGEuZXhlY3V0aW9uVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIE9OTFkgdGhlIGZpcnN0IGFzc2lzdGFudCBtZXNzYWdlIG9mIHRoZSBfcmVzcG9uc2Ugd2l0aCB0aGUgbmV3ICRwcm9ncmVzcywgJGF0dGFjaG1lbnQgYW5kICRkZWJ1Z1xuICAgICAgICAvLyBBc3N1bWluZyB0aGF0IHRoZSBmaXJzdCBhc3Npc3RhbnQgbWVzc2FnZSBpcyBhbHdheXMgdmlzaWJsZSBzaW5jZSB0aGUgaHViIGRvZXMgbm90IHNlbmQgaGlkZGVuIG1lc3NhZ2VzIGJ5IGRlc2lnblxuICAgICAgICAvLyBTbyBldmVuIGlmIHRoZSBmaXJzdCBhc3Npc3RhbnQgbWVzc2FnZSBpcyBoaWRkZW4gKGRpc3BsYXk6IGZhbHNlKSwgdGhlIF9yZXNwb25zZVswXSB3aWxsIGFuZCBzaG91bGQgY29udGFpbiA6XG4gICAgICAgIC8vICAtICRwcm9ncmVzcywgJGF0dGFjaG1lbnQgYW5kICRkZWJ1Z1xuICAgICAgICAvLyAgLSB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgdmlzaWJsZSBhc3Npc3RhbnQgbWVzc2FnZSBpbiB0aGUgd29ya2Zsb3dcbiAgICAgICAgLy8gVGhpcyBpcyBtYW5kYXRvcnkgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9mIGNvbnNlY3V0aXZlIG1lc3NhZ2VzIGFuZCBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIHRoZSBjaGF0SGlzdG9yeVxuICAgICAgICBpZighIXRoaXMuX3Byb2dyZXNzIHx8IHRoaXMuX2F0dGFjaG1lbnRzLmxlbmd0aCA+IDAgfHwgdGhpcy5fZGVidWdNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2VbMF0uYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzID0gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2VbMF0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQgPSB0aGlzLl9hdHRhY2htZW50cztcbiAgICAgICAgICB0aGlzLl9yZXNwb25zZVswXS5hZGRpdGlvbmFsUHJvcGVydGllcy4kZGVidWcgPSB0aGlzLl9kZWJ1Z01lc3NhZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICAgICAgcmV0dXJuIHsgaGlzdG9yeTogWy4uLm1lc3NhZ2VzLCAuLi50aGlzLl9yZXNwb25zZV0sIGV4ZWN1dGlvblRpbWU6IHRoaXMuX2V4ZWN1dGlvblRpbWUgfTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsKGNvbXBsZXRpb24kKSwgLy8gQ29tcGxldGUgdGhlIG9ic2VydmFibGUgd2hlbiBjb21wbGV0aW9uJCBlbWl0c1xuICAgICk7XG5cbiAgICAvLyByZXR1cm4gYSBuZXcgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIGNvbWJpbmVkIHN0cmVhbSBhbmQgaGFuZGxlcyB0aGUgZXZlbnR1YWwgZXJyb3JzIG9mIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBDaGF0IG1ldGhvZFxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICAvLyBTdWJzY3JpYmUgdG8gY29tYmluZWQgc3RyZWFtXG4gICAgICBjb21iaW5lZCQuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHZhbHVlKSA9PiBvYnNlcnZlci5uZXh0KHZhbHVlKSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IG9ic2VydmVyLmVycm9yKGVycilcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbnZva2UgdGhlIENoYXQgbWV0aG9kIGFuZCBoYW5kbGUgZXJyb3JzXG4gICAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnQ2hhdCcsIGRhdGEpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBJZiBhIHZhbGlkIGFzc2lzdGFudCBtZXNzYWdlIHdpdGggKGRpc3BsYXk6IHRydWUpIHdhcyBmb3VuZCwgdXBkYXRlIGl0XG4gICAgICAgICAgLy8gYW5kIGl0IHNob3VsZCBhbHdheXMgdGhlIGNhc2VcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZmlyc3RWaXNpYmxlQXNzaXN0YW50TWVzc2FnZUluZGV4KHRoaXMuY2hhdEhpc3RvcnkpO1xuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhdEhpc3RvcnkhW2luZGV4XS5hZGRpdGlvbmFsUHJvcGVydGllcy4kcHJvZ3Jlc3MgPSB0aGlzLl9wcm9ncmVzcztcbiAgICAgICAgICAgIHRoaXMuY2hhdEhpc3RvcnkhW2luZGV4XS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudCA9IHRoaXMuX2F0dGFjaG1lbnRzO1xuICAgICAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSFbaW5kZXhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRkZWJ1ZyA9IHRoaXMuX2RlYnVnTWVzc2FnZXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNhdmUvdXBkYXRlIHRoZSBjaGF0IGlmIHNhdmVkQ2hhdCBlbmFibGVkXG4gICAgICAgICAgaWYgKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCAmJiB0aGlzLmNoYXRIaXN0b3J5IS5zb21lKChtc2cpID0+IG1zZy5hZGRpdGlvbmFsUHJvcGVydGllcz8uaXNVc2VySW5wdXQgPT09IHRydWUpKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSAhdGhpcy5zYXZlZENoYXRJZCA/IHRoaXMuYWRkU2F2ZWRDaGF0KHRoaXMuY2hhdEhpc3RvcnkhKS5waXBlKHRhcCgoKSA9PiB0aGlzLmxpc3RTYXZlZENoYXQoKSkpIDogdGhpcy51cGRhdGVTYXZlZENoYXQodGhpcy5zYXZlZENoYXRJZCwgdW5kZWZpbmVkLCB0aGlzLmNoYXRIaXN0b3J5KTtcbiAgICAgICAgICAgIGFjdGlvbi5waXBlKHRha2UoMSkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQ6ICgpID0+IHt9LFxuICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1pbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbWluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIENoYXQ6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAvLyBFbWl0IHRoZSBlcnJvciB0byB0aGUgbmV3bHkgY3JlYXRlZCBvYnNlcnZhYmxlXG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAvLyBUaGlzIGJsb2NrIGNvbmNlcm5zIE9OTFkgdGhlIGNvbXBsZXRpb24gb2YgdGhlIFwiQ2hhdFwiIG1ldGhvZCBpbnZvY2F0aW9uLlxuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNvbWJpbmVkJCBzdHJlYW0uXG4gICAgICAgICAgLy8gSXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGVudGlyZSBmZXRjaCBtZXRob2QgKHRoZSBvYnNlcnZhYmxlIHJldHVybmVkIGJ5IGZldGNoKSBhbmQgd2hpY2ggZGVwZW5kcyBvbiB0aGUgY29tcGxldGlvbiBvZiB0aGUgc2F2ZSBjaGF0IGFjdGlvbiBpZiBlbmFibGVkXG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2UgPSBbXTsgLy8gQ2xlYXIgdGhlIF9yZXNwb25zZVxuICAgICAgICAgIHRoaXMuX2FjdGlvbk1hcC5jbGVhcigpOyAvLyBDbGVhciB0aGUgX2FjdGlvbk1hcFxuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzID0gdW5kZWZpbmVkOyAvLyBDbGVhciB0aGUgX3Byb2dyZXNzXG4gICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSBbXTsgLy8gQ2xlYXIgdGhlIF9hdHRhY2htZW50c1xuICAgICAgICAgIHRoaXMuX2RlYnVnTWVzc2FnZXMgPSBbXTsgLy8gQ2xlYXIgdGhlIF9kZWJ1Z01lc3NhZ2VzXG4gICAgICAgICAgdGhpcy5fZXhlY3V0aW9uVGltZSA9IFwiXCI7IC8vIENsZWFyIHRoZSBfZXhlY3V0aW9uVGltZVxuICAgICAgICAgIGNvbXBsZXRpb24kLm5leHQoKTsgLy8gRW1pdCBhIHNpZ25hbCB0byBjb21wbGV0ZSB0aGUgb2JzZXJ2YWJsZXNcbiAgICAgICAgICBjb21wbGV0aW9uJC5jb21wbGV0ZSgpOyAvLyBDb21wbGV0ZSB0aGUgc3ViamVjdFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0b3BHZW5lcmF0aW9uKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIC8vIFN0YXJ0IHN0b3BwaW5nIGdlbmVyYXRpb24gYnkgaW52b2tpbmcgdGhlIENhbmNlbFRhc2tzIG1ldGhvZFxuICAgIHRoaXMuc3RvcHBpbmdHZW5lcmF0aW9uJC5uZXh0KHRydWUpO1xuICAgIC8vIENyZWF0ZSBhIFN1YmplY3QgdG8gaG9sZCB0aGUgcmVzdWx0IG9mIHRoZSBDYW5jZWxUYXNrcyBtZXRob2RcbiAgICBjb25zdCBzdG9wR2VuZXJhdGlvblN1YmplY3QkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ0NhbmNlbFRhc2tzJywgKHJlcykgPT4ge1xuICAgICAgLy8gV2hlbiB0aGUgZ2VuZXJhdGlvbiBpcyBzdG9wcGVkIGJlZm9yZSBzdHJlYW1pbmcgYW55IFZJU0lCTEUgYXNzaXN0YW50IG1lc3NhZ2UsIHRoaXMgbWVhbnMgdGhhdCAkcHJvZ3Jlc3MsICRhdHRhY2htZW50IGFuZCAkZGVidWcgcHJvcGVydGllcyB3aWxsIGJlIGxvc3QuXG4gICAgICAvLyBIb3dldmVyLCB0aGUgXCJDb250ZXh0TWVzc2FnZVwiIGZyYW1lcyB3aWxsIGJlIHBlcnNpc3RlZCBpbiB0aGUgY2hhdEhpc3RvcnkgYW5kIHRoZSBhc3Npc3RhbnQgbWF5IHJlZmVyZW5jZSB0aGVtIGluIHRoZSBuZXh0IGdlbmVyYXRpb24uXG4gICAgICAvLyBUaGlzIGxlYWRzIHRvIHRoZSBwcm9ibGVtIG9mIHJlZmVyZW5jaW5nIHVuZGlzcGxheWVkIGF0dGFjaG1lbnRzIGluIHRoZSBuZXh0IGdlbmVyYXRpb24uXG4gICAgICAvLyBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHdlIG5lZWQgdG8gcGVyc2lzdCAkcHJvZ3Jlc3MsICRhdHRhY2htZW50IGFuZCAkZGVidWcgcHJvcGVydGllcyBieSBhZGRpbmcgYSBuZXcgYXNzaXN0YW50IG1lc3NhZ2Ugd2l0aCBlbXB0eSBjb250ZW50IGFuZCB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAgaWYgKHRoaXMuX3Jlc3BvbnNlLmxlbmd0aCA9PT0gMSAmJiB0aGlzLl9yZXNwb25zZVswXS5jb250ZW50ID09PSBcIlwiKSB7XG4gICAgICAgIHRoaXMuY2hhdEhpc3Rvcnk/LnB1c2goe3JvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IFwiXCIsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdHJ1ZSwgJHByb2dyZXNzOiB0aGlzLl9wcm9ncmVzcywgJGF0dGFjaG1lbnQ6IHRoaXMuX2F0dGFjaG1lbnRzLCAkZGVidWc6IHRoaXMuX2RlYnVnTWVzc2FnZXN9fSk7XG4gICAgICB9XG4gICAgICBzdG9wR2VuZXJhdGlvblN1YmplY3QkLm5leHQoISFyZXMpOyAvLyBFbWl0IHRoZSByZXN1bHQgb2YgdGhlIENhbmNlbFRhc2tzIG1ldGhvZFxuICAgICAgc3RvcEdlbmVyYXRpb25TdWJqZWN0JC5jb21wbGV0ZSgpOyAvLyBDb21wbGV0ZSB0aGUgc3ViamVjdFxuICAgICAgdGhpcy5zdG9wcGluZ0dlbmVyYXRpb24kLm5leHQoZmFsc2UpOyAvLyBDb21wbGV0ZSBzdG9wcGluZyBnZW5lcmF0aW9uXG4gICAgfSk7XG5cbiAgICAvLyBJbnZva2UgdGhlIENhbmNlbFRhc2tzIG1ldGhvZCBhbmQgaGFuZGxlIGVycm9yc1xuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdDYW5jZWxUYXNrcycpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBDYW5jZWxUYXNrczonLCBlcnJvcik7XG4gICAgICAgIHN0b3BHZW5lcmF0aW9uU3ViamVjdCQuZXJyb3IobmV3IEVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMuc3RvcHBpbmdHZW5lcmF0aW9uJC5uZXh0KGZhbHNlKTsgLy8gQ29tcGxldGUgc3RvcHBpbmcgZ2VuZXJhdGlvblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2hlbiBubyBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nIGV4aXN0cyBkb3duc3RyZWFtXG4gICAgICB9KTtcblxuICAgIHJldHVybiBzdG9wR2VuZXJhdGlvblN1YmplY3QkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgbGlzdFNhdmVkQ2hhdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXRMaXN0JywgKHJlcykgPT4ge1xuICAgICAgdGhpcy5zYXZlZENoYXRzJC5uZXh0KHJlcy5zYXZlZENoYXRzKTsgLy8gZW1pdHMgdGhlIHJlc3VsdCB0byB0aGUgc2F2ZWRDaGF0cyQgc3ViamVjdFxuICAgIH0pO1xuXG4gICAgLy8gSW52b2tlIHRoZSBtZXRob2QgU2F2ZWRDaGF0TGlzdFxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXRMaXN0JywgZGF0YSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIFNhdmVkQ2hhdExpc3Q6JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFNhdmVkQ2hhdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc2F2ZWRDaGF0U3ViamVjdCQgPSBuZXcgU3ViamVjdDxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPigpO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZDogaWQsXG4gICAgICBkZWJ1ZzogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ1NhdmVkQ2hhdEdldCcsIChyZXMpID0+IHtcbiAgICAgIHNhdmVkQ2hhdFN1YmplY3QkLm5leHQocmVzLnNhdmVkQ2hhdCk7XG4gICAgICBzYXZlZENoYXRTdWJqZWN0JC5jb21wbGV0ZSgpXG4gICAgfSk7XG5cbiAgICAvLyBJbnZva2UgdGhlIG1ldGhvZCBTYXZlZENoYXRHZXRcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnU2F2ZWRDaGF0R2V0JywgZGF0YSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIFNhdmVkQ2hhdEdldDonLCBlcnJvcik7XG4gICAgICAgIHNhdmVkQ2hhdFN1YmplY3QkLmVycm9yKG5ldyBFcnJvcihlcnJvcikpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2hlbiBubyBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nIGV4aXN0cyBkb3duc3RyZWFtXG4gICAgICB9KVxuXG4gICAgcmV0dXJuIHNhdmVkQ2hhdFN1YmplY3QkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgYWRkU2F2ZWRDaGF0KG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKTogT2JzZXJ2YWJsZTxTYXZlZENoYXQ+IHtcbiAgICBjb25zdCBhZGRTYXZlZENoYXRTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PFNhdmVkQ2hhdD4oKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgc2F2ZWRDaGF0SWQ6IHRoaXMuY2hhdElkLFxuICAgICAgaGlzdG9yeTogbWVzc2FnZXMsXG4gICAgICBkZWJ1ZzogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ1NhdmVkQ2hhdEFkZCcsIChyZXMpID0+IHtcbiAgICAgIHRoaXMuc2V0U2F2ZWRDaGF0SWQocmVzLnNhdmVkQ2hhdC5pZCk7IC8vIFBlcnNpc3QgdGhlIHNhdmVkQ2hhdElkXG4gICAgICB0aGlzLmdlbmVyYXRlQXVkaXRFdmVudCgnc2F2ZWQtY2hhdC5hZGQnLCB7fSwgcmVzLnNhdmVkQ2hhdC5pZCk7IC8vIEdlbmVyYXRlIGF1ZGl0IGV2ZW50XG4gICAgICBhZGRTYXZlZENoYXRTdWJqZWN0JC5uZXh0KHJlcy5zYXZlZENoYXQpO1xuICAgICAgYWRkU2F2ZWRDaGF0U3ViamVjdCQuY29tcGxldGUoKVxuICAgIH0pO1xuXG4gICAgLy8gSW52b2tlIHRoZSBtZXRob2QgU2F2ZWRDaGF0QWRkXG4gICAgdGhpcy5jb25uZWN0aW9uIS5pbnZva2UoJ1NhdmVkQ2hhdEFkZCcsIGRhdGEpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBTYXZlZENoYXRBZGQ6JywgZXJyb3IpO1xuICAgICAgICBhZGRTYXZlZENoYXRTdWJqZWN0JC5lcnJvcihuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyAvLyBSZXR1cm4gYSByZXNvbHZlZCBwcm9taXNlIHRvIGhhbmRsZSB0aGUgZXJyb3IgYW5kIHByZXZlbnQgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIHdoZW4gbm8gZnVydGhlciBlcnJvciBoYW5kbGluZyBleGlzdHMgZG93bnN0cmVhbVxuICAgICAgfSlcblxuICAgIHJldHVybiBhZGRTYXZlZENoYXRTdWJqZWN0JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVNhdmVkQ2hhdChpZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBtZXNzYWdlcz86IENoYXRNZXNzYWdlW10pOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdD4ge1xuICAgIGNvbnN0IHVwZGF0ZVNhdmVkQ2hhdFN1YmplY3QkID0gbmV3IFN1YmplY3Q8U2F2ZWRDaGF0PigpO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZDogaWQsXG4gICAgICBkZWJ1ZzogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcblxuICAgIGlmKG5hbWUpIGRhdGFbXCJ0aXRsZVwiXSA9IG5hbWU7XG4gICAgaWYobWVzc2FnZXMpIGRhdGFbXCJoaXN0b3J5XCJdID0gbWVzc2FnZXM7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXRVcGRhdGUnLCAocmVzKSA9PiB7XG4gICAgICB1cGRhdGVTYXZlZENoYXRTdWJqZWN0JC5uZXh0KHJlcy5zYXZlZENoYXQpO1xuICAgICAgdXBkYXRlU2F2ZWRDaGF0U3ViamVjdCQuY29tcGxldGUoKVxuICAgIH0pO1xuXG4gICAgLy8gSW52b2tlIHRoZSBtZXRob2QgU2F2ZWRDaGF0VXBkYXRlXG4gICAgdGhpcy5jb25uZWN0aW9uIS5pbnZva2UoJ1NhdmVkQ2hhdFVwZGF0ZScsIGRhdGEpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBTYXZlZENoYXRVcGRhdGU6JywgZXJyb3IpO1xuICAgICAgICB1cGRhdGVTYXZlZENoYXRTdWJqZWN0JC5lcnJvcihuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyAvLyBSZXR1cm4gYSByZXNvbHZlZCBwcm9taXNlIHRvIGhhbmRsZSB0aGUgZXJyb3IgYW5kIHByZXZlbnQgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIHdoZW4gbm8gZnVydGhlciBlcnJvciBoYW5kbGluZyBleGlzdHMgZG93bnN0cmVhbVxuICAgICAgfSlcblxuICAgIHJldHVybiB1cGRhdGVTYXZlZENoYXRTdWJqZWN0JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGRlbGV0ZVNhdmVkQ2hhdChpZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBjb25zdCBkZWxldGVTYXZlZENoYXRTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgU2F2ZWRDaGF0SWRzOiBpZHMsXG4gICAgICBkZWJ1ZzogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ1NhdmVkQ2hhdERlbGV0ZScsIChyZXMpID0+IHtcbiAgICAgIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QkLm5leHQocmVzLmRlbGV0ZUNvdW50KTtcbiAgICAgIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QkLmNvbXBsZXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyBJbnZva2UgdGhlIG1ldGhvZCBTYXZlZENoYXREZWxldGVcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnU2F2ZWRDaGF0RGVsZXRlJywgZGF0YSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIFNhdmVkQ2hhdERlbGV0ZTonLCBlcnJvcik7XG4gICAgICAgIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QkLmVycm9yKG5ldyBFcnJvcihlcnJvcikpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2hlbiBubyBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nIGV4aXN0cyBkb3duc3RyZWFtXG4gICAgICB9KVxuXG4gICAgcmV0dXJuIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgb3V0LW9mLXRoZS1ib3ggaGFuZGxlcnNcbiAgICogSXQgaXMgYSBwbGFjZWhvbGRlciBmb3Igbm9uLXN0cmVhbWluZyBzY2VuYXJpb3MsIHdoZXJlIHlvdSBpbnZva2UgYSBzcGVjaWZpYyBodWIgbWV0aG9kLCBhbmQgdGhlIHNlcnZlciByZXNwb25kcyB3aXRoIGZyYW1lIG1lc3NhZ2UocylcbiAgICovXG4gIGluaXRNZXNzYWdlSGFuZGxlcnMoKSB7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiRXJyb3JcIixcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKGVycm9yOiBFcnJvckV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH0sXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogdHJ1ZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiUXVvdGFcIixcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IFF1b3RhRXZlbnQpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVRdW90YShtZXNzYWdlLnF1b3RhKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogdHJ1ZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiRGVidWdcIixcbiAgICAgIHsgaGFuZGxlcjogKCkgPT4ge30sXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogdHJ1ZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiQWN0aW9uU3RhcnRcIixcbiAgICAgIHsgaGFuZGxlcjogKGFjdGlvbjogQWN0aW9uU3RhcnRFdmVudCkgPT4gdGhpcy5fYWN0aW9uTWFwLnNldChhY3Rpb24uZ3VpZCwgYWN0aW9uKSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiQWN0aW9uUmVzdWx0XCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblJlc3VsdEV2ZW50KSA9PiB0aGlzLl9hY3Rpb25NYXAuc2V0KGFjdGlvbi5ndWlkLCB7IC4uLnRoaXMuX2FjdGlvbk1hcC5nZXQoYWN0aW9uLmd1aWQpLCAuLi5hY3Rpb24gfSksXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogZmFsc2VcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXG4gICAgICBcIkFjdGlvblN0b3BcIixcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKGFjdGlvbjogQWN0aW9uU3RvcEV2ZW50KSA9PiB0aGlzLl9hY3Rpb25NYXAuc2V0KGFjdGlvbi5ndWlkLCB7IC4uLnRoaXMuX2FjdGlvbk1hcC5nZXQoYWN0aW9uLmd1aWQpLCAuLi5hY3Rpb24gfSksXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogZmFsc2VcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXG4gICAgICBcIkNvbnRleHRNZXNzYWdlXCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBDb250ZXh0TWVzc2FnZUV2ZW50KSA9PiB0aGlzLl9hdHRhY2htZW50cy5wdXNoKG1lc3NhZ2UubWV0YWRhdGEpLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJNZXNzYWdlXCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBNZXNzYWdlRXZlbnQpID0+IHRoaXMuX3Jlc3BvbnNlLmF0KC0xKSEuY29udGVudCArPSBtZXNzYWdlID8/IFwiXCIsXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogZmFsc2VcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXG4gICAgICBcIkhpc3RvcnlcIixcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKGhpc3Rvcnk6IEhpc3RvcnlFdmVudCkgPT4ge1xuICAgICAgICAgIC8vIFRoZSBDaGF0SGlzdG9yeSBpcyB1cGRhdGVkOiBpdCBpcyB0aGUgY3VycmVudCBjb3B5IGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBuZXcgaXRlbXMgT05MWSAoaXQgY2FuIGhhdmUgbXVsdGlwbGUgbWVzc2FnZXM6IHRoZSBjb250ZXh0IG1lc3NhZ2VzICsgdGhlIHJlc3BvbnNlIG1lc3NhZ2UpXG4gICAgICAgICAgLy8gVGhpcyBpcyBtYW5kYXRvcnkgdG8gbm90IGxvc2UgdGhlIHByZXZpb3VzIHVwZGF0ZXMgb2YgdGhlIGNoYXRIaXN0b3J5IHdoZW4gdGhlIGFzc2lzdGFudCBpcyBzdHJlYW1pbmcgbXVsdGlwbGUgbWVzc2FnZSBzdGVwc1xuICAgICAgICAgIHRoaXMuY2hhdEhpc3RvcnkgPSBbLi4udGhpcy5jaGF0SGlzdG9yeSEsIC4uLihoaXN0b3J5Lmhpc3Rvcnkuc2xpY2UodGhpcy5jaGF0SGlzdG9yeSEubGVuZ3RoKSldO1xuICAgICAgICAgIC8vIEVtaXQgdGhlIHVwZGF0ZWQgY2hhdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAgaWYgKCEhdGhpcy5jaGF0SGlzdG9yeS5hdCgtMSk/LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnVzYWdlTWV0cmljcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGF0VXNhZ2VNZXRyaWNzKHRoaXMuY2hhdEhpc3RvcnkuYXQoLTEpIS5hZGRpdGlvbmFsUHJvcGVydGllcy51c2FnZU1ldHJpY3MhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fZXhlY3V0aW9uVGltZSA9IGhpc3RvcnkuZXhlY3V0aW9uVGltZTtcbiAgICAgICAgfSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiU3VnZ2VzdGVkQWN0aW9uc1wiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogU3VnZ2VzdGVkQWN0aW9uc0V2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gU2luY2UgYWZ0ZXIgdGhlIFwiSGlzdG9yeVwiIGFuZCBcIk1lc3NhZ2VCcmVha1wiIHRoYXQgdGhpcyBldmVudCBpcyBjYXVnaHQsXG4gICAgICAgICAgLy8gJHN1Z2dlc3RlZEFjdGlvbiBuZWVkcyB0byBiZSB1cGRhdGVkIGRpcmVjdGx5IHRvIHRoZSBsYXN0IHZpc2libGUgXCJhc3Npc3RhbnRcIiBtZXNzYWdlIGluIHRoZSBfcmVzcG9uc2UgYW5kIHRoZSBjaGF0SGlzdG9yeVxuICAgICAgICAgIHRoaXMuX3Jlc3BvbnNlLmF0KC0xKSEuYWRkaXRpb25hbFByb3BlcnRpZXMuJHN1Z2dlc3RlZEFjdGlvbiA9ICh0aGlzLl9yZXNwb25zZS5hdCgtMSkhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRzdWdnZXN0ZWRBY3Rpb24gfHwgW10pLmNvbmNhdChtZXNzYWdlLnN1Z2dlc3RlZEFjdGlvbnMpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXN0VmlzaWJsZUFzc2lzdGFudE1lc3NhZ2VJbmRleCh0aGlzLmNoYXRIaXN0b3J5KTtcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRIaXN0b3J5IVtpbmRleF0uYWRkaXRpb25hbFByb3BlcnRpZXMuJHN1Z2dlc3RlZEFjdGlvbiA9ICh0aGlzLmNoYXRIaXN0b3J5IVtpbmRleF0uYWRkaXRpb25hbFByb3BlcnRpZXMuJHN1Z2dlc3RlZEFjdGlvbiB8fCBbXSkuY29uY2F0KG1lc3NhZ2Uuc3VnZ2VzdGVkQWN0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJEZWJ1Z0Rpc3BsYXlcIixcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IERlYnVnTWVzc2FnZUV2ZW50KSA9PiB0aGlzLl9kZWJ1Z01lc3NhZ2VzID0gdGhpcy5fZGVidWdNZXNzYWdlcy5jb25jYXQobWVzc2FnZSksXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogZmFsc2VcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXG4gICAgICBcIk1lc3NhZ2VCcmVha1wiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgLy8gR2VuZXJhdGUgYXVkaXQgZXZlbnRcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgICAgICAgJ2R1cmF0aW9uJzogdGhpcy5fZXhlY3V0aW9uVGltZSxcbiAgICAgICAgICAgICd0ZXh0JzogdGhpcy5jaGF0SGlzdG9yeSEuYXQoLTEpIS5jb250ZW50LFxuICAgICAgICAgICAgJ3JvbGUnOiB0aGlzLmNoYXRIaXN0b3J5IS5hdCgtMSkhLnJvbGUsIC8vICdhc3Npc3RhbnQnXG4gICAgICAgICAgICAncmFuayc6IHRoaXMuY2hhdEhpc3RvcnkhLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAnZ2VuZXJhdGlvbi10b2tlbmNvdW50JzogdGhpcy5jaGF0SGlzdG9yeSEuYXQoLTEpIS5hZGRpdGlvbmFsUHJvcGVydGllcy51c2FnZU1ldHJpY3M/LmNvbXBsZXRpb25Ub2tlbkNvdW50LFxuICAgICAgICAgICAgJ3Byb21wdC10b2tlbmNvdW50JzogdGhpcy5jaGF0SGlzdG9yeSEuYXQoLTEpIS5hZGRpdGlvbmFsUHJvcGVydGllcy51c2FnZU1ldHJpY3M/LnByb21wdFRva2VuQ291bnQsXG4gICAgICAgICAgICAnYXR0YWNobWVudHMnOiBKU09OLnN0cmluZ2lmeSh0aGlzLl9hdHRhY2htZW50cy5tYXAoKHsgcmVjb3JkSWQsIGNvbnRleHRJZCwgcGFydHMsIHR5cGUgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHM6IHBhcnRzLm1hcCgoeyBwYXJ0SWQsIHRleHQgfSkgPT4gKHsgcGFydElkLCB0ZXh0IH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSlcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgZGV0YWlscyk7XG4gICAgICAgICAgLy8gUHVzaCBhIG5ldyBhc3Npc3RhbnQgbWVzc2FnZSB0byB0aGUgX3Jlc3BvbnNlIGFycmF5IE9OTFkgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIGxhc3QgbWVzc2FnZSBpcyBub3QgZW1wdHlcbiAgICAgICAgICBpZiAodGhpcy5fcmVzcG9uc2UuYXQoLTEpIS5jb250ZW50ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZS5wdXNoKHtyb2xlOiBcImFzc2lzdGFudFwiLCBjb250ZW50OiBcIlwiLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWV9fSlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogZmFsc2VcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGFuZCByZWdpc3RlciB0aGUgZW50aXJlIF9tZXNzYWdlSGFuZGxlcnMgbWFwIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIG1hcCB3aXRoIHRoZSBkZWZhdWx0IG9uZVxuICAgKiBAcGFyYW0gX21lc3NhZ2VIYW5kbGVyc1xuICAgKi9cbiAgb3ZlcnJpZGVNZXNzYWdlSGFuZGxlcnM8VD4oX21lc3NhZ2VIYW5kbGVyczogTWFwPHN0cmluZywgTWVzc2FnZUhhbmRsZXI8VD4+KSB7XG4gICAgLy8gQ2xlYXIgdGhlIGFscmVhZHkgcmVnaXN0ZXJlZCBnbG9iYWwgY2hhdCBoYW5kbGVycyBiZWZvcmUgbWVyZ2luZyB0aGUgbmV3IG9uZXNcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlcnMuZm9yRWFjaCgoZXZlbnRIYW5kbGVyLCBldmVudE5hbWUpID0+IHtcbiAgICAgIGlmKGV2ZW50SGFuZGxlci5pc0dsb2JhbEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZU1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNZXJnZSB0aGUgbmV3IGV2ZW50IGhhbmRsZXJzIHdpdGggdGhlIGV4aXN0aW5nIG9uZXNcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlcnMgPSBuZXcgTWFwKFsuLi50aGlzLl9tZXNzYWdlSGFuZGxlcnMsIC4uLl9tZXNzYWdlSGFuZGxlcnNdKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBnbG9iYWwgaGFuZGxlcnMgYW1vbmcgdGhlIG1lcmdlZCBtYXBcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlcnMuZm9yRWFjaCgoZXZlbnRIYW5kbGVyLCBldmVudE5hbWUpID0+IHtcbiAgICAgIGlmKGV2ZW50SGFuZGxlci5pc0dsb2JhbEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAgICogSWYgYSBsaXN0ZW5lciBmb3IgdGhpcyBzYW1lIGV2ZW50IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIG92ZXJyaWRkZW4uXG4gICAqIElmIHRoZSBsaXN0ZW5lciBoYXMgXCJpc0dsb2JhbEhhbmRsZXJcIiBzZXQgdG8gdHJ1ZSwgaXQgd2lsbCBiZSByZWdpc3RlcmVkIHRvIHRoZSBodWIgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciBhIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyByZWNlaXZlZFxuICAgKi9cbiAgYWRkTWVzc2FnZUhhbmRsZXI8VD4oZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8VD4pIHtcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlcnMuc2V0KGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICBpZihldmVudEhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEeW5hbWljYWxseSByZWdpc3RlciBhIGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGV2ZW50LlxuICAgKiBJZiBhIGxpc3RlbmVyIGZvciB0aGlzIGV2ZW50IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIG92ZXJyaWRkZW4uXG4gICAqIEBwYXJhbSBldmVudE5hbWUgTmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIGV2ZW50SGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgcmVjZWl2ZWRcbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3Rlck1lc3NhZ2VIYW5kbGVyPFQ+KGV2ZW50TmFtZTogc3RyaW5nLCBldmVudEhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyPFQ+KSB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiTm8gY29ubmVjdGlvbiBmb3VuZCB0byByZWdpc3RlciB0aGUgbGlzdGVuZXJcIiArIGV2ZW50TmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9uLm9uKGV2ZW50TmFtZSwgKGRhdGE6IFQpID0+IHtcbiAgICAgIGV2ZW50SGFuZGxlci5oYW5kbGVyKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGV2ZW50IGZyb20gdGhlIF9tZXNzYWdlSGFuZGxlcnMgbWFwIGFuZCB1bnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgdGhpcyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZvclxuICAgKi9cbiAgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgdGhpcy51bnN1YnNjcmliZU1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmUgZnJvbSByZWNlaXZpbmcgbWVzc2FnZXMgZm9yIGEgc3BlY2lmaWMgZXZlbnQgZnJvbSB0aGUgU2lnbmFsUiBodWIuXG4gICAqIEFMTCBpdHMgcmVsYXRlZCBsaXN0ZW5lcnMgd2lsbCBiZSByZW1vdmVkIGZyb20gaHViIGNvbm5lY3Rpb25cbiAgICogVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgb2xkIGxpc3RlbmVycyB3aGVuIG92ZXJyaWRpbmcgdGhlIGVudGlyZSBfbWVzc2FnZUhhbmRsZXJzIG1hcFxuICAgKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgdW5zdWJzY3JpYmVNZXNzYWdlSGFuZGxlcihldmVudE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuY29ubmVjdGlvbiEub2ZmKGV2ZW50TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb25uZWN0aW9uIHRvIHRoZSBzaWduYWxSIHdlYnNvY2tldCBhbmQgcmVnaXN0ZXIgZGVmYXVsdCBsaXN0ZW5lcnMgdG8gdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2VydmVyIGh1YiBjbGFzc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24uIEl0IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBvcHRpb25zXG4gICAqIEBwYXJhbSBsb2dMZXZlbCBEZWZpbmUgdGhlIGxvZyBsZXZlbCBkaXNwbGF5ZWQgaW4gdGhlIGNvbnNvbGVcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgYnVpbHRcbiAgICovXG4gIGJ1aWxkQ29ubmVjdGlvbihvcHRpb25zPzogQ29ubmVjdGlvbk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLlJFUVVFU1RfVVJMKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIk5vIGVuZHBvaW50IHByb3ZpZGVkIHRvIGNvbm5lY3QgdGhlIHdlYnNvY2tldCB0b1wiKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbG9nTGV2ZWwgPSB0aGlzLl9nZXRMb2dMZXZlbCgpO1xuXG4gICAgICBpZiAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlPy5jb25uZWN0aW9uU2V0dGluZ3Muc2lnbmFsUlNraXBOZWdvdGlhdGlvbiA9PT0gdHJ1ZSlcbiAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zLCBza2lwTmVnb3RpYXRpb246IHRydWV9O1xuXG4gICAgICB0aGlzLmNvbm5lY3Rpb24gPSB0aGlzLnNpZ25hbFJTZXJ2aWNlLmJ1aWxkQ29ubmVjdGlvbih0aGlzLlJFUVVFU1RfVVJMLCB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9uc30sIGxvZ0xldmVsLCB0cnVlKTtcblxuICAgICAgY29uc3Qgc2lnbmFsUlNlcnZlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZT8uY29ubmVjdGlvblNldHRpbmdzLnNpZ25hbFJTZXJ2ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgICBpZiAoc2lnbmFsUlNlcnZlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VydmVyVGltZW91dEluTWlsbGlzZWNvbmRzID0gc2lnbmFsUlNlcnZlclRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHN0YXJ0ZWRcbiAgICovXG4gIHN0YXJ0Q29ubmVjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxSU2VydmljZS5zdGFydENvbm5lY3Rpb24odGhpcy5jb25uZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHN0b3BwZWRcbiAgICovXG4gIHN0b3BDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJTZXJ2aWNlLnN0b3BDb25uZWN0aW9uKHRoaXMuY29ubmVjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmFuc3BvcnRzKCk6IEh0dHBUcmFuc3BvcnRUeXBlIHtcbiAgICBzd2l0Y2ggKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZT8uY29ubmVjdGlvblNldHRpbmdzLnNpZ25hbFJUcmFuc3BvcnQpIHtcbiAgICAgIGNhc2UgXCJXZWJTb2NrZXRzXCI6XG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5XZWJTb2NrZXRzO1xuICAgICAgY2FzZSBcIlNlcnZlclNlbnRFdmVudHNcIjpcbiAgICAgICAgcmV0dXJuIEh0dHBUcmFuc3BvcnRUeXBlLlNlcnZlclNlbnRFdmVudHM7XG4gICAgICBjYXNlIFwiTG9uZ1BvbGxpbmdcIjpcbiAgICAgICAgcmV0dXJuIEh0dHBUcmFuc3BvcnRUeXBlLkxvbmdQb2xsaW5nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEh0dHBUcmFuc3BvcnRUeXBlLk5vbmU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0TG9nTGV2ZWwoKTogTG9nTGV2ZWwge1xuICAgIHN3aXRjaCAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlPy5jb25uZWN0aW9uU2V0dGluZ3Muc2lnbmFsUkxvZ0xldmVsKSB7XG4gICAgICBjYXNlIFwiQ3JpdGljYWxcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLkNyaXRpY2FsOyAvLyBMb2cgbGV2ZWwgZm9yIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhhdCBpbmRpY2F0ZSBhIGZhaWx1cmUgdGhhdCB3aWxsIHRlcm1pbmF0ZSB0aGUgZW50aXJlIGFwcGxpY2F0aW9uLlxuICAgICAgY2FzZSBcIkRlYnVnXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5EZWJ1ZzsgLy8gTG9nIGxldmVsIGZvciBsb3cgc2V2ZXJpdHkgZGlhZ25vc3RpYyBtZXNzYWdlcy5cbiAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuRXJyb3I7IC8vIExvZyBsZXZlbCBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIGEgZmFpbHVyZSBpbiB0aGUgY3VycmVudCBvcGVyYXRpb24uXG4gICAgICBjYXNlIFwiSW5mb3JtYXRpb25cIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLkluZm9ybWF0aW9uOyAvLyBMb2cgbGV2ZWwgZm9yIGluZm9ybWF0aW9uYWwgZGlhZ25vc3RpYyBtZXNzYWdlcy5cbiAgICAgIGNhc2UgXCJOb25lXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5Ob25lOyAvLyBUaGUgaGlnaGVzdCBwb3NzaWJsZSBsb2cgbGV2ZWwuIFVzZWQgd2hlbiBjb25maWd1cmluZyBsb2dnaW5nIHRvIGluZGljYXRlIHRoYXQgbm8gbG9nIG1lc3NhZ2VzIHNob3VsZCBiZSBlbWl0dGVkLlxuICAgICAgY2FzZSBcIlRyYWNlXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5UcmFjZTsgLy8gTG9nIGxldmVsIGZvciB2ZXJ5IGxvdyBzZXZlcml0eSBkaWFnbm9zdGljIG1lc3NhZ2VzLlxuICAgICAgY2FzZSBcIldhcm5pbmdcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLldhcm5pbmc7IC8vIExvZyBsZXZlbCBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIGEgbm9uLWZhdGFsIHByb2JsZW0uXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuTm9uZTsgLy8gVGhlIGhpZ2hlc3QgcG9zc2libGUgbG9nIGxldmVsLiBVc2VkIHdoZW4gY29uZmlndXJpbmcgbG9nZ2luZyB0byBpbmRpY2F0ZSB0aGF0IG5vIGxvZyBtZXNzYWdlcyBzaG91bGQgYmUgZW1pdHRlZC5cbiAgICB9XG4gIH1cblxuICBnZXQgZGVmYXVsdE9wdGlvbnMoKTogQ29ubmVjdGlvbk9wdGlvbnMge1xuICAgIGxldCBoZWFkZXJzOiBNZXNzYWdlSGVhZGVycyA9IHtcbiAgICAgIFwic2luZXF1YS1mb3JjZS1jYW1lbC1jYXNlXCI6IFwidHJ1ZVwiLFxuICAgICAgXCJ4LWxhbmd1YWdlXCI6IHRoaXMuaW50bFNlcnZpY2UuY3VycmVudExvY2FsZS5uYW1lLFxuICAgICAgXCJ1aS1sYW5ndWFnZVwiOiB0aGlzLmludGxTZXJ2aWNlLmN1cnJlbnRMb2NhbGUubmFtZSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscykge1xuICAgICAgaGVhZGVycyA9IHsuLi5oZWFkZXJzLCBcInNpbmVxdWEtY3NyZi10b2tlblwiOiB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscy5kYXRhLmNzcmZUb2tlbn07XG4gICAgfTtcbiAgICAvLyBGb3IgdGhlIGZpcnN0IEdFVCByZXF1ZXN0IHNlbnQgYnkgc2lnbmFsUiB0byBzdGFydCBhIFdlYlNvY2tldCBwcm90b2NvbCxcbiAgICAvLyBhcyBmYXIgYXMgd2Uga25vdywgc2lnbmFsUiBvbmx5IGxldHMgdXMgdHdlYWsgdGhlIHJlcXVlc3Qgd2l0aCB0aGlzIGFjY2VzcyB0b2tlbiBmYWN0b3J5XG4gICAgLy8gc28gd2UgcGFzcyBhbG9uZyB0aGUgU2luZXF1YSBDU1JGIHRva2VuIHRvIHBhc3MgdGhlIENTUkYgY2hlY2suLlxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc3BvcnQ6IHRoaXMuX2dldFRyYW5zcG9ydHMoKSxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBza2lwTmVnb3RpYXRpb246IGZhbHNlLFxuICAgICAgYWNjZXNzVG9rZW5GYWN0b3J5OiAoKSA9PiB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscz8uZGF0YT8uY3NyZlRva2VuIHx8IFwiXCJcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
615
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3dlYnNvY2tldC1jaGF0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFpQixRQUFRLEVBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFDaEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdoSyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQXFCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUk3QyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsV0FBVztJQWtCbkQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQWZGLHFCQUFnQixHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRS9ELGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUM5QyxjQUFTLEdBQStCLFNBQVMsQ0FBQztRQUVsRCxpQkFBWSxHQUE0QixFQUFFLENBQUM7UUFDM0MsbUJBQWMsR0FBbUIsRUFBRSxDQUFDO1FBRXJDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0MsMEJBQXFCLEdBQUcsTUFBTSxDQUFDLHFC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Q0FBQyxJQUFJLENBQUMsQ0FBQyxvSEFBb0g7U0FDN0k7SUFDSCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLElBQUksT0FBTyxHQUFtQjtZQUM1QiwwQkFBMEIsRUFBRSxNQUFNO1lBQ2xDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJO1lBQ2pELGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJO1NBQ25ELENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsRUFBRTtZQUNuRCxPQUFPLEdBQUcsRUFBQyxHQUFHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFDO1NBQzlHO1FBQUEsQ0FBQztRQUNGLDJFQUEyRTtRQUMzRSwyRkFBMkY7UUFDM0YsbUVBQW1FO1FBQ25FLE9BQU87WUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNoQyxlQUFlLEVBQUUsSUFBSTtZQUNyQixPQUFPO1lBQ1AsZUFBZSxFQUFFLEtBQUs7WUFDdEIsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxTQUFTLElBQUksRUFBRTtTQUNqRyxDQUFBO0lBQ0gsQ0FBQzs7aUhBbHRCVSxvQkFBb0I7cUhBQXBCLG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgSHR0cFRyYW5zcG9ydFR5cGUsIEh1YkNvbm5lY3Rpb24sIExvZ0xldmVsLCBNZXNzYWdlSGVhZGVycyB9IGZyb20gXCJAbWljcm9zb2Z0L3NpZ25hbHJcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY2F0Y2hFcnJvciwgZGVmZXIsIGZvcmtKb2luLCBmcm9tLCBmcm9tRXZlbnQsIG1hcCwgbWVyZ2UsIG1lcmdlTWFwLCBvZiwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwsIHRhcCwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9sb2dpblwiO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uT3B0aW9ucywgSnNvbk1ldGhvZFBsdWdpblNlcnZpY2UsIFNpZ25hbFJXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XHJcblxyXG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuL2NoYXQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBY3Rpb25NZXNzYWdlLCBBY3Rpb25SZXN1bHRFdmVudCwgQWN0aW9uU3RhcnRFdmVudCwgQWN0aW9uU3RvcEV2ZW50LCBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIENoYXRNZXNzYWdlLCBDaGF0UGF5bG9hZCwgQ2hhdFByb2dyZXNzLCBDaGF0UmVzcG9uc2UsIENvbnRleHRNZXNzYWdlRXZlbnQsIERlYnVnTWVzc2FnZSwgRGVidWdNZXNzYWdlRXZlbnQsIEVycm9yRXZlbnQsIEdsbG1GdW5jdGlvbiwgR2xsbU1vZGVsRGVzY3JpcHRpb24sIEhpc3RvcnlFdmVudCwgTWVzc2FnZUV2ZW50LCBNZXNzYWdlSGFuZGxlciwgUXVvdGFFdmVudCwgU2F2ZWRDaGF0LCBTYXZlZENoYXRIaXN0b3J5LCBTdWdnZXN0ZWRBY3Rpb25zRXZlbnQgfSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Q2hhdFNlcnZpY2UgZXh0ZW5kcyBDaGF0U2VydmljZSB7XHJcblxyXG4gIHB1YmxpYyBjb25uZWN0aW9uOiBIdWJDb25uZWN0aW9uIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIF9tZXNzYWdlSGFuZGxlcnM6IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyPGFueT4+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgX3Jlc3BvbnNlOiBDaGF0TWVzc2FnZVtdO1xyXG4gIHByaXZhdGUgX2FjdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBY3Rpb25NZXNzYWdlPigpO1xyXG4gIHByaXZhdGUgX3Byb2dyZXNzOiBDaGF0UHJvZ3Jlc3NbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9leGVjdXRpb25UaW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfYXR0YWNobWVudHM6IENoYXRDb250ZXh0QXR0YWNobWVudFtdID0gW107XHJcbiAgcHJpdmF0ZSBfZGVidWdNZXNzYWdlczogRGVidWdNZXNzYWdlW10gPSBbXTtcclxuXHJcbiAgcHVibGljIHNpZ25hbFJTZXJ2aWNlID0gaW5qZWN0KFNpZ25hbFJXZWJTZXJ2aWNlKTtcclxuICBwdWJsaWMgYXV0aGVudGljYXRpb25TZXJ2aWNlID0gaW5qZWN0KEF1dGhlbnRpY2F0aW9uU2VydmljZSk7XHJcbiAgcHVibGljIGpzb25NZXRob2RXZWJTZXJ2aWNlID0gaW5qZWN0KEpzb25NZXRob2RQbHVnaW5TZXJ2aWNlKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXN0VXJsID0gXCJTaW5lcXVhQXNzaXN0YW50UkVTVFwiO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplIHRoZSBhc3Npc3RhbnQgcHJvY2Vzcy5cclxuICAgKiBJdCBpbmNsdWRlcyBidWlsZGluZyBhbmQgc3RhcnRpbmcgYSBjb25uZWN0aW9uLCBleGVjdXRpbmcgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zLCBhbmQgaGFuZGxpbmcgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2Vzcy5cclxuICAgKiDimqDvuI8gVGhpcyBtZXRob2QgTVVTVCBiZSBjYWxsZWQgT05MWSBpZiB0aGUgdXNlciBpcyBsb2dnZWRJbiBhbmQgb25jZSB3aGVuIHRoZSBhc3Npc3RhbnQgaXMgaW5pdGlhbGl6ZWQuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlPGJvb2xlYW4+IGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb2YgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuXHJcbiAgICovXHJcbiAgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIC8vIEVuc3VyZSBhbGwgbG9naWMgaXMgZXhlY3V0ZWQgd2hlbiBzdWJzY3JpYmVkIHRvIHRoZSBvYnNlcnZhYmxlXHJcbiAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLmdldFJlcXVlc3RzVXJsKCk7XHJcblxyXG4gICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAvLyBCdWlsZCB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgIHRoaXMuYnVpbGRDb25uZWN0aW9uKClcclxuICAgICAgICApLnBpcGUoXHJcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuaW5pdE1lc3NhZ2VIYW5kbGVycygpKSxcclxuICAgICAgICAvLyBTdGFydCB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnN0YXJ0Q29ubmVjdGlvbigpKSxcclxuICAgICAgICAvLyBFeGVjdXRlIHBhcmFsbGVsIHJlcXVlc3RzIGZvciBtb2RlbHMgYW5kIGZ1bmN0aW9uc1xyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PlxyXG4gICAgICAgICAgZm9ya0pvaW4oW1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RNb2RlbHMoKSxcclxuICAgICAgICAgICAgdGhpcy5saXN0RnVuY3Rpb25zKClcclxuICAgICAgICAgIF0pXHJcbiAgICAgICAgKSxcclxuICAgICAgICAvLyBNYXAgdGhlIHJlc3VsdHMgb2YgcGFyYWxsZWwgcmVxdWVzdHMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzc1xyXG4gICAgICAgIG1hcCgoW21vZGVscywgZnVuY3Rpb25zXSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gISFtb2RlbHMgJiYgISFmdW5jdGlvbnM7XHJcbiAgICAgICAgICB0aGlzLmluaXRQcm9jZXNzJC5uZXh0KHJlc3VsdCk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIC8vIEFueSBlcnJvcnMgZHVyaW5nIHRoZSBwcm9jZXNzIGFyZSBjYXVnaHQsIGxvZ2dlZCwgYW5kIHJlLXRocm93biB0byBwcm9wYWdhdGUgdGhlIGVycm9yIGZ1cnRoZXJcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQ6JywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRha2UoMSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIHRoZSBhc3Npc3RhbnQgZW5kcG9pbnQgdG8gdXNlIGZvciB0aGUgd2Vic29ja2V0IHJlcXVlc3RzXHJcbiAgICogSXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcCBjb25maWdcclxuICAgKi9cclxuICBnZXRSZXF1ZXN0c1VybCgpIHtcclxuICAgIGlmICh0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmNvbm5lY3Rpb25TZXR0aW5ncy53ZWJzb2NrZXRFbmRwb2ludCkge1xyXG4gICAgICB0aGlzLlJFUVVFU1RfVVJMID0gdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5jb25uZWN0aW9uU2V0dGluZ3Mud2Vic29ja2V0RW5kcG9pbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSAnd2Vic29ja2V0RW5kcG9pbnQnIG11c3QgYmUgcHJvdmlkZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHVzZSAnV2ViU29ja2V0JyBpbiBhc3Npc3RhbnQgaW5zdGFuY2VgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlVXNlcigpOiB2b2lkIHtcclxuICAgIGlmICghKHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnVzZXJPdmVycmlkZUFjdGl2ZSAmJiB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS51c2VyT3ZlcnJpZGUpKSB7XHJcbiAgICAgIHRoaXMudXNlck92ZXJyaWRlJC5uZXh0KGZhbHNlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFByZXBhcmUgdGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgT3ZlcnJpZGVVc2VyIG1ldGhvZFxyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcclxuICAgICAgdXNlcjogdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UudXNlck92ZXJyaWRlLnVzZXJOYW1lLFxyXG4gICAgICBkb21haW46IHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnVzZXJPdmVycmlkZS5kb21haW5cclxuICAgIH1cclxuXHJcbiAgICAvLyBJbnZva2UgdGhlIE92ZXJyaWRlVXNlciBtZXRob2QgYW5kIGhhbmRsZSBlcnJvcnNcclxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdPdmVycmlkZVVzZXInLCBkYXRhKVxyXG4gICAgICAudGhlbigocmVzKSA9PiB0aGlzLnVzZXJPdmVycmlkZSQubmV4dCghIXJlcykpXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgT3ZlcnJpZGVVc2VyOicsIGVycm9yKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2hlbiBubyBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nIGV4aXN0cyBkb3duc3RyZWFtXHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGxpc3RNb2RlbHMoKTogT2JzZXJ2YWJsZTxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBjb25zdCBtb2RlbHNTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PEdsbG1Nb2RlbERlc2NyaXB0aW9uW10gfCB1bmRlZmluZWQ+KCk7XHJcblxyXG4gICAgdGhpcy5jb25uZWN0aW9uIS5vbignTGlzdE1vZGVscycsIChyZXMpID0+IHtcclxuICAgICAgdGhpcy5tb2RlbHMgPSAocmVzLm1vZGVscyBhcyBHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkKT8uZmlsdGVyKG1vZGVsID0+ICEhbW9kZWwuZW5hYmxlKTtcclxuICAgICAgbW9kZWxzU3ViamVjdCQubmV4dCh0aGlzLm1vZGVscyk7XHJcbiAgICAgIG1vZGVsc1N1YmplY3QkLmNvbXBsZXRlKClcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBsaXN0IG9mIG1vZGVsc1xyXG4gICAgdGhpcy5jb25uZWN0aW9uIS5pbnZva2UoJ0xpc3RNb2RlbHMnLCB7IGRlYnVnOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWcgfSlcclxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBMaXN0TW9kZWxzOicsIGVycm9yKTtcclxuICAgICAgICBtb2RlbHNTdWJqZWN0JC5lcnJvcihuZXcgRXJyb3IoZXJyb3IpKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2hlbiBubyBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nIGV4aXN0cyBkb3duc3RyZWFtXHJcbiAgICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIG1vZGVsc1N1YmplY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgbGlzdEZ1bmN0aW9ucygpOiBPYnNlcnZhYmxlPEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBjb25zdCBmdW5jdGlvbnNTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkPigpO1xyXG5cclxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ0xpc3RGdW5jdGlvbnMnLCAocmVzKSA9PiB7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25zID0gKHJlcy5mdW5jdGlvbnMgYXMgR2xsbUZ1bmN0aW9uW10gfCB1bmRlZmluZWQpPy5maWx0ZXIoZnVuYyA9PiBmdW5jLmVuYWJsZWQpO1xyXG4gICAgICBmdW5jdGlvbnNTdWJqZWN0JC5uZXh0KHRoaXMuZnVuY3Rpb25zKTtcclxuICAgICAgZnVuY3Rpb25zU3ViamVjdCQuY29tcGxldGUoKVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdCB0byBnZXQgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zXHJcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnTGlzdEZ1bmN0aW9ucycsIHsgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1ZyB9KVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIExpc3RGdW5jdGlvbnM6JywgZXJyb3IpO1xyXG4gICAgICAgIGZ1bmN0aW9uc1N1YmplY3QkLmVycm9yKG5ldyBFcnJvcihlcnJvcikpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gUmV0dXJuIGEgcmVzb2x2ZWQgcHJvbWlzZSB0byBoYW5kbGUgdGhlIGVycm9yIGFuZCBwcmV2ZW50IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiB3aGVuIG5vIGZ1cnRoZXIgZXJyb3IgaGFuZGxpbmcgZXhpc3RzIGRvd25zdHJlYW1cclxuICAgICAgfSlcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb25zU3ViamVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBmZXRjaChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSwgcXVlcnk6IFF1ZXJ5KTogT2JzZXJ2YWJsZTxDaGF0UmVzcG9uc2U+IHtcclxuICAgIC8vIFN0YXJ0IHN0cmVhbWluZyBieSBpbnZva2luZyB0aGUgQ2hhdCBtZXRob2RcclxuICAgIHRoaXMuc3RyZWFtaW5nJC5uZXh0KHRydWUpO1xyXG5cclxuICAgIC8vIFByZXBhcmUgdGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgQ2hhdCBtZXRob2RcclxuICAgIGNvbnN0IGRhdGE6IENoYXRQYXlsb2FkID0ge1xyXG4gICAgICBoaXN0b3J5OiBtZXNzYWdlcyxcclxuICAgICAgZnVuY3Rpb25zOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zPy5maWx0ZXIoZnVuYyA9PiBmdW5jLmVuYWJsZWQpLm1hcChmdW5jID0+IGZ1bmMubmFtZSksXHJcbiAgICAgIGRlYnVnOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWcsXHJcbiAgICAgIHNlcnZpY2VTZXR0aW5nczoge1xyXG4gICAgICAgIHNlcnZpY2VfaWQ6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLFxyXG4gICAgICAgIG1vZGVsX2lkOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMubW9kZWxfaWQsXHJcbiAgICAgICAgdG9wX3A6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy50b3BfcCxcclxuICAgICAgICB0ZW1wZXJhdHVyZTogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlLFxyXG4gICAgICAgIG1heF90b2tlbnM6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5tYXhfdG9rZW5zLFxyXG4gICAgICAgIC4uLnRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuYWRkaXRpb25hbFNlcnZpY2VTZXR0aW5nc1xyXG4gICAgICB9LFxyXG4gICAgICBhcHBRdWVyeToge1xyXG4gICAgICAgIGFwcDogdGhpcy5hcHBTZXJ2aWNlLmFwcE5hbWUsXHJcbiAgICAgICAgcXVlcnlcclxuICAgICAgfSxcclxuICAgICAgZ2VuZXJpY0NoYXRFcnJvck1lc3NhZ2U6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZ2xvYmFsU2V0dGluZ3MuZ2VuZXJpY0NoYXRFcnJvck1lc3NhZ2VcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLnNhdmVkQ2hhdFNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgICAgZGF0YS5pbnN0YW5jZUlkID0gdGhpcy5jaGF0SW5zdGFuY2VJZDtcclxuICAgICAgZGF0YS5zYXZlZENoYXRJZCA9IHRoaXMuc2F2ZWRDaGF0SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVzcG9uc2Ugd2l0aCBhbiBlbXB0eSBhc3Npc3RhbnQgbWVzc2FnZVxyXG4gICAgdGhpcy5fcmVzcG9uc2UgPSBbe3JvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IFwiXCIsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdHJ1ZX19XSAvLyBoZXJlIGRpc3BsYXk6IHRydWUgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gc2hvdyB0aGUgcHJvZ3Jlc3NcclxuXHJcbiAgICAvLyBDcmVhdGUgYSBTdWJqZWN0IHRvIHNpZ25hbCBjb21wbGV0aW9uXHJcbiAgICBjb25zdCBjb21wbGV0aW9uJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIG9ic2VydmFibGVzIGZvciBlYWNoIG5vbi1nbG9iYWwgaGFuZGxlciBpbiB0aGUgX21lc3NhZ2VIYW5kbGVycyBtYXAgKGRlZmF1bHQgYW5kIGV2ZW50dWFsIGN1c3RvbSBvbmVzKSBvbmNlIGl0IGlzIHRyaWdnZXJlZCBieSB0aGUgaHViIGNvbm5lY3Rpb25cclxuICAgIGNvbnN0IG9ic2VydmFibGVzID0gQXJyYXlcclxuICAgICAgLmZyb20odGhpcy5fbWVzc2FnZUhhbmRsZXJzLmVudHJpZXMoKSlcclxuICAgICAgLmZpbHRlcigoW2V2ZW50TmFtZSwgZXZlbnRIYW5kbGVyXSkgPT4gIWV2ZW50SGFuZGxlci5pc0dsb2JhbEhhbmRsZXIpXHJcbiAgICAgIC5tYXAoKFtldmVudE5hbWUsIGV2ZW50SGFuZGxlcl0pID0+IHtcclxuICAgICAgICByZXR1cm4gZnJvbUV2ZW50PGFueT4odGhpcy5jb25uZWN0aW9uISwgZXZlbnROYW1lKS5waXBlKFxyXG4gICAgICAgICAgbWVyZ2VNYXAoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFdyYXAgdGhlIGhhbmRsZXIgaW4gYSB0cnktY2F0Y2ggYmxvY2sgdG8gcHJldmVudCB0aGUgZW50aXJlIHN0cmVhbSBmcm9tIGZhaWxpbmcgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgc2luZ2xlIGhhbmRsZXJcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBoYW5kbGVyIGFuZCBlbWl0IHRoZSByZXN1bHRcclxuICAgICAgICAgICAgICAvLyBOQjogaGVyZSB3ZSBjb3VsZCB1c2UgW2V2ZW50SGFuZGxlci5oYW5kbGVyKGV2ZW50KV0gd2hpY2ggYmVoaW5kIHRoZSBzY2VuZXMgbWVyZ2VNYXAgaW50ZXJwcmV0cyB0aGlzIGFycmF5IGFzIGFuIG9ic2VydmFibGUgc2VxdWVuY2Ugd2l0aCBvbmUgaXRlbSwgd2hpY2ggaXQgdGhlbiBlbWl0c1xyXG4gICAgICAgICAgICAgIHJldHVybiBvZihldmVudEhhbmRsZXIuaGFuZGxlcihldmVudCkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIGV2ZW50IGhhbmRsZXIgZm9yICR7ZXZlbnROYW1lfTpgLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgLy8gVXNlIHRocm93RXJyb3IgdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBkb3duc3RyZWFtXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBFcnJvciBpbiBldmVudCBoYW5kbGVyIGZvciAke2V2ZW50TmFtZX06ICR7ZXJyb3J9YCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFRoZW4gbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIG9ic2VydmFibGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIHN0cmVhbWluZyBiZWhhdmlvclxyXG4gICAgY29uc3QgY29tYmluZWQkID0gbWVyZ2UoLi4ub2JzZXJ2YWJsZXMpLnBpcGUoXHJcbiAgICAgIG1hcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gRGVmaW5lICRwcm9ncmVzcyBmcm9tIHRoZSBfYWN0aW9uTWFwXHJcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IEFycmF5LmZyb20odGhpcy5fYWN0aW9uTWFwLnZhbHVlcygpKTtcclxuICAgICAgICB0aGlzLl9wcm9ncmVzcyA9IGFjdGlvbnMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYWN0aW9ucy5tYXAoKGEpID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGEuZGlzcGxheU5hbWUgPz8gXCJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBhLmRpc3BsYXlWYWx1ZSA/PyBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGEuZXhlY3V0aW9uVGltZSAhPT0gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IGEuZXhlY3V0aW9uVGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgT05MWSB0aGUgZmlyc3QgYXNzaXN0YW50IG1lc3NhZ2Ugb2YgdGhlIF9yZXNwb25zZSB3aXRoIHRoZSBuZXcgJHByb2dyZXNzLCAkYXR0YWNobWVudCBhbmQgJGRlYnVnXHJcbiAgICAgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGUgZmlyc3QgYXNzaXN0YW50IG1lc3NhZ2UgaXMgYWx3YXlzIHZpc2libGUgc2luY2UgdGhlIGh1YiBkb2VzIG5vdCBzZW5kIGhpZGRlbiBtZXNzYWdlcyBieSBkZXNpZ25cclxuICAgICAgICAvLyBTbyBldmVuIGlmIHRoZSBmaXJzdCBhc3Npc3RhbnQgbWVzc2FnZSBpcyBoaWRkZW4gKGRpc3BsYXk6IGZhbHNlKSwgdGhlIF9yZXNwb25zZVswXSB3aWxsIGFuZCBzaG91bGQgY29udGFpbiA6XHJcbiAgICAgICAgLy8gIC0gJHByb2dyZXNzLCAkYXR0YWNobWVudCBhbmQgJGRlYnVnXHJcbiAgICAgICAgLy8gIC0gdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IHZpc2libGUgYXNzaXN0YW50IG1lc3NhZ2UgaW4gdGhlIHdvcmtmbG93XHJcbiAgICAgICAgLy8gVGhpcyBpcyBtYW5kYXRvcnkgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9mIGNvbnNlY3V0aXZlIG1lc3NhZ2VzIGFuZCBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIHRoZSBjaGF0SGlzdG9yeVxyXG4gICAgICAgIGlmKCEhdGhpcy5fcHJvZ3Jlc3MgfHwgdGhpcy5fYXR0YWNobWVudHMubGVuZ3RoID4gMCB8fCB0aGlzLl9kZWJ1Z01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuX3Jlc3BvbnNlWzBdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRwcm9ncmVzcyA9IHRoaXMuX3Byb2dyZXNzO1xyXG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2VbMF0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQgPSB0aGlzLl9hdHRhY2htZW50cztcclxuICAgICAgICAgIHRoaXMuX3Jlc3BvbnNlWzBdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRkZWJ1ZyA9IHRoaXMuX2RlYnVnTWVzc2FnZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxyXG4gICAgICAgIHJldHVybiB7IGhpc3Rvcnk6IFsuLi5tZXNzYWdlcywgLi4udGhpcy5fcmVzcG9uc2VdLCBleGVjdXRpb25UaW1lOiB0aGlzLl9leGVjdXRpb25UaW1lIH07XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YWtlVW50aWwoY29tcGxldGlvbiQpLCAvLyBDb21wbGV0ZSB0aGUgb2JzZXJ2YWJsZSB3aGVuIGNvbXBsZXRpb24kIGVtaXRzXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHJldHVybiBhIG5ldyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3VsdCBvZiB0aGUgY29tYmluZWQgc3RyZWFtIGFuZCBoYW5kbGVzIHRoZSBldmVudHVhbCBlcnJvcnMgb2YgdGhlIGludm9jYXRpb24gb2YgdGhlIENoYXQgbWV0aG9kXHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xyXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gY29tYmluZWQgc3RyZWFtXHJcbiAgICAgIGNvbWJpbmVkJC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICh2YWx1ZSkgPT4gb2JzZXJ2ZXIubmV4dCh2YWx1ZSksXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IG9ic2VydmVyLmVycm9yKGVycilcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBJbnZva2UgdGhlIENoYXQgbWV0aG9kIGFuZCBoYW5kbGUgZXJyb3JzXHJcbiAgICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdDaGF0JywgZGF0YSlcclxuICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAvLyBJZiBhIHZhbGlkIGFzc2lzdGFudCBtZXNzYWdlIHdpdGggKGRpc3BsYXk6IHRydWUpIHdhcyBmb3VuZCwgdXBkYXRlIGl0XHJcbiAgICAgICAgICAvLyBhbmQgaXQgc2hvdWxkIGFsd2F5cyB0aGUgY2FzZVxyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpcnN0VmlzaWJsZUFzc2lzdGFudE1lc3NhZ2VJbmRleCh0aGlzLmNoYXRIaXN0b3J5KTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSFbaW5kZXhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRwcm9ncmVzcyA9IHRoaXMuX3Byb2dyZXNzO1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRIaXN0b3J5IVtpbmRleF0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQgPSB0aGlzLl9hdHRhY2htZW50cztcclxuICAgICAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSFbaW5kZXhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRkZWJ1ZyA9IHRoaXMuX2RlYnVnTWVzc2FnZXM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBTYXZlL3VwZGF0ZSB0aGUgY2hhdCBpZiBzYXZlZENoYXQgZW5hYmxlZFxyXG4gICAgICAgICAgaWYgKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCAmJiB0aGlzLmNoYXRIaXN0b3J5IS5zb21lKChtc2cpID0+IG1zZy5hZGRpdGlvbmFsUHJvcGVydGllcz8uaXNVc2VySW5wdXQgPT09IHRydWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9ICF0aGlzLnNhdmVkQ2hhdElkID8gdGhpcy5hZGRTYXZlZENoYXQodGhpcy5jaGF0SGlzdG9yeSEpLnBpcGUodGFwKCgpID0+IHRoaXMubGlzdFNhdmVkQ2hhdCgpKSkgOiB0aGlzLnVwZGF0ZVNhdmVkQ2hhdCh0aGlzLnNhdmVkQ2hhdElkLCB1bmRlZmluZWQsIHRoaXMuY2hhdEhpc3RvcnkpO1xyXG4gICAgICAgICAgICBhY3Rpb24ucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtaW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbWluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN0cmVhbWluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgQ2hhdDonLCBlcnJvcik7XHJcbiAgICAgICAgICB0aGlzLnN0cmVhbWluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAvLyBFbWl0IHRoZSBlcnJvciB0byB0aGUgbmV3bHkgY3JlYXRlZCBvYnNlcnZhYmxlXHJcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAvLyBSZXR1cm4gYSByZXNvbHZlZCBwcm9taXNlIHRvIGhhbmRsZSB0aGUgZXJyb3IgYW5kIHByZXZlbnQgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uXHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICAvLyBUaGlzIGJsb2NrIGNvbmNlcm5zIE9OTFkgdGhlIGNvbXBsZXRpb24gb2YgdGhlIFwiQ2hhdFwiIG1ldGhvZCBpbnZvY2F0aW9uLlxyXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGUgY29tcGxldGlvbiBvZiB0aGUgY29tYmluZWQkIHN0cmVhbS5cclxuICAgICAgICAgIC8vIEl0IGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBjb21wbGV0aW9uIG9mIHRoZSBlbnRpcmUgZmV0Y2ggbWV0aG9kICh0aGUgb2JzZXJ2YWJsZSByZXR1cm5lZCBieSBmZXRjaCkgYW5kIHdoaWNoIGRlcGVuZHMgb24gdGhlIGNvbXBsZXRpb24gb2YgdGhlIHNhdmUgY2hhdCBhY3Rpb24gaWYgZW5hYmxlZFxyXG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2UgPSBbXTsgLy8gQ2xlYXIgdGhlIF9yZXNwb25zZVxyXG4gICAgICAgICAgdGhpcy5fYWN0aW9uTWFwLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBfYWN0aW9uTWFwXHJcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzcyA9IHVuZGVmaW5lZDsgLy8gQ2xlYXIgdGhlIF9wcm9ncmVzc1xyXG4gICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSBbXTsgLy8gQ2xlYXIgdGhlIF9hdHRhY2htZW50c1xyXG4gICAgICAgICAgdGhpcy5fZGVidWdNZXNzYWdlcyA9IFtdOyAvLyBDbGVhciB0aGUgX2RlYnVnTWVzc2FnZXNcclxuICAgICAgICAgIHRoaXMuX2V4ZWN1dGlvblRpbWUgPSBcIlwiOyAvLyBDbGVhciB0aGUgX2V4ZWN1dGlvblRpbWVcclxuICAgICAgICAgIGNvbXBsZXRpb24kLm5leHQoKTsgLy8gRW1pdCBhIHNpZ25hbCB0byBjb21wbGV0ZSB0aGUgb2JzZXJ2YWJsZXNcclxuICAgICAgICAgIGNvbXBsZXRpb24kLmNvbXBsZXRlKCk7IC8vIENvbXBsZXRlIHRoZSBzdWJqZWN0XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0b3BHZW5lcmF0aW9uKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgLy8gU3RhcnQgc3RvcHBpbmcgZ2VuZXJhdGlvbiBieSBpbnZva2luZyB0aGUgQ2FuY2VsVGFza3MgbWV0aG9kXHJcbiAgICB0aGlzLnN0b3BwaW5nR2VuZXJhdGlvbiQubmV4dCh0cnVlKTtcclxuICAgIC8vIENyZWF0ZSBhIFN1YmplY3QgdG8gaG9sZCB0aGUgcmVzdWx0IG9mIHRoZSBDYW5jZWxUYXNrcyBtZXRob2RcclxuICAgIGNvbnN0IHN0b3BHZW5lcmF0aW9uU3ViamVjdCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ0NhbmNlbFRhc2tzJywgKHJlcykgPT4ge1xyXG4gICAgICAvLyBXaGVuIHRoZSBnZW5lcmF0aW9uIGlzIHN0b3BwZWQgYmVmb3JlIHN0cmVhbWluZyBhbnkgVklTSUJMRSBhc3Npc3RhbnQgbWVzc2FnZSwgdGhpcyBtZWFucyB0aGF0ICRwcm9ncmVzcywgJGF0dGFjaG1lbnQgYW5kICRkZWJ1ZyBwcm9wZXJ0aWVzIHdpbGwgYmUgbG9zdC5cclxuICAgICAgLy8gSG93ZXZlciwgdGhlIFwiQ29udGV4dE1lc3NhZ2VcIiBmcmFtZXMgd2lsbCBiZSBwZXJzaXN0ZWQgaW4gdGhlIGNoYXRIaXN0b3J5IGFuZCB0aGUgYXNzaXN0YW50IG1heSByZWZlcmVuY2UgdGhlbSBpbiB0aGUgbmV4dCBnZW5lcmF0aW9uLlxyXG4gICAgICAvLyBUaGlzIGxlYWRzIHRvIHRoZSBwcm9ibGVtIG9mIHJlZmVyZW5jaW5nIHVuZGlzcGxheWVkIGF0dGFjaG1lbnRzIGluIHRoZSBuZXh0IGdlbmVyYXRpb24uXHJcbiAgICAgIC8vIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgd2UgbmVlZCB0byBwZXJzaXN0ICRwcm9ncmVzcywgJGF0dGFjaG1lbnQgYW5kICRkZWJ1ZyBwcm9wZXJ0aWVzIGJ5IGFkZGluZyBhIG5ldyBhc3Npc3RhbnQgbWVzc2FnZSB3aXRoIGVtcHR5IGNvbnRlbnQgYW5kIHRoZXNlIHByb3BlcnRpZXMuXHJcbiAgICAgIGlmICh0aGlzLl9yZXNwb25zZS5sZW5ndGggPT09IDEgJiYgdGhpcy5fcmVzcG9uc2VbMF0uY29udGVudCA9PT0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuY2hhdEhpc3Rvcnk/LnB1c2goe3JvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IFwiXCIsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdHJ1ZSwgJHByb2dyZXNzOiB0aGlzLl9wcm9ncmVzcywgJGF0dGFjaG1lbnQ6IHRoaXMuX2F0dGFjaG1lbnRzLCAkZGVidWc6IHRoaXMuX2RlYnVnTWVzc2FnZXN9fSk7XHJcbiAgICAgIH1cclxuICAgICAgc3RvcEdlbmVyYXRpb25TdWJqZWN0JC5uZXh0KCEhcmVzKTsgLy8gRW1pdCB0aGUgcmVzdWx0IG9mIHRoZSBDYW5jZWxUYXNrcyBtZXRob2RcclxuICAgICAgc3RvcEdlbmVyYXRpb25TdWJqZWN0JC5jb21wbGV0ZSgpOyAvLyBDb21wbGV0ZSB0aGUgc3ViamVjdFxyXG4gICAgICB0aGlzLnN0b3BwaW5nR2VuZXJhdGlvbiQubmV4dChmYWxzZSk7IC8vIENvbXBsZXRlIHN0b3BwaW5nIGdlbmVyYXRpb25cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEludm9rZSB0aGUgQ2FuY2VsVGFza3MgbWV0aG9kIGFuZCBoYW5kbGUgZXJyb3JzXHJcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnQ2FuY2VsVGFza3MnKVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIENhbmNlbFRhc2tzOicsIGVycm9yKTtcclxuICAgICAgICBzdG9wR2VuZXJhdGlvblN1YmplY3QkLmVycm9yKG5ldyBFcnJvcihlcnJvcikpO1xyXG4gICAgICAgIHRoaXMuc3RvcHBpbmdHZW5lcmF0aW9uJC5uZXh0KGZhbHNlKTsgLy8gQ29tcGxldGUgc3RvcHBpbmcgZ2VuZXJhdGlvblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gUmV0dXJuIGEgcmVzb2x2ZWQgcHJvbWlzZSB0byBoYW5kbGUgdGhlIGVycm9yIGFuZCBwcmV2ZW50IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiB3aGVuIG5vIGZ1cnRoZXIgZXJyb3IgaGFuZGxpbmcgZXhpc3RzIGRvd25zdHJlYW1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHN0b3BHZW5lcmF0aW9uU3ViamVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBsaXN0U2F2ZWRDaGF0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLnNhdmVkQ2hhdFNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXRMaXN0XCIsXHJcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXHJcbiAgICAgIGRlYnVnOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWdcclxuICAgIH07XHJcbiAgICB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLmdldCh0aGlzLnJlc3RVcmwsIGRhdGEpLnN1YnNjcmliZShcclxuICAgICAgcmVzID0+IHRoaXMuc2F2ZWRDaGF0cyQubmV4dChyZXMuc2F2ZWRDaGF0cyksXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRMaXN0IEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdExpc3QgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGFkZFNhdmVkQ2hhdChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSk6IE9ic2VydmFibGU8U2F2ZWRDaGF0PiB7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0QWRkXCIsXHJcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXHJcbiAgICAgIHNhdmVkQ2hhdElkOiB0aGlzLmNoYXRJZCxcclxuICAgICAgaGlzdG9yeTogbWVzc2FnZXMsXHJcbiAgICAgIGRlYnVnOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWdcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UucG9zdCh0aGlzLnJlc3RVcmwsIGRhdGEpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gcmVzLnNhdmVkQ2hhdCksXHJcbiAgICAgIHRhcCgoc2F2ZWRDaGF0OiBTYXZlZENoYXQpID0+IHtcclxuICAgICAgICB0aGlzLnNldFNhdmVkQ2hhdElkKHNhdmVkQ2hhdC5pZCk7IC8vIFBlcnNpc3QgdGhlIHNhdmVkQ2hhdElkXHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ3NhdmVkLWNoYXQuYWRkJywge30sIHNhdmVkQ2hhdC5pZCk7IC8vIEdlbmVyYXRlIGF1ZGl0IGV2ZW50XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdEFkZCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRBZGQgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFNhdmVkQ2hhdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPiB7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0R2V0XCIsXHJcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXHJcbiAgICAgIHNhdmVkQ2hhdElkOiBpZCxcclxuICAgICAgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLmdldCh0aGlzLnJlc3RVcmwsIGRhdGEpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gcmVzLnNhdmVkQ2hhdCksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0R2V0IEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdEdldCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2F2ZWRDaGF0KGlkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIG1lc3NhZ2VzPzogQ2hhdE1lc3NhZ2VbXSk6IE9ic2VydmFibGU8U2F2ZWRDaGF0PiB7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0VXBkYXRlXCIsXHJcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXHJcbiAgICAgIHNhdmVkQ2hhdElkOiBpZCxcclxuICAgICAgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xyXG4gICAgfTtcclxuXHJcbiAgICBpZihuYW1lKSBkYXRhW1widGl0bGVcIl0gPSBuYW1lO1xyXG4gICAgaWYobWVzc2FnZXMpIGRhdGFbXCJoaXN0b3J5XCJdID0gbWVzc2FnZXM7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UucG9zdCh0aGlzLnJlc3RVcmwsIGRhdGEpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gcmVzLnNhdmVkQ2hhdCksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0VXBkYXRlIEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdFVwZGF0ZSBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlU2F2ZWRDaGF0KGlkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgYWN0aW9uOiBcIlNhdmVkQ2hhdERlbGV0ZVwiLFxyXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxyXG4gICAgICBzYXZlZENoYXRJZHM6IGlkcyxcclxuICAgICAgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLnBvc3QodGhpcy5yZXN0VXJsLCBkYXRhKS5waXBlKFxyXG4gICAgICBtYXAocmVzID0+IHJlcy5kZWxldGVkQ291bnQpLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdERlbGV0ZSBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXREZWxldGUgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgb3V0LW9mLXRoZS1ib3ggaGFuZGxlcnNcclxuICAgKiBJdCBpcyBhIHBsYWNlaG9sZGVyIGZvciBub24tc3RyZWFtaW5nIHNjZW5hcmlvcywgd2hlcmUgeW91IGludm9rZSBhIHNwZWNpZmljIGh1YiBtZXRob2QsIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGggZnJhbWUgbWVzc2FnZShzKVxyXG4gICAqL1xyXG4gIGluaXRNZXNzYWdlSGFuZGxlcnMoKSB7XHJcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxyXG4gICAgICBcIkVycm9yXCIsXHJcbiAgICAgIHtcclxuICAgICAgICBoYW5kbGVyOiAoZXJyb3I6IEVycm9yRXZlbnQpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IHRydWVcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXHJcbiAgICAgIFwiUXVvdGFcIixcclxuICAgICAge1xyXG4gICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBRdW90YUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVF1b3RhKG1lc3NhZ2UucXVvdGEpXHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogdHJ1ZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcclxuICAgICAgXCJEZWJ1Z1wiLFxyXG4gICAgICB7IGhhbmRsZXI6ICgpID0+IHt9LFxyXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogdHJ1ZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcclxuICAgICAgXCJBY3Rpb25TdGFydFwiLFxyXG4gICAgICB7IGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblN0YXJ0RXZlbnQpID0+IHRoaXMuX2FjdGlvbk1hcC5zZXQoYWN0aW9uLmd1aWQsIGFjdGlvbiksXHJcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcclxuICAgICAgXCJBY3Rpb25SZXN1bHRcIixcclxuICAgICAge1xyXG4gICAgICAgIGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblJlc3VsdEV2ZW50KSA9PiB0aGlzLl9hY3Rpb25NYXAuc2V0KGFjdGlvbi5ndWlkLCB7IC4uLnRoaXMuX2FjdGlvbk1hcC5nZXQoYWN0aW9uLmd1aWQpLCAuLi5hY3Rpb24gfSksXHJcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcclxuICAgICAgXCJBY3Rpb25TdG9wXCIsXHJcbiAgICAgIHtcclxuICAgICAgICBoYW5kbGVyOiAoYWN0aW9uOiBBY3Rpb25TdG9wRXZlbnQpID0+IHRoaXMuX2FjdGlvbk1hcC5zZXQoYWN0aW9uLmd1aWQsIHsgLi4udGhpcy5fYWN0aW9uTWFwLmdldChhY3Rpb24uZ3VpZCksIC4uLmFjdGlvbiB9KSxcclxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxyXG4gICAgICBcIkNvbnRleHRNZXNzYWdlXCIsXHJcbiAgICAgIHtcclxuICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogQ29udGV4dE1lc3NhZ2VFdmVudCkgPT4gdGhpcy5fYXR0YWNobWVudHMucHVzaChtZXNzYWdlLm1ldGFkYXRhKSxcclxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxyXG4gICAgICBcIk1lc3NhZ2VcIixcclxuICAgICAge1xyXG4gICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBNZXNzYWdlRXZlbnQpID0+IHRoaXMuX3Jlc3BvbnNlLmF0KC0xKSEuY29udGVudCArPSBtZXNzYWdlID8/IFwiXCIsXHJcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcclxuICAgICAgXCJIaXN0b3J5XCIsXHJcbiAgICAgIHtcclxuICAgICAgICBoYW5kbGVyOiAoaGlzdG9yeTogSGlzdG9yeUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAvLyBUaGUgQ2hhdEhpc3RvcnkgaXMgdXBkYXRlZDogaXQgaXMgdGhlIGN1cnJlbnQgY29weSBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgbmV3IGl0ZW1zIE9OTFkgKGl0IGNhbiBoYXZlIG11bHRpcGxlIG1lc3NhZ2VzOiB0aGUgY29udGV4dCBtZXNzYWdlcyArIHRoZSByZXNwb25zZSBtZXNzYWdlKVxyXG4gICAgICAgICAgLy8gVGhpcyBpcyBtYW5kYXRvcnkgdG8gbm90IGxvc2UgdGhlIHByZXZpb3VzIHVwZGF0ZXMgb2YgdGhlIGNoYXRIaXN0b3J5IHdoZW4gdGhlIGFzc2lzdGFudCBpcyBzdHJlYW1pbmcgbXVsdGlwbGUgbWVzc2FnZSBzdGVwc1xyXG4gICAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSA9IFsuLi50aGlzLmNoYXRIaXN0b3J5ISwgLi4uKGhpc3RvcnkuaGlzdG9yeS5zbGljZSh0aGlzLmNoYXRIaXN0b3J5IS5sZW5ndGgpKV07XHJcbiAgICAgICAgICAvLyBFbWl0IHRoZSB1cGRhdGVkIGNoYXQgdXNhZ2UgbWV0cmljc1xyXG4gICAgICAgICAgaWYgKCEhdGhpcy5jaGF0SGlzdG9yeS5hdCgtMSk/LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnVzYWdlTWV0cmljcykge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXRVc2FnZU1ldHJpY3ModGhpcy5jaGF0SGlzdG9yeS5hdCgtMSkhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnVzYWdlTWV0cmljcyEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fZXhlY3V0aW9uVGltZSA9IGhpc3RvcnkuZXhlY3V0aW9uVGltZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogZmFsc2VcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXHJcbiAgICAgIFwiU3VnZ2VzdGVkQWN0aW9uc1wiLFxyXG4gICAgICB7XHJcbiAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IFN1Z2dlc3RlZEFjdGlvbnNFdmVudCkgPT4ge1xyXG4gICAgICAgICAgLy8gU2luY2UgYWZ0ZXIgdGhlIFwiSGlzdG9yeVwiIGFuZCBcIk1lc3NhZ2VCcmVha1wiIHRoYXQgdGhpcyBldmVudCBpcyBjYXVnaHQsXHJcbiAgICAgICAgICAvLyAkc3VnZ2VzdGVkQWN0aW9uIG5lZWRzIHRvIGJlIHVwZGF0ZWQgZGlyZWN0bHkgdG8gdGhlIGxhc3QgdmlzaWJsZSBcImFzc2lzdGFudFwiIG1lc3NhZ2UgaW4gdGhlIF9yZXNwb25zZSBhbmQgdGhlIGNoYXRIaXN0b3J5XHJcbiAgICAgICAgICB0aGlzLl9yZXNwb25zZS5hdCgtMSkhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRzdWdnZXN0ZWRBY3Rpb24gPSAodGhpcy5fcmVzcG9uc2UuYXQoLTEpIS5hZGRpdGlvbmFsUHJvcGVydGllcy4kc3VnZ2VzdGVkQWN0aW9uIHx8IFtdKS5jb25jYXQobWVzc2FnZS5zdWdnZXN0ZWRBY3Rpb25zKTtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXN0VmlzaWJsZUFzc2lzdGFudE1lc3NhZ2VJbmRleCh0aGlzLmNoYXRIaXN0b3J5KTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSFbaW5kZXhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRzdWdnZXN0ZWRBY3Rpb24gPSAodGhpcy5jaGF0SGlzdG9yeSFbaW5kZXhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRzdWdnZXN0ZWRBY3Rpb24gfHwgW10pLmNvbmNhdChtZXNzYWdlLnN1Z2dlc3RlZEFjdGlvbnMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcclxuICAgICAgXCJEZWJ1Z0Rpc3BsYXlcIixcclxuICAgICAge1xyXG4gICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBEZWJ1Z01lc3NhZ2VFdmVudCkgPT4gdGhpcy5fZGVidWdNZXNzYWdlcyA9IHRoaXMuX2RlYnVnTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2UpLFxyXG4gICAgICAgIGlzR2xvYmFsSGFuZGxlcjogZmFsc2VcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXHJcbiAgICAgIFwiTWVzc2FnZUJyZWFrXCIsXHJcbiAgICAgIHtcclxuICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAgICAgICAvLyBHZW5lcmF0ZSBhdWRpdCBldmVudFxyXG4gICAgICAgICAgY29uc3QgZGV0YWlscyA9IHtcclxuICAgICAgICAgICAgJ2R1cmF0aW9uJzogdGhpcy5fZXhlY3V0aW9uVGltZSxcclxuICAgICAgICAgICAgJ3RleHQnOiB0aGlzLmNoYXRIaXN0b3J5IS5hdCgtMSkhLmNvbnRlbnQsXHJcbiAgICAgICAgICAgICdyb2xlJzogdGhpcy5jaGF0SGlzdG9yeSEuYXQoLTEpIS5yb2xlLCAvLyAnYXNzaXN0YW50J1xyXG4gICAgICAgICAgICAncmFuayc6IHRoaXMuY2hhdEhpc3RvcnkhLmxlbmd0aCAtIDEsXHJcbiAgICAgICAgICAgICdnZW5lcmF0aW9uLXRva2VuY291bnQnOiB0aGlzLmNoYXRIaXN0b3J5IS5hdCgtMSkhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnVzYWdlTWV0cmljcz8uY29tcGxldGlvblRva2VuQ291bnQsXHJcbiAgICAgICAgICAgICdwcm9tcHQtdG9rZW5jb3VudCc6IHRoaXMuY2hhdEhpc3RvcnkhLmF0KC0xKSEuYWRkaXRpb25hbFByb3BlcnRpZXMudXNhZ2VNZXRyaWNzPy5wcm9tcHRUb2tlbkNvdW50LFxyXG4gICAgICAgICAgICAnYXR0YWNobWVudHMnOiBKU09OLnN0cmluZ2lmeSh0aGlzLl9hdHRhY2htZW50cy5tYXAoKHsgcmVjb3JkSWQsIGNvbnRleHRJZCwgcGFydHMsIHR5cGUgfSkgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHM6IHBhcnRzLm1hcCgoeyBwYXJ0SWQsIHRleHQgfSkgPT4gKHsgcGFydElkLCB0ZXh0IH0pKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ21lc3NhZ2UnLCBkZXRhaWxzKTtcclxuICAgICAgICAgIC8vIFB1c2ggYSBuZXcgYXNzaXN0YW50IG1lc3NhZ2UgdG8gdGhlIF9yZXNwb25zZSBhcnJheSBPTkxZIGlmIHRoZSBjb250ZW50IG9mIHRoZSBsYXN0IG1lc3NhZ2UgaXMgbm90IGVtcHR5XHJcbiAgICAgICAgICBpZiAodGhpcy5fcmVzcG9uc2UuYXQoLTEpIS5jb250ZW50ICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc3BvbnNlLnB1c2goe3JvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IFwiXCIsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdHJ1ZX19KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3ZlcnJpZGUgYW5kIHJlZ2lzdGVyIHRoZSBlbnRpcmUgX21lc3NhZ2VIYW5kbGVycyBtYXAgYnkgbWVyZ2luZyB0aGUgcHJvdmlkZWQgbWFwIHdpdGggdGhlIGRlZmF1bHQgb25lXHJcbiAgICogQHBhcmFtIF9tZXNzYWdlSGFuZGxlcnNcclxuICAgKi9cclxuICBvdmVycmlkZU1lc3NhZ2VIYW5kbGVyczxUPihfbWVzc2FnZUhhbmRsZXJzOiBNYXA8c3RyaW5nLCBNZXNzYWdlSGFuZGxlcjxUPj4pIHtcclxuICAgIC8vIENsZWFyIHRoZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZ2xvYmFsIGNoYXQgaGFuZGxlcnMgYmVmb3JlIG1lcmdpbmcgdGhlIG5ldyBvbmVzXHJcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlcnMuZm9yRWFjaCgoZXZlbnRIYW5kbGVyLCBldmVudE5hbWUpID0+IHtcclxuICAgICAgaWYoZXZlbnRIYW5kbGVyLmlzR2xvYmFsSGFuZGxlcikge1xyXG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVNZXNzYWdlSGFuZGxlcihldmVudE5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBNZXJnZSB0aGUgbmV3IGV2ZW50IGhhbmRsZXJzIHdpdGggdGhlIGV4aXN0aW5nIG9uZXNcclxuICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVycyA9IG5ldyBNYXAoWy4uLnRoaXMuX21lc3NhZ2VIYW5kbGVycywgLi4uX21lc3NhZ2VIYW5kbGVyc10pO1xyXG5cclxuICAgIC8vIFJlZ2lzdGVyIHRoZSBnbG9iYWwgaGFuZGxlcnMgYW1vbmcgdGhlIG1lcmdlZCBtYXBcclxuICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVycy5mb3JFYWNoKChldmVudEhhbmRsZXIsIGV2ZW50TmFtZSkgPT4ge1xyXG4gICAgICBpZihldmVudEhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudC5cclxuICAgKiBJZiBhIGxpc3RlbmVyIGZvciB0aGlzIHNhbWUgZXZlbnQgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgb3ZlcnJpZGRlbi5cclxuICAgKiBJZiB0aGUgbGlzdGVuZXIgaGFzIFwiaXNHbG9iYWxIYW5kbGVyXCIgc2V0IHRvIHRydWUsIGl0IHdpbGwgYmUgcmVnaXN0ZXJlZCB0byB0aGUgaHViIGNvbm5lY3Rpb24uXHJcbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciBhIGxpc3RlbmVyIGZvclxyXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXHJcbiAgICovXHJcbiAgYWRkTWVzc2FnZUhhbmRsZXI8VD4oZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8VD4pIHtcclxuICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVycy5zZXQoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xyXG4gICAgaWYoZXZlbnRIYW5kbGVyLmlzR2xvYmFsSGFuZGxlcikge1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudC5cclxuICAgKiBJZiBhIGxpc3RlbmVyIGZvciB0aGlzIGV2ZW50IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIG92ZXJyaWRkZW4uXHJcbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciBhIGxpc3RlbmVyIGZvclxyXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXI8VD4oZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8VD4pIHtcclxuICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiTm8gY29ubmVjdGlvbiBmb3VuZCB0byByZWdpc3RlciB0aGUgbGlzdGVuZXJcIiArIGV2ZW50TmFtZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbm5lY3Rpb24ub24oZXZlbnROYW1lLCAoZGF0YTogVCkgPT4ge1xyXG4gICAgICBldmVudEhhbmRsZXIuaGFuZGxlcihkYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGEgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgZXZlbnQgZnJvbSB0aGUgX21lc3NhZ2VIYW5kbGVycyBtYXAgYW5kIHVuc3Vic2NyaWJlIGZyb20gcmVjZWl2aW5nIG1lc3NhZ2VzIGZvciB0aGlzIGV2ZW50IGZyb20gdGhlIFNpZ25hbFIgaHViLlxyXG4gICAqIEBwYXJhbSBldmVudE5hbWUgTmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmb3JcclxuICAgKi9cclxuICByZW1vdmVNZXNzYWdlSGFuZGxlcihldmVudE5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXJzLmRlbGV0ZShldmVudE5hbWUpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZU1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgYSBzcGVjaWZpYyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cclxuICAgKiBBTEwgaXRzIHJlbGF0ZWQgbGlzdGVuZXJzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGh1YiBjb25uZWN0aW9uXHJcbiAgICogVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgb2xkIGxpc3RlbmVycyB3aGVuIG92ZXJyaWRpbmcgdGhlIGVudGlyZSBfbWVzc2FnZUhhbmRsZXJzIG1hcFxyXG4gICAqIEBwYXJhbSBldmVudE5hbWUgTmFtZSBvZiB0aGUgZXZlbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgdW5zdWJzY3JpYmVNZXNzYWdlSGFuZGxlcihldmVudE5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5jb25uZWN0aW9uIS5vZmYoZXZlbnROYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIGEgY29ubmVjdGlvbiB0byB0aGUgc2lnbmFsUiB3ZWJzb2NrZXQgYW5kIHJlZ2lzdGVyIGRlZmF1bHQgbGlzdGVuZXJzIHRvIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlcnZlciBodWIgY2xhc3NcclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24uIEl0IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBvcHRpb25zXHJcbiAgICogQHBhcmFtIGxvZ0xldmVsIERlZmluZSB0aGUgbG9nIGxldmVsIGRpc3BsYXllZCBpbiB0aGUgY29uc29sZVxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGJ1aWx0XHJcbiAgICovXHJcbiAgYnVpbGRDb25uZWN0aW9uKG9wdGlvbnM/OiBDb25uZWN0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLlJFUVVFU1RfVVJMKSB7XHJcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiTm8gZW5kcG9pbnQgcHJvdmlkZWQgdG8gY29ubmVjdCB0aGUgd2Vic29ja2V0IHRvXCIpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBsb2dMZXZlbCA9IHRoaXMuX2dldExvZ0xldmVsKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlPy5jb25uZWN0aW9uU2V0dGluZ3Muc2lnbmFsUlNraXBOZWdvdGlhdGlvbiA9PT0gdHJ1ZSlcclxuICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnMsIHNraXBOZWdvdGlhdGlvbjogdHJ1ZX07XHJcblxyXG4gICAgICB0aGlzLmNvbm5lY3Rpb24gPSB0aGlzLnNpZ25hbFJTZXJ2aWNlLmJ1aWxkQ29ubmVjdGlvbih0aGlzLlJFUVVFU1RfVVJMLCB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9uc30sIGxvZ0xldmVsLCB0cnVlKTtcclxuXHJcbiAgICAgIGNvbnN0IHNpZ25hbFJTZXJ2ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWU/LmNvbm5lY3Rpb25TZXR0aW5ncy5zaWduYWxSU2VydmVyVGltZW91dEluTWlsbGlzZWNvbmRzO1xyXG4gICAgICBpZiAoc2lnbmFsUlNlcnZlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZXJ2ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBzaWduYWxSU2VydmVyVGltZW91dEluTWlsbGlzZWNvbmRzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXNvbHZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0IHRoZSBjb25uZWN0aW9uXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RhcnRlZFxyXG4gICAqL1xyXG4gIHN0YXJ0Q29ubmVjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnNpZ25hbFJTZXJ2aWNlLnN0YXJ0Q29ubmVjdGlvbih0aGlzLmNvbm5lY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcCB0aGUgY29ubmVjdGlvblxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHN0b3BwZWRcclxuICAgKi9cclxuICBzdG9wQ29ubmVjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnNpZ25hbFJTZXJ2aWNlLnN0b3BDb25uZWN0aW9uKHRoaXMuY29ubmVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRUcmFuc3BvcnRzKCk6IEh0dHBUcmFuc3BvcnRUeXBlIHtcclxuICAgIHN3aXRjaCAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlPy5jb25uZWN0aW9uU2V0dGluZ3Muc2lnbmFsUlRyYW5zcG9ydCkge1xyXG4gICAgICBjYXNlIFwiV2ViU29ja2V0c1wiOlxyXG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5XZWJTb2NrZXRzO1xyXG4gICAgICBjYXNlIFwiU2VydmVyU2VudEV2ZW50c1wiOlxyXG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5TZXJ2ZXJTZW50RXZlbnRzO1xyXG4gICAgICBjYXNlIFwiTG9uZ1BvbGxpbmdcIjpcclxuICAgICAgICByZXR1cm4gSHR0cFRyYW5zcG9ydFR5cGUuTG9uZ1BvbGxpbmc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIEh0dHBUcmFuc3BvcnRUeXBlLk5vbmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRMb2dMZXZlbCgpOiBMb2dMZXZlbCB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZT8uY29ubmVjdGlvblNldHRpbmdzLnNpZ25hbFJMb2dMZXZlbCkge1xyXG4gICAgICBjYXNlIFwiQ3JpdGljYWxcIjpcclxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuQ3JpdGljYWw7IC8vIExvZyBsZXZlbCBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIGEgZmFpbHVyZSB0aGF0IHdpbGwgdGVybWluYXRlIHRoZSBlbnRpcmUgYXBwbGljYXRpb24uXHJcbiAgICAgIGNhc2UgXCJEZWJ1Z1wiOlxyXG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5EZWJ1ZzsgLy8gTG9nIGxldmVsIGZvciBsb3cgc2V2ZXJpdHkgZGlhZ25vc3RpYyBtZXNzYWdlcy5cclxuICAgICAgY2FzZSBcIkVycm9yXCI6XHJcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLkVycm9yOyAvLyBMb2cgbGV2ZWwgZm9yIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhhdCBpbmRpY2F0ZSBhIGZhaWx1cmUgaW4gdGhlIGN1cnJlbnQgb3BlcmF0aW9uLlxyXG4gICAgICBjYXNlIFwiSW5mb3JtYXRpb25cIjpcclxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuSW5mb3JtYXRpb247IC8vIExvZyBsZXZlbCBmb3IgaW5mb3JtYXRpb25hbCBkaWFnbm9zdGljIG1lc3NhZ2VzLlxyXG4gICAgICBjYXNlIFwiTm9uZVwiOlxyXG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5Ob25lOyAvLyBUaGUgaGlnaGVzdCBwb3NzaWJsZSBsb2cgbGV2ZWwuIFVzZWQgd2hlbiBjb25maWd1cmluZyBsb2dnaW5nIHRvIGluZGljYXRlIHRoYXQgbm8gbG9nIG1lc3NhZ2VzIHNob3VsZCBiZSBlbWl0dGVkLlxyXG4gICAgICBjYXNlIFwiVHJhY2VcIjpcclxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuVHJhY2U7IC8vIExvZyBsZXZlbCBmb3IgdmVyeSBsb3cgc2V2ZXJpdHkgZGlhZ25vc3RpYyBtZXNzYWdlcy5cclxuICAgICAgY2FzZSBcIldhcm5pbmdcIjpcclxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuV2FybmluZzsgLy8gTG9nIGxldmVsIGZvciBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoYXQgaW5kaWNhdGUgYSBub24tZmF0YWwgcHJvYmxlbS5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuTm9uZTsgLy8gVGhlIGhpZ2hlc3QgcG9zc2libGUgbG9nIGxldmVsLiBVc2VkIHdoZW4gY29uZmlndXJpbmcgbG9nZ2luZyB0byBpbmRpY2F0ZSB0aGF0IG5vIGxvZyBtZXNzYWdlcyBzaG91bGQgYmUgZW1pdHRlZC5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBkZWZhdWx0T3B0aW9ucygpOiBDb25uZWN0aW9uT3B0aW9ucyB7XHJcbiAgICBsZXQgaGVhZGVyczogTWVzc2FnZUhlYWRlcnMgPSB7XHJcbiAgICAgIFwic2luZXF1YS1mb3JjZS1jYW1lbC1jYXNlXCI6IFwidHJ1ZVwiLFxyXG4gICAgICBcIngtbGFuZ3VhZ2VcIjogdGhpcy5pbnRsU2VydmljZS5jdXJyZW50TG9jYWxlLm5hbWUsXHJcbiAgICAgIFwidWktbGFuZ3VhZ2VcIjogdGhpcy5pbnRsU2VydmljZS5jdXJyZW50TG9jYWxlLm5hbWUsXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnByb2Nlc3NlZENyZWRlbnRpYWxzKSB7XHJcbiAgICAgIGhlYWRlcnMgPSB7Li4uaGVhZGVycywgXCJzaW5lcXVhLWNzcmYtdG9rZW5cIjogdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UucHJvY2Vzc2VkQ3JlZGVudGlhbHMuZGF0YS5jc3JmVG9rZW59O1xyXG4gICAgfTtcclxuICAgIC8vIEZvciB0aGUgZmlyc3QgR0VUIHJlcXVlc3Qgc2VudCBieSBzaWduYWxSIHRvIHN0YXJ0IGEgV2ViU29ja2V0IHByb3RvY29sLFxyXG4gICAgLy8gYXMgZmFyIGFzIHdlIGtub3csIHNpZ25hbFIgb25seSBsZXRzIHVzIHR3ZWFrIHRoZSByZXF1ZXN0IHdpdGggdGhpcyBhY2Nlc3MgdG9rZW4gZmFjdG9yeVxyXG4gICAgLy8gc28gd2UgcGFzcyBhbG9uZyB0aGUgU2luZXF1YSBDU1JGIHRva2VuIHRvIHBhc3MgdGhlIENTUkYgY2hlY2suLlxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdHJhbnNwb3J0OiB0aGlzLl9nZXRUcmFuc3BvcnRzKCksXHJcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcclxuICAgICAgaGVhZGVycyxcclxuICAgICAgc2tpcE5lZ290aWF0aW9uOiBmYWxzZSxcclxuICAgICAgYWNjZXNzVG9rZW5GYWN0b3J5OiAoKSA9PiB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscz8uZGF0YT8uY3NyZlRva2VuIHx8IFwiXCJcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
package/esm2020/public-api.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// We'd like to not have a primary entry point but ng-packagr requires one currently
|
|
2
2
|
export const sinequaAssistantModule = undefined;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9GQUFvRjtBQUNwRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXZSdkIGxpa2UgdG8gbm90IGhhdmUgYSBwcmltYXJ5IGVudHJ5IHBvaW50IGJ1dCBuZy1wYWNrYWdyIHJlcXVpcmVzIG9uZSBjdXJyZW50bHlcclxuZXhwb3J0IGNvbnN0IHNpbmVxdWFBc3Npc3RhbnRNb2R1bGUgPSB1bmRlZmluZWQ7XHJcbiJdfQ==
|