stream-chat-angular 4.58.4 → 4.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,11 +8,12 @@ import * as i2 from "../chat-client.service";
8
8
  import * as i3 from "../custom-templates.service";
9
9
  import * as i4 from "../date-parser.service";
10
10
  import * as i5 from "../message-actions.service";
11
- import * as i6 from "../loading-indicator/loading-indicator.component";
12
- import * as i7 from "../icon/icon.component";
13
- import * as i8 from "../message/message.component";
14
- import * as i9 from "@angular/common";
15
- import * as i10 from "@ngx-translate/core";
11
+ import * as i6 from "../icon-placeholder/icon-placeholder.component";
12
+ import * as i7 from "../loading-indicator/loading-indicator.component";
13
+ import * as i8 from "../icon/icon.component";
14
+ import * as i9 from "../message/message.component";
15
+ import * as i10 from "@angular/common";
16
+ import * as i11 from "@ngx-translate/core";
16
17
  /**
17
18
  * The `MessageList` component renders a scrollable list of messages.
18
19
  */
@@ -55,13 +56,18 @@ export class MessageListComponent {
55
56
  this.displayDateSeparator = true;
56
57
  /**
57
58
  * If date separators are displayed, you can set the horizontal position of the date text.
58
- * If `openMessageListAt` is `last-read-message` it will also set the text position of the new messages indicator.
59
59
  */
60
60
  this.dateSeparatorTextPos = 'center';
61
61
  /**
62
62
  * `last-message` option will open the message list at the last message, `last-read-message` will open the list at the last unread message. This option only works if mode is `main`.
63
63
  */
64
64
  this.openMessageListAt = 'last-message';
65
+ /**
66
+ * If the user has unread messages when they open the channel the UI shows the unread indicator / notification which features the unread count by default. This count will be increased every time a user receives a new message. If you don't want to show the unread count, you can turn that off.
67
+ *
68
+ * This is only applicable for `main` mode, as threads doesn't have read infromation.
69
+ */
70
+ this.hideUnreadCountForNotificationAndIndicator = false;
65
71
  /**
66
72
  * You can turn on and off the loading indicator that signals to users that more messages are being loaded to the message list
67
73
  */
@@ -70,15 +76,23 @@ export class MessageListComponent {
70
76
  this.emptyThreadMessageListTemplate = null;
71
77
  this.enabledMessageActions = [];
72
78
  this.isEmpty = true;
73
- this.unreadMessageCount = 0;
79
+ this.newMessageCountWhileBeingScrolled = 0;
74
80
  this.groupStyles = [];
75
81
  this.isNextMessageOnSeparateDate = [];
76
82
  this.isLoading = false;
83
+ this.isUnreadNotificationVisible = true;
77
84
  this.isJumpingToLatestUnreadMessage = false;
78
85
  this.subscriptions = [];
79
86
  this.isLatestMessageInList = true;
80
87
  this.parsedDates = new Map();
81
88
  this.isViewInited = false;
89
+ this.messageNotificationJumpClicked = () => {
90
+ this.jumpToFirstUnreadMessage();
91
+ this.isUnreadNotificationVisible = false;
92
+ };
93
+ this.messageNotificationDismissClicked = () => {
94
+ this.isUnreadNotificationVisible = false;
95
+ };
82
96
  this.usersTypingInChannel$ = this.channelService.usersTypingInChannel$;
83
97
  this.usersTypingInThread$ = this.channelService.usersTypingInThread$;
84
98
  }
@@ -89,23 +103,58 @@ export class MessageListComponent {
89
103
  this.subscriptions.push(this.channelService.activeChannel$.subscribe((channel) => {
90
104
  var _a, _b, _c, _d, _e, _f, _g;
91
105
  (_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `${(channel === null || channel === void 0 ? void 0 : channel.cid) || 'undefined'} selected`, { tags: `message list ${this.mode}` });
106
+ let isNewChannel = false;
92
107
  if (this.channelId !== (channel === null || channel === void 0 ? void 0 : channel.id)) {
108
+ isNewChannel = true;
109
+ if (this.checkIfUnreadNotificationIsVisibleTimeout) {
110
+ clearTimeout(this.checkIfUnreadNotificationIsVisibleTimeout);
111
+ }
112
+ this.isUnreadNotificationVisible = false;
93
113
  (_e = (_d = (_c = this.chatClientService) === null || _c === void 0 ? void 0 : _c.chatClient) === null || _d === void 0 ? void 0 : _d.logger) === null || _e === void 0 ? void 0 : _e.call(_d, 'info', `new channel is different from prev channel, reseting scroll state`, { tags: `message list ${this.mode}` });
94
114
  this.parsedDates = new Map();
95
115
  this.resetScrollState();
96
116
  this.channelId = channel === null || channel === void 0 ? void 0 : channel.id;
97
- if (this.openMessageListAt === 'last-read-message' &&
98
- this.mode === 'main') {
99
- this.lastReadMessageId =
100
- this.channelService.activeChannelLastReadMessageId;
101
- if (this.lastReadMessageId) {
102
- this.isJumpingToLatestUnreadMessage = true;
103
- void this.channelService.jumpToMessage(this.lastReadMessageId);
104
- }
117
+ if (this.isViewInited) {
118
+ this.cdRef.detectChanges();
105
119
  }
106
- else {
107
- this.lastReadMessageId = undefined;
120
+ }
121
+ if (this.mode === 'main') {
122
+ const lastReadMessageId = this.channelService.activeChannelLastReadMessageId;
123
+ const unreadCount = this.channelService.activeChannelUnreadCount;
124
+ if (lastReadMessageId !== this.lastReadMessageId ||
125
+ unreadCount !== this.unreadCount) {
126
+ this.lastReadMessageId = lastReadMessageId;
127
+ this.unreadCount = unreadCount || 0;
128
+ if (isNewChannel && this.lastReadMessageId) {
129
+ if (this.openMessageListAt === 'last-read-message') {
130
+ this.jumpToFirstUnreadMessage();
131
+ }
132
+ else {
133
+ // Wait till messages and the unread banner is rendered
134
+ // If unread banner isn't visible on the screen, we display the unread notificaion
135
+ setTimeout(() => {
136
+ var _a, _b, _c, _d;
137
+ const bannerElement = document.getElementById('stream-chat-new-message-indicator');
138
+ if (!bannerElement ||
139
+ (bannerElement === null || bannerElement === void 0 ? void 0 : bannerElement.offsetTop) <
140
+ ((_b = (_a = this.scrollContainer) === null || _a === void 0 ? void 0 : _a.nativeElement) === null || _b === void 0 ? void 0 : _b.scrollHeight) -
141
+ ((_d = (_c = this.scrollContainer) === null || _c === void 0 ? void 0 : _c.nativeElement) === null || _d === void 0 ? void 0 : _d.clientHeight)) {
142
+ this.isUnreadNotificationVisible = true;
143
+ if (this.isViewInited) {
144
+ this.cdRef.detectChanges();
145
+ }
146
+ }
147
+ }, 100);
148
+ }
149
+ }
150
+ if (this.isViewInited) {
151
+ this.cdRef.detectChanges();
152
+ }
108
153
  }
154
+ }
155
+ else if (this.lastReadMessageId) {
156
+ this.lastReadMessageId = undefined;
157
+ this.unreadCount = 0;
109
158
  if (this.isViewInited) {
110
159
  this.cdRef.detectChanges();
111
160
  }
@@ -188,6 +237,15 @@ export class MessageListComponent {
188
237
  this.cdRef.detectChanges();
189
238
  }
190
239
  }));
240
+ this.subscriptions.push(this.customTemplatesService.newMessagesNotificationTemplate$.subscribe((template) => {
241
+ if (this.customnewMessagesNotificationTemplate === template) {
242
+ return;
243
+ }
244
+ this.customnewMessagesNotificationTemplate = template;
245
+ if (this.isViewInited) {
246
+ this.cdRef.detectChanges();
247
+ }
248
+ }));
191
249
  this.subscriptions.push(this.customTemplatesService.typingIndicatorTemplate$.subscribe((template) => {
192
250
  if (this.typingIndicatorTemplate === template) {
193
251
  return;
@@ -217,8 +275,15 @@ export class MessageListComponent {
217
275
  }
218
276
  }
219
277
  else {
220
- this.scrollMessageIntoView(messageId);
221
- this.highlightedMessageId = messageId;
278
+ if (this.isJumpingToLatestUnreadMessage) {
279
+ this.scrollMessageIntoView(this.firstUnreadMessageId || messageId);
280
+ this.highlightedMessageId =
281
+ this.firstUnreadMessageId || messageId;
282
+ }
283
+ else {
284
+ this.scrollMessageIntoView(messageId);
285
+ this.highlightedMessageId = messageId;
286
+ }
222
287
  }
223
288
  }
224
289
  }));
@@ -344,7 +409,7 @@ export class MessageListComponent {
344
409
  this.ngZone.run(() => {
345
410
  this.isUserScrolled = isUserScrolled;
346
411
  if (!this.isUserScrolled) {
347
- this.unreadMessageCount = 0;
412
+ this.newMessageCountWhileBeingScrolled = 0;
348
413
  }
349
414
  this.cdRef.detectChanges();
350
415
  });
@@ -372,6 +437,13 @@ export class MessageListComponent {
372
437
  }
373
438
  this.prevScrollTop = this.scrollContainer.nativeElement.scrollTop;
374
439
  }
440
+ jumpToFirstUnreadMessage() {
441
+ if (!this.lastReadMessageId) {
442
+ return;
443
+ }
444
+ this.isJumpingToLatestUnreadMessage = true;
445
+ void this.channelService.jumpToMessage(this.lastReadMessageId);
446
+ }
375
447
  getTypingIndicatorContext() {
376
448
  return {
377
449
  usersTyping$: this.usersTyping$,
@@ -468,6 +540,15 @@ export class MessageListComponent {
468
540
  this.oldestMessage = currentOldestMessage;
469
541
  this.olderMassagesLoaded = true;
470
542
  }
543
+ }), tap((messages) => {
544
+ var _a;
545
+ if (this.isJumpingToLatestUnreadMessage &&
546
+ !this.firstUnreadMessageId &&
547
+ this.lastReadMessageId) {
548
+ const lastReadIndex = messages.findIndex((m) => m.id === this.lastReadMessageId);
549
+ this.firstUnreadMessageId =
550
+ ((_a = messages[lastReadIndex + 1]) === null || _a === void 0 ? void 0 : _a.id) || this.lastReadMessageId;
551
+ }
471
552
  }), tap((messages) => {
472
553
  var _a;
473
554
  return (this.lastSentMessageId = (_a = [...messages]
@@ -485,15 +566,8 @@ export class MessageListComponent {
485
566
  if (!this.isLatestMessageInList) {
486
567
  this.isUserScrolled = true;
487
568
  }
488
- }), tap(() => {
489
- var _a;
490
- if (this.isJumpingToLatestUnreadMessage &&
491
- this.lastReadMessageId &&
492
- this.lastReadMessageId === ((_a = this.latestMessage) === null || _a === void 0 ? void 0 : _a.id)) {
493
- this.lastReadMessageId = undefined;
494
- }
495
569
  }), map((messages) => this.direction === 'bottom-to-top' ? messages : [...messages].reverse()), tap((messages) => {
496
- this.groupStyles = messages.map((m, i) => getGroupStyles(m, messages[i - 1], messages[i + 1]));
570
+ this.groupStyles = messages.map((m, i) => getGroupStyles(m, messages[i - 1], messages[i + 1], false, this.lastReadMessageId));
497
571
  this.isNextMessageOnSeparateDate = messages.map((m, i) => this.checkIfOnSeparateDates(m, messages[i + 1]));
498
572
  }));
499
573
  }
@@ -505,7 +579,7 @@ export class MessageListComponent {
505
579
  this.containerHeight = undefined;
506
580
  this.olderMassagesLoaded = false;
507
581
  this.oldestMessage = undefined;
508
- this.unreadMessageCount = 0;
582
+ this.newMessageCountWhileBeingScrolled = 0;
509
583
  this.prevScrollTop = undefined;
510
584
  this.isNewMessageSentByUser = undefined;
511
585
  this.isLatestMessageInList = true;
@@ -523,11 +597,13 @@ export class MessageListComponent {
523
597
  }
524
598
  else if (element) {
525
599
  element.scrollIntoView({
526
- block: messageId === this.lastReadMessageId ? 'start' : 'center',
600
+ block: 'center',
527
601
  });
528
602
  setTimeout(() => {
529
603
  this.highlightedMessageId = undefined;
604
+ this.firstUnreadMessageId = undefined;
530
605
  this.isJumpingToLatestUnreadMessage = false;
606
+ this.cdRef.detectChanges();
531
607
  }, 1000);
532
608
  }
533
609
  }
@@ -547,12 +623,18 @@ export class MessageListComponent {
547
623
  if (!this.latestMessage ||
548
624
  ((_a = this.latestMessage.created_at) === null || _a === void 0 ? void 0 : _a.getTime()) < message.created_at.getTime()) {
549
625
  (_c = (_b = this.chatClientService.chatClient) === null || _b === void 0 ? void 0 : _b.logger) === null || _c === void 0 ? void 0 : _c.call(_b, 'info', `Received new message`, { tags: `message list ${this.mode}` });
626
+ const isNewChannel = !this.latestMessage;
550
627
  this.latestMessage = message;
551
628
  this.hasNewMessages = true;
552
629
  this.isNewMessageSentByUser =
553
630
  ((_d = message.user) === null || _d === void 0 ? void 0 : _d.id) === ((_f = (_e = this.chatClientService.chatClient) === null || _e === void 0 ? void 0 : _e.user) === null || _f === void 0 ? void 0 : _f.id);
554
631
  if (this.isUserScrolled) {
555
- this.unreadMessageCount++;
632
+ this.newMessageCountWhileBeingScrolled++;
633
+ }
634
+ if (!this.isNewMessageSentByUser &&
635
+ this.unreadCount !== undefined &&
636
+ !isNewChannel) {
637
+ this.unreadCount++;
556
638
  }
557
639
  this.cdRef.detectChanges();
558
640
  }
@@ -573,7 +655,7 @@ export class MessageListComponent {
573
655
  }
574
656
  }
575
657
  MessageListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageListComponent, deps: [{ token: i1.ChannelService }, { token: i2.ChatClientService }, { token: i3.CustomTemplatesService }, { token: i4.DateParserService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i5.MessageActionsService }], target: i0.ɵɵFactoryTarget.Component });
576
- MessageListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageListComponent, selector: "stream-message-list", inputs: { mode: "mode", direction: "direction", messageOptionsTrigger: "messageOptionsTrigger", hideJumpToLatestButtonDuringScroll: "hideJumpToLatestButtonDuringScroll", customMessageActions: "customMessageActions", displayDateSeparator: "displayDateSeparator", dateSeparatorTextPos: "dateSeparatorTextPos", openMessageListAt: "openMessageListAt", displayLoadingIndicator: "displayLoadingIndicator" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "parentMessageElement", first: true, predicate: ["parentMessageElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n style=\"overscroll-behavior: none\"\n>\n <ng-container *ngIf=\"mode === 'main' && isEmpty && emptyListTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyListTemplate\"></ng-container>\n </ng-container>\n <div class=\"str-chat__reverse-infinite-scroll str-chat__message-list-scroll\">\n <ul\n class=\"str-chat__ul\"\n [class.str-chat__message-options-in-bubble]=\"\n messageOptionsTrigger === 'message-bubble'\n \"\n >\n <li\n #parentMessageElement\n *ngIf=\"mode === 'thread' && parentMessage\"\n data-testid=\"parent-message\"\n class=\"str-chat__parent-message-li\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage, index: 'parent' }\n \"\n ></ng-container>\n <div data-testid=\"reply-count\" class=\"str-chat__thread-start\">\n {{parentMessage?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </div>\n </li>\n <ng-container *ngIf=\"mode === 'thread' && isEmpty && emptyListTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyListTemplate\"></ng-container>\n </ng-container>\n <stream-loading-indicator\n data-testid=\"top-loading-indicator\"\n *ngIf=\"\n isLoading && direction === 'bottom-to-top' && displayLoadingIndicator\n \"\n ></stream-loading-indicator>\n <ng-container *ngIf=\"messages$ | async as messages\">\n <ng-container\n *ngFor=\"\n let message of messages;\n let i = index;\n let isFirst = first;\n let isLast = last;\n trackBy: trackByMessageId\n \"\n >\n <ng-container *ngIf=\"isFirst\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: message.created_at,\n parsedDate: parseDate(message.created_at),\n isNewMessage: false\n }\n \"\n ></ng-container>\n </ng-container>\n <li\n tabindex=\"0\"\n data-testclass=\"message\"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n id=\"{{ message.id }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message, index: i }\n \"\n ></ng-container>\n </li>\n <ng-container\n *ngIf=\"\n (lastReadMessageId === message.id &&\n !isLast &&\n direction === 'bottom-to-top' &&\n !isSentByCurrentUser(messages[i + 1]) &&\n (!displayDateSeparator || !isNextMessageOnSeparateDate[i])) ||\n (direction === 'top-to-bottom' &&\n !isLast &&\n !isSentByCurrentUser(message) &&\n lastReadMessageId === messages[i + 1].id)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customnewMessagesIndicatorTemplate ||\n defaultNewMessagesIndicator\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"isNextMessageOnSeparateDate[i]\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: messages[i + 1].created_at,\n parsedDate: parseDate(messages[i + 1].created_at),\n isNewMessage:\n (direction === 'bottom-to-top' &&\n message.id === lastReadMessageId &&\n !isSentByCurrentUser(messages[i + 1])) ||\n (direction === 'top-to-bottom' && false)\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <stream-loading-indicator\n data-testid=\"bottom-loading-indicator\"\n *ngIf=\"\n isLoading && direction === 'top-to-bottom' && displayLoadingIndicator\n \"\n ></stream-loading-indicator>\n </ul>\n <ng-template #defaultTypingIndicator let-usersTyping$=\"usersTyping$\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <ng-container *ngIf=\"$any(usersTyping$ | async) as users\">\n <div\n *ngIf=\"users.length > 0\"\n data-testid=\"typing-indicator\"\n class=\"str-chat__typing-indicator str-chat__typing-indicator--typing\"\n >\n <div class=\"str-chat__typing-indicator__dots\">\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n </div>\n <div\n data-testid=\"typing-users\"\n class=\"str-chat__typing-indicator__users\"\n >\n {{\n users.length === 1\n ? (\"streamChat.user is typing\"\n | translate: { user: getTypingIndicatorText(users) })\n : (\"streamChat.users are typing\"\n | translate: { users: getTypingIndicatorText(users) })\n }}\n </div>\n </div>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n typingIndicatorTemplate || defaultTypingIndicator;\n context: getTypingIndicatorContext()\n \"\n ></ng-container>\n </div>\n</div>\n<div class=\"str-chat__jump-to-latest-message\">\n <button\n data-testid=\"scroll-to-latest\"\n *ngIf=\"isUserScrolled\"\n class=\"\n str-chat__message-notification-scroll-to-latest\n str-chat__message-notification-scroll-to-latest-right\n str-chat__circle-fab\n \"\n (keyup.enter)=\"jumpToLatestMessage()\"\n (click)=\"jumpToLatestMessage()\"\n >\n <stream-icon\n class=\"str-chat__jump-to-latest-icon str-chat__circle-fab-icon\"\n [icon]=\"direction === 'bottom-to-top' ? 'arrow-down' : 'arrow-up'\"\n ></stream-icon>\n <div\n *ngIf=\"unreadMessageCount > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-to-latest-unread-count\n str-chat__jump-to-latest-unread-count\n \"\n >\n {{ unreadMessageCount }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\" let-index=\"index\">\n <ng-template\n #defaultMessageTemplate\n let-messageInput=\"message\"\n let-isLastSentMessage=\"isLastSentMessage\"\n let-enabledMessageActions=\"enabledMessageActions\"\n let-mode=\"mode\"\n let-isHighlighted=\"isHighlighted\"\n let-customActions=\"customActions\"\n >\n <stream-message\n [message]=\"messageInput\"\n [isLastSentMessage]=\"isLastSentMessage\"\n [enabledMessageActions]=\"enabledMessageActions\"\n [mode]=\"mode\"\n [isHighlighted]=\"isHighlighted\"\n [customActions]=\"customActions\"\n ></stream-message>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate || defaultMessageTemplate;\n context: {\n message: message,\n isLastSentMessage: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n enabledMessageActions: enabledMessageActions,\n mode: mode,\n isHighlighted:\n message?.id === highlightedMessageId &&\n !isJumpingToLatestUnreadMessage,\n customActions: customMessageActions\n }\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template\n #dateSeparator\n let-date=\"date\"\n let-parsedDate=\"parsedDate\"\n let-isNewMessage=\"isNewMessage\"\n>\n <ng-container *ngIf=\"displayDateSeparator\">\n <ng-container\n *ngTemplateOutlet=\"\n customDateSeparatorTemplate || defaultDateSeparator;\n context: {\n date: date,\n parsedDate: parsedDate,\n isNewMessage: isNewMessage\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template\n #defaultDateSeparator\n let-date=\"date\"\n let-parsedDate=\"parsedDate\"\n let-isNewMessage=\"isNewMessage\"\n >\n <div data-testid=\"date-separator\" class=\"str-chat__date-separator\">\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'right' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n <div class=\"str-chat__date-separator-date\">\n {{ parsedDate }}\n <span\n *ngIf=\"isNewMessage\"\n data-testid=\"new-messages-indicator-date-separator\"\n >\u2022 {{ \"streamChat.New\" | translate }}</span\n >\n </div>\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'left' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #defaultNewMessagesIndicator>\n <div data-testid=\"new-messages-indicator\" class=\"str-chat__date-separator\">\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'right' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n <div class=\"str-chat__date-separator-date\" translate>streamChat.New</div>\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'left' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n </div>\n</ng-template>\n", components: [{ type: i6.LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }, { type: i7.IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: i8.MessageComponent, selector: "stream-message", inputs: ["message", "enabledMessageActions", "isLastSentMessage", "mode", "isHighlighted", "customActions"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i10.TranslatePipe, "async": i9.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
658
+ MessageListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageListComponent, selector: "stream-message-list", inputs: { mode: "mode", direction: "direction", messageOptionsTrigger: "messageOptionsTrigger", hideJumpToLatestButtonDuringScroll: "hideJumpToLatestButtonDuringScroll", customMessageActions: "customMessageActions", displayDateSeparator: "displayDateSeparator", dateSeparatorTextPos: "dateSeparatorTextPos", openMessageListAt: "openMessageListAt", hideUnreadCountForNotificationAndIndicator: "hideUnreadCountForNotificationAndIndicator", displayLoadingIndicator: "displayLoadingIndicator" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "parentMessageElement", first: true, predicate: ["parentMessageElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container\n *ngIf=\"\n lastReadMessageId &&\n isUnreadNotificationVisible &&\n openMessageListAt === 'last-message'\n \"\n>\n <ng-container\n *ngTemplateOutlet=\"\n customnewMessagesNotificationTemplate ||\n defaultUnreadMessagesNotification;\n context: {\n unreadCount: unreadCount,\n onDismiss: messageNotificationDismissClicked,\n onJump: messageNotificationJumpClicked\n }\n \"\n ></ng-container>\n</ng-container>\n<ng-template\n #defaultUnreadMessagesNotification\n let-unreadCount=\"unreadCount\"\n let-onDismiss=\"onDismiss\"\n let-onJump=\"onJump\"\n>\n <div\n class=\"str-chat__unread-messages-notification\"\n data-testid=\"unread-messages-notification\"\n >\n <button\n data-testid=\"unread-messages-notification-jump-to-message\"\n (click)=\"onJump()\"\n >\n <ng-container\n *ngIf=\"\n unreadCount > 0 && !hideUnreadCountForNotificationAndIndicator;\n else noUnreadCount\n \"\n >\n {{\n (unreadCount === 1\n ? \"streamChat.\\{\\{count\\}\\} unread message\"\n : \"streamChat.\\{\\{count\\}\\} unread messages\"\n ) | translate: { count: unreadCount }\n }}\n </ng-container>\n <ng-template #noUnreadCount>\n {{ \"streamChat.Unread messages\" | translate }}\n </ng-template>\n </button>\n <button\n data-testid=\"unread-messages-notification-dismiss\"\n (click)=\"onDismiss()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n</ng-template>\n<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n style=\"overscroll-behavior: none\"\n>\n <ng-container *ngIf=\"mode === 'main' && isEmpty && emptyListTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyListTemplate\"></ng-container>\n </ng-container>\n <div class=\"str-chat__reverse-infinite-scroll str-chat__message-list-scroll\">\n <ul\n class=\"str-chat__ul\"\n [class.str-chat__message-options-in-bubble]=\"\n messageOptionsTrigger === 'message-bubble'\n \"\n >\n <li\n #parentMessageElement\n *ngIf=\"mode === 'thread' && parentMessage\"\n data-testid=\"parent-message\"\n class=\"str-chat__parent-message-li\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage, index: 'parent' }\n \"\n ></ng-container>\n <div data-testid=\"reply-count\" class=\"str-chat__thread-start\">\n {{parentMessage?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </div>\n </li>\n <ng-container *ngIf=\"mode === 'thread' && isEmpty && emptyListTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyListTemplate\"></ng-container>\n </ng-container>\n <stream-loading-indicator\n data-testid=\"top-loading-indicator\"\n *ngIf=\"\n isLoading && direction === 'bottom-to-top' && displayLoadingIndicator\n \"\n ></stream-loading-indicator>\n <ng-container *ngIf=\"messages$ | async as messages\">\n <ng-container\n *ngFor=\"\n let message of messages;\n let i = index;\n let isFirst = first;\n let isLast = last;\n trackBy: trackByMessageId\n \"\n >\n <ng-container *ngIf=\"isFirst\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: message.created_at,\n parsedDate: parseDate(message.created_at)\n }\n \"\n ></ng-container>\n </ng-container>\n <li\n tabindex=\"0\"\n data-testclass=\"message\"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n id=\"{{ message.id }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message, index: i }\n \"\n ></ng-container>\n </li>\n <ng-container\n *ngIf=\"\n (lastReadMessageId === message?.id &&\n direction === 'bottom-to-top') ||\n (direction === 'top-to-bottom' &&\n lastReadMessageId === messages[i + 1]?.id)\n \"\n >\n <li\n id=\"stream-chat-new-message-indicator\"\n data-testid=\"new-messages-indicator\"\n class=\"str-chat__li str-chat__unread-messages-separator-wrapper\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customnewMessagesIndicatorTemplate ||\n defaultNewMessagesIndicator;\n context: { unreadCount: unreadCount }\n \"\n ></ng-container>\n </li>\n </ng-container>\n <ng-container *ngIf=\"isNextMessageOnSeparateDate[i]\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: messages[i + 1].created_at,\n parsedDate: parseDate(messages[i + 1].created_at)\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <stream-loading-indicator\n data-testid=\"bottom-loading-indicator\"\n *ngIf=\"\n isLoading && direction === 'top-to-bottom' && displayLoadingIndicator\n \"\n ></stream-loading-indicator>\n </ul>\n <ng-template #defaultTypingIndicator let-usersTyping$=\"usersTyping$\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <ng-container *ngIf=\"$any(usersTyping$ | async) as users\">\n <div\n *ngIf=\"users.length > 0\"\n data-testid=\"typing-indicator\"\n class=\"str-chat__typing-indicator str-chat__typing-indicator--typing\"\n >\n <div class=\"str-chat__typing-indicator__dots\">\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n </div>\n <div\n data-testid=\"typing-users\"\n class=\"str-chat__typing-indicator__users\"\n >\n {{\n users.length === 1\n ? (\"streamChat.user is typing\"\n | translate: { user: getTypingIndicatorText(users) })\n : (\"streamChat.users are typing\"\n | translate: { users: getTypingIndicatorText(users) })\n }}\n </div>\n </div>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n typingIndicatorTemplate || defaultTypingIndicator;\n context: getTypingIndicatorContext()\n \"\n ></ng-container>\n </div>\n</div>\n<div class=\"str-chat__jump-to-latest-message\">\n <button\n data-testid=\"scroll-to-latest\"\n *ngIf=\"isUserScrolled\"\n class=\"\n str-chat__message-notification-scroll-to-latest\n str-chat__message-notification-scroll-to-latest-right\n str-chat__circle-fab\n \"\n (keyup.enter)=\"jumpToLatestMessage()\"\n (click)=\"jumpToLatestMessage()\"\n >\n <stream-icon\n class=\"str-chat__jump-to-latest-icon str-chat__circle-fab-icon\"\n [icon]=\"direction === 'bottom-to-top' ? 'arrow-down' : 'arrow-up'\"\n ></stream-icon>\n <div\n *ngIf=\"newMessageCountWhileBeingScrolled > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-to-latest-unread-count\n str-chat__jump-to-latest-unread-count\n \"\n >\n {{ newMessageCountWhileBeingScrolled }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\" let-index=\"index\">\n <ng-template\n #defaultMessageTemplate\n let-messageInput=\"message\"\n let-isLastSentMessage=\"isLastSentMessage\"\n let-enabledMessageActions=\"enabledMessageActions\"\n let-mode=\"mode\"\n let-isHighlighted=\"isHighlighted\"\n let-customActions=\"customActions\"\n >\n <stream-message\n [message]=\"messageInput\"\n [isLastSentMessage]=\"isLastSentMessage\"\n [enabledMessageActions]=\"enabledMessageActions\"\n [mode]=\"mode\"\n [isHighlighted]=\"isHighlighted\"\n [customActions]=\"customActions\"\n ></stream-message>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate || defaultMessageTemplate;\n context: {\n message: message,\n isLastSentMessage: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n enabledMessageActions: enabledMessageActions,\n mode: mode,\n isHighlighted: message?.id === highlightedMessageId,\n customActions: customMessageActions\n }\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template #dateSeparator let-date=\"date\" let-parsedDate=\"parsedDate\">\n <ng-container *ngIf=\"displayDateSeparator\">\n <ng-container\n *ngTemplateOutlet=\"\n customDateSeparatorTemplate || defaultDateSeparator;\n context: {\n date: date,\n parsedDate: parsedDate\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template\n #defaultDateSeparator\n let-date=\"date\"\n let-parsedDate=\"parsedDate\"\n >\n <div data-testid=\"date-separator\" class=\"str-chat__date-separator\">\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'right' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n <div class=\"str-chat__date-separator-date\">\n {{ parsedDate }}\n </div>\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'left' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #defaultNewMessagesIndicator let-unreadCount=\"unreadCount\">\n <div class=\"str-chat__unread-messages-separator\">\n <ng-container\n *ngIf=\"\n unreadCount > 0 && !hideUnreadCountForNotificationAndIndicator;\n else noUnreadCount\n \"\n >\n {{\n (unreadCount === 1\n ? \"streamChat.\\{\\{count\\}\\} unread message\"\n : \"streamChat.\\{\\{count\\}\\} unread messages\"\n ) | translate: { count: unreadCount }\n }}\n </ng-container>\n <ng-template #noUnreadCount>\n {{ \"streamChat.Unread messages\" | translate }}\n </ng-template>\n </div>\n</ng-template>\n", components: [{ type: i6.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: i7.LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }, { type: i8.IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: i9.MessageComponent, selector: "stream-message", inputs: ["message", "enabledMessageActions", "isLastSentMessage", "mode", "isHighlighted", "customActions"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i11.TranslatePipe, "async": i10.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
577
659
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageListComponent, decorators: [{
578
660
  type: Component,
579
661
  args: [{
@@ -598,6 +680,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
598
680
  type: Input
599
681
  }], openMessageListAt: [{
600
682
  type: Input
683
+ }], hideUnreadCountForNotificationAndIndicator: [{
684
+ type: Input
601
685
  }], displayLoadingIndicator: [{
602
686
  type: Input
603
687
  }], scrollContainer: [{
@@ -610,4 +694,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
610
694
  type: HostBinding,
611
695
  args: ['class']
612
696
  }] } });
613
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFdBQVcsRUFDWCxLQUFLLEVBT0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBVWxELE9BQU8sRUFBRSxjQUFjLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7QUFJMUM7O0dBRUc7QUFPSCxNQUFNLE9BQU8sb0JBQW9CO0lBaUcvQixZQUNVLGNBQThCLEVBQzlCLGlCQUFvQyxFQUNwQyxzQkFBOEMsRUFDOUMsVUFBNkIsRUFDN0IsTUFBYyxFQUNkLEtBQXdCLEVBQ3hCLHFCQUE0QztRQU41QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBckd0RDs7V0FFRztRQUNNLFNBQUksR0FBc0IsTUFBTSxDQUFDO1FBQzFD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a0M7c0JBQTFDLEtBQUs7Z0JBTUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFLRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBSUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUtHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFzQkUsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBR3BCLG9CQUFvQjtzQkFEM0IsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBdUJyQixLQUFLO3NCQURoQixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgTWVzc2FnZUNvbnRleHQsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIFN0cmVhbU1lc3NhZ2UsXG4gIFR5cGluZ0luZGljYXRvckNvbnRleHQsXG4gIEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtLFxuICBEYXRlU2VwYXJhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEdyb3VwU3R5bGVzLCBHcm91cFN0eWxlIH0gZnJvbSAnLi9ncm91cC1zdHlsZXMnO1xuaW1wb3J0IHsgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBsaXN0VXNlcnMgfSBmcm9tICcuLi9saXN0LXVzZXJzJztcbmltcG9ydCB7IERhdGVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0ZS1wYXJzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdlQWN0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlLWFjdGlvbnMuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIGBNZXNzYWdlTGlzdGAgY29tcG9uZW50IHJlbmRlcnMgYSBzY3JvbGxhYmxlIGxpc3Qgb2YgbWVzc2FnZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VMaXN0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgbWVzc2FnZSBsaXN0IHNob3VsZCBkaXNwbGF5IGNoYW5uZWwgbWVzc2FnZXMgb3IgW3RocmVhZCBtZXNzYWdlc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvdGhyZWFkcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlOiAnbWFpbicgfCAndGhyZWFkJyA9ICdtYWluJztcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSBsaXN0LCBgYm90dG9tLXRvLXRvcGAgbWVhbnMgbmV3ZXN0IG1lc3NhZ2UgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbWVzc2FnZSBsaXN0IGFuZCB1c2VycyBzY3JvbGwgdXB3YXJkcyB0byBsb2FkIG9sZGVyIG1lc3NhZ2VzXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3Rpb246ICdib3R0b20tdG8tdG9wJyB8ICd0b3AtdG8tYm90dG9tJyA9ICdib3R0b20tdG8tdG9wJztcbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hhdCB0cmlnZ2VycyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgbWVzc2FnZSBvcHRpb25zOiBieSBkZWZhdWx0IHlvdSBjYW4gaG92ZXIgKGNsaWNrIG9uIG1vYmlsZSkgYW55d2hlcmUgaW4gdGhlIHJvdyBvZiB0aGUgbWVzc2FnZSAoYG1lc3NhZ2Utcm93YCBvcHRpb24pLCBvciB5b3UgY2FuIHNldCBgbWVzc2FnZS1idWJibGVgLCBpbiB0aGF0IGNhc2Ugb25seSBhIGhvdmVyIChjbGljayBvbiBtb2JpbGUpIGluIHRoZSBtZXNzYWdlIGJ1YmJsZSB3aWxsIHRyaWdnZXIgdGhlIG9wdGlvbnMgdG8gYXBwZWFyLlxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZU9wdGlvbnNUcmlnZ2VyOiAnbWVzc2FnZS1yb3cnIHwgJ21lc3NhZ2UtYnViYmxlJyA9XG4gICAgJ21lc3NhZ2Utcm93JztcbiAgLyoqXG4gICAqIFlvdSBjYW4gaGlkZSB0aGUgXCJqdW1wIHRvIGxhdGVzdFwiIGJ1dHRvbiB3aGlsZSBzY3JvbGxpbmcuIEEgcG90ZW50aWFsIHVzZS1jYXNlIGZvciB0aGlzIGlucHV0IHdvdWxkIGJlIHRvIFt3b3JrYXJvdW5kIGEga25vd24gaXNzdWUgb24gaU9TIFNhZmFyXShodHRwczovL2dpdGh1Yi5jb20vR2V0U3RyZWFtL3N0cmVhbS1jaGF0LWFuZ3VsYXIvaXNzdWVzLzQxOClcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVGhpcyBzY3JvbGwgaXNzdWUgaGFzIGJlZW4gcmVzb2x2ZWQsIG5vIG5lZWQgdG8gdXNlIHRoaXMgIHdvcmthcm91bmQgYW55bW9yZS5cbiAgICovXG4gIEBJbnB1dCgpIGhpZGVKdW1wVG9MYXRlc3RCdXR0b25EdXJpbmdTY3JvbGwgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjdXN0b20gbWVzc2FnZSBhY3Rpb25zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbWVzc2FnZSBhY3Rpb24gYm94XG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgdGhlIFtgTWVzc2FnZUFjdGlvbnNTZXJ2aWNlYF0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VBY3Rpb25zU2VydmljZSkgdG8gc2V0IHRoaXMgcHJvcGVydHkuXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21NZXNzYWdlQWN0aW9uczogQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW08YW55PltdID0gW107XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAgZGF0ZSBzZXBhcmF0b3JzIHdpbGwgYmUgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5RGF0ZVNlcGFyYXRvciA9IHRydWU7XG4gIC8qKlxuICAgKiBJZiBkYXRlIHNlcGFyYXRvcnMgYXJlIGRpc3BsYXllZCwgeW91IGNhbiBzZXQgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGRhdGUgdGV4dC5cbiAgICogSWYgYG9wZW5NZXNzYWdlTGlzdEF0YCBpcyBgbGFzdC1yZWFkLW1lc3NhZ2VgIGl0IHdpbGwgYWxzbyBzZXQgdGhlIHRleHQgcG9zaXRpb24gb2YgdGhlIG5ldyBtZXNzYWdlcyBpbmRpY2F0b3IuXG4gICAqL1xuICBASW5wdXQoKSBkYXRlU2VwYXJhdG9yVGV4dFBvczogJ2NlbnRlcicgfCAncmlnaHQnIHwgJ2xlZnQnID0gJ2NlbnRlcic7XG4gIC8qKlxuICAgKiBgbGFzdC1tZXNzYWdlYCBvcHRpb24gd2lsbCBvcGVuIHRoZSBtZXNzYWdlIGxpc3QgYXQgdGhlIGxhc3QgbWVzc2FnZSwgYGxhc3QtcmVhZC1tZXNzYWdlYCB3aWxsIG9wZW4gdGhlIGxpc3QgYXQgdGhlIGxhc3QgdW5yZWFkIG1lc3NhZ2UuIFRoaXMgb3B0aW9uIG9ubHkgd29ya3MgaWYgbW9kZSBpcyBgbWFpbmAuXG4gICAqL1xuICBASW5wdXQoKSBvcGVuTWVzc2FnZUxpc3RBdDogJ2xhc3QtbWVzc2FnZScgfCAnbGFzdC1yZWFkLW1lc3NhZ2UnID1cbiAgICAnbGFzdC1tZXNzYWdlJztcbiAgLyoqXG4gICAqIFlvdSBjYW4gdHVybiBvbiBhbmQgb2ZmIHRoZSBsb2FkaW5nIGluZGljYXRvciB0aGF0IHNpZ25hbHMgdG8gdXNlcnMgdGhhdCBtb3JlIG1lc3NhZ2VzIGFyZSBiZWluZyBsb2FkZWQgdG8gdGhlIG1lc3NhZ2UgbGlzdFxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3IgPSB0cnVlO1xuICB0eXBpbmdJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8VHlwaW5nSW5kaWNhdG9yQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIG1lc3NhZ2VUZW1wbGF0ZTogVGVtcGxhdGVSZWY8TWVzc2FnZUNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21EYXRlU2VwYXJhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPERhdGVTZXBhcmF0b3JDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIGVtcHR5TWFpbk1lc3NhZ2VMaXN0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIGVtcHR5VGhyZWFkTWVzc2FnZUxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgbWVzc2FnZXMkITogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGlzRW1wdHkgPSB0cnVlO1xuICB1bnJlYWRNZXNzYWdlQ291bnQgPSAwO1xuICBpc1VzZXJTY3JvbGxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgZ3JvdXBTdHlsZXM6IEdyb3VwU3R5bGVbXSA9IFtdO1xuICBpc05leHRNZXNzYWdlT25TZXBhcmF0ZURhdGU6IGJvb2xlYW5bXSA9IFtdO1xuICBsYXN0U2VudE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwYXJlbnRNZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkO1xuICBoaWdobGlnaHRlZE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgc2Nyb2xsRW5kVGltZW91dDogYW55O1xuICBsYXN0UmVhZE1lc3NhZ2VJZD86IHN0cmluZztcbiAgaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicpXG4gIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhcmVudE1lc3NhZ2VFbGVtZW50JylcbiAgcHJpdmF0ZSBwYXJlbnRNZXNzYWdlRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhdGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGhhc05ld01lc3NhZ2VzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbnRhaW5lckhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVyTWFzc2FnZXNMb2FkZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNOZXdNZXNzYWdlU2VudEJ5VXNlcjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIG5ld01lc3NhZ2VTdWJzY3JpcHRpb246IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwcmV2U2Nyb2xsVG9wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJbkNoYW5uZWwkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5UaHJlYWQkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIGlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIHByaXZhdGUgY2hhbm5lbElkPzogc3RyaW5nO1xuICBwcml2YXRlIHBhcnNlZERhdGVzID0gbmV3IE1hcDxEYXRlLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgaXNWaWV3SW5pdGVkID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIHByaXZhdGUgZ2V0IGNsYXNzKCkge1xuICAgIHJldHVybiBgc3RyLWNoYXQtYW5ndWxhcl9fbWFpbi1wYW5lbC1pbm5lciBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWxpc3QtaG9zdCBzdHItY2hhdF9fbWFpbi1wYW5lbC1pbm5lciAke1xuICAgICAgdGhpcy5pc0VtcHR5ID8gJ3N0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2UtbGlzdC1ob3N0LS1lbXB0eScgOiAnJ1xuICAgIH1gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZVBhcnNlcjogRGF0ZVBhcnNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIG1lc3NhZ2VBY3Rpb25zU2VydmljZTogTWVzc2FnZUFjdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWwkID0gdGhpcy5jaGFubmVsU2VydmljZS51c2Vyc1R5cGluZ0luQ2hhbm5lbCQ7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJCA9IHRoaXMuY2hhbm5lbFNlcnZpY2UudXNlcnNUeXBpbmdJblRocmVhZCQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbCQuc3Vic2NyaWJlKChjaGFubmVsKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGAke2NoYW5uZWw/LmNpZCB8fCAndW5kZWZpbmVkJ30gc2VsZWN0ZWRgLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbElkICE9PSBjaGFubmVsPy5pZCkge1xuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2U/LmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYG5ldyBjaGFubmVsIGlzIGRpZmZlcmVudCBmcm9tIHByZXYgY2hhbm5lbCwgcmVzZXRpbmcgc2Nyb2xsIHN0YXRlYCxcbiAgICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMucGFyc2VkRGF0ZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgdGhpcy5jaGFubmVsSWQgPSBjaGFubmVsPy5pZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLm9wZW5NZXNzYWdlTGlzdEF0ID09PSAnbGFzdC1yZWFkLW1lc3NhZ2UnICYmXG4gICAgICAgICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbExhc3RSZWFkTWVzc2FnZUlkO1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5pc0p1bXBpbmdUb0xhdGVzdFVucmVhZE1lc3NhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZSh0aGlzLmxhc3RSZWFkTWVzc2FnZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FwYWJpbGl0ZXMgPSBjaGFubmVsPy5kYXRhPy5vd25fY2FwYWJpbGl0aWVzIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBjYXBhYmlsaXRlc1N0cmluZyA9IFsuLi4oY2FwYWJpbGl0ZXMgfHwgW10pXS5zb3J0KCkuam9pbignJyk7XG4gICAgICAgIGNvbnN0IGVuYWJsZWRBY3Rpb25zU3RyaW5nID0gWy4uLih0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyB8fCBbXSldXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgaWYgKGNhcGFiaWxpdGVzU3RyaW5nICE9PSBlbmFibGVkQWN0aW9uc1N0cmluZykge1xuICAgICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zID0gY2FwYWJpbGl0ZXMgfHwgW107XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbiA9IGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBkaXNwbGF5IG1haW4gY2hhbm5lbCBtZXNzYWdlcyBhbmQgd2UncmUgc3dpdGNoZWQgdG8gYW4gb2xkZXIgbWVzc2FnZSBzZXQgLT4gdXNlIG1lc3NhZ2UubmV3IGV2ZW50IHRvIHVwZGF0ZSB1bnJlYWQgY291bnQgYW5kIGRldGVjdCBuZXcgbWVzc2FnZXMgc2VudCBieSBjdXJyZW50IHVzZXJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIWV2ZW50Lm1lc3NhZ2UgfHxcbiAgICAgICAgICAgICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyA9PT0gY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcyB8fFxuICAgICAgICAgICAgICB0aGlzLm1vZGUgPT09ICd0aHJlYWQnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXdNZXNzYWdlUmVjZWl2ZWQoe1xuICAgICAgICAgICAgICBpZDogZXZlbnQubWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgdXNlcjogZXZlbnQubWVzc2FnZS51c2VyLFxuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShldmVudC5tZXNzYWdlLmNyZWF0ZWRfYXQgfHwgJycpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbnMkLnN1YnNjcmliZSgoYWN0aW9ucykgPT4ge1xuICAgICAgICBpZiAoYWN0aW9ucyAhPT0gdGhpcy5jdXN0b21NZXNzYWdlQWN0aW9ucykge1xuICAgICAgICAgIHRoaXMuY3VzdG9tTWVzc2FnZUFjdGlvbnMgPSBhY3Rpb25zO1xuICAgICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZVBhcmVudE1lc3NhZ2UkLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZSAmJlxuICAgICAgICAgIG1lc3NhZ2UuaWQgIT09IHRoaXMucGFyZW50TWVzc2FnZS5pZCAmJlxuICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50TWVzc2FnZSA9PT0gbWVzc2FnZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VUZW1wbGF0ZSQuc3Vic2NyaWJlKCh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlVGVtcGxhdGUgPT09IHRlbXBsYXRlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuZGF0ZVNlcGFyYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZSA9PT0gdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jdXN0b21EYXRlU2VwYXJhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlID09PSB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmN1c3RvbW5ld01lc3NhZ2VzSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUgPT09IHRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmp1bXBUb01lc3NhZ2UkXG4gICAgICAgIC5waXBlKGZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZy5pZCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGxldCBtZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnbWFpbicpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZCA9IGNvbmZpZy5wYXJlbnRJZCB8fCBjb25maWcuaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGFyZW50SWQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZCA9IGNvbmZpZy5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgIGBKdW1waW5nIHRvICR7bWVzc2FnZUlkIHx8ICcnfWAsXG4gICAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWVzc2FnZUlkKSB7XG4gICAgICAgICAgICBpZiAobWVzc2FnZUlkID09PSAnbGF0ZXN0Jykge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkKTtcbiAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZE1lc3NhZ2VJZCA9IG1lc3NhZ2VJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5lbXB0eU1haW5NZXNzYWdlTGlzdFBsYWNlaG9sZGVyJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzQ2hhbmdlZCA9IHRoaXMuZW1wdHlNYWluTWVzc2FnZUxpc3RUZW1wbGF0ZSAhPT0gdGVtcGxhdGU7XG4gICAgICAgICAgdGhpcy5lbXB0eU1haW5NZXNzYWdlTGlzdFRlbXBsYXRlID0gdGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICBpZiAoaXNDaGFuZ2VkICYmIHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmVtcHR5VGhyZWFkTWVzc2FnZUxpc3RQbGFjZWhvbGRlciQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NoYW5nZWQgPSB0aGlzLmVtcHR5VGhyZWFkTWVzc2FnZUxpc3RUZW1wbGF0ZSAhPT0gdGVtcGxhdGU7XG4gICAgICAgICAgdGhpcy5lbXB0eVRocmVhZE1lc3NhZ2VMaXN0VGVtcGxhdGUgPSB0ZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgIGlmIChpc0NoYW5nZWQgJiYgdGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zZXRNZXNzYWdlcyQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5tb2RlIHx8IGNoYW5nZXMuZGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNldE1lc3NhZ2VzJCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5kaXJlY3Rpb24pIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLmp1bXBUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuY3VzdG9tTWVzc2FnZUFjdGlvbnMpIHtcbiAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbnMkLm5leHQodGhpcy5jdXN0b21NZXNzYWdlQWN0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+XG4gICAgICAgIHRoaXMuc2Nyb2xsZWQoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5oaWdobGlnaHRlZE1lc3NhZ2VJZCkge1xuICAgICAgLy8gVHVybiBvZmYgcHJvZ3JhbWF0aWMgc2Nyb2xsIGFkanVzdG1lbnRzIHdoaWxlIGp1bXAgdG8gbWVzc2FnZSBpcyBpbiBwcm9ncmVzc1xuICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IGZhbHNlO1xuICAgICAgdGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3RvcC10by1ib3R0b20nKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgJiZcbiAgICAgICAgKHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlciB8fCAhdGhpcy5pc1VzZXJTY3JvbGxlZClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdFxuICAgICAgICAgID8gdGhpcy5zY3JvbGxUb1RvcCgpXG4gICAgICAgICAgOiB0aGlzLmp1bXBUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5oYXNOZXdNZXNzYWdlcykge1xuICAgICAgICBpZiAoIXRoaXMuaXNVc2VyU2Nyb2xsZWQgfHwgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgIGBVc2VyIGhhcyBuZXcgbWVzc2FnZXMsIGFuZCBub3Qgc2Nyb2xsZWQgb3Igc2VudCBuZXcgbWVzc2FnZXMsIHRoZXJlZm9yZSB3ZSAke1xuICAgICAgICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA/ICdzY3JvbGwnIDogJ2p1bXAnXG4gICAgICAgICAgICB9IHRvIGxhdGVzdCBtZXNzYWdlYCxcbiAgICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0XG4gICAgICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICAgICAgOiB0aGlzLmp1bXBUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCkge1xuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICBgT2xkZXIgbWVzc2FnZXMgYXJlIGxvYWRlZCwgd2UgcHJlc2VydmUgdGhlIHNjcm9sbCBwb3NpdGlvbmAsXG4gICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnByZXNlcnZlU2Nyb2xsYmFyUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgdGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0aGlzLmdldFNjcm9sbFBvc2l0aW9uKCkgIT09ICdib3R0b20nICYmXG4gICAgICAgICF0aGlzLmlzVXNlclNjcm9sbGVkICYmXG4gICAgICAgICF0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYENvbnRhaW5lciBncmV3IGFuZCB1c2VyIGRpZG4ndCBzY3JvbGwgdGhlcmVmb3JlIHdlICR7XG4gICAgICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA/ICdzY3JvbGwnIDogJ2p1bXAnXG4gICAgICAgICAgfSB0byBsYXRlc3QgbWVzc2FnZWAsXG4gICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdFxuICAgICAgICAgID8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgICAgOiB0aGlzLmp1bXBUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLm5ld01lc3NhZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsRW5kVGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeU1lc3NhZ2VJZChpbmRleDogbnVtYmVyLCBpdGVtOiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cblxuICB0cmFja0J5VXNlcklkKGluZGV4OiBudW1iZXIsIHVzZXI6IFVzZXJSZXNwb25zZSkge1xuICAgIHJldHVybiB1c2VyLmlkO1xuICB9XG5cbiAganVtcFRvTGF0ZXN0TWVzc2FnZSgpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZShcbiAgICAgICdsYXRlc3QnLFxuICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJyA/IHRoaXMucGFyZW50TWVzc2FnZT8uaWQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgc2Nyb2xsVG9Cb3R0b20oKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgKyAwLjE7XG4gICAgdGhpcy5mb3JjZVJlcGFpbnQoKTtcbiAgfVxuXG4gIHNjcm9sbFRvVG9wKCkge1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgfVxuXG4gIHNjcm9sbGVkKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID09PVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLmdldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICdpbmZvJyxcbiAgICAgIGBTY3JvbGxlZCAtIHNjcm9sbCBwb3NpdGlvbjogJHtzY3JvbGxQb3NpdGlvbn0sIGNvbnRhaW5lciBoZWlnaHQ6ICR7dGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHR9YCxcbiAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICApO1xuXG4gICAgY29uc3QgaXNVc2VyU2Nyb2xsZWQgPVxuICAgICAgKHRoaXMuZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCdcbiAgICAgICAgPyBzY3JvbGxQb3NpdGlvbiAhPT0gJ2JvdHRvbSdcbiAgICAgICAgOiBzY3JvbGxQb3NpdGlvbiAhPT0gJ3RvcCcpIHx8ICF0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdDtcbiAgICBpZiAodGhpcy5pc1VzZXJTY3JvbGxlZCAhPT0gaXNVc2VyU2Nyb2xsZWQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNVc2VyU2Nyb2xsZWQgPSBpc1VzZXJTY3JvbGxlZDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGVkKSB7XG4gICAgICAgICAgdGhpcy51bnJlYWRNZXNzYWdlQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkTG9hZE1vcmVNZXNzYWdlcyhzY3JvbGxQb3NpdGlvbikpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIGxldCBkaXJlY3Rpb246ICduZXdlcicgfCAnb2xkZXInO1xuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJykge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHNjcm9sbFBvc2l0aW9uID09PSAndG9wJyA/ICduZXdlcicgOiAnb2xkZXInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHNjcm9sbFBvc2l0aW9uID09PSAndG9wJyA/ICdvbGRlcicgOiAnbmV3ZXInO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgICAgdGhpcy5tb2RlID09PSAnbWFpbidcbiAgICAgICAgICAgID8gdGhpcy5jaGFubmVsU2VydmljZS5sb2FkTW9yZU1lc3NhZ2VzKGRpcmVjdGlvbilcbiAgICAgICAgICAgIDogdGhpcy5jaGFubmVsU2VydmljZS5sb2FkTW9yZVRocmVhZFJlcGxpZXMoZGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgRGlzcGxheWluZyBsb2FkaW5nIGluZGljYXRvcmAsXG4gICAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JDb250ZXh0KCk6IFR5cGluZ0luZGljYXRvckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB1c2Vyc1R5cGluZyQ6IHRoaXMudXNlcnNUeXBpbmckLFxuICAgIH07XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzOiBVc2VyUmVzcG9uc2VbXSkge1xuICAgIGNvbnN0IHRleHQgPSBsaXN0VXNlcnModXNlcnMpO1xuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2U/OiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlLnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcj8uaWQ7XG4gIH1cblxuICBwYXJzZURhdGUoZGF0ZTogRGF0ZSkge1xuICAgIGlmICh0aGlzLnBhcnNlZERhdGVzLmhhcyhkYXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VkRGF0ZXMuZ2V0KGRhdGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZShkYXRlKTtcbiAgICB0aGlzLnBhcnNlZERhdGVzLnNldChkYXRlLCBwYXJzZWREYXRlKTtcbiAgICByZXR1cm4gcGFyc2VkRGF0ZTtcbiAgfVxuXG4gIGdldCByZXBseUNvdW50UGFyYW0oKSB7XG4gICAgcmV0dXJuIHsgcmVwbHlDb3VudDogdGhpcy5wYXJlbnRNZXNzYWdlPy5yZXBseV9jb3VudCB9O1xuICB9XG5cbiAgZ2V0IGVtcHR5TGlzdFRlbXBsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgPyB0aGlzLmVtcHR5TWFpbk1lc3NhZ2VMaXN0VGVtcGxhdGVcbiAgICAgIDogdGhpcy5lbXB0eVRocmVhZE1lc3NhZ2VMaXN0VGVtcGxhdGU7XG4gIH1cblxuICBwcml2YXRlIHByZXNlcnZlU2Nyb2xsYmFyUG9zaXRpb24oKSB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPVxuICAgICAgKHRoaXMucHJldlNjcm9sbFRvcCB8fCAwKSArXG4gICAgICAodGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgLSB0aGlzLmNvbnRhaW5lckhlaWdodCEpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JjZVJlcGFpbnQoKSB7XG4gICAgLy8gU29sdmVzIHRoZSBpc3N1ZSBvZiBlbXB0eSBzY3JlZW4gb24gU2FmYXJpIHdoZW4gc2Nyb2xsaW5nXG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0OyAvLyBubyBuZWVkIHRvIHN0b3JlIHRoaXMgYW55d2hlcmUsIHRoZSByZWZlcmVuY2UgaXMgZW5vdWdoXG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGdldFNjcm9sbFBvc2l0aW9uKCk6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJyB7XG4gICAgbGV0IHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScgPSAnbWlkZGxlJztcbiAgICBpZiAoXG4gICAgICBNYXRoLmZsb29yKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSA8PVxuICAgICAgICAodGhpcy5wYXJlbnRNZXNzYWdlRWxlbWVudD8ubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgfHwgMCkgJiZcbiAgICAgICh0aGlzLnByZXZTY3JvbGxUb3AgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0aGlzLnByZXZTY3JvbGxUb3AgPlxuICAgICAgICAgICh0aGlzLnBhcmVudE1lc3NhZ2VFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCB8fCAwKSlcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ3RvcCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE1hdGguY2VpbCh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCkgK1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+PVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHRcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRMb2FkTW9yZU1lc3NhZ2VzKHNjcm9sbFBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScpIHtcbiAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb24gIT09ICdtaWRkbGUnICYmICF0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdlcyQoKSB7XG4gICAgdGhpcy5tZXNzYWdlcyQgPSAoXG4gICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICA/IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJFxuICAgICAgICA6IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlVGhyZWFkTWVzc2FnZXMkXG4gICAgKS5waXBlKFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgIGBFbXB0eSBtZXNzYWdlcyBhcnJheSwgcmVzZXRpbmcgc2Nyb2xsIHN0YXRlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpIHtcbiAgICAgICAgICAvLyBjZFJlZi5kZXRlY3RDaGFuZ2VzKCkgaXNuJ3QgZW5vdWdoIGhlcmUsIHRlc3Qgd2lsbCBmYWlsXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5pc0VtcHR5ID0gZmFsc2UpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICBgUmVjZWl2ZWQgb25lIG9yIG1vcmUgbWVzc2FnZXNgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMYXRlc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMubmV3TWVzc2FnZVJlY2VpdmVkKGN1cnJlbnRMYXRlc3RNZXNzYWdlKTtcbiAgICAgICAgY29uc3QgY3VycmVudE9sZGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1swXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLm9sZGVzdE1lc3NhZ2UgfHxcbiAgICAgICAgICAhbWVzc2FnZXMuZmluZCgobSkgPT4gbS5pZCA9PT0gdGhpcy5vbGRlc3RNZXNzYWdlIS5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5vbGRlc3RNZXNzYWdlID0gY3VycmVudE9sZGVzdE1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5vbGRlc3RNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0VGltZSgpID5cbiAgICAgICAgICBjdXJyZW50T2xkZXN0TWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UgPSBjdXJyZW50T2xkZXN0TWVzc2FnZTtcbiAgICAgICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRhcChcbiAgICAgICAgKG1lc3NhZ2VzKSA9PlxuICAgICAgICAgICh0aGlzLmxhc3RTZW50TWVzc2FnZUlkID0gWy4uLm1lc3NhZ2VzXVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICAgIChtKSA9PlxuICAgICAgICAgICAgICAgIG0udXNlcj8uaWQgPT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8udXNlcj8uaWQgJiZcbiAgICAgICAgICAgICAgICBtLnN0YXR1cyAhPT0gJ3NlbmRpbmcnXG4gICAgICAgICAgICApPy5pZClcbiAgICAgICksXG4gICAgICB0YXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID1cbiAgICAgICAgICAhdGhpcy5sYXRlc3RNZXNzYWdlIHx8XG4gICAgICAgICAgbWVzc2FnZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0uaWQgPT09IHRoaXMubGF0ZXN0TWVzc2FnZS5pZDtcbiAgICAgICAgaWYgKCF0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCkge1xuICAgICAgICAgIHRoaXMuaXNVc2VyU2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgJiZcbiAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID09PSB0aGlzLmxhdGVzdE1lc3NhZ2U/LmlkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKChtZXNzYWdlcykgPT5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyA/IG1lc3NhZ2VzIDogWy4uLm1lc3NhZ2VzXS5yZXZlcnNlKClcbiAgICAgICksXG4gICAgICB0YXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBTdHlsZXMgPSBtZXNzYWdlcy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgZ2V0R3JvdXBTdHlsZXMobSwgbWVzc2FnZXNbaSAtIDFdLCBtZXNzYWdlc1tpICsgMV0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNOZXh0TWVzc2FnZU9uU2VwYXJhdGVEYXRlID0gbWVzc2FnZXMubWFwKChtLCBpKSA9PlxuICAgICAgICAgIHRoaXMuY2hlY2tJZk9uU2VwYXJhdGVEYXRlcyhtLCBtZXNzYWdlc1tpICsgMV0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2Nyb2xsU3RhdGUoKSB7XG4gICAgdGhpcy5pc0VtcHR5ID0gdHJ1ZTtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IHRydWU7XG4gICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldCB1c2Vyc1R5cGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgID8gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJFxuICAgICAgOiB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJDtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZDogc3RyaW5nLCB3aXRoUmV0cnkgPSB0cnVlKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2VJZCk7XG4gICAgaWYgKCFlbGVtZW50ICYmIHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkLCBmYWxzZSkpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgIGJsb2NrOiBtZXNzYWdlSWQgPT09IHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgPyAnc3RhcnQnIDogJ2NlbnRlcicsXG4gICAgICB9KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb0xhdGVzdE1lc3NhZ2Uod2l0aFJldHJ5ID0gdHJ1ZSkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmxhdGVzdE1lc3NhZ2UhLmlkKSkge1xuICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1xuICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICA6IHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgICB9IGVsc2UgaWYgKHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoZmFsc2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5ld01lc3NhZ2VSZWNlaXZlZChtZXNzYWdlOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVzZXI/OiB7IGlkOiBzdHJpbmcgfSB8IG51bGw7XG4gIH0pIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5sYXRlc3RNZXNzYWdlIHx8XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UuY3JlYXRlZF9hdD8uZ2V0VGltZSgpIDwgbWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKVxuICAgICkge1xuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgJ2luZm8nLFxuICAgICAgICBgUmVjZWl2ZWQgbmV3IG1lc3NhZ2VgLFxuICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICApO1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSB0cnVlO1xuICAgICAgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyID1cbiAgICAgICAgbWVzc2FnZS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZDtcbiAgICAgIGlmICh0aGlzLmlzVXNlclNjcm9sbGVkKSB7XG4gICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50Kys7XG4gICAgICB9XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZPblNlcGFyYXRlRGF0ZXMoXG4gICAgbWVzc2FnZT86IFN0cmVhbU1lc3NhZ2UsXG4gICAgbmV4dE1lc3NhZ2U/OiBTdHJlYW1NZXNzYWdlXG4gICkge1xuICAgIGlmICghbWVzc2FnZSB8fCAhbmV4dE1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXREYXRlKCkgIT09IG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgbWVzc2FnZS5jcmVhdGVkX2F0LmdldEZ1bGxZZWFyKCkgIT09XG4gICAgICAgIG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgbWVzc2FnZS5jcmVhdGVkX2F0LmdldE1vbnRoKCkgIT09IG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0TW9udGgoKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiPGRpdlxuICAjc2Nyb2xsQ29udGFpbmVyXG4gIGRhdGEtdGVzdGlkPVwic2Nyb2xsLWNvbnRhaW5lclwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX2xpc3RcIlxuICBzdHlsZT1cIm92ZXJzY3JvbGwtYmVoYXZpb3I6IG5vbmVcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ21haW4nICYmIGlzRW1wdHkgJiYgZW1wdHlMaXN0VGVtcGxhdGVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlMaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fcmV2ZXJzZS1pbmZpbml0ZS1zY3JvbGwgc3RyLWNoYXRfX21lc3NhZ2UtbGlzdC1zY3JvbGxcIj5cbiAgICA8dWxcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3VsXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1vcHRpb25zLWluLWJ1YmJsZV09XCJcbiAgICAgICAgbWVzc2FnZU9wdGlvbnNUcmlnZ2VyID09PSAnbWVzc2FnZS1idWJibGUnXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxsaVxuICAgICAgICAjcGFyZW50TWVzc2FnZUVsZW1lbnRcbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAndGhyZWFkJyAmJiBwYXJlbnRNZXNzYWdlXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJwYXJlbnQtbWVzc2FnZVwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3BhcmVudC1tZXNzYWdlLWxpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBtZXNzYWdlVGVtcGxhdGVDb250YWluZXI7XG4gICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IHBhcmVudE1lc3NhZ2UsIGluZGV4OiAncGFyZW50JyB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwicmVwbHktY291bnRcIiBjbGFzcz1cInN0ci1jaGF0X190aHJlYWQtc3RhcnRcIj5cbiAgICAgICAgICB7e3BhcmVudE1lc3NhZ2U/LnJlcGx5X2NvdW50ID09PSAxID8gKCdzdHJlYW1DaGF0LjEgcmVwbHknIHwgdHJhbnNsYXRlKSA6ICgnc3RyZWFtQ2hhdC57eyByZXBseUNvdW50IH19XG4gICAgICAgICAgcmVwbGllcycgfCB0cmFuc2xhdGU6cmVwbHlDb3VudFBhcmFtKX19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9saT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAndGhyZWFkJyAmJiBpc0VtcHR5ICYmIGVtcHR5TGlzdFRlbXBsYXRlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eUxpc3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yXG4gICAgICAgIGRhdGEtdGVzdGlkPVwidG9wLWxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpc0xvYWRpbmcgJiYgZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgJiYgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3JcbiAgICAgICAgXCJcbiAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlcyQgfCBhc3luYyBhcyBtZXNzYWdlc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSBvZiBtZXNzYWdlcztcbiAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgICAgICBsZXQgaXNGaXJzdCA9IGZpcnN0O1xuICAgICAgICAgICAgbGV0IGlzTGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5TWVzc2FnZUlkXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0ZpcnN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZGF0ZVNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICBkYXRlOiBtZXNzYWdlLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZURhdGUobWVzc2FnZS5jcmVhdGVkX2F0KSxcbiAgICAgICAgICAgICAgICAgIGlzTmV3TWVzc2FnZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGxpXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJtZXNzYWdlXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2xpIHN0ci1jaGF0X19saS0te3sgZ3JvdXBTdHlsZXNbaV0gfX1cIlxuICAgICAgICAgICAgaWQ9XCJ7eyBtZXNzYWdlLmlkIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgbWVzc2FnZTogbWVzc2FnZSwgaW5kZXg6IGkgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgKGxhc3RSZWFkTWVzc2FnZUlkID09PSBtZXNzYWdlLmlkICYmXG4gICAgICAgICAgICAgICAgIWlzTGFzdCAmJlxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnICYmXG4gICAgICAgICAgICAgICAgIWlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZXNbaSArIDFdKSAmJlxuICAgICAgICAgICAgICAgICghZGlzcGxheURhdGVTZXBhcmF0b3IgfHwgIWlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZVtpXSkpIHx8XG4gICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJlxuICAgICAgICAgICAgICAgICFpc0xhc3QgJiZcbiAgICAgICAgICAgICAgICAhaXNTZW50QnlDdXJyZW50VXNlcihtZXNzYWdlKSAmJlxuICAgICAgICAgICAgICAgIGxhc3RSZWFkTWVzc2FnZUlkID09PSBtZXNzYWdlc1tpICsgMV0uaWQpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlIHx8XG4gICAgICAgICAgICAgICAgZGVmYXVsdE5ld01lc3NhZ2VzSW5kaWNhdG9yXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZVtpXVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZURhdGUobWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQpLFxuICAgICAgICAgICAgICAgICAgaXNOZXdNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkID09PSBsYXN0UmVhZE1lc3NhZ2VJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJiBmYWxzZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYm90dG9tLWxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpc0xvYWRpbmcgJiYgZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiYgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3JcbiAgICAgICAgXCJcbiAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvcj5cbiAgICA8L3VsPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFR5cGluZ0luZGljYXRvciBsZXQtdXNlcnNUeXBpbmckPVwidXNlcnNUeXBpbmckXCI+XG4gICAgICA8IS0tIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvbm8tYW55IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiRhbnkodXNlcnNUeXBpbmckIHwgYXN5bmMpIGFzIHVzZXJzXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInVzZXJzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwidHlwaW5nLWluZGljYXRvclwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvciBzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvci0tdHlwaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90c1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwidHlwaW5nLXVzZXJzXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX3VzZXJzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICB1c2Vycy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IChcInN0cmVhbUNoYXQudXNlciBpcyB0eXBpbmdcIlxuICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdXNlcjogZ2V0VHlwaW5nSW5kaWNhdG9yVGV4dCh1c2VycykgfSlcbiAgICAgICAgICAgICAgICA6IChcInN0cmVhbUNoYXQudXNlcnMgYXJlIHR5cGluZ1wiXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB1c2VyczogZ2V0VHlwaW5nSW5kaWNhdG9yVGV4dCh1c2VycykgfSlcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICB0eXBpbmdJbmRpY2F0b3JUZW1wbGF0ZSB8fCBkZWZhdWx0VHlwaW5nSW5kaWNhdG9yO1xuICAgICAgICBjb250ZXh0OiBnZXRUeXBpbmdJbmRpY2F0b3JDb250ZXh0KClcbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInN0ci1jaGF0X19qdW1wLXRvLWxhdGVzdC1tZXNzYWdlXCI+XG4gIDxidXR0b25cbiAgICBkYXRhLXRlc3RpZD1cInNjcm9sbC10by1sYXRlc3RcIlxuICAgICpuZ0lmPVwiaXNVc2VyU2Nyb2xsZWRcIlxuICAgIGNsYXNzPVwiXG4gICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb24tc2Nyb2xsLXRvLWxhdGVzdFxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3QtcmlnaHRcbiAgICAgIHN0ci1jaGF0X19jaXJjbGUtZmFiXG4gICAgXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwianVtcFRvTGF0ZXN0TWVzc2FnZSgpXCJcbiAgICAoY2xpY2spPVwianVtcFRvTGF0ZXN0TWVzc2FnZSgpXCJcbiAgPlxuICAgIDxzdHJlYW0taWNvblxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fanVtcC10by1sYXRlc3QtaWNvbiBzdHItY2hhdF9fY2lyY2xlLWZhYi1pY29uXCJcbiAgICAgIFtpY29uXT1cImRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnID8gJ2Fycm93LWRvd24nIDogJ2Fycm93LXVwJ1wiXG4gICAgPjwvc3RyZWFtLWljb24+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJ1bnJlYWRNZXNzYWdlQ291bnQgPiAwXCJcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvblxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb24tc2Nyb2xsLXRvLWxhdGVzdC11bnJlYWQtY291bnRcbiAgICAgICAgc3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LXVucmVhZC1jb3VudFxuICAgICAgXCJcbiAgICA+XG4gICAgICB7eyB1bnJlYWRNZXNzYWdlQ291bnQgfX1cbiAgICA8L2Rpdj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNtZXNzYWdlVGVtcGxhdGVDb250YWluZXIgbGV0LW1lc3NhZ2U9XCJtZXNzYWdlXCIgbGV0LWluZGV4PVwiaW5kZXhcIj5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHRNZXNzYWdlVGVtcGxhdGVcbiAgICBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiXG4gICAgbGV0LWlzTGFzdFNlbnRNZXNzYWdlPVwiaXNMYXN0U2VudE1lc3NhZ2VcIlxuICAgIGxldC1lbmFibGVkTWVzc2FnZUFjdGlvbnM9XCJlbmFibGVkTWVzc2FnZUFjdGlvbnNcIlxuICAgIGxldC1tb2RlPVwibW9kZVwiXG4gICAgbGV0LWlzSGlnaGxpZ2h0ZWQ9XCJpc0hpZ2hsaWdodGVkXCJcbiAgICBsZXQtY3VzdG9tQWN0aW9ucz1cImN1c3RvbUFjdGlvbnNcIlxuICA+XG4gICAgPHN0cmVhbS1tZXNzYWdlXG4gICAgICBbbWVzc2FnZV09XCJtZXNzYWdlSW5wdXRcIlxuICAgICAgW2lzTGFzdFNlbnRNZXNzYWdlXT1cImlzTGFzdFNlbnRNZXNzYWdlXCJcbiAgICAgIFtlbmFibGVkTWVzc2FnZUFjdGlvbnNdPVwiZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXCJcbiAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgW2lzSGlnaGxpZ2h0ZWRdPVwiaXNIaWdobGlnaHRlZFwiXG4gICAgICBbY3VzdG9tQWN0aW9uc109XCJjdXN0b21BY3Rpb25zXCJcbiAgICA+PC9zdHJlYW0tbWVzc2FnZT5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBtZXNzYWdlVGVtcGxhdGUgfHwgZGVmYXVsdE1lc3NhZ2VUZW1wbGF0ZTtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgaXNMYXN0U2VudE1lc3NhZ2U6ICEhKFxuICAgICAgICAgIGxhc3RTZW50TWVzc2FnZUlkICYmIG1lc3NhZ2U/LmlkID09PSBsYXN0U2VudE1lc3NhZ2VJZFxuICAgICAgICApLFxuICAgICAgICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IGVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgICAgbW9kZTogbW9kZSxcbiAgICAgICAgaXNIaWdobGlnaHRlZDpcbiAgICAgICAgICBtZXNzYWdlPy5pZCA9PT0gaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgJiZcbiAgICAgICAgICAhaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlLFxuICAgICAgICBjdXN0b21BY3Rpb25zOiBjdXN0b21NZXNzYWdlQWN0aW9uc1xuICAgICAgfVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGF0ZVNlcGFyYXRvclxuICBsZXQtZGF0ZT1cImRhdGVcIlxuICBsZXQtcGFyc2VkRGF0ZT1cInBhcnNlZERhdGVcIlxuICBsZXQtaXNOZXdNZXNzYWdlPVwiaXNOZXdNZXNzYWdlXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlEYXRlU2VwYXJhdG9yXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgY3VzdG9tRGF0ZVNlcGFyYXRvclRlbXBsYXRlIHx8IGRlZmF1bHREYXRlU2VwYXJhdG9yO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZWREYXRlLFxuICAgICAgICAgIGlzTmV3TWVzc2FnZTogaXNOZXdNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGVcbiAgICAjZGVmYXVsdERhdGVTZXBhcmF0b3JcbiAgICBsZXQtZGF0ZT1cImRhdGVcIlxuICAgIGxldC1wYXJzZWREYXRlPVwicGFyc2VkRGF0ZVwiXG4gICAgbGV0LWlzTmV3TWVzc2FnZT1cImlzTmV3TWVzc2FnZVwiXG4gID5cbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiZGF0ZS1zZXBhcmF0b3JcIiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvclwiPlxuICAgICAgPGhyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdyaWdodCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgICAgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItZGF0ZVwiPlxuICAgICAgICB7eyBwYXJzZWREYXRlIH19XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nSWY9XCJpc05ld01lc3NhZ2VcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibmV3LW1lc3NhZ2VzLWluZGljYXRvci1kYXRlLXNlcGFyYXRvclwiXG4gICAgICAgICAgPuKAoiB7eyBcInN0cmVhbUNoYXQuTmV3XCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG4gICAgICA8aHJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2xlZnQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1saW5lXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvcj5cbiAgPGRpdiBkYXRhLXRlc3RpZD1cIm5ldy1tZXNzYWdlcy1pbmRpY2F0b3JcIiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvclwiPlxuICAgIDxoclxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdyaWdodCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgLz5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWRhdGVcIiB0cmFuc2xhdGU+c3RyZWFtQ2hhdC5OZXc8L2Rpdj5cbiAgICA8aHJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnbGVmdCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
697
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFdBQVcsRUFDWCxLQUFLLEVBT0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBWWxELE9BQU8sRUFBRSxjQUFjLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBSTFDOztHQUVHO0FBT0gsTUFBTSxPQUFPLG9CQUFvQjtJQStHL0IsWUFDVSxjQUE4QixFQUM5QixpQkFBb0MsRUFDcEMsc0JBQThDLEVBQzlDLFVBQTZCLEVBQzdCLE1BQWMsRUFDZCxLQUF3QixFQUN4QixxQkFBNEM7UUFONUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQW5IdEQ7O1dBRUc7UUFDTSxTQUFJLEdBQXNCLE1BQU0sQ0FBQztRQUMx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aXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4uL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBNZXNzYWdlQ29udGV4dCxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgU3RyZWFtTWVzc2FnZSxcbiAgVHlwaW5nSW5kaWNhdG9yQ29udGV4dCxcbiAgQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW0sXG4gIERhdGVTZXBhcmF0b3JDb250ZXh0LFxuICBVbnJlYWRNZXNzYWdlc05vdGlmaWNhdGlvbkNvbnRleHQsXG4gIFVucmVhZE1lc3NhZ2VzSW5kaWNhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEdyb3VwU3R5bGVzLCBHcm91cFN0eWxlIH0gZnJvbSAnLi9ncm91cC1zdHlsZXMnO1xuaW1wb3J0IHsgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBsaXN0VXNlcnMgfSBmcm9tICcuLi9saXN0LXVzZXJzJztcbmltcG9ydCB7IERhdGVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0ZS1wYXJzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdlQWN0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlLWFjdGlvbnMuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIGBNZXNzYWdlTGlzdGAgY29tcG9uZW50IHJlbmRlcnMgYSBzY3JvbGxhYmxlIGxpc3Qgb2YgbWVzc2FnZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VMaXN0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgbWVzc2FnZSBsaXN0IHNob3VsZCBkaXNwbGF5IGNoYW5uZWwgbWVzc2FnZXMgb3IgW3RocmVhZCBtZXNzYWdlc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvdGhyZWFkcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlOiAnbWFpbicgfCAndGhyZWFkJyA9ICdtYWluJztcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSBsaXN0LCBgYm90dG9tLXRvLXRvcGAgbWVhbnMgbmV3ZXN0IG1lc3NhZ2UgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbWVzc2FnZSBsaXN0IGFuZCB1c2VycyBzY3JvbGwgdXB3YXJkcyB0byBsb2FkIG9sZGVyIG1lc3NhZ2VzXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3Rpb246ICdib3R0b20tdG8tdG9wJyB8ICd0b3AtdG8tYm90dG9tJyA9ICdib3R0b20tdG8tdG9wJztcbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hhdCB0cmlnZ2VycyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgbWVzc2FnZSBvcHRpb25zOiBieSBkZWZhdWx0IHlvdSBjYW4gaG92ZXIgKGNsaWNrIG9uIG1vYmlsZSkgYW55d2hlcmUgaW4gdGhlIHJvdyBvZiB0aGUgbWVzc2FnZSAoYG1lc3NhZ2Utcm93YCBvcHRpb24pLCBvciB5b3UgY2FuIHNldCBgbWVzc2FnZS1idWJibGVgLCBpbiB0aGF0IGNhc2Ugb25seSBhIGhvdmVyIChjbGljayBvbiBtb2JpbGUpIGluIHRoZSBtZXNzYWdlIGJ1YmJsZSB3aWxsIHRyaWdnZXIgdGhlIG9wdGlvbnMgdG8gYXBwZWFyLlxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZU9wdGlvbnNUcmlnZ2VyOiAnbWVzc2FnZS1yb3cnIHwgJ21lc3NhZ2UtYnViYmxlJyA9XG4gICAgJ21lc3NhZ2Utcm93JztcbiAgLyoqXG4gICAqIFlvdSBjYW4gaGlkZSB0aGUgXCJqdW1wIHRvIGxhdGVzdFwiIGJ1dHRvbiB3aGlsZSBzY3JvbGxpbmcuIEEgcG90ZW50aWFsIHVzZS1jYXNlIGZvciB0aGlzIGlucHV0IHdvdWxkIGJlIHRvIFt3b3JrYXJvdW5kIGEga25vd24gaXNzdWUgb24gaU9TIFNhZmFyXShodHRwczovL2dpdGh1Yi5jb20vR2V0U3RyZWFtL3N0cmVhbS1jaGF0LWFuZ3VsYXIvaXNzdWVzLzQxOClcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVGhpcyBzY3JvbGwgaXNzdWUgaGFzIGJlZW4gcmVzb2x2ZWQsIG5vIG5lZWQgdG8gdXNlIHRoaXMgIHdvcmthcm91bmQgYW55bW9yZS5cbiAgICovXG4gIEBJbnB1dCgpIGhpZGVKdW1wVG9MYXRlc3RCdXR0b25EdXJpbmdTY3JvbGwgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjdXN0b20gbWVzc2FnZSBhY3Rpb25zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbWVzc2FnZSBhY3Rpb24gYm94XG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgdGhlIFtgTWVzc2FnZUFjdGlvbnNTZXJ2aWNlYF0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VBY3Rpb25zU2VydmljZSkgdG8gc2V0IHRoaXMgcHJvcGVydHkuXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21NZXNzYWdlQWN0aW9uczogQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW08YW55PltdID0gW107XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAgZGF0ZSBzZXBhcmF0b3JzIHdpbGwgYmUgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5RGF0ZVNlcGFyYXRvciA9IHRydWU7XG4gIC8qKlxuICAgKiBJZiBkYXRlIHNlcGFyYXRvcnMgYXJlIGRpc3BsYXllZCwgeW91IGNhbiBzZXQgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGRhdGUgdGV4dC5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVTZXBhcmF0b3JUZXh0UG9zOiAnY2VudGVyJyB8ICdyaWdodCcgfCAnbGVmdCcgPSAnY2VudGVyJztcbiAgLyoqXG4gICAqIGBsYXN0LW1lc3NhZ2VgIG9wdGlvbiB3aWxsIG9wZW4gdGhlIG1lc3NhZ2UgbGlzdCBhdCB0aGUgbGFzdCBtZXNzYWdlLCBgbGFzdC1yZWFkLW1lc3NhZ2VgIHdpbGwgb3BlbiB0aGUgbGlzdCBhdCB0aGUgbGFzdCB1bnJlYWQgbWVzc2FnZS4gVGhpcyBvcHRpb24gb25seSB3b3JrcyBpZiBtb2RlIGlzIGBtYWluYC5cbiAgICovXG4gIEBJbnB1dCgpIG9wZW5NZXNzYWdlTGlzdEF0OiAnbGFzdC1tZXNzYWdlJyB8ICdsYXN0LXJlYWQtbWVzc2FnZScgPVxuICAgICdsYXN0LW1lc3NhZ2UnO1xuICAvKipcbiAgICogSWYgdGhlIHVzZXIgaGFzIHVucmVhZCBtZXNzYWdlcyB3aGVuIHRoZXkgb3BlbiB0aGUgY2hhbm5lbCB0aGUgVUkgc2hvd3MgdGhlIHVucmVhZCBpbmRpY2F0b3IgLyBub3RpZmljYXRpb24gd2hpY2ggZmVhdHVyZXMgdGhlIHVucmVhZCBjb3VudCBieSBkZWZhdWx0LiBUaGlzIGNvdW50IHdpbGwgYmUgaW5jcmVhc2VkIGV2ZXJ5IHRpbWUgYSB1c2VyIHJlY2VpdmVzIGEgbmV3IG1lc3NhZ2UuIElmIHlvdSBkb24ndCB3YW50IHRvIHNob3cgdGhlIHVucmVhZCBjb3VudCwgeW91IGNhbiB0dXJuIHRoYXQgb2ZmLlxuICAgKlxuICAgKiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgYG1haW5gIG1vZGUsIGFzIHRocmVhZHMgZG9lc24ndCBoYXZlIHJlYWQgaW5mcm9tYXRpb24uXG4gICAqL1xuICBASW5wdXQoKSBoaWRlVW5yZWFkQ291bnRGb3JOb3RpZmljYXRpb25BbmRJbmRpY2F0b3IgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFlvdSBjYW4gdHVybiBvbiBhbmQgb2ZmIHRoZSBsb2FkaW5nIGluZGljYXRvciB0aGF0IHNpZ25hbHMgdG8gdXNlcnMgdGhhdCBtb3JlIG1lc3NhZ2VzIGFyZSBiZWluZyBsb2FkZWQgdG8gdGhlIG1lc3NhZ2UgbGlzdFxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3IgPSB0cnVlO1xuICB0eXBpbmdJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8VHlwaW5nSW5kaWNhdG9yQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIG1lc3NhZ2VUZW1wbGF0ZTogVGVtcGxhdGVSZWY8TWVzc2FnZUNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21EYXRlU2VwYXJhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPERhdGVTZXBhcmF0b3JDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZTpcbiAgICB8IFRlbXBsYXRlUmVmPFVucmVhZE1lc3NhZ2VzSW5kaWNhdG9yQ29udGV4dD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgY3VzdG9tbmV3TWVzc2FnZXNOb3RpZmljYXRpb25UZW1wbGF0ZTpcbiAgICB8IFRlbXBsYXRlUmVmPFVucmVhZE1lc3NhZ2VzTm90aWZpY2F0aW9uQ29udGV4dD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgZW1wdHlNYWluTWVzc2FnZUxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgZW1wdHlUaHJlYWRNZXNzYWdlTGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBtZXNzYWdlcyQhOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2VbXT47XG4gIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgaXNFbXB0eSA9IHRydWU7XG4gIG5ld01lc3NhZ2VDb3VudFdoaWxlQmVpbmdTY3JvbGxlZCA9IDA7XG4gIGlzVXNlclNjcm9sbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBncm91cFN0eWxlczogR3JvdXBTdHlsZVtdID0gW107XG4gIGlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZTogYm9vbGVhbltdID0gW107XG4gIGxhc3RTZW50TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHBhcmVudE1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBzY3JvbGxFbmRUaW1lb3V0OiBhbnk7XG4gIGxhc3RSZWFkTWVzc2FnZUlkPzogc3RyaW5nO1xuICBpc1VucmVhZE5vdGlmaWNhdGlvblZpc2libGUgPSB0cnVlO1xuICBmaXJzdFVucmVhZE1lc3NhZ2VJZD86IHN0cmluZztcbiAgdW5yZWFkQ291bnQ/OiBudW1iZXI7XG4gIGlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IGZhbHNlO1xuICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInKVxuICBwcml2YXRlIHNjcm9sbENvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdwYXJlbnRNZXNzYWdlRWxlbWVudCcpXG4gIHByaXZhdGUgcGFyZW50TWVzc2FnZUVsZW1lbnQhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSBsYXRlc3RNZXNzYWdlOiB7IGlkOiBzdHJpbmc7IGNyZWF0ZWRfYXQ6IERhdGUgfSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBoYXNOZXdNZXNzYWdlczogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjb250YWluZXJIZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvbGRlc3RNZXNzYWdlOiB7IGlkOiBzdHJpbmc7IGNyZWF0ZWRfYXQ6IERhdGUgfSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvbGRlck1hc3NhZ2VzTG9hZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzTmV3TWVzc2FnZVNlbnRCeVVzZXI6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBuZXdNZXNzYWdlU3Vic2NyaXB0aW9uOiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcHJldlNjcm9sbFRvcDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5DaGFubmVsJCE6IE9ic2VydmFibGU8XG4gICAgVXNlclJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W11cbiAgPjtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luVGhyZWFkJCE6IE9ic2VydmFibGU8XG4gICAgVXNlclJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W11cbiAgPjtcbiAgcHJpdmF0ZSBpc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPSB0cnVlO1xuICBwcml2YXRlIGNoYW5uZWxJZD86IHN0cmluZztcbiAgcHJpdmF0ZSBwYXJzZWREYXRlcyA9IG5ldyBNYXA8RGF0ZSwgc3RyaW5nPigpO1xuICBwcml2YXRlIGlzVmlld0luaXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGNoZWNrSWZVbnJlYWROb3RpZmljYXRpb25Jc1Zpc2libGVUaW1lb3V0PzogYW55O1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBwcml2YXRlIGdldCBjbGFzcygpIHtcbiAgICByZXR1cm4gYHN0ci1jaGF0LWFuZ3VsYXJfX21haW4tcGFuZWwtaW5uZXIgc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1saXN0LWhvc3Qgc3RyLWNoYXRfX21haW4tcGFuZWwtaW5uZXIgJHtcbiAgICAgIHRoaXMuaXNFbXB0eSA/ICdzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWxpc3QtaG9zdC0tZW1wdHknIDogJydcbiAgICB9YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQYXJzZXI6IERhdGVQYXJzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBtZXNzYWdlQWN0aW9uc1NlcnZpY2U6IE1lc3NhZ2VBY3Rpb25zU2VydmljZVxuICApIHtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJCA9IHRoaXMuY2hhbm5lbFNlcnZpY2UudXNlcnNUeXBpbmdJbkNoYW5uZWwkO1xuICAgIHRoaXMudXNlcnNUeXBpbmdJblRocmVhZCQgPSB0aGlzLmNoYW5uZWxTZXJ2aWNlLnVzZXJzVHlwaW5nSW5UaHJlYWQkO1xuICB9XG5cbiAgbWVzc2FnZU5vdGlmaWNhdGlvbkp1bXBDbGlja2VkID0gKCkgPT4ge1xuICAgIHRoaXMuanVtcFRvRmlyc3RVbnJlYWRNZXNzYWdlKCk7XG4gICAgdGhpcy5pc1VucmVhZE5vdGlmaWNhdGlvblZpc2libGUgPSBmYWxzZTtcbiAgfTtcblxuICBtZXNzYWdlTm90aWZpY2F0aW9uRGlzbWlzc0NsaWNrZWQgPSAoKSA9PiB7XG4gICAgdGhpcy5pc1VucmVhZE5vdGlmaWNhdGlvblZpc2libGUgPSBmYWxzZTtcbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbCQuc3Vic2NyaWJlKChjaGFubmVsKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGAke2NoYW5uZWw/LmNpZCB8fCAndW5kZWZpbmVkJ30gc2VsZWN0ZWRgLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGlzTmV3Q2hhbm5lbCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jaGFubmVsSWQgIT09IGNoYW5uZWw/LmlkKSB7XG4gICAgICAgICAgaXNOZXdDaGFubmVsID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0lmVW5yZWFkTm90aWZpY2F0aW9uSXNWaXNpYmxlVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2hlY2tJZlVucmVhZE5vdGlmaWNhdGlvbklzVmlzaWJsZVRpbWVvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzVW5yZWFkTm90aWZpY2F0aW9uVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2U/LmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYG5ldyBjaGFubmVsIGlzIGRpZmZlcmVudCBmcm9tIHByZXYgY2hhbm5lbCwgcmVzZXRpbmcgc2Nyb2xsIHN0YXRlYCxcbiAgICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMucGFyc2VkRGF0ZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgdGhpcy5jaGFubmVsSWQgPSBjaGFubmVsPy5pZDtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnbWFpbicpIHtcbiAgICAgICAgICBjb25zdCBsYXN0UmVhZE1lc3NhZ2VJZCA9XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZDtcbiAgICAgICAgICBjb25zdCB1bnJlYWRDb3VudCA9IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbFVucmVhZENvdW50O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxhc3RSZWFkTWVzc2FnZUlkICE9PSB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkIHx8XG4gICAgICAgICAgICB1bnJlYWRDb3VudCAhPT0gdGhpcy51bnJlYWRDb3VudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9IGxhc3RSZWFkTWVzc2FnZUlkO1xuICAgICAgICAgICAgdGhpcy51bnJlYWRDb3VudCA9IHVucmVhZENvdW50IHx8IDA7XG4gICAgICAgICAgICBpZiAoaXNOZXdDaGFubmVsICYmIHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMub3Blbk1lc3NhZ2VMaXN0QXQgPT09ICdsYXN0LXJlYWQtbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmp1bXBUb0ZpcnN0VW5yZWFkTWVzc2FnZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdhaXQgdGlsbCBtZXNzYWdlcyBhbmQgdGhlIHVucmVhZCBiYW5uZXIgaXMgcmVuZGVyZWRcbiAgICAgICAgICAgICAgICAvLyBJZiB1bnJlYWQgYmFubmVyIGlzbid0IHZpc2libGUgb24gdGhlIHNjcmVlbiwgd2UgZGlzcGxheSB0aGUgdW5yZWFkIG5vdGlmaWNhaW9uXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBiYW5uZXJFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICAgICAgICAgICdzdHJlYW0tY2hhdC1uZXctbWVzc2FnZS1pbmRpY2F0b3InXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhYmFubmVyRWxlbWVudCB8fFxuICAgICAgICAgICAgICAgICAgICBiYW5uZXJFbGVtZW50Py5vZmZzZXRUb3AgPFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5zY3JvbGxIZWlnaHQgLVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVbnJlYWROb3RpZmljYXRpb25WaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpIHtcbiAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMudW5yZWFkQ291bnQgPSAwO1xuICAgICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGVzID0gY2hhbm5lbD8uZGF0YT8ub3duX2NhcGFiaWxpdGllcyBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0ZXNTdHJpbmcgPSBbLi4uKGNhcGFiaWxpdGVzIHx8IFtdKV0uc29ydCgpLmpvaW4oJycpO1xuICAgICAgICBjb25zdCBlbmFibGVkQWN0aW9uc1N0cmluZyA9IFsuLi4odGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMgfHwgW10pXVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIGlmIChjYXBhYmlsaXRlc1N0cmluZyAhPT0gZW5hYmxlZEFjdGlvbnNTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyA9IGNhcGFiaWxpdGVzIHx8IFtdO1xuICAgICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgICAgICB0aGlzLm5ld01lc3NhZ2VTdWJzY3JpcHRpb24gPSBjaGFubmVsLm9uKCdtZXNzYWdlLm5ldycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gSWYgd2UgZGlzcGxheSBtYWluIGNoYW5uZWwgbWVzc2FnZXMgYW5kIHdlJ3JlIHN3aXRjaGVkIHRvIGFuIG9sZGVyIG1lc3NhZ2Ugc2V0IC0+IHVzZSBtZXNzYWdlLm5ldyBldmVudCB0byB1cGRhdGUgdW5yZWFkIGNvdW50IGFuZCBkZXRlY3QgbmV3IG1lc3NhZ2VzIHNlbnQgYnkgY3VycmVudCB1c2VyXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFldmVudC5tZXNzYWdlIHx8XG4gICAgICAgICAgICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMgPT09IGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMgfHxcbiAgICAgICAgICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3TWVzc2FnZVJlY2VpdmVkKHtcbiAgICAgICAgICAgICAgaWQ6IGV2ZW50Lm1lc3NhZ2UuaWQsXG4gICAgICAgICAgICAgIHVzZXI6IGV2ZW50Lm1lc3NhZ2UudXNlcixcbiAgICAgICAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoZXZlbnQubWVzc2FnZS5jcmVhdGVkX2F0IHx8ICcnKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5zdWJzY3JpYmUoKGFjdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGFjdGlvbnMgIT09IHRoaXMuY3VzdG9tTWVzc2FnZUFjdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLmN1c3RvbU1lc3NhZ2VBY3Rpb25zID0gYWN0aW9ucztcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVQYXJlbnRNZXNzYWdlJC5zdWJzY3JpYmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1lc3NhZ2UgJiZcbiAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2UgJiZcbiAgICAgICAgICBtZXNzYWdlLmlkICE9PSB0aGlzLnBhcmVudE1lc3NhZ2UuaWQgJiZcbiAgICAgICAgICB0aGlzLm1vZGUgPT09ICd0aHJlYWQnXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmVzZXRTY3JvbGxTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE1lc3NhZ2UgPT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlVGVtcGxhdGUkLnN1YnNjcmliZSgodGVtcGxhdGUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZVRlbXBsYXRlID09PSB0ZW1wbGF0ZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmRhdGVTZXBhcmF0b3JUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21EYXRlU2VwYXJhdG9yVGVtcGxhdGUgPT09IHRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3VzdG9tRGF0ZVNlcGFyYXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm5ld01lc3NhZ2VzSW5kaWNhdG9yVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSA9PT0gdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm5ld01lc3NhZ2VzTm90aWZpY2F0aW9uVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VzdG9tbmV3TWVzc2FnZXNOb3RpZmljYXRpb25UZW1wbGF0ZSA9PT0gdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jdXN0b21uZXdNZXNzYWdlc05vdGlmaWNhdGlvblRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnR5cGluZ0luZGljYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGluZ0luZGljYXRvclRlbXBsYXRlID09PSB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnR5cGluZ0luZGljYXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlJFxuICAgICAgICAucGlwZShmaWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcuaWQpKVxuICAgICAgICAuc3Vic2NyaWJlKChjb25maWcpID0+IHtcbiAgICAgICAgICBsZXQgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ21haW4nKSB7XG4gICAgICAgICAgICBtZXNzYWdlSWQgPSBjb25maWcucGFyZW50SWQgfHwgY29uZmlnLmlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudElkKSB7XG4gICAgICAgICAgICBtZXNzYWdlSWQgPSBjb25maWcuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgSnVtcGluZyB0byAke21lc3NhZ2VJZCB8fCAnJ31gLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2VJZCA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTWVzc2FnZUludG9WaWV3KFxuICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdFVucmVhZE1lc3NhZ2VJZCB8fCBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdFVucmVhZE1lc3NhZ2VJZCB8fCBtZXNzYWdlSWQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gbWVzc2FnZUlkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuZW1wdHlNYWluTWVzc2FnZUxpc3RQbGFjZWhvbGRlciQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NoYW5nZWQgPSB0aGlzLmVtcHR5TWFpbk1lc3NhZ2VMaXN0VGVtcGxhdGUgIT09IHRlbXBsYXRlO1xuICAgICAgICAgIHRoaXMuZW1wdHlNYWluTWVzc2FnZUxpc3RUZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IG51bGw7XG4gICAgICAgICAgaWYgKGlzQ2hhbmdlZCAmJiB0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5lbXB0eVRocmVhZE1lc3NhZ2VMaXN0UGxhY2Vob2xkZXIkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNDaGFuZ2VkID0gdGhpcy5lbXB0eVRocmVhZE1lc3NhZ2VMaXN0VGVtcGxhdGUgIT09IHRlbXBsYXRlO1xuICAgICAgICAgIHRoaXMuZW1wdHlUaHJlYWRNZXNzYWdlTGlzdFRlbXBsYXRlID0gdGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICBpZiAoaXNDaGFuZ2VkICYmIHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc2V0TWVzc2FnZXMkKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMubW9kZSB8fCBjaGFuZ2VzLmRpcmVjdGlvbikge1xuICAgICAgdGhpcy5zZXRNZXNzYWdlcyQoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuZGlyZWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmN1c3RvbU1lc3NhZ2VBY3Rpb25zKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5uZXh0KHRoaXMuY3VzdG9tTWVzc2FnZUFjdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlld0luaXRlZCA9IHRydWU7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PlxuICAgICAgICB0aGlzLnNjcm9sbGVkKClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQpIHtcbiAgICAgIC8vIFR1cm4gb2ZmIHByb2dyYW1hdGljIHNjcm9sbCBhZGp1c3RtZW50cyB3aGlsZSBqdW1wIHRvIG1lc3NhZ2UgaXMgaW4gcHJvZ3Jlc3NcbiAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmhhc05ld01lc3NhZ2VzICYmXG4gICAgICAgICh0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIgfHwgIXRoaXMuaXNVc2VyU2Nyb2xsZWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Ub3AoKVxuICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaGFzTmV3TWVzc2FnZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGVkIHx8IHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlcikge1xuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgVXNlciBoYXMgbmV3IG1lc3NhZ2VzLCBhbmQgbm90IHNjcm9sbGVkIG9yIHNlbnQgbmV3IG1lc3NhZ2VzLCB0aGVyZWZvcmUgd2UgJHtcbiAgICAgICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPyAnc2Nyb2xsJyA6ICdqdW1wJ1xuICAgICAgICAgICAgfSB0byBsYXRlc3QgbWVzc2FnZWAsXG4gICAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdFxuICAgICAgICAgICAgPyB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQpIHtcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYE9sZGVyIG1lc3NhZ2VzIGFyZSBsb2FkZWQsIHdlIHByZXNlcnZlIHRoZSBzY3JvbGwgcG9zaXRpb25gLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVNjcm9sbGJhclBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpICE9PSAnYm90dG9tJyAmJlxuICAgICAgICAhdGhpcy5pc1VzZXJTY3JvbGxlZCAmJlxuICAgICAgICAhdGhpcy5oaWdobGlnaHRlZE1lc3NhZ2VJZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGBDb250YWluZXIgZ3JldyBhbmQgdXNlciBkaWRuJ3Qgc2Nyb2xsIHRoZXJlZm9yZSB3ZSAke1xuICAgICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPyAnc2Nyb2xsJyA6ICdqdW1wJ1xuICAgICAgICAgIH0gdG8gbGF0ZXN0IG1lc3NhZ2VgLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5uZXdNZXNzYWdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIHRyYWNrQnlNZXNzYWdlSWQoaW5kZXg6IG51bWJlciwgaXRlbTogU3RyZWFtTWVzc2FnZSkge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG5cbiAgdHJhY2tCeVVzZXJJZChpbmRleDogbnVtYmVyLCB1c2VyOiBVc2VyUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gdXNlci5pZDtcbiAgfVxuXG4gIGp1bXBUb0xhdGVzdE1lc3NhZ2UoKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmp1bXBUb01lc3NhZ2UoXG4gICAgICAnbGF0ZXN0JyxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgPyB0aGlzLnBhcmVudE1lc3NhZ2U/LmlkIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ICsgMC4xO1xuICAgIHRoaXMuZm9yY2VSZXBhaW50KCk7XG4gIH1cblxuICBzY3JvbGxUb1RvcCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gIH1cblxuICBzY3JvbGxlZCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCA9PT1cbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAnaW5mbycsXG4gICAgICBgU2Nyb2xsZWQgLSBzY3JvbGwgcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259LCBjb250YWluZXIgaGVpZ2h0OiAke3RoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0fWAsXG4gICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgKTtcblxuICAgIGNvbnN0IGlzVXNlclNjcm9sbGVkID1cbiAgICAgICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnXG4gICAgICAgID8gc2Nyb2xsUG9zaXRpb24gIT09ICdib3R0b20nXG4gICAgICAgIDogc2Nyb2xsUG9zaXRpb24gIT09ICd0b3AnKSB8fCAhdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3Q7XG4gICAgaWYgKHRoaXMuaXNVc2VyU2Nyb2xsZWQgIT09IGlzVXNlclNjcm9sbGVkKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmlzVXNlclNjcm9sbGVkID0gaXNVc2VyU2Nyb2xsZWQ7XG4gICAgICAgIGlmICghdGhpcy5pc1VzZXJTY3JvbGxlZCkge1xuICAgICAgICAgIHRoaXMubmV3TWVzc2FnZUNvdW50V2hpbGVCZWluZ1Njcm9sbGVkID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZExvYWRNb3JlTWVzc2FnZXMoc2Nyb2xsUG9zaXRpb24pKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICBsZXQgZGlyZWN0aW9uOiAnbmV3ZXInIHwgJ29sZGVyJztcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScpIHtcbiAgICAgICAgICBkaXJlY3Rpb24gPSBzY3JvbGxQb3NpdGlvbiA9PT0gJ3RvcCcgPyAnbmV3ZXInIDogJ29sZGVyJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXJlY3Rpb24gPSBzY3JvbGxQb3NpdGlvbiA9PT0gJ3RvcCcgPyAnb2xkZXInIDogJ25ld2VyJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgICAgICA/IHRoaXMuY2hhbm5lbFNlcnZpY2UubG9hZE1vcmVNZXNzYWdlcyhkaXJlY3Rpb24pXG4gICAgICAgICAgICA6IHRoaXMuY2hhbm5lbFNlcnZpY2UubG9hZE1vcmVUaHJlYWRSZXBsaWVzKGRpcmVjdGlvbik7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYERpc3BsYXlpbmcgbG9hZGluZyBpbmRpY2F0b3JgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucHJldlNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICB9XG5cbiAganVtcFRvRmlyc3RVbnJlYWRNZXNzYWdlKCkge1xuICAgIGlmICghdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IHRydWU7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmp1bXBUb01lc3NhZ2UodGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCk7XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JDb250ZXh0KCk6IFR5cGluZ0luZGljYXRvckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB1c2Vyc1R5cGluZyQ6IHRoaXMudXNlcnNUeXBpbmckLFxuICAgIH07XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzOiBVc2VyUmVzcG9uc2VbXSkge1xuICAgIGNvbnN0IHRleHQgPSBsaXN0VXNlcnModXNlcnMpO1xuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2U/OiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlLnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcj8uaWQ7XG4gIH1cblxuICBwYXJzZURhdGUoZGF0ZTogRGF0ZSkge1xuICAgIGlmICh0aGlzLnBhcnNlZERhdGVzLmhhcyhkYXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VkRGF0ZXMuZ2V0KGRhdGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZShkYXRlKTtcbiAgICB0aGlzLnBhcnNlZERhdGVzLnNldChkYXRlLCBwYXJzZWREYXRlKTtcbiAgICByZXR1cm4gcGFyc2VkRGF0ZTtcbiAgfVxuXG4gIGdldCByZXBseUNvdW50UGFyYW0oKSB7XG4gICAgcmV0dXJuIHsgcmVwbHlDb3VudDogdGhpcy5wYXJlbnRNZXNzYWdlPy5yZXBseV9jb3VudCB9O1xuICB9XG5cbiAgZ2V0IGVtcHR5TGlzdFRlbXBsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgPyB0aGlzLmVtcHR5TWFpbk1lc3NhZ2VMaXN0VGVtcGxhdGVcbiAgICAgIDogdGhpcy5lbXB0eVRocmVhZE1lc3NhZ2VMaXN0VGVtcGxhdGU7XG4gIH1cblxuICBwcml2YXRlIHByZXNlcnZlU2Nyb2xsYmFyUG9zaXRpb24oKSB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPVxuICAgICAgKHRoaXMucHJldlNjcm9sbFRvcCB8fCAwKSArXG4gICAgICAodGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgLSB0aGlzLmNvbnRhaW5lckhlaWdodCEpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JjZVJlcGFpbnQoKSB7XG4gICAgLy8gU29sdmVzIHRoZSBpc3N1ZSBvZiBlbXB0eSBzY3JlZW4gb24gU2FmYXJpIHdoZW4gc2Nyb2xsaW5nXG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0OyAvLyBubyBuZWVkIHRvIHN0b3JlIHRoaXMgYW55d2hlcmUsIHRoZSByZWZlcmVuY2UgaXMgZW5vdWdoXG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGdldFNjcm9sbFBvc2l0aW9uKCk6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJyB7XG4gICAgbGV0IHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScgPSAnbWlkZGxlJztcbiAgICBpZiAoXG4gICAgICBNYXRoLmZsb29yKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSA8PVxuICAgICAgICAodGhpcy5wYXJlbnRNZXNzYWdlRWxlbWVudD8ubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgfHwgMCkgJiZcbiAgICAgICh0aGlzLnByZXZTY3JvbGxUb3AgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0aGlzLnByZXZTY3JvbGxUb3AgPlxuICAgICAgICAgICh0aGlzLnBhcmVudE1lc3NhZ2VFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCB8fCAwKSlcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ3RvcCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE1hdGguY2VpbCh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCkgK1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+PVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHRcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRMb2FkTW9yZU1lc3NhZ2VzKHNjcm9sbFBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScpIHtcbiAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb24gIT09ICdtaWRkbGUnICYmICF0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdlcyQoKSB7XG4gICAgdGhpcy5tZXNzYWdlcyQgPSAoXG4gICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICA/IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJFxuICAgICAgICA6IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlVGhyZWFkTWVzc2FnZXMkXG4gICAgKS5waXBlKFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgIGBFbXB0eSBtZXNzYWdlcyBhcnJheSwgcmVzZXRpbmcgc2Nyb2xsIHN0YXRlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpIHtcbiAgICAgICAgICAvLyBjZFJlZi5kZXRlY3RDaGFuZ2VzKCkgaXNuJ3QgZW5vdWdoIGhlcmUsIHRlc3Qgd2lsbCBmYWlsXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5pc0VtcHR5ID0gZmFsc2UpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICBgUmVjZWl2ZWQgb25lIG9yIG1vcmUgbWVzc2FnZXNgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMYXRlc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMubmV3TWVzc2FnZVJlY2VpdmVkKGN1cnJlbnRMYXRlc3RNZXNzYWdlKTtcbiAgICAgICAgY29uc3QgY3VycmVudE9sZGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1swXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLm9sZGVzdE1lc3NhZ2UgfHxcbiAgICAgICAgICAhbWVzc2FnZXMuZmluZCgobSkgPT4gbS5pZCA9PT0gdGhpcy5vbGRlc3RNZXNzYWdlIS5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5vbGRlc3RNZXNzYWdlID0gY3VycmVudE9sZGVzdE1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5vbGRlc3RNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0VGltZSgpID5cbiAgICAgICAgICBjdXJyZW50T2xkZXN0TWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UgPSBjdXJyZW50T2xkZXN0TWVzc2FnZTtcbiAgICAgICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRhcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlICYmXG4gICAgICAgICAgIXRoaXMuZmlyc3RVbnJlYWRNZXNzYWdlSWQgJiZcbiAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGxhc3RSZWFkSW5kZXggPSBtZXNzYWdlcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAobSkgPT4gbS5pZCA9PT0gdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5maXJzdFVucmVhZE1lc3NhZ2VJZCA9XG4gICAgICAgICAgICBtZXNzYWdlc1tsYXN0UmVhZEluZGV4ICsgMV0/LmlkIHx8IHRoaXMubGFzdFJlYWRNZXNzYWdlSWQ7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKFxuICAgICAgICAobWVzc2FnZXMpID0+XG4gICAgICAgICAgKHRoaXMubGFzdFNlbnRNZXNzYWdlSWQgPSBbLi4ubWVzc2FnZXNdXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgKG0pID0+XG4gICAgICAgICAgICAgICAgbS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZCAmJlxuICAgICAgICAgICAgICAgIG0uc3RhdHVzICE9PSAnc2VuZGluZydcbiAgICAgICAgICAgICk/LmlkKVxuICAgICAgKSxcbiAgICAgIHRhcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPVxuICAgICAgICAgICF0aGlzLmxhdGVzdE1lc3NhZ2UgfHxcbiAgICAgICAgICBtZXNzYWdlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXS5pZCA9PT0gdGhpcy5sYXRlc3RNZXNzYWdlLmlkO1xuICAgICAgICBpZiAoIXRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0KSB7XG4gICAgICAgICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKChtZXNzYWdlcykgPT5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyA/IG1lc3NhZ2VzIDogWy4uLm1lc3NhZ2VzXS5yZXZlcnNlKClcbiAgICAgICksXG4gICAgICB0YXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBTdHlsZXMgPSBtZXNzYWdlcy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgZ2V0R3JvdXBTdHlsZXMoXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgbWVzc2FnZXNbaSAtIDFdLFxuICAgICAgICAgICAgbWVzc2FnZXNbaSArIDFdLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZSA9IG1lc3NhZ2VzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICB0aGlzLmNoZWNrSWZPblNlcGFyYXRlRGF0ZXMobSwgbWVzc2FnZXNbaSArIDFdKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNjcm9sbFN0YXRlKCkge1xuICAgIHRoaXMuaXNFbXB0eSA9IHRydWU7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSB0cnVlO1xuICAgIHRoaXMuaXNVc2VyU2Nyb2xsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9sZGVzdE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5uZXdNZXNzYWdlQ291bnRXaGlsZUJlaW5nU2Nyb2xsZWQgPSAwO1xuICAgIHRoaXMucHJldlNjcm9sbFRvcCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdXNlcnNUeXBpbmckKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICd0aHJlYWQnXG4gICAgICA/IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZCRcbiAgICAgIDogdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbCQ7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbE1lc3NhZ2VJbnRvVmlldyhtZXNzYWdlSWQ6IHN0cmluZywgd2l0aFJldHJ5ID0gdHJ1ZSkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlSWQpO1xuICAgIGlmICghZWxlbWVudCAmJiB3aXRoUmV0cnkpIHtcbiAgICAgIC8vIElmIHRoZSBtZXNzYWdlIHdhcyBuZXdseSBpbnNlcnRlZCBpbnRvIGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgcmVuZGVyZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSAtPiB3YWl0IGZvciB0aGlzIGN5Y2xlIHRvIGNvbXBsZXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZCwgZmFsc2UpKTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICBibG9jazogJ2NlbnRlcicsXG4gICAgICB9KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZpcnN0VW5yZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9MYXRlc3RNZXNzYWdlKHdpdGhSZXRyeSA9IHRydWUpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5sYXRlc3RNZXNzYWdlIS5pZCkpIHtcbiAgICAgIHRoaXMuZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCdcbiAgICAgICAgPyB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgOiB0aGlzLnNjcm9sbFRvVG9wKCk7XG4gICAgfSBlbHNlIGlmICh3aXRoUmV0cnkpIHtcbiAgICAgIC8vIElmIHRoZSBtZXNzYWdlIHdhcyBuZXdseSBpbnNlcnRlZCBpbnRvIGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgcmVuZGVyZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSAtPiB3YWl0IGZvciB0aGlzIGN5Y2xlIHRvIGNvbXBsZXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9MYXRlc3RNZXNzYWdlKGZhbHNlKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBuZXdNZXNzYWdlUmVjZWl2ZWQobWVzc2FnZToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY3JlYXRlZF9hdDogRGF0ZTtcbiAgICB1c2VyPzogeyBpZDogc3RyaW5nIH0gfCBudWxsO1xuICB9KSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMubGF0ZXN0TWVzc2FnZSB8fFxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlLmNyZWF0ZWRfYXQ/LmdldFRpbWUoKSA8IG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRUaW1lKClcbiAgICApIHtcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICdpbmZvJyxcbiAgICAgICAgYFJlY2VpdmVkIG5ldyBtZXNzYWdlYCxcbiAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzTmV3Q2hhbm5lbCA9ICF0aGlzLmxhdGVzdE1lc3NhZ2U7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IHRydWU7XG4gICAgICB0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIgPVxuICAgICAgICBtZXNzYWdlLnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LnVzZXI/LmlkO1xuICAgICAgaWYgKHRoaXMuaXNVc2VyU2Nyb2xsZWQpIHtcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlQ291bnRXaGlsZUJlaW5nU2Nyb2xsZWQrKztcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlciAmJlxuICAgICAgICB0aGlzLnVucmVhZENvdW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIWlzTmV3Q2hhbm5lbFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudW5yZWFkQ291bnQrKztcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZk9uU2VwYXJhdGVEYXRlcyhcbiAgICBtZXNzYWdlPzogU3RyZWFtTWVzc2FnZSxcbiAgICBuZXh0TWVzc2FnZT86IFN0cmVhbU1lc3NhZ2VcbiAgKSB7XG4gICAgaWYgKCFtZXNzYWdlIHx8ICFuZXh0TWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jcmVhdGVkX2F0LmdldERhdGUoKSAhPT0gbmV4dE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXREYXRlKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBtZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RnVsbFllYXIoKSAhPT1cbiAgICAgICAgbmV4dE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRGdWxsWWVhcigpIHx8XG4gICAgICBtZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0TW9udGgoKSAhPT0gbmV4dE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRNb250aCgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyXG4gICpuZ0lmPVwiXG4gICAgbGFzdFJlYWRNZXNzYWdlSWQgJiZcbiAgICBpc1VucmVhZE5vdGlmaWNhdGlvblZpc2libGUgJiZcbiAgICBvcGVuTWVzc2FnZUxpc3RBdCA9PT0gJ2xhc3QtbWVzc2FnZSdcbiAgXCJcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBjdXN0b21uZXdNZXNzYWdlc05vdGlmaWNhdGlvblRlbXBsYXRlIHx8XG4gICAgICAgIGRlZmF1bHRVbnJlYWRNZXNzYWdlc05vdGlmaWNhdGlvbjtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdW5yZWFkQ291bnQ6IHVucmVhZENvdW50LFxuICAgICAgICBvbkRpc21pc3M6IG1lc3NhZ2VOb3RpZmljYXRpb25EaXNtaXNzQ2xpY2tlZCxcbiAgICAgICAgb25KdW1wOiBtZXNzYWdlTm90aWZpY2F0aW9uSnVtcENsaWNrZWRcbiAgICAgIH1cbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZVxuICAjZGVmYXVsdFVucmVhZE1lc3NhZ2VzTm90aWZpY2F0aW9uXG4gIGxldC11bnJlYWRDb3VudD1cInVucmVhZENvdW50XCJcbiAgbGV0LW9uRGlzbWlzcz1cIm9uRGlzbWlzc1wiXG4gIGxldC1vbkp1bXA9XCJvbkp1bXBcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJzdHItY2hhdF9fdW5yZWFkLW1lc3NhZ2VzLW5vdGlmaWNhdGlvblwiXG4gICAgZGF0YS10ZXN0aWQ9XCJ1bnJlYWQtbWVzc2FnZXMtbm90aWZpY2F0aW9uXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgIGRhdGEtdGVzdGlkPVwidW5yZWFkLW1lc3NhZ2VzLW5vdGlmaWNhdGlvbi1qdW1wLXRvLW1lc3NhZ2VcIlxuICAgICAgKGNsaWNrKT1cIm9uSnVtcCgpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgdW5yZWFkQ291bnQgPiAwICYmICFoaWRlVW5yZWFkQ291bnRGb3JOb3RpZmljYXRpb25BbmRJbmRpY2F0b3I7XG4gICAgICAgICAgZWxzZSBub1VucmVhZENvdW50XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHt7XG4gICAgICAgICAgKHVucmVhZENvdW50ID09PSAxXG4gICAgICAgICAgICA/IFwic3RyZWFtQ2hhdC5cXHtcXHtjb3VudFxcfVxcfSB1bnJlYWQgbWVzc2FnZVwiXG4gICAgICAgICAgICA6IFwic3RyZWFtQ2hhdC5cXHtcXHtjb3VudFxcfVxcfSB1bnJlYWQgbWVzc2FnZXNcIlxuICAgICAgICAgICkgfCB0cmFuc2xhdGU6IHsgY291bnQ6IHVucmVhZENvdW50IH1cbiAgICAgICAgfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNub1VucmVhZENvdW50PlxuICAgICAgICB7eyBcInN0cmVhbUNoYXQuVW5yZWFkIG1lc3NhZ2VzXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgZGF0YS10ZXN0aWQ9XCJ1bnJlYWQtbWVzc2FnZXMtbm90aWZpY2F0aW9uLWRpc21pc3NcIlxuICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICA+XG4gICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImNsb3NlXCI+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPGRpdlxuICAjc2Nyb2xsQ29udGFpbmVyXG4gIGRhdGEtdGVzdGlkPVwic2Nyb2xsLWNvbnRhaW5lclwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX2xpc3RcIlxuICBzdHlsZT1cIm92ZXJzY3JvbGwtYmVoYXZpb3I6IG5vbmVcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ21haW4nICYmIGlzRW1wdHkgJiYgZW1wdHlMaXN0VGVtcGxhdGVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlMaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fcmV2ZXJzZS1pbmZpbml0ZS1zY3JvbGwgc3RyLWNoYXRfX21lc3NhZ2UtbGlzdC1zY3JvbGxcIj5cbiAgICA8dWxcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3VsXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1vcHRpb25zLWluLWJ1YmJsZV09XCJcbiAgICAgICAgbWVzc2FnZU9wdGlvbnNUcmlnZ2VyID09PSAnbWVzc2FnZS1idWJibGUnXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxsaVxuICAgICAgICAjcGFyZW50TWVzc2FnZUVsZW1lbnRcbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAndGhyZWFkJyAmJiBwYXJlbnRNZXNzYWdlXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJwYXJlbnQtbWVzc2FnZVwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3BhcmVudC1tZXNzYWdlLWxpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBtZXNzYWdlVGVtcGxhdGVDb250YWluZXI7XG4gICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IHBhcmVudE1lc3NhZ2UsIGluZGV4OiAncGFyZW50JyB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwicmVwbHktY291bnRcIiBjbGFzcz1cInN0ci1jaGF0X190aHJlYWQtc3RhcnRcIj5cbiAgICAgICAgICB7e3BhcmVudE1lc3NhZ2U/LnJlcGx5X2NvdW50ID09PSAxID8gKCdzdHJlYW1DaGF0LjEgcmVwbHknIHwgdHJhbnNsYXRlKSA6ICgnc3RyZWFtQ2hhdC57eyByZXBseUNvdW50IH19XG4gICAgICAgICAgcmVwbGllcycgfCB0cmFuc2xhdGU6cmVwbHlDb3VudFBhcmFtKX19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9saT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAndGhyZWFkJyAmJiBpc0VtcHR5ICYmIGVtcHR5TGlzdFRlbXBsYXRlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eUxpc3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yXG4gICAgICAgIGRhdGEtdGVzdGlkPVwidG9wLWxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpc0xvYWRpbmcgJiYgZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgJiYgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3JcbiAgICAgICAgXCJcbiAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlcyQgfCBhc3luYyBhcyBtZXNzYWdlc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSBvZiBtZXNzYWdlcztcbiAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgICAgICBsZXQgaXNGaXJzdCA9IGZpcnN0O1xuICAgICAgICAgICAgbGV0IGlzTGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5TWVzc2FnZUlkXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0ZpcnN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZGF0ZVNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICBkYXRlOiBtZXNzYWdlLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZURhdGUobWVzc2FnZS5jcmVhdGVkX2F0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bGlcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cIm1lc3NhZ2VcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbGkgc3RyLWNoYXRfX2xpLS17eyBncm91cFN0eWxlc1tpXSB9fVwiXG4gICAgICAgICAgICBpZD1cInt7IG1lc3NhZ2UuaWQgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBtZXNzYWdlVGVtcGxhdGVDb250YWluZXI7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBtZXNzYWdlOiBtZXNzYWdlLCBpbmRleDogaSB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAobGFzdFJlYWRNZXNzYWdlSWQgPT09IG1lc3NhZ2U/LmlkICYmXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcpIHx8XG4gICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJlxuICAgICAgICAgICAgICAgIGxhc3RSZWFkTWVzc2FnZUlkID09PSBtZXNzYWdlc1tpICsgMV0/LmlkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgaWQ9XCJzdHJlYW0tY2hhdC1uZXctbWVzc2FnZS1pbmRpY2F0b3JcIlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1tZXNzYWdlcy1pbmRpY2F0b3JcIlxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19saSBzdHItY2hhdF9fdW5yZWFkLW1lc3NhZ2VzLXNlcGFyYXRvci13cmFwcGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlIHx8XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvcjtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgdW5yZWFkQ291bnQ6IHVucmVhZENvdW50IH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc05leHRNZXNzYWdlT25TZXBhcmF0ZURhdGVbaV1cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBkYXRlU2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIGRhdGU6IG1lc3NhZ2VzW2kgKyAxXS5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VEYXRlKG1lc3NhZ2VzW2kgKyAxXS5jcmVhdGVkX2F0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxzdHJlYW0tbG9hZGluZy1pbmRpY2F0b3JcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJib3R0b20tbG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGlzTG9hZGluZyAmJiBkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJiBkaXNwbGF5TG9hZGluZ0luZGljYXRvclxuICAgICAgICBcIlxuICAgICAgPjwvc3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yPlxuICAgIDwvdWw+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VHlwaW5nSW5kaWNhdG9yIGxldC11c2Vyc1R5cGluZyQ9XCJ1c2Vyc1R5cGluZyRcIj5cbiAgICAgIDwhLS0gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9uby1hbnkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiJGFueSh1c2Vyc1R5cGluZyQgfCBhc3luYykgYXMgdXNlcnNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwidXNlcnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJ0eXBpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yIHN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yLS10eXBpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJ0eXBpbmctdXNlcnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fdXNlcnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIHVzZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gKFwic3RyZWFtQ2hhdC51c2VyIGlzIHR5cGluZ1wiXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB1c2VyOiBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzKSB9KVxuICAgICAgICAgICAgICAgIDogKFwic3RyZWFtQ2hhdC51c2VycyBhcmUgdHlwaW5nXCJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHVzZXJzOiBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzKSB9KVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHR5cGluZ0luZGljYXRvclRlbXBsYXRlIHx8IGRlZmF1bHRUeXBpbmdJbmRpY2F0b3I7XG4gICAgICAgIGNvbnRleHQ6IGdldFR5cGluZ0luZGljYXRvckNvbnRleHQoKVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LW1lc3NhZ2VcIj5cbiAgPGJ1dHRvblxuICAgIGRhdGEtdGVzdGlkPVwic2Nyb2xsLXRvLWxhdGVzdFwiXG4gICAgKm5nSWY9XCJpc1VzZXJTY3JvbGxlZFwiXG4gICAgY2xhc3M9XCJcbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvbi1zY3JvbGwtdG8tbGF0ZXN0XG4gICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb24tc2Nyb2xsLXRvLWxhdGVzdC1yaWdodFxuICAgICAgc3RyLWNoYXRfX2NpcmNsZS1mYWJcbiAgICBcIlxuICAgIChrZXl1cC5lbnRlcik9XCJqdW1wVG9MYXRlc3RNZXNzYWdlKClcIlxuICAgIChjbGljayk9XCJqdW1wVG9MYXRlc3RNZXNzYWdlKClcIlxuICA+XG4gICAgPHN0cmVhbS1pY29uXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19qdW1wLXRvLWxhdGVzdC1pY29uIHN0ci1jaGF0X19jaXJjbGUtZmFiLWljb25cIlxuICAgICAgW2ljb25dPVwiZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgPyAnYXJyb3ctZG93bicgOiAnYXJyb3ctdXAnXCJcbiAgICA+PC9zdHJlYW0taWNvbj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cIm5ld01lc3NhZ2VDb3VudFdoaWxlQmVpbmdTY3JvbGxlZCA+IDBcIlxuICAgICAgY2xhc3M9XCJcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvbi1zY3JvbGwtdG8tbGF0ZXN0LXVucmVhZC1jb3VudFxuICAgICAgICBzdHItY2hhdF9fanVtcC10by1sYXRlc3QtdW5yZWFkLWNvdW50XG4gICAgICBcIlxuICAgID5cbiAgICAgIHt7IG5ld01lc3NhZ2VDb3VudFdoaWxlQmVpbmdTY3JvbGxlZCB9fVxuICAgIDwvZGl2PlxuICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI21lc3NhZ2VUZW1wbGF0ZUNvbnRhaW5lciBsZXQtbWVzc2FnZT1cIm1lc3NhZ2VcIiBsZXQtaW5kZXg9XCJpbmRleFwiPlxuICA8bmctdGVtcGxhdGVcbiAgICAjZGVmYXVsdE1lc3NhZ2VUZW1wbGF0ZVxuICAgIGxldC1tZXNzYWdlSW5wdXQ9XCJtZXNzYWdlXCJcbiAgICBsZXQtaXNMYXN0U2VudE1lc3NhZ2U9XCJpc0xhc3RTZW50TWVzc2FnZVwiXG4gICAgbGV0LWVuYWJsZWRNZXNzYWdlQWN0aW9ucz1cImVuYWJsZWRNZXNzYWdlQWN0aW9uc1wiXG4gICAgbGV0LW1vZGU9XCJtb2RlXCJcbiAgICBsZXQtaXNIaWdobGlnaHRlZD1cImlzSGlnaGxpZ2h0ZWRcIlxuICAgIGxldC1jdXN0b21BY3Rpb25zPVwiY3VzdG9tQWN0aW9uc1wiXG4gID5cbiAgICA8c3RyZWFtLW1lc3NhZ2VcbiAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VJbnB1dFwiXG4gICAgICBbaXNMYXN0U2VudE1lc3NhZ2VdPVwiaXNMYXN0U2VudE1lc3NhZ2VcIlxuICAgICAgW2VuYWJsZWRNZXNzYWdlQWN0aW9uc109XCJlbmFibGVkTWVzc2FnZUFjdGlvbnNcIlxuICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICBbaXNIaWdobGlnaHRlZF09XCJpc0hpZ2hsaWdodGVkXCJcbiAgICAgIFtjdXN0b21BY3Rpb25zXT1cImN1c3RvbUFjdGlvbnNcIlxuICAgID48L3N0cmVhbS1tZXNzYWdlPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgIG1lc3NhZ2VUZW1wbGF0ZSB8fCBkZWZhdWx0TWVzc2FnZVRlbXBsYXRlO1xuICAgICAgY29udGV4dDoge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICBpc0xhc3RTZW50TWVzc2FnZTogISEoXG4gICAgICAgICAgbGFzdFNlbnRNZXNzYWdlSWQgJiYgbWVzc2FnZT8uaWQgPT09IGxhc3RTZW50TWVzc2FnZUlkXG4gICAgICAgICksXG4gICAgICAgIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBpc0hpZ2hsaWdodGVkOiBtZXNzYWdlPy5pZCA9PT0gaGlnaGxpZ2h0ZWRNZXNzYWdlSWQsXG4gICAgICAgIGN1c3RvbUFjdGlvbnM6IGN1c3RvbU1lc3NhZ2VBY3Rpb25zXG4gICAgICB9XG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkYXRlU2VwYXJhdG9yIGxldC1kYXRlPVwiZGF0ZVwiIGxldC1wYXJzZWREYXRlPVwicGFyc2VkRGF0ZVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheURhdGVTZXBhcmF0b3JcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBjdXN0b21EYXRlU2VwYXJhdG9yVGVtcGxhdGUgfHwgZGVmYXVsdERhdGVTZXBhcmF0b3I7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBkYXRlOiBkYXRlLFxuICAgICAgICAgIHBhcnNlZERhdGU6IHBhcnNlZERhdGVcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy10ZW1wbGF0ZVxuICAgICNkZWZhdWx0RGF0ZVNlcGFyYXRvclxuICAgIGxldC1kYXRlPVwiZGF0ZVwiXG4gICAgbGV0LXBhcnNlZERhdGU9XCJwYXJzZWREYXRlXCJcbiAgPlxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJkYXRlLXNlcGFyYXRvclwiIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yXCI+XG4gICAgICA8aHJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ3JpZ2h0JyB8fCBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2NlbnRlcidcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgICAvPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1kYXRlXCI+XG4gICAgICAgIHt7IHBhcnNlZERhdGUgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGhyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdsZWZ0JyB8fCBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2NlbnRlcidcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TmV3TWVzc2FnZXNJbmRpY2F0b3IgbGV0LXVucmVhZENvdW50PVwidW5yZWFkQ291bnRcIj5cbiAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X191bnJlYWQtbWVzc2FnZXMtc2VwYXJhdG9yXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgdW5yZWFkQ291bnQgPiAwICYmICFoaWRlVW5yZWFkQ291bnRGb3JOb3RpZmljYXRpb25BbmRJbmRpY2F0b3I7XG4gICAgICAgIGVsc2Ugbm9VbnJlYWRDb3VudFxuICAgICAgXCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICAodW5yZWFkQ291bnQgPT09IDFcbiAgICAgICAgICA/IFwic3RyZWFtQ2hhdC5cXHtcXHtjb3VudFxcfVxcfSB1bnJlYWQgbWVzc2FnZVwiXG4gICAgICAgICAgOiBcInN0cmVhbUNoYXQuXFx7XFx7Y291bnRcXH1cXH0gdW5yZWFkIG1lc3NhZ2VzXCJcbiAgICAgICAgKSB8IHRyYW5zbGF0ZTogeyBjb3VudDogdW5yZWFkQ291bnQgfVxuICAgICAgfX1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI25vVW5yZWFkQ291bnQ+XG4gICAgICB7eyBcInN0cmVhbUNoYXQuVW5yZWFkIG1lc3NhZ2VzXCIgfCB0cmFuc2xhdGUgfX1cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=