stream-chat-angular 4.42.1 → 4.43.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.
@@ -16,11 +16,12 @@ import * as i9 from "@ngx-translate/core";
16
16
  * The `MessageList` component renders a scrollable list of messages.
17
17
  */
18
18
  export class MessageListComponent {
19
- constructor(channelService, chatClientService, customTemplatesService, dateParser) {
19
+ constructor(channelService, chatClientService, customTemplatesService, dateParser, ngZone) {
20
20
  this.channelService = channelService;
21
21
  this.chatClientService = chatClientService;
22
22
  this.customTemplatesService = customTemplatesService;
23
23
  this.dateParser = dateParser;
24
+ this.ngZone = ngZone;
24
25
  /**
25
26
  * Determines if the message list should display channel messages or [thread messages](https://getstream.io/chat/docs/javascript/threads/?language=javascript).
26
27
  */
@@ -64,16 +65,19 @@ export class MessageListComponent {
64
65
  this.class = 'str-chat-angular__main-panel-inner str-chat-angular__message-list-host str-chat__main-panel-inner';
65
66
  this.unreadMessageCount = 0;
66
67
  this.groupStyles = [];
68
+ this.isNextMessageOnSeparateDate = [];
67
69
  this.isLoading = false;
68
70
  this.isScrollInProgress = false;
69
71
  this.isJumpingToLatestUnreadMessage = false;
70
72
  this.subscriptions = [];
71
73
  this.isLatestMessageInList = true;
74
+ this.parsedDates = new Map();
72
75
  this.subscriptions.push(this.channelService.activeChannel$.subscribe((channel) => {
73
76
  var _a, _b, _c, _d, _e, _f, _g;
74
77
  (_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}` });
75
78
  if (this.channelId !== (channel === null || channel === void 0 ? void 0 : channel.id)) {
76
79
  (_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}` });
80
+ this.parsedDates = new Map();
77
81
  this.resetScrollState();
78
82
  this.channelId = channel === null || channel === void 0 ? void 0 : channel.id;
79
83
  if (this.openMessageListAt === 'last-read-message' &&
@@ -141,6 +145,9 @@ export class MessageListComponent {
141
145
  }
142
146
  }
143
147
  ngAfterViewInit() {
148
+ this.ngZone.runOutsideAngular(() => {
149
+ this.scrollContainer.nativeElement.addEventListener('scroll', () => this.scrolled());
150
+ });
144
151
  this.subscriptions.push(this.channelService.jumpToMessage$
145
152
  .pipe(filter((config) => !!config.id))
146
153
  .subscribe((config) => {
@@ -236,13 +243,15 @@ export class MessageListComponent {
236
243
  this.scrollContainer.nativeElement.scrollTop = 0;
237
244
  }
238
245
  scrolled() {
239
- var _a, _b, _c, _d;
246
+ var _a, _b;
240
247
  this.isScrollInProgress = true;
241
248
  if (this.scrollEndTimeout) {
242
249
  clearTimeout(this.scrollEndTimeout);
243
250
  }
244
251
  this.scrollEndTimeout = setTimeout(() => {
245
- this.isScrollInProgress = false;
252
+ this.ngZone.run(() => {
253
+ this.isScrollInProgress = false;
254
+ });
246
255
  }, 100);
247
256
  if (this.scrollContainer.nativeElement.scrollHeight ===
248
257
  this.scrollContainer.nativeElement.clientHeight) {
@@ -250,27 +259,36 @@ export class MessageListComponent {
250
259
  }
251
260
  const scrollPosition = this.getScrollPosition();
252
261
  (_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `Scrolled - scroll position: ${scrollPosition}, container height: ${this.scrollContainer.nativeElement.scrollHeight}`, { tags: `message list ${this.mode}` });
253
- this.isUserScrolled =
254
- (this.direction === 'bottom-to-top'
255
- ? scrollPosition !== 'bottom'
256
- : scrollPosition !== 'top') || !this.isLatestMessageInList;
257
- if (!this.isUserScrolled) {
258
- this.unreadMessageCount = 0;
262
+ const isUserScrolled = (this.direction === 'bottom-to-top'
263
+ ? scrollPosition !== 'bottom'
264
+ : scrollPosition !== 'top') || !this.isLatestMessageInList;
265
+ if (this.isUserScrolled !== isUserScrolled) {
266
+ this.ngZone.run(() => {
267
+ this.isUserScrolled = isUserScrolled;
268
+ if (!this.isUserScrolled) {
269
+ this.unreadMessageCount = 0;
270
+ }
271
+ });
259
272
  }
260
273
  if (this.shouldLoadMoreMessages(scrollPosition)) {
261
- this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;
262
- let direction;
263
- if (this.direction === 'top-to-bottom') {
264
- direction = scrollPosition === 'top' ? 'newer' : 'older';
265
- }
266
- else {
267
- direction = scrollPosition === 'top' ? 'older' : 'newer';
268
- }
269
- this.mode === 'main'
270
- ? void this.channelService.loadMoreMessages(direction)
271
- : void this.channelService.loadMoreThreadReplies(direction);
272
- (_d = (_c = this.chatClientService.chatClient) === null || _c === void 0 ? void 0 : _c.logger) === null || _d === void 0 ? void 0 : _d.call(_c, 'info', `Displaying loading indicator`, { tags: `message list ${this.mode}` });
273
- this.isLoading = true;
274
+ this.ngZone.run(() => {
275
+ var _a, _b;
276
+ this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;
277
+ let direction;
278
+ if (this.direction === 'top-to-bottom') {
279
+ direction = scrollPosition === 'top' ? 'newer' : 'older';
280
+ }
281
+ else {
282
+ direction = scrollPosition === 'top' ? 'older' : 'newer';
283
+ }
284
+ const result = this.mode === 'main'
285
+ ? this.channelService.loadMoreMessages(direction)
286
+ : this.channelService.loadMoreThreadReplies(direction);
287
+ if (result) {
288
+ (_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `Displaying loading indicator`, { tags: `message list ${this.mode}` });
289
+ this.isLoading = true;
290
+ }
291
+ });
274
292
  }
275
293
  this.prevScrollTop = this.scrollContainer.nativeElement.scrollTop;
276
294
  }
@@ -283,20 +301,6 @@ export class MessageListComponent {
283
301
  const text = listUsers(users);
284
302
  return text;
285
303
  }
286
- areOnSeparateDates(message, nextMessage) {
287
- if (!message || !nextMessage) {
288
- return false;
289
- }
290
- if (message.created_at.getDate() !== nextMessage.created_at.getDate()) {
291
- return true;
292
- }
293
- else if (message.created_at.getFullYear() !==
294
- nextMessage.created_at.getFullYear() ||
295
- message.created_at.getMonth() !== nextMessage.created_at.getMonth()) {
296
- return true;
297
- }
298
- return false;
299
- }
300
304
  isSentByCurrentUser(message) {
301
305
  var _a, _b;
302
306
  if (!message) {
@@ -305,7 +309,12 @@ export class MessageListComponent {
305
309
  return ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = this.chatClientService.chatClient.user) === null || _b === void 0 ? void 0 : _b.id);
306
310
  }
307
311
  parseDate(date) {
308
- return this.dateParser.parseDate(date);
312
+ if (this.parsedDates.has(date)) {
313
+ return this.parsedDates.get(date);
314
+ }
315
+ const parsedDate = this.dateParser.parseDate(date);
316
+ this.parsedDates.set(date, parsedDate);
317
+ return parsedDate;
309
318
  }
310
319
  get replyCountParam() {
311
320
  var _a;
@@ -396,6 +405,7 @@ export class MessageListComponent {
396
405
  }
397
406
  }), map((messages) => this.direction === 'bottom-to-top' ? messages : [...messages].reverse()), tap((messages) => {
398
407
  this.groupStyles = messages.map((m, i) => getGroupStyles(m, messages[i - 1], messages[i + 1]));
408
+ this.isNextMessageOnSeparateDate = messages.map((m, i) => this.checkIfOnSeparateDates(m, messages[i + 1]));
399
409
  }));
400
410
  }
401
411
  resetScrollState() {
@@ -456,9 +466,23 @@ export class MessageListComponent {
456
466
  }
457
467
  }
458
468
  }
469
+ checkIfOnSeparateDates(message, nextMessage) {
470
+ if (!message || !nextMessage) {
471
+ return false;
472
+ }
473
+ if (message.created_at.getDate() !== nextMessage.created_at.getDate()) {
474
+ return true;
475
+ }
476
+ else if (message.created_at.getFullYear() !==
477
+ nextMessage.created_at.getFullYear() ||
478
+ message.created_at.getMonth() !== nextMessage.created_at.getMonth()) {
479
+ return true;
480
+ }
481
+ return false;
482
+ }
459
483
  }
460
- 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 }], target: i0.ɵɵFactoryTarget.Component });
461
- 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 (scroll)=\"scrolled()\"\n style=\"overscroll-behavior: none\"\n>\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 <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 ||\n !areOnSeparateDates(message, messages[i + 1]))) ||\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=\"areOnSeparateDates(message, messages[i + 1])\">\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=\"\n isUserScrolled &&\n (!isScrollInProgress || !hideJumpToLatestButtonDuringScroll)\n \"\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: i5.LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }, { type: i6.IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: i7.MessageComponent, selector: "stream-message", inputs: ["message", "enabledMessageActions", "isLastSentMessage", "mode", "isHighlighted", "customActions"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i9.TranslatePipe, "async": i8.AsyncPipe } });
484
+ 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 }], target: i0.ɵɵFactoryTarget.Component });
485
+ 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 <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 <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=\"\n isUserScrolled &&\n (!isScrollInProgress || !hideJumpToLatestButtonDuringScroll)\n \"\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: i5.LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }, { type: i6.IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: i7.MessageComponent, selector: "stream-message", inputs: ["message", "enabledMessageActions", "isLastSentMessage", "mode", "isHighlighted", "customActions"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i9.TranslatePipe, "async": i8.AsyncPipe } });
462
486
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageListComponent, decorators: [{
463
487
  type: Component,
464
488
  args: [{
@@ -466,7 +490,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
466
490
  templateUrl: './message-list.component.html',
467
491
  styles: [],
468
492
  }]
469
- }], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i2.ChatClientService }, { type: i3.CustomTemplatesService }, { type: i4.DateParserService }]; }, propDecorators: { mode: [{
493
+ }], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i2.ChatClientService }, { type: i3.CustomTemplatesService }, { type: i4.DateParserService }, { type: i0.NgZone }]; }, propDecorators: { mode: [{
470
494
  type: Input
471
495
  }], direction: [{
472
496
  type: Input
@@ -494,4 +518,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
494
518
  type: ViewChild,
495
519
  args: ['parentMessageElement']
496
520
  }] } });
497
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssRUFNTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVbEQsT0FBTyxFQUFFLGNBQWMsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBRzFDOztHQUVHO0FBTUgsTUFBTSxPQUFPLG9CQUFvQjtJQXFGL0IsWUFDVSxjQUE4QixFQUM5QixpQkFBb0MsRUFDcEMsc0JBQThDLEVBQzlDLFVBQTZCO1FBSDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUF0RnZDOztXQUVHO1FBQ00sU0FBSSxHQUFzQixNQUFNLENBQUM7UUFDMUM7O1dBRUc7UUFDTSxjQUFTLEdBQXNDLGVBQWUsQ0FBQztRQUN4RTs7V0FFRztRQUNNLDBCQUFxQixHQUM1QixhQUFhLENBQUM7UUFDaEI7Ozs7V0FJRztRQUNNLHVDQUFrQyxHQUFHLEtBQUssQ0FBQztRQUNwRDs7V0FFRztRQUNNLHlC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QUtHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFPd0IsS0FBSztzQkFBbEMsV0FBVzt1QkFBQyxPQUFPO2dCQWNaLGVBQWU7c0JBRHRCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUdwQixvQkFBb0I7c0JBRDNCLFNBQVM7dUJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgTWVzc2FnZUNvbnRleHQsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIFN0cmVhbU1lc3NhZ2UsXG4gIFR5cGluZ0luZGljYXRvckNvbnRleHQsXG4gIEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtLFxuICBEYXRlU2VwYXJhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEdyb3VwU3R5bGVzLCBHcm91cFN0eWxlIH0gZnJvbSAnLi9ncm91cC1zdHlsZXMnO1xuaW1wb3J0IHsgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBsaXN0VXNlcnMgfSBmcm9tICcuLi9saXN0LXVzZXJzJztcbmltcG9ydCB7IERhdGVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0ZS1wYXJzZXIuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIGBNZXNzYWdlTGlzdGAgY29tcG9uZW50IHJlbmRlcnMgYSBzY3JvbGxhYmxlIGxpc3Qgb2YgbWVzc2FnZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUxpc3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBtZXNzYWdlIGxpc3Qgc2hvdWxkIGRpc3BsYXkgY2hhbm5lbCBtZXNzYWdlcyBvciBbdGhyZWFkIG1lc3NhZ2VzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGU6ICdtYWluJyB8ICd0aHJlYWQnID0gJ21haW4nO1xuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIGxpc3QsIGBib3R0b20tdG8tdG9wYCBtZWFucyBuZXdlc3QgbWVzc2FnZSBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBtZXNzYWdlIGxpc3QgYW5kIHVzZXJzIHNjcm9sbCB1cHdhcmRzIHRvIGxvYWQgb2xkZXIgbWVzc2FnZXNcbiAgICovXG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogJ2JvdHRvbS10by10b3AnIHwgJ3RvcC10by1ib3R0b20nID0gJ2JvdHRvbS10by10b3AnO1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGF0IHRyaWdnZXJzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBtZXNzYWdlIG9wdGlvbnM6IGJ5IGRlZmF1bHQgeW91IGNhbiBob3ZlciAoY2xpY2sgb24gbW9iaWxlKSBhbnl3aGVyZSBpbiB0aGUgcm93IG9mIHRoZSBtZXNzYWdlIChgbWVzc2FnZS1yb3dgIG9wdGlvbiksIG9yIHlvdSBjYW4gc2V0IGBtZXNzYWdlLWJ1YmJsZWAsIGluIHRoYXQgY2FzZSBvbmx5IGEgaG92ZXIgKGNsaWNrIG9uIG1vYmlsZSkgaW4gdGhlIG1lc3NhZ2UgYnViYmxlIHdpbGwgdHJpZ2dlciB0aGUgb3B0aW9ucyB0byBhcHBlYXIuXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlT3B0aW9uc1RyaWdnZXI6ICdtZXNzYWdlLXJvdycgfCAnbWVzc2FnZS1idWJibGUnID1cbiAgICAnbWVzc2FnZS1yb3cnO1xuICAvKipcbiAgICogWW91IGNhbiBoaWRlIHRoZSBcImp1bXAgdG8gbGF0ZXN0XCIgYnV0dG9uIHdoaWxlIHNjcm9sbGluZy4gQSBwb3RlbnRpYWwgdXNlLWNhc2UgZm9yIHRoaXMgaW5wdXQgd291bGQgYmUgdG8gW3dvcmthcm91bmQgYSBrbm93biBpc3N1ZSBvbiBpT1MgU2FmYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9HZXRTdHJlYW0vc3RyZWFtLWNoYXQtYW5ndWxhci9pc3N1ZXMvNDE4KVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHNjcm9sbCBpc3N1ZSBoYXMgYmVlbiByZXNvbHZlZCwgbm8gbmVlZCB0byB1c2UgdGhpcyAgd29ya2Fyb3VuZCBhbnltb3JlLlxuICAgKi9cbiAgQElucHV0KCkgaGlkZUp1bXBUb0xhdGVzdEJ1dHRvbkR1cmluZ1Njcm9sbCA9IGZhbHNlO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGN1c3RvbSBtZXNzYWdlIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBtZXNzYWdlIGFjdGlvbiBib3hcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbU1lc3NhZ2VBY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbTxhbnk+W10gPSBbXTtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCBkYXRlIHNlcGFyYXRvcnMgd2lsbCBiZSBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlEYXRlU2VwYXJhdG9yID0gdHJ1ZTtcbiAgLyoqXG4gICAqIElmIGRhdGUgc2VwYXJhdG9ycyBhcmUgZGlzcGxheWVkLCB5b3UgY2FuIHNldCB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgZGF0ZSB0ZXh0LlxuICAgKiBJZiBgb3Blbk1lc3NhZ2VMaXN0QXRgIGlzIGBsYXN0LXJlYWQtbWVzc2FnZWAgaXQgd2lsbCBhbHNvIHNldCB0aGUgdGV4dCBwb3NpdGlvbiBvZiB0aGUgbmV3IG1lc3NhZ2VzIGluZGljYXRvci5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVTZXBhcmF0b3JUZXh0UG9zOiAnY2VudGVyJyB8ICdyaWdodCcgfCAnbGVmdCcgPSAnY2VudGVyJztcbiAgLyoqXG4gICAqIGBsYXN0LW1lc3NhZ2VgIG9wdGlvbiB3aWxsIG9wZW4gdGhlIG1lc3NhZ2UgbGlzdCBhdCB0aGUgbGFzdCBtZXNzYWdlLCBgbGFzdC1yZWFkLW1lc3NhZ2VgIHdpbGwgb3BlbiB0aGUgbGlzdCBhdCB0aGUgbGFzdCB1bnJlYWQgbWVzc2FnZS4gVGhpcyBvcHRpb24gb25seSB3b3JrcyBpZiBtb2RlIGlzIGBtYWluYC5cbiAgICovXG4gIEBJbnB1dCgpIG9wZW5NZXNzYWdlTGlzdEF0OiAnbGFzdC1tZXNzYWdlJyB8ICdsYXN0LXJlYWQtbWVzc2FnZScgPVxuICAgICdsYXN0LW1lc3NhZ2UnO1xuICAvKipcbiAgICogWW91IGNhbiB0dXJuIG9uIGFuZCBvZmYgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIHRoYXQgc2lnbmFscyB0byB1c2VycyB0aGF0IG1vcmUgbWVzc2FnZXMgYXJlIGJlaW5nIGxvYWRlZCB0byB0aGUgbWVzc2FnZSBsaXN0XG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5TG9hZGluZ0luZGljYXRvciA9IHRydWU7XG4gIHR5cGluZ0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUeXBpbmdJbmRpY2F0b3JDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxNZXNzYWdlQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8RGF0ZVNlcGFyYXRvckNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZXMkITogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBwcml2YXRlIGNsYXNzID1cbiAgICAnc3RyLWNoYXQtYW5ndWxhcl9fbWFpbi1wYW5lbC1pbm5lciBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWxpc3QtaG9zdCBzdHItY2hhdF9fbWFpbi1wYW5lbC1pbm5lcic7XG4gIHVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gIGlzVXNlclNjcm9sbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBncm91cFN0eWxlczogR3JvdXBTdHlsZVtdID0gW107XG4gIGxhc3RTZW50TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHBhcmVudE1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBpc1Njcm9sbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgc2Nyb2xsRW5kVGltZW91dDogYW55O1xuICBsYXN0UmVhZE1lc3NhZ2VJZD86IHN0cmluZztcbiAgaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicpXG4gIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhcmVudE1lc3NhZ2VFbGVtZW50JylcbiAgcHJpdmF0ZSBwYXJlbnRNZXNzYWdlRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhdGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGhhc05ld01lc3NhZ2VzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbnRhaW5lckhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVyTWFzc2FnZXNMb2FkZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNOZXdNZXNzYWdlU2VudEJ5VXNlcjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIG5ld01lc3NhZ2VTdWJzY3JpcHRpb246IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwcmV2U2Nyb2xsVG9wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJbkNoYW5uZWwkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5UaHJlYWQkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIGlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIHByaXZhdGUgY2hhbm5lbElkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQYXJzZXI6IERhdGVQYXJzZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoKGNoYW5uZWwpID0+IHtcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYCR7Y2hhbm5lbD8uY2lkIHx8ICd1bmRlZmluZWQnfSBzZWxlY3RlZGAsXG4gICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jaGFubmVsSWQgIT09IGNoYW5uZWw/LmlkKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZT8uY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgbmV3IGNoYW5uZWwgaXMgZGlmZmVyZW50IGZyb20gcHJldiBjaGFubmVsLCByZXNldGluZyBzY3JvbGwgc3RhdGVgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgdGhpcy5jaGFubmVsSWQgPSBjaGFubmVsPy5pZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLm9wZW5NZXNzYWdlTGlzdEF0ID09PSAnbGFzdC1yZWFkLW1lc3NhZ2UnICYmXG4gICAgICAgICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbExhc3RSZWFkTWVzc2FnZUlkO1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5pc0p1bXBpbmdUb0xhdGVzdFVucmVhZE1lc3NhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZSh0aGlzLmxhc3RSZWFkTWVzc2FnZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FwYWJpbGl0ZXMgPSBjaGFubmVsPy5kYXRhPy5vd25fY2FwYWJpbGl0aWVzIGFzIHN0cmluZ1tdO1xuICAgICAgICBpZiAoY2FwYWJpbGl0ZXMpIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyA9IGNhcGFiaWxpdGVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgICAgICB0aGlzLm5ld01lc3NhZ2VTdWJzY3JpcHRpb24gPSBjaGFubmVsLm9uKCdtZXNzYWdlLm5ldycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gSWYgd2UgZGlzcGxheSBtYWluIGNoYW5uZWwgbWVzc2FnZXMgYW5kIHdlJ3JlIHN3aXRjaGVkIHRvIGFuIG9sZGVyIG1lc3NhZ2Ugc2V0IC0+IHVzZSBtZXNzYWdlLm5ldyBldmVudCB0byB1cGRhdGUgdW5yZWFkIGNvdW50IGFuZCBkZXRlY3QgbmV3IG1lc3NhZ2VzIHNlbnQgYnkgY3VycmVudCB1c2VyXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFldmVudC5tZXNzYWdlIHx8XG4gICAgICAgICAgICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMgPT09IGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMgfHxcbiAgICAgICAgICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3TWVzc2FnZVJlY2VpdmVkKHtcbiAgICAgICAgICAgICAgaWQ6IGV2ZW50Lm1lc3NhZ2UuaWQsXG4gICAgICAgICAgICAgIHVzZXI6IGV2ZW50Lm1lc3NhZ2UudXNlcixcbiAgICAgICAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoZXZlbnQubWVzc2FnZS5jcmVhdGVkX2F0IHx8ICcnKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZVBhcmVudE1lc3NhZ2UkLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZSAmJlxuICAgICAgICAgIG1lc3NhZ2UuaWQgIT09IHRoaXMucGFyZW50TWVzc2FnZS5pZCAmJlxuICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5tZXNzYWdlVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmRhdGVTZXBhcmF0b3JUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbW5ld01lc3NhZ2VzSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnR5cGluZ0luZGljYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWwkID0gdGhpcy5jaGFubmVsU2VydmljZS51c2Vyc1R5cGluZ0luQ2hhbm5lbCQ7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJCA9IHRoaXMuY2hhbm5lbFNlcnZpY2UudXNlcnNUeXBpbmdJblRocmVhZCQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE1lc3NhZ2VzJCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1vZGUgfHwgY2hhbmdlcy5kaXJlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnZXMkKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmRpcmVjdGlvbikge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZSRcbiAgICAgICAgLnBpcGUoZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnLmlkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgbGV0IG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdtYWluJykge1xuICAgICAgICAgICAgbWVzc2FnZUlkID0gY29uZmlnLnBhcmVudElkIHx8IGNvbmZpZy5pZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXJlbnRJZCkge1xuICAgICAgICAgICAgbWVzc2FnZUlkID0gY29uZmlnLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYEp1bXBpbmcgdG8gJHttZXNzYWdlSWQgfHwgJyd9YCxcbiAgICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlSWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbE1lc3NhZ2VJbnRvVmlldyhtZXNzYWdlSWQpO1xuICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gbWVzc2FnZUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkKSB7XG4gICAgICAvLyBUdXJuIG9mZiBwcm9ncmFtYXRpYyBzY3JvbGwgYWRqdXN0bWVudHMgd2hpbGUganVtcCB0byBtZXNzYWdlIGlzIGluIHByb2dyZXNzXG4gICAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyAmJlxuICAgICAgICAodGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyIHx8ICF0aGlzLmlzVXNlclNjcm9sbGVkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0XG4gICAgICAgICAgPyB0aGlzLnNjcm9sbFRvVG9wKClcbiAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmhhc05ld01lc3NhZ2VzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1VzZXJTY3JvbGxlZCB8fCB0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIpIHtcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYFVzZXIgaGFzIG5ldyBtZXNzYWdlcywgYW5kIG5vdCBzY3JvbGxlZCBvciBzZW50IG5ldyBtZXNzYWdlcywgdGhlcmVmb3JlIHdlICR7XG4gICAgICAgICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID8gJ3Njcm9sbCcgOiAnanVtcCdcbiAgICAgICAgICAgIH0gdG8gbGF0ZXN0IG1lc3NhZ2VgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICAgID8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGBPbGRlciBtZXNzYWdlcyBhcmUgbG9hZGVkLCB3ZSBwcmVzZXJ2ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uYCxcbiAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucHJlc2VydmVTY3JvbGxiYXJQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKSAhPT0gJ2JvdHRvbScgJiZcbiAgICAgICAgIXRoaXMuaXNVc2VyU2Nyb2xsZWQgJiZcbiAgICAgICAgIXRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICBgQ29udGFpbmVyIGdyZXcgYW5kIHVzZXIgZGlkbid0IHNjcm9sbCB0aGVyZWZvcmUgd2UgJHtcbiAgICAgICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID8gJ3Njcm9sbCcgOiAnanVtcCdcbiAgICAgICAgICB9IHRvIGxhdGVzdCBtZXNzYWdlYCxcbiAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0XG4gICAgICAgICAgPyB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxFbmRUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxFbmRUaW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5TWVzc2FnZUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIHRyYWNrQnlVc2VySWQoaW5kZXg6IG51bWJlciwgdXNlcjogVXNlclJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHVzZXIuaWQ7XG4gIH1cblxuICBqdW1wVG9MYXRlc3RNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlKFxuICAgICAgJ2xhdGVzdCcsXG4gICAgICB0aGlzLm1vZGUgPT09ICd0aHJlYWQnID8gdGhpcy5wYXJlbnRNZXNzYWdlPy5pZCA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBzY3JvbGxUb0JvdHRvbSgpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICB0aGlzLmZvcmNlUmVwYWludCgpO1xuICB9XG5cbiAgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICB9XG5cbiAgc2Nyb2xsZWQoKSB7XG4gICAgdGhpcy5pc1Njcm9sbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNTY3JvbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgfSwgMTAwKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCA9PT1cbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAnaW5mbycsXG4gICAgICBgU2Nyb2xsZWQgLSBzY3JvbGwgcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259LCBjb250YWluZXIgaGVpZ2h0OiAke3RoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0fWAsXG4gICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgKTtcblxuICAgIHRoaXMuaXNVc2VyU2Nyb2xsZWQgPVxuICAgICAgKHRoaXMuZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCdcbiAgICAgICAgPyBzY3JvbGxQb3NpdGlvbiAhPT0gJ2JvdHRvbSdcbiAgICAgICAgOiBzY3JvbGxQb3NpdGlvbiAhPT0gJ3RvcCcpIHx8ICF0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdDtcbiAgICBpZiAoIXRoaXMuaXNVc2VyU2Nyb2xsZWQpIHtcbiAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50ID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkTG9hZE1vcmVNZXNzYWdlcyhzY3JvbGxQb3NpdGlvbikpIHtcbiAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICBsZXQgZGlyZWN0aW9uOiAnbmV3ZXInIHwgJ29sZGVyJztcbiAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3RvcC10by1ib3R0b20nKSB7XG4gICAgICAgIGRpcmVjdGlvbiA9IHNjcm9sbFBvc2l0aW9uID09PSAndG9wJyA/ICduZXdlcicgOiAnb2xkZXInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyZWN0aW9uID0gc2Nyb2xsUG9zaXRpb24gPT09ICd0b3AnID8gJ29sZGVyJyA6ICduZXdlcic7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICA/IHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5sb2FkTW9yZU1lc3NhZ2VzKGRpcmVjdGlvbilcbiAgICAgICAgOiB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UubG9hZE1vcmVUaHJlYWRSZXBsaWVzKGRpcmVjdGlvbik7XG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAnaW5mbycsXG4gICAgICAgIGBEaXNwbGF5aW5nIGxvYWRpbmcgaW5kaWNhdG9yYCxcbiAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JDb250ZXh0KCk6IFR5cGluZ0luZGljYXRvckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB1c2Vyc1R5cGluZyQ6IHRoaXMudXNlcnNUeXBpbmckLFxuICAgIH07XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzOiBVc2VyUmVzcG9uc2VbXSkge1xuICAgIGNvbnN0IHRleHQgPSBsaXN0VXNlcnModXNlcnMpO1xuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBhcmVPblNlcGFyYXRlRGF0ZXMobWVzc2FnZT86IFN0cmVhbU1lc3NhZ2UsIG5leHRNZXNzYWdlPzogU3RyZWFtTWVzc2FnZSkge1xuICAgIGlmICghbWVzc2FnZSB8fCAhbmV4dE1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXREYXRlKCkgIT09IG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgbWVzc2FnZS5jcmVhdGVkX2F0LmdldEZ1bGxZZWFyKCkgIT09XG4gICAgICAgIG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgbWVzc2FnZS5jcmVhdGVkX2F0LmdldE1vbnRoKCkgIT09IG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0TW9udGgoKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZT86IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2UudXNlcj8uaWQgPT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZDtcbiAgfVxuXG4gIHBhcnNlRGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZVBhcnNlci5wYXJzZURhdGUoZGF0ZSk7XG4gIH1cblxuICBnZXQgcmVwbHlDb3VudFBhcmFtKCkge1xuICAgIHJldHVybiB7IHJlcGx5Q291bnQ6IHRoaXMucGFyZW50TWVzc2FnZT8ucmVwbHlfY291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlc2VydmVTY3JvbGxiYXJQb3NpdGlvbigpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XG4gICAgICAodGhpcy5wcmV2U2Nyb2xsVG9wIHx8IDApICtcbiAgICAgICh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCAtIHRoaXMuY29udGFpbmVySGVpZ2h0ISk7XG4gIH1cblxuICBwcml2YXRlIGZvcmNlUmVwYWludCgpIHtcbiAgICAvLyBTb2x2ZXMgdGhlIGlzc3VlIG9mIGVtcHR5IHNjcmVlbiBvbiBTYWZhcmkgd2hlbiBzY3JvbGxpbmdcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIG5vIG5lZWQgdG8gc3RvcmUgdGhpcyBhbnl3aGVyZSwgdGhlIHJlZmVyZW5jZSBpcyBlbm91Z2hcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsUG9zaXRpb24oKTogJ3RvcCcgfCAnYm90dG9tJyB8ICdtaWRkbGUnIHtcbiAgICBsZXQgcG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJyA9ICdtaWRkbGUnO1xuICAgIGlmIChcbiAgICAgIE1hdGguZmxvb3IodGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3ApIDw9XG4gICAgICAgICh0aGlzLnBhcmVudE1lc3NhZ2VFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCB8fCAwKSAmJlxuICAgICAgKHRoaXMucHJldlNjcm9sbFRvcCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHRoaXMucHJldlNjcm9sbFRvcCA+XG4gICAgICAgICAgKHRoaXMucGFyZW50TWVzc2FnZUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IDApKVxuICAgICkge1xuICAgICAgcG9zaXRpb24gPSAndG9wJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgTWF0aC5jZWlsKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSArXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0ID49XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodFxuICAgICkge1xuICAgICAgcG9zaXRpb24gPSAnYm90dG9tJztcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIHNob3VsZExvYWRNb3JlTWVzc2FnZXMoc2Nyb2xsUG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJykge1xuICAgIHJldHVybiBzY3JvbGxQb3NpdGlvbiAhPT0gJ21pZGRsZScgJiYgIXRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQ7XG4gIH1cblxuICBwcml2YXRlIHNldE1lc3NhZ2VzJCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VzJCA9IChcbiAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgID8gdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsTWVzc2FnZXMkXG4gICAgICAgIDogdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVUaHJlYWRNZXNzYWdlcyRcbiAgICApLnBpcGUoXG4gICAgICB0YXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYEVtcHR5IG1lc3NhZ2VzIGFycmF5LCByZXNldGluZyBzY3JvbGwgc3RhdGVgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYFJlY2VpdmVkIG9uZSBvciBtb3JlIG1lc3NhZ2VzYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjdXJyZW50TGF0ZXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICB0aGlzLm5ld01lc3NhZ2VSZWNlaXZlZChjdXJyZW50TGF0ZXN0TWVzc2FnZSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRPbGRlc3RNZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5vbGRlc3RNZXNzYWdlIHx8XG4gICAgICAgICAgIW1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IHRoaXMub2xkZXN0TWVzc2FnZSEuaWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IGN1cnJlbnRPbGRlc3RNZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMub2xkZXN0TWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKSA+XG4gICAgICAgICAgY3VycmVudE9sZGVzdE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRUaW1lKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5vbGRlc3RNZXNzYWdlID0gY3VycmVudE9sZGVzdE1lc3NhZ2U7XG4gICAgICAgICAgdGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YXAoXG4gICAgICAgIChtZXNzYWdlcykgPT5cbiAgICAgICAgICAodGhpcy5sYXN0U2VudE1lc3NhZ2VJZCA9IFsuLi5tZXNzYWdlc11cbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgICAobSkgPT5cbiAgICAgICAgICAgICAgICBtLnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LnVzZXI/LmlkICYmXG4gICAgICAgICAgICAgICAgbS5zdGF0dXMgIT09ICdzZW5kaW5nJ1xuICAgICAgICAgICAgKT8uaWQpXG4gICAgICApLFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9XG4gICAgICAgICAgIXRoaXMubGF0ZXN0TWVzc2FnZSB8fFxuICAgICAgICAgIG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdLmlkID09PSB0aGlzLmxhdGVzdE1lc3NhZ2UuaWQ7XG4gICAgICAgIGlmICghdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QpIHtcbiAgICAgICAgICB0aGlzLmlzVXNlclNjcm9sbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5pc0p1bXBpbmdUb0xhdGVzdFVucmVhZE1lc3NhZ2UgJiZcbiAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkICYmXG4gICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9PT0gdGhpcy5sYXRlc3RNZXNzYWdlPy5pZFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG1hcCgobWVzc2FnZXMpID0+XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgPyBtZXNzYWdlcyA6IFsuLi5tZXNzYWdlc10ucmV2ZXJzZSgpXG4gICAgICApLFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmdyb3VwU3R5bGVzID0gbWVzc2FnZXMubWFwKChtLCBpKSA9PlxuICAgICAgICAgIGdldEdyb3VwU3R5bGVzKG0sIG1lc3NhZ2VzW2kgLSAxXSwgbWVzc2FnZXNbaSArIDFdKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNjcm9sbFN0YXRlKCkge1xuICAgIHRoaXMubGF0ZXN0TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gdHJ1ZTtcbiAgICB0aGlzLmlzVXNlclNjcm9sbGVkID0gZmFsc2U7XG4gICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5vbGRlc3RNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50ID0gMDtcbiAgICB0aGlzLnByZXZTY3JvbGxUb3AgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHVzZXJzVHlwaW5nJCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgPyB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWQkXG4gICAgICA6IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWwkO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkOiBzdHJpbmcsIHdpdGhSZXRyeSA9IHRydWUpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVzc2FnZUlkKTtcbiAgICBpZiAoIWVsZW1lbnQgJiYgd2l0aFJldHJ5KSB7XG4gICAgICAvLyBJZiB0aGUgbWVzc2FnZSB3YXMgbmV3bHkgaW5zZXJ0ZWQgaW50byBhY3RpdmVDaGFubmVsTWVzc2FnZXMkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbmRlcmVkIGFmdGVyIHRoZSBjdXJyZW50IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgLT4gd2FpdCBmb3IgdGhpcyBjeWNsZSB0byBjb21wbGV0ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbE1lc3NhZ2VJbnRvVmlldyhtZXNzYWdlSWQsIGZhbHNlKSk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgYmxvY2s6IG1lc3NhZ2VJZCA9PT0gdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA/ICdzdGFydCcgOiAnY2VudGVyJyxcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlID0gZmFsc2U7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvTGF0ZXN0TWVzc2FnZSh3aXRoUmV0cnkgPSB0cnVlKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubGF0ZXN0TWVzc2FnZSEuaWQpKSB7XG4gICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnXG4gICAgICAgID8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgIDogdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgIH0gZWxzZSBpZiAod2l0aFJldHJ5KSB7XG4gICAgICAvLyBJZiB0aGUgbWVzc2FnZSB3YXMgbmV3bHkgaW5zZXJ0ZWQgaW50byBhY3RpdmVDaGFubmVsTWVzc2FnZXMkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbmRlcmVkIGFmdGVyIHRoZSBjdXJyZW50IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgLT4gd2FpdCBmb3IgdGhpcyBjeWNsZSB0byBjb21wbGV0ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvTGF0ZXN0TWVzc2FnZShmYWxzZSksIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbmV3TWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2U6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXNlcj86IHsgaWQ6IHN0cmluZyB9IHwgbnVsbDtcbiAgfSkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmxhdGVzdE1lc3NhZ2UgfHxcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZS5jcmVhdGVkX2F0Py5nZXRUaW1lKCkgPCBtZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0VGltZSgpXG4gICAgKSB7XG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAnaW5mbycsXG4gICAgICAgIGBSZWNlaXZlZCBuZXcgbWVzc2FnZWAsXG4gICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IHRydWU7XG4gICAgICB0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIgPVxuICAgICAgICBtZXNzYWdlLnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LnVzZXI/LmlkO1xuICAgICAgaWYgKHRoaXMuaXNVc2VyU2Nyb2xsZWQpIHtcbiAgICAgICAgdGhpcy51bnJlYWRNZXNzYWdlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgI3Njcm9sbENvbnRhaW5lclxuICBkYXRhLXRlc3RpZD1cInNjcm9sbC1jb250YWluZXJcIlxuICBjbGFzcz1cInN0ci1jaGF0X19saXN0XCJcbiAgKHNjcm9sbCk9XCJzY3JvbGxlZCgpXCJcbiAgc3R5bGU9XCJvdmVyc2Nyb2xsLWJlaGF2aW9yOiBub25lXCJcbj5cbiAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19yZXZlcnNlLWluZmluaXRlLXNjcm9sbCBzdHItY2hhdF9fbWVzc2FnZS1saXN0LXNjcm9sbFwiPlxuICAgIDx1bFxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdWxcIlxuICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLW9wdGlvbnMtaW4tYnViYmxlXT1cIlxuICAgICAgICBtZXNzYWdlT3B0aW9uc1RyaWdnZXIgPT09ICdtZXNzYWdlLWJ1YmJsZSdcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPGxpXG4gICAgICAgICNwYXJlbnRNZXNzYWdlRWxlbWVudFxuICAgICAgICAqbmdJZj1cIm1vZGUgPT09ICd0aHJlYWQnICYmIHBhcmVudE1lc3NhZ2VcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInBhcmVudC1tZXNzYWdlXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fcGFyZW50LW1lc3NhZ2UtbGlcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZUNvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgbWVzc2FnZTogcGFyZW50TWVzc2FnZSwgaW5kZXg6ICdwYXJlbnQnIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJyZXBseS1jb3VudFwiIGNsYXNzPVwic3RyLWNoYXRfX3RocmVhZC1zdGFydFwiPlxuICAgICAgICAgIHt7cGFyZW50TWVzc2FnZT8ucmVwbHlfY291bnQgPT09IDEgPyAoJ3N0cmVhbUNoYXQuMSByZXBseScgfCB0cmFuc2xhdGUpIDogKCdzdHJlYW1DaGF0Lnt7IHJlcGx5Q291bnQgfX1cbiAgICAgICAgICByZXBsaWVzJyB8IHRyYW5zbGF0ZTpyZXBseUNvdW50UGFyYW0pfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2xpPlxuICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvclxuICAgICAgICBkYXRhLXRlc3RpZD1cInRvcC1sb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgaXNMb2FkaW5nICYmIGRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnICYmIGRpc3BsYXlMb2FkaW5nSW5kaWNhdG9yXG4gICAgICAgIFwiXG4gICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3I+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZXMkIHwgYXN5bmMgYXMgbWVzc2FnZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IG1lc3NhZ2Ugb2YgbWVzc2FnZXM7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBmaXJzdDtcbiAgICAgICAgICAgIGxldCBpc0xhc3QgPSBsYXN0O1xuICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VJZFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZS5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VEYXRlKG1lc3NhZ2UuY3JlYXRlZF9hdCksXG4gICAgICAgICAgICAgICAgICBpc05ld01lc3NhZ2U6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwibWVzc2FnZVwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19saSBzdHItY2hhdF9fbGktLXt7IGdyb3VwU3R5bGVzW2ldIH19XCJcbiAgICAgICAgICAgIGlkPVwie3sgbWVzc2FnZS5pZCB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZUNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IG1lc3NhZ2UsIGluZGV4OiBpIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIChsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZS5pZCAmJlxuICAgICAgICAgICAgICAgICFpc0xhc3QgJiZcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyAmJlxuICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAoIWRpc3BsYXlEYXRlU2VwYXJhdG9yIHx8XG4gICAgICAgICAgICAgICAgICAhYXJlT25TZXBhcmF0ZURhdGVzKG1lc3NhZ2UsIG1lc3NhZ2VzW2kgKyAxXSkpKSB8fFxuICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiZcbiAgICAgICAgICAgICAgICAhaXNMYXN0ICYmXG4gICAgICAgICAgICAgICAgIWlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZSkgJiZcbiAgICAgICAgICAgICAgICBsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZXNbaSArIDFdLmlkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvclxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcmVPblNlcGFyYXRlRGF0ZXMobWVzc2FnZSwgbWVzc2FnZXNbaSArIDFdKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZURhdGUobWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQpLFxuICAgICAgICAgICAgICAgICAgaXNOZXdNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkID09PSBsYXN0UmVhZE1lc3NhZ2VJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJiBmYWxzZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYm90dG9tLWxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpc0xvYWRpbmcgJiYgZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiYgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3JcbiAgICAgICAgXCJcbiAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvcj5cbiAgICA8L3VsPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFR5cGluZ0luZGljYXRvciBsZXQtdXNlcnNUeXBpbmckPVwidXNlcnNUeXBpbmckXCI+XG4gICAgICA8IS0tIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvbm8tYW55IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiRhbnkodXNlcnNUeXBpbmckIHwgYXN5bmMpIGFzIHVzZXJzXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInVzZXJzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwidHlwaW5nLWluZGljYXRvclwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvciBzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvci0tdHlwaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90c1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwidHlwaW5nLXVzZXJzXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX3VzZXJzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICB1c2Vycy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IChcInN0cmVhbUNoYXQudXNlciBpcyB0eXBpbmdcIlxuICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdXNlcjogZ2V0VHlwaW5nSW5kaWNhdG9yVGV4dCh1c2VycykgfSlcbiAgICAgICAgICAgICAgICA6IChcInN0cmVhbUNoYXQudXNlcnMgYXJlIHR5cGluZ1wiXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB1c2VyczogZ2V0VHlwaW5nSW5kaWNhdG9yVGV4dCh1c2VycykgfSlcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICB0eXBpbmdJbmRpY2F0b3JUZW1wbGF0ZSB8fCBkZWZhdWx0VHlwaW5nSW5kaWNhdG9yO1xuICAgICAgICBjb250ZXh0OiBnZXRUeXBpbmdJbmRpY2F0b3JDb250ZXh0KClcbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInN0ci1jaGF0X19qdW1wLXRvLWxhdGVzdC1tZXNzYWdlXCI+XG4gIDxidXR0b25cbiAgICBkYXRhLXRlc3RpZD1cInNjcm9sbC10by1sYXRlc3RcIlxuICAgICpuZ0lmPVwiXG4gICAgICBpc1VzZXJTY3JvbGxlZCAmJlxuICAgICAgKCFpc1Njcm9sbEluUHJvZ3Jlc3MgfHwgIWhpZGVKdW1wVG9MYXRlc3RCdXR0b25EdXJpbmdTY3JvbGwpXG4gICAgXCJcbiAgICBjbGFzcz1cIlxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3RcbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvbi1zY3JvbGwtdG8tbGF0ZXN0LXJpZ2h0XG4gICAgICBzdHItY2hhdF9fY2lyY2xlLWZhYlxuICAgIFwiXG4gICAgKGtleXVwLmVudGVyKT1cImp1bXBUb0xhdGVzdE1lc3NhZ2UoKVwiXG4gICAgKGNsaWNrKT1cImp1bXBUb0xhdGVzdE1lc3NhZ2UoKVwiXG4gID5cbiAgICA8c3RyZWFtLWljb25cbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LWljb24gc3RyLWNoYXRfX2NpcmNsZS1mYWItaWNvblwiXG4gICAgICBbaWNvbl09XCJkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyA/ICdhcnJvdy1kb3duJyA6ICdhcnJvdy11cCdcIlxuICAgID48L3N0cmVhbS1pY29uPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidW5yZWFkTWVzc2FnZUNvdW50ID4gMFwiXG4gICAgICBjbGFzcz1cIlxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb25cbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3QtdW5yZWFkLWNvdW50XG4gICAgICAgIHN0ci1jaGF0X19qdW1wLXRvLWxhdGVzdC11bnJlYWQtY291bnRcbiAgICAgIFwiXG4gICAgPlxuICAgICAge3sgdW5yZWFkTWVzc2FnZUNvdW50IH19XG4gICAgPC9kaXY+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZVRlbXBsYXRlQ29udGFpbmVyIGxldC1tZXNzYWdlPVwibWVzc2FnZVwiIGxldC1pbmRleD1cImluZGV4XCI+XG4gIDxuZy10ZW1wbGF0ZVxuICAgICNkZWZhdWx0TWVzc2FnZVRlbXBsYXRlXG4gICAgbGV0LW1lc3NhZ2VJbnB1dD1cIm1lc3NhZ2VcIlxuICAgIGxldC1pc0xhc3RTZW50TWVzc2FnZT1cImlzTGFzdFNlbnRNZXNzYWdlXCJcbiAgICBsZXQtZW5hYmxlZE1lc3NhZ2VBY3Rpb25zPVwiZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXCJcbiAgICBsZXQtbW9kZT1cIm1vZGVcIlxuICAgIGxldC1pc0hpZ2hsaWdodGVkPVwiaXNIaWdobGlnaHRlZFwiXG4gICAgbGV0LWN1c3RvbUFjdGlvbnM9XCJjdXN0b21BY3Rpb25zXCJcbiAgPlxuICAgIDxzdHJlYW0tbWVzc2FnZVxuICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZUlucHV0XCJcbiAgICAgIFtpc0xhc3RTZW50TWVzc2FnZV09XCJpc0xhc3RTZW50TWVzc2FnZVwiXG4gICAgICBbZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXT1cImVuYWJsZWRNZXNzYWdlQWN0aW9uc1wiXG4gICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgIFtpc0hpZ2hsaWdodGVkXT1cImlzSGlnaGxpZ2h0ZWRcIlxuICAgICAgW2N1c3RvbUFjdGlvbnNdPVwiY3VzdG9tQWN0aW9uc1wiXG4gICAgPjwvc3RyZWFtLW1lc3NhZ2U+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgbWVzc2FnZVRlbXBsYXRlIHx8IGRlZmF1bHRNZXNzYWdlVGVtcGxhdGU7XG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIGlzTGFzdFNlbnRNZXNzYWdlOiAhIShcbiAgICAgICAgICBsYXN0U2VudE1lc3NhZ2VJZCAmJiBtZXNzYWdlPy5pZCA9PT0gbGFzdFNlbnRNZXNzYWdlSWRcbiAgICAgICAgKSxcbiAgICAgICAgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiBlbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgIGlzSGlnaGxpZ2h0ZWQ6XG4gICAgICAgICAgbWVzc2FnZT8uaWQgPT09IGhpZ2hsaWdodGVkTWVzc2FnZUlkICYmXG4gICAgICAgICAgIWlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSxcbiAgICAgICAgY3VzdG9tQWN0aW9uczogY3VzdG9tTWVzc2FnZUFjdGlvbnNcbiAgICAgIH1cbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2RhdGVTZXBhcmF0b3JcbiAgbGV0LWRhdGU9XCJkYXRlXCJcbiAgbGV0LXBhcnNlZERhdGU9XCJwYXJzZWREYXRlXCJcbiAgbGV0LWlzTmV3TWVzc2FnZT1cImlzTmV3TWVzc2FnZVwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5RGF0ZVNlcGFyYXRvclwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZSB8fCBkZWZhdWx0RGF0ZVNlcGFyYXRvcjtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGRhdGU6IGRhdGUsXG4gICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VkRGF0ZSxcbiAgICAgICAgICBpc05ld01lc3NhZ2U6IGlzTmV3TWVzc2FnZVxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHREYXRlU2VwYXJhdG9yXG4gICAgbGV0LWRhdGU9XCJkYXRlXCJcbiAgICBsZXQtcGFyc2VkRGF0ZT1cInBhcnNlZERhdGVcIlxuICAgIGxldC1pc05ld01lc3NhZ2U9XCJpc05ld01lc3NhZ2VcIlxuICA+XG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cImRhdGUtc2VwYXJhdG9yXCIgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3JcIj5cbiAgICAgIDxoclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAncmlnaHQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1saW5lXCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWRhdGVcIj5cbiAgICAgICAge3sgcGFyc2VkRGF0ZSB9fVxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwiaXNOZXdNZXNzYWdlXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1tZXNzYWdlcy1pbmRpY2F0b3ItZGF0ZS1zZXBhcmF0b3JcIlxuICAgICAgICAgID7igKIge3sgXCJzdHJlYW1DaGF0Lk5ld1wiIHwgdHJhbnNsYXRlIH19PC9zcGFuXG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuICAgICAgPGhyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdsZWZ0JyB8fCBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2NlbnRlcidcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TmV3TWVzc2FnZXNJbmRpY2F0b3I+XG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJuZXctbWVzc2FnZXMtaW5kaWNhdG9yXCIgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3JcIj5cbiAgICA8aHJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAncmlnaHQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgIC8+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1kYXRlXCIgdHJhbnNsYXRlPnN0cmVhbUNoYXQuTmV3PC9kaXY+XG4gICAgPGhyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2xlZnQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
521
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssRUFPTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVbEQsT0FBTyxFQUFFLGNBQWMsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBRzFDOztHQUVHO0FBTUgsTUFBTSxPQUFPLG9CQUFvQjtJQXVGL0IsWUFDVSxjQUE4QixFQUM5QixpQkFBb0MsRUFDcEMsc0JBQThDLEVBQzlDLFVBQTZCLEVBQzdCLE1BQWM7UUFKZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUF6RnhCOztXQUVHO1FBQ00sU0FBSSxHQUFzQixNQUFNLENBQUM7UUFDMUM7O1dBRUc7UUFDTSxjQUFTLEdBQXNDLGVBQWUsQ0FBQztRQUN4RTs7V0FFRztRQUNNLDBCQUFxQixHQUM1QixhQUFhLENBQUM7UUFDaEI7Ozs7V0FJRztRQUNNLHVDQUFr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QUExQyxLQUFLO2dCQUlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFJRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBS0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUlHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFLRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBT3dCLEtBQUs7c0JBQWxDLFdBQVc7dUJBQUMsT0FBTztnQkFlWixlQUFlO3NCQUR0QixTQUFTO3VCQUFDLGlCQUFpQjtnQkFHcEIsb0JBQW9CO3NCQUQzQixTQUFTO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgTWVzc2FnZUNvbnRleHQsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIFN0cmVhbU1lc3NhZ2UsXG4gIFR5cGluZ0luZGljYXRvckNvbnRleHQsXG4gIEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtLFxuICBEYXRlU2VwYXJhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEdyb3VwU3R5bGVzLCBHcm91cFN0eWxlIH0gZnJvbSAnLi9ncm91cC1zdHlsZXMnO1xuaW1wb3J0IHsgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBsaXN0VXNlcnMgfSBmcm9tICcuLi9saXN0LXVzZXJzJztcbmltcG9ydCB7IERhdGVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0ZS1wYXJzZXIuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIGBNZXNzYWdlTGlzdGAgY29tcG9uZW50IHJlbmRlcnMgYSBzY3JvbGxhYmxlIGxpc3Qgb2YgbWVzc2FnZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUxpc3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBtZXNzYWdlIGxpc3Qgc2hvdWxkIGRpc3BsYXkgY2hhbm5lbCBtZXNzYWdlcyBvciBbdGhyZWFkIG1lc3NhZ2VzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGU6ICdtYWluJyB8ICd0aHJlYWQnID0gJ21haW4nO1xuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIGxpc3QsIGBib3R0b20tdG8tdG9wYCBtZWFucyBuZXdlc3QgbWVzc2FnZSBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBtZXNzYWdlIGxpc3QgYW5kIHVzZXJzIHNjcm9sbCB1cHdhcmRzIHRvIGxvYWQgb2xkZXIgbWVzc2FnZXNcbiAgICovXG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogJ2JvdHRvbS10by10b3AnIHwgJ3RvcC10by1ib3R0b20nID0gJ2JvdHRvbS10by10b3AnO1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGF0IHRyaWdnZXJzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBtZXNzYWdlIG9wdGlvbnM6IGJ5IGRlZmF1bHQgeW91IGNhbiBob3ZlciAoY2xpY2sgb24gbW9iaWxlKSBhbnl3aGVyZSBpbiB0aGUgcm93IG9mIHRoZSBtZXNzYWdlIChgbWVzc2FnZS1yb3dgIG9wdGlvbiksIG9yIHlvdSBjYW4gc2V0IGBtZXNzYWdlLWJ1YmJsZWAsIGluIHRoYXQgY2FzZSBvbmx5IGEgaG92ZXIgKGNsaWNrIG9uIG1vYmlsZSkgaW4gdGhlIG1lc3NhZ2UgYnViYmxlIHdpbGwgdHJpZ2dlciB0aGUgb3B0aW9ucyB0byBhcHBlYXIuXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlT3B0aW9uc1RyaWdnZXI6ICdtZXNzYWdlLXJvdycgfCAnbWVzc2FnZS1idWJibGUnID1cbiAgICAnbWVzc2FnZS1yb3cnO1xuICAvKipcbiAgICogWW91IGNhbiBoaWRlIHRoZSBcImp1bXAgdG8gbGF0ZXN0XCIgYnV0dG9uIHdoaWxlIHNjcm9sbGluZy4gQSBwb3RlbnRpYWwgdXNlLWNhc2UgZm9yIHRoaXMgaW5wdXQgd291bGQgYmUgdG8gW3dvcmthcm91bmQgYSBrbm93biBpc3N1ZSBvbiBpT1MgU2FmYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9HZXRTdHJlYW0vc3RyZWFtLWNoYXQtYW5ndWxhci9pc3N1ZXMvNDE4KVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHNjcm9sbCBpc3N1ZSBoYXMgYmVlbiByZXNvbHZlZCwgbm8gbmVlZCB0byB1c2UgdGhpcyAgd29ya2Fyb3VuZCBhbnltb3JlLlxuICAgKi9cbiAgQElucHV0KCkgaGlkZUp1bXBUb0xhdGVzdEJ1dHRvbkR1cmluZ1Njcm9sbCA9IGZhbHNlO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGN1c3RvbSBtZXNzYWdlIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBtZXNzYWdlIGFjdGlvbiBib3hcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbU1lc3NhZ2VBY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbTxhbnk+W10gPSBbXTtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCBkYXRlIHNlcGFyYXRvcnMgd2lsbCBiZSBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlEYXRlU2VwYXJhdG9yID0gdHJ1ZTtcbiAgLyoqXG4gICAqIElmIGRhdGUgc2VwYXJhdG9ycyBhcmUgZGlzcGxheWVkLCB5b3UgY2FuIHNldCB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgZGF0ZSB0ZXh0LlxuICAgKiBJZiBgb3Blbk1lc3NhZ2VMaXN0QXRgIGlzIGBsYXN0LXJlYWQtbWVzc2FnZWAgaXQgd2lsbCBhbHNvIHNldCB0aGUgdGV4dCBwb3NpdGlvbiBvZiB0aGUgbmV3IG1lc3NhZ2VzIGluZGljYXRvci5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVTZXBhcmF0b3JUZXh0UG9zOiAnY2VudGVyJyB8ICdyaWdodCcgfCAnbGVmdCcgPSAnY2VudGVyJztcbiAgLyoqXG4gICAqIGBsYXN0LW1lc3NhZ2VgIG9wdGlvbiB3aWxsIG9wZW4gdGhlIG1lc3NhZ2UgbGlzdCBhdCB0aGUgbGFzdCBtZXNzYWdlLCBgbGFzdC1yZWFkLW1lc3NhZ2VgIHdpbGwgb3BlbiB0aGUgbGlzdCBhdCB0aGUgbGFzdCB1bnJlYWQgbWVzc2FnZS4gVGhpcyBvcHRpb24gb25seSB3b3JrcyBpZiBtb2RlIGlzIGBtYWluYC5cbiAgICovXG4gIEBJbnB1dCgpIG9wZW5NZXNzYWdlTGlzdEF0OiAnbGFzdC1tZXNzYWdlJyB8ICdsYXN0LXJlYWQtbWVzc2FnZScgPVxuICAgICdsYXN0LW1lc3NhZ2UnO1xuICAvKipcbiAgICogWW91IGNhbiB0dXJuIG9uIGFuZCBvZmYgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIHRoYXQgc2lnbmFscyB0byB1c2VycyB0aGF0IG1vcmUgbWVzc2FnZXMgYXJlIGJlaW5nIGxvYWRlZCB0byB0aGUgbWVzc2FnZSBsaXN0XG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5TG9hZGluZ0luZGljYXRvciA9IHRydWU7XG4gIHR5cGluZ0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUeXBpbmdJbmRpY2F0b3JDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxNZXNzYWdlQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8RGF0ZVNlcGFyYXRvckNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZXMkITogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBwcml2YXRlIGNsYXNzID1cbiAgICAnc3RyLWNoYXQtYW5ndWxhcl9fbWFpbi1wYW5lbC1pbm5lciBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWxpc3QtaG9zdCBzdHItY2hhdF9fbWFpbi1wYW5lbC1pbm5lcic7XG4gIHVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gIGlzVXNlclNjcm9sbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBncm91cFN0eWxlczogR3JvdXBTdHlsZVtdID0gW107XG4gIGlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZTogYm9vbGVhbltdID0gW107XG4gIGxhc3RTZW50TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHBhcmVudE1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBpc1Njcm9sbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgc2Nyb2xsRW5kVGltZW91dDogYW55O1xuICBsYXN0UmVhZE1lc3NhZ2VJZD86IHN0cmluZztcbiAgaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicpXG4gIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhcmVudE1lc3NhZ2VFbGVtZW50JylcbiAgcHJpdmF0ZSBwYXJlbnRNZXNzYWdlRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhdGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGhhc05ld01lc3NhZ2VzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbnRhaW5lckhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVyTWFzc2FnZXNMb2FkZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNOZXdNZXNzYWdlU2VudEJ5VXNlcjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIG5ld01lc3NhZ2VTdWJzY3JpcHRpb246IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwcmV2U2Nyb2xsVG9wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJbkNoYW5uZWwkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5UaHJlYWQkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIGlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIHByaXZhdGUgY2hhbm5lbElkPzogc3RyaW5nO1xuICBwcml2YXRlIHBhcnNlZERhdGVzID0gbmV3IE1hcDxEYXRlLCBzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZVBhcnNlcjogRGF0ZVBhcnNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbCQuc3Vic2NyaWJlKChjaGFubmVsKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGAke2NoYW5uZWw/LmNpZCB8fCAndW5kZWZpbmVkJ30gc2VsZWN0ZWRgLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbElkICE9PSBjaGFubmVsPy5pZCkge1xuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2U/LmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYG5ldyBjaGFubmVsIGlzIGRpZmZlcmVudCBmcm9tIHByZXYgY2hhbm5lbCwgcmVzZXRpbmcgc2Nyb2xsIHN0YXRlYCxcbiAgICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMucGFyc2VkRGF0ZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgdGhpcy5jaGFubmVsSWQgPSBjaGFubmVsPy5pZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLm9wZW5NZXNzYWdlTGlzdEF0ID09PSAnbGFzdC1yZWFkLW1lc3NhZ2UnICYmXG4gICAgICAgICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbExhc3RSZWFkTWVzc2FnZUlkO1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5pc0p1bXBpbmdUb0xhdGVzdFVucmVhZE1lc3NhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZSh0aGlzLmxhc3RSZWFkTWVzc2FnZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FwYWJpbGl0ZXMgPSBjaGFubmVsPy5kYXRhPy5vd25fY2FwYWJpbGl0aWVzIGFzIHN0cmluZ1tdO1xuICAgICAgICBpZiAoY2FwYWJpbGl0ZXMpIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyA9IGNhcGFiaWxpdGVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgICAgICB0aGlzLm5ld01lc3NhZ2VTdWJzY3JpcHRpb24gPSBjaGFubmVsLm9uKCdtZXNzYWdlLm5ldycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gSWYgd2UgZGlzcGxheSBtYWluIGNoYW5uZWwgbWVzc2FnZXMgYW5kIHdlJ3JlIHN3aXRjaGVkIHRvIGFuIG9sZGVyIG1lc3NhZ2Ugc2V0IC0+IHVzZSBtZXNzYWdlLm5ldyBldmVudCB0byB1cGRhdGUgdW5yZWFkIGNvdW50IGFuZCBkZXRlY3QgbmV3IG1lc3NhZ2VzIHNlbnQgYnkgY3VycmVudCB1c2VyXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFldmVudC5tZXNzYWdlIHx8XG4gICAgICAgICAgICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMgPT09IGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMgfHxcbiAgICAgICAgICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3TWVzc2FnZVJlY2VpdmVkKHtcbiAgICAgICAgICAgICAgaWQ6IGV2ZW50Lm1lc3NhZ2UuaWQsXG4gICAgICAgICAgICAgIHVzZXI6IGV2ZW50Lm1lc3NhZ2UudXNlcixcbiAgICAgICAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoZXZlbnQubWVzc2FnZS5jcmVhdGVkX2F0IHx8ICcnKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZVBhcmVudE1lc3NhZ2UkLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZSAmJlxuICAgICAgICAgIG1lc3NhZ2UuaWQgIT09IHRoaXMucGFyZW50TWVzc2FnZS5pZCAmJlxuICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5tZXNzYWdlVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmRhdGVTZXBhcmF0b3JUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbW5ld01lc3NhZ2VzSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnR5cGluZ0luZGljYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWwkID0gdGhpcy5jaGFubmVsU2VydmljZS51c2Vyc1R5cGluZ0luQ2hhbm5lbCQ7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJCA9IHRoaXMuY2hhbm5lbFNlcnZpY2UudXNlcnNUeXBpbmdJblRocmVhZCQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE1lc3NhZ2VzJCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1vZGUgfHwgY2hhbmdlcy5kaXJlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnZXMkKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmRpcmVjdGlvbikge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+XG4gICAgICAgIHRoaXMuc2Nyb2xsZWQoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZSRcbiAgICAgICAgLnBpcGUoZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnLmlkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgbGV0IG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdtYWluJykge1xuICAgICAgICAgICAgbWVzc2FnZUlkID0gY29uZmlnLnBhcmVudElkIHx8IGNvbmZpZy5pZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXJlbnRJZCkge1xuICAgICAgICAgICAgbWVzc2FnZUlkID0gY29uZmlnLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYEp1bXBpbmcgdG8gJHttZXNzYWdlSWQgfHwgJyd9YCxcbiAgICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlSWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbE1lc3NhZ2VJbnRvVmlldyhtZXNzYWdlSWQpO1xuICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gbWVzc2FnZUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkKSB7XG4gICAgICAvLyBUdXJuIG9mZiBwcm9ncmFtYXRpYyBzY3JvbGwgYWRqdXN0bWVudHMgd2hpbGUganVtcCB0byBtZXNzYWdlIGlzIGluIHByb2dyZXNzXG4gICAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyAmJlxuICAgICAgICAodGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyIHx8ICF0aGlzLmlzVXNlclNjcm9sbGVkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0XG4gICAgICAgICAgPyB0aGlzLnNjcm9sbFRvVG9wKClcbiAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmhhc05ld01lc3NhZ2VzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1VzZXJTY3JvbGxlZCB8fCB0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIpIHtcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYFVzZXIgaGFzIG5ldyBtZXNzYWdlcywgYW5kIG5vdCBzY3JvbGxlZCBvciBzZW50IG5ldyBtZXNzYWdlcywgdGhlcmVmb3JlIHdlICR7XG4gICAgICAgICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID8gJ3Njcm9sbCcgOiAnanVtcCdcbiAgICAgICAgICAgIH0gdG8gbGF0ZXN0IG1lc3NhZ2VgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICAgID8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGBPbGRlciBtZXNzYWdlcyBhcmUgbG9hZGVkLCB3ZSBwcmVzZXJ2ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uYCxcbiAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucHJlc2VydmVTY3JvbGxiYXJQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKSAhPT0gJ2JvdHRvbScgJiZcbiAgICAgICAgIXRoaXMuaXNVc2VyU2Nyb2xsZWQgJiZcbiAgICAgICAgIXRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICBgQ29udGFpbmVyIGdyZXcgYW5kIHVzZXIgZGlkbid0IHNjcm9sbCB0aGVyZWZvcmUgd2UgJHtcbiAgICAgICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID8gJ3Njcm9sbCcgOiAnanVtcCdcbiAgICAgICAgICB9IHRvIGxhdGVzdCBtZXNzYWdlYCxcbiAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0XG4gICAgICAgICAgPyB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxFbmRUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxFbmRUaW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5TWVzc2FnZUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIHRyYWNrQnlVc2VySWQoaW5kZXg6IG51bWJlciwgdXNlcjogVXNlclJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHVzZXIuaWQ7XG4gIH1cblxuICBqdW1wVG9MYXRlc3RNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlKFxuICAgICAgJ2xhdGVzdCcsXG4gICAgICB0aGlzLm1vZGUgPT09ICd0aHJlYWQnID8gdGhpcy5wYXJlbnRNZXNzYWdlPy5pZCA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBzY3JvbGxUb0JvdHRvbSgpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICB0aGlzLmZvcmNlUmVwYWludCgpO1xuICB9XG5cbiAgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICB9XG5cbiAgc2Nyb2xsZWQoKSB7XG4gICAgdGhpcy5pc1Njcm9sbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNTY3JvbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9LCAxMDApO1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID09PVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLmdldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICdpbmZvJyxcbiAgICAgIGBTY3JvbGxlZCAtIHNjcm9sbCBwb3NpdGlvbjogJHtzY3JvbGxQb3NpdGlvbn0sIGNvbnRhaW5lciBoZWlnaHQ6ICR7dGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHR9YCxcbiAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICApO1xuXG4gICAgY29uc3QgaXNVc2VyU2Nyb2xsZWQgPVxuICAgICAgKHRoaXMuZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCdcbiAgICAgICAgPyBzY3JvbGxQb3NpdGlvbiAhPT0gJ2JvdHRvbSdcbiAgICAgICAgOiBzY3JvbGxQb3NpdGlvbiAhPT0gJ3RvcCcpIHx8ICF0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdDtcbiAgICBpZiAodGhpcy5pc1VzZXJTY3JvbGxlZCAhPT0gaXNVc2VyU2Nyb2xsZWQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNVc2VyU2Nyb2xsZWQgPSBpc1VzZXJTY3JvbGxlZDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGVkKSB7XG4gICAgICAgICAgdGhpcy51bnJlYWRNZXNzYWdlQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRMb2FkTW9yZU1lc3NhZ2VzKHNjcm9sbFBvc2l0aW9uKSkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgbGV0IGRpcmVjdGlvbjogJ25ld2VyJyB8ICdvbGRlcic7XG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3RvcC10by1ib3R0b20nKSB7XG4gICAgICAgICAgZGlyZWN0aW9uID0gc2Nyb2xsUG9zaXRpb24gPT09ICd0b3AnID8gJ25ld2VyJyA6ICdvbGRlcic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlyZWN0aW9uID0gc2Nyb2xsUG9zaXRpb24gPT09ICd0b3AnID8gJ29sZGVyJyA6ICduZXdlcic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICAgICAgPyB0aGlzLmNoYW5uZWxTZXJ2aWNlLmxvYWRNb3JlTWVzc2FnZXMoZGlyZWN0aW9uKVxuICAgICAgICAgICAgOiB0aGlzLmNoYW5uZWxTZXJ2aWNlLmxvYWRNb3JlVGhyZWFkUmVwbGllcyhkaXJlY3Rpb24pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgIGBEaXNwbGF5aW5nIGxvYWRpbmcgaW5kaWNhdG9yYCxcbiAgICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucHJldlNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICB9XG5cbiAgZ2V0VHlwaW5nSW5kaWNhdG9yQ29udGV4dCgpOiBUeXBpbmdJbmRpY2F0b3JDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcnNUeXBpbmckOiB0aGlzLnVzZXJzVHlwaW5nJCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VHlwaW5nSW5kaWNhdG9yVGV4dCh1c2VyczogVXNlclJlc3BvbnNlW10pIHtcbiAgICBjb25zdCB0ZXh0ID0gbGlzdFVzZXJzKHVzZXJzKTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgaXNTZW50QnlDdXJyZW50VXNlcihtZXNzYWdlPzogU3RyZWFtTWVzc2FnZSkge1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXI/LmlkO1xuICB9XG5cbiAgcGFyc2VEYXRlKGRhdGU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5wYXJzZWREYXRlcy5oYXMoZGF0ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlZERhdGVzLmdldChkYXRlKTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMuZGF0ZVBhcnNlci5wYXJzZURhdGUoZGF0ZSk7XG4gICAgdGhpcy5wYXJzZWREYXRlcy5zZXQoZGF0ZSwgcGFyc2VkRGF0ZSk7XG4gICAgcmV0dXJuIHBhcnNlZERhdGU7XG4gIH1cblxuICBnZXQgcmVwbHlDb3VudFBhcmFtKCkge1xuICAgIHJldHVybiB7IHJlcGx5Q291bnQ6IHRoaXMucGFyZW50TWVzc2FnZT8ucmVwbHlfY291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlc2VydmVTY3JvbGxiYXJQb3NpdGlvbigpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XG4gICAgICAodGhpcy5wcmV2U2Nyb2xsVG9wIHx8IDApICtcbiAgICAgICh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCAtIHRoaXMuY29udGFpbmVySGVpZ2h0ISk7XG4gIH1cblxuICBwcml2YXRlIGZvcmNlUmVwYWludCgpIHtcbiAgICAvLyBTb2x2ZXMgdGhlIGlzc3VlIG9mIGVtcHR5IHNjcmVlbiBvbiBTYWZhcmkgd2hlbiBzY3JvbGxpbmdcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIG5vIG5lZWQgdG8gc3RvcmUgdGhpcyBhbnl3aGVyZSwgdGhlIHJlZmVyZW5jZSBpcyBlbm91Z2hcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsUG9zaXRpb24oKTogJ3RvcCcgfCAnYm90dG9tJyB8ICdtaWRkbGUnIHtcbiAgICBsZXQgcG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJyA9ICdtaWRkbGUnO1xuICAgIGlmIChcbiAgICAgIE1hdGguZmxvb3IodGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3ApIDw9XG4gICAgICAgICh0aGlzLnBhcmVudE1lc3NhZ2VFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCB8fCAwKSAmJlxuICAgICAgKHRoaXMucHJldlNjcm9sbFRvcCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHRoaXMucHJldlNjcm9sbFRvcCA+XG4gICAgICAgICAgKHRoaXMucGFyZW50TWVzc2FnZUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IDApKVxuICAgICkge1xuICAgICAgcG9zaXRpb24gPSAndG9wJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgTWF0aC5jZWlsKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSArXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0ID49XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodFxuICAgICkge1xuICAgICAgcG9zaXRpb24gPSAnYm90dG9tJztcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIHNob3VsZExvYWRNb3JlTWVzc2FnZXMoc2Nyb2xsUG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJykge1xuICAgIHJldHVybiBzY3JvbGxQb3NpdGlvbiAhPT0gJ21pZGRsZScgJiYgIXRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQ7XG4gIH1cblxuICBwcml2YXRlIHNldE1lc3NhZ2VzJCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VzJCA9IChcbiAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgID8gdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsTWVzc2FnZXMkXG4gICAgICAgIDogdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVUaHJlYWRNZXNzYWdlcyRcbiAgICApLnBpcGUoXG4gICAgICB0YXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYEVtcHR5IG1lc3NhZ2VzIGFycmF5LCByZXNldGluZyBzY3JvbGwgc3RhdGVgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYFJlY2VpdmVkIG9uZSBvciBtb3JlIG1lc3NhZ2VzYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjdXJyZW50TGF0ZXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICB0aGlzLm5ld01lc3NhZ2VSZWNlaXZlZChjdXJyZW50TGF0ZXN0TWVzc2FnZSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRPbGRlc3RNZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5vbGRlc3RNZXNzYWdlIHx8XG4gICAgICAgICAgIW1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IHRoaXMub2xkZXN0TWVzc2FnZSEuaWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IGN1cnJlbnRPbGRlc3RNZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMub2xkZXN0TWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKSA+XG4gICAgICAgICAgY3VycmVudE9sZGVzdE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRUaW1lKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5vbGRlc3RNZXNzYWdlID0gY3VycmVudE9sZGVzdE1lc3NhZ2U7XG4gICAgICAgICAgdGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YXAoXG4gICAgICAgIChtZXNzYWdlcykgPT5cbiAgICAgICAgICAodGhpcy5sYXN0U2VudE1lc3NhZ2VJZCA9IFsuLi5tZXNzYWdlc11cbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgICAobSkgPT5cbiAgICAgICAgICAgICAgICBtLnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LnVzZXI/LmlkICYmXG4gICAgICAgICAgICAgICAgbS5zdGF0dXMgIT09ICdzZW5kaW5nJ1xuICAgICAgICAgICAgKT8uaWQpXG4gICAgICApLFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9XG4gICAgICAgICAgIXRoaXMubGF0ZXN0TWVzc2FnZSB8fFxuICAgICAgICAgIG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdLmlkID09PSB0aGlzLmxhdGVzdE1lc3NhZ2UuaWQ7XG4gICAgICAgIGlmICghdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QpIHtcbiAgICAgICAgICB0aGlzLmlzVXNlclNjcm9sbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5pc0p1bXBpbmdUb0xhdGVzdFVucmVhZE1lc3NhZ2UgJiZcbiAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkICYmXG4gICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9PT0gdGhpcy5sYXRlc3RNZXNzYWdlPy5pZFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG1hcCgobWVzc2FnZXMpID0+XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgPyBtZXNzYWdlcyA6IFsuLi5tZXNzYWdlc10ucmV2ZXJzZSgpXG4gICAgICApLFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmdyb3VwU3R5bGVzID0gbWVzc2FnZXMubWFwKChtLCBpKSA9PlxuICAgICAgICAgIGdldEdyb3VwU3R5bGVzKG0sIG1lc3NhZ2VzW2kgLSAxXSwgbWVzc2FnZXNbaSArIDFdKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZSA9IG1lc3NhZ2VzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICB0aGlzLmNoZWNrSWZPblNlcGFyYXRlRGF0ZXMobSwgbWVzc2FnZXNbaSArIDFdKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNjcm9sbFN0YXRlKCkge1xuICAgIHRoaXMubGF0ZXN0TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gdHJ1ZTtcbiAgICB0aGlzLmlzVXNlclNjcm9sbGVkID0gZmFsc2U7XG4gICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5vbGRlc3RNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50ID0gMDtcbiAgICB0aGlzLnByZXZTY3JvbGxUb3AgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHVzZXJzVHlwaW5nJCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgPyB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWQkXG4gICAgICA6IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWwkO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkOiBzdHJpbmcsIHdpdGhSZXRyeSA9IHRydWUpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVzc2FnZUlkKTtcbiAgICBpZiAoIWVsZW1lbnQgJiYgd2l0aFJldHJ5KSB7XG4gICAgICAvLyBJZiB0aGUgbWVzc2FnZSB3YXMgbmV3bHkgaW5zZXJ0ZWQgaW50byBhY3RpdmVDaGFubmVsTWVzc2FnZXMkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbmRlcmVkIGFmdGVyIHRoZSBjdXJyZW50IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgLT4gd2FpdCBmb3IgdGhpcyBjeWNsZSB0byBjb21wbGV0ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbE1lc3NhZ2VJbnRvVmlldyhtZXNzYWdlSWQsIGZhbHNlKSk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgYmxvY2s6IG1lc3NhZ2VJZCA9PT0gdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA/ICdzdGFydCcgOiAnY2VudGVyJyxcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlID0gZmFsc2U7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvTGF0ZXN0TWVzc2FnZSh3aXRoUmV0cnkgPSB0cnVlKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubGF0ZXN0TWVzc2FnZSEuaWQpKSB7XG4gICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnXG4gICAgICAgID8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgIDogdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgIH0gZWxzZSBpZiAod2l0aFJldHJ5KSB7XG4gICAgICAvLyBJZiB0aGUgbWVzc2FnZSB3YXMgbmV3bHkgaW5zZXJ0ZWQgaW50byBhY3RpdmVDaGFubmVsTWVzc2FnZXMkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbmRlcmVkIGFmdGVyIHRoZSBjdXJyZW50IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgLT4gd2FpdCBmb3IgdGhpcyBjeWNsZSB0byBjb21wbGV0ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvTGF0ZXN0TWVzc2FnZShmYWxzZSksIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbmV3TWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2U6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXNlcj86IHsgaWQ6IHN0cmluZyB9IHwgbnVsbDtcbiAgfSkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmxhdGVzdE1lc3NhZ2UgfHxcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZS5jcmVhdGVkX2F0Py5nZXRUaW1lKCkgPCBtZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0VGltZSgpXG4gICAgKSB7XG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAnaW5mbycsXG4gICAgICAgIGBSZWNlaXZlZCBuZXcgbWVzc2FnZWAsXG4gICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IHRydWU7XG4gICAgICB0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIgPVxuICAgICAgICBtZXNzYWdlLnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LnVzZXI/LmlkO1xuICAgICAgaWYgKHRoaXMuaXNVc2VyU2Nyb2xsZWQpIHtcbiAgICAgICAgdGhpcy51bnJlYWRNZXNzYWdlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZPblNlcGFyYXRlRGF0ZXMoXG4gICAgbWVzc2FnZT86IFN0cmVhbU1lc3NhZ2UsXG4gICAgbmV4dE1lc3NhZ2U/OiBTdHJlYW1NZXNzYWdlXG4gICkge1xuICAgIGlmICghbWVzc2FnZSB8fCAhbmV4dE1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXREYXRlKCkgIT09IG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgbWVzc2FnZS5jcmVhdGVkX2F0LmdldEZ1bGxZZWFyKCkgIT09XG4gICAgICAgIG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgbWVzc2FnZS5jcmVhdGVkX2F0LmdldE1vbnRoKCkgIT09IG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0TW9udGgoKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiPGRpdlxuICAjc2Nyb2xsQ29udGFpbmVyXG4gIGRhdGEtdGVzdGlkPVwic2Nyb2xsLWNvbnRhaW5lclwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX2xpc3RcIlxuICBzdHlsZT1cIm92ZXJzY3JvbGwtYmVoYXZpb3I6IG5vbmVcIlxuPlxuICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3JldmVyc2UtaW5maW5pdGUtc2Nyb2xsIHN0ci1jaGF0X19tZXNzYWdlLWxpc3Qtc2Nyb2xsXCI+XG4gICAgPHVsXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X191bFwiXG4gICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utb3B0aW9ucy1pbi1idWJibGVdPVwiXG4gICAgICAgIG1lc3NhZ2VPcHRpb25zVHJpZ2dlciA9PT0gJ21lc3NhZ2UtYnViYmxlJ1xuICAgICAgXCJcbiAgICA+XG4gICAgICA8bGlcbiAgICAgICAgI3BhcmVudE1lc3NhZ2VFbGVtZW50XG4gICAgICAgICpuZ0lmPVwibW9kZSA9PT0gJ3RocmVhZCcgJiYgcGFyZW50TWVzc2FnZVwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwicGFyZW50LW1lc3NhZ2VcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19wYXJlbnQtbWVzc2FnZS1saVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlQ29udGFpbmVyO1xuICAgICAgICAgICAgY29udGV4dDogeyBtZXNzYWdlOiBwYXJlbnRNZXNzYWdlLCBpbmRleDogJ3BhcmVudCcgfVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cInJlcGx5LWNvdW50XCIgY2xhc3M9XCJzdHItY2hhdF9fdGhyZWFkLXN0YXJ0XCI+XG4gICAgICAgICAge3twYXJlbnRNZXNzYWdlPy5yZXBseV9jb3VudCA9PT0gMSA/ICgnc3RyZWFtQ2hhdC4xIHJlcGx5JyB8IHRyYW5zbGF0ZSkgOiAoJ3N0cmVhbUNoYXQue3sgcmVwbHlDb3VudCB9fVxuICAgICAgICAgIHJlcGxpZXMnIHwgdHJhbnNsYXRlOnJlcGx5Q291bnRQYXJhbSl9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbGk+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yXG4gICAgICAgIGRhdGEtdGVzdGlkPVwidG9wLWxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpc0xvYWRpbmcgJiYgZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgJiYgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3JcbiAgICAgICAgXCJcbiAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlcyQgfCBhc3luYyBhcyBtZXNzYWdlc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSBvZiBtZXNzYWdlcztcbiAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgICAgICBsZXQgaXNGaXJzdCA9IGZpcnN0O1xuICAgICAgICAgICAgbGV0IGlzTGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5TWVzc2FnZUlkXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0ZpcnN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZGF0ZVNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICBkYXRlOiBtZXNzYWdlLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZURhdGUobWVzc2FnZS5jcmVhdGVkX2F0KSxcbiAgICAgICAgICAgICAgICAgIGlzTmV3TWVzc2FnZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGxpXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJtZXNzYWdlXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2xpIHN0ci1jaGF0X19saS0te3sgZ3JvdXBTdHlsZXNbaV0gfX1cIlxuICAgICAgICAgICAgaWQ9XCJ7eyBtZXNzYWdlLmlkIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgbWVzc2FnZTogbWVzc2FnZSwgaW5kZXg6IGkgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgKGxhc3RSZWFkTWVzc2FnZUlkID09PSBtZXNzYWdlLmlkICYmXG4gICAgICAgICAgICAgICAgIWlzTGFzdCAmJlxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnICYmXG4gICAgICAgICAgICAgICAgIWlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZXNbaSArIDFdKSAmJlxuICAgICAgICAgICAgICAgICghZGlzcGxheURhdGVTZXBhcmF0b3IgfHwgIWlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZVtpXSkpIHx8XG4gICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJlxuICAgICAgICAgICAgICAgICFpc0xhc3QgJiZcbiAgICAgICAgICAgICAgICAhaXNTZW50QnlDdXJyZW50VXNlcihtZXNzYWdlKSAmJlxuICAgICAgICAgICAgICAgIGxhc3RSZWFkTWVzc2FnZUlkID09PSBtZXNzYWdlc1tpICsgMV0uaWQpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlIHx8XG4gICAgICAgICAgICAgICAgZGVmYXVsdE5ld01lc3NhZ2VzSW5kaWNhdG9yXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZVtpXVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZURhdGUobWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQpLFxuICAgICAgICAgICAgICAgICAgaXNOZXdNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkID09PSBsYXN0UmVhZE1lc3NhZ2VJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJiBmYWxzZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYm90dG9tLWxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpc0xvYWRpbmcgJiYgZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiYgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3JcbiAgICAgICAgXCJcbiAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvcj5cbiAgICA8L3VsPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFR5cGluZ0luZGljYXRvciBsZXQtdXNlcnNUeXBpbmckPVwidXNlcnNUeXBpbmckXCI+XG4gICAgICA8IS0tIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvbm8tYW55IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiRhbnkodXNlcnNUeXBpbmckIHwgYXN5bmMpIGFzIHVzZXJzXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInVzZXJzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwidHlwaW5nLWluZGljYXRvclwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvciBzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvci0tdHlwaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90c1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwidHlwaW5nLXVzZXJzXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX3VzZXJzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICB1c2Vycy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IChcInN0cmVhbUNoYXQudXNlciBpcyB0eXBpbmdcIlxuICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdXNlcjogZ2V0VHlwaW5nSW5kaWNhdG9yVGV4dCh1c2VycykgfSlcbiAgICAgICAgICAgICAgICA6IChcInN0cmVhbUNoYXQudXNlcnMgYXJlIHR5cGluZ1wiXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB1c2VyczogZ2V0VHlwaW5nSW5kaWNhdG9yVGV4dCh1c2VycykgfSlcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICB0eXBpbmdJbmRpY2F0b3JUZW1wbGF0ZSB8fCBkZWZhdWx0VHlwaW5nSW5kaWNhdG9yO1xuICAgICAgICBjb250ZXh0OiBnZXRUeXBpbmdJbmRpY2F0b3JDb250ZXh0KClcbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInN0ci1jaGF0X19qdW1wLXRvLWxhdGVzdC1tZXNzYWdlXCI+XG4gIDxidXR0b25cbiAgICBkYXRhLXRlc3RpZD1cInNjcm9sbC10by1sYXRlc3RcIlxuICAgICpuZ0lmPVwiXG4gICAgICBpc1VzZXJTY3JvbGxlZCAmJlxuICAgICAgKCFpc1Njcm9sbEluUHJvZ3Jlc3MgfHwgIWhpZGVKdW1wVG9MYXRlc3RCdXR0b25EdXJpbmdTY3JvbGwpXG4gICAgXCJcbiAgICBjbGFzcz1cIlxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3RcbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvbi1zY3JvbGwtdG8tbGF0ZXN0LXJpZ2h0XG4gICAgICBzdHItY2hhdF9fY2lyY2xlLWZhYlxuICAgIFwiXG4gICAgKGtleXVwLmVudGVyKT1cImp1bXBUb0xhdGVzdE1lc3NhZ2UoKVwiXG4gICAgKGNsaWNrKT1cImp1bXBUb0xhdGVzdE1lc3NhZ2UoKVwiXG4gID5cbiAgICA8c3RyZWFtLWljb25cbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LWljb24gc3RyLWNoYXRfX2NpcmNsZS1mYWItaWNvblwiXG4gICAgICBbaWNvbl09XCJkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyA/ICdhcnJvdy1kb3duJyA6ICdhcnJvdy11cCdcIlxuICAgID48L3N0cmVhbS1pY29uPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidW5yZWFkTWVzc2FnZUNvdW50ID4gMFwiXG4gICAgICBjbGFzcz1cIlxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb25cbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3QtdW5yZWFkLWNvdW50XG4gICAgICAgIHN0ci1jaGF0X19qdW1wLXRvLWxhdGVzdC11bnJlYWQtY291bnRcbiAgICAgIFwiXG4gICAgPlxuICAgICAge3sgdW5yZWFkTWVzc2FnZUNvdW50IH19XG4gICAgPC9kaXY+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZVRlbXBsYXRlQ29udGFpbmVyIGxldC1tZXNzYWdlPVwibWVzc2FnZVwiIGxldC1pbmRleD1cImluZGV4XCI+XG4gIDxuZy10ZW1wbGF0ZVxuICAgICNkZWZhdWx0TWVzc2FnZVRlbXBsYXRlXG4gICAgbGV0LW1lc3NhZ2VJbnB1dD1cIm1lc3NhZ2VcIlxuICAgIGxldC1pc0xhc3RTZW50TWVzc2FnZT1cImlzTGFzdFNlbnRNZXNzYWdlXCJcbiAgICBsZXQtZW5hYmxlZE1lc3NhZ2VBY3Rpb25zPVwiZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXCJcbiAgICBsZXQtbW9kZT1cIm1vZGVcIlxuICAgIGxldC1pc0hpZ2hsaWdodGVkPVwiaXNIaWdobGlnaHRlZFwiXG4gICAgbGV0LWN1c3RvbUFjdGlvbnM9XCJjdXN0b21BY3Rpb25zXCJcbiAgPlxuICAgIDxzdHJlYW0tbWVzc2FnZVxuICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZUlucHV0XCJcbiAgICAgIFtpc0xhc3RTZW50TWVzc2FnZV09XCJpc0xhc3RTZW50TWVzc2FnZVwiXG4gICAgICBbZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXT1cImVuYWJsZWRNZXNzYWdlQWN0aW9uc1wiXG4gICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgIFtpc0hpZ2hsaWdodGVkXT1cImlzSGlnaGxpZ2h0ZWRcIlxuICAgICAgW2N1c3RvbUFjdGlvbnNdPVwiY3VzdG9tQWN0aW9uc1wiXG4gICAgPjwvc3RyZWFtLW1lc3NhZ2U+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgbWVzc2FnZVRlbXBsYXRlIHx8IGRlZmF1bHRNZXNzYWdlVGVtcGxhdGU7XG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIGlzTGFzdFNlbnRNZXNzYWdlOiAhIShcbiAgICAgICAgICBsYXN0U2VudE1lc3NhZ2VJZCAmJiBtZXNzYWdlPy5pZCA9PT0gbGFzdFNlbnRNZXNzYWdlSWRcbiAgICAgICAgKSxcbiAgICAgICAgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiBlbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgIGlzSGlnaGxpZ2h0ZWQ6XG4gICAgICAgICAgbWVzc2FnZT8uaWQgPT09IGhpZ2hsaWdodGVkTWVzc2FnZUlkICYmXG4gICAgICAgICAgIWlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSxcbiAgICAgICAgY3VzdG9tQWN0aW9uczogY3VzdG9tTWVzc2FnZUFjdGlvbnNcbiAgICAgIH1cbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2RhdGVTZXBhcmF0b3JcbiAgbGV0LWRhdGU9XCJkYXRlXCJcbiAgbGV0LXBhcnNlZERhdGU9XCJwYXJzZWREYXRlXCJcbiAgbGV0LWlzTmV3TWVzc2FnZT1cImlzTmV3TWVzc2FnZVwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5RGF0ZVNlcGFyYXRvclwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZSB8fCBkZWZhdWx0RGF0ZVNlcGFyYXRvcjtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGRhdGU6IGRhdGUsXG4gICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VkRGF0ZSxcbiAgICAgICAgICBpc05ld01lc3NhZ2U6IGlzTmV3TWVzc2FnZVxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHREYXRlU2VwYXJhdG9yXG4gICAgbGV0LWRhdGU9XCJkYXRlXCJcbiAgICBsZXQtcGFyc2VkRGF0ZT1cInBhcnNlZERhdGVcIlxuICAgIGxldC1pc05ld01lc3NhZ2U9XCJpc05ld01lc3NhZ2VcIlxuICA+XG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cImRhdGUtc2VwYXJhdG9yXCIgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3JcIj5cbiAgICAgIDxoclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAncmlnaHQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1saW5lXCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWRhdGVcIj5cbiAgICAgICAge3sgcGFyc2VkRGF0ZSB9fVxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwiaXNOZXdNZXNzYWdlXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1tZXNzYWdlcy1pbmRpY2F0b3ItZGF0ZS1zZXBhcmF0b3JcIlxuICAgICAgICAgID7igKIge3sgXCJzdHJlYW1DaGF0Lk5ld1wiIHwgdHJhbnNsYXRlIH19PC9zcGFuXG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuICAgICAgPGhyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdsZWZ0JyB8fCBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2NlbnRlcidcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TmV3TWVzc2FnZXNJbmRpY2F0b3I+XG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJuZXctbWVzc2FnZXMtaW5kaWNhdG9yXCIgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3JcIj5cbiAgICA8aHJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAncmlnaHQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgIC8+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1kYXRlXCIgdHJhbnNsYXRlPnN0cmVhbUNoYXQuTmV3PC9kaXY+XG4gICAgPGhyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2xlZnQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==