@eqproject/eqp-attachments 3.1.6 → 3.1.8

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.
@@ -146,11 +146,11 @@ export class EqpAttachmentsComponent {
146
146
  /**
147
147
  * In caso di allegato singolo, permette di scegliere se aggiungere file tramite drag and drop
148
148
  */
149
- singleAttachmentDragAndDrop = false;
149
+ singleAttachmentDragAndDrop = true;
150
150
  /**
151
151
  * Array di opzioni che si possono utilizzare per il crop
152
152
  */
153
- cropOptions = [];
153
+ cropOptions = [1, 2];
154
154
  /**
155
155
  * Classe custom da assegnare al dialog del crop immagini
156
156
  */
@@ -206,6 +206,7 @@ export class EqpAttachmentsComponent {
206
206
  showDropArea = true;
207
207
  hiddenColumns = [];
208
208
  hiddenActions = [];
209
+ showActionButtons = false;
209
210
  videoCompression = { enabled: false, maxWidth: 1280, bitrate: 2500000 };
210
211
  _customMenuActions = [];
211
212
  _sortedMenuActions = [];
@@ -1300,11 +1301,11 @@ export class EqpAttachmentsComponent {
1300
1301
  });
1301
1302
  }
1302
1303
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EqpAttachmentsComponent, deps: [{ token: i1.MatDialog }, { token: i2.FormBuilder }, { token: i3.DomSanitizer }, { token: i4.HttpClient }, { token: i5.EqpAttachmentService }], target: i0.ɵɵFactoryTarget.Component });
1303
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EqpAttachmentsComponent, selector: "eqp-attachments", inputs: { disableAction: "disableAction", showHeader: "showHeader", attachmentsList: "attachmentsList", singleAttachment: "singleAttachment", showMatCard: "showMatCard", multipleAttachment: "multipleAttachment", loadMultipleFiles: "loadMultipleFiles", emptyTableMessage: "emptyTableMessage", allowOnlyImages: "allowOnlyImages", acceptedFileTypes: "acceptedFileTypes", isDisabled: "isDisabled", showInlinePreview: "showInlinePreview", getAttachmentEndpoint: "getAttachmentEndpoint", productionBaseUrl: "productionBaseUrl", compressionOptions: "compressionOptions", allowedTypes: "allowedTypes", isEqpTableMultiLanguage: "isEqpTableMultiLanguage", tablePaginatorVisible: "tablePaginatorVisible", isTableSearcheable: "isTableSearcheable", tablePaginatorSize: "tablePaginatorSize", separatedUploadButtons: "separatedUploadButtons", showPreview: "showPreview", singleAttachmentDragAndDrop: "singleAttachmentDragAndDrop", cropOptions: "cropOptions", cropDialogClass: "cropDialogClass", maxFileSizeMB: "maxFileSizeMB", cardSize: "cardSize", customCardWidthPx: "customCardWidthPx", customCardHeightPx: "customCardHeightPx", layout: "layout", openLinkLabel: "openLinkLabel", addButtonLabel: "addButtonLabel", downloadLabel: "downloadLabel", deleteLabel: "deleteLabel", fileNameLabel: "fileNameLabel", previewLabel: "previewLabel", uploadFileLabel: "uploadFileLabel", confirmLabel: "confirmLabel", abortLabel: "abortLabel", saveLabel: "saveLabel", exitLabel: "exitLabel", uploadWithDropboxLabel: "uploadWithDropboxLabel", cropLabel: "cropLabel", deleteDialogTitle: "deleteDialogTitle", deleteDialogMessage: "deleteDialogMessage", noImageSelectedErrorMessage: "noImageSelectedErrorMessage", wrongTypeSelectedErrorMessage: "wrongTypeSelectedErrorMessage", videoPreviewErrorMessage: "videoPreviewErrorMessage", audioPreviewErrorMessage: ["videoPreviewErrorMessage", "audioPreviewErrorMessage"], flipHorinzontalLabel: "flipHorinzontalLabel", flipVerticalLabel: "flipVerticalLabel", rotateRightLabel: "rotateRightLabel", rotateLeftLabel: "rotateLeftLabel", base64LimitMB: "base64LimitMB", uploadTitle: "uploadTitle", uploadSubtitle: "uploadSubtitle", dropHereLabel: "dropHereLabel", supportedFormatsLabel: "supportedFormatsLabel", browseFilesLabel: "browseFilesLabel", uploadSummaryLabel: "uploadSummaryLabel", filesLabel: "filesLabel", totalSizeLabel: "totalSizeLabel", emptyStateLabel: "emptyStateLabel", addedSuccessfullyLabel: "addedSuccessfullyLabel", removedLabel: "removedLabel", chooseView: "chooseView", showSummary: "showSummary", viewMode: "viewMode", showUploadTitle: "showUploadTitle", showDropArea: "showDropArea", hiddenColumns: "hiddenColumns", hiddenActions: "hiddenActions", videoCompression: "videoCompression", customMenuActions: "customMenuActions", customColumns: "customColumns" }, outputs: { localEditedAttachments: "localEditedAttachments", abortAddAttachment: "abortAddAttachment", downloadAttachment: "downloadAttachment", onDeleteAttachment: "onDeleteAttachment" }, viewQueries: [{ propertyName: "dialogAddAttachment", first: true, predicate: ["dialogAddAttachment"], descendants: true, static: true }, { propertyName: "dialogAddMultipleAttachment", first: true, predicate: ["dialogAddMultipleAttachment"], descendants: true, static: true }, { propertyName: "dialogCropImage", first: true, predicate: ["dialogCropImage"], descendants: true, static: true }, { propertyName: "addingLinkTemplate", first: true, predicate: ["addingLinkTemplate"], descendants: true }, { propertyName: "imageCropper", first: true, predicate: ImageCropperComponent, descendants: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true }, { propertyName: "inlinePreviewTemplate", first: true, predicate: ["inlinePreviewTemplate"], descendants: true, static: true }, { propertyName: "dialogPreview", first: true, predicate: ["dialogPreview"], descendants: true, static: true }, { propertyName: "defaultFileTemplate", first: true, predicate: ["defaultFileTemplate"], descendants: true, static: true }, { propertyName: "defaultActionsTemplate", first: true, predicate: ["defaultActionsTemplate"], descendants: true, static: true }], ngImport: i0, template: "<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n<div class=\"header\">\r\n @if(showUploadTitle == true){\r\n <h4>{{ uploadTitle }}</h4>\r\n }\r\n @if(chooseView == true){\r\n <mat-button-toggle-group [value]=\"viewMode\" (change)=\"setViewMode($event.value)\"\r\n aria-label=\"Modalit\u00E0 di visualizzazione\">\r\n <mat-button-toggle value=\"card\"><mat-icon>grid_view</mat-icon></mat-button-toggle>\r\n <mat-button-toggle value=\"table\"><mat-icon>view_list</mat-icon></mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n</div>\r\n\r\n<!-- Gestione singolo -->\r\n@if (multipleAttachment != true) {\r\n@if (!singleAttachmentDragAndDrop) {\r\n@if (!addingLinkMode) {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addAttachmentButton\"></ng-container>\r\n</div>\r\n} @else {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addingLinkTemplate\"></ng-container>\r\n</div>\r\n}\r\n} @else {\r\n<input #fileInput id=\"file_attachment\" name=\"file_attachment\" type=\"file\" hidden (change)=\"onFileAdded($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (allowedTypes && allowedTypes.includes(1) && (!attachmentsList || attachmentsList.length == 0 ||\r\n(attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n\r\n@if (showDropArea == true) {\r\n<!-- FULL -->\r\n@if (layout === 'full') {\r\n\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\"\r\n (click)=\"onSelectFile($event, fileInput)\" role=\"button\" tabindex=\"0\" (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n <div class=\"secondary-action\">\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n @if (allowedTypes.includes(2) && allowedTypes.includes(3)) {\r\n <a class=\"secondary-action-link\" [matMenuTriggerFor]=\"isDisabled ? null : linkMenu\"\r\n [class.disabled-link]=\"isDisabled\" (click)=\"$event.stopPropagation()\">\r\n o aggiungi da web\r\n </a>\r\n <mat-menu #linkMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"switchToAddingLinkMode()\">\r\n <mat-icon>link</mat-icon>\r\n <span>Aggiungi da link</span>\r\n </button>\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\">\r\n <mat-icon>cloud_queue</mat-icon>\r\n <span>Carica da Dropbox</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @else if (allowedTypes.includes(2)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">\r\n aggiungi un link\r\n </a>\r\n }\r\n\r\n @else if (allowedTypes.includes(3)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); chooseDropboxFile()\">\r\n carica da Dropbox\r\n </a>\r\n }\r\n }\r\n </div>\r\n</div>\r\n}@else {\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n}\r\n}\r\n\r\n<!-- Azioni singolo elemento (come prima) -->\r\n<div class=\"text-center\">\r\n @if (attachmentsList && attachmentsList.length > 0 && attachmentsList[0]) {\r\n <button class=\"mb-2 me-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n @if (attachmentsList[0].AttachmentType == AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n } @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n {{ attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel }}\r\n </button>\r\n\r\n @if (showPreview && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video')\r\n && !attachmentsList[0].FileContentType.startsWith('audio'))) && attachmentsList[0].IsImage == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n <mat-icon>visibility</mat-icon> {{ previewLabel }}\r\n </button>\r\n }\r\n\r\n <button [disabled]=\"disableAction\" class=\"mb-2 eqp-attachments-delete-btn\"\r\n (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\" mat-raised-button [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{ deleteLabel }}\r\n </button>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione multipla -->\r\n@if (multipleAttachment == true && showDropArea == true) {\r\n<input #fileInput id=\"file_attachment_multi\" name=\"file_attachment_multi\" type=\"file\" hidden\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (layout === 'full') {\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\"\r\n (click)=\"onSelectFile($event, fileInput)\" role=\"button\" tabindex=\"0\" (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n @if (allowedTypes.includes(2)) {\r\n <div class=\"secondary-action-link\">\r\n o <a (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">aggiungi un link</a>\r\n </div>\r\n }\r\n</div>\r\n}@else{\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button [disabled]=\"isDisabled\" color=\"primary\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n\r\n@if (attachmentsList?.length > 0 && showSummary) {\r\n<div class=\"upload-stats\">\r\n\r\n <div class=\"stats-info\">\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ attachmentsList?.length }}</div>\r\n <div class=\"stat-label\">{{ filesLabel }}</div>\r\n </div>\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ totalSizeFormatted }}</div>\r\n <div class=\"stat-label\">{{ totalSizeLabel }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n\r\n</div>\r\n} @else if(attachmentsList?.length == 0){\r\n<div class=\"empty-state\">{{ emptyStateLabel }}</div>\r\n}\r\n\r\n<!-- Griglia anteprime card (vale per singolo e multiplo) -->\r\n@if (viewMode === 'card') {\r\n\r\n<div class=\"file-previews\" [ngStyle]=\"getPreviewsContainerStyle()\">\r\n @for (att of attachmentsList; track att.ID) {\r\n <div [ngClass]=\"getCardClass(att)\">\r\n <div class=\"preview-img-container\" (click)=\"!att.isUploading && handlePrimaryAction(att)\">\r\n\r\n @if (att.IsImage || att.FileThumbnailBase64) {\r\n <img class=\"preview-img\" [src]=\"'data:image/jpeg;base64,' + (att.FileThumbnailBase64 || att.FileDataBase64)\"\r\n [alt]=\"att.FileName\" />\r\n } @else {\r\n <div class=\"file-icon\"><i [ngClass]=\"getAttachmentIcon(att)\"></i></div>\r\n }\r\n\r\n <div class=\"preview-action-overlay\">\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n <mat-icon>play_arrow</mat-icon>\r\n }\r\n @else if (att.IsImage && canBePreviewed(att)) {\r\n <mat-icon>visibility</mat-icon>\r\n }\r\n @else if (att.FileContentType === 'application/pdf' && canBePreviewed(att)) {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n @else if (att.AttachmentType === AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n }\r\n @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-info\">\r\n <div class=\"file-name\" [title]=\"att.FileName\">{{ att.FileName }}</div>\r\n </div>\r\n\r\n @if(!disableAction){\r\n <button mat-icon-button class=\"remove-btn\" type=\"button\" aria-label=\"Rimuovi allegato\"\r\n (click)=\"deleteAttachment(att)\" [disabled]=\"att.isUploading\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (att.isUploading) {\r\n <div class=\"upload-spinner\"></div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n} @else if(viewMode === 'table' && attachmentsList?.length > 0) {\r\n\r\n\r\n<div class=\"table-view-container\">\r\n\r\n <div class=\"table-header\">\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n {{ col.display }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (att of attachmentsList; track att.ID) {\r\n <div class=\"table-row\">\r\n\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n\r\n @switch (col.type) {\r\n\r\n @case ('template') {\r\n <div class=\"template-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: att }\"></ng-container>\r\n </div>\r\n }\r\n @case ('date') {\r\n <span class=\"metadata-value\">{{ att[col.key] | date:'dd/MM/yyyy' }}</span>\r\n }\r\n @default {\r\n <span class=\"metadata-value\">{{ att[col.key] }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Notifica toast -->\r\n<div class=\"upload-notification\" [class.show]=\"toast?.visible\" [class.success]=\"toast?.type === 'success'\"\r\n [class.error]=\"toast?.type === 'error'\">\r\n <span>{{ toast?.text }}</span>\r\n <div class=\"notification-progress\"></div>\r\n</div>\r\n\r\n<ng-template #defaultFileTemplate let-att>\r\n <i class=\"file-icon-small\" [ngClass]=\"getAttachmentIcon(att)\"></i>\r\n <div class=\"file-info-text\">\r\n <span class=\"file-name-table\">{{ att.FileName }}</span>\r\n <span class=\"file-type-table\">{{ att.FileExtension || 'Link' }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultActionsTemplate let-att>\r\n <button mat-icon-button (click)=\"handlePrimaryAction(att)\"\r\n [matTooltip]=\"att.FileContentType?.startsWith('video/') ? 'Riproduci video' : 'Visualizza/Scarica'\">\r\n\r\n <mat-icon>\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n play_arrow\r\n } @else {\r\n {{ att.AttachmentType === AttachmentType.FILE ? 'download' : 'open_in_new' }}\r\n }\r\n </mat-icon>\r\n </button>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"actionsMenu\" matTooltip=\"Altre opzioni\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n @for (action of _sortedMenuActions; track action.name) {\r\n @if (!isActionHidden(action, att)) {\r\n <button mat-menu-item (click)=\"action.fn(att)\" [disabled]=\"action.disabled ? action.disabled(att) : false\">\r\n <mat-icon [color]=\"action.icon === 'delete' ? 'warn' : undefined\">\r\n {{ action.icon }}\r\n </mat-icon>\r\n <span>{{ action.name }}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogCropImage>\r\n <div style=\"overflow-x: hidden\" [ngClass]=\"cropDialogClass\">\r\n <!-- @if (showCropImage == true) { -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{ form: newAttachmentForm }\">\r\n </ng-container>\r\n <!-- } -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n @if (row.AttachmentType != AttachmentType.LINK && row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <img [src]=\"'data:image/png;base64,' + (row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64)\" />\r\n </div>\r\n } @else if (row.AttachmentType != AttachmentType.LINK && !row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"modern-dialog-container\"> @if (selectedAttachment) {\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ previewLabel }}</span>\r\n <span class=\"file-t\">{{ selectedAttachment.FileName }}</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"media-viewer-wrapper\">\r\n @if (selectedAttachment.IsImage) {\r\n <img class=\"main-preview-media\"\r\n [src]=\"'data:image/png;base64,' + (selectedAttachment.FileDataBase64 || selectedAttachment.FileThumbnailBase64)\"\r\n [alt]=\"selectedAttachment.FileName\" />\r\n }\r\n @else if (selectedAttachment.FileContentType?.startsWith('video/')) {\r\n <video controls autoplay playsinline class=\"main-preview-media video-player\">\r\n <source [src]=\"selectedAttachment.TrustedUrl\" [type]=\"selectedAttachment.FileContentType\">\r\n Il tuo browser non supporta il video.\r\n </video>\r\n }\r\n @else {\r\n <div class=\"iframe-container\">\r\n <iframe class=\"preview-iframe-modern\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n }\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Chiudi</button>\r\n @if (selectedAttachment.AttachmentType !== AttachmentType.LINK) {\r\n <button mat-raised-button color=\"primary\" (click)=\"viewAttachment(selectedAttachment)\" class=\"btn-download\">\r\n <mat-icon>download</mat-icon> <span>{{ downloadLabel }}</span>\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n <input #fileInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n @if (allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || !attachmentsList ||\r\n attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"addFile(allowedTypes[0], fileInput)\" [disabled]=\"isDisabled\">\r\n @if (allowedTypes[0] == 1) { <mat-icon>cloud_upload</mat-icon> }\r\n @if (allowedTypes[0] == 2) { <i class=\"fas fa-link\"></i> }\r\n @if (allowedTypes[0] == 3) { <i class=\"fa-brands fa-dropbox\"></i> }\r\n <span style=\"margin-left: 10px\">\r\n {{ allowedTypes[0] == 1 ? (addButtonLabel + \" file\") : allowedTypes[0] == 2 ? (addButtonLabel + \" link\") :\r\n uploadWithDropboxLabel }}\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (!separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\">\r\n @if (multipleAttachment != true) { <mat-icon>cloud_upload</mat-icon> } @else { <mat-icon>add</mat-icon> }\r\n <span style=\"margin-left: 0px\">{{ addButtonLabel }}</span>\r\n </button>\r\n\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(1)) {\r\n <button mat-menu-item (click)=\"imageInput.click()\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(2)) {\r\n <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"switchToAddingLinkMode()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if (separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <div class=\"btn-group\">\r\n @if (allowedTypes.includes(1)) {\r\n <button (click)=\"imageInput.click()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-solid fa-cloud-upload\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(2)) {\r\n <button (click)=\"switchToAddingLinkMode()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button (click)=\"chooseDropboxFile()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ cropLabel }}</span>\r\n <span class=\"file-t\">Regola le dimensioni e l'orientamento</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" (click)=\"abortFile()\" class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"crop-toolbar\">\r\n @if (cropOptions.includes(1)) {\r\n <button mat-icon-button [matTooltip]=\"rotateLeftLabel\"\r\n (click)=\"rotateLeft()\"><mat-icon>rotate_left</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"rotateRightLabel\"\r\n (click)=\"rotateRight()\"><mat-icon>rotate_right</mat-icon></button>\r\n }\r\n @if (cropOptions.includes(2)) {\r\n <button mat-icon-button [matTooltip]=\"flipHorinzontalLabel\"\r\n (click)=\"flipHorizontal()\"><mat-icon>flip_horizontal</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"flipVerticalLabel\"\r\n (click)=\"flipVertical()\"><mat-icon>flip_vertical</mat-icon></button>\r\n }\r\n <button mat-icon-button matTooltip=\"Reset\"\r\n (click)=\"restoreOriginalDimensions()\"><mat-icon>replay</mat-icon></button>\r\n </div>\r\n\r\n <div class=\"media-viewer-wrapper\">\r\n <div class=\"crop-container-modern\">\r\n <image-cropper [imageFile]=\"selectedFile\" [maintainAspectRatio]=\"false\" [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\" [resizeToWidth]=\"customWidth\"\r\n [resizeToHeight]=\"customHeight\" [output]=\"'base64'\" [containWithinAspectRatio]=\"true\" [onlyScaleDown]=\"true\"\r\n [alignImage]=\"'center'\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button (click)=\"abortFile()\" class=\"btn-close\">{{ abortLabel }}</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmAddAttachment()\" class=\"btn-download\">\r\n <mat-icon>check</mat-icon> {{ confirmLabel }}\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER FORM DI AGGIUNTA DI UN LINK -->\r\n<ng-template #addingLinkTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"type-icon-wrapper\">\r\n <mat-icon>link</mat-icon>\r\n </div>\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">Aggiungi un link</span>\r\n <span class=\"file-t\">Inserisci l'URL della risorsa web</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"add-link-modern-content\">\r\n <form [formGroup]=\"newAttachmentForm\" class=\"add-link-form\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100 mt-3\">\r\n <mat-label>URL del collegamento</mat-label>\r\n <input matInput formControlName=\"filePath\" placeholder=\"https://...\" required>\r\n <mat-icon matSuffix>language</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label>Titolo (opzionale)</mat-label>\r\n <input matInput formControlName=\"fileName\" placeholder=\"Es. Documento Progetto\">\r\n <mat-icon matSuffix>title</mat-icon>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" [mat-dialog-close]=\"newAttachmentForm.value\"\r\n [disabled]=\"newAttachmentForm.invalid\" class=\"btn-download\">\r\n <mat-icon>add</mat-icon> Aggiungi\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";:host{--primary-color: #6a5af9;--primary-color-dark: #5441f8;--success-color: #1ce593;--error-color: #ff5b5b;--background-light: #f7f9fc;--background-card: rgba(255, 255, 255, .7);--text-color: #1e293b;--text-color-light: #64748b;--border-color: rgba(203, 213, 225, .5);--shadow-color: rgba(99, 102, 241, .2);--border-radius: 16px;--transition-speed: .3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--primary-color)}70%{box-shadow:0 0 0 10px #6a5af900}to{box-shadow:0 0 #6a5af900}}.container{width:100%;max-width:700px;margin:2rem auto;font-family:Inter,sans-serif}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.header h1{color:var(--text-color);font-size:1.8rem;font-weight:700;margin:0}.dropbox{width:100%;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:2.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all var(--transition-speed) ease}.dropbox:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color);border-color:var(--primary-color)}.dropbox.dragover{border-style:solid;border-color:var(--primary-color);transform:scale(1.02);box-shadow:0 0 25px var(--shadow-color);animation:pulse 1.5s infinite}.dropbox .dropbox-icon{font-size:3.5rem;color:var(--primary-color)}.dropbox .dropbox-text{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-top:1rem}.dropbox .dropbox-subtext{color:var(--text-color-light);margin-top:.5rem}.dropbox .browse-btn{margin-top:1.5rem;padding:.75rem 1.5rem;background-color:var(--primary-color);color:#fff;border:none;border-radius:10px;font-weight:600;transition:all var(--transition-speed) ease}.dropbox .browse-btn:hover{background-color:var(--primary-color-dark);transform:translateY(-2px)}.file-previews{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.5rem;margin-top:2rem}.file-previews{display:grid;gap:16px;padding:16px;grid-template-columns:repeat(auto-fill,minmax(var(--card-min-width, 200px),1fr))}.file-preview{background-color:var(--background-card);border-radius:var(--border-radius);box-shadow:0 4px 15px #0000000d;border:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column;position:relative;opacity:0;animation:fadeIn .5s ease-out forwards;transition:transform var(--transition-speed) ease,box-shadow var(--transition-speed) ease}.file-preview.uploading{cursor:wait}.file-preview.uploading .preview-img-container:after{content:\"\";position:absolute;inset:0;background:#ffffffb3;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.file-preview .preview-action-overlay{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;background-color:#0006;color:#fff;opacity:1;transition:opacity .3s ease}.file-preview .preview-action-overlay .mat-icon{font-size:36px;width:36px;height:36px}.file-preview .remove-btn{position:absolute;top:8px;right:8px;z-index:2;background-color:#0000004d;color:#fff;width:32px;height:32px;display:flex;align-items:center;justify-content:center;padding:0;transition:all var(--transition-speed) ease}.file-preview .remove-btn:hover{background-color:#ff5b5b}.file-preview .remove-btn .mat-icon{font-size:18px}@media (hover: hover){.file-preview .remove-btn .file-preview .preview-action-overlay{opacity:0}.file-preview .remove-btn .file-preview:hover .preview-action-overlay,.file-preview .remove-btn .file-preview:hover .remove-btn{opacity:1}.file-preview .remove-btn .file-preview .remove-btn{opacity:0}}@media (hover: hover) and (min-width: 769px){.file-preview .remove-btn{opacity:0;transform:scale(.8)}.file-preview:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color)}.file-preview:hover .remove-btn{opacity:1;transform:scale(1)}}.file-preview .preview-img-container{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;position:relative;cursor:pointer;background-color:#f0f2f5}.file-preview .preview-img{width:100%;height:100%;object-fit:cover}.file-preview .file-icon{font-size:4rem;color:var(--primary-color)}.file-preview .file-info{padding:12px;border-top:1px solid var(--border-color);flex-grow:1;display:flex;align-items:center}.file-preview .file-name{font-weight:600;font-size:.9rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-preview .upload-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-left-color:var(--primary-color);border-radius:50%;animation:spin 1s linear infinite;pointer-events:none}.file-preview.card-small{width:140px}.file-preview.card-small .preview-img-container{height:80px}.file-preview.card-small .file-info{padding:8px}.file-preview.card-small .file-name{font-size:.8rem}.file-preview.card-small .file-icon{font-size:3rem}.file-preview.card-small .remove-btn{width:28px;height:28px}.file-preview.card-small .remove-btn .mat-icon{font-size:16px}.file-preview.card-large{width:280px}.file-preview.card-large .preview-img-container{height:180px}.file-preview.card-large .file-info{padding:16px}.file-preview.card-large .file-name{font-size:1rem}.file-preview.card-large .file-icon{font-size:5rem}.file-preview.card-large .remove-btn{width:36px;height:36px}.file-preview.card-large .remove-btn .mat-icon{font-size:20px}.file-preview[style*=--eqp-card-width]{width:var(--eqp-card-width)}.file-preview[style*=--eqp-card-width] .preview-img-container{height:calc(var(--eqp-card-width) * .65)}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}.upload-stats{background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:1.5rem;margin-top:2rem;animation:fadeIn .5s ease-out}.upload-stats .stats-info{display:flex;justify-content:space-around}.upload-stats .progress-bar{height:10px;background-color:var(--border-color);border-radius:5px;overflow:hidden;margin-top:1rem}.upload-stats .progress-fill{height:100%;background:linear-gradient(90deg,var(--primary-color),var(--success-color));transition:width var(--transition-speed) ease-out;border-radius:5px}.upload-notification{position:fixed;bottom:20px;left:50%;transform:translate(-50%,100px);padding:1rem 1.5rem;border-radius:var(--border-radius);color:#fff;font-weight:600;box-shadow:0 10px 30px #0003;transition:transform var(--transition-speed) cubic-bezier(.175,.885,.32,1.275)}.upload-notification.show{transform:translate(-50%)}.upload-notification.success{background-color:var(--success-color)}.upload-notification.error{background-color:var(--error-color)}::ng-deep .cdk-overlay-pane.eqp-crop-dialog{transform:translateY(-4vh)}@media (max-width: 600px){::ng-deep .cdk-overlay-pane.crop-dialog{width:auto!important}}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__surface{border-radius:20px!important;padding:0!important;overflow:hidden!important;width:fit-content!important;min-width:350px!important;max-width:95vw!important;margin:0 auto;background-color:#fff!important}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;display:flex;flex-direction:column}.modern-dialog-container{display:flex;flex-direction:column;width:100%;max-width:100%;height:100%;max-height:90vh;background:#fff;--preview-header-h: 66px;--preview-footer-h: 66px;--preview-padding-y: 30px}.modern-dialog-container .main-preview-media{display:block;max-width:100%;max-height:var(--media-max-h);width:auto;height:auto;object-fit:contain;border-radius:12px;background:#fff;padding:4px;box-shadow:0 10px 30px #00000014}.modern-dialog-container video.main-preview-media{width:min(100%,1100px);background:#000}.modern-dialog-container .iframe-container{width:min(100%,1100px);height:var(--media-max-h);display:flex;width:100%;max-width:1100px}.modern-dialog-container .preview-iframe-modern{width:100%;height:100%;border:0;border-radius:12px;background:#f8fafc}.modern-dialog-container .preview-header{flex:0 0 auto;flex-shrink:0;padding:14px 20px;display:flex;align-items:center;justify-content:flex-start;border-bottom:1px solid var(--border-color);background:#f8fafc;z-index:10;width:100%}.modern-dialog-container .preview-header .header-info{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex:1 1 auto;min-width:0;text-align:left}.modern-dialog-container .preview-header .header-info .type-icon-wrapper{background:var(--primary-color);color:#fff;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px var(--shadow-color)}.modern-dialog-container .preview-header .header-info .title-group{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .main-t{font-weight:800;color:var(--text-color);font-size:.95rem;line-height:1.2;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .file-t{font-size:.75rem;color:var(--text-color-light);max-width:250px;overflow:hidden;text-overflow:ellipsis;text-align:left}.modern-dialog-container .preview-content-area{flex:1;background:#fff!important;display:flex;flex-direction:column;padding:15px 15px 22px!important;overflow:hidden!important;min-height:0;width:auto;--media-max-h: calc(90vh - var(--preview-header-h) - var(--preview-footer-h) - var(--preview-padding-y));width:100%}.modern-dialog-container .preview-content-area .crop-toolbar{flex-shrink:0;z-index:20;background:#0f172a14;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 16px;border-radius:30px;margin:0 auto 15px;display:flex;gap:8px;box-shadow:0 4px 12px #0000000d}.modern-dialog-container .preview-content-area .crop-toolbar button{color:var(--text-color)!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper{flex:1;width:100%;display:flex;justify-content:center;align-items:center;min-height:0;overflow:visible}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern{width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:transparent;border-radius:12px;padding:0}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern image-cropper{max-width:100%;max-height:100%;display:block}.modern-dialog-container .add-link-modern-content{flex:1;background:#fff;padding:24px!important}.modern-dialog-container .add-link-modern-content .add-link-form{display:flex;flex-direction:column;gap:10px}.modern-dialog-container .preview-actions{flex-shrink:0;padding:12px 24px;background:#f8fafc;border-top:1px solid #e2e8f0;margin:0}.modern-dialog-container .preview-actions .btn-download{border-radius:12px;font-weight:600;box-shadow:0 4px 12px var(--shadow-color)}@media (max-width: 600px){.modern-dialog-container{max-height:95vh}.modern-dialog-container .preview-content-area{padding:10px!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper video.main-preview-media{width:100%!important;max-height:55vh!important;border-radius:4px;box-shadow:none}.modern-dialog-container .preview-content-area .media-viewer-wrapper .iframe-container{height:50vh}.modern-dialog-container .preview-content-area .crop-toolbar{width:calc(100% - 20px);max-width:400px;margin-bottom:10px;padding:4px 8px;gap:4px;overflow-x:auto;justify-content:center;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-dialog-container .preview-content-area .crop-toolbar::-webkit-scrollbar{display:none}.modern-dialog-container .preview-content-area .crop-toolbar button{flex-shrink:0;transform:scale(.85);width:40px;height:40px}.modern-dialog-container .preview-actions{padding:10px 15px;flex-direction:column-reverse;gap:8px}.modern-dialog-container .preview-actions button{width:100%;margin:0!important}}@media (max-width: 360px){.modern-dialog-container .preview-content-area .crop-toolbar{gap:2px}.modern-dialog-container .preview-content-area .crop-toolbar button{transform:scale(.75)}}.control-icon{font-size:28px;cursor:pointer}image-cropper,image-cropper canvas,image-cropper img{max-width:100%!important;max-height:100%!important}.crop-large{display:flex}.crop-small{display:none}@media (max-width: 600px){.dialog-content{max-height:55vh}.crop-container{max-width:100%;aspect-ratio:auto}.crop-large{display:none}.crop-small{display:flex;justify-content:center;gap:14px}.control-icon{font-size:24px}}.stats-header{display:flex;justify-content:space-between;align-items:center;width:100%}.table-view-container{margin-top:1.5rem;background-color:var(--background-card);border-radius:var(--border-radius);border:1px solid var(--border-color);overflow:hidden;animation:fadeIn .5s ease-out}.table-header,.table-row{display:flex;align-items:center;padding:0 1rem;transition:background-color var(--transition-speed) ease}.table-header{background-color:#f8f9fa;font-weight:600;color:var(--text-color-light);font-size:.8rem;text-transform:uppercase;border-bottom:2px solid var(--border-color)}.table-row{border-bottom:1px solid var(--border-color)}.table-row:last-child{border-bottom:none}.table-row:hover{background-color:#00000005}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem}.name-col{flex:4}.size-col,.date-col{flex:2}.actions-col{flex:1;justify-content:flex-end;min-width:150px}.file-icon-small{font-size:1.5rem;color:var(--primary-color)}.file-info-text{display:flex;flex-direction:column}.file-name-table{font-weight:600;color:var(--text-color)}.file-type-table{font-size:.8rem;color:var(--text-color-light)}@media (max-width: 768px){.date-col{display:none}.name-col{flex:3}.size-col{flex:2}.actions-col{flex:2;min-width:120px}}.secondary-action-link{color:var(--primary-color);text-decoration:none;border-bottom:1px solid var(--primary-color);cursor:pointer;font-weight:500}.secondary-action-link:hover{color:var(--primary-color-dark);border-bottom-color:var(--primary-color-dark)}h2[mat-dialog-title]+mat-dialog-content.add-link-dialog-content{padding-top:20px}mat-dialog-content.add-link-dialog-content{padding-left:24px;padding-right:24px;padding-bottom:20px}.add-link-form{display:flex;flex-direction:column;gap:16px}::ng-deep .eqp-attachments-preview-dialog{--mdc-dialog-subhead-line-height: normal}::ng-deep .eqp-attachments-preview-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;background:#fff!important}:host ::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{--mdc-dialog-subhead-size: 1.25rem;--mdc-dialog-subhead-line-height: 1.5;--mdc-dialog-subhead-weight: 600;--mdc-dialog-supporting-text-size: 1rem}.empty-state{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:1.5rem 1rem;margin-top:1.5rem;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#f8f9fa;text-align:center;color:var(--text-color-light);animation:fadeIn .5s ease-out}.empty-state:before{content:\"\\1f4ed\";font-size:2.5rem;margin-bottom:1rem;opacity:.7}.secondary-action-link.disabled-link{color:#adb5bd;cursor:not-allowed;border-bottom-color:transparent}.secondary-action-link.disabled-link:hover{color:#adb5bd;border-bottom-color:transparent}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem;min-width:0;overflow:hidden}.table-cell.col-actions{flex:0 0 150px;justify-content:flex-end;overflow:visible}.compact-uploader{display:flex;align-items:center;gap:16px;padding:16px;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#fcfdff;transition:all .3s ease}.compact-uploader .compact-text{flex:1 1 auto;min-width:0;cursor:pointer}.compact-uploader .compact-text:hover .compact-title{color:var(--primary-color)}.compact-uploader .compact-title{font-weight:600;color:var(--text-color);transition:color .3s ease}.compact-uploader .compact-subtitle{font-size:.8rem;color:var(--text-color-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.compact-uploader .compact-icon mat-icon{font-size:36px;width:36px;height:36px;color:var(--primary-color)}.compact-uploader .compact-actions{display:flex;gap:8px;flex-shrink:0}.compact-uploader.dragover{background-color:#f4f8ff;border-color:var(--primary-color);box-shadow:0 0 10px var(--shadow-color)}\n"], dependencies: [{ kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i10.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i10.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i13.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i14.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "pipe", type: i13.DatePipe, name: "date" }] });
1304
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EqpAttachmentsComponent, selector: "eqp-attachments", inputs: { disableAction: "disableAction", showHeader: "showHeader", attachmentsList: "attachmentsList", singleAttachment: "singleAttachment", showMatCard: "showMatCard", multipleAttachment: "multipleAttachment", loadMultipleFiles: "loadMultipleFiles", emptyTableMessage: "emptyTableMessage", allowOnlyImages: "allowOnlyImages", acceptedFileTypes: "acceptedFileTypes", isDisabled: "isDisabled", showInlinePreview: "showInlinePreview", getAttachmentEndpoint: "getAttachmentEndpoint", productionBaseUrl: "productionBaseUrl", compressionOptions: "compressionOptions", allowedTypes: "allowedTypes", isEqpTableMultiLanguage: "isEqpTableMultiLanguage", tablePaginatorVisible: "tablePaginatorVisible", isTableSearcheable: "isTableSearcheable", tablePaginatorSize: "tablePaginatorSize", separatedUploadButtons: "separatedUploadButtons", showPreview: "showPreview", singleAttachmentDragAndDrop: "singleAttachmentDragAndDrop", cropOptions: "cropOptions", cropDialogClass: "cropDialogClass", maxFileSizeMB: "maxFileSizeMB", cardSize: "cardSize", customCardWidthPx: "customCardWidthPx", customCardHeightPx: "customCardHeightPx", layout: "layout", openLinkLabel: "openLinkLabel", addButtonLabel: "addButtonLabel", downloadLabel: "downloadLabel", deleteLabel: "deleteLabel", fileNameLabel: "fileNameLabel", previewLabel: "previewLabel", uploadFileLabel: "uploadFileLabel", confirmLabel: "confirmLabel", abortLabel: "abortLabel", saveLabel: "saveLabel", exitLabel: "exitLabel", uploadWithDropboxLabel: "uploadWithDropboxLabel", cropLabel: "cropLabel", deleteDialogTitle: "deleteDialogTitle", deleteDialogMessage: "deleteDialogMessage", noImageSelectedErrorMessage: "noImageSelectedErrorMessage", wrongTypeSelectedErrorMessage: "wrongTypeSelectedErrorMessage", videoPreviewErrorMessage: "videoPreviewErrorMessage", audioPreviewErrorMessage: ["videoPreviewErrorMessage", "audioPreviewErrorMessage"], flipHorinzontalLabel: "flipHorinzontalLabel", flipVerticalLabel: "flipVerticalLabel", rotateRightLabel: "rotateRightLabel", rotateLeftLabel: "rotateLeftLabel", base64LimitMB: "base64LimitMB", uploadTitle: "uploadTitle", uploadSubtitle: "uploadSubtitle", dropHereLabel: "dropHereLabel", supportedFormatsLabel: "supportedFormatsLabel", browseFilesLabel: "browseFilesLabel", uploadSummaryLabel: "uploadSummaryLabel", filesLabel: "filesLabel", totalSizeLabel: "totalSizeLabel", emptyStateLabel: "emptyStateLabel", addedSuccessfullyLabel: "addedSuccessfullyLabel", removedLabel: "removedLabel", chooseView: "chooseView", showSummary: "showSummary", viewMode: "viewMode", showUploadTitle: "showUploadTitle", showDropArea: "showDropArea", hiddenColumns: "hiddenColumns", hiddenActions: "hiddenActions", showActionButtons: "showActionButtons", videoCompression: "videoCompression", customMenuActions: "customMenuActions", customColumns: "customColumns" }, outputs: { localEditedAttachments: "localEditedAttachments", abortAddAttachment: "abortAddAttachment", downloadAttachment: "downloadAttachment", onDeleteAttachment: "onDeleteAttachment" }, viewQueries: [{ propertyName: "dialogAddAttachment", first: true, predicate: ["dialogAddAttachment"], descendants: true, static: true }, { propertyName: "dialogAddMultipleAttachment", first: true, predicate: ["dialogAddMultipleAttachment"], descendants: true, static: true }, { propertyName: "dialogCropImage", first: true, predicate: ["dialogCropImage"], descendants: true, static: true }, { propertyName: "addingLinkTemplate", first: true, predicate: ["addingLinkTemplate"], descendants: true }, { propertyName: "imageCropper", first: true, predicate: ImageCropperComponent, descendants: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true }, { propertyName: "inlinePreviewTemplate", first: true, predicate: ["inlinePreviewTemplate"], descendants: true, static: true }, { propertyName: "dialogPreview", first: true, predicate: ["dialogPreview"], descendants: true, static: true }, { propertyName: "defaultFileTemplate", first: true, predicate: ["defaultFileTemplate"], descendants: true, static: true }, { propertyName: "defaultActionsTemplate", first: true, predicate: ["defaultActionsTemplate"], descendants: true, static: true }], ngImport: i0, template: "<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n@if(showUploadTitle == true || chooseView == true){\r\n<div class=\"header\">\r\n @if(showUploadTitle == true){\r\n <h4>{{ uploadTitle }}</h4>\r\n }\r\n @if(chooseView == true){\r\n <mat-button-toggle-group [value]=\"viewMode\" (change)=\"setViewMode($event.value)\"\r\n aria-label=\"Modalit\u00E0 di visualizzazione\">\r\n <mat-button-toggle value=\"card\"><mat-icon>grid_view</mat-icon></mat-button-toggle>\r\n <mat-button-toggle value=\"table\"><mat-icon>view_list</mat-icon></mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione singolo -->\r\n@if (multipleAttachment != true) {\r\n@if (!singleAttachmentDragAndDrop) {\r\n@if (!addingLinkMode) {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addAttachmentButton\"></ng-container>\r\n</div>\r\n} @else {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addingLinkTemplate\"></ng-container>\r\n</div>\r\n}\r\n} @else {\r\n<input #fileInput id=\"file_attachment\" name=\"file_attachment\" type=\"file\" hidden (change)=\"onFileAdded($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (allowedTypes && allowedTypes.includes(1) && (!attachmentsList || attachmentsList.length == 0 ||\r\n(attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n\r\n@if (showDropArea == true) {\r\n<!-- FULL -->\r\n@if (layout === 'full') {\r\n\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\"\r\n (click)=\"onSelectFile($event, fileInput)\" role=\"button\" tabindex=\"0\" (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n <div class=\"secondary-action\">\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n @if (allowedTypes.includes(2) && allowedTypes.includes(3)) {\r\n <a class=\"secondary-action-link\" [matMenuTriggerFor]=\"isDisabled ? null : linkMenu\"\r\n [class.disabled-link]=\"isDisabled\" (click)=\"$event.stopPropagation()\">\r\n o aggiungi da web\r\n </a>\r\n <mat-menu #linkMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"switchToAddingLinkMode()\">\r\n <mat-icon>link</mat-icon>\r\n <span>Aggiungi da link</span>\r\n </button>\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\">\r\n <mat-icon>cloud_queue</mat-icon>\r\n <span>Carica da Dropbox</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @else if (allowedTypes.includes(2)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">\r\n aggiungi un link\r\n </a>\r\n }\r\n\r\n @else if (allowedTypes.includes(3)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); chooseDropboxFile()\">\r\n carica da Dropbox\r\n </a>\r\n }\r\n }\r\n </div>\r\n</div>\r\n}@else {\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n}\r\n}\r\n\r\n<!-- Azioni singolo elemento (come prima) -->\r\n<div class=\"text-center\">\r\n @if (attachmentsList && attachmentsList.length > 0 && attachmentsList[0] && showActionButtons == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n @if (attachmentsList[0].AttachmentType == AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n } @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n {{ attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel }}\r\n </button>\r\n\r\n @if (showPreview && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video')\r\n && !attachmentsList[0].FileContentType.startsWith('audio'))) && attachmentsList[0].IsImage == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n <mat-icon>visibility</mat-icon> {{ previewLabel }}\r\n </button>\r\n }\r\n\r\n <button [disabled]=\"disableAction\" class=\"mb-2 eqp-attachments-delete-btn\"\r\n (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\" mat-raised-button [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{ deleteLabel }}\r\n </button>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione multipla -->\r\n@if (multipleAttachment == true && showDropArea == true) {\r\n<input #fileInput id=\"file_attachment_multi\" name=\"file_attachment_multi\" type=\"file\" hidden\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (layout === 'full') {\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\"\r\n (click)=\"onSelectFile($event, fileInput)\" role=\"button\" tabindex=\"0\" (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n @if (allowedTypes.includes(2)) {\r\n <div class=\"secondary-action-link\">\r\n o <a (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">aggiungi un link</a>\r\n </div>\r\n }\r\n</div>\r\n}@else{\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button [disabled]=\"isDisabled\" color=\"primary\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n\r\n@if (attachmentsList?.length > 0 && showSummary) {\r\n<div class=\"upload-stats\">\r\n\r\n <div class=\"stats-info\">\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ attachmentsList?.length }}</div>\r\n <div class=\"stat-label\">{{ filesLabel }}</div>\r\n </div>\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ totalSizeFormatted }}</div>\r\n <div class=\"stat-label\">{{ totalSizeLabel }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n\r\n</div>\r\n} @else if(attachmentsList?.length == 0){\r\n<div class=\"empty-state\">{{ emptyStateLabel }}</div>\r\n}\r\n\r\n<!-- Griglia anteprime card (vale per singolo e multiplo) -->\r\n@if (viewMode === 'card') {\r\n\r\n<div class=\"file-previews\" [ngStyle]=\"getPreviewsContainerStyle()\">\r\n @for (att of attachmentsList; track att.ID) {\r\n <div [ngClass]=\"getCardClass(att)\">\r\n <div class=\"preview-img-container\" (click)=\"!att.isUploading && handlePrimaryAction(att)\">\r\n\r\n @if (att.IsImage || att.FileThumbnailBase64) {\r\n <img class=\"preview-img\" [src]=\"'data:image/jpeg;base64,' + (att.FileThumbnailBase64 || att.FileDataBase64)\"\r\n [alt]=\"att.FileName\" />\r\n } @else {\r\n <div class=\"file-icon\"><i [ngClass]=\"getAttachmentIcon(att)\"></i></div>\r\n }\r\n\r\n <div class=\"preview-action-overlay\">\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n <mat-icon>play_arrow</mat-icon>\r\n }\r\n @else if (att.IsImage && canBePreviewed(att)) {\r\n <mat-icon>visibility</mat-icon>\r\n }\r\n @else if (att.FileContentType === 'application/pdf' && canBePreviewed(att)) {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n @else if (att.AttachmentType === AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n }\r\n @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-info\">\r\n <div class=\"file-name\" [title]=\"att.FileName\">{{ att.FileName }}</div>\r\n </div>\r\n\r\n @if(!disableAction){\r\n <button mat-icon-button class=\"remove-btn\" type=\"button\" aria-label=\"Rimuovi allegato\"\r\n (click)=\"deleteAttachment(att)\" [disabled]=\"att.isUploading\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (att.isUploading) {\r\n <div class=\"upload-spinner\"></div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n} @else if(viewMode === 'table' && attachmentsList?.length > 0) {\r\n\r\n\r\n<div class=\"table-view-container\">\r\n\r\n <div class=\"table-header\">\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n {{ col.display }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (att of attachmentsList; track att.ID) {\r\n <div class=\"table-row\">\r\n\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n\r\n @switch (col.type) {\r\n\r\n @case ('template') {\r\n <div class=\"template-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: att }\"></ng-container>\r\n </div>\r\n }\r\n @case ('date') {\r\n <span class=\"metadata-value\">{{ att[col.key] | date:'dd/MM/yyyy' }}</span>\r\n }\r\n @default {\r\n <span class=\"metadata-value\">{{ att[col.key] }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Notifica toast -->\r\n<div class=\"upload-notification\" [class.show]=\"toast?.visible\" [class.success]=\"toast?.type === 'success'\"\r\n [class.error]=\"toast?.type === 'error'\">\r\n <span>{{ toast?.text }}</span>\r\n <div class=\"notification-progress\"></div>\r\n</div>\r\n\r\n<ng-template #defaultFileTemplate let-att>\r\n <i class=\"file-icon-small\" [ngClass]=\"getAttachmentIcon(att)\"></i>\r\n <div class=\"file-info-text\">\r\n <span class=\"file-name-table\">{{ att.FileName }}</span>\r\n <span class=\"file-type-table\">{{ att.FileExtension || 'Link' }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultActionsTemplate let-att>\r\n <button mat-icon-button (click)=\"handlePrimaryAction(att)\"\r\n [matTooltip]=\"att.FileContentType?.startsWith('video/') ? 'Riproduci video' : 'Visualizza/Scarica'\">\r\n\r\n <mat-icon>\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n play_arrow\r\n } @else {\r\n {{ att.AttachmentType === AttachmentType.FILE ? 'download' : 'open_in_new' }}\r\n }\r\n </mat-icon>\r\n </button>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"actionsMenu\" matTooltip=\"Altre opzioni\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n @for (action of _sortedMenuActions; track action.name) {\r\n @if (!isActionHidden(action, att)) {\r\n <button mat-menu-item (click)=\"action.fn(att)\" [disabled]=\"action.disabled ? action.disabled(att) : false\">\r\n <mat-icon [color]=\"action.icon === 'delete' ? 'warn' : undefined\">\r\n {{ action.icon }}\r\n </mat-icon>\r\n <span>{{ action.name }}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogCropImage>\r\n <div style=\"overflow-x: hidden\" [ngClass]=\"cropDialogClass\">\r\n <!-- @if (showCropImage == true) { -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{ form: newAttachmentForm }\">\r\n </ng-container>\r\n <!-- } -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n @if (row.AttachmentType != AttachmentType.LINK && row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <img [src]=\"'data:image/png;base64,' + (row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64)\" />\r\n </div>\r\n } @else if (row.AttachmentType != AttachmentType.LINK && !row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"modern-dialog-container\"> @if (selectedAttachment) {\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ previewLabel }}</span>\r\n <span class=\"file-t\">{{ selectedAttachment.FileName }}</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"media-viewer-wrapper\">\r\n @if (selectedAttachment.IsImage) {\r\n <img class=\"main-preview-media\"\r\n [src]=\"'data:image/png;base64,' + (selectedAttachment.FileDataBase64 || selectedAttachment.FileThumbnailBase64)\"\r\n [alt]=\"selectedAttachment.FileName\" />\r\n }\r\n @else if (selectedAttachment.FileContentType?.startsWith('video/')) {\r\n <video controls autoplay playsinline class=\"main-preview-media video-player\">\r\n <source [src]=\"selectedAttachment.TrustedUrl\" [type]=\"selectedAttachment.FileContentType\">\r\n Il tuo browser non supporta il video.\r\n </video>\r\n }\r\n @else {\r\n <div class=\"iframe-container\">\r\n <iframe class=\"preview-iframe-modern\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n }\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Chiudi</button>\r\n @if (selectedAttachment.AttachmentType !== AttachmentType.LINK) {\r\n <button mat-raised-button color=\"primary\" (click)=\"viewAttachment(selectedAttachment)\" class=\"btn-download\">\r\n <mat-icon>download</mat-icon> <span>{{ downloadLabel }}</span>\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n <input #fileInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n @if (allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || !attachmentsList ||\r\n attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"addFile(allowedTypes[0], fileInput)\" [disabled]=\"isDisabled\">\r\n @if (allowedTypes[0] == 1) { <mat-icon>cloud_upload</mat-icon> }\r\n @if (allowedTypes[0] == 2) { <i class=\"fas fa-link\"></i> }\r\n @if (allowedTypes[0] == 3) { <i class=\"fa-brands fa-dropbox\"></i> }\r\n <span style=\"margin-left: 10px\">\r\n {{ allowedTypes[0] == 1 ? (addButtonLabel + \" file\") : allowedTypes[0] == 2 ? (addButtonLabel + \" link\") :\r\n uploadWithDropboxLabel }}\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (!separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\">\r\n @if (multipleAttachment != true) { <mat-icon>cloud_upload</mat-icon> } @else { <mat-icon>add</mat-icon> }\r\n <span style=\"margin-left: 0px\">{{ addButtonLabel }}</span>\r\n </button>\r\n\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(1)) {\r\n <button mat-menu-item (click)=\"imageInput.click()\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(2)) {\r\n <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"switchToAddingLinkMode()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if (separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <div class=\"btn-group\">\r\n @if (allowedTypes.includes(1)) {\r\n <button (click)=\"imageInput.click()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-solid fa-cloud-upload\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(2)) {\r\n <button (click)=\"switchToAddingLinkMode()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button (click)=\"chooseDropboxFile()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ cropLabel }}</span>\r\n <span class=\"file-t\">Regola le dimensioni e l'orientamento</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" (click)=\"abortFile()\" class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"crop-toolbar\">\r\n @if (cropOptions.includes(1)) {\r\n <button mat-icon-button [matTooltip]=\"rotateLeftLabel\"\r\n (click)=\"rotateLeft()\"><mat-icon>rotate_left</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"rotateRightLabel\"\r\n (click)=\"rotateRight()\"><mat-icon>rotate_right</mat-icon></button>\r\n }\r\n @if (cropOptions.includes(2)) {\r\n <button mat-icon-button [matTooltip]=\"flipHorinzontalLabel\"\r\n (click)=\"flipHorizontal()\"><mat-icon>flip_horizontal</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"flipVerticalLabel\"\r\n (click)=\"flipVertical()\"><mat-icon>flip_vertical</mat-icon></button>\r\n }\r\n <button mat-icon-button matTooltip=\"Reset\"\r\n (click)=\"restoreOriginalDimensions()\"><mat-icon>replay</mat-icon></button>\r\n </div>\r\n\r\n <div class=\"media-viewer-wrapper\">\r\n <div class=\"crop-container-modern\">\r\n <image-cropper [imageFile]=\"selectedFile\" [maintainAspectRatio]=\"false\" [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\" [resizeToWidth]=\"customWidth\"\r\n [resizeToHeight]=\"customHeight\" [output]=\"'base64'\" [containWithinAspectRatio]=\"true\" [onlyScaleDown]=\"true\"\r\n [alignImage]=\"'center'\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button (click)=\"abortFile()\" class=\"btn-close\">{{ abortLabel }}</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmAddAttachment()\" class=\"btn-download\">\r\n <mat-icon>check</mat-icon> {{ confirmLabel }}\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER FORM DI AGGIUNTA DI UN LINK -->\r\n<ng-template #addingLinkTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"type-icon-wrapper\">\r\n <mat-icon>link</mat-icon>\r\n </div>\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">Aggiungi un link</span>\r\n <span class=\"file-t\">Inserisci l'URL della risorsa web</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"add-link-modern-content\">\r\n <form [formGroup]=\"newAttachmentForm\" class=\"add-link-form\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100 mt-3\">\r\n <mat-label>URL del collegamento</mat-label>\r\n <input matInput formControlName=\"filePath\" placeholder=\"https://...\" required>\r\n <mat-icon matSuffix>language</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label>Titolo (opzionale)</mat-label>\r\n <input matInput formControlName=\"fileName\" placeholder=\"Es. Documento Progetto\">\r\n <mat-icon matSuffix>title</mat-icon>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" [mat-dialog-close]=\"newAttachmentForm.value\"\r\n [disabled]=\"newAttachmentForm.invalid\" class=\"btn-download\">\r\n <mat-icon>add</mat-icon> Aggiungi\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";:host{--primary-color: #6a5af9;--primary-color-dark: #5441f8;--success-color: #1ce593;--error-color: #ff5b5b;--background-light: #f7f9fc;--background-card: rgba(255, 255, 255, .7);--text-color: #1e293b;--text-color-light: #64748b;--border-color: rgba(203, 213, 225, .5);--shadow-color: rgba(99, 102, 241, .2);--border-radius: 16px;--transition-speed: .3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--primary-color)}70%{box-shadow:0 0 0 10px #6a5af900}to{box-shadow:0 0 #6a5af900}}.container{width:100%;max-width:700px;margin:2rem auto;font-family:Inter,sans-serif}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.header h1{color:var(--text-color);font-size:1.8rem;font-weight:700;margin:0}.dropbox{width:100%;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:2.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all var(--transition-speed) ease}.dropbox:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color);border-color:var(--primary-color)}.dropbox.dragover{border-style:solid;border-color:var(--primary-color);transform:scale(1.02);box-shadow:0 0 25px var(--shadow-color);animation:pulse 1.5s infinite}.dropbox .dropbox-icon{font-size:3.5rem;color:var(--primary-color)}.dropbox .dropbox-text{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-top:1rem}.dropbox .dropbox-subtext{color:var(--text-color-light);margin-top:.5rem}.dropbox .browse-btn{margin-top:1.5rem;padding:.75rem 1.5rem;background-color:var(--primary-color);color:#fff;border:none;border-radius:10px;font-weight:600;transition:all var(--transition-speed) ease}.dropbox .browse-btn:hover{background-color:var(--primary-color-dark);transform:translateY(-2px)}.file-previews{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.5rem;margin-top:2rem}.file-previews{display:grid;gap:16px;padding:16px;grid-template-columns:repeat(auto-fill,minmax(var(--card-min-width, 200px),1fr))}.file-preview{background-color:var(--background-card);border-radius:var(--border-radius);box-shadow:0 4px 15px #0000000d;border:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column;position:relative;opacity:0;animation:fadeIn .5s ease-out forwards;transition:transform var(--transition-speed) ease,box-shadow var(--transition-speed) ease}.file-preview.uploading{cursor:wait}.file-preview.uploading .preview-img-container:after{content:\"\";position:absolute;inset:0;background:#ffffffb3;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.file-preview .preview-action-overlay{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;background-color:#0006;color:#fff;opacity:1;transition:opacity .3s ease}.file-preview .preview-action-overlay .mat-icon{font-size:36px;width:36px;height:36px}.file-preview .remove-btn{position:absolute;top:8px;right:8px;z-index:2;background-color:#0000004d;color:#fff;width:32px;height:32px;display:flex;align-items:center;justify-content:center;padding:0;transition:all var(--transition-speed) ease}.file-preview .remove-btn:hover{background-color:#ff5b5b}.file-preview .remove-btn .mat-icon{font-size:18px}@media (hover: hover){.file-preview .remove-btn .file-preview .preview-action-overlay{opacity:0}.file-preview .remove-btn .file-preview:hover .preview-action-overlay,.file-preview .remove-btn .file-preview:hover .remove-btn{opacity:1}.file-preview .remove-btn .file-preview .remove-btn{opacity:0}}@media (hover: hover) and (min-width: 769px){.file-preview .remove-btn{opacity:0;transform:scale(.8)}.file-preview:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color)}.file-preview:hover .remove-btn{opacity:1;transform:scale(1)}}.file-preview .preview-img-container{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;position:relative;cursor:pointer;background-color:#f0f2f5}.file-preview .preview-img{width:100%;height:100%;object-fit:cover}.file-preview .file-icon{font-size:4rem;color:var(--primary-color)}.file-preview .file-info{padding:12px;border-top:1px solid var(--border-color);flex-grow:1;display:flex;align-items:center}.file-preview .file-name{font-weight:600;font-size:.9rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-preview .upload-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-left-color:var(--primary-color);border-radius:50%;animation:spin 1s linear infinite;pointer-events:none}.file-preview.card-small{width:140px}.file-preview.card-small .preview-img-container{height:80px}.file-preview.card-small .file-info{padding:8px}.file-preview.card-small .file-name{font-size:.8rem}.file-preview.card-small .file-icon{font-size:3rem}.file-preview.card-small .remove-btn{width:28px;height:28px}.file-preview.card-small .remove-btn .mat-icon{font-size:16px}.file-preview.card-large{width:280px}.file-preview.card-large .preview-img-container{height:180px}.file-preview.card-large .file-info{padding:16px}.file-preview.card-large .file-name{font-size:1rem}.file-preview.card-large .file-icon{font-size:5rem}.file-preview.card-large .remove-btn{width:36px;height:36px}.file-preview.card-large .remove-btn .mat-icon{font-size:20px}.file-preview[style*=--eqp-card-width]{width:var(--eqp-card-width)}.file-preview[style*=--eqp-card-width] .preview-img-container{height:calc(var(--eqp-card-width) * .65)}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}.upload-stats{background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:1.5rem;margin-top:2rem;animation:fadeIn .5s ease-out}.upload-stats .stats-info{display:flex;justify-content:space-around}.upload-stats .progress-bar{height:10px;background-color:var(--border-color);border-radius:5px;overflow:hidden;margin-top:1rem}.upload-stats .progress-fill{height:100%;background:linear-gradient(90deg,var(--primary-color),var(--success-color));transition:width var(--transition-speed) ease-out;border-radius:5px}.upload-notification{position:fixed;bottom:20px;left:50%;transform:translate(-50%,100px);padding:1rem 1.5rem;border-radius:var(--border-radius);color:#fff;font-weight:600;box-shadow:0 10px 30px #0003;transition:transform var(--transition-speed) cubic-bezier(.175,.885,.32,1.275)}.upload-notification.show{transform:translate(-50%)}.upload-notification.success{background-color:var(--success-color)}.upload-notification.error{background-color:var(--error-color)}::ng-deep .cdk-overlay-pane.eqp-crop-dialog{transform:translateY(-4vh)}@media (max-width: 600px){::ng-deep .cdk-overlay-pane.crop-dialog{width:auto!important}}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__surface{border-radius:20px!important;padding:0!important;overflow:hidden!important;width:fit-content!important;min-width:350px!important;max-width:95vw!important;margin:0 auto;background-color:#fff!important}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;display:flex;flex-direction:column}.modern-dialog-container{display:flex;flex-direction:column;width:100%;max-width:100%;height:100%;max-height:90vh;background:#fff;--preview-header-h: 66px;--preview-footer-h: 66px;--preview-padding-y: 30px}.modern-dialog-container .main-preview-media{display:block;max-width:100%;max-height:var(--media-max-h);width:auto;height:auto;object-fit:contain;border-radius:12px;background:#fff;padding:4px;box-shadow:0 10px 30px #00000014}.modern-dialog-container video.main-preview-media{width:min(100%,1100px);background:#000}.modern-dialog-container .iframe-container{width:min(100%,1100px);height:var(--media-max-h);display:flex;width:100%;max-width:1100px}.modern-dialog-container .preview-iframe-modern{width:100%;height:100%;border:0;border-radius:12px;background:#f8fafc}.modern-dialog-container .preview-header{flex:0 0 auto;flex-shrink:0;padding:14px 20px;display:flex;align-items:center;justify-content:flex-start;border-bottom:1px solid var(--border-color);background:#f8fafc;z-index:10;width:100%}.modern-dialog-container .preview-header .header-info{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex:1 1 auto;min-width:0;text-align:left}.modern-dialog-container .preview-header .header-info .type-icon-wrapper{background:var(--primary-color);color:#fff;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px var(--shadow-color)}.modern-dialog-container .preview-header .header-info .title-group{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .main-t{font-weight:800;color:var(--text-color);font-size:.95rem;line-height:1.2;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .file-t{font-size:.75rem;color:var(--text-color-light);max-width:250px;overflow:hidden;text-overflow:ellipsis;text-align:left}.modern-dialog-container .preview-content-area{flex:1;background:#fff!important;display:flex;flex-direction:column;padding:15px 15px 22px!important;overflow:hidden!important;min-height:0;width:auto;--media-max-h: calc(90vh - var(--preview-header-h) - var(--preview-footer-h) - var(--preview-padding-y));width:100%}.modern-dialog-container .preview-content-area .crop-toolbar{flex-shrink:0;z-index:20;background:#0f172a14;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 16px;border-radius:30px;margin:0 auto 15px;display:flex;gap:8px;box-shadow:0 4px 12px #0000000d}.modern-dialog-container .preview-content-area .crop-toolbar button{color:var(--text-color)!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper{flex:1;width:100%;display:flex;justify-content:center;align-items:center;min-height:0;overflow:visible}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern{width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:transparent;border-radius:12px;padding:0}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern image-cropper{max-width:100%;max-height:100%;display:block}.modern-dialog-container .add-link-modern-content{flex:1;background:#fff;padding:24px!important}.modern-dialog-container .add-link-modern-content .add-link-form{display:flex;flex-direction:column;gap:10px}.modern-dialog-container .preview-actions{flex-shrink:0;padding:12px 24px;background:#f8fafc;border-top:1px solid #e2e8f0;margin:0}.modern-dialog-container .preview-actions .btn-download{border-radius:12px;font-weight:600;box-shadow:0 4px 12px var(--shadow-color)}@media (max-width: 600px){.modern-dialog-container{max-height:95vh}.modern-dialog-container .preview-content-area{padding:10px!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper video.main-preview-media{width:100%!important;max-height:55vh!important;border-radius:4px;box-shadow:none}.modern-dialog-container .preview-content-area .media-viewer-wrapper .iframe-container{height:50vh}.modern-dialog-container .preview-content-area .crop-toolbar{width:calc(100% - 20px);max-width:400px;margin-bottom:10px;padding:4px 8px;gap:4px;overflow-x:auto;justify-content:center;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-dialog-container .preview-content-area .crop-toolbar::-webkit-scrollbar{display:none}.modern-dialog-container .preview-content-area .crop-toolbar button{flex-shrink:0;transform:scale(.85);width:40px;height:40px}.modern-dialog-container .preview-actions{padding:10px 15px;flex-direction:column-reverse;gap:8px}.modern-dialog-container .preview-actions button{width:100%;margin:0!important}}@media (max-width: 360px){.modern-dialog-container .preview-content-area .crop-toolbar{gap:2px}.modern-dialog-container .preview-content-area .crop-toolbar button{transform:scale(.75)}}.control-icon{font-size:28px;cursor:pointer}image-cropper,image-cropper canvas,image-cropper img{max-width:100%!important;max-height:100%!important}.crop-large{display:flex}.crop-small{display:none}@media (max-width: 600px){.dialog-content{max-height:55vh}.crop-container{max-width:100%;aspect-ratio:auto}.crop-large{display:none}.crop-small{display:flex;justify-content:center;gap:14px}.control-icon{font-size:24px}}.stats-header{display:flex;justify-content:space-between;align-items:center;width:100%}.table-view-container{margin-top:1.5rem;background-color:var(--background-card);border-radius:var(--border-radius);border:1px solid var(--border-color);overflow:hidden;animation:fadeIn .5s ease-out}.table-header,.table-row{display:flex;align-items:center;padding:0 1rem;transition:background-color var(--transition-speed) ease}.table-header{background-color:#f8f9fa;font-weight:600;color:var(--text-color-light);font-size:.8rem;text-transform:uppercase;border-bottom:2px solid var(--border-color)}.table-row{border-bottom:1px solid var(--border-color)}.table-row:last-child{border-bottom:none}.table-row:hover{background-color:#00000005}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem}.name-col{flex:4}.size-col,.date-col{flex:2}.actions-col{flex:1;justify-content:flex-end;min-width:150px}.file-icon-small{font-size:1.5rem;color:var(--primary-color)}.file-info-text{display:flex;flex-direction:column}.file-name-table{font-weight:600;color:var(--text-color)}.file-type-table{font-size:.8rem;color:var(--text-color-light)}@media (max-width: 768px){.date-col{display:none}.name-col{flex:3}.size-col{flex:2}.actions-col{flex:2;min-width:120px}}.secondary-action-link{color:var(--primary-color);text-decoration:none;border-bottom:1px solid var(--primary-color);cursor:pointer;font-weight:500}.secondary-action-link:hover{color:var(--primary-color-dark);border-bottom-color:var(--primary-color-dark)}h2[mat-dialog-title]+mat-dialog-content.add-link-dialog-content{padding-top:20px}mat-dialog-content.add-link-dialog-content{padding-left:24px;padding-right:24px;padding-bottom:20px}.add-link-form{display:flex;flex-direction:column;gap:16px}::ng-deep .eqp-attachments-preview-dialog{--mdc-dialog-subhead-line-height: normal}::ng-deep .eqp-attachments-preview-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;background:#fff!important}:host ::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{--mdc-dialog-subhead-size: 1.25rem;--mdc-dialog-subhead-line-height: 1.5;--mdc-dialog-subhead-weight: 600;--mdc-dialog-supporting-text-size: 1rem}.empty-state{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:1.5rem 1rem;margin-top:1.5rem;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#f8f9fa;text-align:center;color:var(--text-color-light);animation:fadeIn .5s ease-out}.empty-state:before{content:\"\\1f4ed\";font-size:2.5rem;margin-bottom:1rem;opacity:.7}.secondary-action-link.disabled-link{color:#adb5bd;cursor:not-allowed;border-bottom-color:transparent}.secondary-action-link.disabled-link:hover{color:#adb5bd;border-bottom-color:transparent}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem;min-width:0;overflow:hidden}.table-cell.col-actions{flex:0 0 150px;justify-content:flex-end;overflow:visible}.compact-uploader{display:flex;align-items:center;gap:16px;padding:16px;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#fcfdff;transition:all .3s ease}.compact-uploader .compact-text{flex:1 1 auto;min-width:0;cursor:pointer}.compact-uploader .compact-text:hover .compact-title{color:var(--primary-color)}.compact-uploader .compact-title{font-weight:600;color:var(--text-color);transition:color .3s ease}.compact-uploader .compact-subtitle{font-size:.8rem;color:var(--text-color-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.compact-uploader .compact-icon mat-icon{font-size:36px;width:36px;height:36px;color:var(--primary-color)}.compact-uploader .compact-actions{display:flex;gap:8px;flex-shrink:0}.compact-uploader.dragover{background-color:#f4f8ff;border-color:var(--primary-color);box-shadow:0 0 10px var(--shadow-color)}\n"], dependencies: [{ kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i10.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i10.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i13.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i14.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "pipe", type: i13.DatePipe, name: "date" }] });
1304
1305
  }
1305
1306
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EqpAttachmentsComponent, decorators: [{
1306
1307
  type: Component,
1307
- args: [{ selector: "eqp-attachments", template: "<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n<div class=\"header\">\r\n @if(showUploadTitle == true){\r\n <h4>{{ uploadTitle }}</h4>\r\n }\r\n @if(chooseView == true){\r\n <mat-button-toggle-group [value]=\"viewMode\" (change)=\"setViewMode($event.value)\"\r\n aria-label=\"Modalit\u00E0 di visualizzazione\">\r\n <mat-button-toggle value=\"card\"><mat-icon>grid_view</mat-icon></mat-button-toggle>\r\n <mat-button-toggle value=\"table\"><mat-icon>view_list</mat-icon></mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n</div>\r\n\r\n<!-- Gestione singolo -->\r\n@if (multipleAttachment != true) {\r\n@if (!singleAttachmentDragAndDrop) {\r\n@if (!addingLinkMode) {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addAttachmentButton\"></ng-container>\r\n</div>\r\n} @else {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addingLinkTemplate\"></ng-container>\r\n</div>\r\n}\r\n} @else {\r\n<input #fileInput id=\"file_attachment\" name=\"file_attachment\" type=\"file\" hidden (change)=\"onFileAdded($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (allowedTypes && allowedTypes.includes(1) && (!attachmentsList || attachmentsList.length == 0 ||\r\n(attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n\r\n@if (showDropArea == true) {\r\n<!-- FULL -->\r\n@if (layout === 'full') {\r\n\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\"\r\n (click)=\"onSelectFile($event, fileInput)\" role=\"button\" tabindex=\"0\" (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n <div class=\"secondary-action\">\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n @if (allowedTypes.includes(2) && allowedTypes.includes(3)) {\r\n <a class=\"secondary-action-link\" [matMenuTriggerFor]=\"isDisabled ? null : linkMenu\"\r\n [class.disabled-link]=\"isDisabled\" (click)=\"$event.stopPropagation()\">\r\n o aggiungi da web\r\n </a>\r\n <mat-menu #linkMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"switchToAddingLinkMode()\">\r\n <mat-icon>link</mat-icon>\r\n <span>Aggiungi da link</span>\r\n </button>\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\">\r\n <mat-icon>cloud_queue</mat-icon>\r\n <span>Carica da Dropbox</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @else if (allowedTypes.includes(2)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">\r\n aggiungi un link\r\n </a>\r\n }\r\n\r\n @else if (allowedTypes.includes(3)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); chooseDropboxFile()\">\r\n carica da Dropbox\r\n </a>\r\n }\r\n }\r\n </div>\r\n</div>\r\n}@else {\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n}\r\n}\r\n\r\n<!-- Azioni singolo elemento (come prima) -->\r\n<div class=\"text-center\">\r\n @if (attachmentsList && attachmentsList.length > 0 && attachmentsList[0]) {\r\n <button class=\"mb-2 me-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n @if (attachmentsList[0].AttachmentType == AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n } @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n {{ attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel }}\r\n </button>\r\n\r\n @if (showPreview && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video')\r\n && !attachmentsList[0].FileContentType.startsWith('audio'))) && attachmentsList[0].IsImage == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n <mat-icon>visibility</mat-icon> {{ previewLabel }}\r\n </button>\r\n }\r\n\r\n <button [disabled]=\"disableAction\" class=\"mb-2 eqp-attachments-delete-btn\"\r\n (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\" mat-raised-button [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{ deleteLabel }}\r\n </button>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione multipla -->\r\n@if (multipleAttachment == true && showDropArea == true) {\r\n<input #fileInput id=\"file_attachment_multi\" name=\"file_attachment_multi\" type=\"file\" hidden\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (layout === 'full') {\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\"\r\n (click)=\"onSelectFile($event, fileInput)\" role=\"button\" tabindex=\"0\" (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n @if (allowedTypes.includes(2)) {\r\n <div class=\"secondary-action-link\">\r\n o <a (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">aggiungi un link</a>\r\n </div>\r\n }\r\n</div>\r\n}@else{\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button [disabled]=\"isDisabled\" color=\"primary\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n\r\n@if (attachmentsList?.length > 0 && showSummary) {\r\n<div class=\"upload-stats\">\r\n\r\n <div class=\"stats-info\">\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ attachmentsList?.length }}</div>\r\n <div class=\"stat-label\">{{ filesLabel }}</div>\r\n </div>\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ totalSizeFormatted }}</div>\r\n <div class=\"stat-label\">{{ totalSizeLabel }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n\r\n</div>\r\n} @else if(attachmentsList?.length == 0){\r\n<div class=\"empty-state\">{{ emptyStateLabel }}</div>\r\n}\r\n\r\n<!-- Griglia anteprime card (vale per singolo e multiplo) -->\r\n@if (viewMode === 'card') {\r\n\r\n<div class=\"file-previews\" [ngStyle]=\"getPreviewsContainerStyle()\">\r\n @for (att of attachmentsList; track att.ID) {\r\n <div [ngClass]=\"getCardClass(att)\">\r\n <div class=\"preview-img-container\" (click)=\"!att.isUploading && handlePrimaryAction(att)\">\r\n\r\n @if (att.IsImage || att.FileThumbnailBase64) {\r\n <img class=\"preview-img\" [src]=\"'data:image/jpeg;base64,' + (att.FileThumbnailBase64 || att.FileDataBase64)\"\r\n [alt]=\"att.FileName\" />\r\n } @else {\r\n <div class=\"file-icon\"><i [ngClass]=\"getAttachmentIcon(att)\"></i></div>\r\n }\r\n\r\n <div class=\"preview-action-overlay\">\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n <mat-icon>play_arrow</mat-icon>\r\n }\r\n @else if (att.IsImage && canBePreviewed(att)) {\r\n <mat-icon>visibility</mat-icon>\r\n }\r\n @else if (att.FileContentType === 'application/pdf' && canBePreviewed(att)) {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n @else if (att.AttachmentType === AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n }\r\n @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-info\">\r\n <div class=\"file-name\" [title]=\"att.FileName\">{{ att.FileName }}</div>\r\n </div>\r\n\r\n @if(!disableAction){\r\n <button mat-icon-button class=\"remove-btn\" type=\"button\" aria-label=\"Rimuovi allegato\"\r\n (click)=\"deleteAttachment(att)\" [disabled]=\"att.isUploading\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (att.isUploading) {\r\n <div class=\"upload-spinner\"></div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n} @else if(viewMode === 'table' && attachmentsList?.length > 0) {\r\n\r\n\r\n<div class=\"table-view-container\">\r\n\r\n <div class=\"table-header\">\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n {{ col.display }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (att of attachmentsList; track att.ID) {\r\n <div class=\"table-row\">\r\n\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n\r\n @switch (col.type) {\r\n\r\n @case ('template') {\r\n <div class=\"template-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: att }\"></ng-container>\r\n </div>\r\n }\r\n @case ('date') {\r\n <span class=\"metadata-value\">{{ att[col.key] | date:'dd/MM/yyyy' }}</span>\r\n }\r\n @default {\r\n <span class=\"metadata-value\">{{ att[col.key] }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Notifica toast -->\r\n<div class=\"upload-notification\" [class.show]=\"toast?.visible\" [class.success]=\"toast?.type === 'success'\"\r\n [class.error]=\"toast?.type === 'error'\">\r\n <span>{{ toast?.text }}</span>\r\n <div class=\"notification-progress\"></div>\r\n</div>\r\n\r\n<ng-template #defaultFileTemplate let-att>\r\n <i class=\"file-icon-small\" [ngClass]=\"getAttachmentIcon(att)\"></i>\r\n <div class=\"file-info-text\">\r\n <span class=\"file-name-table\">{{ att.FileName }}</span>\r\n <span class=\"file-type-table\">{{ att.FileExtension || 'Link' }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultActionsTemplate let-att>\r\n <button mat-icon-button (click)=\"handlePrimaryAction(att)\"\r\n [matTooltip]=\"att.FileContentType?.startsWith('video/') ? 'Riproduci video' : 'Visualizza/Scarica'\">\r\n\r\n <mat-icon>\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n play_arrow\r\n } @else {\r\n {{ att.AttachmentType === AttachmentType.FILE ? 'download' : 'open_in_new' }}\r\n }\r\n </mat-icon>\r\n </button>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"actionsMenu\" matTooltip=\"Altre opzioni\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n @for (action of _sortedMenuActions; track action.name) {\r\n @if (!isActionHidden(action, att)) {\r\n <button mat-menu-item (click)=\"action.fn(att)\" [disabled]=\"action.disabled ? action.disabled(att) : false\">\r\n <mat-icon [color]=\"action.icon === 'delete' ? 'warn' : undefined\">\r\n {{ action.icon }}\r\n </mat-icon>\r\n <span>{{ action.name }}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogCropImage>\r\n <div style=\"overflow-x: hidden\" [ngClass]=\"cropDialogClass\">\r\n <!-- @if (showCropImage == true) { -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{ form: newAttachmentForm }\">\r\n </ng-container>\r\n <!-- } -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n @if (row.AttachmentType != AttachmentType.LINK && row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <img [src]=\"'data:image/png;base64,' + (row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64)\" />\r\n </div>\r\n } @else if (row.AttachmentType != AttachmentType.LINK && !row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"modern-dialog-container\"> @if (selectedAttachment) {\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ previewLabel }}</span>\r\n <span class=\"file-t\">{{ selectedAttachment.FileName }}</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"media-viewer-wrapper\">\r\n @if (selectedAttachment.IsImage) {\r\n <img class=\"main-preview-media\"\r\n [src]=\"'data:image/png;base64,' + (selectedAttachment.FileDataBase64 || selectedAttachment.FileThumbnailBase64)\"\r\n [alt]=\"selectedAttachment.FileName\" />\r\n }\r\n @else if (selectedAttachment.FileContentType?.startsWith('video/')) {\r\n <video controls autoplay playsinline class=\"main-preview-media video-player\">\r\n <source [src]=\"selectedAttachment.TrustedUrl\" [type]=\"selectedAttachment.FileContentType\">\r\n Il tuo browser non supporta il video.\r\n </video>\r\n }\r\n @else {\r\n <div class=\"iframe-container\">\r\n <iframe class=\"preview-iframe-modern\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n }\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Chiudi</button>\r\n @if (selectedAttachment.AttachmentType !== AttachmentType.LINK) {\r\n <button mat-raised-button color=\"primary\" (click)=\"viewAttachment(selectedAttachment)\" class=\"btn-download\">\r\n <mat-icon>download</mat-icon> <span>{{ downloadLabel }}</span>\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n <input #fileInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n @if (allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || !attachmentsList ||\r\n attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"addFile(allowedTypes[0], fileInput)\" [disabled]=\"isDisabled\">\r\n @if (allowedTypes[0] == 1) { <mat-icon>cloud_upload</mat-icon> }\r\n @if (allowedTypes[0] == 2) { <i class=\"fas fa-link\"></i> }\r\n @if (allowedTypes[0] == 3) { <i class=\"fa-brands fa-dropbox\"></i> }\r\n <span style=\"margin-left: 10px\">\r\n {{ allowedTypes[0] == 1 ? (addButtonLabel + \" file\") : allowedTypes[0] == 2 ? (addButtonLabel + \" link\") :\r\n uploadWithDropboxLabel }}\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (!separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\">\r\n @if (multipleAttachment != true) { <mat-icon>cloud_upload</mat-icon> } @else { <mat-icon>add</mat-icon> }\r\n <span style=\"margin-left: 0px\">{{ addButtonLabel }}</span>\r\n </button>\r\n\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(1)) {\r\n <button mat-menu-item (click)=\"imageInput.click()\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(2)) {\r\n <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"switchToAddingLinkMode()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if (separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <div class=\"btn-group\">\r\n @if (allowedTypes.includes(1)) {\r\n <button (click)=\"imageInput.click()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-solid fa-cloud-upload\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(2)) {\r\n <button (click)=\"switchToAddingLinkMode()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button (click)=\"chooseDropboxFile()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ cropLabel }}</span>\r\n <span class=\"file-t\">Regola le dimensioni e l'orientamento</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" (click)=\"abortFile()\" class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"crop-toolbar\">\r\n @if (cropOptions.includes(1)) {\r\n <button mat-icon-button [matTooltip]=\"rotateLeftLabel\"\r\n (click)=\"rotateLeft()\"><mat-icon>rotate_left</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"rotateRightLabel\"\r\n (click)=\"rotateRight()\"><mat-icon>rotate_right</mat-icon></button>\r\n }\r\n @if (cropOptions.includes(2)) {\r\n <button mat-icon-button [matTooltip]=\"flipHorinzontalLabel\"\r\n (click)=\"flipHorizontal()\"><mat-icon>flip_horizontal</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"flipVerticalLabel\"\r\n (click)=\"flipVertical()\"><mat-icon>flip_vertical</mat-icon></button>\r\n }\r\n <button mat-icon-button matTooltip=\"Reset\"\r\n (click)=\"restoreOriginalDimensions()\"><mat-icon>replay</mat-icon></button>\r\n </div>\r\n\r\n <div class=\"media-viewer-wrapper\">\r\n <div class=\"crop-container-modern\">\r\n <image-cropper [imageFile]=\"selectedFile\" [maintainAspectRatio]=\"false\" [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\" [resizeToWidth]=\"customWidth\"\r\n [resizeToHeight]=\"customHeight\" [output]=\"'base64'\" [containWithinAspectRatio]=\"true\" [onlyScaleDown]=\"true\"\r\n [alignImage]=\"'center'\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button (click)=\"abortFile()\" class=\"btn-close\">{{ abortLabel }}</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmAddAttachment()\" class=\"btn-download\">\r\n <mat-icon>check</mat-icon> {{ confirmLabel }}\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER FORM DI AGGIUNTA DI UN LINK -->\r\n<ng-template #addingLinkTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"type-icon-wrapper\">\r\n <mat-icon>link</mat-icon>\r\n </div>\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">Aggiungi un link</span>\r\n <span class=\"file-t\">Inserisci l'URL della risorsa web</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"add-link-modern-content\">\r\n <form [formGroup]=\"newAttachmentForm\" class=\"add-link-form\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100 mt-3\">\r\n <mat-label>URL del collegamento</mat-label>\r\n <input matInput formControlName=\"filePath\" placeholder=\"https://...\" required>\r\n <mat-icon matSuffix>language</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label>Titolo (opzionale)</mat-label>\r\n <input matInput formControlName=\"fileName\" placeholder=\"Es. Documento Progetto\">\r\n <mat-icon matSuffix>title</mat-icon>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" [mat-dialog-close]=\"newAttachmentForm.value\"\r\n [disabled]=\"newAttachmentForm.invalid\" class=\"btn-download\">\r\n <mat-icon>add</mat-icon> Aggiungi\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";:host{--primary-color: #6a5af9;--primary-color-dark: #5441f8;--success-color: #1ce593;--error-color: #ff5b5b;--background-light: #f7f9fc;--background-card: rgba(255, 255, 255, .7);--text-color: #1e293b;--text-color-light: #64748b;--border-color: rgba(203, 213, 225, .5);--shadow-color: rgba(99, 102, 241, .2);--border-radius: 16px;--transition-speed: .3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--primary-color)}70%{box-shadow:0 0 0 10px #6a5af900}to{box-shadow:0 0 #6a5af900}}.container{width:100%;max-width:700px;margin:2rem auto;font-family:Inter,sans-serif}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.header h1{color:var(--text-color);font-size:1.8rem;font-weight:700;margin:0}.dropbox{width:100%;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:2.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all var(--transition-speed) ease}.dropbox:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color);border-color:var(--primary-color)}.dropbox.dragover{border-style:solid;border-color:var(--primary-color);transform:scale(1.02);box-shadow:0 0 25px var(--shadow-color);animation:pulse 1.5s infinite}.dropbox .dropbox-icon{font-size:3.5rem;color:var(--primary-color)}.dropbox .dropbox-text{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-top:1rem}.dropbox .dropbox-subtext{color:var(--text-color-light);margin-top:.5rem}.dropbox .browse-btn{margin-top:1.5rem;padding:.75rem 1.5rem;background-color:var(--primary-color);color:#fff;border:none;border-radius:10px;font-weight:600;transition:all var(--transition-speed) ease}.dropbox .browse-btn:hover{background-color:var(--primary-color-dark);transform:translateY(-2px)}.file-previews{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.5rem;margin-top:2rem}.file-previews{display:grid;gap:16px;padding:16px;grid-template-columns:repeat(auto-fill,minmax(var(--card-min-width, 200px),1fr))}.file-preview{background-color:var(--background-card);border-radius:var(--border-radius);box-shadow:0 4px 15px #0000000d;border:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column;position:relative;opacity:0;animation:fadeIn .5s ease-out forwards;transition:transform var(--transition-speed) ease,box-shadow var(--transition-speed) ease}.file-preview.uploading{cursor:wait}.file-preview.uploading .preview-img-container:after{content:\"\";position:absolute;inset:0;background:#ffffffb3;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.file-preview .preview-action-overlay{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;background-color:#0006;color:#fff;opacity:1;transition:opacity .3s ease}.file-preview .preview-action-overlay .mat-icon{font-size:36px;width:36px;height:36px}.file-preview .remove-btn{position:absolute;top:8px;right:8px;z-index:2;background-color:#0000004d;color:#fff;width:32px;height:32px;display:flex;align-items:center;justify-content:center;padding:0;transition:all var(--transition-speed) ease}.file-preview .remove-btn:hover{background-color:#ff5b5b}.file-preview .remove-btn .mat-icon{font-size:18px}@media (hover: hover){.file-preview .remove-btn .file-preview .preview-action-overlay{opacity:0}.file-preview .remove-btn .file-preview:hover .preview-action-overlay,.file-preview .remove-btn .file-preview:hover .remove-btn{opacity:1}.file-preview .remove-btn .file-preview .remove-btn{opacity:0}}@media (hover: hover) and (min-width: 769px){.file-preview .remove-btn{opacity:0;transform:scale(.8)}.file-preview:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color)}.file-preview:hover .remove-btn{opacity:1;transform:scale(1)}}.file-preview .preview-img-container{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;position:relative;cursor:pointer;background-color:#f0f2f5}.file-preview .preview-img{width:100%;height:100%;object-fit:cover}.file-preview .file-icon{font-size:4rem;color:var(--primary-color)}.file-preview .file-info{padding:12px;border-top:1px solid var(--border-color);flex-grow:1;display:flex;align-items:center}.file-preview .file-name{font-weight:600;font-size:.9rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-preview .upload-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-left-color:var(--primary-color);border-radius:50%;animation:spin 1s linear infinite;pointer-events:none}.file-preview.card-small{width:140px}.file-preview.card-small .preview-img-container{height:80px}.file-preview.card-small .file-info{padding:8px}.file-preview.card-small .file-name{font-size:.8rem}.file-preview.card-small .file-icon{font-size:3rem}.file-preview.card-small .remove-btn{width:28px;height:28px}.file-preview.card-small .remove-btn .mat-icon{font-size:16px}.file-preview.card-large{width:280px}.file-preview.card-large .preview-img-container{height:180px}.file-preview.card-large .file-info{padding:16px}.file-preview.card-large .file-name{font-size:1rem}.file-preview.card-large .file-icon{font-size:5rem}.file-preview.card-large .remove-btn{width:36px;height:36px}.file-preview.card-large .remove-btn .mat-icon{font-size:20px}.file-preview[style*=--eqp-card-width]{width:var(--eqp-card-width)}.file-preview[style*=--eqp-card-width] .preview-img-container{height:calc(var(--eqp-card-width) * .65)}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}.upload-stats{background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:1.5rem;margin-top:2rem;animation:fadeIn .5s ease-out}.upload-stats .stats-info{display:flex;justify-content:space-around}.upload-stats .progress-bar{height:10px;background-color:var(--border-color);border-radius:5px;overflow:hidden;margin-top:1rem}.upload-stats .progress-fill{height:100%;background:linear-gradient(90deg,var(--primary-color),var(--success-color));transition:width var(--transition-speed) ease-out;border-radius:5px}.upload-notification{position:fixed;bottom:20px;left:50%;transform:translate(-50%,100px);padding:1rem 1.5rem;border-radius:var(--border-radius);color:#fff;font-weight:600;box-shadow:0 10px 30px #0003;transition:transform var(--transition-speed) cubic-bezier(.175,.885,.32,1.275)}.upload-notification.show{transform:translate(-50%)}.upload-notification.success{background-color:var(--success-color)}.upload-notification.error{background-color:var(--error-color)}::ng-deep .cdk-overlay-pane.eqp-crop-dialog{transform:translateY(-4vh)}@media (max-width: 600px){::ng-deep .cdk-overlay-pane.crop-dialog{width:auto!important}}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__surface{border-radius:20px!important;padding:0!important;overflow:hidden!important;width:fit-content!important;min-width:350px!important;max-width:95vw!important;margin:0 auto;background-color:#fff!important}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;display:flex;flex-direction:column}.modern-dialog-container{display:flex;flex-direction:column;width:100%;max-width:100%;height:100%;max-height:90vh;background:#fff;--preview-header-h: 66px;--preview-footer-h: 66px;--preview-padding-y: 30px}.modern-dialog-container .main-preview-media{display:block;max-width:100%;max-height:var(--media-max-h);width:auto;height:auto;object-fit:contain;border-radius:12px;background:#fff;padding:4px;box-shadow:0 10px 30px #00000014}.modern-dialog-container video.main-preview-media{width:min(100%,1100px);background:#000}.modern-dialog-container .iframe-container{width:min(100%,1100px);height:var(--media-max-h);display:flex;width:100%;max-width:1100px}.modern-dialog-container .preview-iframe-modern{width:100%;height:100%;border:0;border-radius:12px;background:#f8fafc}.modern-dialog-container .preview-header{flex:0 0 auto;flex-shrink:0;padding:14px 20px;display:flex;align-items:center;justify-content:flex-start;border-bottom:1px solid var(--border-color);background:#f8fafc;z-index:10;width:100%}.modern-dialog-container .preview-header .header-info{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex:1 1 auto;min-width:0;text-align:left}.modern-dialog-container .preview-header .header-info .type-icon-wrapper{background:var(--primary-color);color:#fff;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px var(--shadow-color)}.modern-dialog-container .preview-header .header-info .title-group{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .main-t{font-weight:800;color:var(--text-color);font-size:.95rem;line-height:1.2;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .file-t{font-size:.75rem;color:var(--text-color-light);max-width:250px;overflow:hidden;text-overflow:ellipsis;text-align:left}.modern-dialog-container .preview-content-area{flex:1;background:#fff!important;display:flex;flex-direction:column;padding:15px 15px 22px!important;overflow:hidden!important;min-height:0;width:auto;--media-max-h: calc(90vh - var(--preview-header-h) - var(--preview-footer-h) - var(--preview-padding-y));width:100%}.modern-dialog-container .preview-content-area .crop-toolbar{flex-shrink:0;z-index:20;background:#0f172a14;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 16px;border-radius:30px;margin:0 auto 15px;display:flex;gap:8px;box-shadow:0 4px 12px #0000000d}.modern-dialog-container .preview-content-area .crop-toolbar button{color:var(--text-color)!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper{flex:1;width:100%;display:flex;justify-content:center;align-items:center;min-height:0;overflow:visible}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern{width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:transparent;border-radius:12px;padding:0}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern image-cropper{max-width:100%;max-height:100%;display:block}.modern-dialog-container .add-link-modern-content{flex:1;background:#fff;padding:24px!important}.modern-dialog-container .add-link-modern-content .add-link-form{display:flex;flex-direction:column;gap:10px}.modern-dialog-container .preview-actions{flex-shrink:0;padding:12px 24px;background:#f8fafc;border-top:1px solid #e2e8f0;margin:0}.modern-dialog-container .preview-actions .btn-download{border-radius:12px;font-weight:600;box-shadow:0 4px 12px var(--shadow-color)}@media (max-width: 600px){.modern-dialog-container{max-height:95vh}.modern-dialog-container .preview-content-area{padding:10px!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper video.main-preview-media{width:100%!important;max-height:55vh!important;border-radius:4px;box-shadow:none}.modern-dialog-container .preview-content-area .media-viewer-wrapper .iframe-container{height:50vh}.modern-dialog-container .preview-content-area .crop-toolbar{width:calc(100% - 20px);max-width:400px;margin-bottom:10px;padding:4px 8px;gap:4px;overflow-x:auto;justify-content:center;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-dialog-container .preview-content-area .crop-toolbar::-webkit-scrollbar{display:none}.modern-dialog-container .preview-content-area .crop-toolbar button{flex-shrink:0;transform:scale(.85);width:40px;height:40px}.modern-dialog-container .preview-actions{padding:10px 15px;flex-direction:column-reverse;gap:8px}.modern-dialog-container .preview-actions button{width:100%;margin:0!important}}@media (max-width: 360px){.modern-dialog-container .preview-content-area .crop-toolbar{gap:2px}.modern-dialog-container .preview-content-area .crop-toolbar button{transform:scale(.75)}}.control-icon{font-size:28px;cursor:pointer}image-cropper,image-cropper canvas,image-cropper img{max-width:100%!important;max-height:100%!important}.crop-large{display:flex}.crop-small{display:none}@media (max-width: 600px){.dialog-content{max-height:55vh}.crop-container{max-width:100%;aspect-ratio:auto}.crop-large{display:none}.crop-small{display:flex;justify-content:center;gap:14px}.control-icon{font-size:24px}}.stats-header{display:flex;justify-content:space-between;align-items:center;width:100%}.table-view-container{margin-top:1.5rem;background-color:var(--background-card);border-radius:var(--border-radius);border:1px solid var(--border-color);overflow:hidden;animation:fadeIn .5s ease-out}.table-header,.table-row{display:flex;align-items:center;padding:0 1rem;transition:background-color var(--transition-speed) ease}.table-header{background-color:#f8f9fa;font-weight:600;color:var(--text-color-light);font-size:.8rem;text-transform:uppercase;border-bottom:2px solid var(--border-color)}.table-row{border-bottom:1px solid var(--border-color)}.table-row:last-child{border-bottom:none}.table-row:hover{background-color:#00000005}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem}.name-col{flex:4}.size-col,.date-col{flex:2}.actions-col{flex:1;justify-content:flex-end;min-width:150px}.file-icon-small{font-size:1.5rem;color:var(--primary-color)}.file-info-text{display:flex;flex-direction:column}.file-name-table{font-weight:600;color:var(--text-color)}.file-type-table{font-size:.8rem;color:var(--text-color-light)}@media (max-width: 768px){.date-col{display:none}.name-col{flex:3}.size-col{flex:2}.actions-col{flex:2;min-width:120px}}.secondary-action-link{color:var(--primary-color);text-decoration:none;border-bottom:1px solid var(--primary-color);cursor:pointer;font-weight:500}.secondary-action-link:hover{color:var(--primary-color-dark);border-bottom-color:var(--primary-color-dark)}h2[mat-dialog-title]+mat-dialog-content.add-link-dialog-content{padding-top:20px}mat-dialog-content.add-link-dialog-content{padding-left:24px;padding-right:24px;padding-bottom:20px}.add-link-form{display:flex;flex-direction:column;gap:16px}::ng-deep .eqp-attachments-preview-dialog{--mdc-dialog-subhead-line-height: normal}::ng-deep .eqp-attachments-preview-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;background:#fff!important}:host ::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{--mdc-dialog-subhead-size: 1.25rem;--mdc-dialog-subhead-line-height: 1.5;--mdc-dialog-subhead-weight: 600;--mdc-dialog-supporting-text-size: 1rem}.empty-state{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:1.5rem 1rem;margin-top:1.5rem;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#f8f9fa;text-align:center;color:var(--text-color-light);animation:fadeIn .5s ease-out}.empty-state:before{content:\"\\1f4ed\";font-size:2.5rem;margin-bottom:1rem;opacity:.7}.secondary-action-link.disabled-link{color:#adb5bd;cursor:not-allowed;border-bottom-color:transparent}.secondary-action-link.disabled-link:hover{color:#adb5bd;border-bottom-color:transparent}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem;min-width:0;overflow:hidden}.table-cell.col-actions{flex:0 0 150px;justify-content:flex-end;overflow:visible}.compact-uploader{display:flex;align-items:center;gap:16px;padding:16px;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#fcfdff;transition:all .3s ease}.compact-uploader .compact-text{flex:1 1 auto;min-width:0;cursor:pointer}.compact-uploader .compact-text:hover .compact-title{color:var(--primary-color)}.compact-uploader .compact-title{font-weight:600;color:var(--text-color);transition:color .3s ease}.compact-uploader .compact-subtitle{font-size:.8rem;color:var(--text-color-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.compact-uploader .compact-icon mat-icon{font-size:36px;width:36px;height:36px;color:var(--primary-color)}.compact-uploader .compact-actions{display:flex;gap:8px;flex-shrink:0}.compact-uploader.dragover{background-color:#f4f8ff;border-color:var(--primary-color);box-shadow:0 0 10px var(--shadow-color)}\n"] }]
1308
+ args: [{ selector: "eqp-attachments", template: "<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n@if(showUploadTitle == true || chooseView == true){\r\n<div class=\"header\">\r\n @if(showUploadTitle == true){\r\n <h4>{{ uploadTitle }}</h4>\r\n }\r\n @if(chooseView == true){\r\n <mat-button-toggle-group [value]=\"viewMode\" (change)=\"setViewMode($event.value)\"\r\n aria-label=\"Modalit\u00E0 di visualizzazione\">\r\n <mat-button-toggle value=\"card\"><mat-icon>grid_view</mat-icon></mat-button-toggle>\r\n <mat-button-toggle value=\"table\"><mat-icon>view_list</mat-icon></mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione singolo -->\r\n@if (multipleAttachment != true) {\r\n@if (!singleAttachmentDragAndDrop) {\r\n@if (!addingLinkMode) {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addAttachmentButton\"></ng-container>\r\n</div>\r\n} @else {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addingLinkTemplate\"></ng-container>\r\n</div>\r\n}\r\n} @else {\r\n<input #fileInput id=\"file_attachment\" name=\"file_attachment\" type=\"file\" hidden (change)=\"onFileAdded($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (allowedTypes && allowedTypes.includes(1) && (!attachmentsList || attachmentsList.length == 0 ||\r\n(attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n\r\n@if (showDropArea == true) {\r\n<!-- FULL -->\r\n@if (layout === 'full') {\r\n\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\"\r\n (click)=\"onSelectFile($event, fileInput)\" role=\"button\" tabindex=\"0\" (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n <div class=\"secondary-action\">\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n @if (allowedTypes.includes(2) && allowedTypes.includes(3)) {\r\n <a class=\"secondary-action-link\" [matMenuTriggerFor]=\"isDisabled ? null : linkMenu\"\r\n [class.disabled-link]=\"isDisabled\" (click)=\"$event.stopPropagation()\">\r\n o aggiungi da web\r\n </a>\r\n <mat-menu #linkMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"switchToAddingLinkMode()\">\r\n <mat-icon>link</mat-icon>\r\n <span>Aggiungi da link</span>\r\n </button>\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\">\r\n <mat-icon>cloud_queue</mat-icon>\r\n <span>Carica da Dropbox</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @else if (allowedTypes.includes(2)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">\r\n aggiungi un link\r\n </a>\r\n }\r\n\r\n @else if (allowedTypes.includes(3)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); chooseDropboxFile()\">\r\n carica da Dropbox\r\n </a>\r\n }\r\n }\r\n </div>\r\n</div>\r\n}@else {\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n}\r\n}\r\n\r\n<!-- Azioni singolo elemento (come prima) -->\r\n<div class=\"text-center\">\r\n @if (attachmentsList && attachmentsList.length > 0 && attachmentsList[0] && showActionButtons == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n @if (attachmentsList[0].AttachmentType == AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n } @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n {{ attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel }}\r\n </button>\r\n\r\n @if (showPreview && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video')\r\n && !attachmentsList[0].FileContentType.startsWith('audio'))) && attachmentsList[0].IsImage == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n <mat-icon>visibility</mat-icon> {{ previewLabel }}\r\n </button>\r\n }\r\n\r\n <button [disabled]=\"disableAction\" class=\"mb-2 eqp-attachments-delete-btn\"\r\n (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\" mat-raised-button [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{ deleteLabel }}\r\n </button>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione multipla -->\r\n@if (multipleAttachment == true && showDropArea == true) {\r\n<input #fileInput id=\"file_attachment_multi\" name=\"file_attachment_multi\" type=\"file\" hidden\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (layout === 'full') {\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\"\r\n (click)=\"onSelectFile($event, fileInput)\" role=\"button\" tabindex=\"0\" (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n @if (allowedTypes.includes(2)) {\r\n <div class=\"secondary-action-link\">\r\n o <a (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">aggiungi un link</a>\r\n </div>\r\n }\r\n</div>\r\n}@else{\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver\" (dragover)=\"dragOver = true; $event.preventDefault()\"\r\n (dragleave)=\"dragOver = false\" (drop)=\"dragOver = false; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button [disabled]=\"isDisabled\" color=\"primary\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n\r\n@if (attachmentsList?.length > 0 && showSummary) {\r\n<div class=\"upload-stats\">\r\n\r\n <div class=\"stats-info\">\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ attachmentsList?.length }}</div>\r\n <div class=\"stat-label\">{{ filesLabel }}</div>\r\n </div>\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ totalSizeFormatted }}</div>\r\n <div class=\"stat-label\">{{ totalSizeLabel }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n\r\n</div>\r\n} @else if(attachmentsList?.length == 0){\r\n<div class=\"empty-state\">{{ emptyStateLabel }}</div>\r\n}\r\n\r\n<!-- Griglia anteprime card (vale per singolo e multiplo) -->\r\n@if (viewMode === 'card') {\r\n\r\n<div class=\"file-previews\" [ngStyle]=\"getPreviewsContainerStyle()\">\r\n @for (att of attachmentsList; track att.ID) {\r\n <div [ngClass]=\"getCardClass(att)\">\r\n <div class=\"preview-img-container\" (click)=\"!att.isUploading && handlePrimaryAction(att)\">\r\n\r\n @if (att.IsImage || att.FileThumbnailBase64) {\r\n <img class=\"preview-img\" [src]=\"'data:image/jpeg;base64,' + (att.FileThumbnailBase64 || att.FileDataBase64)\"\r\n [alt]=\"att.FileName\" />\r\n } @else {\r\n <div class=\"file-icon\"><i [ngClass]=\"getAttachmentIcon(att)\"></i></div>\r\n }\r\n\r\n <div class=\"preview-action-overlay\">\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n <mat-icon>play_arrow</mat-icon>\r\n }\r\n @else if (att.IsImage && canBePreviewed(att)) {\r\n <mat-icon>visibility</mat-icon>\r\n }\r\n @else if (att.FileContentType === 'application/pdf' && canBePreviewed(att)) {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n @else if (att.AttachmentType === AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n }\r\n @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-info\">\r\n <div class=\"file-name\" [title]=\"att.FileName\">{{ att.FileName }}</div>\r\n </div>\r\n\r\n @if(!disableAction){\r\n <button mat-icon-button class=\"remove-btn\" type=\"button\" aria-label=\"Rimuovi allegato\"\r\n (click)=\"deleteAttachment(att)\" [disabled]=\"att.isUploading\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (att.isUploading) {\r\n <div class=\"upload-spinner\"></div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n} @else if(viewMode === 'table' && attachmentsList?.length > 0) {\r\n\r\n\r\n<div class=\"table-view-container\">\r\n\r\n <div class=\"table-header\">\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n {{ col.display }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (att of attachmentsList; track att.ID) {\r\n <div class=\"table-row\">\r\n\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n\r\n @switch (col.type) {\r\n\r\n @case ('template') {\r\n <div class=\"template-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: att }\"></ng-container>\r\n </div>\r\n }\r\n @case ('date') {\r\n <span class=\"metadata-value\">{{ att[col.key] | date:'dd/MM/yyyy' }}</span>\r\n }\r\n @default {\r\n <span class=\"metadata-value\">{{ att[col.key] }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Notifica toast -->\r\n<div class=\"upload-notification\" [class.show]=\"toast?.visible\" [class.success]=\"toast?.type === 'success'\"\r\n [class.error]=\"toast?.type === 'error'\">\r\n <span>{{ toast?.text }}</span>\r\n <div class=\"notification-progress\"></div>\r\n</div>\r\n\r\n<ng-template #defaultFileTemplate let-att>\r\n <i class=\"file-icon-small\" [ngClass]=\"getAttachmentIcon(att)\"></i>\r\n <div class=\"file-info-text\">\r\n <span class=\"file-name-table\">{{ att.FileName }}</span>\r\n <span class=\"file-type-table\">{{ att.FileExtension || 'Link' }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultActionsTemplate let-att>\r\n <button mat-icon-button (click)=\"handlePrimaryAction(att)\"\r\n [matTooltip]=\"att.FileContentType?.startsWith('video/') ? 'Riproduci video' : 'Visualizza/Scarica'\">\r\n\r\n <mat-icon>\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n play_arrow\r\n } @else {\r\n {{ att.AttachmentType === AttachmentType.FILE ? 'download' : 'open_in_new' }}\r\n }\r\n </mat-icon>\r\n </button>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"actionsMenu\" matTooltip=\"Altre opzioni\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n @for (action of _sortedMenuActions; track action.name) {\r\n @if (!isActionHidden(action, att)) {\r\n <button mat-menu-item (click)=\"action.fn(att)\" [disabled]=\"action.disabled ? action.disabled(att) : false\">\r\n <mat-icon [color]=\"action.icon === 'delete' ? 'warn' : undefined\">\r\n {{ action.icon }}\r\n </mat-icon>\r\n <span>{{ action.name }}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogCropImage>\r\n <div style=\"overflow-x: hidden\" [ngClass]=\"cropDialogClass\">\r\n <!-- @if (showCropImage == true) { -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{ form: newAttachmentForm }\">\r\n </ng-container>\r\n <!-- } -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n @if (row.AttachmentType != AttachmentType.LINK && row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <img [src]=\"'data:image/png;base64,' + (row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64)\" />\r\n </div>\r\n } @else if (row.AttachmentType != AttachmentType.LINK && !row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"modern-dialog-container\"> @if (selectedAttachment) {\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ previewLabel }}</span>\r\n <span class=\"file-t\">{{ selectedAttachment.FileName }}</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"media-viewer-wrapper\">\r\n @if (selectedAttachment.IsImage) {\r\n <img class=\"main-preview-media\"\r\n [src]=\"'data:image/png;base64,' + (selectedAttachment.FileDataBase64 || selectedAttachment.FileThumbnailBase64)\"\r\n [alt]=\"selectedAttachment.FileName\" />\r\n }\r\n @else if (selectedAttachment.FileContentType?.startsWith('video/')) {\r\n <video controls autoplay playsinline class=\"main-preview-media video-player\">\r\n <source [src]=\"selectedAttachment.TrustedUrl\" [type]=\"selectedAttachment.FileContentType\">\r\n Il tuo browser non supporta il video.\r\n </video>\r\n }\r\n @else {\r\n <div class=\"iframe-container\">\r\n <iframe class=\"preview-iframe-modern\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n }\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Chiudi</button>\r\n @if (selectedAttachment.AttachmentType !== AttachmentType.LINK) {\r\n <button mat-raised-button color=\"primary\" (click)=\"viewAttachment(selectedAttachment)\" class=\"btn-download\">\r\n <mat-icon>download</mat-icon> <span>{{ downloadLabel }}</span>\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n <input #fileInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n @if (allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || !attachmentsList ||\r\n attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"addFile(allowedTypes[0], fileInput)\" [disabled]=\"isDisabled\">\r\n @if (allowedTypes[0] == 1) { <mat-icon>cloud_upload</mat-icon> }\r\n @if (allowedTypes[0] == 2) { <i class=\"fas fa-link\"></i> }\r\n @if (allowedTypes[0] == 3) { <i class=\"fa-brands fa-dropbox\"></i> }\r\n <span style=\"margin-left: 10px\">\r\n {{ allowedTypes[0] == 1 ? (addButtonLabel + \" file\") : allowedTypes[0] == 2 ? (addButtonLabel + \" link\") :\r\n uploadWithDropboxLabel }}\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (!separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\">\r\n @if (multipleAttachment != true) { <mat-icon>cloud_upload</mat-icon> } @else { <mat-icon>add</mat-icon> }\r\n <span style=\"margin-left: 0px\">{{ addButtonLabel }}</span>\r\n </button>\r\n\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(1)) {\r\n <button mat-menu-item (click)=\"imageInput.click()\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(2)) {\r\n <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"switchToAddingLinkMode()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if (separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <div class=\"btn-group\">\r\n @if (allowedTypes.includes(1)) {\r\n <button (click)=\"imageInput.click()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-solid fa-cloud-upload\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(2)) {\r\n <button (click)=\"switchToAddingLinkMode()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button (click)=\"chooseDropboxFile()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ cropLabel }}</span>\r\n <span class=\"file-t\">Regola le dimensioni e l'orientamento</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" (click)=\"abortFile()\" class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"crop-toolbar\">\r\n @if (cropOptions.includes(1)) {\r\n <button mat-icon-button [matTooltip]=\"rotateLeftLabel\"\r\n (click)=\"rotateLeft()\"><mat-icon>rotate_left</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"rotateRightLabel\"\r\n (click)=\"rotateRight()\"><mat-icon>rotate_right</mat-icon></button>\r\n }\r\n @if (cropOptions.includes(2)) {\r\n <button mat-icon-button [matTooltip]=\"flipHorinzontalLabel\"\r\n (click)=\"flipHorizontal()\"><mat-icon>flip_horizontal</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"flipVerticalLabel\"\r\n (click)=\"flipVertical()\"><mat-icon>flip_vertical</mat-icon></button>\r\n }\r\n <button mat-icon-button matTooltip=\"Reset\"\r\n (click)=\"restoreOriginalDimensions()\"><mat-icon>replay</mat-icon></button>\r\n </div>\r\n\r\n <div class=\"media-viewer-wrapper\">\r\n <div class=\"crop-container-modern\">\r\n <image-cropper [imageFile]=\"selectedFile\" [maintainAspectRatio]=\"false\" [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\" [resizeToWidth]=\"customWidth\"\r\n [resizeToHeight]=\"customHeight\" [output]=\"'base64'\" [containWithinAspectRatio]=\"true\" [onlyScaleDown]=\"true\"\r\n [alignImage]=\"'center'\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button (click)=\"abortFile()\" class=\"btn-close\">{{ abortLabel }}</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmAddAttachment()\" class=\"btn-download\">\r\n <mat-icon>check</mat-icon> {{ confirmLabel }}\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER FORM DI AGGIUNTA DI UN LINK -->\r\n<ng-template #addingLinkTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"type-icon-wrapper\">\r\n <mat-icon>link</mat-icon>\r\n </div>\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">Aggiungi un link</span>\r\n <span class=\"file-t\">Inserisci l'URL della risorsa web</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"add-link-modern-content\">\r\n <form [formGroup]=\"newAttachmentForm\" class=\"add-link-form\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100 mt-3\">\r\n <mat-label>URL del collegamento</mat-label>\r\n <input matInput formControlName=\"filePath\" placeholder=\"https://...\" required>\r\n <mat-icon matSuffix>language</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label>Titolo (opzionale)</mat-label>\r\n <input matInput formControlName=\"fileName\" placeholder=\"Es. Documento Progetto\">\r\n <mat-icon matSuffix>title</mat-icon>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" [mat-dialog-close]=\"newAttachmentForm.value\"\r\n [disabled]=\"newAttachmentForm.invalid\" class=\"btn-download\">\r\n <mat-icon>add</mat-icon> Aggiungi\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";:host{--primary-color: #6a5af9;--primary-color-dark: #5441f8;--success-color: #1ce593;--error-color: #ff5b5b;--background-light: #f7f9fc;--background-card: rgba(255, 255, 255, .7);--text-color: #1e293b;--text-color-light: #64748b;--border-color: rgba(203, 213, 225, .5);--shadow-color: rgba(99, 102, 241, .2);--border-radius: 16px;--transition-speed: .3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--primary-color)}70%{box-shadow:0 0 0 10px #6a5af900}to{box-shadow:0 0 #6a5af900}}.container{width:100%;max-width:700px;margin:2rem auto;font-family:Inter,sans-serif}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.header h1{color:var(--text-color);font-size:1.8rem;font-weight:700;margin:0}.dropbox{width:100%;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:2.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all var(--transition-speed) ease}.dropbox:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color);border-color:var(--primary-color)}.dropbox.dragover{border-style:solid;border-color:var(--primary-color);transform:scale(1.02);box-shadow:0 0 25px var(--shadow-color);animation:pulse 1.5s infinite}.dropbox .dropbox-icon{font-size:3.5rem;color:var(--primary-color)}.dropbox .dropbox-text{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-top:1rem}.dropbox .dropbox-subtext{color:var(--text-color-light);margin-top:.5rem}.dropbox .browse-btn{margin-top:1.5rem;padding:.75rem 1.5rem;background-color:var(--primary-color);color:#fff;border:none;border-radius:10px;font-weight:600;transition:all var(--transition-speed) ease}.dropbox .browse-btn:hover{background-color:var(--primary-color-dark);transform:translateY(-2px)}.file-previews{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.5rem;margin-top:2rem}.file-previews{display:grid;gap:16px;padding:16px;grid-template-columns:repeat(auto-fill,minmax(var(--card-min-width, 200px),1fr))}.file-preview{background-color:var(--background-card);border-radius:var(--border-radius);box-shadow:0 4px 15px #0000000d;border:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column;position:relative;opacity:0;animation:fadeIn .5s ease-out forwards;transition:transform var(--transition-speed) ease,box-shadow var(--transition-speed) ease}.file-preview.uploading{cursor:wait}.file-preview.uploading .preview-img-container:after{content:\"\";position:absolute;inset:0;background:#ffffffb3;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.file-preview .preview-action-overlay{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;background-color:#0006;color:#fff;opacity:1;transition:opacity .3s ease}.file-preview .preview-action-overlay .mat-icon{font-size:36px;width:36px;height:36px}.file-preview .remove-btn{position:absolute;top:8px;right:8px;z-index:2;background-color:#0000004d;color:#fff;width:32px;height:32px;display:flex;align-items:center;justify-content:center;padding:0;transition:all var(--transition-speed) ease}.file-preview .remove-btn:hover{background-color:#ff5b5b}.file-preview .remove-btn .mat-icon{font-size:18px}@media (hover: hover){.file-preview .remove-btn .file-preview .preview-action-overlay{opacity:0}.file-preview .remove-btn .file-preview:hover .preview-action-overlay,.file-preview .remove-btn .file-preview:hover .remove-btn{opacity:1}.file-preview .remove-btn .file-preview .remove-btn{opacity:0}}@media (hover: hover) and (min-width: 769px){.file-preview .remove-btn{opacity:0;transform:scale(.8)}.file-preview:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color)}.file-preview:hover .remove-btn{opacity:1;transform:scale(1)}}.file-preview .preview-img-container{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;position:relative;cursor:pointer;background-color:#f0f2f5}.file-preview .preview-img{width:100%;height:100%;object-fit:cover}.file-preview .file-icon{font-size:4rem;color:var(--primary-color)}.file-preview .file-info{padding:12px;border-top:1px solid var(--border-color);flex-grow:1;display:flex;align-items:center}.file-preview .file-name{font-weight:600;font-size:.9rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-preview .upload-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-left-color:var(--primary-color);border-radius:50%;animation:spin 1s linear infinite;pointer-events:none}.file-preview.card-small{width:140px}.file-preview.card-small .preview-img-container{height:80px}.file-preview.card-small .file-info{padding:8px}.file-preview.card-small .file-name{font-size:.8rem}.file-preview.card-small .file-icon{font-size:3rem}.file-preview.card-small .remove-btn{width:28px;height:28px}.file-preview.card-small .remove-btn .mat-icon{font-size:16px}.file-preview.card-large{width:280px}.file-preview.card-large .preview-img-container{height:180px}.file-preview.card-large .file-info{padding:16px}.file-preview.card-large .file-name{font-size:1rem}.file-preview.card-large .file-icon{font-size:5rem}.file-preview.card-large .remove-btn{width:36px;height:36px}.file-preview.card-large .remove-btn .mat-icon{font-size:20px}.file-preview[style*=--eqp-card-width]{width:var(--eqp-card-width)}.file-preview[style*=--eqp-card-width] .preview-img-container{height:calc(var(--eqp-card-width) * .65)}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}.upload-stats{background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:1.5rem;margin-top:2rem;animation:fadeIn .5s ease-out}.upload-stats .stats-info{display:flex;justify-content:space-around}.upload-stats .progress-bar{height:10px;background-color:var(--border-color);border-radius:5px;overflow:hidden;margin-top:1rem}.upload-stats .progress-fill{height:100%;background:linear-gradient(90deg,var(--primary-color),var(--success-color));transition:width var(--transition-speed) ease-out;border-radius:5px}.upload-notification{position:fixed;bottom:20px;left:50%;transform:translate(-50%,100px);padding:1rem 1.5rem;border-radius:var(--border-radius);color:#fff;font-weight:600;box-shadow:0 10px 30px #0003;transition:transform var(--transition-speed) cubic-bezier(.175,.885,.32,1.275)}.upload-notification.show{transform:translate(-50%)}.upload-notification.success{background-color:var(--success-color)}.upload-notification.error{background-color:var(--error-color)}::ng-deep .cdk-overlay-pane.eqp-crop-dialog{transform:translateY(-4vh)}@media (max-width: 600px){::ng-deep .cdk-overlay-pane.crop-dialog{width:auto!important}}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__surface{border-radius:20px!important;padding:0!important;overflow:hidden!important;width:fit-content!important;min-width:350px!important;max-width:95vw!important;margin:0 auto;background-color:#fff!important}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;display:flex;flex-direction:column}.modern-dialog-container{display:flex;flex-direction:column;width:100%;max-width:100%;height:100%;max-height:90vh;background:#fff;--preview-header-h: 66px;--preview-footer-h: 66px;--preview-padding-y: 30px}.modern-dialog-container .main-preview-media{display:block;max-width:100%;max-height:var(--media-max-h);width:auto;height:auto;object-fit:contain;border-radius:12px;background:#fff;padding:4px;box-shadow:0 10px 30px #00000014}.modern-dialog-container video.main-preview-media{width:min(100%,1100px);background:#000}.modern-dialog-container .iframe-container{width:min(100%,1100px);height:var(--media-max-h);display:flex;width:100%;max-width:1100px}.modern-dialog-container .preview-iframe-modern{width:100%;height:100%;border:0;border-radius:12px;background:#f8fafc}.modern-dialog-container .preview-header{flex:0 0 auto;flex-shrink:0;padding:14px 20px;display:flex;align-items:center;justify-content:flex-start;border-bottom:1px solid var(--border-color);background:#f8fafc;z-index:10;width:100%}.modern-dialog-container .preview-header .header-info{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex:1 1 auto;min-width:0;text-align:left}.modern-dialog-container .preview-header .header-info .type-icon-wrapper{background:var(--primary-color);color:#fff;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px var(--shadow-color)}.modern-dialog-container .preview-header .header-info .title-group{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .main-t{font-weight:800;color:var(--text-color);font-size:.95rem;line-height:1.2;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .file-t{font-size:.75rem;color:var(--text-color-light);max-width:250px;overflow:hidden;text-overflow:ellipsis;text-align:left}.modern-dialog-container .preview-content-area{flex:1;background:#fff!important;display:flex;flex-direction:column;padding:15px 15px 22px!important;overflow:hidden!important;min-height:0;width:auto;--media-max-h: calc(90vh - var(--preview-header-h) - var(--preview-footer-h) - var(--preview-padding-y));width:100%}.modern-dialog-container .preview-content-area .crop-toolbar{flex-shrink:0;z-index:20;background:#0f172a14;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 16px;border-radius:30px;margin:0 auto 15px;display:flex;gap:8px;box-shadow:0 4px 12px #0000000d}.modern-dialog-container .preview-content-area .crop-toolbar button{color:var(--text-color)!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper{flex:1;width:100%;display:flex;justify-content:center;align-items:center;min-height:0;overflow:visible}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern{width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:transparent;border-radius:12px;padding:0}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern image-cropper{max-width:100%;max-height:100%;display:block}.modern-dialog-container .add-link-modern-content{flex:1;background:#fff;padding:24px!important}.modern-dialog-container .add-link-modern-content .add-link-form{display:flex;flex-direction:column;gap:10px}.modern-dialog-container .preview-actions{flex-shrink:0;padding:12px 24px;background:#f8fafc;border-top:1px solid #e2e8f0;margin:0}.modern-dialog-container .preview-actions .btn-download{border-radius:12px;font-weight:600;box-shadow:0 4px 12px var(--shadow-color)}@media (max-width: 600px){.modern-dialog-container{max-height:95vh}.modern-dialog-container .preview-content-area{padding:10px!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper video.main-preview-media{width:100%!important;max-height:55vh!important;border-radius:4px;box-shadow:none}.modern-dialog-container .preview-content-area .media-viewer-wrapper .iframe-container{height:50vh}.modern-dialog-container .preview-content-area .crop-toolbar{width:calc(100% - 20px);max-width:400px;margin-bottom:10px;padding:4px 8px;gap:4px;overflow-x:auto;justify-content:center;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-dialog-container .preview-content-area .crop-toolbar::-webkit-scrollbar{display:none}.modern-dialog-container .preview-content-area .crop-toolbar button{flex-shrink:0;transform:scale(.85);width:40px;height:40px}.modern-dialog-container .preview-actions{padding:10px 15px;flex-direction:column-reverse;gap:8px}.modern-dialog-container .preview-actions button{width:100%;margin:0!important}}@media (max-width: 360px){.modern-dialog-container .preview-content-area .crop-toolbar{gap:2px}.modern-dialog-container .preview-content-area .crop-toolbar button{transform:scale(.75)}}.control-icon{font-size:28px;cursor:pointer}image-cropper,image-cropper canvas,image-cropper img{max-width:100%!important;max-height:100%!important}.crop-large{display:flex}.crop-small{display:none}@media (max-width: 600px){.dialog-content{max-height:55vh}.crop-container{max-width:100%;aspect-ratio:auto}.crop-large{display:none}.crop-small{display:flex;justify-content:center;gap:14px}.control-icon{font-size:24px}}.stats-header{display:flex;justify-content:space-between;align-items:center;width:100%}.table-view-container{margin-top:1.5rem;background-color:var(--background-card);border-radius:var(--border-radius);border:1px solid var(--border-color);overflow:hidden;animation:fadeIn .5s ease-out}.table-header,.table-row{display:flex;align-items:center;padding:0 1rem;transition:background-color var(--transition-speed) ease}.table-header{background-color:#f8f9fa;font-weight:600;color:var(--text-color-light);font-size:.8rem;text-transform:uppercase;border-bottom:2px solid var(--border-color)}.table-row{border-bottom:1px solid var(--border-color)}.table-row:last-child{border-bottom:none}.table-row:hover{background-color:#00000005}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem}.name-col{flex:4}.size-col,.date-col{flex:2}.actions-col{flex:1;justify-content:flex-end;min-width:150px}.file-icon-small{font-size:1.5rem;color:var(--primary-color)}.file-info-text{display:flex;flex-direction:column}.file-name-table{font-weight:600;color:var(--text-color)}.file-type-table{font-size:.8rem;color:var(--text-color-light)}@media (max-width: 768px){.date-col{display:none}.name-col{flex:3}.size-col{flex:2}.actions-col{flex:2;min-width:120px}}.secondary-action-link{color:var(--primary-color);text-decoration:none;border-bottom:1px solid var(--primary-color);cursor:pointer;font-weight:500}.secondary-action-link:hover{color:var(--primary-color-dark);border-bottom-color:var(--primary-color-dark)}h2[mat-dialog-title]+mat-dialog-content.add-link-dialog-content{padding-top:20px}mat-dialog-content.add-link-dialog-content{padding-left:24px;padding-right:24px;padding-bottom:20px}.add-link-form{display:flex;flex-direction:column;gap:16px}::ng-deep .eqp-attachments-preview-dialog{--mdc-dialog-subhead-line-height: normal}::ng-deep .eqp-attachments-preview-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;background:#fff!important}:host ::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{--mdc-dialog-subhead-size: 1.25rem;--mdc-dialog-subhead-line-height: 1.5;--mdc-dialog-subhead-weight: 600;--mdc-dialog-supporting-text-size: 1rem}.empty-state{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:1.5rem 1rem;margin-top:1.5rem;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#f8f9fa;text-align:center;color:var(--text-color-light);animation:fadeIn .5s ease-out}.empty-state:before{content:\"\\1f4ed\";font-size:2.5rem;margin-bottom:1rem;opacity:.7}.secondary-action-link.disabled-link{color:#adb5bd;cursor:not-allowed;border-bottom-color:transparent}.secondary-action-link.disabled-link:hover{color:#adb5bd;border-bottom-color:transparent}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem;min-width:0;overflow:hidden}.table-cell.col-actions{flex:0 0 150px;justify-content:flex-end;overflow:visible}.compact-uploader{display:flex;align-items:center;gap:16px;padding:16px;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#fcfdff;transition:all .3s ease}.compact-uploader .compact-text{flex:1 1 auto;min-width:0;cursor:pointer}.compact-uploader .compact-text:hover .compact-title{color:var(--primary-color)}.compact-uploader .compact-title{font-weight:600;color:var(--text-color);transition:color .3s ease}.compact-uploader .compact-subtitle{font-size:.8rem;color:var(--text-color-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.compact-uploader .compact-icon mat-icon{font-size:36px;width:36px;height:36px;color:var(--primary-color)}.compact-uploader .compact-actions{display:flex;gap:8px;flex-shrink:0}.compact-uploader.dragover{background-color:#f4f8ff;border-color:var(--primary-color);box-shadow:0 0 10px var(--shadow-color)}\n"] }]
1308
1309
  }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.FormBuilder }, { type: i3.DomSanitizer }, { type: i4.HttpClient }, { type: i5.EqpAttachmentService }], propDecorators: { disableAction: [{
1309
1310
  type: Input,
1310
1311
  args: ["disableAction"]
@@ -1501,6 +1502,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1501
1502
  type: Input
1502
1503
  }], hiddenActions: [{
1503
1504
  type: Input
1505
+ }], showActionButtons: [{
1506
+ type: Input
1504
1507
  }], videoCompression: [{
1505
1508
  type: Input
1506
1509
  }], customMenuActions: [{
@@ -1548,4 +1551,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1548
1551
  type: ViewChild,
1549
1552
  args: ['defaultActionsTemplate', { static: true }]
1550
1553
  }] } });
1551
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1hdHRhY2htZW50cy9zcmMvbGliL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtYXR0YWNobWVudHMvc3JjL2xpYi9lcXAtYXR0YWNobWVudHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRSxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQXFCLHFCQUFxQixFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQzNHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBbUUsY0FBYyxFQUFrQyxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBS3RGLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDeEIsSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJ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YTtzQkFBMUQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVVRLG1CQUFtQjtzQkFBdEUsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0ssc0JBQXNCO3NCQUE1RSxTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcclxuaW1wb3J0IGltYWdlQ29tcHJlc3Npb24gZnJvbSBcImJyb3dzZXItaW1hZ2UtY29tcHJlc3Npb25cIjtcclxuaW1wb3J0IHsgYmFzZTY0VG9GaWxlLCBJbWFnZUNyb3BwZWRFdmVudCwgSW1hZ2VDcm9wcGVyQ29tcG9uZW50LCBJbWFnZVRyYW5zZm9ybSB9IGZyb20gXCJuZ3gtaW1hZ2UtY3JvcHBlclwiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50SGVscGVyU2VydmljZSB9IGZyb20gXCIuL2hlbHBlcnMvYXR0YWNobWVudC5oZWxwZXJcIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudENhcmRTaXplLCBBdHRhY2htZW50RmllbGRDb2x1bW4sIEF0dGFjaG1lbnRNZW51QWN0aW9uLCBBdHRhY2htZW50VHlwZSwgQ3JvcE9wdGlvbkVudW0sIElBdHRhY2htZW50RFRPLCBUeXBlQXR0YWNobWVudENvbHVtbiB9IGZyb20gXCIuL2ludGVyZmFjZXMvSUF0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgSU9wdGlvbnMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lPcHRpb25zXCI7XHJcbmltcG9ydCB7IEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvZXFwLWF0dGFjaG1lbnQtZGlhbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRXFwQXR0YWNobWVudFNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9lcXAtYXR0YWNobWVudC5zZXJ2aWNlXCI7XHJcblxyXG5kZWNsYXJlIHZhciBEcm9wYm94OiBhbnk7XHJcblxyXG5jb25zdCB0b0Jhc2U2NCA9IChmaWxlKSA9PlxyXG4gIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdC50b1N0cmluZygpKTtcclxuICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xyXG4gIH0pO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiZXFwLWF0dGFjaG1lbnRzXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9lcXAtYXR0YWNobWVudHMuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFcXBBdHRhY2htZW50c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLy8jcmVnaW9uIEBJbnB1dCBkZWwgY29tcG9uZW50ZVxyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIGFsbG9yYSBuYXNjb25kZSBsYSBjb2xvbm5hIHBlciBsZSBhemlvbmkgc3VsbCdhbGxlZ2F0byAobmVsIGNhc28gXCJtdWx0aXBsZUF0dGFjaG1lbnRcIiDDqCBUUlVFKS5cclxuICAgKi9cclxuICBASW5wdXQoXCJkaXNhYmxlQWN0aW9uXCIpIGRpc2FibGVBY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBtb3N0cmEgaWwgdGl0b2xvIG5lbGwnaGVhZGVyIG5lbCBjYXNvIGluIGN1aSBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUgKFwiRWxlbmNvIGFsbGVnYXRpXCIgZGkgZGVmYXVsdCkuXHJcbiAgICovXHJcbiAgQElucHV0KFwic2hvd0hlYWRlclwiKSBzaG93SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU29yZ2VudGUgZGF0aSBkYSB2aXN1YWxpenphcmUuIE5lbCBjYXNvIHNpIHZ1b2xlIGdlc3RpcmUgdW4gc2luZ29sbyBhbGxlZ2F0byB2YSBwYXNzYXRvIGluIG9nbmkgY2FzbyBjb21lIEFycmF5LlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImF0dGFjaG1lbnRzTGlzdFwiKSBhdHRhY2htZW50c0xpc3Q6IEFycmF5PElBdHRhY2htZW50RFRPPiA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIE5lbCBjYXNvIHNpIHZ1b2xlIGdlc3RpcmUgdW4gc29sbyBlbGVtZW50byBzZW56YSBwYXNzYXJsbyBjb21lIGFycmF5LCBsbyBwYXNzbyBjb21lIHNpbmdvbG8gYWxsZWdhdG8gZSBnZXN0aXNjbyBuZWxsYSBsaWJyZXJpYSBsJ2FycmF5LlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNpbmdsZUF0dGFjaG1lbnRcIikgc2luZ2xlQXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8gPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIG5vbiBtb3N0cmEgbGEgTWF0Q2FyZCAobmVsIGNhc28gaW4gY3VpIFwibXVsdGlwbGVBdHRhY2htZW50XCIgw6ggVFJVRSkuXHJcbiAgICovXHJcbiAgQElucHV0KFwic2hvd01hdENhcmRcIikgc2hvd01hdENhcmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBGQUxTRSBhbGxvcmEgaWwgY29tcG9uZW50ZSBtb3N0cmEgc29sbyBpbCBwdWxzYW50ZSBkaSBjYXJpY2FtZW50byBkaSB1biBzaW5nb2xvIGZpbGUsIHVuYSB2b2x0YSBjYXJpY2F0byBpbCBmaWxlIGludm9jYSBsJ2V2ZW50byBkaSBvdXRwdXQgXCJsb2NhbEVkaXRlZEF0dGFjaG1lbnRzXCIuXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgaWwgY29tcG9uZW50ZSBtb3N0cmEgbCdlbGVuY28gZGkgdHV0dGkgZ2xpIGFsbGVnYXRpIHJpY2V2dXRvIG5lbCBwYXJhbWV0cm8gXCJhdHRhY2htZW50c0xpc3RcIi5cclxuICAgKi9cclxuICBASW5wdXQoXCJtdWx0aXBsZUF0dGFjaG1lbnRcIikgbXVsdGlwbGVBdHRhY2htZW50OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgYXNzdW1lIGlsIHZhbG9yZSBUUlVFIGFsbG9yYSBzYXLDoCBwb3NzaWJpbGUgY2FyaWNhcmUgcGnDuSBmaWxlIHBlciB2b2x0YS4gUXVlc3RhIGZ1bnppb25hbGl0w6Agw6ggYXR0aXZhXHJcbiAgICogU09MTyBzZSBzaSBnZXN0aXNjb25vIGFsbGVnYXRpIG11bHRpcGxpLCBxdWluZGkgc2UgbCdpbnB1dCAnbXVsdGlwbGVBdHRhY2htZW50JyBhc3N1bWUgaWwgdmFsb3JlIFRSVUUsIGFsdHJpbWVudGkgw6ggc2VtcHJlIGRpc2FiaWxpdGF0YS5cclxuICAgKi9cclxuICBASW5wdXQoXCJsb2FkTXVsdGlwbGVGaWxlc1wiKSBsb2FkTXVsdGlwbGVGaWxlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBJbXBvc3RhIGlsIG1lc3NhZ2dpbyBkYSB2aXN1YWxpenphcmUgbmVsIGNhc28gaW4gY3VpIGxhIHRhYmVsbGEgZGVnbGkgYWxsZWdhdGkgKG5lbCBjYXNvIGluIGN1aSBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpIMOoIHZ1b3RhLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImVtcHR5VGFibGVNZXNzYWdlXCIpIGVtcHR5VGFibGVNZXNzYWdlOiBzdHJpbmcgPSBcIk5lc3N1biBkYXRvIHRyb3ZhdG9cIjtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgcGVybWV0dGUgZGkgc2VsZXppb25hcmUgc29sdGFudG8gZmlsZSBkaSB0aXBvIGltbWFnaW5lLCBhdmVudGUgdW5vIGRlaSBtaW1ldHlwZVxyXG4gICAqIHNwZWNpZmljYXRpIGRlbnRybyBBdHRhY2htZW50SGVscGVyU2VydmljZS5cclxuICAgKiBTZSBGQUxTRSBwZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBxdWFsc2lhc2kgdGlwbyBkaSBmaWxlXHJcbiAgICovXHJcbiAgQElucHV0KFwiYWxsb3dPbmx5SW1hZ2VzXCIpIGFsbG93T25seUltYWdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTcGVjaWZpY2EgaSB0aXBpIGRpIGZpbGUgY2hlIMOoIHBvc3NpYmlsZSBjYXJpY2FyZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImFjY2VwdGVkRmlsZVR5cGVzXCIpIGFjY2VwdGVkRmlsZVR5cGVzOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgZGlzYWJpbGl0YSBpbCBwdWxzYW50ZSBkaSBBZ2dpdW50YSBhbGxlZ2F0byAoYSBwcmVzY2luZGVyZSBkYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm8gXCJtdWx0aXBsZUF0dGFjaG1lbnRcIikuXHJcbiAgICovXHJcbiAgQElucHV0KFwiaXNEaXNhYmxlZFwiKSBpc0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vc3RyYS9uYXNjb25kZSBsYSBjb2xvbm5hIHBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWEgZGVpIGZpbGUgbmVsbGEgdGFiZWxsYSAoY2FzbyBtdWx0aXBsZUF0YXRjaG1lbnRzID0gdHJ1ZSkuXHJcbiAgICovXHJcbiAgQElucHV0KFwic2hvd0lubGluZVByZXZpZXdcIikgc2hvd0lubGluZVByZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW5kcG9pbnQgZGEgY2hpYW1hcmUgcGVyIHJlY3VlcHJhcmUgbCdJQXR0YWNobWVudERUTyBjb21wbGV0byBkYSB2ZWRlcmUgbmVsbCdhbnRlcHJpbWEuIExhIGNoaWFtYXRhIHNhcsOgIGluIFBPU1QgZSBuZWwgYm9keVxyXG4gICAqIGNvbnRlcnLDoCBsJ0lBdHRhY2htZW50RFRPIHNlbGV6aW9uYXRvIGRhbGwndXRlbnRlLlxyXG4gICAqIExhIGNoaWFtYXRhIHZpZW5lIGVzZWd1aXRhIHNvbG8gcGVyIGwnYW50ZXByaW1hIGRlbGxlIGltbWFnaW5pIGVzc2VuZG8gbmVjZXNzYXJpbyBpbCBiYXNlNjQgY29tcGxldG8gZGVsbCdpbW1hZ2luZSBhIGRpbWVuc2lvbmUgcmVhbGUuXHJcbiAgICogUGVyIGRvY3VtZW50aS9saW5rIGJhc3RhIGNoZSBzaWEgcG9wb2xhdGEgbGEgcHJvcHJpZXTDoCBGaWxlUGF0aCBkaSBJQXR0YWNobWVudERUTy5cclxuICAgKi9cclxuICBASW5wdXQoXCJnZXRBdHRhY2htZW50RW5kcG9pbnRcIikgZ2V0QXR0YWNobWVudEVuZHBvaW50OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBIb3N0bmFtZSBkZWxsJ2FtYmllbnRlIGRpIHByb2R1emlvbmUgZGVsbCdhcHBsaWNhdGl2by4gTmVjZXNzYXJpbyBwZXIgdmlzdWFsaXp6YXJlIGwnYW50ZXByaW1hIGRlaSBkb2N1bWVudGlcclxuICAgKiB0cmFtaXRlIGlsIHZpZXdlciBkaSBnb29nbGUuXHJcbiAgICogTk9UQTogUGVyIHZpc3VhbGl6emFyZSBsJ2FudGVwcmltYSDDqCBuZWNlc3NhcmlvIGNoZSBsYSBwcm9yaWV0w6AgRmlsZVBhdGggZGVsbCdJQXR0YWNobWVudERUTyBzaWEgcG9wb2xhdGEgZSBjaGVcclxuICAgKiBzaWEgYWJpbGl0YXRvIGwnYWNjZXNzbyBhbGxhIGNhcnRlbGxhIHN1bCBzZXJ2ZXIgdHJhbWl0ZSBob3N0bmFtZS5cclxuICAgKi9cclxuICBASW5wdXQoXCJwcm9kdWN0aW9uQmFzZVVybFwiKSBwcm9kdWN0aW9uQmFzZVVybDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogT3B6aW9uaSBwZXIgbGEgY29tcHJlc3Npb25lIGRlbGxlIGltbWFnaW5pIGNhcmljYXRlLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImNvbXByZXNzaW9uT3B0aW9uc1wiKSBjb21wcmVzc2lvbk9wdGlvbnM6IElPcHRpb25zID0ge1xyXG4gICAgbWF4U2l6ZU1COiAwLjUsXHJcbiAgICBtYXhXaWR0aE9ySGVpZ2h0OiAxOTIwLFxyXG4gICAgdXNlV2ViV29ya2VyOiB0cnVlXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQXJyYXkgZGkgQXR0YWNobWVudFR5cGUgY2hlIHNpIHBvc3Nvbm8gYWdnaXVuZ2VyZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImFsbG93ZWRUeXBlc1wiKSBhbGxvd2VkVHlwZXM6IEFycmF5PEF0dGFjaG1lbnRUeXBlPiA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LXTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc3RhYmlsaXJlIHNlIGxhIGVxcC10YWJsZSBjb250ZW5lbnRlIGwnZWxlbmNvIGRlZ2xpIGFsbGVnYXRpIHV0aWxpenphXHJcbiAgICogaWwgbXVsdGlsaW5ndWEgb3BwdXJlIG5vXHJcbiAgICovXHJcbiAgQElucHV0KFwiaXNFcXBUYWJsZU11bHRpTGFuZ3VhZ2VcIikgaXNFcXBUYWJsZU11bHRpTGFuZ3VhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc3RhYmlsaXJlLCBpbiBjYXNvIGRpIGdlc3Rpb25lIGFsbGVnYXRpIG11bHRpcGxpLCBzZSBsYSB0YWJlbGxhIGNvbnRlbmVudGUgbCdlbGVuY29cclxuICAgKiBkZWdsaSBhbGxlZ2F0aSBkZXZlIGVzc2VyZSBwYWdpbmF0YSBvcHB1cmUgbm9cclxuICAgKi9cclxuICBASW5wdXQoXCJ0YWJsZVBhZ2luYXRvclZpc2libGVcIikgdGFibGVQYWdpbmF0b3JWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc3RhYmlsaXJlLCBpbiBjYXNvIGRpIGdlc3Rpb25lIGFsbGVnYXRpIG11bHRpcGxpLCBzZSBsYSB0YWJlbGxhIGNvbnRlbmVudGUgbCdlbGVuY29cclxuICAgKiBkZWdsaSBhbGxlZ2F0aSBkZXZlIGNvbnRlbmVyZSBpbCBjYW1wbyBkaSByaWNlcmNhIG9wcHVyZSBub1xyXG4gICAqL1xyXG4gIEBJbnB1dChcImlzVGFibGVTZWFyY2hlYWJsZVwiKSBpc1RhYmxlU2VhcmNoZWFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBJbiBjYXNvIGRpIGdlc3Rpb25lIGFsbGVnYXRpIG11bHRpcGxpLCBwZXJtZXR0ZSBkaSBzdGFiaWxpcmUgbGEgZGltZW5zaW9uZSBwYWdpbmEgZGkgZGVmYXVsdFxyXG4gICAqIHBlciBsYSB0YWJlbGxhIGNvbnRlbmVudGUgbCdlbGVuY28gZGVnbGkgYWxsZWdhdGlcclxuICAgKi9cclxuICBASW5wdXQoXCJ0YWJsZVBhZ2luYXRvclNpemVcIikgdGFibGVQYWdpbmF0b3JTaXplOiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBzY2VnbGllcmUgaWwgbW9kbyBpbiBjdWkgaSBmaWxlIGRldm9ubyBlc3NlcmUgY2FyaWNhdGlcclxuICAgKi9cclxuICAvLyBASW5wdXQoXCJ1cGxvYWRUeXBlXCIpIHVwbG9hZFR5cGU6IFVwbG9hZFR5cGVFbnVtID0gVXBsb2FkVHlwZUVudW0uRklMRV9BTkRfTElOSztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc3RhYmlsaXJlIHNlIGkgcHVsc2FudGkgcGVyIGlsIGNhcmljYW1lbnRvIGRlaSBmaWxlIHNvbm8gc2VwYXJhdGkgbyBpbiB1biBtZW7DuSBhIHRlbmRpbmFcclxuICAgKi9cclxuICBASW5wdXQoXCJzZXBhcmF0ZWRVcGxvYWRCdXR0b25zXCIpIHNlcGFyYXRlZFVwbG9hZEJ1dHRvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc2NlZ2xpZXJlIHNlIGRhcmUgbGEgcG9zc2liaWxpdMOgIGRpIHZlZGVyZSBvIG5vIGwnYW50ZXByaW1hXHJcbiAgICovXHJcbiAgQElucHV0KFwic2hvd1ByZXZpZXdcIikgc2hvd1ByZXZpZXc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBJbiBjYXNvIGRpIGFsbGVnYXRvIHNpbmdvbG8sIHBlcm1ldHRlIGRpIHNjZWdsaWVyZSBzZSBhZ2dpdW5nZXJlIGZpbGUgdHJhbWl0ZSBkcmFnIGFuZCBkcm9wXHJcbiAgICovXHJcbiAgQElucHV0KFwic2luZ2xlQXR0YWNobWVudERyYWdBbmREcm9wXCIpIHNpbmdsZUF0dGFjaG1lbnREcmFnQW5kRHJvcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBBcnJheSBkaSBvcHppb25pIGNoZSBzaSBwb3Nzb25vIHV0aWxpenphcmUgcGVyIGlsIGNyb3BcclxuICAgKi9cclxuICBASW5wdXQoXCJjcm9wT3B0aW9uc1wiKSBjcm9wT3B0aW9uczogQXJyYXk8Q3JvcE9wdGlvbkVudW0+ID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzZSBjdXN0b20gZGEgYXNzZWduYXJlIGFsIGRpYWxvZyBkZWwgY3JvcCBpbW1hZ2luaVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImNyb3BEaWFsb2dDbGFzc1wiKSBjcm9wRGlhbG9nQ2xhc3M6IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgbWF4RmlsZVNpemVNQjogbnVtYmVyID0gNTAwOyAvLyBEZWZhdWx0IG1heCBzaXplIG9mIDEwMCBNQlxyXG4gIEBJbnB1dCgpIGNhcmRTaXplOiBBdHRhY2htZW50Q2FyZFNpemUgPSAnc21hbGwnOyAvLyBEZWZhdWx0XHJcbiAgQElucHV0KCkgY3VzdG9tQ2FyZFdpZHRoUHg6IG51bWJlciA9IDIwMDsgLy8gTGFyZ2hlenphIGN1c3RvbSBpbiBweFxyXG4gIEBJbnB1dCgpIGN1c3RvbUNhcmRIZWlnaHRQeDogbnVtYmVyID0gMTgwOyAvLyBBbHRlenphIGN1c3RvbSBpbiBweFxyXG5cclxuICBASW5wdXQoKSBsYXlvdXQ6ICdmdWxsJyB8ICdjb21wYWN0JyA9ICdjb21wYWN0JztcclxuXHJcbiAgLyoqXHJcbiAgICogSW5wdXQgcGVyIGRlZmluaXJlIGxlIGxhYmVsIGRhIHVzYXJlIG5lbCBjb21wb25lbnRlXHJcbiAgICovXHJcbiAgQElucHV0KFwib3BlbkxpbmtMYWJlbFwiKSBvcGVuTGlua0xhYmVsOiBzdHJpbmcgPSBcIkFwcmkgbGlua1wiO1xyXG4gIEBJbnB1dChcImFkZEJ1dHRvbkxhYmVsXCIpIGFkZEJ1dHRvbkxhYmVsOiBzdHJpbmcgPSBcIkFnZ2l1bmdpXCI7XHJcbiAgQElucHV0KFwiZG93bmxvYWRMYWJlbFwiKSBkb3dubG9hZExhYmVsOiBzdHJpbmcgPSBcIkRvd25sb2FkXCI7XHJcbiAgQElucHV0KFwiZGVsZXRlTGFiZWxcIikgZGVsZXRlTGFiZWw6IHN0cmluZyA9IFwiRWxpbWluYVwiO1xyXG4gIEBJbnB1dChcImZpbGVOYW1lTGFiZWxcIikgZmlsZU5hbWVMYWJlbDogc3RyaW5nID0gXCJOb21lIGZpbGVcIjtcclxuICBASW5wdXQoXCJwcmV2aWV3TGFiZWxcIikgcHJldmlld0xhYmVsOiBzdHJpbmcgPSBcIkFudGVwcmltYVwiO1xyXG4gIEBJbnB1dChcInVwbG9hZEZpbGVMYWJlbFwiKSB1cGxvYWRGaWxlTGFiZWw6IHN0cmluZyA9IFwiQ2FyaWNhIGZpbGVcIjtcclxuICBASW5wdXQoXCJjb25maXJtTGFiZWxcIikgY29uZmlybUxhYmVsOiBzdHJpbmcgPSBcIkNvbmZlcm1hXCI7XHJcbiAgQElucHV0KFwiYWJvcnRMYWJlbFwiKSBhYm9ydExhYmVsOiBzdHJpbmcgPSBcIkFubnVsbGFcIjtcclxuICBASW5wdXQoXCJzYXZlTGFiZWxcIikgc2F2ZUxhYmVsOiBzdHJpbmcgPSBcIlNhbHZhXCI7XHJcbiAgQElucHV0KFwiZXhpdExhYmVsXCIpIGV4aXRMYWJlbDogc3RyaW5nID0gXCJFc2NpXCI7XHJcbiAgQElucHV0KFwidXBsb2FkV2l0aERyb3Bib3hMYWJlbFwiKSB1cGxvYWRXaXRoRHJvcGJveExhYmVsOiBzdHJpbmcgPSBcIkNhcmljYSBjb24gRHJvcGJveFwiO1xyXG4gIEBJbnB1dChcImNyb3BMYWJlbFwiKSBjcm9wTGFiZWw6IHN0cmluZyA9IFwiU2NlZ2xpIGxlIGRpbWVuc2lvbmkgZGVsbCdpbW1hZ2luZVwiO1xyXG4gIEBJbnB1dChcImRlbGV0ZURpYWxvZ1RpdGxlXCIpIGRlbGV0ZURpYWxvZ1RpdGxlOiBzdHJpbmcgPSBudWxsO1xyXG4gIEBJbnB1dChcImRlbGV0ZURpYWxvZ01lc3NhZ2VcIikgZGVsZXRlRGlhbG9nTWVzc2FnZTogc3RyaW5nID0gXCJTZWkgc2ljdXJvIGRpIHZvbGVyIGNhbmNlbGxhcmUgcXVlc3QnYWxsZWdhdG8/XCI7XHJcbiAgQElucHV0KFwibm9JbWFnZVNlbGVjdGVkRXJyb3JNZXNzYWdlXCIpIG5vSW1hZ2VTZWxlY3RlZEVycm9yTWVzc2FnZTogc3RyaW5nID1cclxuICAgIFwiTm9uIMOoIHBvc3NpYmlsZSBzZWxlemlvbmFyZSB1biBmaWxlIGNoZSBub24gc2lhIHVuJ2ltbWFnaW5lLlwiO1xyXG4gIEBJbnB1dChcIndyb25nVHlwZVNlbGVjdGVkRXJyb3JNZXNzYWdlXCIpIHdyb25nVHlwZVNlbGVjdGVkRXJyb3JNZXNzYWdlOiBzdHJpbmcgPVxyXG4gICAgXCJOb24gw6ggcG9zc2liaWxlIGNhcmljYXJlIGlsIGZpbGUgc2VsZXppb25hdG8uXCI7XHJcbiAgQElucHV0KFwidmlkZW9QcmV2aWV3RXJyb3JNZXNzYWdlXCIpIHZpZGVvUHJldmlld0Vycm9yTWVzc2FnZTogc3RyaW5nID1cclxuICAgIFwiSW1wb3NzaWJpbGUgYXByaXJlIGwnYW50ZXByaW1hIGRpIHVuIGZpbGUgdmlkZW8uXCI7XHJcbiAgQElucHV0KFwidmlkZW9QcmV2aWV3RXJyb3JNZXNzYWdlXCIpIGF1ZGlvUHJldmlld0Vycm9yTWVzc2FnZTogc3RyaW5nID1cclxuICAgIFwiSW1wb3NzaWJpbGUgYXByaXJlIGwnYW50ZXByaW1hIGRpIHVuIGZpbGUgYXVkaW8uXCI7XHJcbiAgQElucHV0KFwiZmxpcEhvcmluem9udGFsTGFiZWxcIikgZmxpcEhvcmluem9udGFsTGFiZWw6IHN0cmluZyA9IFwiQ2Fwb3ZvbGdpIG9yaXp6b250YWxtZW50ZVwiO1xyXG4gIEBJbnB1dChcImZsaXBWZXJ0aWNhbExhYmVsXCIpIGZsaXBWZXJ0aWNhbExhYmVsOiBzdHJpbmcgPSBcIkNhcG92b2xnaSB2ZXJ0aWNhbG1lbnRlXCI7XHJcbiAgQElucHV0KFwicm90YXRlUmlnaHRMYWJlbFwiKSByb3RhdGVSaWdodExhYmVsOiBzdHJpbmcgPSBcIlJ1b3RhIGEgZGVzdHJhXCI7XHJcbiAgQElucHV0KFwicm90YXRlTGVmdExhYmVsXCIpIHJvdGF0ZUxlZnRMYWJlbDogc3RyaW5nID0gXCJSdW90YSBhIHNpbmlzdHJhXCI7XHJcbiAgQElucHV0KFwiYmFzZTY0TGltaXRNQlwiKSBiYXNlNjRMaW1pdE1COiBudW1iZXIgPSAxMDA7XHJcbiAgQElucHV0KCkgdXBsb2FkVGl0bGUgPSAnVXBsb2FkIGZpbGUnO1xyXG4gIEBJbnB1dCgpIHVwbG9hZFN1YnRpdGxlID0gJ0RyYWcgJiBkcm9wIGZpbGVzIG8gY2xpY2snO1xyXG4gIEBJbnB1dCgpIGRyb3BIZXJlTGFiZWwgPSAnUmlsYXNjaWEgaSBmaWxlIHF1aSc7XHJcbiAgQElucHV0KCkgc3VwcG9ydGVkRm9ybWF0c0xhYmVsID0gJ0Zvcm1hdGkgc3VwcG9ydGF0aTogSlBFRywgUE5HLCBQREYgKE1heCAxMDBNQiknO1xyXG4gIEBJbnB1dCgpIGJyb3dzZUZpbGVzTGFiZWwgPSAnQ2VyY2EgaSBmaWxlJztcclxuICBASW5wdXQoKSB1cGxvYWRTdW1tYXJ5TGFiZWwgPSAnTGlzdGEgYWxsZWdhdGknO1xyXG4gIEBJbnB1dCgpIGZpbGVzTGFiZWwgPSAnRmlsZXMnO1xyXG4gIEBJbnB1dCgpIHRvdGFsU2l6ZUxhYmVsID0gJ0RpbWVuc2lvbmUgdG90YWxlJztcclxuICBASW5wdXQoKSBlbXB0eVN0YXRlTGFiZWwgPSAnTm9uIHNvbm8gcHJlc2VudGkgZmlsZSBjYXJpY2F0aSc7XHJcbiAgQElucHV0KCkgYWRkZWRTdWNjZXNzZnVsbHlMYWJlbCA9ICdmaWxlKHMpIGNhcmljYXRpIGNvbiBzdWNjZXNzby4nO1xyXG4gIEBJbnB1dCgpIHJlbW92ZWRMYWJlbCA9ICdGaWxlIHJpbW9zc28nO1xyXG4gIC8vIEBJbnB1dCgpIHJlbW92ZUxhYmVsID0gJ1JpbXVvdmkgZmlsZSc7XHJcbiAgQElucHV0KCkgY2hvb3NlVmlldyA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd1N1bW1hcnkgPSBmYWxzZTtcclxuICBASW5wdXQoXCJ2aWV3TW9kZVwiKSB2aWV3TW9kZTogJ2NhcmQnIHwgJ3RhYmxlJyA9ICd0YWJsZSc7XHJcbiAgQElucHV0KFwic2hvd1VwbG9hZFRpdGxlXCIpIHNob3dVcGxvYWRUaXRsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KFwic2hvd0Ryb3BBcmVhXCIpIHNob3dEcm9wQXJlYTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgaGlkZGVuQ29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuICBASW5wdXQoKSBoaWRkZW5BY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSB2aWRlb0NvbXByZXNzaW9uOiB7XHJcbiAgICBlbmFibGVkOiBib29sZWFuLFxyXG4gICAgbWF4V2lkdGg/OiBudW1iZXIsXHJcbiAgICBiaXRyYXRlPzogbnVtYmVyXHJcbiAgfSA9IHsgZW5hYmxlZDogZmFsc2UsIG1heFdpZHRoOiAxMjgwLCBiaXRyYXRlOiAyNTAwMDAwIH07XHJcblxyXG4gIHByaXZhdGUgX2N1c3RvbU1lbnVBY3Rpb25zOiBBdHRhY2htZW50TWVudUFjdGlvbltdID0gW107XHJcbiAgX3NvcnRlZE1lbnVBY3Rpb25zOiBBdHRhY2htZW50TWVudUFjdGlvbltdID0gW107XHJcblxyXG4gIC8qKlxyXG4gKiBTT0xPIHF1YW5kbyBbY3VzdG9tTWVudUFjdGlvbnNdPVwiLi4uXCIgY2FtYmlhLlxyXG4gKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBjdXN0b21NZW51QWN0aW9ucyh2YWx1ZTogQXR0YWNobWVudE1lbnVBY3Rpb25bXSkge1xyXG4gICAgdGhpcy5fY3VzdG9tTWVudUFjdGlvbnMgPSB2YWx1ZSB8fCBbXTtcclxuICAgIHRoaXMuc2V0dXBNZW51QWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1c3RvbU1lbnVBY3Rpb25zKCk6IEF0dGFjaG1lbnRNZW51QWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbU1lbnVBY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3VzdG9tQ29sdW1uczogQXR0YWNobWVudEZpZWxkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogU09MTyBxdWFuZG8gW2N1c3RvbUNvbHVtbnNdPVwiLi4uXCIgY2FtYmlhLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGN1c3RvbUNvbHVtbnModmFsdWU6IEF0dGFjaG1lbnRGaWVsZENvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9jdXN0b21Db2x1bW5zID0gdmFsdWUgfHwgW107XHJcbiAgICB0aGlzLnNldHVwVGFibGVDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VzdG9tQ29sdW1ucygpOiBBdHRhY2htZW50RmllbGRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29sdW1ucztcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gQE91dHB1dCBkZWwgY29tcG9uZW50ZVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdGl0dWlzY2UgbGEgbGlzdGEgYWdnaW9ybmF0YSBkZWdsaSBhbGxlZ2F0aS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgbG9jYWxFZGl0ZWRBdHRhY2htZW50czogRXZlbnRFbWl0dGVyPEFycmF5PElBdHRhY2htZW50RFRPPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PElBdHRhY2htZW50RFRPPj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnRvIHNjYXRlbmF0byBhbGxhIHByZXNzaW9uZSBkZWwgcHVsc2FudGUgRVNDSSBkZWxsYSBtb2RhbGUgZGkgY2FyaWNhbWVudG8gZmlsZS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgYWJvcnRBZGRBdHRhY2htZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsJ0lBdHRhY2htZW50RFRPIHNlbGV6aW9uYXRvIHBlciBpbCBkb3dubG9hZCBuZWwgY2FzbyBGaWxlRGF0YUJhc2U2NCwgRmlsZUNvbnRlbnRUeXBlIG8gRmlsZU5hbWUgbm9uIGZvc3Nlcm8gc3BlY2lmaWNhdGkuXHJcbiAgICovXHJcbiAgQE91dHB1dChcImRvd25sb2FkQXR0YWNobWVudFwiKSBkb3dubG9hZEF0dGFjaG1lbnQ6IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsJ2VsZW1lbnRvIGVsaW1pbmF0byBwcmltYSBjaGUgcXVlc3RvIHZlbmdhIGVmZmV0dGl2YW1lbnRlIHJpc21vc3NvIGRhbGxhIGxpc3RhLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoXCJvbkRlbGV0ZUF0dGFjaG1lbnRcIikgb25EZWxldGVBdHRhY2htZW50OiBFdmVudEVtaXR0ZXI8SUF0dGFjaG1lbnREVE8+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBQcm9wcmlldMOgIHBlciBnZXN0aW9uZSBjYXJpY2FtZW50byBudW92byBhbGxlZ2F0b1xyXG4gIG5ld0F0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPID0ge30gYXMgSUF0dGFjaG1lbnREVE87XHJcbiAgbmV3TXVsdGlwbGVBdHRhY2htZW50czogQXJyYXk8SUF0dGFjaG1lbnREVE8+ID0gW107XHJcbiAgYXR0YWNobWVudFR5cGUgPSBBdHRhY2htZW50VHlwZTtcclxuICAvLyB1cGxvYWRUeXBlRW51bSA9IFVwbG9hZFR5cGVFbnVtO1xyXG4gIG5ld0F0dGFjaG1lbnRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlID0gbnVsbDtcclxuICBzZWxlY3RlZEZpbGVzOiBBcnJheTxGaWxlPiA9IG51bGw7XHJcbiAgc2hvd0Nyb3BJbWFnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dBZGRBdHRhY2htZW50XCIsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWxvZ0FkZEF0dGFjaG1lbnQ6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZGlhbG9nUmVmQWRkQXR0YWNobWVudDogTWF0RGlhbG9nUmVmPFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dBZGRNdWx0aXBsZUF0dGFjaG1lbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQWRkTXVsdGlwbGVBdHRhY2htZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIGRpYWxvZ1JlZkNyb3BJbWFnZTogTWF0RGlhbG9nUmVmPFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dDcm9wSW1hZ2VcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQ3JvcEltYWdlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAVmlld0NoaWxkKCdhZGRpbmdMaW5rVGVtcGxhdGUnKSBhZGRpbmdMaW5rVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBQcm9wcmlldMOgIHBlciBnZXN0aW9uZSByaWRpbWVuc2lvbmFtZW50byBmaWxlIGRpIHRpcG8gaW1hZ2VcclxuICBpbWFnZUNoYW5nZWRFdmVudDogYW55ID0gXCJcIjtcclxuICBjcm9wcGVkSW1hZ2U6IGFueSA9IFwiXCI7XHJcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xyXG4gIGNhbnZhc1JvdGF0aW9uID0gMDtcclxuICBAVmlld0NoaWxkKEltYWdlQ3JvcHBlckNvbXBvbmVudCkgaW1hZ2VDcm9wcGVyOiBJbWFnZUNyb3BwZXJDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImltYWdlSW5wdXRcIikgaW1hZ2VJbnB1dDogYW55O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBBdHRhY2htZW50VHlwZSA9IEF0dGFjaG1lbnRUeXBlO1xyXG4gIHNlbGVjdGVkQXR0YWNobWVudDogSUF0dGFjaG1lbnREVE87XHJcblxyXG4gIG9yaWdpbmFsV2lkdGg6IG51bWJlcjtcclxuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyO1xyXG4gIGN1c3RvbVdpZHRoOiBudW1iZXI7XHJcbiAgY3VzdG9tSGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbmxpbmVQcmV2aWV3VGVtcGxhdGVcIiwgeyBzdGF0aWM6IHRydWUgfSkgaW5saW5lUHJldmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dQcmV2aWV3XCIsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWxvZ1ByZXZpZXc6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIGltYWdlRmlsZTogRmlsZTtcclxuXHJcbiAgYWRkaW5nTGlua01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8jcmVnaW9uIFNlemlvbmUgbnVvdmEgcmVmYWN0b3JpbmdcclxuXHJcbiAgLy8gUHJvcHJpZXTDoCBpbnRlcm5hIGNoZSBjb250ZXJyw6AgbCdhcnJheSBmaW5hbGUgZGkgY29sb25uZSBvcmRpbmF0ZVxyXG4gIF90YWJsZUNvbHVtbnM6IEF0dGFjaG1lbnRGaWVsZENvbHVtbltdID0gW107XHJcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdEZpbGVUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGRlZmF1bHRGaWxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdEFjdGlvbnNUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGRlZmF1bHRBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8vIFN0YXRvIGRyYWcgJiBkcm9wIGUgdG9hc3RcclxuICBkcmFnT3ZlciA9IGZhbHNlO1xyXG4gIHRvYXN0ID0ge1xyXG4gICAgdmlzaWJsZTogZmFsc2UgYXMgYm9vbGVhbixcclxuICAgIHR5cGU6ICdzdWNjZXNzJyBhcyAnc3VjY2VzcycgfCAnZXJyb3InLFxyXG4gICAgdGV4dDogJycgYXMgc3RyaW5nLFxyXG4gICAgdGltZW91dElkOiAwIGFzIGFueVxyXG4gIH07XHJcblxyXG4gIHByb2dyZXNzUGVyY2VudCA9IDA7XHJcbiAgdG90YWxTaXplQnl0ZXMgPSAwO1xyXG4gIGdldCB0b3RhbFNpemVGb3JtYXR0ZWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZm9ybWF0RmlsZVNpemUodGhpcy50b3RhbFNpemVCeXRlcyk7IH1cclxuXHJcbiAgLy8gVXRpbGl0eSBwZXIgZm9ybWF0dGFyZSBieXRlcyAoMiBkZWNpbWFsaSlcclxuICBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmICghYnl0ZXMgfHwgYnl0ZXMgPD0gMCkgcmV0dXJuICcwIEJ5dGVzJztcclxuICAgIGNvbnN0IGsgPSAxMDI0O1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XHJcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XHJcbiAgICByZXR1cm4gYCR7cGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgyKSl9ICR7c2l6ZXNbaV19YDtcclxuICB9XHJcblxyXG4gIC8vIE1vc3RyYSB0b2FzdCBjb24gYXV0b+KAkWhpZGUgZSByZXNldCBwcm9ncmVzcyBiYXIgQ1NTXHJcbiAgc2hvd1RvYXN0KG1lc3NhZ2U6IHN0cmluZywgdHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJywgZHVyYXRpb25NcyA9IDMwMDApIHtcclxuICAgIGlmICh0aGlzLnRvYXN0LnZpc2libGUgJiYgdGhpcy50b2FzdC50ZXh0ID09PSBtZXNzYWdlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYW5jZWxsYSBpbCB0aW1lb3V0IHByZWNlZGVudGUgc2UgZXNpc3RlXHJcbiAgICBpZiAodGhpcy50b2FzdC50aW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3QudGltZW91dElkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjb2xhIHVuYSBkdXJhdGEgZGluYW1pY2FcclxuICAgIGNvbnN0IGR1cmF0aW9uID0gZHVyYXRpb25NcyB8fCBNYXRoLm1heCg0MDAwLCBtZXNzYWdlLmxlbmd0aCAqIDEwMCk7XHJcblxyXG4gICAgdGhpcy50b2FzdC50ZXh0ID0gbWVzc2FnZTtcclxuICAgIHRoaXMudG9hc3QudHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLnRvYXN0LnZpc2libGUgPSB0cnVlO1xyXG5cclxuICAgIC8vIEltcG9zdGEgaWwgbnVvdm8gdGltZW91dCBwZXIgbmFzY29uZGVyZSBhdXRvbWF0aWNhbWVudGUgaWwgdG9hc3RcclxuICAgIHRoaXMudG9hc3QudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudG9hc3QudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfSwgZHVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgI2VuZHJlZ2lvblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGVxcEF0dGFjaG1lbnRTZXJ2aWNlOiBFcXBBdHRhY2htZW50U2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIC8vIEluaXppYWxpenphIG1ldHJpY2hlIGUgcHJvZ3Jlc3MgaW4gYmFzZSBhbGxvIHN0YXRvIGluaXppYWxlXHJcbiAgICB0aGlzLnJlY29tcHV0ZVRvdGFsc0FuZFByb2dyZXNzKCk7XHJcblxyXG4gICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBhbGxvcmEgaW1wb3N0YSBpbCBmaWx0cm8gcGVyIGxlIGVzdGVuc2lvbmkgcG9zc2liaWxpIGRhIGNhcmljYXJlXHJcbiAgICBpZiAoIXRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMpXHJcbiAgICAgIGlmICh0aGlzLmFsbG93T25seUltYWdlcyA9PSB0cnVlKSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gXCJpbWFnZS8qXCI7XHJcbiAgICAgIGVsc2UgdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyA9IFwiKlwiO1xyXG5cclxuICAgIC8vIFNlIG5vbiBzb25vIHN0YXRpIHNwZWNpZmljYXRpIGkgdGlwaSBkYSBnZXN0aXJlIG1hIMOoIHN0YXRvIHBhc3NhdG8gbnVsbCBvIHVuIGFycmF5IHZ1b3RvIGltcG9zdG8gaSB0aXBpIGRpIGRlZmF1bHQuXHJcbiAgICBpZiAoIXRoaXMuYWxsb3dlZFR5cGVzIHx8IHRoaXMuYWxsb3dlZFR5cGVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcyA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LLCBBdHRhY2htZW50VHlwZS5EUk9QQk9YXTtcclxuICAgIGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcy5maW5kKCh0KSA9PiB0ICE9IEF0dGFjaG1lbnRUeXBlLkZJTEUgJiYgdCAhPSBBdHRhY2htZW50VHlwZS5MSU5LICYmIHQgIT0gQXR0YWNobWVudFR5cGUuRFJPUEJPWClcclxuICAgICkge1xyXG4gICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5XYXJuaW5nKFxyXG4gICAgICAgICdBbG1lbm8gdW5vIGRlZ2xpIEF0dGFjaG1lbnRUeXBlIHNlbGV6aW9uYXRpIG5lbCBwYXJhbWV0cm8gXCJhbGxvd2VkVHlwZXNcIiBub24gZXNpc3RlLidcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5hbGxvd2VkVHlwZXMgPSBbQXR0YWNobWVudFR5cGUuRklMRSwgQXR0YWNobWVudFR5cGUuTElOSywgQXR0YWNobWVudFR5cGUuRFJPUEJPWF07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0YWNobWVudHNMaXN0ID09IG51bGwpIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAgIC8vIFNlIMOoIHN0YXRvIHBhc3NhdG8gdW4gc2luZ29sbyBhbGxlZ2F0byBsbyBhZ2dpdW5nbyBhbGxhIGxpc3RhXHJcbiAgICBpZiAodGhpcy5zaW5nbGVBdHRhY2htZW50ICE9IG51bGwgJiYgdGhpcy5hdHRhY2htZW50c0xpc3QubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5hdHRhY2htZW50c0xpc3QucHVzaCh0aGlzLnNpbmdsZUF0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hlY2tBdHRhY2htZW50SW1hZ2UoKTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgICAgdGhpcy5lcXBBdHRhY2htZW50U2VydmljZS5sb2FkRHJvcGJveFNjcmlwdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0dXBUYWJsZUNvbHVtbnMoKTtcclxuICAgIHRoaXMuc2V0dXBNZW51QWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgc2V0Vmlld01vZGUobW9kZTogJ2NhcmQnIHwgJ3RhYmxlJyk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3TW9kZSA9IG1vZGU7XHJcbiAgfVxyXG5cclxuICAvLyBSaWNhbGNvbGEgbGEgc29tbWEgcGVzYXRhIHN1Z2xpIGFsbGVnYXRpIHByZXNlbnRpXHJcbiAgcHJpdmF0ZSByZWNvbXB1dGVUb3RhbHNBbmRQcm9ncmVzcygpIHtcclxuICAgIHRoaXMudG90YWxTaXplQnl0ZXMgPSAodGhpcy5hdHRhY2htZW50c0xpc3QgfHwgW10pXHJcbiAgICAgIC5maWx0ZXIoYSA9PiAhIWEpXHJcbiAgICAgIC5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgdGhpcy5ieXRlc0Zyb21CYXNlNjQoYS5GaWxlRGF0YUJhc2U2NCB8fCBhLkZpbGVUaHVtYm5haWxCYXNlNjQgfHwgJycpLCAwKTtcclxuXHJcbiAgICAvLyBQcm9ncmVzcyBmaXR0aXppbzogMTAwJSBzZSBwcmVzZW50aSBmaWxlLCAwIHNlIHZ1b3RvXHJcbiAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9ICh0aGlzLmF0dGFjaG1lbnRzTGlzdCAmJiB0aGlzLmF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPiAwKSA/IDEwMCA6IDA7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnRvYXN0LnRpbWVvdXRJZCkgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3QudGltZW91dElkKTtcclxuICB9XHJcblxyXG4gIC8vIENhbGNvbGEgaSBieXRlIGRhIHVuYSBzdHJpbmdhIEJhc2U2NCBwdXJhIChzZW56YSBwcmVmaXNzbyBkYXRhOi4uLilcclxuICBwdWJsaWMgYnl0ZXNGcm9tQmFzZTY0KGJhc2U2NDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmICghYmFzZTY0KSByZXR1cm4gMDtcclxuICAgIC8vIFJpbXVvdmkgZXZlbnR1YWxlIHByZWZpc3NvIGRhdGEgVVJMXHJcbiAgICBjb25zdCBjb21tYUlkeCA9IGJhc2U2NC5pbmRleE9mKCcsJyk7XHJcbiAgICBjb25zdCBiNjQgPSBjb21tYUlkeCA+PSAwID8gYmFzZTY0LnN1YnN0cmluZyhjb21tYUlkeCArIDEpIDogYmFzZTY0O1xyXG4gICAgLy8gQ29udGEgcGFkZGluZ1xyXG4gICAgbGV0IHBhZGRpbmcgPSAwO1xyXG4gICAgaWYgKGI2NC5lbmRzV2l0aCgnPT0nKSkgcGFkZGluZyA9IDI7XHJcbiAgICBlbHNlIGlmIChiNjQuZW5kc1dpdGgoJz0nKSkgcGFkZGluZyA9IDE7XHJcbiAgICAvLyBGb3JtdWxhIGVzYXR0YTogKDMgKiAobGVuIC8gNCkpIC0gcGFkZGluZ1xyXG4gICAgY29uc3QgbGVuID0gYjY0Lmxlbmd0aDtcclxuICAgIHJldHVybiBNYXRoLm1heCgwLCAoMyAqIE1hdGguZmxvb3IobGVuIC8gNCkpIC0gcGFkZGluZyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0F0dGFjaG1lbnRJbWFnZSgpIHtcclxuICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LmZvckVhY2goKGEpID0+IHtcclxuICAgICAgYS5Jc0ltYWdlID0gQXR0YWNobWVudEhlbHBlclNlcnZpY2UuY2hlY2tJbWFnZUZyb21NaW1lVHlwZShhLkZpbGVDb250ZW50VHlwZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBHZXN0aW9uZSBlbGVuY28gYWxsZWdhdGlcclxuXHJcbiAgLyoqXHJcbiAgICogRWxpbWluYSB1biBhbGxlZ2F0byBlbGltaW5hbmRvIGFuY2hlIGlsIGZpbGUgcHJlc2VudGUgbmVsbG8gc3RvcmFnZSBkaSBhcmNoaXZpYXppb25lIHV0aWxpenphdG8gKEFXUyBvIGNhcnRlbGxhIHByb2dldHRvKVxyXG4gICAqIEBwYXJhbSBlbGVtZW50IElBdHRhY2htZW50RFRPIGRhIGNhbmNlbGxhcmVcclxuICAgKi9cclxuICBkZWxldGVBdHRhY2htZW50KGVsZW1lbnQ6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5Db25maXJtKFxyXG4gICAgICB0aGlzLmRlbGV0ZURpYWxvZ01lc3NhZ2UsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZUF0dGFjaG1lbnRGcm9tTGlzdCh0aGlzLmF0dGFjaG1lbnRzTGlzdC5pbmRleE9mKGVsZW1lbnQpKTtcclxuICAgICAgfSxcclxuICAgICAgdHJ1ZSxcclxuICAgICAgdGhpcy5kZWxldGVEaWFsb2dUaXRsZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpbXVvdmUgbCdhbGxlZ2F0byBzZWxlemlvbmF0byBkYWxsYSBsaXN0YSBcImF0dGFjaG1lbnRzTGlzdFwiIGUgaW52b2NhIGwnZXZlbnRvIGRpIG91dHB1dCBjaGUgcmVzdGl0dWlzY2UgbGEgbGlzdGEgYWdnaW9ybmF0YS5cclxuICAgKiBAcGFyYW0gYXR0YWNobWVudEluZGV4IEluZGljZSBkZWxsJ2F0dGFjaG1lbnQgZGEgcmltdW92ZXJlXHJcbiAgICovXHJcbiAgcmVtb3ZlQXR0YWNobWVudEZyb21MaXN0KGF0dGFjaG1lbnRJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm9uRGVsZXRlQXR0YWNobWVudC5lbWl0KHRoaXMuYXR0YWNobWVudHNMaXN0W2F0dGFjaG1lbnRJbmRleF0pO1xyXG5cclxuICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LnNwbGljZShhdHRhY2htZW50SW5kZXgsIDEpO1xyXG4gICAgdGhpcy5sb2NhbEVkaXRlZEF0dGFjaG1lbnRzLmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3QpO1xyXG5cclxuICAgIHRoaXMucmVjb21wdXRlVG90YWxzQW5kUHJvZ3Jlc3MoKTtcclxuICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVtb3ZlZExhYmVsIHx8ICdGaWxlIHJlbW92ZWQnLCAnc3VjY2VzcycpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2ltdWxhdGVQcm9ncmVzcygpIHtcclxuICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50ID0gMDtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDMwO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDYwO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnQgPSAxMDA7XHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgfSwgMjAwKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogU2NhcmljYSBsJ2FsbGVnYXRvIG8gYXByZSBpbCBsaW5rXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgQWxsZWdhdG8gZGEgbW9zdHJhcmVcclxuICAgKi9cclxuICB2aWV3QXR0YWNobWVudChhdHRhY2htZW50OiBJQXR0YWNobWVudERUTykge1xyXG4gICAgaWYgKGF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSykge1xyXG4gICAgICB3aW5kb3cub3BlbihhdHRhY2htZW50LkZpbGVQYXRoLCBcIl9ibGFua1wiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhdHRhY2htZW50LkxhcmdlRmlsZSkge1xyXG4gICAgICBjb25zdCBmaWxlID0gYXR0YWNobWVudC5MYXJnZUZpbGU7XHJcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgbGluay5ocmVmID0gdXJsO1xyXG4gICAgICBsaW5rLmRvd25sb2FkID0gYXR0YWNobWVudC5GaWxlTmFtZSB8fCBmaWxlLm5hbWU7XHJcbiAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCksIDEwMDApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiYgYXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgJiYgYXR0YWNobWVudC5GaWxlTmFtZSkge1xyXG4gICAgICBsZXQgc291cmNlID0gYGRhdGE6JHthdHRhY2htZW50LkZpbGVDb250ZW50VHlwZX07YmFzZTY0LCR7YXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NH1gO1xyXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgIGxpbmsuaHJlZiA9IHNvdXJjZTtcclxuICAgICAgbGluay5kb3dubG9hZCA9IGAke2F0dGFjaG1lbnQuRmlsZU5hbWV9YDtcclxuICAgICAgbGluay5jbGljaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kb3dubG9hZEF0dGFjaG1lbnQuZW1pdChhdHRhY2htZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpZGVmaW5pc2NlIGwnaWNvbmEgZGEgbW9zdHJhcmUgbmVsbGEgY29sb25uYSBkZWxsJ2VxcC10YWJsZSBwZXIgb2duaSBmaWxlLlxyXG4gICAqIEwnaWNvbmEgdmFyaWEgaW4gYmFzZSBhbGwnZXN0ZW5zaW9uZSBkZWwgZmlsZVxyXG4gICAqIEBwYXJhbSBhdHRhY2htZW50XHJcbiAgICovXHJcbiAgZ2V0QXR0YWNobWVudEljb24oYXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIGlmIChhdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHJldHVybiBcImZhcyBmYS1saW5rXCI7XHJcbiAgICBlbHNlIHJldHVybiBBdHRhY2htZW50SGVscGVyU2VydmljZS5nZXRJY29uRnJvbUZpbGVFeHRlbnNpb25lKGF0dGFjaG1lbnQuRmlsZUV4dGVuc2lvbik7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogSW4gY2FzbyBkaSBhbGxlZ2F0byBzaW5nb2xvLCBzY2VnbGllIHF1YWxlIG1ldG9kbyByaWNoaWFtYXJlIGluIGJhc2UgYWwgdGlwbyBkaSBhbGxlZ2F0b1xyXG4gICAqL1xyXG4gIGFkZEZpbGUoYXR0YWNobWVudFR5cGU6IEF0dGFjaG1lbnRUeXBlLCBpbWFnZUlucHV0ID0gbnVsbCkge1xyXG4gICAgaWYgKGF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgdGhpcy5zd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKCk7XHJcbiAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUpIHtcclxuICAgICAgaW1hZ2VJbnB1dC5jbGljaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaG9vc2VEcm9wYm94RmlsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlQXR0YWNobWVudEZvcm0oKSB7XHJcbiAgICAvL0NyZWEgbGEgZm9ybSBwZXIgbGEgdmFsaWRhemlvbmUgZGVpIGNhbXBpXHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFt0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBuYW1lOiBbdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lXSxcclxuICAgICAgcGF0aDogW3RoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aF0sXHJcbiAgICAgIGN1c3RvbUhlaWdodDogW3RoaXMuY3VzdG9tSGVpZ2h0XSxcclxuICAgICAgY3VzdG9tV2lkdGg6IFt0aGlzLmN1c3RvbVdpZHRoXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZShlbWl0Q2xvc2VFdmVudCA9IHRydWUpIHtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudCA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG4gICAgdGhpcy5hYm9ydEZpbGUoKTtcclxuICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnRGb3JtKSB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLnJlc2V0KCk7XHJcblxyXG4gICAgdGhpcy5kaWFsb2dSZWZDcm9wSW1hZ2UuY2xvc2UoKTtcclxuICAgIHRoaXMucmVzdG9yZU9yaWdpbmFsRGltZW5zaW9ucygpO1xyXG5cclxuICAgIGlmIChlbWl0Q2xvc2VFdmVudCA9PSB0cnVlICYmIHRoaXMuYWJvcnRBZGRBdHRhY2htZW50KSB0aGlzLmFib3J0QWRkQXR0YWNobWVudC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbiBiYXNlIGFsIHRpcG8gZGkgYWxsZWdhdG8gY29udHJvbGxhIHNlIGRpc2FiaWxpdGFyZSBvIG1lbm8gaWwgcHVsc2FudGUgcGVyIHNhbHZhcmUuXHJcbiAgICogRnVuemlvbmUgdXNhdGEgbmVsIFtkaXNhYmxlXSBkZWwgcHVsc2FudGUgXCJTYWx2YVwiIGRlbCBkaWFsb2cgcGVyIGwnYWdnaXVudGEgZGkgdW4gYWxsZWdhdG8uXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBkaXNhYmxlU2F2ZSgpIHtcclxuICAgIGlmICh0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpIHtcclxuICAgICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiYgIXRoaXMubmV3QXR0YWNobWVudC5MYXJnZUZpbGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZVBhdGg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzLmZpbHRlcihcclxuICAgICAgICAgIChwKSA9PlxyXG4gICAgICAgICAgICAocC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFICYmICFwLkZpbGVEYXRhQmFzZTY0ICYmICFwLkxhcmdlRmlsZSkgfHxcclxuICAgICAgICAgICAgKHAuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhcC5GaWxlUGF0aClcclxuICAgICAgICApLmxlbmd0aCA+IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbmZpcm1BZGRBdHRhY2htZW50KCkge1xyXG4gICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlICYmIHRoaXMuaW1hZ2VDcm9wcGVyKSB7XHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuaW1hZ2VDcm9wcGVyLmNyb3AoKS5iYXNlNjQuc3BsaXQoXCI7YmFzZTY0LFwiKVsxXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lKVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IHRoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKSB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LnB1c2godGhpcy5uZXdBdHRhY2htZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMgPT0gbnVsbCB8fCB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMubGVuZ3RoID09IDApIHJldHVybjtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKSB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gdGhpcy5hdHRhY2htZW50c0xpc3QuY29uY2F0KHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2NhbEVkaXRlZEF0dGFjaG1lbnRzLmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3QpO1xyXG5cclxuICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZkNyb3BJbWFnZS5jbG9zZSgpO1xyXG4gICAgICB0aGlzLnJlc3RvcmVPcmlnaW5hbERpbWVuc2lvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50Rm9ybSkgdGhpcy5uZXdBdHRhY2htZW50Rm9ybS5yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzZXRTZWxlY3RlZEZpbGVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyAyLiBSRVNFVCBUT1RBTEU6IFN2dW90aWFtbyBsZSBwcm9wcmlldMOgIGRpIGNsYXNzZSBwZXIgZXZpdGFyZSBjaGUgXHJcbiAgLy8gcmVzaWR1aSBkaSB1cGxvYWQgcHJlY2VkZW50aSAoc2luZ29saSBvIG11bHRpcGxpKSB2ZW5nYW5vIHRyYXNjaW5hdGkuXHJcbiAgcHJpdmF0ZSByZXNldFNlbGVjdGVkRmlsZXMoKSB7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHJlIGlsIGRpYWxvZyBwZXIgbCdhbnRlcHJpbWEgZGVsbCdhbGxlZ2F0byBzZWxlemlvbmF0by5cclxuICAgKiBAcGFyYW0gcm93XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBvcGVuUHJldmlld0RpYWxvZyhyb3c6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudCA9IHsgLi4ucm93IH07XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmdldEF0dGFjaG1lbnRFbmRwb2ludCAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5Jc0ltYWdlICYmICF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEF0dGFjaG1lbnRCeUlEKClcclxuICAgICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHJlcy5GaWxlRGF0YUJhc2U2NDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5FcnJvcihlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGhcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aChcInZpZGVvL1wiKSAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5MYXJnZUZpbGUpIHtcclxuICAgICAgY29uc3QgdmlkZW9VcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkxhcmdlRmlsZSk7XHJcbiAgICAgIC8vIFVzaWFtbyBieXBhc3NTZWN1cml0eVRydXN0VXJsIHBlciBsYSBzb3JnZW50ZSBkZWwgdmlkZW9cclxuICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwodmlkZW9VcmwpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LklzSW1hZ2UgJiZcclxuICAgICAgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ICYmXHJcbiAgICAgICF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0XHJcbiAgICApIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuSW5mbyhcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkZWxsJ2FsbGVnYXRvLCBmaWxlIG1hbmNhbnRlLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKFxyXG4gICAgICAgIGBkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJHt0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NH1gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGggJiYgdGhpcy5wcm9kdWN0aW9uQmFzZVVybCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXHJcbiAgICAgICAgICBcImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2d2aWV3P3VybD1cIiArXHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3Rpb25CYXNlVXJsICtcclxuICAgICAgICAgIFwiL1wiICtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVQYXRoICtcclxuICAgICAgICAgIFwiJmVtYmVkZGVkPXRydWVcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuSW5mbyhcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkZWwgZG9jdW1lbnRvIVwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nUHJldmlldywge1xyXG4gICAgICBwYW5lbENsYXNzOiAnZXFwLWF0dGFjaG1lbnRzLXByZXZpZXctZGlhbG9nJyxcclxuICAgICAgbWF4V2lkdGg6ICc5NXZ3JyxcclxuICAgICAgd2lkdGg6IHJvdy5Jc0ltYWdlIHx8IHJvdy5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpID8gJ2F1dG8nIDogJzExMDBweCcsXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQdWxpemlhIGRlbGxhIG1lbW9yaWEgcXVhbmRvIGlsIGRpYWxvZyBzaSBjaGl1ZGVcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudD8uRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKFwidmlkZW8vXCIpKSB7XHJcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsIGFzIGFueSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0QXR0YWNobWVudEJ5SUQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SUF0dGFjaG1lbnREVE8+KHRoaXMuZ2V0QXR0YWNobWVudEVuZHBvaW50LCB0aGlzLnNlbGVjdGVkQXR0YWNobWVudCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR2VzdGlvbmUgY2FyaWNhbWVudG8gZmlsZVxyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gc2NhdGVuYXRvIGFsbGEgc2VsZXppb25lIGRlbCBmaWxlIChvIGRlaSBmaWxlKS5cclxuICAgKiBTZSBpbCBjYXJpY2FtZW50byDDqCBTSU5HT0xPIG8gc2UgY29tdW5xdWUgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gc29sbyBmaWxlIGFsbG9yYSBzaSBvY2N1cGEgZGkgY29udHJvbGxhcmUgc2Ugc2kgdHJhdHRhIGRpIHVuIGltbWFnaW5lIGluIG1vZG8gZGFcclxuICAgKiBtb3N0cmFyZSBsZSBmdW56aW9uYWxpdMOgIGRlbCBjcm9wcGllIChwZXIgcml0YWdsaWFyZSBsJ2ltbWFnaW5lKSBvcHB1cmUgbm8uXHJcbiAgICogU2UgaWwgZmlsZSBjYXJpY2F0byBub24gw6ggdW4gaW1tYWdpbmUgYWxsb3JhIGdlbmVyYSBkaXJldHRhbWVudGUgaWwgYmFzZTY0IGUgbG8gYXNzb2NpYSBhbGwnYWxsZWdhdG8gZGEgc2FsdmFyZS5cclxuICAgKiBTZSBpbnZlY2UgaWwgY2FyaWNhbWVudG8gZGVpIGZpbGUgw6ggTVVMVElQTE8gZSBzb25vIHByZXNlbnRpIHBpw7kgZmlsZSBhbGxvcmEgZXNlZ3VlIGxlIHN0ZXNzZSBvcGVyYXppb25pIGlnbm9yYW5kbyBwZXLDsiBpbCBjb250cmxsb1xyXG4gICAqIGltbWFnaW5lIHBlciBpbCBjcm9wcGllIChpbiBjYXNvIGRpIGNhcmljYW1lbnRvIG11bHRpcGxvIGxlIGZ1bnppb25hbGl0w6AgZGVsIGNyb3BwaWUgc29ubyBkaXNhYmlsaXRhdGUpLlxyXG4gICAqL1xyXG4gIGFzeW5jIG9uRmlsZUFkZGVkKGV2ZW50LCBpc0ZpbGVEcm9wcGVkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkluZm8oXCJDYXJpY2FtZW50byBhbGxlZ2F0aSBub24gZGlzcG9uaWJpbGUuXCIpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnJlc2V0U2VsZWN0ZWRGaWxlcygpO1xyXG5cclxuICAgIGNvbnN0IGZpbGVzT25JbnB1dDogRmlsZVtdID0gaXNGaWxlRHJvcHBlZFxyXG4gICAgICA/IChldmVudCBhcyBGaWxlW10pXHJcbiAgICAgIDogQXJyYXkuZnJvbSgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy5maWxlcyB8fCBbXSk7XHJcblxyXG4gICAgY29uc3QgeyB2YWxpZEZpbGVzLCBvdmVyc2l6ZWRGaWxlcyB9ID0gdGhpcy52YWxpZGF0aW9uRmlsZShmaWxlc09uSW5wdXQpO1xyXG5cclxuICAgIGlmICghdmFsaWRGaWxlcyB8fCB2YWxpZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBpZiAoIWlzRmlsZURyb3BwZWQgJiYgZXZlbnQ/LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9TZSDDqCBzdGF0byByaWNoaWVzdG8gaWwgY2FyaWNhbWVudG8gU0lOR09MTyBvcHB1cmUgc2UgaWwgY2FyaWNhbWVudG8gw6ggTVVMVElQTE8gbWEgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gc29sbyBmaWxlXHJcbiAgICAvL2FsbG9yYSB2ZXJpZmljYSBzZSBpbCBmaWxlIMOoIHVuIGltbWFnaW5lIChwZXIgbW9zdHJhcmUgaWwgQ1JPUFBJRSlcclxuICAgIGlmIChbLi4udmFsaWRGaWxlc10ubGVuZ3RoID09IDEgfHwgdGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gdmFsaWRGaWxlc1swXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gdmFsaWRGaWxlcztcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgLy9NZW1vcml6emEgaSBkYXRpIHBlciBsJ2FsbGVnYXRvXHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IGF3YWl0IHRoaXMuY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUodGhpcy5zZWxlY3RlZEZpbGUsIGZhbHNlKTtcclxuICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG4gICAgICB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMucHVzaCh0aGlzLm5ld0F0dGFjaG1lbnQpO1xyXG5cclxuICAgICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBtYSBwZXIgZXJyb3JlIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIGZpbGUgY2hlIG5vbiDDqCB1biBpbW1hZ2luZVxyXG4gICAgICBsZXQgY2hlY2tPbmx5SW1hZ2UgPSB0aGlzLmNoZWNrQWxsb3dPbmx5SW1hZ2VGaWxlKHRoaXMubmV3QXR0YWNobWVudCk7XHJcbiAgICAgIGlmIChjaGVja09ubHlJbWFnZSA9PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5jcmVhdGVBdHRhY2htZW50Rm9ybSgpO1xyXG5cclxuICAgICAgLy9WZXJpZmljYSBzZSBpbCBmaWxlIGNhcmljYXRvIMOoIHVuJ2ltbWFnaW5lIG9wcHVyZSBuby4gU2Ugw6ggdW4gaW1tYWdpbmUsIHByaW1hIGRpIGNhcmljYXJsYSBtb3N0cmEgaWwgY3JvcHBpZSBwZXIgaWwgcmVzaXplLlxyXG4gICAgICAvL1NlIG5vbiDDqCB1biBpbW1hZ2luZSBhbGxvcmEgZ2VuZXJhIGlsIEJhc2U2NFxyXG4gICAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LklzSW1hZ2UgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0SW1hZ2VEaW1lbnNpb25zKHZhbGlkRmlsZXNbMF0pO1xyXG5cclxuICAgICAgICAvL01vc3RyYSBpbCBjcm9wcGllIGUgZGlzYWJpbGl0YSBsYSBmb3JtIGZpbmNow6ggbm9uIHRlcm1pbmEgbGEgbW9kaWZpY2EgZGVsbCdpbW1hZ2luZVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uY29udHJvbHNbXCJjdXN0b21XaWR0aFwiXS5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLmNvbnRyb2xzW1wiY3VzdG9tSGVpZ2h0XCJdLmVuYWJsZSgpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93Q3JvcEltYWdlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VGaWxlID0gZXZlbnQ7XHJcblxyXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWZDcm9wSW1hZ2UgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nQ3JvcEltYWdlLCB7XHJcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIHdpZHRoOiBcIjYwJVwiLFxyXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IFwiODAlXCIsXHJcbiAgICAgICAgICAgIG1heFdpZHRoOiBcIjcwdmhcIixcclxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydlcXAtYXR0YWNobWVudHMtZGlhbG9nJywgJ2Nyb3AtZGlhbG9nJ11cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBiYXNlNjRSZXN1bHQgPSBhd2FpdCB0aGlzLmdldEJhc2U2NEZyb21GaWxlKHRoaXMuc2VsZWN0ZWRGaWxlKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBiYXNlNjRSZXN1bHQuQmFzZTY0RmlsZTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gYmFzZTY0UmVzdWx0LkNvbnRlbnRUeXBlO1xyXG4gICAgICAgIHRoaXMuY29uZmlybUFkZEF0dGFjaG1lbnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IHZhbGlkRmlsZXM7XHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpbGVzIHx8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMpIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IGF3YWl0IHRoaXMuY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXNbaV0sXHJcbiAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBtYSBwZXIgZXJyb3JlIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIGZpbGUgY2hlIG5vbiDDqCB1biBpbW1hZ2luZVxyXG4gICAgICAgIGxldCBjaGVja09ubHlJbWFnZSA9IHRoaXMuY2hlY2tBbGxvd09ubHlJbWFnZUZpbGUobmV3QXR0YWNobWVudCk7XHJcbiAgICAgICAgaWYgKGNoZWNrT25seUltYWdlID09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cy5wdXNoKG5ld0F0dGFjaG1lbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29uZmlybUFkZEF0dGFjaG1lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlY29tcHV0ZVRvdGFsc0FuZFByb2dyZXNzKCk7XHJcbiAgICB0aGlzLnNpbXVsYXRlUHJvZ3Jlc3MoKTtcclxuICAgIC8vIENhc28gMTogU3VjY2Vzc28gUGFyemlhbGUgKGFsY3VuaSBmaWxlIHZhbGlkaSwgYWx0cmkgbm8pXHJcbiAgICBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID4gMCAmJiB2YWxpZEZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZU5hbWVzID0gb3ZlcnNpemVkRmlsZXMuam9pbignLCAnKTtcclxuICAgICAgdGhpcy5zaG93VG9hc3QoXHJcbiAgICAgICAgYCR7dmFsaWRGaWxlcy5sZW5ndGh9IGZpbGUgYWdnaXVudGkuICR7b3ZlcnNpemVkRmlsZXMubGVuZ3RofSBub24gY2FyaWNhdGkgcGVyY2jDqSB0cm9wcG8gZ3JhbmRpICgke2ZpbGVOYW1lc30pLmAsXHJcbiAgICAgICAgJ2Vycm9yJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gQ2FzbyAyOiBOZXNzdW4gZmlsZSB2YWxpZG9cclxuICAgIGVsc2UgaWYgKG92ZXJzaXplZEZpbGVzLmxlbmd0aCA+IDAgJiYgdmFsaWRGaWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgIH1cclxuICAgIC8vIENhc28gMzogVHV0dGkgaSBmaWxlIHZhbGlkaVxyXG4gICAgZWxzZSBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID09PSAwICYmIHZhbGlkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnNob3dUb2FzdChcclxuICAgICAgICBgJHt2YWxpZEZpbGVzLmxlbmd0aH0gJHt0aGlzLmFkZGVkU3VjY2Vzc2Z1bGx5TGFiZWwgfHwgJ2ZpbGUocykgYWdnaXVudGkgY29uIHN1Y2Nlc3NvLid9YCxcclxuICAgICAgICAnc3VjY2VzcydcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1Jlc2V0dG8gaWwgdmFsb3JlIGRlbCBmaWxlIGlucHV0IGluIG1vZG8gZGEgc2NhdGVuYXJlIGlsIGNoYW5nZSBhbmNoZSBzZSBzaSBkb3Zlc3NlIGNhcmljYXJlIGxvIHN0ZXNzbyBmaWxlXHJcbiAgICBpZiAoIWlzRmlsZURyb3BwZWQpIGV2ZW50LnRhcmdldC52YWx1ZSA9IFwiXCI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbGlkYXRpb25GaWxlKGZpbGVzT25JbnB1dDogRmlsZVtdKSB7XHJcbiAgICBjb25zdCB2YWxpZEZpbGVzOiBGaWxlW10gPSBbXTtcclxuICAgIGNvbnN0IG92ZXJzaXplZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlc09uSW5wdXQpIHtcclxuICAgICAgY29uc3QgZmlsZVNpemVNQiA9IGZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xyXG4gICAgICBpZiAoZmlsZVNpemVNQiA+IHRoaXMubWF4RmlsZVNpemVNQikge1xyXG4gICAgICAgIG92ZXJzaXplZEZpbGVzLnB1c2goZmlsZS5uYW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlTmFtZXMgPSBvdmVyc2l6ZWRGaWxlcy5qb2luKCcsICcpO1xyXG4gICAgICB0aGlzLnNob3dUb2FzdChcclxuICAgICAgICBgRmlsZShzKSB0cm9wcG8gZ3JhbmRpOiAke2ZpbGVOYW1lc30uIExpbWl0ZTogJHt0aGlzLm1heEZpbGVTaXplTUJ9TUJgLFxyXG4gICAgICAgICdlcnJvcidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB2YWxpZEZpbGVzLCBvdmVyc2l6ZWRGaWxlcyB9O1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEEgcGFydGlyZSBkYWwgRklMRSByaWNldnV0byBpbiBpbnB1dCByaWNvc3RydWlzY2UgbCdvZ2dldHRvIElBdHRhY2htZW50RFRPIGUgbG8gcmVzdGl0dWlzY2UuXHJcbiAgICogU2UgaWwgcGFyYW1ldHJvIGdldEJhc2U2NCB2aWVuZSBwYXNzYXRvIGEgVFJVRSBhbGxvcmEsIHNlbXByZSBhIHBhcnRpcmUgZGFsIGZpbGUsZ2VuZXJhIGlsIGJhc2U2NCBlXHJcbiAgICogcmljYXZhIGlsIENvbnRlbnRUeXBlIGRhIGFzc29jaWFyZSBhbGwnb2dnZXR0byBJQXR0YWNobWVudERUTyBkYSByZXN0aXR1aXJlXHJcbiAgICogQHBhcmFtIGN1cnJlbnRGaWxlIE9nZ2V0dG8gRklMRSBkYSBwcm9jZXNzYXJlXHJcbiAgICogQHBhcmFtIGdldEJhc2U2NCBTZSBUUlVFIGFsbG9yYSBjYWxjb2xhIGJhc2U2NCBlIENvbnRlbnRUeXBlIGRlbCBmaWxlIHBhc3NhdG8gaW4gaW5wdXRcclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1biBvZ2dldHRvIGRpIHRpcG8gSUF0dGFjaG1lbnREVE9cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUF0dGFjaG1lbnRGcm9tVXBsb2FkZWRGaWxlKFxyXG4gICAgY3VycmVudEZpbGU6IEZpbGUsXHJcbiAgICBnZXRCYXNlNjQ6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgY3JvcEZpbGU6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICk6IFByb21pc2U8SUF0dGFjaG1lbnREVE8+IHtcclxuICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgLy9NZW1vcml6emEgaSBkYXRpIHBlciBsJ2FsbGVnYXRvXHJcbiAgICBuZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID0gQXR0YWNobWVudFR5cGUuRklMRTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gY3VycmVudEZpbGUudHlwZTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZU5hbWUgPSBjdXJyZW50RmlsZS5uYW1lO1xyXG4gICAgbmV3QXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uID0gY3VycmVudEZpbGUubmFtZS5zdWJzdHIoY3VycmVudEZpbGUubmFtZS5sYXN0SW5kZXhPZihcIi5cIikgKyAxKTtcclxuICAgIG5ld0F0dGFjaG1lbnQuSXNJbWFnZSA9IEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmNoZWNrSW1hZ2VGcm9tTWltZVR5cGUoY3VycmVudEZpbGUudHlwZSk7XHJcblxyXG4gICAgY29uc3QgZmlsZVNpemVNQiA9IGN1cnJlbnRGaWxlLnNpemUgLyAxMDI0IC8gMTAyNDtcclxuICAgIGNvbnN0IGlzTGFyZ2VGaWxlID0gZmlsZVNpemVNQiA+IHRoaXMuYmFzZTY0TGltaXRNQjtcclxuICAgIGNvbnN0IGlzVmlkZW8gPSBjdXJyZW50RmlsZS50eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvJyk7XHJcblxyXG4gICAgaWYgKGlzVmlkZW8pIHtcclxuICAgICAgbGV0IGZpbmFsRmlsZTogRmlsZSB8IEJsb2IgPSBjdXJyZW50RmlsZTtcclxuXHJcbiAgICAgIC8vIE1pbmlhdHVyYSBkZWwgdmlkZW9cclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVZpZGVvVGh1bWJuYWlsKGN1cnJlbnRGaWxlKTtcclxuXHJcbiAgICAgIC8vIFNlIGxhIGNvbXByZXNzaW9uZSDDqCBhYmlsaXRhdGEsIGVsYWJvcmlhbW8gaWwgdmlkZW9cclxuICAgICAgaWYgKHRoaXMudmlkZW9Db21wcmVzc2lvbi5lbmFibGVkKSB7XHJcbiAgICAgICAgLy8gdGhpcy5zaG93VG9hc3QoXCJDb21wcmVzc2lvbmUgdmlkZW8gaW4gY29yc28uLi5cIiwgXCJpbmZvXCIpO1xyXG4gICAgICAgIGZpbmFsRmlsZSA9IGF3YWl0IHRoaXMuY29tcHJlc3NWaWRlb05hdGl2ZShjdXJyZW50RmlsZSwgdGhpcy52aWRlb0NvbXByZXNzaW9uKTtcclxuXHJcbiAgICAgICAgLy8gQWdnaW9ybmlhbW8gaSBkYXRpIGRlbGwnYWxsZWdhdG8gY29uIGlsIG51b3ZvIGZpbGUgY29tcHJlc3NvXHJcbiAgICAgICAgbmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IGN1cnJlbnRGaWxlLm5hbWUucmVwbGFjZSgvXFwuW14vLl0rJC8sIFwiXCIpICsgXCIud2VibVwiO1xyXG4gICAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gXCJ2aWRlby93ZWJtXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuTGFyZ2VGaWxlID0gZmluYWxGaWxlIGFzIEZpbGU7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuSXNMYXJnZUZpbGUgPSB0cnVlO1xyXG4gICAgICByZXR1cm4gbmV3QXR0YWNobWVudDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNMYXJnZUZpbGUpIHtcclxuICAgICAgLy8gQ0FTTyBMQVJHRSBGSUxFOlxyXG4gICAgICAvLyBQb3BvbGlhbW8gT3JpZ2luYWxGaWxlIGUgZm9yemlhbW8gaWwgQmFzZTY0IGEgbnVsbC5cclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IG51bGw7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuTGFyZ2VGaWxlID0gY3VycmVudEZpbGU7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuSXNMYXJnZUZpbGUgPSB0cnVlO1xyXG4gICAgICBnZXRCYXNlNjQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ2V0QmFzZTY0ID09IHRydWUpIHtcclxuICAgICAgbGV0IGJhc2U2NFJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0QmFzZTY0RnJvbUZpbGUoY3VycmVudEZpbGUpO1xyXG4gICAgICBuZXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gYmFzZTY0UmVzdWx0LkJhc2U2NEZpbGU7XHJcbiAgICAgIGlmICghbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgJiYgYmFzZTY0UmVzdWx0LkNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBiYXNlNjRSZXN1bHQuQ29udGVudFR5cGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdBdHRhY2htZW50LklzSW1hZ2UgJiYgbmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCAmJiBjcm9wRmlsZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q3JvcHBlZEFuZFVwbG9hZChgZGF0YToke2Jhc2U2NFJlc3VsdC5Db250ZW50VHlwZX07YmFzZTY0LCR7YmFzZTY0UmVzdWx0LkJhc2U2NEZpbGV9YCwgbmV3QXR0YWNobWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3QXR0YWNobWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgcGFydGlyZSBkYWwgZmlsZSBwYXNzYXRvIGluIGlucHV0IHJlc3RpdHVpc2NlIHVuIG9nZ2V0dG9cclxuICAgKiBjb250ZW5lbnRlIGlsIGJhc2U2NCBkZWwgZmlsZSBlIGlsIHN1byBjb250ZW50VHlwZVxyXG4gICAqIEBwYXJhbSBjdXJyZW50RmlsZSBPZ2dldHRvIEZpbGUgZGEgY3VpIGVzdHJhcG9sYXJlIGJhc2U2NCBlIGNvbnRlbnRUeXBlXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW4gb2dnZXR0byBhdmVudGUgbGUgcHJvcHJpZXTDoCBCYXNlNjRGaWxlIGUgQ29udGVudFR5cGVcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGdldEJhc2U2NEZyb21GaWxlKGN1cnJlbnRGaWxlOiBGaWxlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGZpbGVTaXplTUIgPSBjdXJyZW50RmlsZS5zaXplIC8gMTAyNCAvIDEwMjQ7XHJcbiAgICBpZiAoZmlsZVNpemVNQiA+IHRoaXMuYmFzZTY0TGltaXRNQikge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIEJhc2U2NEZpbGU6IG51bGwsXHJcbiAgICAgICAgQ29udGVudFR5cGU6IGN1cnJlbnRGaWxlLnR5cGVcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIC8vIFByb2NlZHVyYSBzdGFuZGFyZFxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGJhc2U2NEZpbGUgPSBhd2FpdCB0b0Jhc2U2NChjdXJyZW50RmlsZSk7XHJcbiAgICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gbnVsbDtcclxuICAgICAgaWYgKGJhc2U2NEZpbGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IGJhc2U2NEZpbGUuc3BsaXQoXCIsXCIpWzBdLnNwbGl0KFwiOlwiKVsxXS5zcGxpdChcIjtcIilbMF07XHJcbiAgICAgICAgYmFzZTY0RmlsZSA9IGJhc2U2NEZpbGUuc3BsaXQoXCIsXCIpWzFdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgQmFzZTY0RmlsZTogYmFzZTY0RmlsZSxcclxuICAgICAgICBDb250ZW50VHlwZTogY29udGVudFR5cGVcclxuICAgICAgfTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIHJldHVybiB7IEJhc2U2NEZpbGU6IG51bGwsIENvbnRlbnRUeXBlOiBudWxsIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgaWwgZmlsZSBjaGUgc2kgc3RhIGNhcmljYW5kbyDDqCBzdXBwb3J0YXRvIGRhbCBzaXN0ZW1hLlxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja0FjY2VwdGVkRmlsZXMoKTogYm9vbGVhbiB7XHJcbiAgICAvLyBTZSBhY2NldHRvIHR1dHRvLCBlc2NvIHN1Yml0b1xyXG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPT09IFwiKlwiKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBpc1R5cGVWYWxpZCA9IChtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIGlmICghbWltZVR5cGUpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIC8vIENvbnRyb2xsbyBjb3JyaXNwb25kZW56YSBlc2F0dGEgKGVzLiBpbWFnZS9wbmcpXHJcbiAgICAgIGlmICh0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLmluY2x1ZGVzKG1pbWVUeXBlKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjb25zdCB3aWxkY2FyZHMgPSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLnNwbGl0KFwiLFwiKS5maWx0ZXIodCA9PiB0LmluY2x1ZGVzKFwiKlwiKSk7XHJcbiAgICAgIGZvciAobGV0IHQgb2Ygd2lsZGNhcmRzKSB7XHJcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdC5zcGxpdChcIipcIilbMF07IC8vIFByZW5kZSBcImltYWdlL1wiIGRhIFwiaW1hZ2UvKlwiXHJcbiAgICAgICAgaWYgKG1pbWVUeXBlLnN0YXJ0c1dpdGgocHJlZml4KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT09IHRydWUpIHtcclxuICAgICAgLy8gQ2FzbyBTaW5nb2xvXHJcbiAgICAgIHJldHVybiBpc1R5cGVWYWxpZCh0aGlzLnNlbGVjdGVkRmlsZS50eXBlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENhc28gTXVsdGlwbG86IFRVVFRJIGkgZmlsZSBzZWxlemlvbmF0aSBkZXZvbm8gZXNzZXJlIHZhbGlkaVxyXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkRmlsZXMpLmV2ZXJ5KGZpbGUgPT4gaXNUeXBlVmFsaWQoZmlsZS50eXBlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZSBlcXAtYXR0YWNobWVudHMgw6ggc3RhdGEgY29uZmlndXJhdGEgcGVyIGlsIGNhcmljYW1lbnRvIGRlbGxlIHNvbGUgaW1tYWdpbmkgYWxsb3JhIHZlcmlmaWNhIGNoZSBpbCBmaWxlIHBhc3NhdG8gaW5cclxuICAgKiBpbnB1dCBzaWEgZWZmZXR0aXZhbWVudGUgdW4gaW1tYWdpbmUgbyBuby5cclxuICAgKiBTZSBpbCBjb250cm9sbG8gdmEgYSBidW9uIGZpbmUgcmVzdGl0dWlzY2UgVFJVRSBhbHRyaW1lbnRpIG1vc3RyYSB1biBtZXNzYWdnaW8gZCdlcnJvcmUgZSByZXN0aXR1aXNjZSBGQUxTRVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tBbGxvd09ubHlJbWFnZUZpbGUobmV3QXR0YWNobWVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuYWxsb3dPbmx5SW1hZ2VzID09IHRydWUgJiYgbmV3QXR0YWNobWVudC5Jc0ltYWdlICE9IHRydWUpIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuRXJyb3IodGhpcy5ub0ltYWdlU2VsZWN0ZWRFcnJvck1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLmFib3J0RmlsZSgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmNoZWNrQWNjZXB0ZWRGaWxlcygpKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkVycm9yKHRoaXMud3JvbmdUeXBlU2VsZWN0ZWRFcnJvck1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLmFib3J0RmlsZSgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR2VzdGlvbmUgY3JvcCBmaWxlXHJcblxyXG4gIGdldEltYWdlRGltZW5zaW9ucyhpbWc6IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gKHJzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEhlaWdodCA9IHJzLmN1cnJlbnRUYXJnZXRbXCJoZWlnaHRcIl07XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbFdpZHRoID0gcnMuY3VycmVudFRhcmdldFtcIndpZHRoXCJdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vcmlnaW5hbFdpZHRoID4gMTI4MCkge1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21XaWR0aCA9IDEyODA7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKDEyODAgKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gcnMuY3VycmVudFRhcmdldFtcImhlaWdodFwiXTtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tV2lkdGggPSBycy5jdXJyZW50VGFyZ2V0W1wid2lkdGhcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGltZyk7XHJcbiAgfVxyXG5cclxuICByZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKCkge1xyXG4gICAgdGhpcy5jdXN0b21XaWR0aCA9IHRoaXMub3JpZ2luYWxXaWR0aDtcclxuICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gdGhpcy5vcmlnaW5hbEhlaWdodDtcclxuICAgIHRoaXMuY2FudmFzUm90YXRpb24gPSAwO1xyXG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7fTtcclxuICB9XHJcblxyXG4gIG9uRGltZW5zaW9uc0NoYW5nZShkaW1lbnNpb246IHN0cmluZykge1xyXG4gICAgaWYgKGRpbWVuc2lvbiA9PSBcIkhcIikge1xyXG4gICAgICB0aGlzLmN1c3RvbVdpZHRoID0gTWF0aC5yb3VuZCgodGhpcy5jdXN0b21IZWlnaHQgKiB0aGlzLm9yaWdpbmFsV2lkdGgpIC8gdGhpcy5vcmlnaW5hbEhlaWdodCk7XHJcbiAgICB9IGVsc2UgaWYgKGRpbWVuc2lvbiA9PSBcIldcIikge1xyXG4gICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKHRoaXMuY3VzdG9tV2lkdGggKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbWFnZUNyb3BwZWQoZXZlbnQ6IEltYWdlQ3JvcHBlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IGV2ZW50LmJhc2U2NDtcclxuICAgIHRoaXMuZ2V0Q3JvcHBlZEFuZFVwbG9hZCh0aGlzLmNyb3BwZWRJbWFnZSwgdGhpcy5uZXdBdHRhY2htZW50KTtcclxuICB9XHJcblxyXG4gIGdldENyb3BwZWRBbmRVcGxvYWQoZmlsZSwgbmV3QXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICB2YXIgZmlsZTogYW55ID0gYmFzZTY0VG9GaWxlKGZpbGUpO1xyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbXByZXNzaW9uT3B0aW9ucztcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXByaW1lIGwnaW1tYWdpbmUgcGFzc2FuZG8gY29tZSBwYXJhbWV0cmkgbGUgb3B0aW9ucyBjcmVhdGUgbmVsbCdvZ2dldHRvIHNvcHJhLCBlIGlsIGZpbGUgZGFsIHJlYWRlciBwcmluY2lwYWxlXHJcbiAgICAgKi9cclxuICAgIGltYWdlQ29tcHJlc3Npb24oZmlsZSwgb3B0aW9ucykudGhlbigoZmlsZUNvbXByZXNzZWQpID0+IHtcclxuICAgICAgbGV0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgLy9GYWNjaW8gbGEgcHVzaCBkaSBvZ25pIGZpbGUgYWxsJ2ludGVybm8gZGVsbCdhcnJheSBkaSBmaWxlIGRlbGwnaXRlbSBkYSBtYW5kYXJlIGFsIHNlcnZlclxyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcmVzdWx0UmVhZGVyID0gPHN0cmluZz5maWxlUmVhZGVyLnJlc3VsdDtcclxuICAgICAgICB2YXIgbWFya2VyID0gXCI7YmFzZTY0LFwiO1xyXG4gICAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSByZXN1bHRSZWFkZXIuc3Vic3RyaW5nKHJlc3VsdFJlYWRlci5pbmRleE9mKG1hcmtlcikgKyBtYXJrZXIubGVuZ3RoKTtcclxuICAgICAgICBzZWxmLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc2VsZi5uZXdBdHRhY2htZW50Rm9ybSkge1xyXG4gICAgICAgICAgc2VsZi5uZXdBdHRhY2htZW50Rm9ybS5lbmFibGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZUNvbXByZXNzZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByb3RhdGVMZWZ0KCkge1xyXG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbi0tO1xyXG4gICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZVJpZ2h0KCkge1xyXG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbisrO1xyXG4gICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmxpcEFmdGVyUm90YXRlKCkge1xyXG4gICAgY29uc3QgZmxpcHBlZEggPSB0aGlzLnRyYW5zZm9ybS5mbGlwSDtcclxuICAgIGNvbnN0IGZsaXBwZWRWID0gdGhpcy50cmFuc2Zvcm0uZmxpcFY7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBIOiBmbGlwcGVkVixcclxuICAgICAgZmxpcFY6IGZsaXBwZWRIXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZmxpcEhvcml6b250YWwoKSB7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBIOiAhdGhpcy50cmFuc2Zvcm0uZmxpcEhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBmbGlwVmVydGljYWwoKSB7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBWOiAhdGhpcy50cmFuc2Zvcm0uZmxpcFZcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogQW5udWxsYSBsYSBzZWxlemlvbmUgZGVsIGZpbGUsIHN2dW90YW5kbyBsJ2lucHV0IGUgcmVzZXR0YW5kbyB0dXR0ZSBsZSBwcm9wcmlldMOgIGRlbGwnSUF0dGFjaG1lbnREVE9cclxuICAgKi9cclxuICBhYm9ydEZpbGUoKSB7XHJcbiAgICBpZiAodGhpcy5pbWFnZUlucHV0KSB0aGlzLmltYWdlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlID0gZmFsc2U7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBudWxsO1xyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICB0aGlzLmN1c3RvbUhlaWdodCA9IG51bGw7XHJcbiAgICB0aGlzLmN1c3RvbVdpZHRoID0gbnVsbDtcclxuICAgIHRoaXMub3JpZ2luYWxIZWlnaHQgPSBudWxsO1xyXG4gICAgdGhpcy5vcmlnaW5hbFdpZHRoID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZkNyb3BJbWFnZS5jbG9zZSgpO1xyXG4gICAgdGhpcy5yZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKCk7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgZmlsZURyb3BwZWQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZHJhZ092ZXIgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XHJcblxyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5vbkZpbGVBZGRlZCh7IHRhcmdldDogeyBmaWxlczogZmlsZXMgfSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFNlIGlsIGNhcmljYW1lbnRvIGRlbCBmaWxlIGRyb3Bib3ggdmEgYSBidW9uIGZpbmUsIGxhIGZ1bnppb25lIGRpIGNhbGxiYWNrIHJlc3RpdHVpc2NlIHVuIGFycmF5IGRpIG9nZ2V0dGkuXHJcbiAgLy8gVmllbmUgcG9pIGZhdHRhIHVuYSBYTUxIdHRwUmVxdWVzdCBjb24gcmVzcG9uc2VUeXBlICdibG9iJyBwZXIgY29udmVydGlyZSBpbCBwcmltbyBlbGVtZW50byBkZWxsYSByZXNwb25zZSBpbiB1biBCbG9iLlxyXG4gIGNob29zZURyb3Bib3hGaWxlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgIHN1Y2Nlc3M6IChmaWxlczogYW55W10pID0+IHtcclxuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBmaWxlc1swXS5saW5rKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke0F0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmRyb3Bib3hDcmVkZW50aWFscy5hY2Nlc3NUb2tlbn1gKTtcclxuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XHJcblxyXG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBibG9iID0geGhyLnJlc3BvbnNlO1xyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZXNbMF0ubmFtZSwgeyB0eXBlOiBibG9iLnR5cGUgfSk7XHJcbiAgICAgICAgICBsZXQgZmlsZXNBZGRlZCA9IFtmaWxlXTtcclxuICAgICAgICAgIHRoaXMub25GaWxlQWRkZWQoZmlsZXNBZGRlZCwgdHJ1ZSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgeGhyLnNlbmQoKTtcclxuICAgICAgfSxcclxuICAgICAgbGlua1R5cGU6IFwiZGlyZWN0XCIsXHJcbiAgICAgIG11bHRpc2VsZWN0OiBmYWxzZSxcclxuICAgICAgZXh0ZW5zaW9uczogW1wiLmpwZ1wiLCBcIi5wbmdcIiwgXCIucGRmXCIsIFwiLmRvY1wiLCBcIi5kb2N4XCIsIFwiLnR4dFwiXVxyXG4gICAgfTtcclxuICAgIERyb3Bib3guY2hvb3NlKG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy8gV29ya2Fyb3VuZCBkcm9wem9uZTogZGlzYWJpbGl0byBpbCBjbGljayBkZWdsaSBlbGVtZW50aSBpbmNsdXNpIG5lbGxhIGRyb3B6b25lIHBlciBldml0YXJlIGRpIGNsaWNjYXJlIGR1ZSB2b2x0ZVxyXG4gIG9uU2VsZWN0RmlsZShldmVudCwgZmlsZUlucHV0KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLnRhZ05hbWUgPT09IFwiQlVUVE9OXCIgfHxcclxuICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudCkudGFnTmFtZSA9PT0gXCJJTlBVVFwiIHx8XHJcbiAgICAgIHRoaXMuYWRkaW5nTGlua01vZGUgPT0gdHJ1ZVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGZpbGVJbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXByZSBpbCBkaWFsb2dvIHBlciBsJ2luc2VyaW1lbnRvIGRlbCBsaW5rLlxyXG4gICAqL1xyXG4gIHN3aXRjaFRvQWRkaW5nTGlua01vZGUoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZmlsZU5hbWU6IFsnJ10sXHJcbiAgICAgIGZpbGVQYXRoOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oJ2h0dHBzPzovLy4rJyldXVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3Blbih0aGlzLmFkZGluZ0xpbmtUZW1wbGF0ZSwge1xyXG4gICAgICB3aWR0aDogJzUwMHB4JyxcclxuICAgICAgcGFuZWxDbGFzczogJ2VxcC1hdHRhY2htZW50cy1kaWFsb2cnXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIC8vIENyZWEgbCdvZ2dldHRvIHBlciBpbCBudW92byBsaW5rIGRhaSBkYXRpIGRlbCBmb3JtXHJcbiAgICAgICAgY29uc3QgbmV3TGlua09iamVjdDogSUF0dGFjaG1lbnREVE8gPSB7XHJcbiAgICAgICAgICBJRDogMCxcclxuICAgICAgICAgIEF0dGFjaG1lbnRUeXBlOiBBdHRhY2htZW50VHlwZS5MSU5LLFxyXG4gICAgICAgICAgRmlsZU5hbWU6IHJlc3VsdC5maWxlTmFtZSxcclxuICAgICAgICAgIEZpbGVQYXRoOiByZXN1bHQuZmlsZVBhdGgsXHJcbiAgICAgICAgICBJc0ltYWdlOiBmYWxzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IG5ld0xpbmtPYmplY3Q7XHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gW25ld0xpbmtPYmplY3RdO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5jb25maXJtQWRkQXR0YWNobWVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8gTWV0b2RvIHBlciBvdHRlbmVyZSBsZSBjbGFzc2kgQ1NTIGRpbmFtaWNoZVxyXG4gIGdldENhcmRDbGFzcyhhdHQ6IElBdHRhY2htZW50RFRPKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2ZpbGUtcHJldmlldyc6IHRydWUsXHJcbiAgICAgICd1cGxvYWRpbmcnOiAhIWF0dC5pc1VwbG9hZGluZyxcclxuICAgICAgJ2NhcmQtc21hbGwnOiB0aGlzLmNhcmRTaXplID09PSAnc21hbGwnLFxyXG4gICAgICAnY2FyZC1tZWRpdW0nOiB0aGlzLmNhcmRTaXplID09PSAnbWVkaXVtJyxcclxuICAgICAgJ2NhcmQtbGFyZ2UnOiB0aGlzLmNhcmRTaXplID09PSAnbGFyZ2UnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIFF1ZXN0YSBmdW56aW9uZSBvcmEgc2kgYXBwbGljYSBhbCBjb250ZW5pdG9yZSwgbm9uIGFsbGEgc2luZ29sYSBjYXJkLlxyXG4gIGdldFByZXZpZXdzQ29udGFpbmVyU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBsZXQgbWluV2lkdGggPSAnMjAwcHgnOyAvLyBEaW1lbnNpb25lIGRpIGRlZmF1bHQgcGVyICdtZWRpdW0nXHJcblxyXG4gICAgaWYgKHRoaXMuY2FyZFNpemUgPT09ICdzbWFsbCcpIHtcclxuICAgICAgbWluV2lkdGggPSAnMTQwcHgnO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhcmRTaXplID09PSAnbGFyZ2UnKSB7XHJcbiAgICAgIG1pbldpZHRoID0gJzI4MHB4JztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkU2l6ZSA9PT0gJ2N1c3RvbScpIHtcclxuICAgICAgbWluV2lkdGggPSBgJHt0aGlzLmN1c3RvbUNhcmRXaWR0aFB4fXB4YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyAnLS1jYXJkLW1pbi13aWR0aCc6IG1pbldpZHRoIH07XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQcmltYXJ5QWN0aW9uKGF0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPKTogdm9pZCB7XHJcbiAgICAvLyBTZSBpbCBmaWxlIHB1w7IgZXNzZXJlIHZpc3VhbGl6emF0byBpbiBhbnRlcHJpbWEsIGFwcmkgaWwgZGlhbG9nXHJcbiAgICBpZiAodGhpcy5jYW5CZVByZXZpZXdlZChhdHRhY2htZW50KSkge1xyXG4gICAgICB0aGlzLm9wZW5QcmV2aWV3RGlhbG9nKGF0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG4gICAgLy8gQWx0cmltZW50aSwgZXNlZ3VpIGwnYXppb25lIGRpIGRlZmF1bHQgKGRvd25sb2FkIHBlciBmaWxlLCBhcHJpIHBlciBsaW5rKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudmlld0F0dGFjaG1lbnQoYXR0YWNobWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogRGV0ZXJtaW5lcyBpZiBhbiBhdHRhY2htZW50IGNhbiBiZSBwcmV2aWV3ZWQgaW4gdGhlIGRpYWxvZy5cclxuICogQHBhcmFtIGF0dCBUaGUgYXR0YWNobWVudCB0byBjaGVjay5cclxuICogQHJldHVybnMgYHRydWVgIGlmIGEgcHJldmlldyBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxuICBjYW5CZVByZXZpZXdlZChhdHQ6IElBdHRhY2htZW50RFRPKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWF0dCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FzZSAxOiBJdCdzIGFuIGltYWdlIHdpdGggQmFzZTY0IGRhdGEuXHJcbiAgICBjb25zdCBpc1ByZXZpZXdhYmxlSW1hZ2UgPSBhdHQuSXNJbWFnZSAmJiAhIWF0dC5GaWxlRGF0YUJhc2U2NDtcclxuXHJcbiAgICAvLyBDYXNlIDI6IEl0J3MgYSBQREYgd2l0aCBCYXNlNjQgZGF0YS5cclxuICAgIGNvbnN0IGlzUHJldmlld2FibGVQZGYgPSBhdHQuRmlsZUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyAmJiAhIWF0dC5GaWxlRGF0YUJhc2U2NDtcclxuXHJcbiAgICAvLyBDYXNlIDM6IEl0J3MgYSByZW1vdGUgZG9jdW1lbnQgd2l0aCBhIFVSTCAoZm9yIEdvb2dsZSBWaWV3ZXIpLlxyXG4gICAgY29uc3QgaXNSZW1vdGVEb2N1bWVudCA9ICFhdHQuSXNJbWFnZSAmJiAhIWF0dC5GaWxlUGF0aCAmJiAhIXRoaXMucHJvZHVjdGlvbkJhc2VVcmw7XHJcblxyXG4gICAgLy9DYXNlIDQ6IFZpZGVvIC0gw4ggdW4gdmlkZW8gZSBhYmJpYW1vIGlsIGZpbGUgYmluYXJpbyBzYWx2YXRvIGluIExhcmdlRmlsZVxyXG4gICAgY29uc3QgaXNQcmV2aWV3YWJsZVZpZGVvID0gYXR0LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndmlkZW8vJykgJiYgISFhdHQuTGFyZ2VGaWxlO1xyXG5cclxuICAgIC8vIEEgcHJldmlldyBpcyBwb3NzaWJsZSBpZiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUgdHJ1ZS5cclxuICAgIHJldHVybiBpc1ByZXZpZXdhYmxlSW1hZ2UgfHwgaXNQcmV2aWV3YWJsZVBkZiB8fCBpc1JlbW90ZURvY3VtZW50IHx8IGlzUHJldmlld2FibGVWaWRlbztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNDb2x1bW5IaWRkZW4oY29sOiBBdHRhY2htZW50RmllbGRDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIC8vIDEpIGhpZGRlbkNvbHVtbnNcclxuICAgIGlmICh0aGlzLmhpZGRlbkNvbHVtbnM/LmluY2x1ZGVzKGNvbC5rZXkpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyAyKSBoaWRkZW4gZGVmaW5pdG8gc3VsbGEgY29sb25uYSAoYm9vbGVhbiBvIGZ1bnppb25lIHNlbnphIGFyZ3MpXHJcbiAgICBpZiAodHlwZW9mIGNvbC5oaWRkZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiAhIWNvbC5oaWRkZW4oKTtcclxuICAgIHJldHVybiAhIWNvbC5oaWRkZW47XHJcbiAgfVxyXG5cclxuICBpc0FjdGlvbkhpZGRlbihhY3Rpb246IEF0dGFjaG1lbnRNZW51QWN0aW9uLCBhdHQ/OiBJQXR0YWNobWVudERUTyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaGlkZGVuQWN0aW9ucz8uaW5jbHVkZXMoYWN0aW9uLmtleSkpIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24uaGlkZGVuID09PSAnZnVuY3Rpb24nKSByZXR1cm4gISFhY3Rpb24uaGlkZGVuKGF0dCk7XHJcbiAgICByZXR1cm4gISFhY3Rpb24uaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5pc2NlIGxlIGNvbG9ubmUgZGkgZGVmYXVsdCBjb24gcXVlbGxlIGN1c3RvbSBlIGxlIG9yZGluYS5cclxuICAgKi9cclxuICBwcml2YXRlIHNldHVwVGFibGVDb2x1bW5zKCk6IHZvaWQge1xyXG4gICAgLy8gRGVmaW5pYW1vIGxlIGNvbG9ubmUgc3RhbmRhcmQgY29uIHVuYSBwb3NpemlvbmVcclxuICAgIGNvbnN0IGRlZmF1bHRGaWxlQ29sdW1uOiBBdHRhY2htZW50RmllbGRDb2x1bW4gPSB7XHJcbiAgICAgIGtleTogJ2ZpbGUnLFxyXG4gICAgICBkaXNwbGF5OiAnRmlsZScsXHJcbiAgICAgIHR5cGU6IFR5cGVBdHRhY2htZW50Q29sdW1uLlRFTVBMQVRFLFxyXG4gICAgICBleHRlcm5hbFRlbXBsYXRlOiB0aGlzLmRlZmF1bHRGaWxlVGVtcGxhdGUsXHJcbiAgICAgIHN0eWxlczogeyBmbGV4OiAnMSAxIDAlJyB9LFxyXG4gICAgICBwb3NpdGlvbjogMTBcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbnNDb2x1bW46IEF0dGFjaG1lbnRGaWVsZENvbHVtbiA9IHtcclxuICAgICAga2V5OiAnYWN0aW9ucycsXHJcbiAgICAgIGRpc3BsYXk6ICdBemlvbmknLFxyXG4gICAgICB0eXBlOiBUeXBlQXR0YWNobWVudENvbHVtbi5URU1QTEFURSxcclxuICAgICAgZXh0ZXJuYWxUZW1wbGF0ZTogdGhpcy5kZWZhdWx0QWN0aW9uc1RlbXBsYXRlLFxyXG4gICAgICBwb3NpdGlvbjogMTAwLFxyXG4gICAgICBjbGFzczogJ2NvbC1hY3Rpb25zJyxcclxuICAgICAgc3R5bGVzOiB7IGZsZXg6ICcwIDAgMTUwcHgnIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgcHJvY2Vzc2VkQ3VzdG9tQ29sdW1ucyA9IHRoaXMuX2N1c3RvbUNvbHVtbnMubWFwKGNvbCA9PiB7XHJcbiAgICAgIC8vIEZsZXggZGkgZGVmYXVsdFxyXG4gICAgICBpZiAoIWNvbC5zdHlsZXMgfHwgIWNvbC5zdHlsZXMuZmxleCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICBzdHlsZXM6IHsgLi4uY29sLnN0eWxlcywgZmxleDogJzEgMSAwJScgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbDtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBbXHJcbiAgICAgIGRlZmF1bHRGaWxlQ29sdW1uLFxyXG4gICAgICBkZWZhdWx0QWN0aW9uc0NvbHVtbixcclxuICAgICAgLi4ucHJvY2Vzc2VkQ3VzdG9tQ29sdW1uc1xyXG4gICAgXTtcclxuXHJcbiAgICAvLyBPcmRpbmlhbW8gbCdhcnJheSBmaW5hbGUgaW4gYmFzZSBhbGxhIHByb3ByaWV0w6AgJ3Bvc2l0aW9uJ1xyXG4gICAgdGhpcy5fdGFibGVDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoY29sID0+ICF0aGlzLmlzQ29sdW1uSGlkZGVuKGNvbCkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcG9zQSA9IGEucG9zaXRpb24gfHwgOTk7XHJcbiAgICAgICAgY29uc3QgcG9zQiA9IGIucG9zaXRpb24gfHwgOTk7XHJcbiAgICAgICAgcmV0dXJuIHBvc0EgLSBwb3NCO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBNZW51QWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRlZmF1bHRQcmV2aWV3QWN0aW9uOiBBdHRhY2htZW50TWVudUFjdGlvbiA9IHtcclxuICAgICAga2V5OiAncHJldmlldycsXHJcbiAgICAgIGljb246ICd2aXNpYmlsaXR5JyxcclxuICAgICAgbmFtZTogJ0FudGVwcmltYScsXHJcbiAgICAgIGZuOiAoYXR0KSA9PiB0aGlzLm9wZW5QcmV2aWV3RGlhbG9nKGF0dCksXHJcbiAgICAgIGRpc2FibGVkOiAoYXR0KSA9PiAhdGhpcy5jYW5CZVByZXZpZXdlZChhdHQpLFxyXG4gICAgICBwb3NpdGlvbjogMTBcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdERlbGV0ZUFjdGlvbjogQXR0YWNobWVudE1lbnVBY3Rpb24gPSB7XHJcbiAgICAgIGtleTogJ2RlbGV0ZScsXHJcbiAgICAgIGljb246ICdkZWxldGUnLFxyXG4gICAgICBuYW1lOiAnRWxpbWluYScsXHJcbiAgICAgIGZuOiAoYXR0KSA9PiB0aGlzLmRlbGV0ZUF0dGFjaG1lbnQoYXR0KSxcclxuICAgICAgZGlzYWJsZWQ6ICgpID0+IHRoaXMuZGlzYWJsZUFjdGlvbixcclxuICAgICAgcG9zaXRpb246IDEwMFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhbGxBY3Rpb25zID0gW1xyXG4gICAgICBkZWZhdWx0UHJldmlld0FjdGlvbixcclxuICAgICAgZGVmYXVsdERlbGV0ZUFjdGlvbixcclxuICAgICAgLi4udGhpcy5fY3VzdG9tTWVudUFjdGlvbnNcclxuICAgIF07XHJcblxyXG4gICAgLy8gT3JkaW5pYW1vIGwnYXJyYXkgZmluYWxlIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgICdwb3NpdGlvbidcclxuICAgIHRoaXMuX3NvcnRlZE1lbnVBY3Rpb25zID0gYWxsQWN0aW9ucy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBvc0EgPSBhLnBvc2l0aW9uIHx8IDk5O1xyXG4gICAgICBjb25zdCBwb3NCID0gYi5wb3NpdGlvbiB8fCA5OTtcclxuICAgICAgcmV0dXJuIHBvc0EgLSBwb3NCO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlVmlkZW9UaHVtYm5haWwoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XHJcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgICAvLyBDcmVhIHVuIFVSTCB0ZW1wb3JhbmVvIHBlciBpbCBmaWxlIHZpZGVvXHJcbiAgICAgIGNvbnN0IHZpZGVvVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgICAgdmlkZW8uc3JjID0gdmlkZW9Vcmw7XHJcbiAgICAgIHZpZGVvLnByZWxvYWQgPSAnbWV0YWRhdGEnO1xyXG4gICAgICB2aWRlby5tdXRlZCA9IHRydWU7XHJcbiAgICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcclxuXHJcbiAgICAgIHZpZGVvLm9ubG9hZGVkbWV0YWRhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gVmFpIGFsIHNlY29uZG8gMSAocGVyIGV2aXRhcmUgaWwgZm90b2dyYW1tYSBuZXJvIGluaXppYWxlKVxyXG4gICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHZpZGVvLm9uc2Vla2VkID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIEltcG9zdGEgbGUgZGltZW5zaW9uaSBkZWwgY2FudmFzIHVndWFsaSBhbCB2aWRlb1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHZpZGVvLnZpZGVvV2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBEaXNlZ25hIGlsIGZvdG9ncmFtbWEgc3VsIGNhbnZhc1xyXG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKHZpZGVvLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG5cclxuICAgICAgICAvLyBFc3RyYWkgaWwgQmFzZTY0IChxdWFsaXTDoCAwLjcgcGVyIHJpc3Bhcm1pYXJlIHNwYXppbylcclxuICAgICAgICBjb25zdCB0aHVtYm5haWwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgMC43KTtcclxuXHJcbiAgICAgICAgLy8gUHVsaXNjaSBsYSBtZW1vcmlhXHJcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh2aWRlb1VybCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0aHVtYm5haWwuc3BsaXQoJywnKVsxXSk7IC8vIFJlc3RpdHVpYW1vIHNvbG8gbGEgcGFydGUgQmFzZTY0XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB2aWRlby5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodmlkZW9VcmwpO1xyXG4gICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXByZXNzVmlkZW9OYXRpdmUoZmlsZTogRmlsZSwgY29uZmlnOiBhbnkpOiBQcm9taXNlPEJsb2I+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcclxuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICBjb25zdCB2aWRlb1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcblxyXG4gICAgICB2aWRlby5zcmMgPSB2aWRlb1VybDtcclxuICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xyXG4gICAgICB2aWRlby5wbGF5KCk7XHJcblxyXG4gICAgICB2aWRlby5vbmxvYWRlZGRhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gQ2FsY29saWFtbyBsZSBudW92ZSBkaW1lbnNpb25pIG1hbnRlbmVuZG8gbCdhc3BlY3QgcmF0aW9cclxuICAgICAgICBsZXQgd2lkdGggPSB2aWRlby52aWRlb1dpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSB2aWRlby52aWRlb0hlaWdodDtcclxuICAgICAgICBpZiAod2lkdGggPiBjb25maWcubWF4V2lkdGgpIHtcclxuICAgICAgICAgIGhlaWdodCA9IE1hdGgucm91bmQoKGNvbmZpZy5tYXhXaWR0aCAqIGhlaWdodCkgLyB3aWR0aCk7XHJcbiAgICAgICAgICB3aWR0aCA9IGNvbmZpZy5tYXhXaWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIENhdHR1cmlhbW8gbG8gc3RyZWFtIGRhbCBjYW52YXMgYSAzMGZwc1xyXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGNhbnZhcy5jYXB0dXJlU3RyZWFtKDMwKTtcclxuICAgICAgICBjb25zdCByZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKHN0cmVhbSwge1xyXG4gICAgICAgICAgbWltZVR5cGU6ICd2aWRlby93ZWJtO2NvZGVjcz12cDgnLCAvLyBGb3JtYXRvIHdlYiBvdHRpbWl6emF0b1xyXG4gICAgICAgICAgdmlkZW9CaXRzUGVyU2Vjb25kOiBjb25maWcuYml0cmF0ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBjaHVua3M6IEJsb2JbXSA9IFtdO1xyXG4gICAgICAgIHJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChlKSA9PiBjaHVua3MucHVzaChlLmRhdGEpO1xyXG4gICAgICAgIHJlY29yZGVyLm9uc3RvcCA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRCbG9iID0gbmV3IEJsb2IoY2h1bmtzLCB7IHR5cGU6ICd2aWRlby93ZWJtJyB9KTtcclxuICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodmlkZW9VcmwpO1xyXG4gICAgICAgICAgcmVzb2x2ZShjb21wcmVzc2VkQmxvYik7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmVjb3JkZXIuc3RhcnQoKTtcclxuXHJcbiAgICAgICAgLy8gRnVuemlvbmUgY2hlIGRpc2VnbmEgb2duaSBmcmFtZSBzdWwgY2FudmFzXHJcbiAgICAgICAgY29uc3QgZHJhd0ZyYW1lID0gKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHZpZGVvLnBhdXNlZCB8fCB2aWRlby5lbmRlZCkge1xyXG4gICAgICAgICAgICByZWNvcmRlci5zdG9wKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UodmlkZW8sIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXdGcmFtZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBkcmF3RnJhbWUoKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHZpZGVvLm9uZXJyb3IgPSByZWplY3Q7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPCEtLSBTZSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgc2luZ29sYSBtb3N0cmEgaWwgcHVsc2FudGUgZGkgY2FyaWNhbWVudG8gZGkgdW4gc2luZ29sbyBmaWxlIC0tPlxyXG48ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgQGlmKHNob3dVcGxvYWRUaXRsZSA9PSB0cnVlKXtcclxuICA8aDQ+e3sgdXBsb2FkVGl0bGUgfX08L2g0PlxyXG4gIH1cclxuICBAaWYoY2hvb3NlVmlldyA9PSB0cnVlKXtcclxuICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgW3ZhbHVlXT1cInZpZXdNb2RlXCIgKGNoYW5nZSk9XCJzZXRWaWV3TW9kZSgkZXZlbnQudmFsdWUpXCJcclxuICAgIGFyaWEtbGFiZWw9XCJNb2RhbGl0w6AgZGkgdmlzdWFsaXp6YXppb25lXCI+XHJcbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJjYXJkXCI+PG1hdC1pY29uPmdyaWRfdmlldzwvbWF0LWljb24+PC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cInRhYmxlXCI+PG1hdC1pY29uPnZpZXdfbGlzdDwvbWF0LWljb24+PC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxyXG4gIH1cclxuPC9kaXY+XHJcblxyXG48IS0tIEdlc3Rpb25lIHNpbmdvbG8gLS0+XHJcbkBpZiAobXVsdGlwbGVBdHRhY2htZW50ICE9IHRydWUpIHtcclxuQGlmICghc2luZ2xlQXR0YWNobWVudERyYWdBbmREcm9wKSB7XHJcbkBpZiAoIWFkZGluZ0xpbmtNb2RlKSB7XHJcbjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkQXR0YWNobWVudEJ1dHRvblwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxufSBAZWxzZSB7XHJcbjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaW5nTGlua1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG59XHJcbn0gQGVsc2Uge1xyXG48aW5wdXQgI2ZpbGVJbnB1dCBpZD1cImZpbGVfYXR0YWNobWVudFwiIG5hbWU9XCJmaWxlX2F0dGFjaG1lbnRcIiB0eXBlPVwiZmlsZVwiIGhpZGRlbiAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIlxyXG4gIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIiBbbXVsdGlwbGVdPVwibG9hZE11bHRpcGxlRmlsZXNcIiAvPlxyXG5cclxuQGlmIChhbGxvd2VkVHlwZXMgJiYgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDEpICYmICghYXR0YWNobWVudHNMaXN0IHx8IGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fFxyXG4oYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcblxyXG5AaWYgKHNob3dEcm9wQXJlYSA9PSB0cnVlKSB7XHJcbjwhLS0gRlVMTCAtLT5cclxuQGlmIChsYXlvdXQgPT09ICdmdWxsJykge1xyXG5cclxuPGRpdiBjbGFzcz1cImRyb3Bib3hcIiBbY2xhc3MuZHJhZ292ZXJdPVwiZHJhZ092ZXJcIiAoZHJhZ292ZXIpPVwiZHJhZ092ZXIgPSB0cnVlOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXHJcbiAgKGRyYWdsZWF2ZSk9XCJkcmFnT3ZlciA9IGZhbHNlXCIgKGRyb3ApPVwiZHJhZ092ZXIgPSBmYWxzZTsgZmlsZURyb3BwZWQoJGV2ZW50KVwiXHJcbiAgKGNsaWNrKT1cIm9uU2VsZWN0RmlsZSgkZXZlbnQsIGZpbGVJbnB1dClcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCIgKGtleWRvd24uZW50ZXIpPVwiZmlsZUlucHV0LmNsaWNrKClcIlxyXG4gIChrZXlkb3duLnNwYWNlKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bib3gtaWNvblwiPvCfk4E8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGJveC10ZXh0XCI+e3sgZHJvcEhlcmVMYWJlbCB9fTwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wYm94LXN1YnRleHRcIj5cclxuICAgIHt7IHN1cHBvcnRlZEZvcm1hdHNMYWJlbCB9fVxyXG4gIDwvZGl2PlxyXG4gIDxidXR0b24gY2xhc3M9XCJicm93c2UtYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgICB7eyBicm93c2VGaWxlc0xhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgPGRpdiBjbGFzcz1cInNlY29uZGFyeS1hY3Rpb25cIj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikgJiYgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7XHJcbiAgICA8YSBjbGFzcz1cInNlY29uZGFyeS1hY3Rpb24tbGlua1wiIFttYXRNZW51VHJpZ2dlckZvcl09XCJpc0Rpc2FibGVkID8gbnVsbCA6IGxpbmtNZW51XCJcclxuICAgICAgW2NsYXNzLmRpc2FibGVkLWxpbmtdPVwiaXNEaXNhYmxlZFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgbyBhZ2dpdW5naSBkYSB3ZWJcclxuICAgIDwvYT5cclxuICAgIDxtYXQtbWVudSAjbGlua01lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic3dpdGNoVG9BZGRpbmdMaW5rTW9kZSgpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmxpbms8L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuPkFnZ2l1bmdpIGRhIGxpbms8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+Y2xvdWRfcXVldWU8L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuPkNhcmljYSBkYSBEcm9wYm94PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbWF0LW1lbnU+XHJcbiAgICB9XHJcblxyXG4gICAgQGVsc2UgaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkge1xyXG4gICAgPGEgW2NsYXNzLmRpc2FibGVkLWxpbmtdPVwiaXNEaXNhYmxlZFwiIGNsYXNzPVwic2Vjb25kYXJ5LWFjdGlvbi1saW5rXCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgc3dpdGNoVG9BZGRpbmdMaW5rTW9kZSgpXCI+XHJcbiAgICAgIGFnZ2l1bmdpIHVuIGxpbmtcclxuICAgIDwvYT5cclxuICAgIH1cclxuXHJcbiAgICBAZWxzZSBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7XHJcbiAgICA8YSBbY2xhc3MuZGlzYWJsZWQtbGlua109XCJpc0Rpc2FibGVkXCIgY2xhc3M9XCJzZWNvbmRhcnktYWN0aW9uLWxpbmtcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBjaG9vc2VEcm9wYm94RmlsZSgpXCI+XHJcbiAgICAgIGNhcmljYSBkYSBEcm9wYm94XHJcbiAgICA8L2E+XHJcbiAgICB9XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG59QGVsc2Uge1xyXG48ZGl2IGNsYXNzPVwiY29tcGFjdC11cGxvYWRlclwiIFtjbGFzcy5kcmFnb3Zlcl09XCJkcmFnT3ZlclwiIChkcmFnb3Zlcik9XCJkcmFnT3ZlciA9IHRydWU7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcclxuICAoZHJhZ2xlYXZlKT1cImRyYWdPdmVyID0gZmFsc2VcIiAoZHJvcCk9XCJkcmFnT3ZlciA9IGZhbHNlOyBmaWxlRHJvcHBlZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtaWNvblwiPjxtYXQtaWNvbj5mb2xkZXJfb3BlbjwvbWF0LWljb24+PC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtdGV4dFwiIChjbGljayk9XCJvblNlbGVjdEZpbGUoJGV2ZW50LCBmaWxlSW5wdXQpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGFjdC10aXRsZVwiPlRyYXNjaW5hIGkgZmlsZSBvIHNlbGV6aW9uYSBkYWwgY29tcHV0ZXI8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb21wYWN0LXN1YnRpdGxlXCI+e3sgc3VwcG9ydGVkRm9ybWF0c0xhYmVsIH19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtYWN0aW9uc1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmaWxlSW5wdXQuY2xpY2soKVwiPlNmb2dsaWE8L2J1dHRvbj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29tcGFjdExpbmtNZW51XCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPkxpbms8L2J1dHRvbj5cclxuICAgIDxtYXQtbWVudSAjY29tcGFjdExpbmtNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkgeyA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIj57eyBvcGVuTGlua0xhYmVsIH19PC9idXR0b24+IH1cclxuICAgICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHsgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIj57e1xyXG4gICAgICAgIHVwbG9hZFdpdGhEcm9wYm94TGFiZWwgfX08L2J1dHRvbj4gfVxyXG4gICAgPC9tYXQtbWVudT5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1cclxufVxyXG59XHJcbn1cclxuXHJcbjwhLS0gQXppb25pIHNpbmdvbG8gZWxlbWVudG8gKGNvbWUgcHJpbWEpIC0tPlxyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICBAaWYgKGF0dGFjaG1lbnRzTGlzdCAmJiBhdHRhY2htZW50c0xpc3QubGVuZ3RoID4gMCAmJiBhdHRhY2htZW50c0xpc3RbMF0pIHtcclxuICA8YnV0dG9uIGNsYXNzPVwibWItMiBtZS0yIGVxcC1hdHRhY2htZW50cy1kb3dubG9hZC1idG5cIiAoY2xpY2spPVwidmlld0F0dGFjaG1lbnQoYXR0YWNobWVudHNMaXN0WzBdKVwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICBAaWYgKGF0dGFjaG1lbnRzTGlzdFswXS5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFKSB7XHJcbiAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPlxyXG4gICAgfSBAZWxzZSB7XHJcbiAgICA8bWF0LWljb24+b3Blbl9pbl9uZXc8L21hdC1pY29uPlxyXG4gICAgfVxyXG4gICAge3sgYXR0YWNobWVudHNMaXN0WzBdLkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUgPyBkb3dubG9hZExhYmVsIDogb3BlbkxpbmtMYWJlbCB9fVxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICBAaWYgKHNob3dQcmV2aWV3ICYmICghYXR0YWNobWVudHNMaXN0WzBdLkZpbGVDb250ZW50VHlwZSB8fCAoIWF0dGFjaG1lbnRzTGlzdFswXS5GaWxlQ29udGVudFR5cGUuc3RhcnRzV2l0aCgndmlkZW8nKVxyXG4gICYmICFhdHRhY2htZW50c0xpc3RbMF0uRmlsZUNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ2F1ZGlvJykpKSAmJiBhdHRhY2htZW50c0xpc3RbMF0uSXNJbWFnZSA9PSB0cnVlKSB7XHJcbiAgPGJ1dHRvbiBjbGFzcz1cIm1iLTIgbWUtMiBlcXAtYXR0YWNobWVudHMtcHJldmlldy1idG5cIiAoY2xpY2spPVwib3BlblByZXZpZXdEaWFsb2coYXR0YWNobWVudHNMaXN0WzBdKVwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICA8bWF0LWljb24+dmlzaWJpbGl0eTwvbWF0LWljb24+IHt7IHByZXZpZXdMYWJlbCB9fVxyXG4gIDwvYnV0dG9uPlxyXG4gIH1cclxuXHJcbiAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZUFjdGlvblwiIGNsYXNzPVwibWItMiBlcXAtYXR0YWNobWVudHMtZGVsZXRlLWJ0blwiXHJcbiAgICAoY2xpY2spPVwiZGVsZXRlQXR0YWNobWVudChhdHRhY2htZW50c0xpc3RbMF0pXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCI+XHJcbiAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj4ge3sgZGVsZXRlTGFiZWwgfX1cclxuICA8L2J1dHRvbj5cclxuICB9XHJcbjwvZGl2PlxyXG59XHJcblxyXG48IS0tIEdlc3Rpb25lIG11bHRpcGxhIC0tPlxyXG5AaWYgKG11bHRpcGxlQXR0YWNobWVudCA9PSB0cnVlICYmIHNob3dEcm9wQXJlYSA9PSB0cnVlKSB7XHJcbjxpbnB1dCAjZmlsZUlucHV0IGlkPVwiZmlsZV9hdHRhY2htZW50X211bHRpXCIgbmFtZT1cImZpbGVfYXR0YWNobWVudF9tdWx0aVwiIHR5cGU9XCJmaWxlXCIgaGlkZGVuXHJcbiAgKGNoYW5nZSk9XCJvbkZpbGVBZGRlZCgkZXZlbnQpXCIgW2FjY2VwdF09XCJhY2NlcHRlZEZpbGVUeXBlc1wiIFttdWx0aXBsZV09XCJsb2FkTXVsdGlwbGVGaWxlc1wiIC8+XHJcblxyXG5AaWYgKGxheW91dCA9PT0gJ2Z1bGwnKSB7XHJcbjxkaXYgY2xhc3M9XCJkcm9wYm94XCIgW2NsYXNzLmRyYWdvdmVyXT1cImRyYWdPdmVyXCIgKGRyYWdvdmVyKT1cImRyYWdPdmVyID0gdHJ1ZTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxyXG4gIChkcmFnbGVhdmUpPVwiZHJhZ092ZXIgPSBmYWxzZVwiIChkcm9wKT1cImRyYWdPdmVyID0gZmFsc2U7IGZpbGVEcm9wcGVkKCRldmVudClcIlxyXG4gIChjbGljayk9XCJvblNlbGVjdEZpbGUoJGV2ZW50LCBmaWxlSW5wdXQpXCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiIChrZXlkb3duLmVudGVyKT1cImZpbGVJbnB1dC5jbGljaygpXCJcclxuICAoa2V5ZG93bi5zcGFjZSk9XCJmaWxlSW5wdXQuY2xpY2soKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wYm94LWljb25cIj7wn5OBPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bib3gtdGV4dFwiPnt7IGRyb3BIZXJlTGFiZWwgfX08L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGJveC1zdWJ0ZXh0XCI+XHJcbiAgICB7eyBzdXBwb3J0ZWRGb3JtYXRzTGFiZWwgfX1cclxuICA8L2Rpdj5cclxuICA8YnV0dG9uIGNsYXNzPVwiYnJvd3NlLWJ0blwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmaWxlSW5wdXQuY2xpY2soKVwiPlxyXG4gICAge3sgYnJvd3NlRmlsZXNMYWJlbCB9fVxyXG4gIDwvYnV0dG9uPlxyXG4gIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpKSB7XHJcbiAgPGRpdiBjbGFzcz1cInNlY29uZGFyeS1hY3Rpb24tbGlua1wiPlxyXG4gICAgbyA8YSAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIj5hZ2dpdW5naSB1biBsaW5rPC9hPlxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbn1AZWxzZXtcclxuPGRpdiBjbGFzcz1cImNvbXBhY3QtdXBsb2FkZXJcIiBbY2xhc3MuZHJhZ292ZXJdPVwiZHJhZ092ZXJcIiAoZHJhZ292ZXIpPVwiZHJhZ092ZXIgPSB0cnVlOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXHJcbiAgKGRyYWdsZWF2ZSk9XCJkcmFnT3ZlciA9IGZhbHNlXCIgKGRyb3ApPVwiZHJhZ092ZXIgPSBmYWxzZTsgZmlsZURyb3BwZWQoJGV2ZW50KVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb21wYWN0LWljb25cIj48bWF0LWljb24+Zm9sZGVyX29wZW48L21hdC1pY29uPjwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb21wYWN0LXRleHRcIiAoY2xpY2spPVwib25TZWxlY3RGaWxlKCRldmVudCwgZmlsZUlucHV0KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbXBhY3QtdGl0bGVcIj5UcmFzY2luYSBpIGZpbGUgbyBzZWxlemlvbmEgZGFsIGNvbXB1dGVyPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGFjdC1zdWJ0aXRsZVwiPnt7IHN1cHBvcnRlZEZvcm1hdHNMYWJlbCB9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb21wYWN0LWFjdGlvbnNcIj5cclxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZmlsZUlucHV0LmNsaWNrKClcIj5TZm9nbGlhPC9idXR0b24+XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSB8fCBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbXBhY3RMaW5rTWVudVwiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5MaW5rPC9idXR0b24+XHJcbiAgICA8bWF0LW1lbnUgI2NvbXBhY3RMaW5rTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikpIHsgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcclxuICAgICAgICAoY2xpY2spPVwic3dpdGNoVG9BZGRpbmdMaW5rTW9kZSgpXCI+e3sgb3BlbkxpbmtMYWJlbCB9fTwvYnV0dG9uPiB9XHJcbiAgICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7IDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiIChjbGljayk9XCJjaG9vc2VEcm9wYm94RmlsZSgpXCI+e3tcclxuICAgICAgICB1cGxvYWRXaXRoRHJvcGJveExhYmVsIH19PC9idXR0b24+IH1cclxuICAgIDwvbWF0LW1lbnU+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG59XHJcbn1cclxuXHJcbkBpZiAoYXR0YWNobWVudHNMaXN0Py5sZW5ndGggPiAwICYmIHNob3dTdW1tYXJ5KSB7XHJcbjxkaXYgY2xhc3M9XCJ1cGxvYWQtc3RhdHNcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInN0YXRzLWluZm9cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdGF0LWl0ZW1cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN0YXQtdmFsdWVcIj57eyBhdHRhY2htZW50c0xpc3Q/Lmxlbmd0aCB9fTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdC1sYWJlbFwiPnt7IGZpbGVzTGFiZWwgfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInN0YXQtaXRlbVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdC12YWx1ZVwiPnt7IHRvdGFsU2l6ZUZvcm1hdHRlZCB9fTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdC1sYWJlbFwiPnt7IHRvdGFsU2l6ZUxhYmVsIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG59IEBlbHNlIGlmKGF0dGFjaG1lbnRzTGlzdD8ubGVuZ3RoID09IDApe1xyXG48ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj57eyBlbXB0eVN0YXRlTGFiZWwgfX08L2Rpdj5cclxufVxyXG5cclxuPCEtLSBHcmlnbGlhIGFudGVwcmltZSBjYXJkICh2YWxlIHBlciBzaW5nb2xvIGUgbXVsdGlwbG8pIC0tPlxyXG5AaWYgKHZpZXdNb2RlID09PSAnY2FyZCcpIHtcclxuXHJcbjxkaXYgY2xhc3M9XCJmaWxlLXByZXZpZXdzXCIgW25nU3R5bGVdPVwiZ2V0UHJldmlld3NDb250YWluZXJTdHlsZSgpXCI+XHJcbiAgQGZvciAoYXR0IG9mIGF0dGFjaG1lbnRzTGlzdDsgdHJhY2sgYXR0LklEKSB7XHJcbiAgPGRpdiBbbmdDbGFzc109XCJnZXRDYXJkQ2xhc3MoYXR0KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInByZXZpZXctaW1nLWNvbnRhaW5lclwiIChjbGljayk9XCIhYXR0LmlzVXBsb2FkaW5nICYmIGhhbmRsZVByaW1hcnlBY3Rpb24oYXR0KVwiPlxyXG5cclxuICAgICAgQGlmIChhdHQuSXNJbWFnZSB8fCBhdHQuRmlsZVRodW1ibmFpbEJhc2U2NCkge1xyXG4gICAgICA8aW1nIGNsYXNzPVwicHJldmlldy1pbWdcIiBbc3JjXT1cIidkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyAoYXR0LkZpbGVUaHVtYm5haWxCYXNlNjQgfHwgYXR0LkZpbGVEYXRhQmFzZTY0KVwiXHJcbiAgICAgICAgW2FsdF09XCJhdHQuRmlsZU5hbWVcIiAvPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImZpbGUtaWNvblwiPjxpIFtuZ0NsYXNzXT1cImdldEF0dGFjaG1lbnRJY29uKGF0dClcIj48L2k+PC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWFjdGlvbi1vdmVybGF5XCI+XHJcbiAgICAgICAgQGlmIChhdHQuRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd2aWRlby8nKSkge1xyXG4gICAgICAgIDxtYXQtaWNvbj5wbGF5X2Fycm93PC9tYXQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2UgaWYgKGF0dC5Jc0ltYWdlICYmIGNhbkJlUHJldmlld2VkKGF0dCkpIHtcclxuICAgICAgICA8bWF0LWljb24+dmlzaWJpbGl0eTwvbWF0LWljb24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBlbHNlIGlmIChhdHQuRmlsZUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyAmJiBjYW5CZVByZXZpZXdlZChhdHQpKSB7XHJcbiAgICAgICAgPG1hdC1pY29uPm9wZW5faW5fbmV3PC9tYXQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2UgaWYgKGF0dC5BdHRhY2htZW50VHlwZSA9PT0gQXR0YWNobWVudFR5cGUuRklMRSkge1xyXG4gICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBlbHNlIHtcclxuICAgICAgICA8bWF0LWljb24+b3Blbl9pbl9uZXc8L21hdC1pY29uPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZpbGUtaW5mb1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1uYW1lXCIgW3RpdGxlXT1cImF0dC5GaWxlTmFtZVwiPnt7IGF0dC5GaWxlTmFtZSB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmKCFkaXNhYmxlQWN0aW9uKXtcclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNsYXNzPVwicmVtb3ZlLWJ0blwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiUmltdW92aSBhbGxlZ2F0b1wiXHJcbiAgICAgIChjbGljayk9XCJkZWxldGVBdHRhY2htZW50KGF0dClcIiBbZGlzYWJsZWRdPVwiYXR0LmlzVXBsb2FkaW5nXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChhdHQuaXNVcGxvYWRpbmcpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcblxyXG59IEBlbHNlIGlmKHZpZXdNb2RlID09PSAndGFibGUnICYmIGF0dGFjaG1lbnRzTGlzdD8ubGVuZ3RoID4gMCkge1xyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJ0YWJsZS12aWV3LWNvbnRhaW5lclwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XHJcbiAgICBAZm9yIChjb2wgb2YgX3RhYmxlQ29sdW1uczsgdHJhY2sgY29sLmtleSkge1xyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWNlbGxcIiBbc3R5bGUuZmxleF09XCJjb2wuc3R5bGVzPy5mbGV4XCIgW25nQ2xhc3NdPVwiY29sLmNsYXNzXCI+XHJcbiAgICAgIHt7IGNvbC5kaXNwbGF5IH19XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgQGZvciAoYXR0IG9mIGF0dGFjaG1lbnRzTGlzdDsgdHJhY2sgYXR0LklEKSB7XHJcbiAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiPlxyXG5cclxuICAgIEBmb3IgKGNvbCBvZiBfdGFibGVDb2x1bW5zOyB0cmFjayBjb2wua2V5KSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2VsbFwiIFtzdHlsZS5mbGV4XT1cImNvbC5zdHlsZXM/LmZsZXhcIiBbbmdDbGFzc109XCJjb2wuY2xhc3NcIj5cclxuXHJcbiAgICAgIEBzd2l0Y2ggKGNvbC50eXBlKSB7XHJcblxyXG4gICAgICBAY2FzZSAoJ3RlbXBsYXRlJykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidGVtcGxhdGUtd3JhcHBlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sLmV4dGVybmFsVGVtcGxhdGVcIlxyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBhdHQgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAY2FzZSAoJ2RhdGUnKSB7XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWV0YWRhdGEtdmFsdWVcIj57eyBhdHRbY29sLmtleV0gfCBkYXRlOidkZC9NTS95eXl5JyB9fTwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgICBAZGVmYXVsdCB7XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWV0YWRhdGEtdmFsdWVcIj57eyBhdHRbY29sLmtleV0gfX08L3NwYW4+XHJcbiAgICAgIH1cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxufVxyXG5cclxuPCEtLSBOb3RpZmljYSB0b2FzdCAtLT5cclxuPGRpdiBjbGFzcz1cInVwbG9hZC1ub3RpZmljYXRpb25cIiBbY2xhc3Muc2hvd109XCJ0b2FzdD8udmlzaWJsZVwiIFtjbGFzcy5zdWNjZXNzXT1cInRvYXN0Py50eXBlID09PSAnc3VjY2VzcydcIlxyXG4gIFtjbGFzcy5lcnJvcl09XCJ0b2FzdD8udHlwZSA9PT0gJ2Vycm9yJ1wiPlxyXG4gIDxzcGFuPnt7IHRvYXN0Py50ZXh0IH19PC9zcGFuPlxyXG4gIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvZ3Jlc3NcIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRGaWxlVGVtcGxhdGUgbGV0LWF0dD5cclxuICA8aSBjbGFzcz1cImZpbGUtaWNvbi1zbWFsbFwiIFtuZ0NsYXNzXT1cImdldEF0dGFjaG1lbnRJY29uKGF0dClcIj48L2k+XHJcbiAgPGRpdiBjbGFzcz1cImZpbGUtaW5mby10ZXh0XCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZpbGUtbmFtZS10YWJsZVwiPnt7IGF0dC5GaWxlTmFtZSB9fTwvc3Bhbj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZmlsZS10eXBlLXRhYmxlXCI+e3sgYXR0LkZpbGVFeHRlbnNpb24gfHwgJ0xpbmsnIH19PC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0QWN0aW9uc1RlbXBsYXRlIGxldC1hdHQ+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImhhbmRsZVByaW1hcnlBY3Rpb24oYXR0KVwiXHJcbiAgICBbbWF0VG9vbHRpcF09XCJhdHQuRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd2aWRlby8nKSA/ICdSaXByb2R1Y2kgdmlkZW8nIDogJ1Zpc3VhbGl6emEvU2NhcmljYSdcIj5cclxuXHJcbiAgICA8bWF0LWljb24+XHJcbiAgICAgIEBpZiAoYXR0LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndmlkZW8vJykpIHtcclxuICAgICAgcGxheV9hcnJvd1xyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAge3sgYXR0LkF0dGFjaG1lbnRUeXBlID09PSBBdHRhY2htZW50VHlwZS5GSUxFID8gJ2Rvd25sb2FkJyA6ICdvcGVuX2luX25ldycgfX1cclxuICAgICAgfVxyXG4gICAgPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFjdGlvbnNNZW51XCIgbWF0VG9vbHRpcD1cIkFsdHJlIG9wemlvbmlcIj5cclxuICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8bWF0LW1lbnUgI2FjdGlvbnNNZW51PVwibWF0TWVudVwiPlxyXG4gICAgQGZvciAoYWN0aW9uIG9mIF9zb3J0ZWRNZW51QWN0aW9uczsgdHJhY2sgYWN0aW9uLm5hbWUpIHtcclxuICAgIEBpZiAoIWlzQWN0aW9uSGlkZGVuKGFjdGlvbiwgYXR0KSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhY3Rpb24uZm4oYXR0KVwiIFtkaXNhYmxlZF09XCJhY3Rpb24uZGlzYWJsZWQgPyBhY3Rpb24uZGlzYWJsZWQoYXR0KSA6IGZhbHNlXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbY29sb3JdPVwiYWN0aW9uLmljb24gPT09ICdkZWxldGUnID8gJ3dhcm4nIDogdW5kZWZpbmVkXCI+XHJcbiAgICAgICAge3sgYWN0aW9uLmljb24gfX1cclxuICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgPHNwYW4+e3sgYWN0aW9uLm5hbWUgfX08L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIH1cclxuICA8L21hdC1tZW51PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nQ3JvcEltYWdlPlxyXG4gIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OiBoaWRkZW5cIiBbbmdDbGFzc109XCJjcm9wRGlhbG9nQ2xhc3NcIj5cclxuICAgIDwhLS0gQGlmIChzaG93Q3JvcEltYWdlID09IHRydWUpIHsgLS0+XHJcbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNyb3BwaWVUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZvcm06IG5ld0F0dGFjaG1lbnRGb3JtIH1cIj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPCEtLSB9IC0tPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaW5saW5lUHJldmlld1RlbXBsYXRlIGxldC1yb3c9XCJyb3dcIj5cclxuICBAaWYgKHJvdy5BdHRhY2htZW50VHlwZSAhPSBBdHRhY2htZW50VHlwZS5MSU5LICYmIHJvdy5Jc0ltYWdlKSB7XHJcbiAgPGRpdiBjbGFzcz1cImlubGluZS1wcmV2aWV3LWNvbnRhaW5lclwiIChjbGljayk9XCJvcGVuUHJldmlld0RpYWxvZyhyb3cpXCI+XHJcbiAgICA8aW1nIFtzcmNdPVwiJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnICsgKHJvdy5GaWxlVGh1bWJuYWlsQmFzZTY0ID8gcm93LkZpbGVUaHVtYm5haWxCYXNlNjQgOiByb3cuRmlsZURhdGFCYXNlNjQpXCIgLz5cclxuICA8L2Rpdj5cclxuICB9IEBlbHNlIGlmIChyb3cuQXR0YWNobWVudFR5cGUgIT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhcm93LklzSW1hZ2UpIHtcclxuICA8ZGl2IGNsYXNzPVwiaW5saW5lLXByZXZpZXctY29udGFpbmVyXCIgKGNsaWNrKT1cIm9wZW5QcmV2aWV3RGlhbG9nKHJvdylcIj5cclxuICAgIDxpIFtuZ0NsYXNzXT1cImdldEF0dGFjaG1lbnRJY29uKHJvdylcIj48L2k+XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nUHJldmlldz5cclxuICA8ZGl2IGNsYXNzPVwibW9kZXJuLWRpYWxvZy1jb250YWluZXJcIj4gQGlmIChzZWxlY3RlZEF0dGFjaG1lbnQpIHtcclxuICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZSBjbGFzcz1cInByZXZpZXctaGVhZGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaW5mb1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1ncm91cFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWluLXRcIj57eyBwcmV2aWV3TGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtdFwiPnt7IHNlbGVjdGVkQXR0YWNobWVudC5GaWxlTmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2UgY2xhc3M9XCJjbG9zZS1idG5cIj48bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cInByZXZpZXctY29udGVudC1hcmVhXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS12aWV3ZXItd3JhcHBlclwiPlxyXG4gICAgICAgIEBpZiAoc2VsZWN0ZWRBdHRhY2htZW50LklzSW1hZ2UpIHtcclxuICAgICAgICA8aW1nIGNsYXNzPVwibWFpbi1wcmV2aWV3LW1lZGlhXCJcclxuICAgICAgICAgIFtzcmNdPVwiJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnICsgKHNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCB8fCBzZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVRodW1ibmFpbEJhc2U2NClcIlxyXG4gICAgICAgICAgW2FsdF09XCJzZWxlY3RlZEF0dGFjaG1lbnQuRmlsZU5hbWVcIiAvPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZWxzZSBpZiAoc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndmlkZW8vJykpIHtcclxuICAgICAgICA8dmlkZW8gY29udHJvbHMgYXV0b3BsYXkgcGxheXNpbmxpbmUgY2xhc3M9XCJtYWluLXByZXZpZXctbWVkaWEgdmlkZW8tcGxheWVyXCI+XHJcbiAgICAgICAgICA8c291cmNlIFtzcmNdPVwic2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmxcIiBbdHlwZV09XCJzZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlXCI+XHJcbiAgICAgICAgICBJbCB0dW8gYnJvd3NlciBub24gc3VwcG9ydGEgaWwgdmlkZW8uXHJcbiAgICAgICAgPC92aWRlbz5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2Uge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZnJhbWUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8aWZyYW1lIGNsYXNzPVwicHJldmlldy1pZnJhbWUtbW9kZXJuXCIgW3NyY109XCJzZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybFwiXHJcbiAgICAgICAgICAgIFt0aXRsZV09XCJzZWxlY3RlZEF0dGFjaG1lbnQuRmlsZU5hbWVcIj48L2lmcmFtZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiIGNsYXNzPVwicHJldmlldy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGNsYXNzPVwiYnRuLWNsb3NlXCI+Q2hpdWRpPC9idXR0b24+XHJcbiAgICAgIEBpZiAoc2VsZWN0ZWRBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlICE9PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInZpZXdBdHRhY2htZW50KHNlbGVjdGVkQXR0YWNobWVudClcIiBjbGFzcz1cImJ0bi1kb3dubG9hZFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+IDxzcGFuPnt7IGRvd25sb2FkTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48IS0tIFRFTVBMQVRFIFBFUiBJTCBQVUxTQU5URSBESSBBR0dJVU5UQSBOVU9WTyBBTExFR0FUTyAtLT5cclxuPG5nLXRlbXBsYXRlICNhZGRBdHRhY2htZW50QnV0dG9uPlxyXG4gIDxpbnB1dCAjZmlsZUlucHV0IHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIGlkPVwiZmlsZV9hdHRhY2htZW50XCIgbmFtZT1cImZpbGVfYXR0YWNobWVudFwiIHR5cGU9XCJmaWxlXCJcclxuICAgIChjaGFuZ2UpPVwib25GaWxlQWRkZWQoJGV2ZW50KVwiIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIiBbbXVsdGlwbGVdPVwibG9hZE11bHRpcGxlRmlsZXNcIiAvPlxyXG5cclxuICBAaWYgKGFsbG93ZWRUeXBlcyAmJiBhbGxvd2VkVHlwZXMubGVuZ3RoID09IDEgJiYgKG11bHRpcGxlQXR0YWNobWVudCA9PSB0cnVlIHx8ICFhdHRhY2htZW50c0xpc3QgfHxcclxuICBhdHRhY2htZW50c0xpc3QubGVuZ3RoID09IDAgfHwgKGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPiAwICYmICFhdHRhY2htZW50c0xpc3RbMF0pKSkge1xyXG4gIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbWItNCBtZS01IGVxcC1hdHRhY2htZW50cy1hZGQtYnRuXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAoY2xpY2spPVwiYWRkRmlsZShhbGxvd2VkVHlwZXNbMF0sIGZpbGVJbnB1dClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiPlxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXNbMF0gPT0gMSkgeyA8bWF0LWljb24+Y2xvdWRfdXBsb2FkPC9tYXQtaWNvbj4gfVxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXNbMF0gPT0gMikgeyA8aSBjbGFzcz1cImZhcyBmYS1saW5rXCI+PC9pPiB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlc1swXSA9PSAzKSB7IDxpIGNsYXNzPVwiZmEtYnJhbmRzIGZhLWRyb3Bib3hcIj48L2k+IH1cclxuICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5cclxuICAgICAge3sgYWxsb3dlZFR5cGVzWzBdID09IDEgPyAoYWRkQnV0dG9uTGFiZWwgKyBcIiBmaWxlXCIpIDogYWxsb3dlZFR5cGVzWzBdID09IDIgPyAoYWRkQnV0dG9uTGFiZWwgKyBcIiBsaW5rXCIpIDpcclxuICAgICAgdXBsb2FkV2l0aERyb3Bib3hMYWJlbCB9fVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvYnV0dG9uPlxyXG4gIH1cclxuXHJcbiAgQGlmICghc2VwYXJhdGVkVXBsb2FkQnV0dG9ucyAmJiBhbGxvd2VkVHlwZXMgJiYgYWxsb3dlZFR5cGVzLmxlbmd0aCA+IDEgJiYgKG11bHRpcGxlQXR0YWNobWVudCA9PSB0cnVlIHx8XHJcbiAgIWF0dGFjaG1lbnRzTGlzdCB8fCBhdHRhY2htZW50c0xpc3QubGVuZ3RoID09IDAgfHwgKGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPiAwICYmICFhdHRhY2htZW50c0xpc3RbMF0pKSkge1xyXG4gIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbWItNCBtZS01IGVxcC1hdHRhY2htZW50cy1hZGQtYnRuXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYXR0YWNobWVudFR5cGVNZW51XCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIj5cclxuICAgIEBpZiAobXVsdGlwbGVBdHRhY2htZW50ICE9IHRydWUpIHsgPG1hdC1pY29uPmNsb3VkX3VwbG9hZDwvbWF0LWljb24+IH0gQGVsc2UgeyA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gfVxyXG4gICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMHB4XCI+e3sgYWRkQnV0dG9uTGFiZWwgfX08L3NwYW4+XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIDxtYXQtbWVudSAjYXR0YWNobWVudFR5cGVNZW51PVwibWF0TWVudVwiPlxyXG4gICAgPGlucHV0ICNpbWFnZUlucHV0IHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIGlkPVwiZmlsZV9hdHRhY2htZW50XCIgbmFtZT1cImZpbGVfYXR0YWNobWVudFwiIHR5cGU9XCJmaWxlXCJcclxuICAgICAgKGNoYW5nZSk9XCJvbkZpbGVBZGRlZCgkZXZlbnQpXCIgW2FjY2VwdF09XCJhY2NlcHRlZEZpbGVUeXBlc1wiIFttdWx0aXBsZV09XCJsb2FkTXVsdGlwbGVGaWxlc1wiIC8+XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygxKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJpbWFnZUlucHV0LmNsaWNrKClcIiBjbGFzcz1cImVxcC1hdHRhY2htZW50cy1maWxlLWJ0blwiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1maWxlXCI+PC9pPlxyXG4gICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4XCI+RmlsZTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikpIHtcclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIiBjbGFzcz1cImVxcC1hdHRhY2htZW50cy1saW5rLWJ0blwiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1saW5rXCI+PC9pPlxyXG4gICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4XCI+TGluazwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2hvb3NlRHJvcGJveEZpbGUoKVwiIGNsYXNzPVwiZXFwLWF0dGFjaG1lbnRzLWxpbmstYnRuXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmEtYnJhbmRzIGZhLWRyb3Bib3hcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5Ecm9wYm94PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9tYXQtbWVudT5cclxuICB9XHJcblxyXG4gIEBpZiAoc2VwYXJhdGVkVXBsb2FkQnV0dG9ucyAmJiBhbGxvd2VkVHlwZXMgJiYgYWxsb3dlZFR5cGVzLmxlbmd0aCA+IDEgJiYgKG11bHRpcGxlQXR0YWNobWVudCA9PSB0cnVlIHx8XHJcbiAgIWF0dGFjaG1lbnRzTGlzdCB8fCBhdHRhY2htZW50c0xpc3QubGVuZ3RoID09IDAgfHwgKGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPiAwICYmICFhdHRhY2htZW50c0xpc3RbMF0pKSkge1xyXG4gIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDEpKSB7XHJcbiAgICA8YnV0dG9uIChjbGljayk9XCJpbWFnZUlucHV0LmNsaWNrKClcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGVxcC1hdHRhY2htZW50cy1hZGQtYnRuXCIgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtY2xvdWQtdXBsb2FkXCI+PC9pPlxyXG4gICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4XCI+RmlsZTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgPGlucHV0ICNpbWFnZUlucHV0IHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIGlkPVwiZmlsZV9hdHRhY2htZW50XCIgbmFtZT1cImZpbGVfYXR0YWNobWVudFwiIHR5cGU9XCJmaWxlXCJcclxuICAgICAgKGNoYW5nZSk9XCJvbkZpbGVBZGRlZCgkZXZlbnQpXCIgW2FjY2VwdF09XCJhY2NlcHRlZEZpbGVUeXBlc1wiIFttdWx0aXBsZV09XCJsb2FkTXVsdGlwbGVGaWxlc1wiIC8+XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkge1xyXG4gICAgPGJ1dHRvbiAoY2xpY2spPVwic3dpdGNoVG9BZGRpbmdMaW5rTW9kZSgpXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBlcXAtYXR0YWNobWVudHMtYWRkLWJ0blwiIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1saW5rXCI+PC9pPlxyXG4gICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4XCI+TGluazwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgIDxidXR0b24gKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGVxcC1hdHRhY2htZW50cy1hZGQtYnRuXCIgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmEtYnJhbmRzIGZhLWRyb3Bib3hcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5Ecm9wYm94PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjY3JvcHBpZVRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2Rlcm4tZGlhbG9nLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwicHJldmlldy1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLWdyb3VwXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW4tdFwiPnt7IGNyb3BMYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS10XCI+UmVnb2xhIGxlIGRpbWVuc2lvbmkgZSBsJ29yaWVudGFtZW50bzwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWJvcnRGaWxlKClcIiBjbGFzcz1cImNsb3NlLWJ0blwiPjxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bWF0LWRpYWxvZy1jb250ZW50IGNsYXNzPVwicHJldmlldy1jb250ZW50LWFyZWFcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNyb3AtdG9vbGJhclwiPlxyXG4gICAgICAgIEBpZiAoY3JvcE9wdGlvbnMuaW5jbHVkZXMoMSkpIHtcclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0VG9vbHRpcF09XCJyb3RhdGVMZWZ0TGFiZWxcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInJvdGF0ZUxlZnQoKVwiPjxtYXQtaWNvbj5yb3RhdGVfbGVmdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdFRvb2x0aXBdPVwicm90YXRlUmlnaHRMYWJlbFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicm90YXRlUmlnaHQoKVwiPjxtYXQtaWNvbj5yb3RhdGVfcmlnaHQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGNyb3BPcHRpb25zLmluY2x1ZGVzKDIpKSB7XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdFRvb2x0aXBdPVwiZmxpcEhvcmluem9udGFsTGFiZWxcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImZsaXBIb3Jpem9udGFsKClcIj48bWF0LWljb24+ZmxpcF9ob3Jpem9udGFsPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0VG9vbHRpcF09XCJmbGlwVmVydGljYWxMYWJlbFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZmxpcFZlcnRpY2FsKClcIj48bWF0LWljb24+ZmxpcF92ZXJ0aWNhbDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJSZXNldFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicmVzdG9yZU9yaWdpbmFsRGltZW5zaW9ucygpXCI+PG1hdC1pY29uPnJlcGxheTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXZpZXdlci13cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNyb3AtY29udGFpbmVyLW1vZGVyblwiPlxyXG4gICAgICAgICAgPGltYWdlLWNyb3BwZXIgW2ltYWdlRmlsZV09XCJzZWxlY3RlZEZpbGVcIiBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJmYWxzZVwiIFtjYW52YXNSb3RhdGlvbl09XCJjYW52YXNSb3RhdGlvblwiXHJcbiAgICAgICAgICAgIFt0cmFuc2Zvcm1dPVwidHJhbnNmb3JtXCIgZm9ybWF0PVwicG5nXCIgKGltYWdlQ3JvcHBlZCk9XCJpbWFnZUNyb3BwZWQoJGV2ZW50KVwiIFtyZXNpemVUb1dpZHRoXT1cImN1c3RvbVdpZHRoXCJcclxuICAgICAgICAgICAgW3Jlc2l6ZVRvSGVpZ2h0XT1cImN1c3RvbUhlaWdodFwiIFtvdXRwdXRdPVwiJ2Jhc2U2NCdcIiBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cInRydWVcIiBbb25seVNjYWxlRG93bl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW2FsaWduSW1hZ2VdPVwiJ2NlbnRlcidcIj5cclxuICAgICAgICAgIDwvaW1hZ2UtY3JvcHBlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiZW5kXCIgY2xhc3M9XCJwcmV2aWV3LWFjdGlvbnNcIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJhYm9ydEZpbGUoKVwiIGNsYXNzPVwiYnRuLWNsb3NlXCI+e3sgYWJvcnRMYWJlbCB9fTwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJjb25maXJtQWRkQXR0YWNobWVudCgpXCIgY2xhc3M9XCJidG4tZG93bmxvYWRcIj5cclxuICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPiB7eyBjb25maXJtTGFiZWwgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG5cclxuPCEtLSBURU1QTEFURSBQRVIgRk9STSBESSBBR0dJVU5UQSBESSBVTiBMSU5LIC0tPlxyXG48bmctdGVtcGxhdGUgI2FkZGluZ0xpbmtUZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwibW9kZXJuLWRpYWxvZy1jb250YWluZXJcIj5cclxuICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZSBjbGFzcz1cInByZXZpZXctaGVhZGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaW5mb1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0eXBlLWljb24td3JhcHBlclwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmxpbms8L21hdC1pY29uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1ncm91cFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWluLXRcIj5BZ2dpdW5naSB1biBsaW5rPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLXRcIj5JbnNlcmlzY2kgbCdVUkwgZGVsbGEgcmlzb3JzYSB3ZWI8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGNsYXNzPVwiY2xvc2UtYnRuXCI+PG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJhZGQtbGluay1tb2Rlcm4tY29udGVudFwiPlxyXG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIm5ld0F0dGFjaG1lbnRGb3JtXCIgY2xhc3M9XCJhZGQtbGluay1mb3JtXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LTEwMCBtdC0zXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPlVSTCBkZWwgY29sbGVnYW1lbnRvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZmlsZVBhdGhcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vLi4uXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4Pmxhbmd1YWdlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPlRpdG9sbyAob3B6aW9uYWxlKTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImZpbGVOYW1lXCIgcGxhY2Vob2xkZXI9XCJFcy4gRG9jdW1lbnRvIFByb2dldHRvXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4PnRpdGxlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Zvcm0+XHJcbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiZW5kXCIgY2xhc3M9XCJwcmV2aWV3LWFjdGlvbnNcIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2UgY2xhc3M9XCJidG4tY2xvc2VcIj5Bbm51bGxhPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW21hdC1kaWFsb2ctY2xvc2VdPVwibmV3QXR0YWNobWVudEZvcm0udmFsdWVcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJuZXdBdHRhY2htZW50Rm9ybS5pbnZhbGlkXCIgY2xhc3M9XCJidG4tZG93bmxvYWRcIj5cclxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWdnaXVuZ2lcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
1554
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1hdHRhY2htZW50cy9zcmMvbGliL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtYXR0YWNobWVudHMvc3JjL2xpYi9lcXAtYXR0YWNobWVudHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRSxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQXFCLHFCQUFxQixFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQzNHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBbUUsY0FBYyxFQUFrQyxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBS3RGLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDeEIsSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJ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QixxQkFBcUI7c0JBQTFFLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNOLGFBQWE7c0JBQTFELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFVUSxtQkFBbUI7c0JBQXRFLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNLLHNCQUFzQjtzQkFBNUUsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCBpbWFnZUNvbXByZXNzaW9uIGZyb20gXCJicm93c2VyLWltYWdlLWNvbXByZXNzaW9uXCI7XHJcbmltcG9ydCB7IGJhc2U2NFRvRmlsZSwgSW1hZ2VDcm9wcGVkRXZlbnQsIEltYWdlQ3JvcHBlckNvbXBvbmVudCwgSW1hZ2VUcmFuc2Zvcm0gfSBmcm9tIFwibmd4LWltYWdlLWNyb3BwZXJcIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudEhlbHBlclNlcnZpY2UgfSBmcm9tIFwiLi9oZWxwZXJzL2F0dGFjaG1lbnQuaGVscGVyXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRDYXJkU2l6ZSwgQXR0YWNobWVudEZpZWxkQ29sdW1uLCBBdHRhY2htZW50TWVudUFjdGlvbiwgQXR0YWNobWVudFR5cGUsIENyb3BPcHRpb25FbnVtLCBJQXR0YWNobWVudERUTywgVHlwZUF0dGFjaG1lbnRDb2x1bW4gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lBdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IElPcHRpb25zIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9JT3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL2VxcC1hdHRhY2htZW50LWRpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEVxcEF0dGFjaG1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvZXFwLWF0dGFjaG1lbnQuc2VydmljZVwiO1xyXG5cclxuZGVjbGFyZSB2YXIgRHJvcGJveDogYW55O1xyXG5cclxuY29uc3QgdG9CYXNlNjQgPSAoZmlsZSkgPT5cclxuICBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4gcmVqZWN0KGVycm9yKTtcclxuICB9KTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImVxcC1hdHRhY2htZW50c1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQuc2Nzc1wiXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXFwQXR0YWNobWVudHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8vI3JlZ2lvbiBASW5wdXQgZGVsIGNvbXBvbmVudGVcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgbmFzY29uZGUgbGEgY29sb25uYSBwZXIgbGUgYXppb25pIHN1bGwnYWxsZWdhdG8gKG5lbCBjYXNvIFwibXVsdGlwbGVBdHRhY2htZW50XCIgw6ggVFJVRSkuXHJcbiAgICovXHJcbiAgQElucHV0KFwiZGlzYWJsZUFjdGlvblwiKSBkaXNhYmxlQWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgbW9zdHJhIGlsIHRpdG9sbyBuZWxsJ2hlYWRlciBuZWwgY2FzbyBpbiBjdWkgXCJtdWx0aXBsZUF0dGFjaG1lbnRcIiDDqCBUUlVFIChcIkVsZW5jbyBhbGxlZ2F0aVwiIGRpIGRlZmF1bHQpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dIZWFkZXJcIikgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvcmdlbnRlIGRhdGkgZGEgdmlzdWFsaXp6YXJlLiBOZWwgY2FzbyBzaSB2dW9sZSBnZXN0aXJlIHVuIHNpbmdvbG8gYWxsZWdhdG8gdmEgcGFzc2F0byBpbiBvZ25pIGNhc28gY29tZSBBcnJheS5cclxuICAgKi9cclxuICBASW5wdXQoXCJhdHRhY2htZW50c0xpc3RcIikgYXR0YWNobWVudHNMaXN0OiBBcnJheTxJQXR0YWNobWVudERUTz4gPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBOZWwgY2FzbyBzaSB2dW9sZSBnZXN0aXJlIHVuIHNvbG8gZWxlbWVudG8gc2VuemEgcGFzc2FybG8gY29tZSBhcnJheSwgbG8gcGFzc28gY29tZSBzaW5nb2xvIGFsbGVnYXRvIGUgZ2VzdGlzY28gbmVsbGEgbGlicmVyaWEgbCdhcnJheS5cclxuICAgKi9cclxuICBASW5wdXQoXCJzaW5nbGVBdHRhY2htZW50XCIpIHNpbmdsZUF0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBub24gbW9zdHJhIGxhIE1hdENhcmQgKG5lbCBjYXNvIGluIGN1aSBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dNYXRDYXJkXCIpIHNob3dNYXRDYXJkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgRkFMU0UgYWxsb3JhIGlsIGNvbXBvbmVudGUgbW9zdHJhIHNvbG8gaWwgcHVsc2FudGUgZGkgY2FyaWNhbWVudG8gZGkgdW4gc2luZ29sbyBmaWxlLCB1bmEgdm9sdGEgY2FyaWNhdG8gaWwgZmlsZSBpbnZvY2EgbCdldmVudG8gZGkgb3V0cHV0IFwibG9jYWxFZGl0ZWRBdHRhY2htZW50c1wiLlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIGlsIGNvbXBvbmVudGUgbW9zdHJhIGwnZWxlbmNvIGRpIHR1dHRpIGdsaSBhbGxlZ2F0aSByaWNldnV0byBuZWwgcGFyYW1ldHJvIFwiYXR0YWNobWVudHNMaXN0XCIuXHJcbiAgICovXHJcbiAgQElucHV0KFwibXVsdGlwbGVBdHRhY2htZW50XCIpIG11bHRpcGxlQXR0YWNobWVudDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIGFzc3VtZSBpbCB2YWxvcmUgVFJVRSBhbGxvcmEgc2Fyw6AgcG9zc2liaWxlIGNhcmljYXJlIHBpw7kgZmlsZSBwZXIgdm9sdGEuIFF1ZXN0YSBmdW56aW9uYWxpdMOgIMOoIGF0dGl2YVxyXG4gICAqIFNPTE8gc2Ugc2kgZ2VzdGlzY29ubyBhbGxlZ2F0aSBtdWx0aXBsaSwgcXVpbmRpIHNlIGwnaW5wdXQgJ211bHRpcGxlQXR0YWNobWVudCcgYXNzdW1lIGlsIHZhbG9yZSBUUlVFLCBhbHRyaW1lbnRpIMOoIHNlbXByZSBkaXNhYmlsaXRhdGEuXHJcbiAgICovXHJcbiAgQElucHV0KFwibG9hZE11bHRpcGxlRmlsZXNcIikgbG9hZE11bHRpcGxlRmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW1wb3N0YSBpbCBtZXNzYWdnaW8gZGEgdmlzdWFsaXp6YXJlIG5lbCBjYXNvIGluIGN1aSBsYSB0YWJlbGxhIGRlZ2xpIGFsbGVnYXRpIChuZWwgY2FzbyBpbiBjdWkgXCJtdWx0aXBsZUF0dGFjaG1lbnRcIiDDqCBUUlVFKSDDqCB2dW90YS5cclxuICAgKi9cclxuICBASW5wdXQoXCJlbXB0eVRhYmxlTWVzc2FnZVwiKSBlbXB0eVRhYmxlTWVzc2FnZTogc3RyaW5nID0gXCJOZXNzdW4gZGF0byB0cm92YXRvXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIHBlcm1ldHRlIGRpIHNlbGV6aW9uYXJlIHNvbHRhbnRvIGZpbGUgZGkgdGlwbyBpbW1hZ2luZSwgYXZlbnRlIHVubyBkZWkgbWltZXR5cGVcclxuICAgKiBzcGVjaWZpY2F0aSBkZW50cm8gQXR0YWNobWVudEhlbHBlclNlcnZpY2UuXHJcbiAgICogU2UgRkFMU0UgcGVybWV0dGUgZGkgc2VsZXppb25hcmUgcXVhbHNpYXNpIHRpcG8gZGkgZmlsZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImFsbG93T25seUltYWdlc1wiKSBhbGxvd09ubHlJbWFnZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU3BlY2lmaWNhIGkgdGlwaSBkaSBmaWxlIGNoZSDDqCBwb3NzaWJpbGUgY2FyaWNhcmVcclxuICAgKi9cclxuICBASW5wdXQoXCJhY2NlcHRlZEZpbGVUeXBlc1wiKSBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIGRpc2FiaWxpdGEgaWwgcHVsc2FudGUgZGkgQWdnaXVudGEgYWxsZWdhdG8gKGEgcHJlc2NpbmRlcmUgZGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvIFwibXVsdGlwbGVBdHRhY2htZW50XCIpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImlzRGlzYWJsZWRcIikgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBNb3N0cmEvbmFzY29uZGUgbGEgY29sb25uYSBwZXIgdmlzdWFsaXp6YXJlIGwnYW50ZXByaW1hIGRlaSBmaWxlIG5lbGxhIHRhYmVsbGEgKGNhc28gbXVsdGlwbGVBdGF0Y2htZW50cyA9IHRydWUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dJbmxpbmVQcmV2aWV3XCIpIHNob3dJbmxpbmVQcmV2aWV3OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuZHBvaW50IGRhIGNoaWFtYXJlIHBlciByZWN1ZXByYXJlIGwnSUF0dGFjaG1lbnREVE8gY29tcGxldG8gZGEgdmVkZXJlIG5lbGwnYW50ZXByaW1hLiBMYSBjaGlhbWF0YSBzYXLDoCBpbiBQT1NUIGUgbmVsIGJvZHlcclxuICAgKiBjb250ZXJyw6AgbCdJQXR0YWNobWVudERUTyBzZWxlemlvbmF0byBkYWxsJ3V0ZW50ZS5cclxuICAgKiBMYSBjaGlhbWF0YSB2aWVuZSBlc2VndWl0YSBzb2xvIHBlciBsJ2FudGVwcmltYSBkZWxsZSBpbW1hZ2luaSBlc3NlbmRvIG5lY2Vzc2FyaW8gaWwgYmFzZTY0IGNvbXBsZXRvIGRlbGwnaW1tYWdpbmUgYSBkaW1lbnNpb25lIHJlYWxlLlxyXG4gICAqIFBlciBkb2N1bWVudGkvbGluayBiYXN0YSBjaGUgc2lhIHBvcG9sYXRhIGxhIHByb3ByaWV0w6AgRmlsZVBhdGggZGkgSUF0dGFjaG1lbnREVE8uXHJcbiAgICovXHJcbiAgQElucHV0KFwiZ2V0QXR0YWNobWVudEVuZHBvaW50XCIpIGdldEF0dGFjaG1lbnRFbmRwb2ludDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogSG9zdG5hbWUgZGVsbCdhbWJpZW50ZSBkaSBwcm9kdXppb25lIGRlbGwnYXBwbGljYXRpdm8uIE5lY2Vzc2FyaW8gcGVyIHZpc3VhbGl6emFyZSBsJ2FudGVwcmltYSBkZWkgZG9jdW1lbnRpXHJcbiAgICogdHJhbWl0ZSBpbCB2aWV3ZXIgZGkgZ29vZ2xlLlxyXG4gICAqIE5PVEE6IFBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWEgw6ggbmVjZXNzYXJpbyBjaGUgbGEgcHJvcmlldMOgIEZpbGVQYXRoIGRlbGwnSUF0dGFjaG1lbnREVE8gc2lhIHBvcG9sYXRhIGUgY2hlXHJcbiAgICogc2lhIGFiaWxpdGF0byBsJ2FjY2Vzc28gYWxsYSBjYXJ0ZWxsYSBzdWwgc2VydmVyIHRyYW1pdGUgaG9zdG5hbWUuXHJcbiAgICovXHJcbiAgQElucHV0KFwicHJvZHVjdGlvbkJhc2VVcmxcIikgcHJvZHVjdGlvbkJhc2VVcmw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wemlvbmkgcGVyIGxhIGNvbXByZXNzaW9uZSBkZWxsZSBpbW1hZ2luaSBjYXJpY2F0ZS5cclxuICAgKi9cclxuICBASW5wdXQoXCJjb21wcmVzc2lvbk9wdGlvbnNcIikgY29tcHJlc3Npb25PcHRpb25zOiBJT3B0aW9ucyA9IHtcclxuICAgIG1heFNpemVNQjogMC41LFxyXG4gICAgbWF4V2lkdGhPckhlaWdodDogMTkyMCxcclxuICAgIHVzZVdlYldvcmtlcjogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IGRpIEF0dGFjaG1lbnRUeXBlIGNoZSBzaSBwb3Nzb25vIGFnZ2l1bmdlcmVcclxuICAgKi9cclxuICBASW5wdXQoXCJhbGxvd2VkVHlwZXNcIikgYWxsb3dlZFR5cGVzOiBBcnJheTxBdHRhY2htZW50VHlwZT4gPSBbQXR0YWNobWVudFR5cGUuRklMRSwgQXR0YWNobWVudFR5cGUuTElOS107XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSBzZSBsYSBlcXAtdGFibGUgY29udGVuZW50ZSBsJ2VsZW5jbyBkZWdsaSBhbGxlZ2F0aSB1dGlsaXp6YVxyXG4gICAqIGlsIG11bHRpbGluZ3VhIG9wcHVyZSBub1xyXG4gICAqL1xyXG4gIEBJbnB1dChcImlzRXFwVGFibGVNdWx0aUxhbmd1YWdlXCIpIGlzRXFwVGFibGVNdWx0aUxhbmd1YWdlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSwgaW4gY2FzbyBkaSBnZXN0aW9uZSBhbGxlZ2F0aSBtdWx0aXBsaSwgc2UgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvXHJcbiAgICogZGVnbGkgYWxsZWdhdGkgZGV2ZSBlc3NlcmUgcGFnaW5hdGEgb3BwdXJlIG5vXHJcbiAgICovXHJcbiAgQElucHV0KFwidGFibGVQYWdpbmF0b3JWaXNpYmxlXCIpIHRhYmxlUGFnaW5hdG9yVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSwgaW4gY2FzbyBkaSBnZXN0aW9uZSBhbGxlZ2F0aSBtdWx0aXBsaSwgc2UgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvXHJcbiAgICogZGVnbGkgYWxsZWdhdGkgZGV2ZSBjb250ZW5lcmUgaWwgY2FtcG8gZGkgcmljZXJjYSBvcHB1cmUgbm9cclxuICAgKi9cclxuICBASW5wdXQoXCJpc1RhYmxlU2VhcmNoZWFibGVcIikgaXNUYWJsZVNlYXJjaGVhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW4gY2FzbyBkaSBnZXN0aW9uZSBhbGxlZ2F0aSBtdWx0aXBsaSwgcGVybWV0dGUgZGkgc3RhYmlsaXJlIGxhIGRpbWVuc2lvbmUgcGFnaW5hIGRpIGRlZmF1bHRcclxuICAgKiBwZXIgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvIGRlZ2xpIGFsbGVnYXRpXHJcbiAgICovXHJcbiAgQElucHV0KFwidGFibGVQYWdpbmF0b3JTaXplXCIpIHRhYmxlUGFnaW5hdG9yU2l6ZTogbnVtYmVyID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc2NlZ2xpZXJlIGlsIG1vZG8gaW4gY3VpIGkgZmlsZSBkZXZvbm8gZXNzZXJlIGNhcmljYXRpXHJcbiAgICovXHJcbiAgLy8gQElucHV0KFwidXBsb2FkVHlwZVwiKSB1cGxvYWRUeXBlOiBVcGxvYWRUeXBlRW51bSA9IFVwbG9hZFR5cGVFbnVtLkZJTEVfQU5EX0xJTks7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSBzZSBpIHB1bHNhbnRpIHBlciBpbCBjYXJpY2FtZW50byBkZWkgZmlsZSBzb25vIHNlcGFyYXRpIG8gaW4gdW4gbWVuw7kgYSB0ZW5kaW5hXHJcbiAgICovXHJcbiAgQElucHV0KFwic2VwYXJhdGVkVXBsb2FkQnV0dG9uc1wiKSBzZXBhcmF0ZWRVcGxvYWRCdXR0b25zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHNjZWdsaWVyZSBzZSBkYXJlIGxhIHBvc3NpYmlsaXTDoCBkaSB2ZWRlcmUgbyBubyBsJ2FudGVwcmltYVxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dQcmV2aWV3XCIpIHNob3dQcmV2aWV3OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW4gY2FzbyBkaSBhbGxlZ2F0byBzaW5nb2xvLCBwZXJtZXR0ZSBkaSBzY2VnbGllcmUgc2UgYWdnaXVuZ2VyZSBmaWxlIHRyYW1pdGUgZHJhZyBhbmQgZHJvcFxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNpbmdsZUF0dGFjaG1lbnREcmFnQW5kRHJvcFwiKSBzaW5nbGVBdHRhY2htZW50RHJhZ0FuZERyb3A6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBBcnJheSBkaSBvcHppb25pIGNoZSBzaSBwb3Nzb25vIHV0aWxpenphcmUgcGVyIGlsIGNyb3BcclxuICAgKi9cclxuICBASW5wdXQoXCJjcm9wT3B0aW9uc1wiKSBjcm9wT3B0aW9uczogQXJyYXk8Q3JvcE9wdGlvbkVudW0+ID0gWzEsIDJdO1xyXG5cclxuICAvKipcclxuICAgKiBDbGFzc2UgY3VzdG9tIGRhIGFzc2VnbmFyZSBhbCBkaWFsb2cgZGVsIGNyb3AgaW1tYWdpbmlcclxuICAgKi9cclxuICBASW5wdXQoXCJjcm9wRGlhbG9nQ2xhc3NcIikgY3JvcERpYWxvZ0NsYXNzOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIG1heEZpbGVTaXplTUI6IG51bWJlciA9IDUwMDsgLy8gRGVmYXVsdCBtYXggc2l6ZSBvZiAxMDAgTUJcclxuICBASW5wdXQoKSBjYXJkU2l6ZTogQXR0YWNobWVudENhcmRTaXplID0gJ3NtYWxsJzsgLy8gRGVmYXVsdFxyXG4gIEBJbnB1dCgpIGN1c3RvbUNhcmRXaWR0aFB4OiBudW1iZXIgPSAyMDA7IC8vIExhcmdoZXp6YSBjdXN0b20gaW4gcHhcclxuICBASW5wdXQoKSBjdXN0b21DYXJkSGVpZ2h0UHg6IG51bWJlciA9IDE4MDsgLy8gQWx0ZXp6YSBjdXN0b20gaW4gcHhcclxuXHJcbiAgQElucHV0KCkgbGF5b3V0OiAnZnVsbCcgfCAnY29tcGFjdCcgPSAnY29tcGFjdCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIElucHV0IHBlciBkZWZpbmlyZSBsZSBsYWJlbCBkYSB1c2FyZSBuZWwgY29tcG9uZW50ZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcIm9wZW5MaW5rTGFiZWxcIikgb3BlbkxpbmtMYWJlbDogc3RyaW5nID0gXCJBcHJpIGxpbmtcIjtcclxuICBASW5wdXQoXCJhZGRCdXR0b25MYWJlbFwiKSBhZGRCdXR0b25MYWJlbDogc3RyaW5nID0gXCJBZ2dpdW5naVwiO1xyXG4gIEBJbnB1dChcImRvd25sb2FkTGFiZWxcIikgZG93bmxvYWRMYWJlbDogc3RyaW5nID0gXCJEb3dubG9hZFwiO1xyXG4gIEBJbnB1dChcImRlbGV0ZUxhYmVsXCIpIGRlbGV0ZUxhYmVsOiBzdHJpbmcgPSBcIkVsaW1pbmFcIjtcclxuICBASW5wdXQoXCJmaWxlTmFtZUxhYmVsXCIpIGZpbGVOYW1lTGFiZWw6IHN0cmluZyA9IFwiTm9tZSBmaWxlXCI7XHJcbiAgQElucHV0KFwicHJldmlld0xhYmVsXCIpIHByZXZpZXdMYWJlbDogc3RyaW5nID0gXCJBbnRlcHJpbWFcIjtcclxuICBASW5wdXQoXCJ1cGxvYWRGaWxlTGFiZWxcIikgdXBsb2FkRmlsZUxhYmVsOiBzdHJpbmcgPSBcIkNhcmljYSBmaWxlXCI7XHJcbiAgQElucHV0KFwiY29uZmlybUxhYmVsXCIpIGNvbmZpcm1MYWJlbDogc3RyaW5nID0gXCJDb25mZXJtYVwiO1xyXG4gIEBJbnB1dChcImFib3J0TGFiZWxcIikgYWJvcnRMYWJlbDogc3RyaW5nID0gXCJBbm51bGxhXCI7XHJcbiAgQElucHV0KFwic2F2ZUxhYmVsXCIpIHNhdmVMYWJlbDogc3RyaW5nID0gXCJTYWx2YVwiO1xyXG4gIEBJbnB1dChcImV4aXRMYWJlbFwiKSBleGl0TGFiZWw6IHN0cmluZyA9IFwiRXNjaVwiO1xyXG4gIEBJbnB1dChcInVwbG9hZFdpdGhEcm9wYm94TGFiZWxcIikgdXBsb2FkV2l0aERyb3Bib3hMYWJlbDogc3RyaW5nID0gXCJDYXJpY2EgY29uIERyb3Bib3hcIjtcclxuICBASW5wdXQoXCJjcm9wTGFiZWxcIikgY3JvcExhYmVsOiBzdHJpbmcgPSBcIlNjZWdsaSBsZSBkaW1lbnNpb25pIGRlbGwnaW1tYWdpbmVcIjtcclxuICBASW5wdXQoXCJkZWxldGVEaWFsb2dUaXRsZVwiKSBkZWxldGVEaWFsb2dUaXRsZTogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoXCJkZWxldGVEaWFsb2dNZXNzYWdlXCIpIGRlbGV0ZURpYWxvZ01lc3NhZ2U6IHN0cmluZyA9IFwiU2VpIHNpY3VybyBkaSB2b2xlciBjYW5jZWxsYXJlIHF1ZXN0J2FsbGVnYXRvP1wiO1xyXG4gIEBJbnB1dChcIm5vSW1hZ2VTZWxlY3RlZEVycm9yTWVzc2FnZVwiKSBub0ltYWdlU2VsZWN0ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyA9XHJcbiAgICBcIk5vbiDDqCBwb3NzaWJpbGUgc2VsZXppb25hcmUgdW4gZmlsZSBjaGUgbm9uIHNpYSB1bidpbW1hZ2luZS5cIjtcclxuICBASW5wdXQoXCJ3cm9uZ1R5cGVTZWxlY3RlZEVycm9yTWVzc2FnZVwiKSB3cm9uZ1R5cGVTZWxlY3RlZEVycm9yTWVzc2FnZTogc3RyaW5nID1cclxuICAgIFwiTm9uIMOoIHBvc3NpYmlsZSBjYXJpY2FyZSBpbCBmaWxlIHNlbGV6aW9uYXRvLlwiO1xyXG4gIEBJbnB1dChcInZpZGVvUHJldmlld0Vycm9yTWVzc2FnZVwiKSB2aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2U6IHN0cmluZyA9XHJcbiAgICBcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkaSB1biBmaWxlIHZpZGVvLlwiO1xyXG4gIEBJbnB1dChcInZpZGVvUHJldmlld0Vycm9yTWVzc2FnZVwiKSBhdWRpb1ByZXZpZXdFcnJvck1lc3NhZ2U6IHN0cmluZyA9XHJcbiAgICBcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkaSB1biBmaWxlIGF1ZGlvLlwiO1xyXG4gIEBJbnB1dChcImZsaXBIb3JpbnpvbnRhbExhYmVsXCIpIGZsaXBIb3JpbnpvbnRhbExhYmVsOiBzdHJpbmcgPSBcIkNhcG92b2xnaSBvcml6em9udGFsbWVudGVcIjtcclxuICBASW5wdXQoXCJmbGlwVmVydGljYWxMYWJlbFwiKSBmbGlwVmVydGljYWxMYWJlbDogc3RyaW5nID0gXCJDYXBvdm9sZ2kgdmVydGljYWxtZW50ZVwiO1xyXG4gIEBJbnB1dChcInJvdGF0ZVJpZ2h0TGFiZWxcIikgcm90YXRlUmlnaHRMYWJlbDogc3RyaW5nID0gXCJSdW90YSBhIGRlc3RyYVwiO1xyXG4gIEBJbnB1dChcInJvdGF0ZUxlZnRMYWJlbFwiKSByb3RhdGVMZWZ0TGFiZWw6IHN0cmluZyA9IFwiUnVvdGEgYSBzaW5pc3RyYVwiO1xyXG4gIEBJbnB1dChcImJhc2U2NExpbWl0TUJcIikgYmFzZTY0TGltaXRNQjogbnVtYmVyID0gMTAwO1xyXG4gIEBJbnB1dCgpIHVwbG9hZFRpdGxlID0gJ1VwbG9hZCBmaWxlJztcclxuICBASW5wdXQoKSB1cGxvYWRTdWJ0aXRsZSA9ICdEcmFnICYgZHJvcCBmaWxlcyBvIGNsaWNrJztcclxuICBASW5wdXQoKSBkcm9wSGVyZUxhYmVsID0gJ1JpbGFzY2lhIGkgZmlsZSBxdWknO1xyXG4gIEBJbnB1dCgpIHN1cHBvcnRlZEZvcm1hdHNMYWJlbCA9ICdGb3JtYXRpIHN1cHBvcnRhdGk6IEpQRUcsIFBORywgUERGIChNYXggMTAwTUIpJztcclxuICBASW5wdXQoKSBicm93c2VGaWxlc0xhYmVsID0gJ0NlcmNhIGkgZmlsZSc7XHJcbiAgQElucHV0KCkgdXBsb2FkU3VtbWFyeUxhYmVsID0gJ0xpc3RhIGFsbGVnYXRpJztcclxuICBASW5wdXQoKSBmaWxlc0xhYmVsID0gJ0ZpbGVzJztcclxuICBASW5wdXQoKSB0b3RhbFNpemVMYWJlbCA9ICdEaW1lbnNpb25lIHRvdGFsZSc7XHJcbiAgQElucHV0KCkgZW1wdHlTdGF0ZUxhYmVsID0gJ05vbiBzb25vIHByZXNlbnRpIGZpbGUgY2FyaWNhdGknO1xyXG4gIEBJbnB1dCgpIGFkZGVkU3VjY2Vzc2Z1bGx5TGFiZWwgPSAnZmlsZShzKSBjYXJpY2F0aSBjb24gc3VjY2Vzc28uJztcclxuICBASW5wdXQoKSByZW1vdmVkTGFiZWwgPSAnRmlsZSByaW1vc3NvJztcclxuICAvLyBASW5wdXQoKSByZW1vdmVMYWJlbCA9ICdSaW11b3ZpIGZpbGUnO1xyXG4gIEBJbnB1dCgpIGNob29zZVZpZXcgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dTdW1tYXJ5ID0gZmFsc2U7XHJcbiAgQElucHV0KFwidmlld01vZGVcIikgdmlld01vZGU6ICdjYXJkJyB8ICd0YWJsZScgPSAndGFibGUnO1xyXG4gIEBJbnB1dChcInNob3dVcGxvYWRUaXRsZVwiKSBzaG93VXBsb2FkVGl0bGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dChcInNob3dEcm9wQXJlYVwiKSBzaG93RHJvcEFyZWE6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGhpZGRlbkNvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgaGlkZGVuQWN0aW9uczogc3RyaW5nW10gPSBbXTtcclxuICBASW5wdXQoKSBzaG93QWN0aW9uQnV0dG9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSB2aWRlb0NvbXByZXNzaW9uOiB7XHJcbiAgICBlbmFibGVkOiBib29sZWFuLFxyXG4gICAgbWF4V2lkdGg/OiBudW1iZXIsXHJcbiAgICBiaXRyYXRlPzogbnVtYmVyXHJcbiAgfSA9IHsgZW5hYmxlZDogZmFsc2UsIG1heFdpZHRoOiAxMjgwLCBiaXRyYXRlOiAyNTAwMDAwIH07XHJcblxyXG4gIHByaXZhdGUgX2N1c3RvbU1lbnVBY3Rpb25zOiBBdHRhY2htZW50TWVudUFjdGlvbltdID0gW107XHJcbiAgX3NvcnRlZE1lbnVBY3Rpb25zOiBBdHRhY2htZW50TWVudUFjdGlvbltdID0gW107XHJcblxyXG4gIC8qKlxyXG4gKiBTT0xPIHF1YW5kbyBbY3VzdG9tTWVudUFjdGlvbnNdPVwiLi4uXCIgY2FtYmlhLlxyXG4gKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBjdXN0b21NZW51QWN0aW9ucyh2YWx1ZTogQXR0YWNobWVudE1lbnVBY3Rpb25bXSkge1xyXG4gICAgdGhpcy5fY3VzdG9tTWVudUFjdGlvbnMgPSB2YWx1ZSB8fCBbXTtcclxuICAgIHRoaXMuc2V0dXBNZW51QWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1c3RvbU1lbnVBY3Rpb25zKCk6IEF0dGFjaG1lbnRNZW51QWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbU1lbnVBY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3VzdG9tQ29sdW1uczogQXR0YWNobWVudEZpZWxkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogU09MTyBxdWFuZG8gW2N1c3RvbUNvbHVtbnNdPVwiLi4uXCIgY2FtYmlhLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGN1c3RvbUNvbHVtbnModmFsdWU6IEF0dGFjaG1lbnRGaWVsZENvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9jdXN0b21Db2x1bW5zID0gdmFsdWUgfHwgW107XHJcbiAgICB0aGlzLnNldHVwVGFibGVDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VzdG9tQ29sdW1ucygpOiBBdHRhY2htZW50RmllbGRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29sdW1ucztcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gQE91dHB1dCBkZWwgY29tcG9uZW50ZVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdGl0dWlzY2UgbGEgbGlzdGEgYWdnaW9ybmF0YSBkZWdsaSBhbGxlZ2F0aS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgbG9jYWxFZGl0ZWRBdHRhY2htZW50czogRXZlbnRFbWl0dGVyPEFycmF5PElBdHRhY2htZW50RFRPPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PElBdHRhY2htZW50RFRPPj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnRvIHNjYXRlbmF0byBhbGxhIHByZXNzaW9uZSBkZWwgcHVsc2FudGUgRVNDSSBkZWxsYSBtb2RhbGUgZGkgY2FyaWNhbWVudG8gZmlsZS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgYWJvcnRBZGRBdHRhY2htZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsJ0lBdHRhY2htZW50RFRPIHNlbGV6aW9uYXRvIHBlciBpbCBkb3dubG9hZCBuZWwgY2FzbyBGaWxlRGF0YUJhc2U2NCwgRmlsZUNvbnRlbnRUeXBlIG8gRmlsZU5hbWUgbm9uIGZvc3Nlcm8gc3BlY2lmaWNhdGkuXHJcbiAgICovXHJcbiAgQE91dHB1dChcImRvd25sb2FkQXR0YWNobWVudFwiKSBkb3dubG9hZEF0dGFjaG1lbnQ6IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsJ2VsZW1lbnRvIGVsaW1pbmF0byBwcmltYSBjaGUgcXVlc3RvIHZlbmdhIGVmZmV0dGl2YW1lbnRlIHJpc21vc3NvIGRhbGxhIGxpc3RhLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoXCJvbkRlbGV0ZUF0dGFjaG1lbnRcIikgb25EZWxldGVBdHRhY2htZW50OiBFdmVudEVtaXR0ZXI8SUF0dGFjaG1lbnREVE8+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBQcm9wcmlldMOgIHBlciBnZXN0aW9uZSBjYXJpY2FtZW50byBudW92byBhbGxlZ2F0b1xyXG4gIG5ld0F0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPID0ge30gYXMgSUF0dGFjaG1lbnREVE87XHJcbiAgbmV3TXVsdGlwbGVBdHRhY2htZW50czogQXJyYXk8SUF0dGFjaG1lbnREVE8+ID0gW107XHJcbiAgYXR0YWNobWVudFR5cGUgPSBBdHRhY2htZW50VHlwZTtcclxuICAvLyB1cGxvYWRUeXBlRW51bSA9IFVwbG9hZFR5cGVFbnVtO1xyXG4gIG5ld0F0dGFjaG1lbnRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlID0gbnVsbDtcclxuICBzZWxlY3RlZEZpbGVzOiBBcnJheTxGaWxlPiA9IG51bGw7XHJcbiAgc2hvd0Nyb3BJbWFnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dBZGRBdHRhY2htZW50XCIsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWxvZ0FkZEF0dGFjaG1lbnQ6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZGlhbG9nUmVmQWRkQXR0YWNobWVudDogTWF0RGlhbG9nUmVmPFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dBZGRNdWx0aXBsZUF0dGFjaG1lbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQWRkTXVsdGlwbGVBdHRhY2htZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIGRpYWxvZ1JlZkNyb3BJbWFnZTogTWF0RGlhbG9nUmVmPFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dDcm9wSW1hZ2VcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQ3JvcEltYWdlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAVmlld0NoaWxkKCdhZGRpbmdMaW5rVGVtcGxhdGUnKSBhZGRpbmdMaW5rVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBQcm9wcmlldMOgIHBlciBnZXN0aW9uZSByaWRpbWVuc2lvbmFtZW50byBmaWxlIGRpIHRpcG8gaW1hZ2VcclxuICBpbWFnZUNoYW5nZWRFdmVudDogYW55ID0gXCJcIjtcclxuICBjcm9wcGVkSW1hZ2U6IGFueSA9IFwiXCI7XHJcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xyXG4gIGNhbnZhc1JvdGF0aW9uID0gMDtcclxuICBAVmlld0NoaWxkKEltYWdlQ3JvcHBlckNvbXBvbmVudCkgaW1hZ2VDcm9wcGVyOiBJbWFnZUNyb3BwZXJDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImltYWdlSW5wdXRcIikgaW1hZ2VJbnB1dDogYW55O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBBdHRhY2htZW50VHlwZSA9IEF0dGFjaG1lbnRUeXBlO1xyXG4gIHNlbGVjdGVkQXR0YWNobWVudDogSUF0dGFjaG1lbnREVE87XHJcblxyXG4gIG9yaWdpbmFsV2lkdGg6IG51bWJlcjtcclxuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyO1xyXG4gIGN1c3RvbVdpZHRoOiBudW1iZXI7XHJcbiAgY3VzdG9tSGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbmxpbmVQcmV2aWV3VGVtcGxhdGVcIiwgeyBzdGF0aWM6IHRydWUgfSkgaW5saW5lUHJldmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dQcmV2aWV3XCIsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWxvZ1ByZXZpZXc6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIGltYWdlRmlsZTogRmlsZTtcclxuXHJcbiAgYWRkaW5nTGlua01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8jcmVnaW9uIFNlemlvbmUgbnVvdmEgcmVmYWN0b3JpbmdcclxuXHJcbiAgLy8gUHJvcHJpZXTDoCBpbnRlcm5hIGNoZSBjb250ZXJyw6AgbCdhcnJheSBmaW5hbGUgZGkgY29sb25uZSBvcmRpbmF0ZVxyXG4gIF90YWJsZUNvbHVtbnM6IEF0dGFjaG1lbnRGaWVsZENvbHVtbltdID0gW107XHJcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdEZpbGVUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGRlZmF1bHRGaWxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdEFjdGlvbnNUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGRlZmF1bHRBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8vIFN0YXRvIGRyYWcgJiBkcm9wIGUgdG9hc3RcclxuICBkcmFnT3ZlciA9IGZhbHNlO1xyXG4gIHRvYXN0ID0ge1xyXG4gICAgdmlzaWJsZTogZmFsc2UgYXMgYm9vbGVhbixcclxuICAgIHR5cGU6ICdzdWNjZXNzJyBhcyAnc3VjY2VzcycgfCAnZXJyb3InLFxyXG4gICAgdGV4dDogJycgYXMgc3RyaW5nLFxyXG4gICAgdGltZW91dElkOiAwIGFzIGFueVxyXG4gIH07XHJcblxyXG4gIHByb2dyZXNzUGVyY2VudCA9IDA7XHJcbiAgdG90YWxTaXplQnl0ZXMgPSAwO1xyXG4gIGdldCB0b3RhbFNpemVGb3JtYXR0ZWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZm9ybWF0RmlsZVNpemUodGhpcy50b3RhbFNpemVCeXRlcyk7IH1cclxuXHJcbiAgLy8gVXRpbGl0eSBwZXIgZm9ybWF0dGFyZSBieXRlcyAoMiBkZWNpbWFsaSlcclxuICBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmICghYnl0ZXMgfHwgYnl0ZXMgPD0gMCkgcmV0dXJuICcwIEJ5dGVzJztcclxuICAgIGNvbnN0IGsgPSAxMDI0O1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XHJcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XHJcbiAgICByZXR1cm4gYCR7cGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgyKSl9ICR7c2l6ZXNbaV19YDtcclxuICB9XHJcblxyXG4gIC8vIE1vc3RyYSB0b2FzdCBjb24gYXV0b+KAkWhpZGUgZSByZXNldCBwcm9ncmVzcyBiYXIgQ1NTXHJcbiAgc2hvd1RvYXN0KG1lc3NhZ2U6IHN0cmluZywgdHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJywgZHVyYXRpb25NcyA9IDMwMDApIHtcclxuICAgIGlmICh0aGlzLnRvYXN0LnZpc2libGUgJiYgdGhpcy50b2FzdC50ZXh0ID09PSBtZXNzYWdlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYW5jZWxsYSBpbCB0aW1lb3V0IHByZWNlZGVudGUgc2UgZXNpc3RlXHJcbiAgICBpZiAodGhpcy50b2FzdC50aW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3QudGltZW91dElkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjb2xhIHVuYSBkdXJhdGEgZGluYW1pY2FcclxuICAgIGNvbnN0IGR1cmF0aW9uID0gZHVyYXRpb25NcyB8fCBNYXRoLm1heCg0MDAwLCBtZXNzYWdlLmxlbmd0aCAqIDEwMCk7XHJcblxyXG4gICAgdGhpcy50b2FzdC50ZXh0ID0gbWVzc2FnZTtcclxuICAgIHRoaXMudG9hc3QudHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLnRvYXN0LnZpc2libGUgPSB0cnVlO1xyXG5cclxuICAgIC8vIEltcG9zdGEgaWwgbnVvdm8gdGltZW91dCBwZXIgbmFzY29uZGVyZSBhdXRvbWF0aWNhbWVudGUgaWwgdG9hc3RcclxuICAgIHRoaXMudG9hc3QudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudG9hc3QudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfSwgZHVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgI2VuZHJlZ2lvblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGVxcEF0dGFjaG1lbnRTZXJ2aWNlOiBFcXBBdHRhY2htZW50U2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIC8vIEluaXppYWxpenphIG1ldHJpY2hlIGUgcHJvZ3Jlc3MgaW4gYmFzZSBhbGxvIHN0YXRvIGluaXppYWxlXHJcbiAgICB0aGlzLnJlY29tcHV0ZVRvdGFsc0FuZFByb2dyZXNzKCk7XHJcblxyXG4gICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBhbGxvcmEgaW1wb3N0YSBpbCBmaWx0cm8gcGVyIGxlIGVzdGVuc2lvbmkgcG9zc2liaWxpIGRhIGNhcmljYXJlXHJcbiAgICBpZiAoIXRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMpXHJcbiAgICAgIGlmICh0aGlzLmFsbG93T25seUltYWdlcyA9PSB0cnVlKSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gXCJpbWFnZS8qXCI7XHJcbiAgICAgIGVsc2UgdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyA9IFwiKlwiO1xyXG5cclxuICAgIC8vIFNlIG5vbiBzb25vIHN0YXRpIHNwZWNpZmljYXRpIGkgdGlwaSBkYSBnZXN0aXJlIG1hIMOoIHN0YXRvIHBhc3NhdG8gbnVsbCBvIHVuIGFycmF5IHZ1b3RvIGltcG9zdG8gaSB0aXBpIGRpIGRlZmF1bHQuXHJcbiAgICBpZiAoIXRoaXMuYWxsb3dlZFR5cGVzIHx8IHRoaXMuYWxsb3dlZFR5cGVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcyA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LLCBBdHRhY2htZW50VHlwZS5EUk9QQk9YXTtcclxuICAgIGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcy5maW5kKCh0KSA9PiB0ICE9IEF0dGFjaG1lbnRUeXBlLkZJTEUgJiYgdCAhPSBBdHRhY2htZW50VHlwZS5MSU5LICYmIHQgIT0gQXR0YWNobWVudFR5cGUuRFJPUEJPWClcclxuICAgICkge1xyXG4gICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5XYXJuaW5nKFxyXG4gICAgICAgICdBbG1lbm8gdW5vIGRlZ2xpIEF0dGFjaG1lbnRUeXBlIHNlbGV6aW9uYXRpIG5lbCBwYXJhbWV0cm8gXCJhbGxvd2VkVHlwZXNcIiBub24gZXNpc3RlLidcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5hbGxvd2VkVHlwZXMgPSBbQXR0YWNobWVudFR5cGUuRklMRSwgQXR0YWNobWVudFR5cGUuTElOSywgQXR0YWNobWVudFR5cGUuRFJPUEJPWF07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0YWNobWVudHNMaXN0ID09IG51bGwpIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAgIC8vIFNlIMOoIHN0YXRvIHBhc3NhdG8gdW4gc2luZ29sbyBhbGxlZ2F0byBsbyBhZ2dpdW5nbyBhbGxhIGxpc3RhXHJcbiAgICBpZiAodGhpcy5zaW5nbGVBdHRhY2htZW50ICE9IG51bGwgJiYgdGhpcy5hdHRhY2htZW50c0xpc3QubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5hdHRhY2htZW50c0xpc3QucHVzaCh0aGlzLnNpbmdsZUF0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hlY2tBdHRhY2htZW50SW1hZ2UoKTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgICAgdGhpcy5lcXBBdHRhY2htZW50U2VydmljZS5sb2FkRHJvcGJveFNjcmlwdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0dXBUYWJsZUNvbHVtbnMoKTtcclxuICAgIHRoaXMuc2V0dXBNZW51QWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgc2V0Vmlld01vZGUobW9kZTogJ2NhcmQnIHwgJ3RhYmxlJyk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3TW9kZSA9IG1vZGU7XHJcbiAgfVxyXG5cclxuICAvLyBSaWNhbGNvbGEgbGEgc29tbWEgcGVzYXRhIHN1Z2xpIGFsbGVnYXRpIHByZXNlbnRpXHJcbiAgcHJpdmF0ZSByZWNvbXB1dGVUb3RhbHNBbmRQcm9ncmVzcygpIHtcclxuICAgIHRoaXMudG90YWxTaXplQnl0ZXMgPSAodGhpcy5hdHRhY2htZW50c0xpc3QgfHwgW10pXHJcbiAgICAgIC5maWx0ZXIoYSA9PiAhIWEpXHJcbiAgICAgIC5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgdGhpcy5ieXRlc0Zyb21CYXNlNjQoYS5GaWxlRGF0YUJhc2U2NCB8fCBhLkZpbGVUaHVtYm5haWxCYXNlNjQgfHwgJycpLCAwKTtcclxuXHJcbiAgICAvLyBQcm9ncmVzcyBmaXR0aXppbzogMTAwJSBzZSBwcmVzZW50aSBmaWxlLCAwIHNlIHZ1b3RvXHJcbiAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9ICh0aGlzLmF0dGFjaG1lbnRzTGlzdCAmJiB0aGlzLmF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPiAwKSA/IDEwMCA6IDA7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnRvYXN0LnRpbWVvdXRJZCkgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3QudGltZW91dElkKTtcclxuICB9XHJcblxyXG4gIC8vIENhbGNvbGEgaSBieXRlIGRhIHVuYSBzdHJpbmdhIEJhc2U2NCBwdXJhIChzZW56YSBwcmVmaXNzbyBkYXRhOi4uLilcclxuICBwdWJsaWMgYnl0ZXNGcm9tQmFzZTY0KGJhc2U2NDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmICghYmFzZTY0KSByZXR1cm4gMDtcclxuICAgIC8vIFJpbXVvdmkgZXZlbnR1YWxlIHByZWZpc3NvIGRhdGEgVVJMXHJcbiAgICBjb25zdCBjb21tYUlkeCA9IGJhc2U2NC5pbmRleE9mKCcsJyk7XHJcbiAgICBjb25zdCBiNjQgPSBjb21tYUlkeCA+PSAwID8gYmFzZTY0LnN1YnN0cmluZyhjb21tYUlkeCArIDEpIDogYmFzZTY0O1xyXG4gICAgLy8gQ29udGEgcGFkZGluZ1xyXG4gICAgbGV0IHBhZGRpbmcgPSAwO1xyXG4gICAgaWYgKGI2NC5lbmRzV2l0aCgnPT0nKSkgcGFkZGluZyA9IDI7XHJcbiAgICBlbHNlIGlmIChiNjQuZW5kc1dpdGgoJz0nKSkgcGFkZGluZyA9IDE7XHJcbiAgICAvLyBGb3JtdWxhIGVzYXR0YTogKDMgKiAobGVuIC8gNCkpIC0gcGFkZGluZ1xyXG4gICAgY29uc3QgbGVuID0gYjY0Lmxlbmd0aDtcclxuICAgIHJldHVybiBNYXRoLm1heCgwLCAoMyAqIE1hdGguZmxvb3IobGVuIC8gNCkpIC0gcGFkZGluZyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0F0dGFjaG1lbnRJbWFnZSgpIHtcclxuICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LmZvckVhY2goKGEpID0+IHtcclxuICAgICAgYS5Jc0ltYWdlID0gQXR0YWNobWVudEhlbHBlclNlcnZpY2UuY2hlY2tJbWFnZUZyb21NaW1lVHlwZShhLkZpbGVDb250ZW50VHlwZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBHZXN0aW9uZSBlbGVuY28gYWxsZWdhdGlcclxuXHJcbiAgLyoqXHJcbiAgICogRWxpbWluYSB1biBhbGxlZ2F0byBlbGltaW5hbmRvIGFuY2hlIGlsIGZpbGUgcHJlc2VudGUgbmVsbG8gc3RvcmFnZSBkaSBhcmNoaXZpYXppb25lIHV0aWxpenphdG8gKEFXUyBvIGNhcnRlbGxhIHByb2dldHRvKVxyXG4gICAqIEBwYXJhbSBlbGVtZW50IElBdHRhY2htZW50RFRPIGRhIGNhbmNlbGxhcmVcclxuICAgKi9cclxuICBkZWxldGVBdHRhY2htZW50KGVsZW1lbnQ6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5Db25maXJtKFxyXG4gICAgICB0aGlzLmRlbGV0ZURpYWxvZ01lc3NhZ2UsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZUF0dGFjaG1lbnRGcm9tTGlzdCh0aGlzLmF0dGFjaG1lbnRzTGlzdC5pbmRleE9mKGVsZW1lbnQpKTtcclxuICAgICAgfSxcclxuICAgICAgdHJ1ZSxcclxuICAgICAgdGhpcy5kZWxldGVEaWFsb2dUaXRsZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpbXVvdmUgbCdhbGxlZ2F0byBzZWxlemlvbmF0byBkYWxsYSBsaXN0YSBcImF0dGFjaG1lbnRzTGlzdFwiIGUgaW52b2NhIGwnZXZlbnRvIGRpIG91dHB1dCBjaGUgcmVzdGl0dWlzY2UgbGEgbGlzdGEgYWdnaW9ybmF0YS5cclxuICAgKiBAcGFyYW0gYXR0YWNobWVudEluZGV4IEluZGljZSBkZWxsJ2F0dGFjaG1lbnQgZGEgcmltdW92ZXJlXHJcbiAgICovXHJcbiAgcmVtb3ZlQXR0YWNobWVudEZyb21MaXN0KGF0dGFjaG1lbnRJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm9uRGVsZXRlQXR0YWNobWVudC5lbWl0KHRoaXMuYXR0YWNobWVudHNMaXN0W2F0dGFjaG1lbnRJbmRleF0pO1xyXG5cclxuICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LnNwbGljZShhdHRhY2htZW50SW5kZXgsIDEpO1xyXG4gICAgdGhpcy5sb2NhbEVkaXRlZEF0dGFjaG1lbnRzLmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3QpO1xyXG5cclxuICAgIHRoaXMucmVjb21wdXRlVG90YWxzQW5kUHJvZ3Jlc3MoKTtcclxuICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVtb3ZlZExhYmVsIHx8ICdGaWxlIHJlbW92ZWQnLCAnc3VjY2VzcycpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2ltdWxhdGVQcm9ncmVzcygpIHtcclxuICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50ID0gMDtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDMwO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDYwO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnQgPSAxMDA7XHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgfSwgMjAwKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogU2NhcmljYSBsJ2FsbGVnYXRvIG8gYXByZSBpbCBsaW5rXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgQWxsZWdhdG8gZGEgbW9zdHJhcmVcclxuICAgKi9cclxuICB2aWV3QXR0YWNobWVudChhdHRhY2htZW50OiBJQXR0YWNobWVudERUTykge1xyXG4gICAgaWYgKGF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSykge1xyXG4gICAgICB3aW5kb3cub3BlbihhdHRhY2htZW50LkZpbGVQYXRoLCBcIl9ibGFua1wiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhdHRhY2htZW50LkxhcmdlRmlsZSkge1xyXG4gICAgICBjb25zdCBmaWxlID0gYXR0YWNobWVudC5MYXJnZUZpbGU7XHJcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgbGluay5ocmVmID0gdXJsO1xyXG4gICAgICBsaW5rLmRvd25sb2FkID0gYXR0YWNobWVudC5GaWxlTmFtZSB8fCBmaWxlLm5hbWU7XHJcbiAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCksIDEwMDApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiYgYXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgJiYgYXR0YWNobWVudC5GaWxlTmFtZSkge1xyXG4gICAgICBsZXQgc291cmNlID0gYGRhdGE6JHthdHRhY2htZW50LkZpbGVDb250ZW50VHlwZX07YmFzZTY0LCR7YXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NH1gO1xyXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgIGxpbmsuaHJlZiA9IHNvdXJjZTtcclxuICAgICAgbGluay5kb3dubG9hZCA9IGAke2F0dGFjaG1lbnQuRmlsZU5hbWV9YDtcclxuICAgICAgbGluay5jbGljaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kb3dubG9hZEF0dGFjaG1lbnQuZW1pdChhdHRhY2htZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpZGVmaW5pc2NlIGwnaWNvbmEgZGEgbW9zdHJhcmUgbmVsbGEgY29sb25uYSBkZWxsJ2VxcC10YWJsZSBwZXIgb2duaSBmaWxlLlxyXG4gICAqIEwnaWNvbmEgdmFyaWEgaW4gYmFzZSBhbGwnZXN0ZW5zaW9uZSBkZWwgZmlsZVxyXG4gICAqIEBwYXJhbSBhdHRhY2htZW50XHJcbiAgICovXHJcbiAgZ2V0QXR0YWNobWVudEljb24oYXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIGlmIChhdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHJldHVybiBcImZhcyBmYS1saW5rXCI7XHJcbiAgICBlbHNlIHJldHVybiBBdHRhY2htZW50SGVscGVyU2VydmljZS5nZXRJY29uRnJvbUZpbGVFeHRlbnNpb25lKGF0dGFjaG1lbnQuRmlsZUV4dGVuc2lvbik7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogSW4gY2FzbyBkaSBhbGxlZ2F0byBzaW5nb2xvLCBzY2VnbGllIHF1YWxlIG1ldG9kbyByaWNoaWFtYXJlIGluIGJhc2UgYWwgdGlwbyBkaSBhbGxlZ2F0b1xyXG4gICAqL1xyXG4gIGFkZEZpbGUoYXR0YWNobWVudFR5cGU6IEF0dGFjaG1lbnRUeXBlLCBpbWFnZUlucHV0ID0gbnVsbCkge1xyXG4gICAgaWYgKGF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgdGhpcy5zd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKCk7XHJcbiAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUpIHtcclxuICAgICAgaW1hZ2VJbnB1dC5jbGljaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaG9vc2VEcm9wYm94RmlsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlQXR0YWNobWVudEZvcm0oKSB7XHJcbiAgICAvL0NyZWEgbGEgZm9ybSBwZXIgbGEgdmFsaWRhemlvbmUgZGVpIGNhbXBpXHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFt0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBuYW1lOiBbdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lXSxcclxuICAgICAgcGF0aDogW3RoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aF0sXHJcbiAgICAgIGN1c3RvbUhlaWdodDogW3RoaXMuY3VzdG9tSGVpZ2h0XSxcclxuICAgICAgY3VzdG9tV2lkdGg6IFt0aGlzLmN1c3RvbVdpZHRoXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZShlbWl0Q2xvc2VFdmVudCA9IHRydWUpIHtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudCA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG4gICAgdGhpcy5hYm9ydEZpbGUoKTtcclxuICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnRGb3JtKSB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLnJlc2V0KCk7XHJcblxyXG4gICAgdGhpcy5kaWFsb2dSZWZDcm9wSW1hZ2UuY2xvc2UoKTtcclxuICAgIHRoaXMucmVzdG9yZU9yaWdpbmFsRGltZW5zaW9ucygpO1xyXG5cclxuICAgIGlmIChlbWl0Q2xvc2VFdmVudCA9PSB0cnVlICYmIHRoaXMuYWJvcnRBZGRBdHRhY2htZW50KSB0aGlzLmFib3J0QWRkQXR0YWNobWVudC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbiBiYXNlIGFsIHRpcG8gZGkgYWxsZWdhdG8gY29udHJvbGxhIHNlIGRpc2FiaWxpdGFyZSBvIG1lbm8gaWwgcHVsc2FudGUgcGVyIHNhbHZhcmUuXHJcbiAgICogRnVuemlvbmUgdXNhdGEgbmVsIFtkaXNhYmxlXSBkZWwgcHVsc2FudGUgXCJTYWx2YVwiIGRlbCBkaWFsb2cgcGVyIGwnYWdnaXVudGEgZGkgdW4gYWxsZWdhdG8uXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBkaXNhYmxlU2F2ZSgpIHtcclxuICAgIGlmICh0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpIHtcclxuICAgICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiYgIXRoaXMubmV3QXR0YWNobWVudC5MYXJnZUZpbGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZVBhdGg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzLmZpbHRlcihcclxuICAgICAgICAgIChwKSA9PlxyXG4gICAgICAgICAgICAocC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFICYmICFwLkZpbGVEYXRhQmFzZTY0ICYmICFwLkxhcmdlRmlsZSkgfHxcclxuICAgICAgICAgICAgKHAuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhcC5GaWxlUGF0aClcclxuICAgICAgICApLmxlbmd0aCA+IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbmZpcm1BZGRBdHRhY2htZW50KCkge1xyXG4gICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlICYmIHRoaXMuaW1hZ2VDcm9wcGVyKSB7XHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuaW1hZ2VDcm9wcGVyLmNyb3AoKS5iYXNlNjQuc3BsaXQoXCI7YmFzZTY0LFwiKVsxXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lKVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IHRoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKSB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LnB1c2godGhpcy5uZXdBdHRhY2htZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMgPT0gbnVsbCB8fCB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMubGVuZ3RoID09IDApIHJldHVybjtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKSB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gdGhpcy5hdHRhY2htZW50c0xpc3QuY29uY2F0KHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2NhbEVkaXRlZEF0dGFjaG1lbnRzLmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3QpO1xyXG5cclxuICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZkNyb3BJbWFnZS5jbG9zZSgpO1xyXG4gICAgICB0aGlzLnJlc3RvcmVPcmlnaW5hbERpbWVuc2lvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50Rm9ybSkgdGhpcy5uZXdBdHRhY2htZW50Rm9ybS5yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzZXRTZWxlY3RlZEZpbGVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyAyLiBSRVNFVCBUT1RBTEU6IFN2dW90aWFtbyBsZSBwcm9wcmlldMOgIGRpIGNsYXNzZSBwZXIgZXZpdGFyZSBjaGUgXHJcbiAgLy8gcmVzaWR1aSBkaSB1cGxvYWQgcHJlY2VkZW50aSAoc2luZ29saSBvIG11bHRpcGxpKSB2ZW5nYW5vIHRyYXNjaW5hdGkuXHJcbiAgcHJpdmF0ZSByZXNldFNlbGVjdGVkRmlsZXMoKSB7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHJlIGlsIGRpYWxvZyBwZXIgbCdhbnRlcHJpbWEgZGVsbCdhbGxlZ2F0byBzZWxlemlvbmF0by5cclxuICAgKiBAcGFyYW0gcm93XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBvcGVuUHJldmlld0RpYWxvZyhyb3c6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudCA9IHsgLi4ucm93IH07XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmdldEF0dGFjaG1lbnRFbmRwb2ludCAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5Jc0ltYWdlICYmICF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEF0dGFjaG1lbnRCeUlEKClcclxuICAgICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHJlcy5GaWxlRGF0YUJhc2U2NDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5FcnJvcihlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGhcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aChcInZpZGVvL1wiKSAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5MYXJnZUZpbGUpIHtcclxuICAgICAgY29uc3QgdmlkZW9VcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkxhcmdlRmlsZSk7XHJcbiAgICAgIC8vIFVzaWFtbyBieXBhc3NTZWN1cml0eVRydXN0VXJsIHBlciBsYSBzb3JnZW50ZSBkZWwgdmlkZW9cclxuICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwodmlkZW9VcmwpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LklzSW1hZ2UgJiZcclxuICAgICAgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ICYmXHJcbiAgICAgICF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0XHJcbiAgICApIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuSW5mbyhcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkZWxsJ2FsbGVnYXRvLCBmaWxlIG1hbmNhbnRlLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKFxyXG4gICAgICAgIGBkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJHt0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NH1gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGggJiYgdGhpcy5wcm9kdWN0aW9uQmFzZVVybCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXHJcbiAgICAgICAgICBcImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2d2aWV3P3VybD1cIiArXHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3Rpb25CYXNlVXJsICtcclxuICAgICAgICAgIFwiL1wiICtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVQYXRoICtcclxuICAgICAgICAgIFwiJmVtYmVkZGVkPXRydWVcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuSW5mbyhcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkZWwgZG9jdW1lbnRvIVwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nUHJldmlldywge1xyXG4gICAgICBwYW5lbENsYXNzOiAnZXFwLWF0dGFjaG1lbnRzLXByZXZpZXctZGlhbG9nJyxcclxuICAgICAgbWF4V2lkdGg6ICc5NXZ3JyxcclxuICAgICAgd2lkdGg6IHJvdy5Jc0ltYWdlIHx8IHJvdy5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpID8gJ2F1dG8nIDogJzExMDBweCcsXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQdWxpemlhIGRlbGxhIG1lbW9yaWEgcXVhbmRvIGlsIGRpYWxvZyBzaSBjaGl1ZGVcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudD8uRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKFwidmlkZW8vXCIpKSB7XHJcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsIGFzIGFueSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0QXR0YWNobWVudEJ5SUQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SUF0dGFjaG1lbnREVE8+KHRoaXMuZ2V0QXR0YWNobWVudEVuZHBvaW50LCB0aGlzLnNlbGVjdGVkQXR0YWNobWVudCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR2VzdGlvbmUgY2FyaWNhbWVudG8gZmlsZVxyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gc2NhdGVuYXRvIGFsbGEgc2VsZXppb25lIGRlbCBmaWxlIChvIGRlaSBmaWxlKS5cclxuICAgKiBTZSBpbCBjYXJpY2FtZW50byDDqCBTSU5HT0xPIG8gc2UgY29tdW5xdWUgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gc29sbyBmaWxlIGFsbG9yYSBzaSBvY2N1cGEgZGkgY29udHJvbGxhcmUgc2Ugc2kgdHJhdHRhIGRpIHVuIGltbWFnaW5lIGluIG1vZG8gZGFcclxuICAgKiBtb3N0cmFyZSBsZSBmdW56aW9uYWxpdMOgIGRlbCBjcm9wcGllIChwZXIgcml0YWdsaWFyZSBsJ2ltbWFnaW5lKSBvcHB1cmUgbm8uXHJcbiAgICogU2UgaWwgZmlsZSBjYXJpY2F0byBub24gw6ggdW4gaW1tYWdpbmUgYWxsb3JhIGdlbmVyYSBkaXJldHRhbWVudGUgaWwgYmFzZTY0IGUgbG8gYXNzb2NpYSBhbGwnYWxsZWdhdG8gZGEgc2FsdmFyZS5cclxuICAgKiBTZSBpbnZlY2UgaWwgY2FyaWNhbWVudG8gZGVpIGZpbGUgw6ggTVVMVElQTE8gZSBzb25vIHByZXNlbnRpIHBpw7kgZmlsZSBhbGxvcmEgZXNlZ3VlIGxlIHN0ZXNzZSBvcGVyYXppb25pIGlnbm9yYW5kbyBwZXLDsiBpbCBjb250cmxsb1xyXG4gICAqIGltbWFnaW5lIHBlciBpbCBjcm9wcGllIChpbiBjYXNvIGRpIGNhcmljYW1lbnRvIG11bHRpcGxvIGxlIGZ1bnppb25hbGl0w6AgZGVsIGNyb3BwaWUgc29ubyBkaXNhYmlsaXRhdGUpLlxyXG4gICAqL1xyXG4gIGFzeW5jIG9uRmlsZUFkZGVkKGV2ZW50LCBpc0ZpbGVEcm9wcGVkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkluZm8oXCJDYXJpY2FtZW50byBhbGxlZ2F0aSBub24gZGlzcG9uaWJpbGUuXCIpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnJlc2V0U2VsZWN0ZWRGaWxlcygpO1xyXG5cclxuICAgIGNvbnN0IGZpbGVzT25JbnB1dDogRmlsZVtdID0gaXNGaWxlRHJvcHBlZFxyXG4gICAgICA/IChldmVudCBhcyBGaWxlW10pXHJcbiAgICAgIDogQXJyYXkuZnJvbSgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy5maWxlcyB8fCBbXSk7XHJcblxyXG4gICAgY29uc3QgeyB2YWxpZEZpbGVzLCBvdmVyc2l6ZWRGaWxlcyB9ID0gdGhpcy52YWxpZGF0aW9uRmlsZShmaWxlc09uSW5wdXQpO1xyXG5cclxuICAgIGlmICghdmFsaWRGaWxlcyB8fCB2YWxpZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBpZiAoIWlzRmlsZURyb3BwZWQgJiYgZXZlbnQ/LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9TZSDDqCBzdGF0byByaWNoaWVzdG8gaWwgY2FyaWNhbWVudG8gU0lOR09MTyBvcHB1cmUgc2UgaWwgY2FyaWNhbWVudG8gw6ggTVVMVElQTE8gbWEgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gc29sbyBmaWxlXHJcbiAgICAvL2FsbG9yYSB2ZXJpZmljYSBzZSBpbCBmaWxlIMOoIHVuIGltbWFnaW5lIChwZXIgbW9zdHJhcmUgaWwgQ1JPUFBJRSlcclxuICAgIGlmIChbLi4udmFsaWRGaWxlc10ubGVuZ3RoID09IDEgfHwgdGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gdmFsaWRGaWxlc1swXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gdmFsaWRGaWxlcztcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgLy9NZW1vcml6emEgaSBkYXRpIHBlciBsJ2FsbGVnYXRvXHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IGF3YWl0IHRoaXMuY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUodGhpcy5zZWxlY3RlZEZpbGUsIGZhbHNlKTtcclxuICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG4gICAgICB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMucHVzaCh0aGlzLm5ld0F0dGFjaG1lbnQpO1xyXG5cclxuICAgICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBtYSBwZXIgZXJyb3JlIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIGZpbGUgY2hlIG5vbiDDqCB1biBpbW1hZ2luZVxyXG4gICAgICBsZXQgY2hlY2tPbmx5SW1hZ2UgPSB0aGlzLmNoZWNrQWxsb3dPbmx5SW1hZ2VGaWxlKHRoaXMubmV3QXR0YWNobWVudCk7XHJcbiAgICAgIGlmIChjaGVja09ubHlJbWFnZSA9PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5jcmVhdGVBdHRhY2htZW50Rm9ybSgpO1xyXG5cclxuICAgICAgLy9WZXJpZmljYSBzZSBpbCBmaWxlIGNhcmljYXRvIMOoIHVuJ2ltbWFnaW5lIG9wcHVyZSBuby4gU2Ugw6ggdW4gaW1tYWdpbmUsIHByaW1hIGRpIGNhcmljYXJsYSBtb3N0cmEgaWwgY3JvcHBpZSBwZXIgaWwgcmVzaXplLlxyXG4gICAgICAvL1NlIG5vbiDDqCB1biBpbW1hZ2luZSBhbGxvcmEgZ2VuZXJhIGlsIEJhc2U2NFxyXG4gICAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LklzSW1hZ2UgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0SW1hZ2VEaW1lbnNpb25zKHZhbGlkRmlsZXNbMF0pO1xyXG5cclxuICAgICAgICAvL01vc3RyYSBpbCBjcm9wcGllIGUgZGlzYWJpbGl0YSBsYSBmb3JtIGZpbmNow6ggbm9uIHRlcm1pbmEgbGEgbW9kaWZpY2EgZGVsbCdpbW1hZ2luZVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uY29udHJvbHNbXCJjdXN0b21XaWR0aFwiXS5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLmNvbnRyb2xzW1wiY3VzdG9tSGVpZ2h0XCJdLmVuYWJsZSgpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93Q3JvcEltYWdlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VGaWxlID0gZXZlbnQ7XHJcblxyXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWZDcm9wSW1hZ2UgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nQ3JvcEltYWdlLCB7XHJcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIHdpZHRoOiBcIjYwJVwiLFxyXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IFwiODAlXCIsXHJcbiAgICAgICAgICAgIG1heFdpZHRoOiBcIjcwdmhcIixcclxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydlcXAtYXR0YWNobWVudHMtZGlhbG9nJywgJ2Nyb3AtZGlhbG9nJ11cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBiYXNlNjRSZXN1bHQgPSBhd2FpdCB0aGlzLmdldEJhc2U2NEZyb21GaWxlKHRoaXMuc2VsZWN0ZWRGaWxlKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBiYXNlNjRSZXN1bHQuQmFzZTY0RmlsZTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gYmFzZTY0UmVzdWx0LkNvbnRlbnRUeXBlO1xyXG4gICAgICAgIHRoaXMuY29uZmlybUFkZEF0dGFjaG1lbnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IHZhbGlkRmlsZXM7XHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpbGVzIHx8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMpIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IGF3YWl0IHRoaXMuY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXNbaV0sXHJcbiAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBtYSBwZXIgZXJyb3JlIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIGZpbGUgY2hlIG5vbiDDqCB1biBpbW1hZ2luZVxyXG4gICAgICAgIGxldCBjaGVja09ubHlJbWFnZSA9IHRoaXMuY2hlY2tBbGxvd09ubHlJbWFnZUZpbGUobmV3QXR0YWNobWVudCk7XHJcbiAgICAgICAgaWYgKGNoZWNrT25seUltYWdlID09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cy5wdXNoKG5ld0F0dGFjaG1lbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29uZmlybUFkZEF0dGFjaG1lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlY29tcHV0ZVRvdGFsc0FuZFByb2dyZXNzKCk7XHJcbiAgICB0aGlzLnNpbXVsYXRlUHJvZ3Jlc3MoKTtcclxuICAgIC8vIENhc28gMTogU3VjY2Vzc28gUGFyemlhbGUgKGFsY3VuaSBmaWxlIHZhbGlkaSwgYWx0cmkgbm8pXHJcbiAgICBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID4gMCAmJiB2YWxpZEZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZU5hbWVzID0gb3ZlcnNpemVkRmlsZXMuam9pbignLCAnKTtcclxuICAgICAgdGhpcy5zaG93VG9hc3QoXHJcbiAgICAgICAgYCR7dmFsaWRGaWxlcy5sZW5ndGh9IGZpbGUgYWdnaXVudGkuICR7b3ZlcnNpemVkRmlsZXMubGVuZ3RofSBub24gY2FyaWNhdGkgcGVyY2jDqSB0cm9wcG8gZ3JhbmRpICgke2ZpbGVOYW1lc30pLmAsXHJcbiAgICAgICAgJ2Vycm9yJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gQ2FzbyAyOiBOZXNzdW4gZmlsZSB2YWxpZG9cclxuICAgIGVsc2UgaWYgKG92ZXJzaXplZEZpbGVzLmxlbmd0aCA+IDAgJiYgdmFsaWRGaWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgIH1cclxuICAgIC8vIENhc28gMzogVHV0dGkgaSBmaWxlIHZhbGlkaVxyXG4gICAgZWxzZSBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID09PSAwICYmIHZhbGlkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnNob3dUb2FzdChcclxuICAgICAgICBgJHt2YWxpZEZpbGVzLmxlbmd0aH0gJHt0aGlzLmFkZGVkU3VjY2Vzc2Z1bGx5TGFiZWwgfHwgJ2ZpbGUocykgYWdnaXVudGkgY29uIHN1Y2Nlc3NvLid9YCxcclxuICAgICAgICAnc3VjY2VzcydcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1Jlc2V0dG8gaWwgdmFsb3JlIGRlbCBmaWxlIGlucHV0IGluIG1vZG8gZGEgc2NhdGVuYXJlIGlsIGNoYW5nZSBhbmNoZSBzZSBzaSBkb3Zlc3NlIGNhcmljYXJlIGxvIHN0ZXNzbyBmaWxlXHJcbiAgICBpZiAoIWlzRmlsZURyb3BwZWQpIGV2ZW50LnRhcmdldC52YWx1ZSA9IFwiXCI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbGlkYXRpb25GaWxlKGZpbGVzT25JbnB1dDogRmlsZVtdKSB7XHJcbiAgICBjb25zdCB2YWxpZEZpbGVzOiBGaWxlW10gPSBbXTtcclxuICAgIGNvbnN0IG92ZXJzaXplZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlc09uSW5wdXQpIHtcclxuICAgICAgY29uc3QgZmlsZVNpemVNQiA9IGZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xyXG4gICAgICBpZiAoZmlsZVNpemVNQiA+IHRoaXMubWF4RmlsZVNpemVNQikge1xyXG4gICAgICAgIG92ZXJzaXplZEZpbGVzLnB1c2goZmlsZS5uYW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlTmFtZXMgPSBvdmVyc2l6ZWRGaWxlcy5qb2luKCcsICcpO1xyXG4gICAgICB0aGlzLnNob3dUb2FzdChcclxuICAgICAgICBgRmlsZShzKSB0cm9wcG8gZ3JhbmRpOiAke2ZpbGVOYW1lc30uIExpbWl0ZTogJHt0aGlzLm1heEZpbGVTaXplTUJ9TUJgLFxyXG4gICAgICAgICdlcnJvcidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB2YWxpZEZpbGVzLCBvdmVyc2l6ZWRGaWxlcyB9O1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEEgcGFydGlyZSBkYWwgRklMRSByaWNldnV0byBpbiBpbnB1dCByaWNvc3RydWlzY2UgbCdvZ2dldHRvIElBdHRhY2htZW50RFRPIGUgbG8gcmVzdGl0dWlzY2UuXHJcbiAgICogU2UgaWwgcGFyYW1ldHJvIGdldEJhc2U2NCB2aWVuZSBwYXNzYXRvIGEgVFJVRSBhbGxvcmEsIHNlbXByZSBhIHBhcnRpcmUgZGFsIGZpbGUsZ2VuZXJhIGlsIGJhc2U2NCBlXHJcbiAgICogcmljYXZhIGlsIENvbnRlbnRUeXBlIGRhIGFzc29jaWFyZSBhbGwnb2dnZXR0byBJQXR0YWNobWVudERUTyBkYSByZXN0aXR1aXJlXHJcbiAgICogQHBhcmFtIGN1cnJlbnRGaWxlIE9nZ2V0dG8gRklMRSBkYSBwcm9jZXNzYXJlXHJcbiAgICogQHBhcmFtIGdldEJhc2U2NCBTZSBUUlVFIGFsbG9yYSBjYWxjb2xhIGJhc2U2NCBlIENvbnRlbnRUeXBlIGRlbCBmaWxlIHBhc3NhdG8gaW4gaW5wdXRcclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1biBvZ2dldHRvIGRpIHRpcG8gSUF0dGFjaG1lbnREVE9cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUF0dGFjaG1lbnRGcm9tVXBsb2FkZWRGaWxlKFxyXG4gICAgY3VycmVudEZpbGU6IEZpbGUsXHJcbiAgICBnZXRCYXNlNjQ6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgY3JvcEZpbGU6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICk6IFByb21pc2U8SUF0dGFjaG1lbnREVE8+IHtcclxuICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgLy9NZW1vcml6emEgaSBkYXRpIHBlciBsJ2FsbGVnYXRvXHJcbiAgICBuZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID0gQXR0YWNobWVudFR5cGUuRklMRTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gY3VycmVudEZpbGUudHlwZTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZU5hbWUgPSBjdXJyZW50RmlsZS5uYW1lO1xyXG4gICAgbmV3QXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uID0gY3VycmVudEZpbGUubmFtZS5zdWJzdHIoY3VycmVudEZpbGUubmFtZS5sYXN0SW5kZXhPZihcIi5cIikgKyAxKTtcclxuICAgIG5ld0F0dGFjaG1lbnQuSXNJbWFnZSA9IEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmNoZWNrSW1hZ2VGcm9tTWltZVR5cGUoY3VycmVudEZpbGUudHlwZSk7XHJcblxyXG4gICAgY29uc3QgZmlsZVNpemVNQiA9IGN1cnJlbnRGaWxlLnNpemUgLyAxMDI0IC8gMTAyNDtcclxuICAgIGNvbnN0IGlzTGFyZ2VGaWxlID0gZmlsZVNpemVNQiA+IHRoaXMuYmFzZTY0TGltaXRNQjtcclxuICAgIGNvbnN0IGlzVmlkZW8gPSBjdXJyZW50RmlsZS50eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvJyk7XHJcblxyXG4gICAgaWYgKGlzVmlkZW8pIHtcclxuICAgICAgbGV0IGZpbmFsRmlsZTogRmlsZSB8IEJsb2IgPSBjdXJyZW50RmlsZTtcclxuXHJcbiAgICAgIC8vIE1pbmlhdHVyYSBkZWwgdmlkZW9cclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVZpZGVvVGh1bWJuYWlsKGN1cnJlbnRGaWxlKTtcclxuXHJcbiAgICAgIC8vIFNlIGxhIGNvbXByZXNzaW9uZSDDqCBhYmlsaXRhdGEsIGVsYWJvcmlhbW8gaWwgdmlkZW9cclxuICAgICAgaWYgKHRoaXMudmlkZW9Db21wcmVzc2lvbi5lbmFibGVkKSB7XHJcbiAgICAgICAgLy8gdGhpcy5zaG93VG9hc3QoXCJDb21wcmVzc2lvbmUgdmlkZW8gaW4gY29yc28uLi5cIiwgXCJpbmZvXCIpO1xyXG4gICAgICAgIGZpbmFsRmlsZSA9IGF3YWl0IHRoaXMuY29tcHJlc3NWaWRlb05hdGl2ZShjdXJyZW50RmlsZSwgdGhpcy52aWRlb0NvbXByZXNzaW9uKTtcclxuXHJcbiAgICAgICAgLy8gQWdnaW9ybmlhbW8gaSBkYXRpIGRlbGwnYWxsZWdhdG8gY29uIGlsIG51b3ZvIGZpbGUgY29tcHJlc3NvXHJcbiAgICAgICAgbmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IGN1cnJlbnRGaWxlLm5hbWUucmVwbGFjZSgvXFwuW14vLl0rJC8sIFwiXCIpICsgXCIud2VibVwiO1xyXG4gICAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gXCJ2aWRlby93ZWJtXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuTGFyZ2VGaWxlID0gZmluYWxGaWxlIGFzIEZpbGU7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuSXNMYXJnZUZpbGUgPSB0cnVlO1xyXG4gICAgICByZXR1cm4gbmV3QXR0YWNobWVudDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNMYXJnZUZpbGUpIHtcclxuICAgICAgLy8gQ0FTTyBMQVJHRSBGSUxFOlxyXG4gICAgICAvLyBQb3BvbGlhbW8gT3JpZ2luYWxGaWxlIGUgZm9yemlhbW8gaWwgQmFzZTY0IGEgbnVsbC5cclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IG51bGw7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuTGFyZ2VGaWxlID0gY3VycmVudEZpbGU7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuSXNMYXJnZUZpbGUgPSB0cnVlO1xyXG4gICAgICBnZXRCYXNlNjQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ2V0QmFzZTY0ID09IHRydWUpIHtcclxuICAgICAgbGV0IGJhc2U2NFJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0QmFzZTY0RnJvbUZpbGUoY3VycmVudEZpbGUpO1xyXG4gICAgICBuZXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gYmFzZTY0UmVzdWx0LkJhc2U2NEZpbGU7XHJcbiAgICAgIGlmICghbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgJiYgYmFzZTY0UmVzdWx0LkNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBiYXNlNjRSZXN1bHQuQ29udGVudFR5cGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdBdHRhY2htZW50LklzSW1hZ2UgJiYgbmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCAmJiBjcm9wRmlsZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q3JvcHBlZEFuZFVwbG9hZChgZGF0YToke2Jhc2U2NFJlc3VsdC5Db250ZW50VHlwZX07YmFzZTY0LCR7YmFzZTY0UmVzdWx0LkJhc2U2NEZpbGV9YCwgbmV3QXR0YWNobWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3QXR0YWNobWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgcGFydGlyZSBkYWwgZmlsZSBwYXNzYXRvIGluIGlucHV0IHJlc3RpdHVpc2NlIHVuIG9nZ2V0dG9cclxuICAgKiBjb250ZW5lbnRlIGlsIGJhc2U2NCBkZWwgZmlsZSBlIGlsIHN1byBjb250ZW50VHlwZVxyXG4gICAqIEBwYXJhbSBjdXJyZW50RmlsZSBPZ2dldHRvIEZpbGUgZGEgY3VpIGVzdHJhcG9sYXJlIGJhc2U2NCBlIGNvbnRlbnRUeXBlXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW4gb2dnZXR0byBhdmVudGUgbGUgcHJvcHJpZXTDoCBCYXNlNjRGaWxlIGUgQ29udGVudFR5cGVcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGdldEJhc2U2NEZyb21GaWxlKGN1cnJlbnRGaWxlOiBGaWxlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGZpbGVTaXplTUIgPSBjdXJyZW50RmlsZS5zaXplIC8gMTAyNCAvIDEwMjQ7XHJcbiAgICBpZiAoZmlsZVNpemVNQiA+IHRoaXMuYmFzZTY0TGltaXRNQikge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIEJhc2U2NEZpbGU6IG51bGwsXHJcbiAgICAgICAgQ29udGVudFR5cGU6IGN1cnJlbnRGaWxlLnR5cGVcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIC8vIFByb2NlZHVyYSBzdGFuZGFyZFxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGJhc2U2NEZpbGUgPSBhd2FpdCB0b0Jhc2U2NChjdXJyZW50RmlsZSk7XHJcbiAgICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gbnVsbDtcclxuICAgICAgaWYgKGJhc2U2NEZpbGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IGJhc2U2NEZpbGUuc3BsaXQoXCIsXCIpWzBdLnNwbGl0KFwiOlwiKVsxXS5zcGxpdChcIjtcIilbMF07XHJcbiAgICAgICAgYmFzZTY0RmlsZSA9IGJhc2U2NEZpbGUuc3BsaXQoXCIsXCIpWzFdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgQmFzZTY0RmlsZTogYmFzZTY0RmlsZSxcclxuICAgICAgICBDb250ZW50VHlwZTogY29udGVudFR5cGVcclxuICAgICAgfTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIHJldHVybiB7IEJhc2U2NEZpbGU6IG51bGwsIENvbnRlbnRUeXBlOiBudWxsIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgaWwgZmlsZSBjaGUgc2kgc3RhIGNhcmljYW5kbyDDqCBzdXBwb3J0YXRvIGRhbCBzaXN0ZW1hLlxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja0FjY2VwdGVkRmlsZXMoKTogYm9vbGVhbiB7XHJcbiAgICAvLyBTZSBhY2NldHRvIHR1dHRvLCBlc2NvIHN1Yml0b1xyXG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPT09IFwiKlwiKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBpc1R5cGVWYWxpZCA9IChtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIGlmICghbWltZVR5cGUpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIC8vIENvbnRyb2xsbyBjb3JyaXNwb25kZW56YSBlc2F0dGEgKGVzLiBpbWFnZS9wbmcpXHJcbiAgICAgIGlmICh0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLmluY2x1ZGVzKG1pbWVUeXBlKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjb25zdCB3aWxkY2FyZHMgPSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLnNwbGl0KFwiLFwiKS5maWx0ZXIodCA9PiB0LmluY2x1ZGVzKFwiKlwiKSk7XHJcbiAgICAgIGZvciAobGV0IHQgb2Ygd2lsZGNhcmRzKSB7XHJcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdC5zcGxpdChcIipcIilbMF07IC8vIFByZW5kZSBcImltYWdlL1wiIGRhIFwiaW1hZ2UvKlwiXHJcbiAgICAgICAgaWYgKG1pbWVUeXBlLnN0YXJ0c1dpdGgocHJlZml4KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT09IHRydWUpIHtcclxuICAgICAgLy8gQ2FzbyBTaW5nb2xvXHJcbiAgICAgIHJldHVybiBpc1R5cGVWYWxpZCh0aGlzLnNlbGVjdGVkRmlsZS50eXBlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENhc28gTXVsdGlwbG86IFRVVFRJIGkgZmlsZSBzZWxlemlvbmF0aSBkZXZvbm8gZXNzZXJlIHZhbGlkaVxyXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkRmlsZXMpLmV2ZXJ5KGZpbGUgPT4gaXNUeXBlVmFsaWQoZmlsZS50eXBlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZSBlcXAtYXR0YWNobWVudHMgw6ggc3RhdGEgY29uZmlndXJhdGEgcGVyIGlsIGNhcmljYW1lbnRvIGRlbGxlIHNvbGUgaW1tYWdpbmkgYWxsb3JhIHZlcmlmaWNhIGNoZSBpbCBmaWxlIHBhc3NhdG8gaW5cclxuICAgKiBpbnB1dCBzaWEgZWZmZXR0aXZhbWVudGUgdW4gaW1tYWdpbmUgbyBuby5cclxuICAgKiBTZSBpbCBjb250cm9sbG8gdmEgYSBidW9uIGZpbmUgcmVzdGl0dWlzY2UgVFJVRSBhbHRyaW1lbnRpIG1vc3RyYSB1biBtZXNzYWdnaW8gZCdlcnJvcmUgZSByZXN0aXR1aXNjZSBGQUxTRVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tBbGxvd09ubHlJbWFnZUZpbGUobmV3QXR0YWNobWVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuYWxsb3dPbmx5SW1hZ2VzID09IHRydWUgJiYgbmV3QXR0YWNobWVudC5Jc0ltYWdlICE9IHRydWUpIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuRXJyb3IodGhpcy5ub0ltYWdlU2VsZWN0ZWRFcnJvck1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLmFib3J0RmlsZSgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmNoZWNrQWNjZXB0ZWRGaWxlcygpKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkVycm9yKHRoaXMud3JvbmdUeXBlU2VsZWN0ZWRFcnJvck1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLmFib3J0RmlsZSgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR2VzdGlvbmUgY3JvcCBmaWxlXHJcblxyXG4gIGdldEltYWdlRGltZW5zaW9ucyhpbWc6IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gKHJzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEhlaWdodCA9IHJzLmN1cnJlbnRUYXJnZXRbXCJoZWlnaHRcIl07XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbFdpZHRoID0gcnMuY3VycmVudFRhcmdldFtcIndpZHRoXCJdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vcmlnaW5hbFdpZHRoID4gMTI4MCkge1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21XaWR0aCA9IDEyODA7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKDEyODAgKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gcnMuY3VycmVudFRhcmdldFtcImhlaWdodFwiXTtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tV2lkdGggPSBycy5jdXJyZW50VGFyZ2V0W1wid2lkdGhcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGltZyk7XHJcbiAgfVxyXG5cclxuICByZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKCkge1xyXG4gICAgdGhpcy5jdXN0b21XaWR0aCA9IHRoaXMub3JpZ2luYWxXaWR0aDtcclxuICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gdGhpcy5vcmlnaW5hbEhlaWdodDtcclxuICAgIHRoaXMuY2FudmFzUm90YXRpb24gPSAwO1xyXG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7fTtcclxuICB9XHJcblxyXG4gIG9uRGltZW5zaW9uc0NoYW5nZShkaW1lbnNpb246IHN0cmluZykge1xyXG4gICAgaWYgKGRpbWVuc2lvbiA9PSBcIkhcIikge1xyXG4gICAgICB0aGlzLmN1c3RvbVdpZHRoID0gTWF0aC5yb3VuZCgodGhpcy5jdXN0b21IZWlnaHQgKiB0aGlzLm9yaWdpbmFsV2lkdGgpIC8gdGhpcy5vcmlnaW5hbEhlaWdodCk7XHJcbiAgICB9IGVsc2UgaWYgKGRpbWVuc2lvbiA9PSBcIldcIikge1xyXG4gICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKHRoaXMuY3VzdG9tV2lkdGggKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbWFnZUNyb3BwZWQoZXZlbnQ6IEltYWdlQ3JvcHBlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IGV2ZW50LmJhc2U2NDtcclxuICAgIHRoaXMuZ2V0Q3JvcHBlZEFuZFVwbG9hZCh0aGlzLmNyb3BwZWRJbWFnZSwgdGhpcy5uZXdBdHRhY2htZW50KTtcclxuICB9XHJcblxyXG4gIGdldENyb3BwZWRBbmRVcGxvYWQoZmlsZSwgbmV3QXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICB2YXIgZmlsZTogYW55ID0gYmFzZTY0VG9GaWxlKGZpbGUpO1xyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbXByZXNzaW9uT3B0aW9ucztcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXByaW1lIGwnaW1tYWdpbmUgcGFzc2FuZG8gY29tZSBwYXJhbWV0cmkgbGUgb3B0aW9ucyBjcmVhdGUgbmVsbCdvZ2dldHRvIHNvcHJhLCBlIGlsIGZpbGUgZGFsIHJlYWRlciBwcmluY2lwYWxlXHJcbiAgICAgKi9cclxuICAgIGltYWdlQ29tcHJlc3Npb24oZmlsZSwgb3B0aW9ucykudGhlbigoZmlsZUNvbXByZXNzZWQpID0+IHtcclxuICAgICAgbGV0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgLy9GYWNjaW8gbGEgcHVzaCBkaSBvZ25pIGZpbGUgYWxsJ2ludGVybm8gZGVsbCdhcnJheSBkaSBmaWxlIGRlbGwnaXRlbSBkYSBtYW5kYXJlIGFsIHNlcnZlclxyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcmVzdWx0UmVhZGVyID0gPHN0cmluZz5maWxlUmVhZGVyLnJlc3VsdDtcclxuICAgICAgICB2YXIgbWFya2VyID0gXCI7YmFzZTY0LFwiO1xyXG4gICAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSByZXN1bHRSZWFkZXIuc3Vic3RyaW5nKHJlc3VsdFJlYWRlci5pbmRleE9mKG1hcmtlcikgKyBtYXJrZXIubGVuZ3RoKTtcclxuICAgICAgICBzZWxmLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc2VsZi5uZXdBdHRhY2htZW50Rm9ybSkge1xyXG4gICAgICAgICAgc2VsZi5uZXdBdHRhY2htZW50Rm9ybS5lbmFibGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZUNvbXByZXNzZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByb3RhdGVMZWZ0KCkge1xyXG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbi0tO1xyXG4gICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZVJpZ2h0KCkge1xyXG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbisrO1xyXG4gICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmxpcEFmdGVyUm90YXRlKCkge1xyXG4gICAgY29uc3QgZmxpcHBlZEggPSB0aGlzLnRyYW5zZm9ybS5mbGlwSDtcclxuICAgIGNvbnN0IGZsaXBwZWRWID0gdGhpcy50cmFuc2Zvcm0uZmxpcFY7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBIOiBmbGlwcGVkVixcclxuICAgICAgZmxpcFY6IGZsaXBwZWRIXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZmxpcEhvcml6b250YWwoKSB7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBIOiAhdGhpcy50cmFuc2Zvcm0uZmxpcEhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBmbGlwVmVydGljYWwoKSB7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBWOiAhdGhpcy50cmFuc2Zvcm0uZmxpcFZcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogQW5udWxsYSBsYSBzZWxlemlvbmUgZGVsIGZpbGUsIHN2dW90YW5kbyBsJ2lucHV0IGUgcmVzZXR0YW5kbyB0dXR0ZSBsZSBwcm9wcmlldMOgIGRlbGwnSUF0dGFjaG1lbnREVE9cclxuICAgKi9cclxuICBhYm9ydEZpbGUoKSB7XHJcbiAgICBpZiAodGhpcy5pbWFnZUlucHV0KSB0aGlzLmltYWdlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlID0gZmFsc2U7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBudWxsO1xyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICB0aGlzLmN1c3RvbUhlaWdodCA9IG51bGw7XHJcbiAgICB0aGlzLmN1c3RvbVdpZHRoID0gbnVsbDtcclxuICAgIHRoaXMub3JpZ2luYWxIZWlnaHQgPSBudWxsO1xyXG4gICAgdGhpcy5vcmlnaW5hbFdpZHRoID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZkNyb3BJbWFnZS5jbG9zZSgpO1xyXG4gICAgdGhpcy5yZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKCk7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgZmlsZURyb3BwZWQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZHJhZ092ZXIgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XHJcblxyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5vbkZpbGVBZGRlZCh7IHRhcmdldDogeyBmaWxlczogZmlsZXMgfSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFNlIGlsIGNhcmljYW1lbnRvIGRlbCBmaWxlIGRyb3Bib3ggdmEgYSBidW9uIGZpbmUsIGxhIGZ1bnppb25lIGRpIGNhbGxiYWNrIHJlc3RpdHVpc2NlIHVuIGFycmF5IGRpIG9nZ2V0dGkuXHJcbiAgLy8gVmllbmUgcG9pIGZhdHRhIHVuYSBYTUxIdHRwUmVxdWVzdCBjb24gcmVzcG9uc2VUeXBlICdibG9iJyBwZXIgY29udmVydGlyZSBpbCBwcmltbyBlbGVtZW50byBkZWxsYSByZXNwb25zZSBpbiB1biBCbG9iLlxyXG4gIGNob29zZURyb3Bib3hGaWxlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgIHN1Y2Nlc3M6IChmaWxlczogYW55W10pID0+IHtcclxuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBmaWxlc1swXS5saW5rKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke0F0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmRyb3Bib3hDcmVkZW50aWFscy5hY2Nlc3NUb2tlbn1gKTtcclxuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XHJcblxyXG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBibG9iID0geGhyLnJlc3BvbnNlO1xyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZXNbMF0ubmFtZSwgeyB0eXBlOiBibG9iLnR5cGUgfSk7XHJcbiAgICAgICAgICBsZXQgZmlsZXNBZGRlZCA9IFtmaWxlXTtcclxuICAgICAgICAgIHRoaXMub25GaWxlQWRkZWQoZmlsZXNBZGRlZCwgdHJ1ZSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgeGhyLnNlbmQoKTtcclxuICAgICAgfSxcclxuICAgICAgbGlua1R5cGU6IFwiZGlyZWN0XCIsXHJcbiAgICAgIG11bHRpc2VsZWN0OiBmYWxzZSxcclxuICAgICAgZXh0ZW5zaW9uczogW1wiLmpwZ1wiLCBcIi5wbmdcIiwgXCIucGRmXCIsIFwiLmRvY1wiLCBcIi5kb2N4XCIsIFwiLnR4dFwiXVxyXG4gICAgfTtcclxuICAgIERyb3Bib3guY2hvb3NlKG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy8gV29ya2Fyb3VuZCBkcm9wem9uZTogZGlzYWJpbGl0byBpbCBjbGljayBkZWdsaSBlbGVtZW50aSBpbmNsdXNpIG5lbGxhIGRyb3B6b25lIHBlciBldml0YXJlIGRpIGNsaWNjYXJlIGR1ZSB2b2x0ZVxyXG4gIG9uU2VsZWN0RmlsZShldmVudCwgZmlsZUlucHV0KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLnRhZ05hbWUgPT09IFwiQlVUVE9OXCIgfHxcclxuICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudCkudGFnTmFtZSA9PT0gXCJJTlBVVFwiIHx8XHJcbiAgICAgIHRoaXMuYWRkaW5nTGlua01vZGUgPT0gdHJ1ZVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGZpbGVJbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXByZSBpbCBkaWFsb2dvIHBlciBsJ2luc2VyaW1lbnRvIGRlbCBsaW5rLlxyXG4gICAqL1xyXG4gIHN3aXRjaFRvQWRkaW5nTGlua01vZGUoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZmlsZU5hbWU6IFsnJ10sXHJcbiAgICAgIGZpbGVQYXRoOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oJ2h0dHBzPzovLy4rJyldXVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3Blbih0aGlzLmFkZGluZ0xpbmtUZW1wbGF0ZSwge1xyXG4gICAgICB3aWR0aDogJzUwMHB4JyxcclxuICAgICAgcGFuZWxDbGFzczogJ2VxcC1hdHRhY2htZW50cy1kaWFsb2cnXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIC8vIENyZWEgbCdvZ2dldHRvIHBlciBpbCBudW92byBsaW5rIGRhaSBkYXRpIGRlbCBmb3JtXHJcbiAgICAgICAgY29uc3QgbmV3TGlua09iamVjdDogSUF0dGFjaG1lbnREVE8gPSB7XHJcbiAgICAgICAgICBJRDogMCxcclxuICAgICAgICAgIEF0dGFjaG1lbnRUeXBlOiBBdHRhY2htZW50VHlwZS5MSU5LLFxyXG4gICAgICAgICAgRmlsZU5hbWU6IHJlc3VsdC5maWxlTmFtZSxcclxuICAgICAgICAgIEZpbGVQYXRoOiByZXN1bHQuZmlsZVBhdGgsXHJcbiAgICAgICAgICBJc0ltYWdlOiBmYWxzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IG5ld0xpbmtPYmplY3Q7XHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gW25ld0xpbmtPYmplY3RdO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5jb25maXJtQWRkQXR0YWNobWVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8gTWV0b2RvIHBlciBvdHRlbmVyZSBsZSBjbGFzc2kgQ1NTIGRpbmFtaWNoZVxyXG4gIGdldENhcmRDbGFzcyhhdHQ6IElBdHRhY2htZW50RFRPKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2ZpbGUtcHJldmlldyc6IHRydWUsXHJcbiAgICAgICd1cGxvYWRpbmcnOiAhIWF0dC5pc1VwbG9hZGluZyxcclxuICAgICAgJ2NhcmQtc21hbGwnOiB0aGlzLmNhcmRTaXplID09PSAnc21hbGwnLFxyXG4gICAgICAnY2FyZC1tZWRpdW0nOiB0aGlzLmNhcmRTaXplID09PSAnbWVkaXVtJyxcclxuICAgICAgJ2NhcmQtbGFyZ2UnOiB0aGlzLmNhcmRTaXplID09PSAnbGFyZ2UnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIFF1ZXN0YSBmdW56aW9uZSBvcmEgc2kgYXBwbGljYSBhbCBjb250ZW5pdG9yZSwgbm9uIGFsbGEgc2luZ29sYSBjYXJkLlxyXG4gIGdldFByZXZpZXdzQ29udGFpbmVyU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBsZXQgbWluV2lkdGggPSAnMjAwcHgnOyAvLyBEaW1lbnNpb25lIGRpIGRlZmF1bHQgcGVyICdtZWRpdW0nXHJcblxyXG4gICAgaWYgKHRoaXMuY2FyZFNpemUgPT09ICdzbWFsbCcpIHtcclxuICAgICAgbWluV2lkdGggPSAnMTQwcHgnO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhcmRTaXplID09PSAnbGFyZ2UnKSB7XHJcbiAgICAgIG1pbldpZHRoID0gJzI4MHB4JztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkU2l6ZSA9PT0gJ2N1c3RvbScpIHtcclxuICAgICAgbWluV2lkdGggPSBgJHt0aGlzLmN1c3RvbUNhcmRXaWR0aFB4fXB4YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyAnLS1jYXJkLW1pbi13aWR0aCc6IG1pbldpZHRoIH07XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQcmltYXJ5QWN0aW9uKGF0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPKTogdm9pZCB7XHJcbiAgICAvLyBTZSBpbCBmaWxlIHB1w7IgZXNzZXJlIHZpc3VhbGl6emF0byBpbiBhbnRlcHJpbWEsIGFwcmkgaWwgZGlhbG9nXHJcbiAgICBpZiAodGhpcy5jYW5CZVByZXZpZXdlZChhdHRhY2htZW50KSkge1xyXG4gICAgICB0aGlzLm9wZW5QcmV2aWV3RGlhbG9nKGF0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG4gICAgLy8gQWx0cmltZW50aSwgZXNlZ3VpIGwnYXppb25lIGRpIGRlZmF1bHQgKGRvd25sb2FkIHBlciBmaWxlLCBhcHJpIHBlciBsaW5rKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudmlld0F0dGFjaG1lbnQoYXR0YWNobWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogRGV0ZXJtaW5lcyBpZiBhbiBhdHRhY2htZW50IGNhbiBiZSBwcmV2aWV3ZWQgaW4gdGhlIGRpYWxvZy5cclxuICogQHBhcmFtIGF0dCBUaGUgYXR0YWNobWVudCB0byBjaGVjay5cclxuICogQHJldHVybnMgYHRydWVgIGlmIGEgcHJldmlldyBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxuICBjYW5CZVByZXZpZXdlZChhdHQ6IElBdHRhY2htZW50RFRPKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWF0dCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FzZSAxOiBJdCdzIGFuIGltYWdlIHdpdGggQmFzZTY0IGRhdGEuXHJcbiAgICBjb25zdCBpc1ByZXZpZXdhYmxlSW1hZ2UgPSBhdHQuSXNJbWFnZSAmJiAhIWF0dC5GaWxlRGF0YUJhc2U2NDtcclxuXHJcbiAgICAvLyBDYXNlIDI6IEl0J3MgYSBQREYgd2l0aCBCYXNlNjQgZGF0YS5cclxuICAgIGNvbnN0IGlzUHJldmlld2FibGVQZGYgPSBhdHQuRmlsZUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyAmJiAhIWF0dC5GaWxlRGF0YUJhc2U2NDtcclxuXHJcbiAgICAvLyBDYXNlIDM6IEl0J3MgYSByZW1vdGUgZG9jdW1lbnQgd2l0aCBhIFVSTCAoZm9yIEdvb2dsZSBWaWV3ZXIpLlxyXG4gICAgY29uc3QgaXNSZW1vdGVEb2N1bWVudCA9ICFhdHQuSXNJbWFnZSAmJiAhIWF0dC5GaWxlUGF0aCAmJiAhIXRoaXMucHJvZHVjdGlvbkJhc2VVcmw7XHJcblxyXG4gICAgLy9DYXNlIDQ6IFZpZGVvIC0gw4ggdW4gdmlkZW8gZSBhYmJpYW1vIGlsIGZpbGUgYmluYXJpbyBzYWx2YXRvIGluIExhcmdlRmlsZVxyXG4gICAgY29uc3QgaXNQcmV2aWV3YWJsZVZpZGVvID0gYXR0LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndmlkZW8vJykgJiYgISFhdHQuTGFyZ2VGaWxlO1xyXG5cclxuICAgIC8vIEEgcHJldmlldyBpcyBwb3NzaWJsZSBpZiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUgdHJ1ZS5cclxuICAgIHJldHVybiBpc1ByZXZpZXdhYmxlSW1hZ2UgfHwgaXNQcmV2aWV3YWJsZVBkZiB8fCBpc1JlbW90ZURvY3VtZW50IHx8IGlzUHJldmlld2FibGVWaWRlbztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNDb2x1bW5IaWRkZW4oY29sOiBBdHRhY2htZW50RmllbGRDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIC8vIDEpIGhpZGRlbkNvbHVtbnNcclxuICAgIGlmICh0aGlzLmhpZGRlbkNvbHVtbnM/LmluY2x1ZGVzKGNvbC5rZXkpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyAyKSBoaWRkZW4gZGVmaW5pdG8gc3VsbGEgY29sb25uYSAoYm9vbGVhbiBvIGZ1bnppb25lIHNlbnphIGFyZ3MpXHJcbiAgICBpZiAodHlwZW9mIGNvbC5oaWRkZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiAhIWNvbC5oaWRkZW4oKTtcclxuICAgIHJldHVybiAhIWNvbC5oaWRkZW47XHJcbiAgfVxyXG5cclxuICBpc0FjdGlvbkhpZGRlbihhY3Rpb246IEF0dGFjaG1lbnRNZW51QWN0aW9uLCBhdHQ/OiBJQXR0YWNobWVudERUTyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaGlkZGVuQWN0aW9ucz8uaW5jbHVkZXMoYWN0aW9uLmtleSkpIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24uaGlkZGVuID09PSAnZnVuY3Rpb24nKSByZXR1cm4gISFhY3Rpb24uaGlkZGVuKGF0dCk7XHJcbiAgICByZXR1cm4gISFhY3Rpb24uaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5pc2NlIGxlIGNvbG9ubmUgZGkgZGVmYXVsdCBjb24gcXVlbGxlIGN1c3RvbSBlIGxlIG9yZGluYS5cclxuICAgKi9cclxuICBwcml2YXRlIHNldHVwVGFibGVDb2x1bW5zKCk6IHZvaWQge1xyXG4gICAgLy8gRGVmaW5pYW1vIGxlIGNvbG9ubmUgc3RhbmRhcmQgY29uIHVuYSBwb3NpemlvbmVcclxuICAgIGNvbnN0IGRlZmF1bHRGaWxlQ29sdW1uOiBBdHRhY2htZW50RmllbGRDb2x1bW4gPSB7XHJcbiAgICAgIGtleTogJ2ZpbGUnLFxyXG4gICAgICBkaXNwbGF5OiAnRmlsZScsXHJcbiAgICAgIHR5cGU6IFR5cGVBdHRhY2htZW50Q29sdW1uLlRFTVBMQVRFLFxyXG4gICAgICBleHRlcm5hbFRlbXBsYXRlOiB0aGlzLmRlZmF1bHRGaWxlVGVtcGxhdGUsXHJcbiAgICAgIHN0eWxlczogeyBmbGV4OiAnMSAxIDAlJyB9LFxyXG4gICAgICBwb3NpdGlvbjogMTBcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbnNDb2x1bW46IEF0dGFjaG1lbnRGaWVsZENvbHVtbiA9IHtcclxuICAgICAga2V5OiAnYWN0aW9ucycsXHJcbiAgICAgIGRpc3BsYXk6ICdBemlvbmknLFxyXG4gICAgICB0eXBlOiBUeXBlQXR0YWNobWVudENvbHVtbi5URU1QTEFURSxcclxuICAgICAgZXh0ZXJuYWxUZW1wbGF0ZTogdGhpcy5kZWZhdWx0QWN0aW9uc1RlbXBsYXRlLFxyXG4gICAgICBwb3NpdGlvbjogMTAwLFxyXG4gICAgICBjbGFzczogJ2NvbC1hY3Rpb25zJyxcclxuICAgICAgc3R5bGVzOiB7IGZsZXg6ICcwIDAgMTUwcHgnIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgcHJvY2Vzc2VkQ3VzdG9tQ29sdW1ucyA9IHRoaXMuX2N1c3RvbUNvbHVtbnMubWFwKGNvbCA9PiB7XHJcbiAgICAgIC8vIEZsZXggZGkgZGVmYXVsdFxyXG4gICAgICBpZiAoIWNvbC5zdHlsZXMgfHwgIWNvbC5zdHlsZXMuZmxleCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICBzdHlsZXM6IHsgLi4uY29sLnN0eWxlcywgZmxleDogJzEgMSAwJScgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbDtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBbXHJcbiAgICAgIGRlZmF1bHRGaWxlQ29sdW1uLFxyXG4gICAgICBkZWZhdWx0QWN0aW9uc0NvbHVtbixcclxuICAgICAgLi4ucHJvY2Vzc2VkQ3VzdG9tQ29sdW1uc1xyXG4gICAgXTtcclxuXHJcbiAgICAvLyBPcmRpbmlhbW8gbCdhcnJheSBmaW5hbGUgaW4gYmFzZSBhbGxhIHByb3ByaWV0w6AgJ3Bvc2l0aW9uJ1xyXG4gICAgdGhpcy5fdGFibGVDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoY29sID0+ICF0aGlzLmlzQ29sdW1uSGlkZGVuKGNvbCkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcG9zQSA9IGEucG9zaXRpb24gfHwgOTk7XHJcbiAgICAgICAgY29uc3QgcG9zQiA9IGIucG9zaXRpb24gfHwgOTk7XHJcbiAgICAgICAgcmV0dXJuIHBvc0EgLSBwb3NCO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBNZW51QWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRlZmF1bHRQcmV2aWV3QWN0aW9uOiBBdHRhY2htZW50TWVudUFjdGlvbiA9IHtcclxuICAgICAga2V5OiAncHJldmlldycsXHJcbiAgICAgIGljb246ICd2aXNpYmlsaXR5JyxcclxuICAgICAgbmFtZTogJ0FudGVwcmltYScsXHJcbiAgICAgIGZuOiAoYXR0KSA9PiB0aGlzLm9wZW5QcmV2aWV3RGlhbG9nKGF0dCksXHJcbiAgICAgIGRpc2FibGVkOiAoYXR0KSA9PiAhdGhpcy5jYW5CZVByZXZpZXdlZChhdHQpLFxyXG4gICAgICBwb3NpdGlvbjogMTBcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdERlbGV0ZUFjdGlvbjogQXR0YWNobWVudE1lbnVBY3Rpb24gPSB7XHJcbiAgICAgIGtleTogJ2RlbGV0ZScsXHJcbiAgICAgIGljb246ICdkZWxldGUnLFxyXG4gICAgICBuYW1lOiAnRWxpbWluYScsXHJcbiAgICAgIGZuOiAoYXR0KSA9PiB0aGlzLmRlbGV0ZUF0dGFjaG1lbnQoYXR0KSxcclxuICAgICAgZGlzYWJsZWQ6ICgpID0+IHRoaXMuZGlzYWJsZUFjdGlvbixcclxuICAgICAgcG9zaXRpb246IDEwMFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhbGxBY3Rpb25zID0gW1xyXG4gICAgICBkZWZhdWx0UHJldmlld0FjdGlvbixcclxuICAgICAgZGVmYXVsdERlbGV0ZUFjdGlvbixcclxuICAgICAgLi4udGhpcy5fY3VzdG9tTWVudUFjdGlvbnNcclxuICAgIF07XHJcblxyXG4gICAgLy8gT3JkaW5pYW1vIGwnYXJyYXkgZmluYWxlIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgICdwb3NpdGlvbidcclxuICAgIHRoaXMuX3NvcnRlZE1lbnVBY3Rpb25zID0gYWxsQWN0aW9ucy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBvc0EgPSBhLnBvc2l0aW9uIHx8IDk5O1xyXG4gICAgICBjb25zdCBwb3NCID0gYi5wb3NpdGlvbiB8fCA5OTtcclxuICAgICAgcmV0dXJuIHBvc0EgLSBwb3NCO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlVmlkZW9UaHVtYm5haWwoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XHJcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgICAvLyBDcmVhIHVuIFVSTCB0ZW1wb3JhbmVvIHBlciBpbCBmaWxlIHZpZGVvXHJcbiAgICAgIGNvbnN0IHZpZGVvVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgICAgdmlkZW8uc3JjID0gdmlkZW9Vcmw7XHJcbiAgICAgIHZpZGVvLnByZWxvYWQgPSAnbWV0YWRhdGEnO1xyXG4gICAgICB2aWRlby5tdXRlZCA9IHRydWU7XHJcbiAgICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcclxuXHJcbiAgICAgIHZpZGVvLm9ubG9hZGVkbWV0YWRhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gVmFpIGFsIHNlY29uZG8gMSAocGVyIGV2aXRhcmUgaWwgZm90b2dyYW1tYSBuZXJvIGluaXppYWxlKVxyXG4gICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHZpZGVvLm9uc2Vla2VkID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIEltcG9zdGEgbGUgZGltZW5zaW9uaSBkZWwgY2FudmFzIHVndWFsaSBhbCB2aWRlb1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHZpZGVvLnZpZGVvV2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBEaXNlZ25hIGlsIGZvdG9ncmFtbWEgc3VsIGNhbnZhc1xyXG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKHZpZGVvLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG5cclxuICAgICAgICAvLyBFc3RyYWkgaWwgQmFzZTY0IChxdWFsaXTDoCAwLjcgcGVyIHJpc3Bhcm1pYXJlIHNwYXppbylcclxuICAgICAgICBjb25zdCB0aHVtYm5haWwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgMC43KTtcclxuXHJcbiAgICAgICAgLy8gUHVsaXNjaSBsYSBtZW1vcmlhXHJcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh2aWRlb1VybCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0aHVtYm5haWwuc3BsaXQoJywnKVsxXSk7IC8vIFJlc3RpdHVpYW1vIHNvbG8gbGEgcGFydGUgQmFzZTY0XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB2aWRlby5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodmlkZW9VcmwpO1xyXG4gICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXByZXNzVmlkZW9OYXRpdmUoZmlsZTogRmlsZSwgY29uZmlnOiBhbnkpOiBQcm9taXNlPEJsb2I+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcclxuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICBjb25zdCB2aWRlb1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcblxyXG4gICAgICB2aWRlby5zcmMgPSB2aWRlb1VybDtcclxuICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xyXG4gICAgICB2aWRlby5wbGF5KCk7XHJcblxyXG4gICAgICB2aWRlby5vbmxvYWRlZGRhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gQ2FsY29saWFtbyBsZSBudW92ZSBkaW1lbnNpb25pIG1hbnRlbmVuZG8gbCdhc3BlY3QgcmF0aW9cclxuICAgICAgICBsZXQgd2lkdGggPSB2aWRlby52aWRlb1dpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSB2aWRlby52aWRlb0hlaWdodDtcclxuICAgICAgICBpZiAod2lkdGggPiBjb25maWcubWF4V2lkdGgpIHtcclxuICAgICAgICAgIGhlaWdodCA9IE1hdGgucm91bmQoKGNvbmZpZy5tYXhXaWR0aCAqIGhlaWdodCkgLyB3aWR0aCk7XHJcbiAgICAgICAgICB3aWR0aCA9IGNvbmZpZy5tYXhXaWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIENhdHR1cmlhbW8gbG8gc3RyZWFtIGRhbCBjYW52YXMgYSAzMGZwc1xyXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGNhbnZhcy5jYXB0dXJlU3RyZWFtKDMwKTtcclxuICAgICAgICBjb25zdCByZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKHN0cmVhbSwge1xyXG4gICAgICAgICAgbWltZVR5cGU6ICd2aWRlby93ZWJtO2NvZGVjcz12cDgnLCAvLyBGb3JtYXRvIHdlYiBvdHRpbWl6emF0b1xyXG4gICAgICAgICAgdmlkZW9CaXRzUGVyU2Vjb25kOiBjb25maWcuYml0cmF0ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBjaHVua3M6IEJsb2JbXSA9IFtdO1xyXG4gICAgICAgIHJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChlKSA9PiBjaHVua3MucHVzaChlLmRhdGEpO1xyXG4gICAgICAgIHJlY29yZGVyLm9uc3RvcCA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRCbG9iID0gbmV3IEJsb2IoY2h1bmtzLCB7IHR5cGU6ICd2aWRlby93ZWJtJyB9KTtcclxuICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodmlkZW9VcmwpO1xyXG4gICAgICAgICAgcmVzb2x2ZShjb21wcmVzc2VkQmxvYik7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmVjb3JkZXIuc3RhcnQoKTtcclxuXHJcbiAgICAgICAgLy8gRnVuemlvbmUgY2hlIGRpc2VnbmEgb2duaSBmcmFtZSBzdWwgY2FudmFzXHJcbiAgICAgICAgY29uc3QgZHJhd0ZyYW1lID0gKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHZpZGVvLnBhdXNlZCB8fCB2aWRlby5lbmRlZCkge1xyXG4gICAgICAgICAgICByZWNvcmRlci5zdG9wKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UodmlkZW8sIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXdGcmFtZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBkcmF3RnJhbWUoKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHZpZGVvLm9uZXJyb3IgPSByZWplY3Q7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPCEtLSBTZSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgc2luZ29sYSBtb3N0cmEgaWwgcHVsc2FudGUgZGkgY2FyaWNhbWVudG8gZGkgdW4gc2luZ29sbyBmaWxlIC0tPlxyXG5AaWYoc2hvd1VwbG9hZFRpdGxlID09IHRydWUgfHwgY2hvb3NlVmlldyA9PSB0cnVlKXtcclxuPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gIEBpZihzaG93VXBsb2FkVGl0bGUgPT0gdHJ1ZSl7XHJcbiAgPGg0Pnt7IHVwbG9hZFRpdGxlIH19PC9oND5cclxuICB9XHJcbiAgQGlmKGNob29zZVZpZXcgPT0gdHJ1ZSl7XHJcbiAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIFt2YWx1ZV09XCJ2aWV3TW9kZVwiIChjaGFuZ2UpPVwic2V0Vmlld01vZGUoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICBhcmlhLWxhYmVsPVwiTW9kYWxpdMOgIGRpIHZpc3VhbGl6emF6aW9uZVwiPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwiY2FyZFwiPjxtYXQtaWNvbj5ncmlkX3ZpZXc8L21hdC1pY29uPjwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJ0YWJsZVwiPjxtYXQtaWNvbj52aWV3X2xpc3Q8L21hdC1pY29uPjwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICB9XHJcbjwvZGl2PlxyXG59XHJcblxyXG48IS0tIEdlc3Rpb25lIHNpbmdvbG8gLS0+XHJcbkBpZiAobXVsdGlwbGVBdHRhY2htZW50ICE9IHRydWUpIHtcclxuQGlmICghc2luZ2xlQXR0YWNobWVudERyYWdBbmREcm9wKSB7XHJcbkBpZiAoIWFkZGluZ0xpbmtNb2RlKSB7XHJcbjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkQXR0YWNobWVudEJ1dHRvblwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxufSBAZWxzZSB7XHJcbjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaW5nTGlua1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG59XHJcbn0gQGVsc2Uge1xyXG48aW5wdXQgI2ZpbGVJbnB1dCBpZD1cImZpbGVfYXR0YWNobWVudFwiIG5hbWU9XCJmaWxlX2F0dGFjaG1lbnRcIiB0eXBlPVwiZmlsZVwiIGhpZGRlbiAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIlxyXG4gIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIiBbbXVsdGlwbGVdPVwibG9hZE11bHRpcGxlRmlsZXNcIiAvPlxyXG5cclxuQGlmIChhbGxvd2VkVHlwZXMgJiYgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDEpICYmICghYXR0YWNobWVudHNMaXN0IHx8IGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fFxyXG4oYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcblxyXG5AaWYgKHNob3dEcm9wQXJlYSA9PSB0cnVlKSB7XHJcbjwhLS0gRlVMTCAtLT5cclxuQGlmIChsYXlvdXQgPT09ICdmdWxsJykge1xyXG5cclxuPGRpdiBjbGFzcz1cImRyb3Bib3hcIiBbY2xhc3MuZHJhZ292ZXJdPVwiZHJhZ092ZXJcIiAoZHJhZ292ZXIpPVwiZHJhZ092ZXIgPSB0cnVlOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXHJcbiAgKGRyYWdsZWF2ZSk9XCJkcmFnT3ZlciA9IGZhbHNlXCIgKGRyb3ApPVwiZHJhZ092ZXIgPSBmYWxzZTsgZmlsZURyb3BwZWQoJGV2ZW50KVwiXHJcbiAgKGNsaWNrKT1cIm9uU2VsZWN0RmlsZSgkZXZlbnQsIGZpbGVJbnB1dClcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCIgKGtleWRvd24uZW50ZXIpPVwiZmlsZUlucHV0LmNsaWNrKClcIlxyXG4gIChrZXlkb3duLnNwYWNlKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bib3gtaWNvblwiPvCfk4E8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGJveC10ZXh0XCI+e3sgZHJvcEhlcmVMYWJlbCB9fTwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wYm94LXN1YnRleHRcIj5cclxuICAgIHt7IHN1cHBvcnRlZEZvcm1hdHNMYWJlbCB9fVxyXG4gIDwvZGl2PlxyXG4gIDxidXR0b24gY2xhc3M9XCJicm93c2UtYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgICB7eyBicm93c2VGaWxlc0xhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgPGRpdiBjbGFzcz1cInNlY29uZGFyeS1hY3Rpb25cIj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikgJiYgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7XHJcbiAgICA8YSBjbGFzcz1cInNlY29uZGFyeS1hY3Rpb24tbGlua1wiIFttYXRNZW51VHJpZ2dlckZvcl09XCJpc0Rpc2FibGVkID8gbnVsbCA6IGxpbmtNZW51XCJcclxuICAgICAgW2NsYXNzLmRpc2FibGVkLWxpbmtdPVwiaXNEaXNhYmxlZFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgbyBhZ2dpdW5naSBkYSB3ZWJcclxuICAgIDwvYT5cclxuICAgIDxtYXQtbWVudSAjbGlua01lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic3dpdGNoVG9BZGRpbmdMaW5rTW9kZSgpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmxpbms8L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuPkFnZ2l1bmdpIGRhIGxpbms8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+Y2xvdWRfcXVldWU8L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuPkNhcmljYSBkYSBEcm9wYm94PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbWF0LW1lbnU+XHJcbiAgICB9XHJcblxyXG4gICAgQGVsc2UgaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkge1xyXG4gICAgPGEgW2NsYXNzLmRpc2FibGVkLWxpbmtdPVwiaXNEaXNhYmxlZFwiIGNsYXNzPVwic2Vjb25kYXJ5LWFjdGlvbi1saW5rXCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgc3dpdGNoVG9BZGRpbmdMaW5rTW9kZSgpXCI+XHJcbiAgICAgIGFnZ2l1bmdpIHVuIGxpbmtcclxuICAgIDwvYT5cclxuICAgIH1cclxuXHJcbiAgICBAZWxzZSBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7XHJcbiAgICA8YSBbY2xhc3MuZGlzYWJsZWQtbGlua109XCJpc0Rpc2FibGVkXCIgY2xhc3M9XCJzZWNvbmRhcnktYWN0aW9uLWxpbmtcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBjaG9vc2VEcm9wYm94RmlsZSgpXCI+XHJcbiAgICAgIGNhcmljYSBkYSBEcm9wYm94XHJcbiAgICA8L2E+XHJcbiAgICB9XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG59QGVsc2Uge1xyXG48ZGl2IGNsYXNzPVwiY29tcGFjdC11cGxvYWRlclwiIFtjbGFzcy5kcmFnb3Zlcl09XCJkcmFnT3ZlclwiIChkcmFnb3Zlcik9XCJkcmFnT3ZlciA9IHRydWU7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcclxuICAoZHJhZ2xlYXZlKT1cImRyYWdPdmVyID0gZmFsc2VcIiAoZHJvcCk9XCJkcmFnT3ZlciA9IGZhbHNlOyBmaWxlRHJvcHBlZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtaWNvblwiPjxtYXQtaWNvbj5mb2xkZXJfb3BlbjwvbWF0LWljb24+PC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtdGV4dFwiIChjbGljayk9XCJvblNlbGVjdEZpbGUoJGV2ZW50LCBmaWxlSW5wdXQpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGFjdC10aXRsZVwiPlRyYXNjaW5hIGkgZmlsZSBvIHNlbGV6aW9uYSBkYWwgY29tcHV0ZXI8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb21wYWN0LXN1YnRpdGxlXCI+e3sgc3VwcG9ydGVkRm9ybWF0c0xhYmVsIH19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtYWN0aW9uc1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmaWxlSW5wdXQuY2xpY2soKVwiPlNmb2dsaWE8L2J1dHRvbj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29tcGFjdExpbmtNZW51XCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPkxpbms8L2J1dHRvbj5cclxuICAgIDxtYXQtbWVudSAjY29tcGFjdExpbmtNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkgeyA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIj57eyBvcGVuTGlua0xhYmVsIH19PC9idXR0b24+IH1cclxuICAgICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHsgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIj57e1xyXG4gICAgICAgIHVwbG9hZFdpdGhEcm9wYm94TGFiZWwgfX08L2J1dHRvbj4gfVxyXG4gICAgPC9tYXQtbWVudT5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1cclxufVxyXG59XHJcbn1cclxuXHJcbjwhLS0gQXppb25pIHNpbmdvbG8gZWxlbWVudG8gKGNvbWUgcHJpbWEpIC0tPlxyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICBAaWYgKGF0dGFjaG1lbnRzTGlzdCAmJiBhdHRhY2htZW50c0xpc3QubGVuZ3RoID4gMCAmJiBhdHRhY2htZW50c0xpc3RbMF0gJiYgc2hvd0FjdGlvbkJ1dHRvbnMgPT0gdHJ1ZSkge1xyXG4gIDxidXR0b24gY2xhc3M9XCJtYi0yIG1lLTIgZXFwLWF0dGFjaG1lbnRzLWRvd25sb2FkLWJ0blwiIChjbGljayk9XCJ2aWV3QXR0YWNobWVudChhdHRhY2htZW50c0xpc3RbMF0pXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgIEBpZiAoYXR0YWNobWVudHNMaXN0WzBdLkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUpIHtcclxuICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgIDxtYXQtaWNvbj5vcGVuX2luX25ldzwvbWF0LWljb24+XHJcbiAgICB9XHJcbiAgICB7eyBhdHRhY2htZW50c0xpc3RbMF0uQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSA/IGRvd25sb2FkTGFiZWwgOiBvcGVuTGlua0xhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIEBpZiAoc2hvd1ByZXZpZXcgJiYgKCFhdHRhY2htZW50c0xpc3RbMF0uRmlsZUNvbnRlbnRUeXBlIHx8ICghYXR0YWNobWVudHNMaXN0WzBdLkZpbGVDb250ZW50VHlwZS5zdGFydHNXaXRoKCd2aWRlbycpXHJcbiAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXS5GaWxlQ29udGVudFR5cGUuc3RhcnRzV2l0aCgnYXVkaW8nKSkpICYmIGF0dGFjaG1lbnRzTGlzdFswXS5Jc0ltYWdlID09IHRydWUpIHtcclxuICA8YnV0dG9uIGNsYXNzPVwibWItMiBtZS0yIGVxcC1hdHRhY2htZW50cy1wcmV2aWV3LWJ0blwiIChjbGljayk9XCJvcGVuUHJldmlld0RpYWxvZyhhdHRhY2htZW50c0xpc3RbMF0pXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgIDxtYXQtaWNvbj52aXNpYmlsaXR5PC9tYXQtaWNvbj4ge3sgcHJldmlld0xhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG5cclxuICA8YnV0dG9uIFtkaXNhYmxlZF09XCJkaXNhYmxlQWN0aW9uXCIgY2xhc3M9XCJtYi0yIGVxcC1hdHRhY2htZW50cy1kZWxldGUtYnRuXCJcclxuICAgIChjbGljayk9XCJkZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRzTGlzdFswXSlcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIj5cclxuICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPiB7eyBkZWxldGVMYWJlbCB9fVxyXG4gIDwvYnV0dG9uPlxyXG4gIH1cclxuPC9kaXY+XHJcbn1cclxuXHJcbjwhLS0gR2VzdGlvbmUgbXVsdGlwbGEgLS0+XHJcbkBpZiAobXVsdGlwbGVBdHRhY2htZW50ID09IHRydWUgJiYgc2hvd0Ryb3BBcmVhID09IHRydWUpIHtcclxuPGlucHV0ICNmaWxlSW5wdXQgaWQ9XCJmaWxlX2F0dGFjaG1lbnRfbXVsdGlcIiBuYW1lPVwiZmlsZV9hdHRhY2htZW50X211bHRpXCIgdHlwZT1cImZpbGVcIiBoaWRkZW5cclxuICAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZVR5cGVzXCIgW211bHRpcGxlXT1cImxvYWRNdWx0aXBsZUZpbGVzXCIgLz5cclxuXHJcbkBpZiAobGF5b3V0ID09PSAnZnVsbCcpIHtcclxuPGRpdiBjbGFzcz1cImRyb3Bib3hcIiBbY2xhc3MuZHJhZ292ZXJdPVwiZHJhZ092ZXJcIiAoZHJhZ292ZXIpPVwiZHJhZ092ZXIgPSB0cnVlOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXHJcbiAgKGRyYWdsZWF2ZSk9XCJkcmFnT3ZlciA9IGZhbHNlXCIgKGRyb3ApPVwiZHJhZ092ZXIgPSBmYWxzZTsgZmlsZURyb3BwZWQoJGV2ZW50KVwiXHJcbiAgKGNsaWNrKT1cIm9uU2VsZWN0RmlsZSgkZXZlbnQsIGZpbGVJbnB1dClcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCIgKGtleWRvd24uZW50ZXIpPVwiZmlsZUlucHV0LmNsaWNrKClcIlxyXG4gIChrZXlkb3duLnNwYWNlKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bib3gtaWNvblwiPvCfk4E8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGJveC10ZXh0XCI+e3sgZHJvcEhlcmVMYWJlbCB9fTwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wYm94LXN1YnRleHRcIj5cclxuICAgIHt7IHN1cHBvcnRlZEZvcm1hdHNMYWJlbCB9fVxyXG4gIDwvZGl2PlxyXG4gIDxidXR0b24gY2xhc3M9XCJicm93c2UtYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgICB7eyBicm93c2VGaWxlc0xhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikpIHtcclxuICA8ZGl2IGNsYXNzPVwic2Vjb25kYXJ5LWFjdGlvbi1saW5rXCI+XHJcbiAgICBvIDxhIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiPmFnZ2l1bmdpIHVuIGxpbms8L2E+XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxufUBlbHNle1xyXG48ZGl2IGNsYXNzPVwiY29tcGFjdC11cGxvYWRlclwiIFtjbGFzcy5kcmFnb3Zlcl09XCJkcmFnT3ZlclwiIChkcmFnb3Zlcik9XCJkcmFnT3ZlciA9IHRydWU7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcclxuICAoZHJhZ2xlYXZlKT1cImRyYWdPdmVyID0gZmFsc2VcIiAoZHJvcCk9XCJkcmFnT3ZlciA9IGZhbHNlOyBmaWxlRHJvcHBlZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtaWNvblwiPjxtYXQtaWNvbj5mb2xkZXJfb3BlbjwvbWF0LWljb24+PC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtdGV4dFwiIChjbGljayk9XCJvblNlbGVjdEZpbGUoJGV2ZW50LCBmaWxlSW5wdXQpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGFjdC10aXRsZVwiPlRyYXNjaW5hIGkgZmlsZSBvIHNlbGV6aW9uYSBkYWwgY29tcHV0ZXI8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb21wYWN0LXN1YnRpdGxlXCI+e3sgc3VwcG9ydGVkRm9ybWF0c0xhYmVsIH19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtYWN0aW9uc1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmaWxlSW5wdXQuY2xpY2soKVwiPlNmb2dsaWE8L2J1dHRvbj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29tcGFjdExpbmtNZW51XCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPkxpbms8L2J1dHRvbj5cclxuICAgIDxtYXQtbWVudSAjY29tcGFjdExpbmtNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkgeyA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIj57eyBvcGVuTGlua0xhYmVsIH19PC9idXR0b24+IH1cclxuICAgICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHsgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIj57e1xyXG4gICAgICAgIHVwbG9hZFdpdGhEcm9wYm94TGFiZWwgfX08L2J1dHRvbj4gfVxyXG4gICAgPC9tYXQtbWVudT5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1cclxufVxyXG5cclxuQGlmIChhdHRhY2htZW50c0xpc3Q/Lmxlbmd0aCA+IDAgJiYgc2hvd1N1bW1hcnkpIHtcclxuPGRpdiBjbGFzcz1cInVwbG9hZC1zdGF0c1wiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwic3RhdHMtaW5mb1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInN0YXQtaXRlbVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdC12YWx1ZVwiPnt7IGF0dGFjaG1lbnRzTGlzdD8ubGVuZ3RoIH19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LWxhYmVsXCI+e3sgZmlsZXNMYWJlbCB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhdC1pdGVtXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LXZhbHVlXCI+e3sgdG90YWxTaXplRm9ybWF0dGVkIH19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LWxhYmVsXCI+e3sgdG90YWxTaXplTGFiZWwgfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZmlsbFwiIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbn0gQGVsc2UgaWYoYXR0YWNobWVudHNMaXN0Py5sZW5ndGggPT0gMCl7XHJcbjxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPnt7IGVtcHR5U3RhdGVMYWJlbCB9fTwvZGl2PlxyXG59XHJcblxyXG48IS0tIEdyaWdsaWEgYW50ZXByaW1lIGNhcmQgKHZhbGUgcGVyIHNpbmdvbG8gZSBtdWx0aXBsbykgLS0+XHJcbkBpZiAodmlld01vZGUgPT09ICdjYXJkJykge1xyXG5cclxuPGRpdiBjbGFzcz1cImZpbGUtcHJldmlld3NcIiBbbmdTdHlsZV09XCJnZXRQcmV2aWV3c0NvbnRhaW5lclN0eWxlKClcIj5cclxuICBAZm9yIChhdHQgb2YgYXR0YWNobWVudHNMaXN0OyB0cmFjayBhdHQuSUQpIHtcclxuICA8ZGl2IFtuZ0NsYXNzXT1cImdldENhcmRDbGFzcyhhdHQpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1pbWctY29udGFpbmVyXCIgKGNsaWNrKT1cIiFhdHQuaXNVcGxvYWRpbmcgJiYgaGFuZGxlUHJpbWFyeUFjdGlvbihhdHQpXCI+XHJcblxyXG4gICAgICBAaWYgKGF0dC5Jc0ltYWdlIHx8IGF0dC5GaWxlVGh1bWJuYWlsQmFzZTY0KSB7XHJcbiAgICAgIDxpbWcgY2xhc3M9XCJwcmV2aWV3LWltZ1wiIFtzcmNdPVwiJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJyArIChhdHQuRmlsZVRodW1ibmFpbEJhc2U2NCB8fCBhdHQuRmlsZURhdGFCYXNlNjQpXCJcclxuICAgICAgICBbYWx0XT1cImF0dC5GaWxlTmFtZVwiIC8+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pY29uXCI+PGkgW25nQ2xhc3NdPVwiZ2V0QXR0YWNobWVudEljb24oYXR0KVwiPjwvaT48L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctYWN0aW9uLW92ZXJsYXlcIj5cclxuICAgICAgICBAaWYgKGF0dC5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpKSB7XHJcbiAgICAgICAgPG1hdC1pY29uPnBsYXlfYXJyb3c8L21hdC1pY29uPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZWxzZSBpZiAoYXR0LklzSW1hZ2UgJiYgY2FuQmVQcmV2aWV3ZWQoYXR0KSkge1xyXG4gICAgICAgIDxtYXQtaWNvbj52aXNpYmlsaXR5PC9tYXQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2UgaWYgKGF0dC5GaWxlQ29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnICYmIGNhbkJlUHJldmlld2VkKGF0dCkpIHtcclxuICAgICAgICA8bWF0LWljb24+b3Blbl9pbl9uZXc8L21hdC1pY29uPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZWxzZSBpZiAoYXR0LkF0dGFjaG1lbnRUeXBlID09PSBBdHRhY2htZW50VHlwZS5GSUxFKSB7XHJcbiAgICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2Uge1xyXG4gICAgICAgIDxtYXQtaWNvbj5vcGVuX2luX25ldzwvbWF0LWljb24+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pbmZvXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLW5hbWVcIiBbdGl0bGVdPVwiYXR0LkZpbGVOYW1lXCI+e3sgYXR0LkZpbGVOYW1lIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICBAaWYoIWRpc2FibGVBY3Rpb24pe1xyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJyZW1vdmUtYnRuXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJSaW11b3ZpIGFsbGVnYXRvXCJcclxuICAgICAgKGNsaWNrKT1cImRlbGV0ZUF0dGFjaG1lbnQoYXR0KVwiIFtkaXNhYmxlZF09XCJhdHQuaXNVcGxvYWRpbmdcIj5cclxuICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKGF0dC5pc1VwbG9hZGluZykge1xyXG4gICAgPGRpdiBjbGFzcz1cInVwbG9hZC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxuXHJcbn0gQGVsc2UgaWYodmlld01vZGUgPT09ICd0YWJsZScgJiYgYXR0YWNobWVudHNMaXN0Py5sZW5ndGggPiAwKSB7XHJcblxyXG5cclxuPGRpdiBjbGFzcz1cInRhYmxlLXZpZXctY29udGFpbmVyXCI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cclxuICAgIEBmb3IgKGNvbCBvZiBfdGFibGVDb2x1bW5zOyB0cmFjayBjb2wua2V5KSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2VsbFwiIFtzdHlsZS5mbGV4XT1cImNvbC5zdHlsZXM/LmZsZXhcIiBbbmdDbGFzc109XCJjb2wuY2xhc3NcIj5cclxuICAgICAge3sgY29sLmRpc3BsYXkgfX1cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG5cclxuICBAZm9yIChhdHQgb2YgYXR0YWNobWVudHNMaXN0OyB0cmFjayBhdHQuSUQpIHtcclxuICA8ZGl2IGNsYXNzPVwidGFibGUtcm93XCI+XHJcblxyXG4gICAgQGZvciAoY29sIG9mIF90YWJsZUNvbHVtbnM7IHRyYWNrIGNvbC5rZXkpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsXCIgW3N0eWxlLmZsZXhdPVwiY29sLnN0eWxlcz8uZmxleFwiIFtuZ0NsYXNzXT1cImNvbC5jbGFzc1wiPlxyXG5cclxuICAgICAgQHN3aXRjaCAoY29sLnR5cGUpIHtcclxuXHJcbiAgICAgIEBjYXNlICgndGVtcGxhdGUnKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZW1wbGF0ZS13cmFwcGVyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wuZXh0ZXJuYWxUZW1wbGF0ZVwiXHJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGF0dCB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICAgIEBjYXNlICgnZGF0ZScpIHtcclxuICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhZGF0YS12YWx1ZVwiPnt7IGF0dFtjb2wua2V5XSB8IGRhdGU6J2RkL01NL3l5eXknIH19PC9zcGFuPlxyXG4gICAgICB9XHJcbiAgICAgIEBkZWZhdWx0IHtcclxuICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhZGF0YS12YWx1ZVwiPnt7IGF0dFtjb2wua2V5XSB9fTwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICB9XHJcbjwvZGl2PlxyXG59XHJcblxyXG48IS0tIE5vdGlmaWNhIHRvYXN0IC0tPlxyXG48ZGl2IGNsYXNzPVwidXBsb2FkLW5vdGlmaWNhdGlvblwiIFtjbGFzcy5zaG93XT1cInRvYXN0Py52aXNpYmxlXCIgW2NsYXNzLnN1Y2Nlc3NdPVwidG9hc3Q/LnR5cGUgPT09ICdzdWNjZXNzJ1wiXHJcbiAgW2NsYXNzLmVycm9yXT1cInRvYXN0Py50eXBlID09PSAnZXJyb3InXCI+XHJcbiAgPHNwYW4+e3sgdG9hc3Q/LnRleHQgfX08L3NwYW4+XHJcbiAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1wcm9ncmVzc1wiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEZpbGVUZW1wbGF0ZSBsZXQtYXR0PlxyXG4gIDxpIGNsYXNzPVwiZmlsZS1pY29uLXNtYWxsXCIgW25nQ2xhc3NdPVwiZ2V0QXR0YWNobWVudEljb24oYXR0KVwiPjwvaT5cclxuICA8ZGl2IGNsYXNzPVwiZmlsZS1pbmZvLXRleHRcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZmlsZS1uYW1lLXRhYmxlXCI+e3sgYXR0LkZpbGVOYW1lIH19PC9zcGFuPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJmaWxlLXR5cGUtdGFibGVcIj57eyBhdHQuRmlsZUV4dGVuc2lvbiB8fCAnTGluaycgfX08L3NwYW4+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRBY3Rpb25zVGVtcGxhdGUgbGV0LWF0dD5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlUHJpbWFyeUFjdGlvbihhdHQpXCJcclxuICAgIFttYXRUb29sdGlwXT1cImF0dC5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpID8gJ1JpcHJvZHVjaSB2aWRlbycgOiAnVmlzdWFsaXp6YS9TY2FyaWNhJ1wiPlxyXG5cclxuICAgIDxtYXQtaWNvbj5cclxuICAgICAgQGlmIChhdHQuRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd2aWRlby8nKSkge1xyXG4gICAgICBwbGF5X2Fycm93XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICB7eyBhdHQuQXR0YWNobWVudFR5cGUgPT09IEF0dGFjaG1lbnRUeXBlLkZJTEUgPyAnZG93bmxvYWQnIDogJ29wZW5faW5fbmV3JyB9fVxyXG4gICAgICB9XHJcbiAgICA8L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWN0aW9uc01lbnVcIiBtYXRUb29sdGlwPVwiQWx0cmUgb3B6aW9uaVwiPlxyXG4gICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIDxtYXQtbWVudSAjYWN0aW9uc01lbnU9XCJtYXRNZW51XCI+XHJcbiAgICBAZm9yIChhY3Rpb24gb2YgX3NvcnRlZE1lbnVBY3Rpb25zOyB0cmFjayBhY3Rpb24ubmFtZSkge1xyXG4gICAgQGlmICghaXNBY3Rpb25IaWRkZW4oYWN0aW9uLCBhdHQpKSB7XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFjdGlvbi5mbihhdHQpXCIgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCA/IGFjdGlvbi5kaXNhYmxlZChhdHQpIDogZmFsc2VcIj5cclxuICAgICAgPG1hdC1pY29uIFtjb2xvcl09XCJhY3Rpb24uaWNvbiA9PT0gJ2RlbGV0ZScgPyAnd2FybicgOiB1bmRlZmluZWRcIj5cclxuICAgICAgICB7eyBhY3Rpb24uaWNvbiB9fVxyXG4gICAgICA8L21hdC1pY29uPlxyXG4gICAgICA8c3Bhbj57eyBhY3Rpb24ubmFtZSB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgfVxyXG4gIDwvbWF0LW1lbnU+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNkaWFsb2dDcm9wSW1hZ2U+XHJcbiAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGhpZGRlblwiIFtuZ0NsYXNzXT1cImNyb3BEaWFsb2dDbGFzc1wiPlxyXG4gICAgPCEtLSBAaWYgKHNob3dDcm9wSW1hZ2UgPT0gdHJ1ZSkgeyAtLT5cclxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3JvcHBpZVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZm9ybTogbmV3QXR0YWNobWVudEZvcm0gfVwiPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8IS0tIH0gLS0+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNpbmxpbmVQcmV2aWV3VGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiPlxyXG4gIEBpZiAocm93LkF0dGFjaG1lbnRUeXBlICE9IEF0dGFjaG1lbnRUeXBlLkxJTksgJiYgcm93LklzSW1hZ2UpIHtcclxuICA8ZGl2IGNsYXNzPVwiaW5saW5lLXByZXZpZXctY29udGFpbmVyXCIgKGNsaWNrKT1cIm9wZW5QcmV2aWV3RGlhbG9nKHJvdylcIj5cclxuICAgIDxpbWcgW3NyY109XCInZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyAocm93LkZpbGVUaHVtYm5haWxCYXNlNjQgPyByb3cuRmlsZVRodW1ibmFpbEJhc2U2NCA6IHJvdy5GaWxlRGF0YUJhc2U2NClcIiAvPlxyXG4gIDwvZGl2PlxyXG4gIH0gQGVsc2UgaWYgKHJvdy5BdHRhY2htZW50VHlwZSAhPSBBdHRhY2htZW50VHlwZS5MSU5LICYmICFyb3cuSXNJbWFnZSkge1xyXG4gIDxkaXYgY2xhc3M9XCJpbmxpbmUtcHJldmlldy1jb250YWluZXJcIiAoY2xpY2spPVwib3BlblByZXZpZXdEaWFsb2cocm93KVwiPlxyXG4gICAgPGkgW25nQ2xhc3NdPVwiZ2V0QXR0YWNobWVudEljb24ocm93KVwiPjwvaT5cclxuICA8L2Rpdj5cclxuICB9XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNkaWFsb2dQcmV2aWV3PlxyXG4gIDxkaXYgY2xhc3M9XCJtb2Rlcm4tZGlhbG9nLWNvbnRhaW5lclwiPiBAaWYgKHNlbGVjdGVkQXR0YWNobWVudCkge1xyXG4gICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwicHJldmlldy1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLWdyb3VwXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW4tdFwiPnt7IHByZXZpZXdMYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS10XCI+e3sgc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjbGFzcz1cImNsb3NlLWJ0blwiPjxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bWF0LWRpYWxvZy1jb250ZW50IGNsYXNzPVwicHJldmlldy1jb250ZW50LWFyZWFcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXZpZXdlci13cmFwcGVyXCI+XHJcbiAgICAgICAgQGlmIChzZWxlY3RlZEF0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJtYWluLXByZXZpZXctbWVkaWFcIlxyXG4gICAgICAgICAgW3NyY109XCInZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyAoc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0IHx8IHNlbGVjdGVkQXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0KVwiXHJcbiAgICAgICAgICBbYWx0XT1cInNlbGVjdGVkQXR0YWNobWVudC5GaWxlTmFtZVwiIC8+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBlbHNlIGlmIChzZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd2aWRlby8nKSkge1xyXG4gICAgICAgIDx2aWRlbyBjb250cm9scyBhdXRvcGxheSBwbGF5c2lubGluZSBjbGFzcz1cIm1haW4tcHJldmlldy1tZWRpYSB2aWRlby1wbGF5ZXJcIj5cclxuICAgICAgICAgIDxzb3VyY2UgW3NyY109XCJzZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybFwiIFt0eXBlXT1cInNlbGVjdGVkQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGVcIj5cclxuICAgICAgICAgIElsIHR1byBicm93c2VyIG5vbiBzdXBwb3J0YSBpbCB2aWRlby5cclxuICAgICAgICA8L3ZpZGVvPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZWxzZSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlmcmFtZS1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxpZnJhbWUgY2xhc3M9XCJwcmV2aWV3LWlmcmFtZS1tb2Rlcm5cIiBbc3JjXT1cInNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsXCJcclxuICAgICAgICAgICAgW3RpdGxlXT1cInNlbGVjdGVkQXR0YWNobWVudC5GaWxlTmFtZVwiPjwvaWZyYW1lPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiZW5kXCIgY2xhc3M9XCJwcmV2aWV3LWFjdGlvbnNcIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2UgY2xhc3M9XCJidG4tY2xvc2VcIj5DaGl1ZGk8L2J1dHRvbj5cclxuICAgICAgQGlmIChzZWxlY3RlZEF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgIT09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwidmlld0F0dGFjaG1lbnQoc2VsZWN0ZWRBdHRhY2htZW50KVwiIGNsYXNzPVwiYnRuLWRvd25sb2FkXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj4gPHNwYW4+e3sgZG93bmxvYWRMYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIH1cclxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjwhLS0gVEVNUExBVEUgUEVSIElMIFBVTFNBTlRFIERJIEFHR0lVTlRBIE5VT1ZPIEFMTEVHQVRPIC0tPlxyXG48bmctdGVtcGxhdGUgI2FkZEF0dGFjaG1lbnRCdXR0b24+XHJcbiAgPGlucHV0ICNmaWxlSW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgaWQ9XCJmaWxlX2F0dGFjaG1lbnRcIiBuYW1lPVwiZmlsZV9hdHRhY2htZW50XCIgdHlwZT1cImZpbGVcIlxyXG4gICAgKGNoYW5nZSk9XCJvbkZpbGVBZGRlZCgkZXZlbnQpXCIgW2FjY2VwdF09XCJhY2NlcHRlZEZpbGVUeXBlc1wiIFttdWx0aXBsZV09XCJsb2FkTXVsdGlwbGVGaWxlc1wiIC8+XHJcblxyXG4gIEBpZiAoYWxsb3dlZFR5cGVzICYmIGFsbG93ZWRUeXBlcy5sZW5ndGggPT0gMSAmJiAobXVsdGlwbGVBdHRhY2htZW50ID09IHRydWUgfHwgIWF0dGFjaG1lbnRzTGlzdCB8fFxyXG4gIGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fCAoYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcbiAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtYi00IG1lLTUgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgIChjbGljayk9XCJhZGRGaWxlKGFsbG93ZWRUeXBlc1swXSwgZmlsZUlucHV0KVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCI+XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlc1swXSA9PSAxKSB7IDxtYXQtaWNvbj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPiB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlc1swXSA9PSAyKSB7IDxpIGNsYXNzPVwiZmFzIGZhLWxpbmtcIj48L2k+IH1cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzWzBdID09IDMpIHsgPGkgY2xhc3M9XCJmYS1icmFuZHMgZmEtZHJvcGJveFwiPjwvaT4gfVxyXG4gICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPlxyXG4gICAgICB7eyBhbGxvd2VkVHlwZXNbMF0gPT0gMSA/IChhZGRCdXR0b25MYWJlbCArIFwiIGZpbGVcIikgOiBhbGxvd2VkVHlwZXNbMF0gPT0gMiA/IChhZGRCdXR0b25MYWJlbCArIFwiIGxpbmtcIikgOlxyXG4gICAgICB1cGxvYWRXaXRoRHJvcGJveExhYmVsIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG5cclxuICBAaWYgKCFzZXBhcmF0ZWRVcGxvYWRCdXR0b25zICYmIGFsbG93ZWRUeXBlcyAmJiBhbGxvd2VkVHlwZXMubGVuZ3RoID4gMSAmJiAobXVsdGlwbGVBdHRhY2htZW50ID09IHRydWUgfHxcclxuICAhYXR0YWNobWVudHNMaXN0IHx8IGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fCAoYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcbiAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtYi00IG1lLTUgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJhdHRhY2htZW50VHlwZU1lbnVcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiPlxyXG4gICAgQGlmIChtdWx0aXBsZUF0dGFjaG1lbnQgIT0gdHJ1ZSkgeyA8bWF0LWljb24+Y2xvdWRfdXBsb2FkPC9tYXQtaWNvbj4gfSBAZWxzZSB7IDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiB9XHJcbiAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAwcHhcIj57eyBhZGRCdXR0b25MYWJlbCB9fTwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPG1hdC1tZW51ICNhdHRhY2htZW50VHlwZU1lbnU9XCJtYXRNZW51XCI+XHJcbiAgICA8aW5wdXQgI2ltYWdlSW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgaWQ9XCJmaWxlX2F0dGFjaG1lbnRcIiBuYW1lPVwiZmlsZV9hdHRhY2htZW50XCIgdHlwZT1cImZpbGVcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZVR5cGVzXCIgW211bHRpcGxlXT1cImxvYWRNdWx0aXBsZUZpbGVzXCIgLz5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDEpKSB7XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImltYWdlSW5wdXQuY2xpY2soKVwiIGNsYXNzPVwiZXFwLWF0dGFjaG1lbnRzLWZpbGUtYnRuXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGVcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5GaWxlPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGNsaWNrKT1cInN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiIGNsYXNzPVwiZXFwLWF0dGFjaG1lbnRzLWxpbmstYnRuXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWxpbmtcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5MaW5rPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaG9vc2VEcm9wYm94RmlsZSgpXCIgY2xhc3M9XCJlcXAtYXR0YWNobWVudHMtbGluay1idG5cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYS1icmFuZHMgZmEtZHJvcGJveFwiPjwvaT5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkRyb3Bib3g8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICA8L21hdC1tZW51PlxyXG4gIH1cclxuXHJcbiAgQGlmIChzZXBhcmF0ZWRVcGxvYWRCdXR0b25zICYmIGFsbG93ZWRUeXBlcyAmJiBhbGxvd2VkVHlwZXMubGVuZ3RoID4gMSAmJiAobXVsdGlwbGVBdHRhY2htZW50ID09IHRydWUgfHxcclxuICAhYXR0YWNobWVudHNMaXN0IHx8IGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fCAoYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcbiAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMSkpIHtcclxuICAgIDxidXR0b24gKGNsaWNrKT1cImltYWdlSW5wdXQuY2xpY2soKVwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1jbG91ZC11cGxvYWRcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5GaWxlPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICA8aW5wdXQgI2ltYWdlSW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgaWQ9XCJmaWxlX2F0dGFjaG1lbnRcIiBuYW1lPVwiZmlsZV9hdHRhY2htZW50XCIgdHlwZT1cImZpbGVcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZVR5cGVzXCIgW211bHRpcGxlXT1cImxvYWRNdWx0aXBsZUZpbGVzXCIgLz5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpKSB7XHJcbiAgICA8YnV0dG9uIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGVxcC1hdHRhY2htZW50cy1hZGQtYnRuXCIgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWxpbmtcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5MaW5rPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2hvb3NlRHJvcGJveEZpbGUoKVwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYS1icmFuZHMgZmEtZHJvcGJveFwiPjwvaT5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkRyb3Bib3g8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICB9XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNjcm9wcGllVGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGVybi1kaWFsb2ctY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9XCJwcmV2aWV3LWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWluZm9cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtZ3JvdXBcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFpbi10XCI+e3sgY3JvcExhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLXRcIj5SZWdvbGEgbGUgZGltZW5zaW9uaSBlIGwnb3JpZW50YW1lbnRvPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhYm9ydEZpbGUoKVwiIGNsYXNzPVwiY2xvc2UtYnRuXCI+PG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJwcmV2aWV3LWNvbnRlbnQtYXJlYVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY3JvcC10b29sYmFyXCI+XHJcbiAgICAgICAgQGlmIChjcm9wT3B0aW9ucy5pbmNsdWRlcygxKSkge1xyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRUb29sdGlwXT1cInJvdGF0ZUxlZnRMYWJlbFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicm90YXRlTGVmdCgpXCI+PG1hdC1pY29uPnJvdGF0ZV9sZWZ0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0VG9vbHRpcF09XCJyb3RhdGVSaWdodExhYmVsXCJcclxuICAgICAgICAgIChjbGljayk9XCJyb3RhdGVSaWdodCgpXCI+PG1hdC1pY29uPnJvdGF0ZV9yaWdodDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoY3JvcE9wdGlvbnMuaW5jbHVkZXMoMikpIHtcclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0VG9vbHRpcF09XCJmbGlwSG9yaW56b250YWxMYWJlbFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZmxpcEhvcml6b250YWwoKVwiPjxtYXQtaWNvbj5mbGlwX2hvcml6b250YWw8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRUb29sdGlwXT1cImZsaXBWZXJ0aWNhbExhYmVsXCJcclxuICAgICAgICAgIChjbGljayk9XCJmbGlwVmVydGljYWwoKVwiPjxtYXQtaWNvbj5mbGlwX3ZlcnRpY2FsPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlJlc2V0XCJcclxuICAgICAgICAgIChjbGljayk9XCJyZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKClcIj48bWF0LWljb24+cmVwbGF5PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtdmlld2VyLXdyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3JvcC1jb250YWluZXItbW9kZXJuXCI+XHJcbiAgICAgICAgICA8aW1hZ2UtY3JvcHBlciBbaW1hZ2VGaWxlXT1cInNlbGVjdGVkRmlsZVwiIFttYWludGFpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCIgW2NhbnZhc1JvdGF0aW9uXT1cImNhbnZhc1JvdGF0aW9uXCJcclxuICAgICAgICAgICAgW3RyYW5zZm9ybV09XCJ0cmFuc2Zvcm1cIiBmb3JtYXQ9XCJwbmdcIiAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCIgW3Jlc2l6ZVRvV2lkdGhdPVwiY3VzdG9tV2lkdGhcIlxyXG4gICAgICAgICAgICBbcmVzaXplVG9IZWlnaHRdPVwiY3VzdG9tSGVpZ2h0XCIgW291dHB1dF09XCInYmFzZTY0J1wiIFtjb250YWluV2l0aGluQXNwZWN0UmF0aW9dPVwidHJ1ZVwiIFtvbmx5U2NhbGVEb3duXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbYWxpZ25JbWFnZV09XCInY2VudGVyJ1wiPlxyXG4gICAgICAgICAgPC9pbWFnZS1jcm9wcGVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIiBjbGFzcz1cInByZXZpZXctYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImFib3J0RmlsZSgpXCIgY2xhc3M9XCJidG4tY2xvc2VcIj57eyBhYm9ydExhYmVsIH19PC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNvbmZpcm1BZGRBdHRhY2htZW50KClcIiBjbGFzcz1cImJ0bi1kb3dubG9hZFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+IHt7IGNvbmZpcm1MYWJlbCB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcblxyXG48IS0tIFRFTVBMQVRFIFBFUiBGT1JNIERJIEFHR0lVTlRBIERJIFVOIExJTksgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjYWRkaW5nTGlua1RlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2Rlcm4tZGlhbG9nLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwicHJldmlldy1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR5cGUtaWNvbi13cmFwcGVyXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+bGluazwvbWF0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLWdyb3VwXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW4tdFwiPkFnZ2l1bmdpIHVuIGxpbms8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtdFwiPkluc2VyaXNjaSBsJ1VSTCBkZWxsYSByaXNvcnNhIHdlYjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2UgY2xhc3M9XCJjbG9zZS1idG5cIj48bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cImFkZC1saW5rLW1vZGVybi1jb250ZW50XCI+XHJcbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwibmV3QXR0YWNobWVudEZvcm1cIiBjbGFzcz1cImFkZC1saW5rLWZvcm1cIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctMTAwIG10LTNcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+VVJMIGRlbCBjb2xsZWdhbWVudG88L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmaWxlUGF0aFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly8uLi5cIiByZXF1aXJlZD5cclxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+bGFuZ3VhZ2U8L21hdC1pY29uPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+VGl0b2xvIChvcHppb25hbGUpPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZmlsZU5hbWVcIiBwbGFjZWhvbGRlcj1cIkVzLiBEb2N1bWVudG8gUHJvZ2V0dG9cIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+dGl0bGU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZm9ybT5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIiBjbGFzcz1cInByZXZpZXctYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjbGFzcz1cImJ0bi1jbG9zZVwiPkFubnVsbGE8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbbWF0LWRpYWxvZy1jbG9zZV09XCJuZXdBdHRhY2htZW50Rm9ybS52YWx1ZVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cIm5ld0F0dGFjaG1lbnRGb3JtLmludmFsaWRcIiBjbGFzcz1cImJ0bi1kb3dubG9hZFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZ2dpdW5naVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==