stream-chat-angular 4.10.0 → 4.11.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.
@@ -1,2 +1,2 @@
1
- export const version = '4.10.0';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2Fzc2V0cy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdmVyc2lvbiA9ICc0LjEwLjAnO1xuIl19
1
+ export const version = '4.11.0';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2Fzc2V0cy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdmVyc2lvbiA9ICc0LjExLjAnO1xuIl19
@@ -1,4 +1,4 @@
1
- import { Component, HostBinding, Input, ViewChild, } from '@angular/core';
1
+ import { Component, EventEmitter, HostBinding, Input, Output, ViewChild, } from '@angular/core';
2
2
  import prettybytes from 'pretty-bytes';
3
3
  import { isImageAttachment } from '../is-image-attachment';
4
4
  import * as i0 from "@angular/core";
@@ -22,6 +22,10 @@ export class AttachmentListComponent {
22
22
  * The attachments to display
23
23
  */
24
24
  this.attachments = [];
25
+ /**
26
+ * Emits the state of the image carousel window
27
+ */
28
+ this.imageModalStateChange = new EventEmitter();
25
29
  this.class = 'str-chat__attachment-list-angular-host';
26
30
  this.orderedAttachments = [];
27
31
  this.imagesToView = [];
@@ -107,6 +111,7 @@ export class AttachmentListComponent {
107
111
  return item.value;
108
112
  }
109
113
  openImageModal(attachments, selectedIndex = 0) {
114
+ this.imageModalStateChange.next('opened');
110
115
  this.imagesToView = attachments;
111
116
  this.imagesToViewCurrentIndex = selectedIndex;
112
117
  }
@@ -166,11 +171,12 @@ export class AttachmentListComponent {
166
171
  ];
167
172
  }
168
173
  closeImageModal() {
174
+ this.imageModalStateChange.next('closed');
169
175
  this.imagesToView = [];
170
176
  }
171
177
  }
172
178
  AttachmentListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentListComponent, deps: [{ token: i1.CustomTemplatesService }, { token: i2.ChannelService }, { token: i3.AttachmentConfigurationService }, { token: i4.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
173
- AttachmentListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", parentMessageId: "parentMessageId", attachments: "attachments" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["modalContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"orderedAttachments.length > 0\" class=\"str-chat__attachment-list\">\n <ng-container\n *ngFor=\"let attachment of orderedAttachments; trackBy: trackByUrl\"\n >\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }} str-chat__message-attachment-dynamic-size\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n [class.str-chat__message-attachment-with-actions]=\"\n attachment.actions && attachment.actions.length > 0\n \"\n [class.str-chat__message-attachment--svg-image]=\"isSvg(attachment)\"\n >\n <img\n #imgElement\n *ngIf=\"isImage(attachment)\"\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"\n getImageAttachmentConfiguration(attachment, 'single', imgElement).url\n \"\n [alt]=\"attachment?.fallback\"\n (click)=\"openImageModal([attachment])\"\n (keyup.enter)=\"openImageModal([attachment])\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(attachment, 'single', imgElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(attachment, 'single', imgElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n attachment,\n 'single',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n attachment,\n 'single',\n imgElement\n ).width\n }\"\n />\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n *ngIf=\"isGallery(attachment)\"\n [class.str-chat__gallery--square]=\"(attachment?.images)!.length > 3\"\n [class.str-chat__gallery-two-rows]=\"(attachment?.images)!.length > 2\"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachment.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n (click)=\"openImageModal(attachment.images!, index)\"\n (keyup.enter)=\"openImageModal(attachment.images!, index)\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n >\n <img\n #imgElement\n [src]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).url\n \"\n [alt]=\"galleryImage.fallback\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).width\n }\"\n />\n </button>\n <button\n #element\n *ngIf=\"index === 3 && !isLast\"\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n data-testid=\"more-image-button\"\n (click)=\"openImageModal(attachment.images!, index)\"\n (keyup.enter)=\"openImageModal(attachment.images!, index)\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(galleryImage, 'gallery', element)\n .originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(galleryImage, 'gallery', element)\n .originalWidth\n \"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).url +\n ')',\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).width\n }\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate: { imageCount: attachment!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n <div\n class=\"str-chat__player-wrapper\"\n *ngIf=\"isVideo(attachment)\"\n data-testclass=\"video-attachment-parent\"\n [style.--original-height]=\"\n getVideoAttachmentConfiguration(attachment, videoElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getVideoAttachmentConfiguration(attachment, videoElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getVideoAttachmentConfiguration(attachment, videoElement)\n .height,\n width: getVideoAttachmentConfiguration(attachment, videoElement).width\n }\"\n >\n <video\n #videoElement\n class=\"str-chat__video-angular\"\n controls\n data-testclass=\"video-attachment\"\n [src]=\"getVideoAttachmentConfiguration(attachment, videoElement).url\"\n [poster]=\"\n getVideoAttachmentConfiguration(attachment, videoElement).thumbUrl\n \"\n ></video>\n </div>\n <a\n *ngIf=\"isFile(attachment)\"\n class=\"\n str-chat__message-attachment-file--item\n str-chat-angular__message-attachment-file-single\n \"\n style=\"cursor: pointer; text-decoration: none\"\n data-testclass=\"file-link\"\n href=\"{{ attachment.asset_url }}\"\n target=\"_blank\"\n >\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '1'\"\n icon=\"file\"\n [size]=\"30\"\n ></stream-icon-placeholder>\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '2'\"\n icon=\"unspecified-filetype\"\n [size]=\"30\"\n ></stream-icon-placeholder>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <div class=\"str-chat__message-attachment-file--item-first-row\">\n <div\n data-testclass=\"file-title\"\n class=\"str-chat__message-attachment-file--item-name\"\n >\n {{ attachment.title }}\n </div>\n <!-- Temporary disabled, will be fixed with this: https://github.com/GetStream/stream-chat-angular/issues/393 -->\n <!-- <a\n class=\"str-chat__message-attachment-file--item-download\"\n data-testclass=\"file-link\"\n download\n href=\"{{ attachment.asset_url }}\"\n target=\"_blank\"\n >\n <stream-icon-placeholder\n class=\"str-chat__message-attachment-download-icon\"\n icon=\"download\"\n ></stream-icon-placeholder>\n </a> -->\n </div>\n <span\n class=\"str-chat__message-attachment-file--item-size\"\n data-testclass=\"size\"\n *ngIf=\"hasFileSize(attachment)\"\n >{{ getFileSize(attachment) }}</span\n >\n </div>\n </a>\n <div\n *ngIf=\"\n isCard(attachment) &&\n getCardAttachmentConfiguration(attachment) as attachmentConfiguration\n \"\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachment.type\n }}\"\n >\n <div\n *ngIf=\"attachmentConfiguration.url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <img\n data-testclass=\"card-img\"\n alt=\"{{ attachmentConfiguration.url }}\"\n src=\"{{ attachmentConfiguration.url }}\"\n [ngStyle]=\"{\n height: attachmentConfiguration.height,\n width: attachmentConfiguration.width\n }\"\n />\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachment.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachment.title }}\n </div>\n <div\n *ngIf=\"attachment.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachment.text }}\n </div>\n <a\n class=\"str-chat__message-attachment-card--url\"\n *ngIf=\"attachment.title_link || attachment.og_scrape_url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n href=\"{{ attachment.title_link || attachment.og_scrape_url }}\"\n target=\"_blank\"\n >\n {{ trimUrl(attachment.title_link || attachment.og_scrape_url) }}\n </a>\n </div>\n </div>\n </div>\n <div\n class=\"str-chat__message-attachment-actions\"\n *ngIf=\"attachment.actions && attachment.actions.length > 0\"\n >\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"\n let action of attachment.actions;\n trackBy: trackByActionValue\n \"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n data-testclass=\"attachment-action\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"stream-chat-angular__image-modal-host\"\n [isOpen]=\"isOpen\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n [content]=\"content\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal str-chat__image-carousel\">\n <button\n class=\"\n stream-chat-angular__image-modal-stepper\n str-chat__image-carousel-stepper\n \"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\"></stream-icon-placeholder>\n </button>\n <img\n #imgElement\n class=\"\n stream-chat-angular__image-modal-image\n str-chat__image-carousel-image\n \"\n data-testid=\"modal-image\"\n [src]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).url\n \"\n [style.--original-height]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalWidth\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n [ngStyle]=\"{\n width: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).width,\n height: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).height\n }\"\n />\n <button\n class=\"\n stream-chat-angular__image-modal-stepper\n str-chat__image-carousel-stepper\n \"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n data-testid=\"image-modal-next\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\"></stream-icon-placeholder>\n </button>\n </div>\n</ng-template>\n", components: [{ type: i5.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: i6.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i8.TranslatePipe, "async": i7.AsyncPipe } });
179
+ AttachmentListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", parentMessageId: "parentMessageId", attachments: "attachments" }, outputs: { imageModalStateChange: "imageModalStateChange" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["modalContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"orderedAttachments.length > 0\" class=\"str-chat__attachment-list\">\n <ng-container\n *ngFor=\"let attachment of orderedAttachments; trackBy: trackByUrl\"\n >\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }} str-chat__message-attachment-dynamic-size\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n [class.str-chat__message-attachment-with-actions]=\"\n attachment.actions && attachment.actions.length > 0\n \"\n [class.str-chat__message-attachment--svg-image]=\"isSvg(attachment)\"\n >\n <img\n #imgElement\n *ngIf=\"isImage(attachment)\"\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"\n getImageAttachmentConfiguration(attachment, 'single', imgElement).url\n \"\n [alt]=\"attachment?.fallback\"\n (click)=\"openImageModal([attachment])\"\n (keyup.enter)=\"openImageModal([attachment])\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(attachment, 'single', imgElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(attachment, 'single', imgElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n attachment,\n 'single',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n attachment,\n 'single',\n imgElement\n ).width\n }\"\n />\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n *ngIf=\"isGallery(attachment)\"\n [class.str-chat__gallery--square]=\"(attachment?.images)!.length > 3\"\n [class.str-chat__gallery-two-rows]=\"(attachment?.images)!.length > 2\"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachment.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n (click)=\"openImageModal(attachment.images!, index)\"\n (keyup.enter)=\"openImageModal(attachment.images!, index)\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n >\n <img\n #imgElement\n [src]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).url\n \"\n [alt]=\"galleryImage.fallback\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).width\n }\"\n />\n </button>\n <button\n #element\n *ngIf=\"index === 3 && !isLast\"\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n data-testid=\"more-image-button\"\n (click)=\"openImageModal(attachment.images!, index)\"\n (keyup.enter)=\"openImageModal(attachment.images!, index)\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(galleryImage, 'gallery', element)\n .originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(galleryImage, 'gallery', element)\n .originalWidth\n \"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).url +\n ')',\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).width\n }\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate: { imageCount: attachment!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n <div\n class=\"str-chat__player-wrapper\"\n *ngIf=\"isVideo(attachment)\"\n data-testclass=\"video-attachment-parent\"\n [style.--original-height]=\"\n getVideoAttachmentConfiguration(attachment, videoElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getVideoAttachmentConfiguration(attachment, videoElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getVideoAttachmentConfiguration(attachment, videoElement)\n .height,\n width: getVideoAttachmentConfiguration(attachment, videoElement).width\n }\"\n >\n <video\n #videoElement\n class=\"str-chat__video-angular\"\n controls\n data-testclass=\"video-attachment\"\n [src]=\"getVideoAttachmentConfiguration(attachment, videoElement).url\"\n [poster]=\"\n getVideoAttachmentConfiguration(attachment, videoElement).thumbUrl\n \"\n ></video>\n </div>\n <a\n *ngIf=\"isFile(attachment)\"\n class=\"\n str-chat__message-attachment-file--item\n str-chat-angular__message-attachment-file-single\n \"\n style=\"cursor: pointer; text-decoration: none\"\n data-testclass=\"file-link\"\n href=\"{{ attachment.asset_url }}\"\n target=\"_blank\"\n >\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '1'\"\n icon=\"file\"\n [size]=\"30\"\n ></stream-icon-placeholder>\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '2'\"\n icon=\"unspecified-filetype\"\n [size]=\"30\"\n ></stream-icon-placeholder>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <div class=\"str-chat__message-attachment-file--item-first-row\">\n <div\n data-testclass=\"file-title\"\n class=\"str-chat__message-attachment-file--item-name\"\n >\n {{ attachment.title }}\n </div>\n <!-- Temporary disabled, will be fixed with this: https://github.com/GetStream/stream-chat-angular/issues/393 -->\n <!-- <a\n class=\"str-chat__message-attachment-file--item-download\"\n data-testclass=\"file-link\"\n download\n href=\"{{ attachment.asset_url }}\"\n target=\"_blank\"\n >\n <stream-icon-placeholder\n class=\"str-chat__message-attachment-download-icon\"\n icon=\"download\"\n ></stream-icon-placeholder>\n </a> -->\n </div>\n <span\n class=\"str-chat__message-attachment-file--item-size\"\n data-testclass=\"size\"\n *ngIf=\"hasFileSize(attachment)\"\n >{{ getFileSize(attachment) }}</span\n >\n </div>\n </a>\n <div\n *ngIf=\"\n isCard(attachment) &&\n getCardAttachmentConfiguration(attachment) as attachmentConfiguration\n \"\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachment.type\n }}\"\n >\n <div\n *ngIf=\"attachmentConfiguration.url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <img\n data-testclass=\"card-img\"\n alt=\"{{ attachmentConfiguration.url }}\"\n src=\"{{ attachmentConfiguration.url }}\"\n [ngStyle]=\"{\n height: attachmentConfiguration.height,\n width: attachmentConfiguration.width\n }\"\n />\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachment.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachment.title }}\n </div>\n <div\n *ngIf=\"attachment.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachment.text }}\n </div>\n <a\n class=\"str-chat__message-attachment-card--url\"\n *ngIf=\"attachment.title_link || attachment.og_scrape_url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n href=\"{{ attachment.title_link || attachment.og_scrape_url }}\"\n target=\"_blank\"\n >\n {{ trimUrl(attachment.title_link || attachment.og_scrape_url) }}\n </a>\n </div>\n </div>\n </div>\n <div\n class=\"str-chat__message-attachment-actions\"\n *ngIf=\"attachment.actions && attachment.actions.length > 0\"\n >\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"\n let action of attachment.actions;\n trackBy: trackByActionValue\n \"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n data-testclass=\"attachment-action\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"stream-chat-angular__image-modal-host\"\n [isOpen]=\"isOpen\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n [content]=\"content\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal str-chat__image-carousel\">\n <button\n class=\"\n stream-chat-angular__image-modal-stepper\n str-chat__image-carousel-stepper\n \"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\"></stream-icon-placeholder>\n </button>\n <img\n #imgElement\n class=\"\n stream-chat-angular__image-modal-image\n str-chat__image-carousel-image\n \"\n data-testid=\"modal-image\"\n [src]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).url\n \"\n [style.--original-height]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalWidth\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n [ngStyle]=\"{\n width: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).width,\n height: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).height\n }\"\n />\n <button\n class=\"\n stream-chat-angular__image-modal-stepper\n str-chat__image-carousel-stepper\n \"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n data-testid=\"image-modal-next\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\"></stream-icon-placeholder>\n </button>\n </div>\n</ng-template>\n", components: [{ type: i5.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: i6.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "translate": i8.TranslatePipe, "async": i7.AsyncPipe } });
174
180
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: AttachmentListComponent, decorators: [{
175
181
  type: Component,
176
182
  args: [{
@@ -184,10 +190,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
184
190
  type: Input
185
191
  }], attachments: [{
186
192
  type: Input
193
+ }], imageModalStateChange: [{
194
+ type: Output
187
195
  }], class: [{
188
196
  type: HostBinding
189
197
  }], modalContent: [{
190
198
  type: ViewChild,
191
199
  args: ['modalContent', { static: true }]
192
200
  }] } });
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdHRhY2htZW50LWxpc3QvYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdHRhY2htZW50LWxpc3QvYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssRUFJTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFTdkIsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7O0FBTTNEOztHQUVHO0FBTUgsTUFBTSxPQUFPLHVCQUF1QjtJQTJCbEMsWUFDa0Isc0JBQThDLEVBQ3RELGNBQThCLEVBQzlCLDhCQUE4RCxFQUN0RSxZQUEwQjtRQUhWLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDdEQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1DQUE4QixHQUE5Qiw4QkFBOEIsQ0FBZ0M7UUFyQnhFOztXQUVHO1FBQ00sZ0JBQVcsR0FBNEMsRUFBRSxDQUFDO1FBQ3BELFVBQUssR0FBRyx3Q0FBd0MsQ0FBQztRQUNoRSx1QkFBa0IsR0FBNEMsRUFBRSxDQUFDO1FBQ2pFLGlCQUFZLEdBQTRDLEVBQUUsQ0FBQztRQUMzRCw2QkFBd0IsR0FBRyxDQUFDLENBQUM7UUFJckIsNkJBQXdCLEdBSzVCLElBQUksR0FBRyxFQUFFLENBQUM7UUFRWixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7SUFDaEQsQ0FBQztJQUVELFdBQVcsQ0FB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dUJBQXVCO3dHQUF2Qix1QkFBdUIsb1dDaENwQywrK2JBK1pBOzJGRC9YYSx1QkFBdUI7a0JBTG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsV0FBVyxFQUFFLGtDQUFrQztvQkFDL0MsTUFBTSxFQUFFLEVBQUU7aUJBQ1g7a05BS1UsU0FBUztzQkFBakIsS0FBSztnQkFJRyxlQUFlO3NCQUF2QixLQUFLO2dCQUlHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ1MsS0FBSztzQkFBbkIsV0FBVztnQkFNSixZQUFZO3NCQURuQixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbiwgQXR0YWNobWVudCB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7XG4gIE1vZGFsQ29udGV4dCxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgQXR0YWNobWVudENvbmZpZ3JhdGlvbixcbiAgVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbixcbiAgSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbixcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHByZXR0eWJ5dGVzIGZyb20gJ3ByZXR0eS1ieXRlcyc7XG5pbXBvcnQgeyBpc0ltYWdlQXR0YWNobWVudCB9IGZyb20gJy4uL2lzLWltYWdlLWF0dGFjaG1lbnQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hdHRhY2htZW50LWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGUgYEF0dGFjaG1lbnRMaXN0YCBjb21wb250ZW50IGRpc3BsYXlzIHRoZSBhdHRhY2htZW50cyBvZiBhIG1lc3NhZ2VcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLWF0dGFjaG1lbnQtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdHRhY2htZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdGhlIGF0dGFjaG1lbnRzIGJlbG9uZyB0b1xuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IGlkIG9mIHRoZSBtZXNzYWdlIHRoZSBhdHRhY2htZW50cyBiZWxvbmcgdG9cbiAgICovXG4gIEBJbnB1dCgpIHBhcmVudE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIGF0dGFjaG1lbnRzIHRvIGRpc3BsYXlcbiAgICovXG4gIEBJbnB1dCgpIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50PERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10gPSBbXTtcbiAgQEhvc3RCaW5kaW5nKCkgY2xhc3MgPSAnc3RyLWNoYXRfX2F0dGFjaG1lbnQtbGlzdC1hbmd1bGFyLWhvc3QnO1xuICBvcmRlcmVkQXR0YWNobWVudHM6IEF0dGFjaG1lbnQ8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXSA9IFtdO1xuICBpbWFnZXNUb1ZpZXc6IEF0dGFjaG1lbnQ8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXSA9IFtdO1xuICBpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXggPSAwO1xuICB0aGVtZVZlcnNpb246ICcxJyB8ICcyJztcbiAgQFZpZXdDaGlsZCgnbW9kYWxDb250ZW50JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBtb2RhbENvbnRlbnQhOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgcHJpdmF0ZSBhdHRhY2htZW50Q29uZmlndXJhdGlvbnM6IE1hcDxcbiAgICBBdHRhY2htZW50LFxuICAgIHwgQXR0YWNobWVudENvbmZpZ3JhdGlvblxuICAgIHwgVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvblxuICAgIHwgSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvblxuICA+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlOiBBdHRhY2htZW50Q29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy50aGVtZVZlcnNpb24gPSB0aGVtZVNlcnZpY2UudGhlbWVWZXJzaW9uO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBjb25zdCBpbWFnZXMgPSB0aGlzLmF0dGFjaG1lbnRzLmZpbHRlcih0aGlzLmlzSW1hZ2UpO1xuICAgICAgY29uc3QgY29udGFpbnNHYWxsZXJ5ID0gaW1hZ2VzLmxlbmd0aCA+PSAyO1xuICAgICAgdGhpcy5vcmRlcmVkQXR0YWNobWVudHMgPSBbXG4gICAgICAgIC4uLihjb250YWluc0dhbGxlcnkgPyB0aGlzLmNyZWF0ZUdhbGxlcnkoaW1hZ2VzKSA6IGltYWdlcyksXG4gICAgICAgIC4uLnRoaXMuYXR0YWNobWVudHMuZmlsdGVyKChhKSA9PiB0aGlzLmlzVmlkZW8oYSkpLFxuICAgICAgICAuLi50aGlzLmF0dGFjaG1lbnRzLmZpbHRlcigoYSkgPT4gdGhpcy5pc0ZpbGUoYSkpLFxuICAgICAgXTtcbiAgICAgIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25zID0gbmV3IE1hcCgpO1xuICAgICAgLy8gRGlzcGxheSBsaW5rIGF0dGFjaG1lbnRzIG9ubHkgaWYgdGhlcmUgYXJlIG5vIG90aGVyIGF0dGFjaG1lbnRzXG4gICAgICAvLyBHaXBoeS1zIGFsd2F5cyBzZW50IHdpdGhvdXQgb3RoZXIgYXR0YWNobWVudHNcbiAgICAgIGlmICh0aGlzLm9yZGVyZWRBdHRhY2htZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5vcmRlcmVkQXR0YWNobWVudHMucHVzaChcbiAgICAgICAgICAuLi50aGlzLmF0dGFjaG1lbnRzLmZpbHRlcigoYSkgPT4gdGhpcy5pc0NhcmQoYSkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeVVybChfOiBudW1iZXIsIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXR0YWNobWVudC5pbWFnZV91cmwgfHxcbiAgICAgIGF0dGFjaG1lbnQuaW1nX3VybCB8fFxuICAgICAgYXR0YWNobWVudC5hc3NldF91cmwgfHxcbiAgICAgIGF0dGFjaG1lbnQudGh1bWJfdXJsXG4gICAgKTtcbiAgfVxuXG4gIGlzSW1hZ2UoYXR0YWNobWVudDogQXR0YWNobWVudCkge1xuICAgIHJldHVybiBpc0ltYWdlQXR0YWNobWVudChhdHRhY2htZW50KTtcbiAgfVxuXG4gIGlzU3ZnKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGF0dGFjaG1lbnQuZmFsbGJhY2sgfHwgJyc7XG4gICAgcmV0dXJuICEhZmlsZW5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLnN2ZycpO1xuICB9XG5cbiAgaXNGaWxlKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gYXR0YWNobWVudC50eXBlID09PSAnZmlsZSc7XG4gIH1cblxuICBpc0dhbGxlcnkoYXR0YWNobWVudDogQXR0YWNobWVudCkge1xuICAgIHJldHVybiBhdHRhY2htZW50LnR5cGUgPT09ICdnYWxsZXJ5JztcbiAgfVxuXG4gIGlzVmlkZW8oYXR0YWNobWVudDogQXR0YWNobWVudCkge1xuICAgIHJldHVybiAoXG4gICAgICBhdHRhY2htZW50LnR5cGUgPT09ICd2aWRlbycgJiZcbiAgICAgIGF0dGFjaG1lbnQuYXNzZXRfdXJsICYmXG4gICAgICAhYXR0YWNobWVudC5vZ19zY3JhcGVfdXJsIC8vIGxpbmtzIGZyb20gdmlkZW8gc2hhcmUgc2VydmljZXMgKHN1Y2ggYXMgWW91VHViZSBvciBGYWNlYm9vaykgYXJlIGNhbid0IGJlIHBsYXllZFxuICAgICk7XG4gIH1cblxuICBpc0NhcmQoYXR0YWNobWVudDogQXR0YWNobWVudCkge1xuICAgIHJldHVybiAoXG4gICAgICAhYXR0YWNobWVudC50eXBlIHx8XG4gICAgICAoYXR0YWNobWVudC50eXBlID09PSAnaW1hZ2UnICYmICF0aGlzLmlzSW1hZ2UoYXR0YWNobWVudCkpIHx8XG4gICAgICBhdHRhY2htZW50LnR5cGUgPT09ICdnaXBoeSdcbiAgICApO1xuICB9XG5cbiAgaGFzRmlsZVNpemUoYXR0YWNobWVudDogQXR0YWNobWVudDxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPikge1xuICAgIHJldHVybiAoXG4gICAgICBhdHRhY2htZW50LmZpbGVfc2l6ZSAmJiBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKGF0dGFjaG1lbnQuZmlsZV9zaXplKSlcbiAgICApO1xuICB9XG5cbiAgZ2V0RmlsZVNpemUoYXR0YWNobWVudDogQXR0YWNobWVudDxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPikge1xuICAgIHJldHVybiBwcmV0dHlieXRlcyhOdW1iZXIoYXR0YWNobWVudC5maWxlX3NpemUhKSk7XG4gIH1cblxuICBnZXRNb2RhbENvbnRleHQoKTogTW9kYWxDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNPcGVuOiB0aGlzLmltYWdlc1RvVmlldyAmJiB0aGlzLmltYWdlc1RvVmlldy5sZW5ndGggPiAwLFxuICAgICAgaXNPcGVuQ2hhbmdlSGFuZGxlcjogKGlzT3BlbikgPT4gKGlzT3BlbiA/IG51bGwgOiB0aGlzLmNsb3NlSW1hZ2VNb2RhbCgpKSxcbiAgICAgIGNvbnRlbnQ6IHRoaXMubW9kYWxDb250ZW50LFxuICAgIH07XG4gIH1cblxuICB0cmltVXJsKHVybD86IHN0cmluZyB8IG51bGwpIHtcbiAgICBpZiAodXJsICE9PSB1bmRlZmluZWQgJiYgdXJsICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBbdHJpbW1lZFVybF0gPSB1cmxcbiAgICAgICAgLnJlcGxhY2UoL14oPzpodHRwcz86XFwvXFwvKT8oPzp3d3dcXC4pPy9pLCAnJylcbiAgICAgICAgLnNwbGl0KCcvJyk7XG5cbiAgICAgIHJldHVybiB0cmltbWVkVXJsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHNlbmRBY3Rpb24oYWN0aW9uOiBBY3Rpb24pIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2Uuc2VuZEFjdGlvbihcbiAgICAgIHRoaXMubWVzc2FnZUlkISxcbiAgICAgIHtcbiAgICAgICAgW2FjdGlvbi5uYW1lIV06IGFjdGlvbi52YWx1ZSEsXG4gICAgICB9LFxuICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlSWRcbiAgICApO1xuICB9XG5cbiAgdHJhY2tCeUFjdGlvblZhbHVlKF86IG51bWJlciwgaXRlbTogQWN0aW9uKSB7XG4gICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gIH1cblxuICBvcGVuSW1hZ2VNb2RhbChhdHRhY2htZW50czogQXR0YWNobWVudFtdLCBzZWxlY3RlZEluZGV4ID0gMCkge1xuICAgIHRoaXMuaW1hZ2VzVG9WaWV3ID0gYXR0YWNobWVudHM7XG4gICAgdGhpcy5pbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGV4O1xuICB9XG5cbiAgc3RlcEltYWdlcyhkaXI6IC0xIHwgMSkge1xuICAgIHRoaXMuaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4ICs9IGRpciAqIDE7XG4gIH1cblxuICB0cmFja0J5SW1hZ2VVcmwoXzogbnVtYmVyLCBpdGVtOiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIGl0ZW0uaW1hZ2VfdXJsIHx8IGl0ZW0uaW1nX3VybCB8fCBpdGVtLnRodW1iX3VybDtcbiAgfVxuXG4gIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgYXR0YWNobWVudDogQXR0YWNobWVudCxcbiAgICB0eXBlOiAnZ2FsbGVyeScgfCAnc2luZ2xlJyxcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudFxuICApOiBJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uIHtcbiAgICBjb25zdCBleGlzdGluZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucy5nZXQoYXR0YWNobWVudCk7XG4gICAgaWYgKGV4aXN0aW5nQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29uZmlndXJhdGlvbiBhcyBJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmF0aW9uID1cbiAgICAgIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgIGF0dGFjaG1lbnQsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGVsZW1lbnRcbiAgICAgICk7XG4gICAgdGhpcy5hdHRhY2htZW50Q29uZmlndXJhdGlvbnMuc2V0KGF0dGFjaG1lbnQsIGNvbmZpZ3VyYXRpb24pO1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xuICB9XG5cbiAgZ2V0Q2Fyb3VzZWxJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQsXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICBhdHRhY2htZW50LFxuICAgICAgJ2Nhcm91c2VsJyxcbiAgICAgIGVsZW1lbnRcbiAgICApO1xuICB9XG5cbiAgZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50LFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICk6IFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24ge1xuICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25zLmdldChhdHRhY2htZW50KTtcbiAgICBpZiAoZXhpc3RpbmdDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdDb25maWd1cmF0aW9uIGFzIFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb247XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPVxuICAgICAgdGhpcy5hdHRhY2htZW50Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgYXR0YWNobWVudCxcbiAgICAgICAgZWxlbWVudFxuICAgICAgKTtcbiAgICB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucy5zZXQoYXR0YWNobWVudCwgY29uZmlndXJhdGlvbik7XG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247XG4gIH1cblxuICBnZXRDYXJkQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudDogQXR0YWNobWVudCkge1xuICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25zLmdldChhdHRhY2htZW50KTtcbiAgICBpZiAoZXhpc3RpbmdDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdDb25maWd1cmF0aW9uO1xuICAgIH1cbiAgICBpZiAoYXR0YWNobWVudC50eXBlID09PSAnZ2lwaHknKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRhY2htZW50Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0R2lwaHlBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgYXR0YWNobWVudFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9XG4gICAgICAgIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFNjcmFwZWRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgIGF0dGFjaG1lbnRcbiAgICAgICAgKTtcbiAgICAgIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25zLnNldChhdHRhY2htZW50LCBjb25maWd1cmF0aW9uKTtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0ltYWdlTW9kYWxQcmV2QnV0dG9uVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXggIT09IDA7XG4gIH1cblxuICBnZXQgaXNJbWFnZU1vZGFsTmV4dEJ1dHRvblZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4ICE9PSB0aGlzLmltYWdlc1RvVmlldy5sZW5ndGggLSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHYWxsZXJ5KGltYWdlczogQXR0YWNobWVudFtdKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2dhbGxlcnknLFxuICAgICAgICBpbWFnZXMsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGNsb3NlSW1hZ2VNb2RhbCgpIHtcbiAgICB0aGlzLmltYWdlc1RvVmlldyA9IFtdO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwib3JkZXJlZEF0dGFjaG1lbnRzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50LWxpc3RcIj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0Zvcj1cImxldCBhdHRhY2htZW50IG9mIG9yZGVyZWRBdHRhY2htZW50czsgdHJhY2tCeTogdHJhY2tCeVVybFwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RjbGFzcz1cImF0dGFjaG1lbnQtY29udGFpbmVyXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudCBzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LS17e1xuICAgICAgICBhdHRhY2htZW50LnR5cGVcbiAgICAgIH19IHN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtZHluYW1pYy1zaXplXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LS1jYXJkXT1cImlzQ2FyZChhdHRhY2htZW50KVwiXG4gICAgICBbY2xhc3Muc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtc2luZ2xlXT1cIlxuICAgICAgICBpc0ZpbGUoYXR0YWNobWVudClcbiAgICAgIFwiXG4gICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC13aXRoLWFjdGlvbnNdPVwiXG4gICAgICAgIGF0dGFjaG1lbnQuYWN0aW9ucyAmJiBhdHRhY2htZW50LmFjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LS1zdmctaW1hZ2VdPVwiaXNTdmcoYXR0YWNobWVudClcIlxuICAgID5cbiAgICAgIDxpbWdcbiAgICAgICAgI2ltZ0VsZW1lbnRcbiAgICAgICAgKm5nSWY9XCJpc0ltYWdlKGF0dGFjaG1lbnQpXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LS1pbWdcIlxuICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImltYWdlXCJcbiAgICAgICAgW3NyY109XCJcbiAgICAgICAgICBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQsICdzaW5nbGUnLCBpbWdFbGVtZW50KS51cmxcbiAgICAgICAgXCJcbiAgICAgICAgW2FsdF09XCJhdHRhY2htZW50Py5mYWxsYmFja1wiXG4gICAgICAgIChjbGljayk9XCJvcGVuSW1hZ2VNb2RhbChbYXR0YWNobWVudF0pXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cIm9wZW5JbWFnZU1vZGFsKFthdHRhY2htZW50XSlcIlxuICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC1oZWlnaHRdPVwiXG4gICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50LCAnc2luZ2xlJywgaW1nRWxlbWVudClcbiAgICAgICAgICAgIC5vcmlnaW5hbEhlaWdodFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC13aWR0aF09XCJcbiAgICAgICAgICBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQsICdzaW5nbGUnLCBpbWdFbGVtZW50KVxuICAgICAgICAgICAgLm9yaWdpbmFsV2lkdGhcbiAgICAgICAgXCJcbiAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgIGhlaWdodDogZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgIGF0dGFjaG1lbnQsXG4gICAgICAgICAgICAnc2luZ2xlJyxcbiAgICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgICApLmhlaWdodCxcbiAgICAgICAgICB3aWR0aDogZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgIGF0dGFjaG1lbnQsXG4gICAgICAgICAgICAnc2luZ2xlJyxcbiAgICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgICApLndpZHRoXG4gICAgICAgIH1cIlxuICAgICAgLz5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZ2FsbGVyeVwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiaW1hZ2UtZ2FsbGVyeVwiXG4gICAgICAgICpuZ0lmPVwiaXNHYWxsZXJ5KGF0dGFjaG1lbnQpXCJcbiAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19nYWxsZXJ5LS1zcXVhcmVdPVwiKGF0dGFjaG1lbnQ/LmltYWdlcykhLmxlbmd0aCA+IDNcIlxuICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX2dhbGxlcnktdHdvLXJvd3NdPVwiKGF0dGFjaG1lbnQ/LmltYWdlcykhLmxlbmd0aCA+IDJcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgZ2FsbGVyeUltYWdlIG9mIGF0dGFjaG1lbnQuaW1hZ2VzO1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICBsZXQgaXNMYXN0ID0gbGFzdDtcbiAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlJbWFnZVVybFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImluZGV4IDwgMyB8fCAoaW5kZXggPT09IDMgJiYgaXNMYXN0KVwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19nYWxsZXJ5LWltYWdlXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZ2FsbGVyeS1pbWFnZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbkltYWdlTW9kYWwoYXR0YWNobWVudC5pbWFnZXMhLCBpbmRleClcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIm9wZW5JbWFnZU1vZGFsKGF0dGFjaG1lbnQuaW1hZ2VzISwgaW5kZXgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LS1zdmctaW1hZ2VdPVwiXG4gICAgICAgICAgICAgIGlzU3ZnKGdhbGxlcnlJbWFnZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAjaW1nRWxlbWVudFxuICAgICAgICAgICAgICBbc3JjXT1cIlxuICAgICAgICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICAgKS51cmxcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2FsdF09XCJnYWxsZXJ5SW1hZ2UuZmFsbGJhY2tcIlxuICAgICAgICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC1oZWlnaHRdPVwiXG4gICAgICAgICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgIGdhbGxlcnlJbWFnZSxcbiAgICAgICAgICAgICAgICAgICdnYWxsZXJ5JyxcbiAgICAgICAgICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgICAgICAgICApLm9yaWdpbmFsSGVpZ2h0XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLW9yaWdpbmFsLXdpZHRoXT1cIlxuICAgICAgICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICAgKS5vcmlnaW5hbFdpZHRoXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICAgKS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICAgKS53aWR0aFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI2VsZW1lbnRcbiAgICAgICAgICAgICpuZ0lmPVwiaW5kZXggPT09IDMgJiYgIWlzTGFzdFwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19nYWxsZXJ5LXBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZ2FsbGVyeS1pbWFnZVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1vcmUtaW1hZ2UtYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuSW1hZ2VNb2RhbChhdHRhY2htZW50LmltYWdlcyEsIGluZGV4KVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib3BlbkltYWdlTW9kYWwoYXR0YWNobWVudC5pbWFnZXMhLCBpbmRleClcIlxuICAgICAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtLXN2Zy1pbWFnZV09XCJcbiAgICAgICAgICAgICAgaXNTdmcoZ2FsbGVyeUltYWdlKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLW9yaWdpbmFsLWhlaWdodF09XCJcbiAgICAgICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihnYWxsZXJ5SW1hZ2UsICdnYWxsZXJ5JywgZWxlbWVudClcbiAgICAgICAgICAgICAgICAub3JpZ2luYWxIZWlnaHRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihnYWxsZXJ5SW1hZ2UsICdnYWxsZXJ5JywgZWxlbWVudClcbiAgICAgICAgICAgICAgICAub3JpZ2luYWxXaWR0aFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOlxuICAgICAgICAgICAgICAgICd1cmwoJyArXG4gICAgICAgICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgIGdhbGxlcnlJbWFnZSxcbiAgICAgICAgICAgICAgICAgICdnYWxsZXJ5JyxcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgICApLnVybCArXG4gICAgICAgICAgICAgICAgJyknLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICdnYWxsZXJ5JyxcbiAgICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAgICkuaGVpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aDogZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgKS53aWR0aFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICAgICAgICAnc3RyZWFtQ2hhdC57eyBpbWFnZUNvdW50IH19IG1vcmUnXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBpbWFnZUNvdW50OiBhdHRhY2htZW50IS5pbWFnZXMhLmxlbmd0aCAtIDQgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fcGxheWVyLXdyYXBwZXJcIlxuICAgICAgICAqbmdJZj1cImlzVmlkZW8oYXR0YWNobWVudClcIlxuICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInZpZGVvLWF0dGFjaG1lbnQtcGFyZW50XCJcbiAgICAgICAgW3N0eWxlLi0tb3JpZ2luYWwtaGVpZ2h0XT1cIlxuICAgICAgICAgIGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudCwgdmlkZW9FbGVtZW50KVxuICAgICAgICAgICAgLm9yaWdpbmFsSGVpZ2h0XG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS4tLW9yaWdpbmFsLXdpZHRoXT1cIlxuICAgICAgICAgIGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudCwgdmlkZW9FbGVtZW50KVxuICAgICAgICAgICAgLm9yaWdpbmFsV2lkdGhcbiAgICAgICAgXCJcbiAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgIGhlaWdodDogZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50LCB2aWRlb0VsZW1lbnQpXG4gICAgICAgICAgICAuaGVpZ2h0LFxuICAgICAgICAgIHdpZHRoOiBnZXRWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQsIHZpZGVvRWxlbWVudCkud2lkdGhcbiAgICAgICAgfVwiXG4gICAgICA+XG4gICAgICAgIDx2aWRlb1xuICAgICAgICAgICN2aWRlb0VsZW1lbnRcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X192aWRlby1hbmd1bGFyXCJcbiAgICAgICAgICBjb250cm9sc1xuICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwidmlkZW8tYXR0YWNobWVudFwiXG4gICAgICAgICAgW3NyY109XCJnZXRWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQsIHZpZGVvRWxlbWVudCkudXJsXCJcbiAgICAgICAgICBbcG9zdGVyXT1cIlxuICAgICAgICAgICAgZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50LCB2aWRlb0VsZW1lbnQpLnRodW1iVXJsXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvdmlkZW8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxhXG4gICAgICAgICpuZ0lmPVwiaXNGaWxlKGF0dGFjaG1lbnQpXCJcbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW1cbiAgICAgICAgICBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWF0dGFjaG1lbnQtZmlsZS1zaW5nbGVcbiAgICAgICAgXCJcbiAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjogbm9uZVwiXG4gICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZmlsZS1saW5rXCJcbiAgICAgICAgaHJlZj1cInt7IGF0dGFjaG1lbnQuYXNzZXRfdXJsIH19XCJcbiAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgID5cbiAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgKm5nSWY9XCJ0aGVtZVZlcnNpb24gPT09ICcxJ1wiXG4gICAgICAgICAgaWNvbj1cImZpbGVcIlxuICAgICAgICAgIFtzaXplXT1cIjMwXCJcbiAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICpuZ0lmPVwidGhlbWVWZXJzaW9uID09PSAnMidcIlxuICAgICAgICAgIGljb249XCJ1bnNwZWNpZmllZC1maWxldHlwZVwiXG4gICAgICAgICAgW3NpemVdPVwiMzBcIlxuICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtZmlsZS0taXRlbS10ZXh0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtZmlsZS0taXRlbS1maXJzdC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJmaWxlLXRpdGxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW0tbmFtZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGF0dGFjaG1lbnQudGl0bGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBUZW1wb3JhcnkgZGlzYWJsZWQsIHdpbGwgYmUgZml4ZWQgd2l0aCB0aGlzOiBodHRwczovL2dpdGh1Yi5jb20vR2V0U3RyZWFtL3N0cmVhbS1jaGF0LWFuZ3VsYXIvaXNzdWVzLzM5MyAgLS0+XG4gICAgICAgICAgICA8IS0tIDxhXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1maWxlLS1pdGVtLWRvd25sb2FkXCJcbiAgICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJmaWxlLWxpbmtcIlxuICAgICAgICAgICAgICBkb3dubG9hZFxuICAgICAgICAgICAgICBocmVmPVwie3sgYXR0YWNobWVudC5hc3NldF91cmwgfX1cIlxuICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtZG93bmxvYWQtaWNvblwiXG4gICAgICAgICAgICAgICAgaWNvbj1cImRvd25sb2FkXCJcbiAgICAgICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgICAgICA8L2E+IC0tPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtZmlsZS0taXRlbS1zaXplXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwic2l6ZVwiXG4gICAgICAgICAgICAqbmdJZj1cImhhc0ZpbGVTaXplKGF0dGFjaG1lbnQpXCJcbiAgICAgICAgICAgID57eyBnZXRGaWxlU2l6ZShhdHRhY2htZW50KSB9fTwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2E+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgaXNDYXJkKGF0dGFjaG1lbnQpICYmXG4gICAgICAgICAgZ2V0Q2FyZEF0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQpIGFzIGF0dGFjaG1lbnRDb25maWd1cmF0aW9uXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkIHN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZC0te3tcbiAgICAgICAgICBhdHRhY2htZW50LnR5cGVcbiAgICAgICAgfX1cIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50Q29uZmlndXJhdGlvbi51cmxcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS1oZWFkZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJjYXJkLWltZ1wiXG4gICAgICAgICAgICBhbHQ9XCJ7eyBhdHRhY2htZW50Q29uZmlndXJhdGlvbi51cmwgfX1cIlxuICAgICAgICAgICAgc3JjPVwie3sgYXR0YWNobWVudENvbmZpZ3VyYXRpb24udXJsIH19XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgaGVpZ2h0OiBhdHRhY2htZW50Q29uZmlndXJhdGlvbi5oZWlnaHQsXG4gICAgICAgICAgICAgIHdpZHRoOiBhdHRhY2htZW50Q29uZmlndXJhdGlvbi53aWR0aFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWNhcmQtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS1mbGV4XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudC50aXRsZVwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiY2FyZC10aXRsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS10aXRsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGF0dGFjaG1lbnQudGl0bGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnQudGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS10ZXh0XCJcbiAgICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJjYXJkLXRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBhdHRhY2htZW50LnRleHQgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWNhcmQtLXVybFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudC50aXRsZV9saW5rIHx8IGF0dGFjaG1lbnQub2dfc2NyYXBlX3VybFwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwidXJsLWxpbmtcIlxuICAgICAgICAgICAgICBub29wZW5lclxuICAgICAgICAgICAgICBub3JlZmVycmVyXG4gICAgICAgICAgICAgIGhyZWY9XCJ7eyBhdHRhY2htZW50LnRpdGxlX2xpbmsgfHwgYXR0YWNobWVudC5vZ19zY3JhcGVfdXJsIH19XCJcbiAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdHJpbVVybChhdHRhY2htZW50LnRpdGxlX2xpbmsgfHwgYXR0YWNobWVudC5vZ19zY3JhcGVfdXJsKSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtYWN0aW9uc1wiXG4gICAgICAgICpuZ0lmPVwiYXR0YWNobWVudC5hY3Rpb25zICYmIGF0dGFjaG1lbnQuYWN0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtYWN0aW9ucy1mb3JtXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBhY3Rpb24gb2YgYXR0YWNobWVudC5hY3Rpb25zO1xuICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5QWN0aW9uVmFsdWVcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtYWN0aW9ucy1idXR0b24gc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1hY3Rpb25zLWJ1dHRvbi0te3tcbiAgICAgICAgICAgICAgYWN0aW9uLnN0eWxlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImF0dGFjaG1lbnQtYWN0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZW5kQWN0aW9uKGFjdGlvbilcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlbmRBY3Rpb24oYWN0aW9uKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgYWN0aW9uLnRleHQgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlc1RvVmlldyAmJiBpbWFnZXNUb1ZpZXcubGVuZ3RoID4gMFwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1vZGFsVGVtcGxhdGUkIHwgYXN5bmMpIHx8IGRlZmF1bHRNb2RhbDtcbiAgICAgICAgY29udGV4dDogZ2V0TW9kYWxDb250ZXh0KClcbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgI2RlZmF1bHRNb2RhbFxuICBsZXQtaXNPcGVuPVwiaXNPcGVuXCJcbiAgbGV0LWlzT3BlbkNoYW5nZUhhbmRsZXI9XCJpc09wZW5DaGFuZ2VIYW5kbGVyXCJcbiAgbGV0LWNvbnRlbnQ9XCJjb250ZW50XCJcbj5cbiAgPHN0cmVhbS1tb2RhbFxuICAgIGNsYXNzPVwic3RyZWFtLWNoYXQtYW5ndWxhcl9faW1hZ2UtbW9kYWwtaG9zdFwiXG4gICAgW2lzT3Blbl09XCJpc09wZW5cIlxuICAgIChpc09wZW5DaGFuZ2UpPVwiaXNPcGVuQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgICBbY29udGVudF09XCJjb250ZW50XCJcbiAgPlxuICA8L3N0cmVhbS1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxDb250ZW50PlxuICA8ZGl2IGNsYXNzPVwic3RyZWFtLWNoYXQtYW5ndWxhcl9faW1hZ2UtbW9kYWwgc3RyLWNoYXRfX2ltYWdlLWNhcm91c2VsXCI+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJcbiAgICAgICAgc3RyZWFtLWNoYXQtYW5ndWxhcl9faW1hZ2UtbW9kYWwtc3RlcHBlclxuICAgICAgICBzdHItY2hhdF9faW1hZ2UtY2Fyb3VzZWwtc3RlcHBlclxuICAgICAgXCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgdmlzaWJpbGl0eTogaXNJbWFnZU1vZGFsUHJldkJ1dHRvblZpc2libGUgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1xuICAgICAgfVwiXG4gICAgICBkYXRhLXRlc3RpZD1cImltYWdlLW1vZGFsLXByZXZcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic3RlcEltYWdlcygtMSlcIlxuICAgICAgKGtleXVwLmVudGVyKT1cInN0ZXBJbWFnZXMoLTEpXCJcbiAgICA+XG4gICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImFycm93LWxlZnRcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgIDwvYnV0dG9uPlxuICAgIDxpbWdcbiAgICAgICNpbWdFbGVtZW50XG4gICAgICBjbGFzcz1cIlxuICAgICAgICBzdHJlYW0tY2hhdC1hbmd1bGFyX19pbWFnZS1tb2RhbC1pbWFnZVxuICAgICAgICBzdHItY2hhdF9faW1hZ2UtY2Fyb3VzZWwtaW1hZ2VcbiAgICAgIFwiXG4gICAgICBkYXRhLXRlc3RpZD1cIm1vZGFsLWltYWdlXCJcbiAgICAgIFtzcmNdPVwiXG4gICAgICAgIGdldENhcm91c2VsSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICBpbWFnZXNUb1ZpZXdbaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4XSxcbiAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICkudXJsXG4gICAgICBcIlxuICAgICAgW3N0eWxlLi0tb3JpZ2luYWwtaGVpZ2h0XT1cIlxuICAgICAgICBnZXRDYXJvdXNlbEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgaW1hZ2VzVG9WaWV3W2ltYWdlc1RvVmlld0N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICApLm9yaWdpbmFsSGVpZ2h0XG4gICAgICBcIlxuICAgICAgW3N0eWxlLi0tb3JpZ2luYWwtd2lkdGhdPVwiXG4gICAgICAgIGdldENhcm91c2VsSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICBpbWFnZXNUb1ZpZXdbaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4XSxcbiAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICkub3JpZ2luYWxXaWR0aFxuICAgICAgXCJcbiAgICAgIFthbHRdPVwiaW1hZ2VzVG9WaWV3W2ltYWdlc1RvVmlld0N1cnJlbnRJbmRleF0uZmFsbGJhY2tcIlxuICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICB3aWR0aDogZ2V0Q2Fyb3VzZWxJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgIGltYWdlc1RvVmlld1tpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXhdLFxuICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgKS53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBnZXRDYXJvdXNlbEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgaW1hZ2VzVG9WaWV3W2ltYWdlc1RvVmlld0N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICApLmhlaWdodFxuICAgICAgfVwiXG4gICAgLz5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIlxuICAgICAgICBzdHJlYW0tY2hhdC1hbmd1bGFyX19pbWFnZS1tb2RhbC1zdGVwcGVyXG4gICAgICAgIHN0ci1jaGF0X19pbWFnZS1jYXJvdXNlbC1zdGVwcGVyXG4gICAgICBcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgIHZpc2liaWxpdHk6IGlzSW1hZ2VNb2RhbE5leHRCdXR0b25WaXNpYmxlID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcbiAgICAgIH1cIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJpbWFnZS1tb2RhbC1uZXh0XCJcbiAgICAgIChjbGljayk9XCJzdGVwSW1hZ2VzKDEpXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJzdGVwSW1hZ2VzKDEpXCJcbiAgICA+XG4gICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImFycm93LXJpZ2h0XCI+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdHRhY2htZW50LWxpc3QvYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdHRhY2htZW50LWxpc3QvYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBRUwsTUFBTSxFQUdOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQVN2QixPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7QUFNM0Q7O0dBRUc7QUFNSCxNQUFNLE9BQU8sdUJBQXVCO0lBaUNsQyxZQUNrQixzQkFBOEMsRUFDdEQsY0FBOEIsRUFDOUIsOEJBQThELEVBQ3RFLFlBQTBCO1FBSFYsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUN0RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsbUNBQThCLEdBQTlCLDhCQUE4QixDQUFnQztRQTNCeEU7O1dBRUc7UUFDTSxnQkFBVyxHQUE0QyxFQUFFLENBQUM7UUFDbkU7O1dBRUc7UUFDZ0IsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBRXhELENBQUM7UUFDVyxVQUFLLEdBQUcsd0NBQXdDLENBQUM7UUFDaEUsdUJBQWtCLEdBQTRDLEVBQUUsQ0FBQztRQUNqRSxpQkFBWSxHQUE0QyxFQUFFLENBQUM7UUFDM0QsNkJBQXdCLEdBQUcsQ0FBQyxDQUFDO1FBSXJCLDZCQUF3QixHQUs1QixJQUFJLEdBQUcsRUFBRSxDQUFD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O2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLE1BQU07YUFDUDtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7O29IQXZQVSx1QkFBdUI7d0dBQXZCLHVCQUF1QixpYUNsQ3BDLCsrYkErWkE7MkZEN1hhLHVCQUF1QjtrQkFMbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxXQUFXLEVBQUUsa0NBQWtDO29CQUMvQyxNQUFNLEVBQUUsRUFBRTtpQkFDWDtrTkFLVSxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJYSxxQkFBcUI7c0JBQXZDLE1BQU07Z0JBR1EsS0FBSztzQkFBbkIsV0FBVztnQkFNSixZQUFZO3NCQURuQixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb24sIEF0dGFjaG1lbnQgfSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQge1xuICBNb2RhbENvbnRleHQsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIEF0dGFjaG1lbnRDb25maWdyYXRpb24sXG4gIFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24sXG4gIEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24sXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBwcmV0dHlieXRlcyBmcm9tICdwcmV0dHktYnl0ZXMnO1xuaW1wb3J0IHsgaXNJbWFnZUF0dGFjaG1lbnQgfSBmcm9tICcuLi9pcy1pbWFnZS1hdHRhY2htZW50JztcbmltcG9ydCB7IENoYW5uZWxTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhbm5lbC5zZXJ2aWNlJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYXR0YWNobWVudC1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vdGhlbWUuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIGBBdHRhY2htZW50TGlzdGAgY29tcG9udGVudCBkaXNwbGF5cyB0aGUgYXR0YWNobWVudHMgb2YgYSBtZXNzYWdlXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1hdHRhY2htZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRoZSBhdHRhY2htZW50cyBiZWxvbmcgdG9cbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIHBhcmVudCBpZCBvZiB0aGUgbWVzc2FnZSB0aGUgYXR0YWNobWVudHMgYmVsb25nIHRvXG4gICAqL1xuICBASW5wdXQoKSBwYXJlbnRNZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBhdHRhY2htZW50cyB0byBkaXNwbGF5XG4gICAqL1xuICBASW5wdXQoKSBhdHRhY2htZW50czogQXR0YWNobWVudDxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPltdID0gW107XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgc3RhdGUgb2YgdGhlIGltYWdlIGNhcm91c2VsIHdpbmRvd1xuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGltYWdlTW9kYWxTdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgJ29wZW5lZCcgfCAnY2xvc2VkJ1xuICA+KCk7XG4gIEBIb3N0QmluZGluZygpIGNsYXNzID0gJ3N0ci1jaGF0X19hdHRhY2htZW50LWxpc3QtYW5ndWxhci1ob3N0JztcbiAgb3JkZXJlZEF0dGFjaG1lbnRzOiBBdHRhY2htZW50PERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10gPSBbXTtcbiAgaW1hZ2VzVG9WaWV3OiBBdHRhY2htZW50PERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10gPSBbXTtcbiAgaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4ID0gMDtcbiAgdGhlbWVWZXJzaW9uOiAnMScgfCAnMic7XG4gIEBWaWV3Q2hpbGQoJ21vZGFsQ29udGVudCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgbW9kYWxDb250ZW50ITogVGVtcGxhdGVSZWY8dm9pZD47XG4gIHByaXZhdGUgYXR0YWNobWVudENvbmZpZ3VyYXRpb25zOiBNYXA8XG4gICAgQXR0YWNobWVudCxcbiAgICB8IEF0dGFjaG1lbnRDb25maWdyYXRpb25cbiAgICB8IFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb25cbiAgICB8IEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25cbiAgPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIGF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZTogQXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMudGhlbWVWZXJzaW9uID0gdGhlbWVTZXJ2aWNlLnRoZW1lVmVyc2lvbjtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5hdHRhY2htZW50cykge1xuICAgICAgY29uc3QgaW1hZ2VzID0gdGhpcy5hdHRhY2htZW50cy5maWx0ZXIodGhpcy5pc0ltYWdlKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5zR2FsbGVyeSA9IGltYWdlcy5sZW5ndGggPj0gMjtcbiAgICAgIHRoaXMub3JkZXJlZEF0dGFjaG1lbnRzID0gW1xuICAgICAgICAuLi4oY29udGFpbnNHYWxsZXJ5ID8gdGhpcy5jcmVhdGVHYWxsZXJ5KGltYWdlcykgOiBpbWFnZXMpLFxuICAgICAgICAuLi50aGlzLmF0dGFjaG1lbnRzLmZpbHRlcigoYSkgPT4gdGhpcy5pc1ZpZGVvKGEpKSxcbiAgICAgICAgLi4udGhpcy5hdHRhY2htZW50cy5maWx0ZXIoKGEpID0+IHRoaXMuaXNGaWxlKGEpKSxcbiAgICAgIF07XG4gICAgICB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgIC8vIERpc3BsYXkgbGluayBhdHRhY2htZW50cyBvbmx5IGlmIHRoZXJlIGFyZSBubyBvdGhlciBhdHRhY2htZW50c1xuICAgICAgLy8gR2lwaHktcyBhbHdheXMgc2VudCB3aXRob3V0IG90aGVyIGF0dGFjaG1lbnRzXG4gICAgICBpZiAodGhpcy5vcmRlcmVkQXR0YWNobWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMub3JkZXJlZEF0dGFjaG1lbnRzLnB1c2goXG4gICAgICAgICAgLi4udGhpcy5hdHRhY2htZW50cy5maWx0ZXIoKGEpID0+IHRoaXMuaXNDYXJkKGEpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyYWNrQnlVcmwoXzogbnVtYmVyLCBhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF0dGFjaG1lbnQuaW1hZ2VfdXJsIHx8XG4gICAgICBhdHRhY2htZW50LmltZ191cmwgfHxcbiAgICAgIGF0dGFjaG1lbnQuYXNzZXRfdXJsIHx8XG4gICAgICBhdHRhY2htZW50LnRodW1iX3VybFxuICAgICk7XG4gIH1cblxuICBpc0ltYWdlKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gaXNJbWFnZUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG4gIH1cblxuICBpc1N2ZyhhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBhdHRhY2htZW50LmZhbGxiYWNrIHx8ICcnO1xuICAgIHJldHVybiAhIWZpbGVuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5zdmcnKTtcbiAgfVxuXG4gIGlzRmlsZShhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIGF0dGFjaG1lbnQudHlwZSA9PT0gJ2ZpbGUnO1xuICB9XG5cbiAgaXNHYWxsZXJ5KGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gYXR0YWNobWVudC50eXBlID09PSAnZ2FsbGVyeSc7XG4gIH1cblxuICBpc1ZpZGVvKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXR0YWNobWVudC50eXBlID09PSAndmlkZW8nICYmXG4gICAgICBhdHRhY2htZW50LmFzc2V0X3VybCAmJlxuICAgICAgIWF0dGFjaG1lbnQub2dfc2NyYXBlX3VybCAvLyBsaW5rcyBmcm9tIHZpZGVvIHNoYXJlIHNlcnZpY2VzIChzdWNoIGFzIFlvdVR1YmUgb3IgRmFjZWJvb2spIGFyZSBjYW4ndCBiZSBwbGF5ZWRcbiAgICApO1xuICB9XG5cbiAgaXNDYXJkKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIWF0dGFjaG1lbnQudHlwZSB8fFxuICAgICAgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2ltYWdlJyAmJiAhdGhpcy5pc0ltYWdlKGF0dGFjaG1lbnQpKSB8fFxuICAgICAgYXR0YWNobWVudC50eXBlID09PSAnZ2lwaHknXG4gICAgKTtcbiAgfVxuXG4gIGhhc0ZpbGVTaXplKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQ8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz4pIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXR0YWNobWVudC5maWxlX3NpemUgJiYgTnVtYmVyLmlzRmluaXRlKE51bWJlcihhdHRhY2htZW50LmZpbGVfc2l6ZSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldEZpbGVTaXplKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQ8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz4pIHtcbiAgICByZXR1cm4gcHJldHR5Ynl0ZXMoTnVtYmVyKGF0dGFjaG1lbnQuZmlsZV9zaXplISkpO1xuICB9XG5cbiAgZ2V0TW9kYWxDb250ZXh0KCk6IE1vZGFsQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzT3BlbjogdGhpcy5pbWFnZXNUb1ZpZXcgJiYgdGhpcy5pbWFnZXNUb1ZpZXcubGVuZ3RoID4gMCxcbiAgICAgIGlzT3BlbkNoYW5nZUhhbmRsZXI6IChpc09wZW4pID0+IChpc09wZW4gPyBudWxsIDogdGhpcy5jbG9zZUltYWdlTW9kYWwoKSksXG4gICAgICBjb250ZW50OiB0aGlzLm1vZGFsQ29udGVudCxcbiAgICB9O1xuICB9XG5cbiAgdHJpbVVybCh1cmw/OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgaWYgKHVybCAhPT0gdW5kZWZpbmVkICYmIHVybCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgW3RyaW1tZWRVcmxdID0gdXJsXG4gICAgICAgIC5yZXBsYWNlKC9eKD86aHR0cHM/OlxcL1xcLyk/KD86d3d3XFwuKT8vaSwgJycpXG4gICAgICAgIC5zcGxpdCgnLycpO1xuXG4gICAgICByZXR1cm4gdHJpbW1lZFVybDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzZW5kQWN0aW9uKGFjdGlvbjogQWN0aW9uKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNlbmRBY3Rpb24oXG4gICAgICB0aGlzLm1lc3NhZ2VJZCEsXG4gICAgICB7XG4gICAgICAgIFthY3Rpb24ubmFtZSFdOiBhY3Rpb24udmFsdWUhLFxuICAgICAgfSxcbiAgICAgIHRoaXMucGFyZW50TWVzc2FnZUlkXG4gICAgKTtcbiAgfVxuXG4gIHRyYWNrQnlBY3Rpb25WYWx1ZShfOiBudW1iZXIsIGl0ZW06IEFjdGlvbikge1xuICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICB9XG5cbiAgb3BlbkltYWdlTW9kYWwoYXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSwgc2VsZWN0ZWRJbmRleCA9IDApIHtcbiAgICB0aGlzLmltYWdlTW9kYWxTdGF0ZUNoYW5nZS5uZXh0KCdvcGVuZWQnKTtcbiAgICB0aGlzLmltYWdlc1RvVmlldyA9IGF0dGFjaG1lbnRzO1xuICAgIHRoaXMuaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRleDtcbiAgfVxuXG4gIHN0ZXBJbWFnZXMoZGlyOiAtMSB8IDEpIHtcbiAgICB0aGlzLmltYWdlc1RvVmlld0N1cnJlbnRJbmRleCArPSBkaXIgKiAxO1xuICB9XG5cbiAgdHJhY2tCeUltYWdlVXJsKF86IG51bWJlciwgaXRlbTogQXR0YWNobWVudCkge1xuICAgIHJldHVybiBpdGVtLmltYWdlX3VybCB8fCBpdGVtLmltZ191cmwgfHwgaXRlbS50aHVtYl91cmw7XG4gIH1cblxuICBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQsXG4gICAgdHlwZTogJ2dhbGxlcnknIHwgJ3NpbmdsZScsXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKTogSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbiB7XG4gICAgY29uc3QgZXhpc3RpbmdDb25maWd1cmF0aW9uID0gdGhpcy5hdHRhY2htZW50Q29uZmlndXJhdGlvbnMuZ2V0KGF0dGFjaG1lbnQpO1xuICAgIGlmIChleGlzdGluZ0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0NvbmZpZ3VyYXRpb24gYXMgSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9XG4gICAgICB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZS5nZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICB0eXBlLFxuICAgICAgICBlbGVtZW50XG4gICAgICApO1xuICAgIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25zLnNldChhdHRhY2htZW50LCBjb25maWd1cmF0aW9uKTtcbiAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcbiAgfVxuXG4gIGdldENhcm91c2VsSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50LFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICkge1xuICAgIHJldHVybiB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZS5nZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgYXR0YWNobWVudCxcbiAgICAgICdjYXJvdXNlbCcsXG4gICAgICBlbGVtZW50XG4gICAgKTtcbiAgfVxuXG4gIGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgYXR0YWNobWVudDogQXR0YWNobWVudCxcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudFxuICApOiBWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uIHtcbiAgICBjb25zdCBleGlzdGluZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucy5nZXQoYXR0YWNobWVudCk7XG4gICAgaWYgKGV4aXN0aW5nQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29uZmlndXJhdGlvbiBhcyBWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmF0aW9uID1cbiAgICAgIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgIGF0dGFjaG1lbnQsXG4gICAgICAgIGVsZW1lbnRcbiAgICAgICk7XG4gICAgdGhpcy5hdHRhY2htZW50Q29uZmlndXJhdGlvbnMuc2V0KGF0dGFjaG1lbnQsIGNvbmZpZ3VyYXRpb24pO1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xuICB9XG5cbiAgZ2V0Q2FyZEF0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBleGlzdGluZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucy5nZXQoYXR0YWNobWVudCk7XG4gICAgaWYgKGV4aXN0aW5nQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29uZmlndXJhdGlvbjtcbiAgICB9XG4gICAgaWYgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2dpcGh5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEdpcGh5QXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgIGF0dGFjaG1lbnRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPVxuICAgICAgICB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZS5nZXRTY3JhcGVkSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICBhdHRhY2htZW50XG4gICAgICAgICk7XG4gICAgICB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucy5zZXQoYXR0YWNobWVudCwgY29uZmlndXJhdGlvbik7XG4gICAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNJbWFnZU1vZGFsUHJldkJ1dHRvblZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4ICE9PSAwO1xuICB9XG5cbiAgZ2V0IGlzSW1hZ2VNb2RhbE5leHRCdXR0b25WaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmltYWdlc1RvVmlld0N1cnJlbnRJbmRleCAhPT0gdGhpcy5pbWFnZXNUb1ZpZXcubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlR2FsbGVyeShpbWFnZXM6IEF0dGFjaG1lbnRbXSkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgICAgaW1hZ2VzLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUltYWdlTW9kYWwoKSB7XG4gICAgdGhpcy5pbWFnZU1vZGFsU3RhdGVDaGFuZ2UubmV4dCgnY2xvc2VkJyk7XG4gICAgdGhpcy5pbWFnZXNUb1ZpZXcgPSBbXTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIm9yZGVyZWRBdHRhY2htZW50cy5sZW5ndGggPiAwXCIgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1saXN0XCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdGb3I9XCJsZXQgYXR0YWNobWVudCBvZiBvcmRlcmVkQXR0YWNobWVudHM7IHRyYWNrQnk6IHRyYWNrQnlVcmxcIlxuICA+XG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJhdHRhY2htZW50LWNvbnRhaW5lclwiXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQgc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC0te3tcbiAgICAgICAgYXR0YWNobWVudC50eXBlXG4gICAgICB9fSBzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWR5bmFtaWMtc2l6ZVwiXG4gICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC0tY2FyZF09XCJpc0NhcmQoYXR0YWNobWVudClcIlxuICAgICAgW2NsYXNzLnN0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2UtYXR0YWNobWVudC1maWxlLXNpbmdsZV09XCJcbiAgICAgICAgaXNGaWxlKGF0dGFjaG1lbnQpXG4gICAgICBcIlxuICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtd2l0aC1hY3Rpb25zXT1cIlxuICAgICAgICBhdHRhY2htZW50LmFjdGlvbnMgJiYgYXR0YWNobWVudC5hY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgIFwiXG4gICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC0tc3ZnLWltYWdlXT1cImlzU3ZnKGF0dGFjaG1lbnQpXCJcbiAgICA+XG4gICAgICA8aW1nXG4gICAgICAgICNpbWdFbGVtZW50XG4gICAgICAgICpuZ0lmPVwiaXNJbWFnZShhdHRhY2htZW50KVwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC0taW1nXCJcbiAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJpbWFnZVwiXG4gICAgICAgIFtzcmNdPVwiXG4gICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50LCAnc2luZ2xlJywgaW1nRWxlbWVudCkudXJsXG4gICAgICAgIFwiXG4gICAgICAgIFthbHRdPVwiYXR0YWNobWVudD8uZmFsbGJhY2tcIlxuICAgICAgICAoY2xpY2spPVwib3BlbkltYWdlTW9kYWwoW2F0dGFjaG1lbnRdKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJvcGVuSW1hZ2VNb2RhbChbYXR0YWNobWVudF0pXCJcbiAgICAgICAgW3N0eWxlLi0tb3JpZ2luYWwtaGVpZ2h0XT1cIlxuICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudCwgJ3NpbmdsZScsIGltZ0VsZW1lbnQpXG4gICAgICAgICAgICAub3JpZ2luYWxIZWlnaHRcbiAgICAgICAgXCJcbiAgICAgICAgW3N0eWxlLi0tb3JpZ2luYWwtd2lkdGhdPVwiXG4gICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50LCAnc2luZ2xlJywgaW1nRWxlbWVudClcbiAgICAgICAgICAgIC5vcmlnaW5hbFdpZHRoXG4gICAgICAgIFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICBoZWlnaHQ6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICAgICAgJ3NpbmdsZScsXG4gICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgKS5oZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICAgICAgJ3NpbmdsZScsXG4gICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgKS53aWR0aFxuICAgICAgICB9XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2dhbGxlcnlcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImltYWdlLWdhbGxlcnlcIlxuICAgICAgICAqbmdJZj1cImlzR2FsbGVyeShhdHRhY2htZW50KVwiXG4gICAgICAgIFtjbGFzcy5zdHItY2hhdF9fZ2FsbGVyeS0tc3F1YXJlXT1cIihhdHRhY2htZW50Py5pbWFnZXMpIS5sZW5ndGggPiAzXCJcbiAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19nYWxsZXJ5LXR3by1yb3dzXT1cIihhdHRhY2htZW50Py5pbWFnZXMpIS5sZW5ndGggPiAyXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IGdhbGxlcnlJbWFnZSBvZiBhdHRhY2htZW50LmltYWdlcztcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgbGV0IGlzTGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5SW1hZ2VVcmxcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJpbmRleCA8IDMgfHwgKGluZGV4ID09PSAzICYmIGlzTGFzdClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZ2FsbGVyeS1pbWFnZVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImdhbGxlcnktaW1hZ2VcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5JbWFnZU1vZGFsKGF0dGFjaG1lbnQuaW1hZ2VzISwgaW5kZXgpXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvcGVuSW1hZ2VNb2RhbChhdHRhY2htZW50LmltYWdlcyEsIGluZGV4KVwiXG4gICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC0tc3ZnLWltYWdlXT1cIlxuICAgICAgICAgICAgICBpc1N2ZyhnYWxsZXJ5SW1hZ2UpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgI2ltZ0VsZW1lbnRcbiAgICAgICAgICAgICAgW3NyY109XCJcbiAgICAgICAgICAgICAgICBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICAgICAgICAgICkudXJsXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthbHRdPVwiZ2FsbGVyeUltYWdlLmZhbGxiYWNrXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tb3JpZ2luYWwtaGVpZ2h0XT1cIlxuICAgICAgICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICAgKS5vcmlnaW5hbEhlaWdodFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICAgICAgICAgICkub3JpZ2luYWxXaWR0aFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICAgICAgICAgICkuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICAgICAgICAgICkud2lkdGhcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNlbGVtZW50XG4gICAgICAgICAgICAqbmdJZj1cImluZGV4ID09PSAzICYmICFpc0xhc3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZ2FsbGVyeS1wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImdhbGxlcnktaW1hZ2VcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJtb3JlLWltYWdlLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbkltYWdlTW9kYWwoYXR0YWNobWVudC5pbWFnZXMhLCBpbmRleClcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIm9wZW5JbWFnZU1vZGFsKGF0dGFjaG1lbnQuaW1hZ2VzISwgaW5kZXgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LS1zdmctaW1hZ2VdPVwiXG4gICAgICAgICAgICAgIGlzU3ZnKGdhbGxlcnlJbWFnZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC1oZWlnaHRdPVwiXG4gICAgICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oZ2FsbGVyeUltYWdlLCAnZ2FsbGVyeScsIGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgLm9yaWdpbmFsSGVpZ2h0XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW3N0eWxlLi0tb3JpZ2luYWwtd2lkdGhdPVwiXG4gICAgICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oZ2FsbGVyeUltYWdlLCAnZ2FsbGVyeScsIGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgLm9yaWdpbmFsV2lkdGhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzpcbiAgICAgICAgICAgICAgICAndXJsKCcgK1xuICAgICAgICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAgICAgKS51cmwgK1xuICAgICAgICAgICAgICAgICcpJyxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgIGdhbGxlcnlJbWFnZSxcbiAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgZWxlbWVudFxuICAgICAgICAgICAgICApLmhlaWdodCxcbiAgICAgICAgICAgICAgd2lkdGg6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICdnYWxsZXJ5JyxcbiAgICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAgICkud2lkdGhcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgJ3N0cmVhbUNoYXQue3sgaW1hZ2VDb3VudCB9fSBtb3JlJ1xuICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgaW1hZ2VDb3VudDogYXR0YWNobWVudCEuaW1hZ2VzIS5sZW5ndGggLSA0IH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L3A+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3BsYXllci13cmFwcGVyXCJcbiAgICAgICAgKm5nSWY9XCJpc1ZpZGVvKGF0dGFjaG1lbnQpXCJcbiAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJ2aWRlby1hdHRhY2htZW50LXBhcmVudFwiXG4gICAgICAgIFtzdHlsZS4tLW9yaWdpbmFsLWhlaWdodF09XCJcbiAgICAgICAgICBnZXRWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQsIHZpZGVvRWxlbWVudClcbiAgICAgICAgICAgIC5vcmlnaW5hbEhlaWdodFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC13aWR0aF09XCJcbiAgICAgICAgICBnZXRWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQsIHZpZGVvRWxlbWVudClcbiAgICAgICAgICAgIC5vcmlnaW5hbFdpZHRoXG4gICAgICAgIFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICBoZWlnaHQ6IGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudCwgdmlkZW9FbGVtZW50KVxuICAgICAgICAgICAgLmhlaWdodCxcbiAgICAgICAgICB3aWR0aDogZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50LCB2aWRlb0VsZW1lbnQpLndpZHRoXG4gICAgICAgIH1cIlxuICAgICAgPlxuICAgICAgICA8dmlkZW9cbiAgICAgICAgICAjdmlkZW9FbGVtZW50XG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdmlkZW8tYW5ndWxhclwiXG4gICAgICAgICAgY29udHJvbHNcbiAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInZpZGVvLWF0dGFjaG1lbnRcIlxuICAgICAgICAgIFtzcmNdPVwiZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50LCB2aWRlb0VsZW1lbnQpLnVybFwiXG4gICAgICAgICAgW3Bvc3Rlcl09XCJcbiAgICAgICAgICAgIGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudCwgdmlkZW9FbGVtZW50KS50aHVtYlVybFxuICAgICAgICAgIFwiXG4gICAgICAgID48L3ZpZGVvPlxuICAgICAgPC9kaXY+XG4gICAgICA8YVxuICAgICAgICAqbmdJZj1cImlzRmlsZShhdHRhY2htZW50KVwiXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1maWxlLS1pdGVtXG4gICAgICAgICAgc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtc2luZ2xlXG4gICAgICAgIFwiXG4gICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246IG5vbmVcIlxuICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImZpbGUtbGlua1wiXG4gICAgICAgIGhyZWY9XCJ7eyBhdHRhY2htZW50LmFzc2V0X3VybCB9fVwiXG4gICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICA+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICpuZ0lmPVwidGhlbWVWZXJzaW9uID09PSAnMSdcIlxuICAgICAgICAgIGljb249XCJmaWxlXCJcbiAgICAgICAgICBbc2l6ZV09XCIzMFwiXG4gICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAqbmdJZj1cInRoZW1lVmVyc2lvbiA9PT0gJzInXCJcbiAgICAgICAgICBpY29uPVwidW5zcGVjaWZpZWQtZmlsZXR5cGVcIlxuICAgICAgICAgIFtzaXplXT1cIjMwXCJcbiAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW0tdGV4dFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW0tZmlyc3Qtcm93XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZmlsZS10aXRsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1maWxlLS1pdGVtLW5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBhdHRhY2htZW50LnRpdGxlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gVGVtcG9yYXJ5IGRpc2FibGVkLCB3aWxsIGJlIGZpeGVkIHdpdGggdGhpczogaHR0cHM6Ly9naXRodWIuY29tL0dldFN0cmVhbS9zdHJlYW0tY2hhdC1hbmd1bGFyL2lzc3Vlcy8zOTMgIC0tPlxuICAgICAgICAgICAgPCEtLSA8YVxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtZmlsZS0taXRlbS1kb3dubG9hZFwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZmlsZS1saW5rXCJcbiAgICAgICAgICAgICAgZG93bmxvYWRcbiAgICAgICAgICAgICAgaHJlZj1cInt7IGF0dGFjaG1lbnQuYXNzZXRfdXJsIH19XCJcbiAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWRvd25sb2FkLWljb25cIlxuICAgICAgICAgICAgICAgIGljb249XCJkb3dubG9hZFwiXG4gICAgICAgICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICAgICAgPC9hPiAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW0tc2l6ZVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInNpemVcIlxuICAgICAgICAgICAgKm5nSWY9XCJoYXNGaWxlU2l6ZShhdHRhY2htZW50KVwiXG4gICAgICAgICAgICA+e3sgZ2V0RmlsZVNpemUoYXR0YWNobWVudCkgfX08L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9hPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGlzQ2FyZChhdHRhY2htZW50KSAmJlxuICAgICAgICAgIGdldENhcmRBdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50KSBhcyBhdHRhY2htZW50Q29uZmlndXJhdGlvblxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZCBzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWNhcmQtLXt7XG4gICAgICAgICAgYXR0YWNobWVudC50eXBlXG4gICAgICAgIH19XCJcbiAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudENvbmZpZ3VyYXRpb24udXJsXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZC0taGVhZGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiY2FyZC1pbWdcIlxuICAgICAgICAgICAgYWx0PVwie3sgYXR0YWNobWVudENvbmZpZ3VyYXRpb24udXJsIH19XCJcbiAgICAgICAgICAgIHNyYz1cInt7IGF0dGFjaG1lbnRDb25maWd1cmF0aW9uLnVybCB9fVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgIGhlaWdodDogYXR0YWNobWVudENvbmZpZ3VyYXRpb24uaGVpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aDogYXR0YWNobWVudENvbmZpZ3VyYXRpb24ud2lkdGhcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZC0tZmxleFwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnQudGl0bGVcIlxuICAgICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImNhcmQtdGl0bGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZC0tdGl0bGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBhdHRhY2htZW50LnRpdGxlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50LnRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZC0tdGV4dFwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiY2FyZC10ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgYXR0YWNobWVudC50ZXh0IH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS11cmxcIlxuICAgICAgICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnQudGl0bGVfbGluayB8fCBhdHRhY2htZW50Lm9nX3NjcmFwZV91cmxcIlxuICAgICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInVybC1saW5rXCJcbiAgICAgICAgICAgICAgbm9vcGVuZXJcbiAgICAgICAgICAgICAgbm9yZWZlcnJlclxuICAgICAgICAgICAgICBocmVmPVwie3sgYXR0YWNobWVudC50aXRsZV9saW5rIHx8IGF0dGFjaG1lbnQub2dfc2NyYXBlX3VybCB9fVwiXG4gICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHRyaW1VcmwoYXR0YWNobWVudC50aXRsZV9saW5rIHx8IGF0dGFjaG1lbnQub2dfc2NyYXBlX3VybCkgfX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWFjdGlvbnNcIlxuICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnQuYWN0aW9ucyAmJiBhdHRhY2htZW50LmFjdGlvbnMubGVuZ3RoID4gMFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWFjdGlvbnMtZm9ybVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgYWN0aW9uIG9mIGF0dGFjaG1lbnQuYWN0aW9ucztcbiAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUFjdGlvblZhbHVlXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWFjdGlvbnMtYnV0dG9uIHN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtYWN0aW9ucy1idXR0b24tLXt7XG4gICAgICAgICAgICAgIGFjdGlvbi5zdHlsZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJhdHRhY2htZW50LWFjdGlvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VuZEFjdGlvbihhY3Rpb24pXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZW5kQWN0aW9uKGFjdGlvbilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGFjdGlvbi50ZXh0IH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZXNUb1ZpZXcgJiYgaW1hZ2VzVG9WaWV3Lmxlbmd0aCA+IDBcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tb2RhbFRlbXBsYXRlJCB8IGFzeW5jKSB8fCBkZWZhdWx0TW9kYWw7XG4gICAgICAgIGNvbnRleHQ6IGdldE1vZGFsQ29udGV4dCgpXG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICNkZWZhdWx0TW9kYWxcbiAgbGV0LWlzT3Blbj1cImlzT3BlblwiXG4gIGxldC1pc09wZW5DaGFuZ2VIYW5kbGVyPVwiaXNPcGVuQ2hhbmdlSGFuZGxlclwiXG4gIGxldC1jb250ZW50PVwiY29udGVudFwiXG4+XG4gIDxzdHJlYW0tbW9kYWxcbiAgICBjbGFzcz1cInN0cmVhbS1jaGF0LWFuZ3VsYXJfX2ltYWdlLW1vZGFsLWhvc3RcIlxuICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICAoaXNPcGVuQ2hhbmdlKT1cImlzT3BlbkNoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gID5cbiAgPC9zdHJlYW0tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsQ29udGVudD5cbiAgPGRpdiBjbGFzcz1cInN0cmVhbS1jaGF0LWFuZ3VsYXJfX2ltYWdlLW1vZGFsIHN0ci1jaGF0X19pbWFnZS1jYXJvdXNlbFwiPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHN0cmVhbS1jaGF0LWFuZ3VsYXJfX2ltYWdlLW1vZGFsLXN0ZXBwZXJcbiAgICAgICAgc3RyLWNoYXRfX2ltYWdlLWNhcm91c2VsLXN0ZXBwZXJcbiAgICAgIFwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgIHZpc2liaWxpdHk6IGlzSW1hZ2VNb2RhbFByZXZCdXR0b25WaXNpYmxlID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcbiAgICAgIH1cIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJpbWFnZS1tb2RhbC1wcmV2XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cInN0ZXBJbWFnZXMoLTEpXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJzdGVwSW1hZ2VzKC0xKVwiXG4gICAgPlxuICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyIGljb249XCJhcnJvdy1sZWZ0XCI+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICA8L2J1dHRvbj5cbiAgICA8aW1nXG4gICAgICAjaW1nRWxlbWVudFxuICAgICAgY2xhc3M9XCJcbiAgICAgICAgc3RyZWFtLWNoYXQtYW5ndWxhcl9faW1hZ2UtbW9kYWwtaW1hZ2VcbiAgICAgICAgc3RyLWNoYXRfX2ltYWdlLWNhcm91c2VsLWltYWdlXG4gICAgICBcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJtb2RhbC1pbWFnZVwiXG4gICAgICBbc3JjXT1cIlxuICAgICAgICBnZXRDYXJvdXNlbEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgaW1hZ2VzVG9WaWV3W2ltYWdlc1RvVmlld0N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICApLnVybFxuICAgICAgXCJcbiAgICAgIFtzdHlsZS4tLW9yaWdpbmFsLWhlaWdodF09XCJcbiAgICAgICAgZ2V0Q2Fyb3VzZWxJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgIGltYWdlc1RvVmlld1tpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXhdLFxuICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgKS5vcmlnaW5hbEhlaWdodFxuICAgICAgXCJcbiAgICAgIFtzdHlsZS4tLW9yaWdpbmFsLXdpZHRoXT1cIlxuICAgICAgICBnZXRDYXJvdXNlbEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgaW1hZ2VzVG9WaWV3W2ltYWdlc1RvVmlld0N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICApLm9yaWdpbmFsV2lkdGhcbiAgICAgIFwiXG4gICAgICBbYWx0XT1cImltYWdlc1RvVmlld1tpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXhdLmZhbGxiYWNrXCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgd2lkdGg6IGdldENhcm91c2VsSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICBpbWFnZXNUb1ZpZXdbaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4XSxcbiAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICkud2lkdGgsXG4gICAgICAgIGhlaWdodDogZ2V0Q2Fyb3VzZWxJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgIGltYWdlc1RvVmlld1tpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXhdLFxuICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgKS5oZWlnaHRcbiAgICAgIH1cIlxuICAgIC8+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJcbiAgICAgICAgc3RyZWFtLWNoYXQtYW5ndWxhcl9faW1hZ2UtbW9kYWwtc3RlcHBlclxuICAgICAgICBzdHItY2hhdF9faW1hZ2UtY2Fyb3VzZWwtc3RlcHBlclxuICAgICAgXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICB2aXNpYmlsaXR5OiBpc0ltYWdlTW9kYWxOZXh0QnV0dG9uVmlzaWJsZSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXG4gICAgICB9XCJcbiAgICAgIGRhdGEtdGVzdGlkPVwiaW1hZ2UtbW9kYWwtbmV4dFwiXG4gICAgICAoY2xpY2spPVwic3RlcEltYWdlcygxKVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwic3RlcEltYWdlcygxKVwiXG4gICAgPlxuICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyIGljb249XCJhcnJvdy1yaWdodFwiPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==