ngx-techlify-core 14.10.0 → 14.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/entity-files/entity-files-view-all.component.mjs +39 -23
- package/esm2020/lib/file-dragdrop-uploader/file-dragdrop-uploader/file-dragdrop-uploader.component.mjs +90 -0
- package/esm2020/lib/file-dragdrop-uploader/file-dragdrop-uploader.module.mjs +40 -0
- package/esm2020/lib/user/user-enable-button-component/user-enable-button.component.mjs +3 -3
- package/esm2020/lib/user/users-view-all.component.mjs +3 -3
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/ngx-techlify-core.mjs +7284 -7154
- package/fesm2015/ngx-techlify-core.mjs.map +1 -1
- package/fesm2020/ngx-techlify-core.mjs +7079 -6951
- package/fesm2020/ngx-techlify-core.mjs.map +1 -1
- package/lib/entity-files/entity-files-view-all.component.d.ts +15 -2
- package/lib/file-dragdrop-uploader/file-dragdrop-uploader/file-dragdrop-uploader.component.d.ts +29 -0
- package/lib/file-dragdrop-uploader/file-dragdrop-uploader.module.d.ts +12 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -6,6 +6,7 @@ import { debounceTime } from 'rxjs/operators';
|
|
|
6
6
|
import { MatTableDataSource } from '@angular/material/table';
|
|
7
7
|
import { ActionPopupComponent } from '../action-popup/action-popup.component';
|
|
8
8
|
import { TechlifyTaggerTagFormConfigModel } from "../techlify-tagger-tag-form-field/techlify-tagger-tag-form-config.model";
|
|
9
|
+
import { UserTypeEnum } from "../user/user-type.enum";
|
|
9
10
|
import * as i0 from "@angular/core";
|
|
10
11
|
import * as i1 from "./entity-file.service";
|
|
11
12
|
import * as i2 from "@angular/common";
|
|
@@ -13,33 +14,34 @@ import * as i3 from "../core/alert.service";
|
|
|
13
14
|
import * as i4 from "@angular/material/dialog";
|
|
14
15
|
import * as i5 from "@angular/forms";
|
|
15
16
|
import * as i6 from "../core/error-handler.service";
|
|
16
|
-
import * as i7 from "
|
|
17
|
-
import * as i8 from "@angular/flex-layout/
|
|
18
|
-
import * as i9 from "
|
|
19
|
-
import * as i10 from "../
|
|
20
|
-
import * as i11 from "
|
|
21
|
-
import * as i12 from "
|
|
22
|
-
import * as i13 from "@angular/material/
|
|
23
|
-
import * as i14 from "@angular/material/
|
|
24
|
-
import * as i15 from "@angular/material/
|
|
25
|
-
import * as i16 from "@angular/material/
|
|
26
|
-
import * as i17 from "@angular/material/
|
|
27
|
-
import * as i18 from "@angular/material/
|
|
28
|
-
import * as i19 from "@angular/material/
|
|
29
|
-
import * as i20 from "@angular/material/
|
|
30
|
-
import * as i21 from "@angular/material/
|
|
31
|
-
import * as i22 from "
|
|
32
|
-
import * as i23 from "../
|
|
17
|
+
import * as i7 from "../user";
|
|
18
|
+
import * as i8 from "@angular/flex-layout/flex";
|
|
19
|
+
import * as i9 from "@angular/flex-layout/extended";
|
|
20
|
+
import * as i10 from "../file-dropper/file-dropper.component";
|
|
21
|
+
import * as i11 from "../document-viewer/document-viewer.component";
|
|
22
|
+
import * as i12 from "ngx-infinite-scroll";
|
|
23
|
+
import * as i13 from "@angular/material/button";
|
|
24
|
+
import * as i14 from "@angular/material/checkbox";
|
|
25
|
+
import * as i15 from "@angular/material/form-field";
|
|
26
|
+
import * as i16 from "@angular/material/icon";
|
|
27
|
+
import * as i17 from "@angular/material/input";
|
|
28
|
+
import * as i18 from "@angular/material/sort";
|
|
29
|
+
import * as i19 from "@angular/material/table";
|
|
30
|
+
import * as i20 from "@angular/material/card";
|
|
31
|
+
import * as i21 from "@angular/material/chips";
|
|
32
|
+
import * as i22 from "@angular/material/tooltip";
|
|
33
|
+
import * as i23 from "../techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component";
|
|
33
34
|
import * as i24 from "../read-more/read-more.component";
|
|
34
35
|
import * as i25 from "@angular/material/progress-bar";
|
|
35
36
|
let EntityFilesViewAllComponent = class EntityFilesViewAllComponent {
|
|
36
|
-
constructor(entityFileService, location, alertService, dialog, fb, errorHandler) {
|
|
37
|
+
constructor(entityFileService, location, alertService, dialog, fb, errorHandler, currentUserService) {
|
|
37
38
|
this.entityFileService = entityFileService;
|
|
38
39
|
this.location = location;
|
|
39
40
|
this.alertService = alertService;
|
|
40
41
|
this.dialog = dialog;
|
|
41
42
|
this.fb = fb;
|
|
42
43
|
this.errorHandler = errorHandler;
|
|
44
|
+
this.currentUserService = currentUserService;
|
|
43
45
|
this.viewOnly = false;
|
|
44
46
|
this.allowMultipleFiles = false;
|
|
45
47
|
this.allowBulkUpdate = false;
|
|
@@ -68,6 +70,11 @@ let EntityFilesViewAllComponent = class EntityFilesViewAllComponent {
|
|
|
68
70
|
this.fileList = [];
|
|
69
71
|
this.dataSource = new MatTableDataSource();
|
|
70
72
|
this.isReload = false;
|
|
73
|
+
this.isShowCreateAction = true;
|
|
74
|
+
this.isShowUpdateAction = true;
|
|
75
|
+
this.isShowDeleteAction = true;
|
|
76
|
+
this.isShowReadAction = true;
|
|
77
|
+
this.user = this.currentUserService.getUser();
|
|
71
78
|
this.filterFormGroup = this.fb.group({
|
|
72
79
|
title: [""],
|
|
73
80
|
tag_ids: [""]
|
|
@@ -79,6 +86,13 @@ let EntityFilesViewAllComponent = class EntityFilesViewAllComponent {
|
|
|
79
86
|
});
|
|
80
87
|
}
|
|
81
88
|
ngOnInit() {
|
|
89
|
+
// Check permissions
|
|
90
|
+
if (this.user.user_type_id !== UserTypeEnum.CLIENT_ADMIN) {
|
|
91
|
+
this.isShowCreateAction = this.permission?.create ? this.currentUserService.hasPermission(this.permission.create) : true;
|
|
92
|
+
this.isShowUpdateAction = this.permission?.update ? this.currentUserService.hasPermission(this.permission.update) : true;
|
|
93
|
+
this.isShowReadAction = this.permission?.read ? this.currentUserService.hasPermission(this.permission.read) : true;
|
|
94
|
+
this.isShowDeleteAction = this.permission?.delete ? this.currentUserService.hasPermission(this.permission.delete) : true;
|
|
95
|
+
}
|
|
82
96
|
// File dropper config
|
|
83
97
|
this.fileConfig = {
|
|
84
98
|
fileId: "entityDashboardDropper",
|
|
@@ -296,16 +310,16 @@ let EntityFilesViewAllComponent = class EntityFilesViewAllComponent {
|
|
|
296
310
|
}
|
|
297
311
|
}
|
|
298
312
|
};
|
|
299
|
-
EntityFilesViewAllComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: EntityFilesViewAllComponent, deps: [{ token: i1.EntityFileService }, { token: i2.Location }, { token: i3.AlertService }, { token: i4.MatDialog }, { token: i5.UntypedFormBuilder }, { token: i6.ErrorHandlerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
300
|
-
EntityFilesViewAllComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: EntityFilesViewAllComponent, selector: "app-entity-files-view-all", inputs: { entityId: "entityId", entityType: "entityType", viewOnly: "viewOnly", removeSearch: "removeSearch", hideTitleAndDetails: "hideTitleAndDetails", displayMode: "displayMode", allowMultipleFiles: "allowMultipleFiles", allowBulkUpdate: "allowBulkUpdate", useTechlifyTags: "useTechlifyTags", techlifyTagCategories: "techlifyTagCategories", techlifyTagConfig: "techlifyTagConfig", title: "title" }, ngImport: i0, template: "<div>\n <div fxLayout=\"column\" [fxHide]=\"!this.documentIds.length\" fxHide.xs fxHide.sm fxHide.lt-md>\n <mat-card class=\"update_card\" *ngIf=\"this.documentIds.length\">\n <mat-card-header>\n <mat-card-title>\n <div mat-dialog-title class=\"mt-2 ml-2 text-center\">\n <div>Update Selected Rows</div>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content fxLayout=\"column\">\n <form [formGroup]=\"updateRowForm\">\n <div fxLayout=\"column\">\n\n <mat-form-field fxFlex=\"100%\" class=\"px-1\">\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" />\n <button mat-button *ngIf=\"updateRowForm.get('title').value || updateRowForm.get('title').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('title', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('title').value || updateRowForm.get('title').value===0)\n && updateRowForm.get('title').valid\" (click)=\"bulkUpdate('title')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"100%\" class=\"px-1\">\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n <button mat-button *ngIf=\"updateRowForm.get('details').value || updateRowForm.get('details').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('details', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('details').value || updateRowForm.get('details').value===0)\n && updateRowForm.get('details').valid\" (click)=\"bulkUpdate('details')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field modelType=\"entity-file\" formControlName=\"tag_ids\"\n placeholder=\"Enter new tag\">\n </app-techlify-tagger-tag-form-field>\n <button mat-button *ngIf=\"updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('tag_ids', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0)\n && updateRowForm.get('tag_ids').valid\" (click)=\"bulkUpdate('tag_ids')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n </div>\n\n <div>\n <div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div fxLayout=\"row\" fxLayoutGap=\"1rem\">\n <mat-card [fxFlex]=\"this.documentIds.length ? '100%' : '70%'\">\n <mat-card-title>\n <div fxLayout fxLayoutGap=\"1rem\">\n <h3 class=\"font-weight-bold primary-color\" fxLayout=\"center center\">\n <mat-icon>\n <span class=\"material-icons\">\n description\n </span>\n </mat-icon>\n {{title}}s\n </h3>\n <div>\n <button type=\"button\" class=\"mx-1\" mat-raised-button color=\"primary\" (click)=\"addEntityFile()\"\n *ngIf=\"!viewOnly\">\n <mat-icon>\n <span class=\"material-icons\">\n add_circle_outline\n </span>\n </mat-icon>\n {{title}}\n </button>\n </div>\n </div>\n </mat-card-title>\n <mat-card-subtitle>\n <form [formGroup]=\"filterFormGroup\" style=\"font-size: 10px;\" fxLayout fxLayoutGap=\"1rem\">\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Search\" name=\"title\"\n autocomplete=\"off\" />\n <button mat-button *ngIf=\"filters.title\" matSuffix mat-icon-button\n (click)=\"resetFieldValue($event, 'title')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" *ngIf=\"useTechlifyTags\">\n <mat-label>Tag</mat-label>\n <app-searchable-selector formControlName=\"tag_ids\" apiUrl=\"api/techlify-tagger-tags\" [multiple]=\"true\"\n placeHolder=\"Tag\">\n </app-searchable-selector>\n <button mat-icon-button matSuffix *ngIf=\"filterFormGroup.get('tag_ids').value.length\"\n (click)=\"resetFieldValue($event, 'tag_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <button mat-icon-button (click)=\"reload()\" *ngIf=\"isReload\" type=\"button\" matTooltip=\"Refresh\">\n <mat-icon>\n <span class=\"material-icons\">\n refresh\n </span>\n </mat-icon>\n </button>\n </form>\n </mat-card-subtitle>\n <mat-card-content class=\"entity-file-card\">\n <table mat-table [dataSource]=\"dataSource\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef style=\"width:30px\">\n <mat-checkbox name=\"employee\" [(ngModel)]=\"isAllSelected\" (change)=\"selectAll()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let element\" style=\"width:30px\">\n <mat-checkbox name=\"employee[{{element?.id}}]\" (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"element.is_selected\" (change)=\"employeeListModified($event, element)\"\n [disabled]=\"!entityFiles.length\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n <span>\n {{element.title}}\n </span>\n <span>\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted\">\n <button mat-icon-button type=\"button\">\n <mat-icon>download</mat-icon>\n </button>\n </a>\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\">\n <app-read-more [text]=\"element.details\" [maxLength]=\"50\"></app-read-more>\n </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\"> {{ sizeOf(element.file_size)}} </td>\n </ng-container>\n\n <!-- Tags Column -->\n <ng-container matColumnDef=\"tag\">\n <th mat-header-cell *matHeaderCellDef> Tag </th>\n <td mat-cell *matCellDef=\"let element\" class=\"p-1\">\n <mat-chip-list aria-label=\"Tags\">\n <mat-chip *ngFor=\"let tag of element.tags\">\n {{ tag?.title }}\n </mat-chip>\n </mat-chip-list>\n </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" style=\"min-width:110px\" class=\"text-muted\">\n <button type=\"button\" mat-icon-button (click)=\"editEntityFile(element)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"deleteEntityFile(element)\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n <section fxFlex=\"30%\" *ngIf=\"!this.documentIds.length\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </section>\n </div>\n </div>\n </div>\n\n <div fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" class=\"mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of entityFiles\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i7.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i7.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i7.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i8.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "component", type: i9.FileDropperComponent, selector: "app-file-dropper", inputs: ["fileArray", "config", "styles"], outputs: ["fileChanged"] }, { kind: "component", type: i10.DocumentViewerComponent, selector: "app-document-viewer", inputs: ["config", "file", "fileUrl", "disableEdit"], outputs: ["remove"] }, { kind: "directive", type: i11.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i12.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i4.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "component", type: i14.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i14.MatLabel, selector: "mat-label" }, { kind: "directive", type: i14.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i16.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: "directive", type: i17.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i18.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i18.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i18.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i18.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i18.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i18.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i18.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i18.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i18.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i18.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i19.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "component", type: i19.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i19.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i19.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: i19.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i20.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i20.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i21.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i22.TechlifyTaggerTagFormFieldComponent, selector: "app-techlify-tagger-tag-form-field", inputs: ["config", "modelType", "modelId", "allTags", "categories", "defaultCreateCategory", "required", "disabled", "value", "placeholder"] }, { kind: "component", type: i23.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: i24.ReadMoreComponent, selector: "app-read-more", inputs: ["text", "maxLength"] }, { kind: "component", type: i25.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
313
|
+
EntityFilesViewAllComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: EntityFilesViewAllComponent, deps: [{ token: i1.EntityFileService }, { token: i2.Location }, { token: i3.AlertService }, { token: i4.MatDialog }, { token: i5.UntypedFormBuilder }, { token: i6.ErrorHandlerService }, { token: i7.CurrentUserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
314
|
+
EntityFilesViewAllComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: EntityFilesViewAllComponent, selector: "app-entity-files-view-all", inputs: { entityId: "entityId", entityType: "entityType", viewOnly: "viewOnly", removeSearch: "removeSearch", hideTitleAndDetails: "hideTitleAndDetails", displayMode: "displayMode", allowMultipleFiles: "allowMultipleFiles", allowBulkUpdate: "allowBulkUpdate", useTechlifyTags: "useTechlifyTags", techlifyTagCategories: "techlifyTagCategories", techlifyTagConfig: "techlifyTagConfig", title: "title", permission: "permission" }, ngImport: i0, template: "<div>\n <div fxLayout=\"column\" [fxHide]=\"!this.documentIds.length\" fxHide.xs fxHide.sm fxHide.lt-md>\n <mat-card class=\"update_card\" *ngIf=\"this.documentIds.length\">\n <mat-card-header>\n <mat-card-title>\n <div mat-dialog-title class=\"mt-2 ml-2 text-center\">\n <div>Update Selected Rows</div>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content fxLayout=\"column\">\n <form [formGroup]=\"updateRowForm\">\n <div fxLayout=\"column\">\n\n <mat-form-field fxFlex=\"100%\" class=\"px-1\">\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" />\n <button mat-button *ngIf=\"updateRowForm.get('title').value || updateRowForm.get('title').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('title', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('title').value || updateRowForm.get('title').value===0)\n && updateRowForm.get('title').valid\" (click)=\"bulkUpdate('title')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"100%\" class=\"px-1\">\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n <button mat-button *ngIf=\"updateRowForm.get('details').value || updateRowForm.get('details').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('details', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('details').value || updateRowForm.get('details').value===0)\n && updateRowForm.get('details').valid\" (click)=\"bulkUpdate('details')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field modelType=\"entity-file\" formControlName=\"tag_ids\"\n placeholder=\"Enter new tag\">\n </app-techlify-tagger-tag-form-field>\n <button mat-button *ngIf=\"updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('tag_ids', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0)\n && updateRowForm.get('tag_ids').valid\" (click)=\"bulkUpdate('tag_ids')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n </div>\n\n <div>\n <div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div fxLayout=\"row\" fxLayoutGap=\"1rem\">\n <mat-card [fxFlex]=\"this.documentIds.length ? '100%' : '70%'\">\n <mat-card-title>\n <div fxLayout fxLayoutGap=\"1rem\">\n <h3 class=\"font-weight-bold primary-color\" fxLayout=\"center center\">\n <mat-icon>\n <span class=\"material-icons\">\n description\n </span>\n </mat-icon>\n {{title}}s\n </h3>\n <div>\n <button type=\"button\" class=\"mx-1\" mat-raised-button color=\"primary\" (click)=\"addEntityFile()\"\n *ngIf=\"!viewOnly && isShowCreateAction\">\n <mat-icon>\n <span class=\"material-icons\">\n add_circle_outline\n </span>\n </mat-icon>\n {{title}}\n </button>\n </div>\n </div>\n </mat-card-title>\n <mat-card-subtitle>\n <form [formGroup]=\"filterFormGroup\" style=\"font-size: 10px;\" fxLayout fxLayoutGap=\"1rem\">\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Search\" name=\"title\"\n autocomplete=\"off\" />\n <button mat-button *ngIf=\"filters.title\" matSuffix mat-icon-button\n (click)=\"resetFieldValue($event, 'title')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field\n [categories]=\"techlifyTagCategories\"\n formControlName=\"tag_ids\"\n placeholder=\"Select Tags\"\n [config]=\"techlifyTagConfig\"\n ></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n </ng-container>\n\n\n <button mat-icon-button (click)=\"reload()\" *ngIf=\"isReload\" type=\"button\" matTooltip=\"Refresh\">\n <mat-icon>\n <span class=\"material-icons\">\n refresh\n </span>\n </mat-icon>\n </button>\n </form>\n </mat-card-subtitle>\n <mat-card-content class=\"entity-file-card\">\n <table mat-table [dataSource]=\"dataSource\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef style=\"width:30px\">\n <mat-checkbox name=\"employee\" [(ngModel)]=\"isAllSelected\" (change)=\"selectAll()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let element\" style=\"width:30px\">\n <mat-checkbox name=\"employee[{{element?.id}}]\" (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"element.is_selected\" (change)=\"employeeListModified($event, element)\"\n [disabled]=\"!entityFiles.length\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n <span>\n {{element.title}}\n </span>\n <span>\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted\">\n <button mat-icon-button type=\"button\">\n <mat-icon>download</mat-icon>\n </button>\n </a>\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\">\n <app-read-more [text]=\"element.details\" [maxLength]=\"50\"></app-read-more>\n </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\"> {{ sizeOf(element.file_size)}} </td>\n </ng-container>\n\n <!-- Tags Column -->\n <ng-container matColumnDef=\"tag\">\n <th mat-header-cell *matHeaderCellDef> Tag </th>\n <td mat-cell *matCellDef=\"let element\" class=\"p-1\">\n <mat-chip-list aria-label=\"Tags\">\n <mat-chip *ngFor=\"let tag of element.tags\">\n {{ tag?.title }}\n </mat-chip>\n </mat-chip-list>\n </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" style=\"min-width:110px\" class=\"text-muted\">\n <button *ngIf=\"isShowUpdateAction\" type=\"button\" mat-icon-button (click)=\"editEntityFile(element)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button *ngIf=\"isShowDeleteAction\" type=\"button\" mat-icon-button (click)=\"deleteEntityFile(element)\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n <section fxFlex=\"30%\" *ngIf=\"!this.documentIds.length\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </section>\n </div>\n </div>\n </div>\n\n <div fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" class=\"mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of entityFiles\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i8.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i8.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i9.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "component", type: i10.FileDropperComponent, selector: "app-file-dropper", inputs: ["fileArray", "config", "styles"], outputs: ["fileChanged"] }, { kind: "component", type: i11.DocumentViewerComponent, selector: "app-document-viewer", inputs: ["config", "file", "fileUrl", "disableEdit"], outputs: ["remove"] }, { kind: "directive", type: i12.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i13.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i14.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i4.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "component", type: i15.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i15.MatLabel, selector: "mat-label" }, { kind: "directive", type: i15.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i16.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i17.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: "directive", type: i18.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i19.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i19.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i19.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i19.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i19.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i19.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i19.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i19.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i19.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i19.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i20.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "component", type: i20.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i20.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i20.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: i20.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i21.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i21.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i22.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i23.TechlifyTaggerTagFormFieldComponent, selector: "app-techlify-tagger-tag-form-field", inputs: ["config", "modelType", "modelId", "allTags", "categories", "defaultCreateCategory", "required", "disabled", "value", "placeholder"] }, { kind: "component", type: i24.ReadMoreComponent, selector: "app-read-more", inputs: ["text", "maxLength"] }, { kind: "component", type: i25.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
301
315
|
EntityFilesViewAllComponent = __decorate([
|
|
302
316
|
UntilDestroy()
|
|
303
317
|
], EntityFilesViewAllComponent);
|
|
304
318
|
export { EntityFilesViewAllComponent };
|
|
305
319
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: EntityFilesViewAllComponent, decorators: [{
|
|
306
320
|
type: Component,
|
|
307
|
-
args: [{ selector: 'app-entity-files-view-all', template: "<div>\n <div fxLayout=\"column\" [fxHide]=\"!this.documentIds.length\" fxHide.xs fxHide.sm fxHide.lt-md>\n <mat-card class=\"update_card\" *ngIf=\"this.documentIds.length\">\n <mat-card-header>\n <mat-card-title>\n <div mat-dialog-title class=\"mt-2 ml-2 text-center\">\n <div>Update Selected Rows</div>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content fxLayout=\"column\">\n <form [formGroup]=\"updateRowForm\">\n <div fxLayout=\"column\">\n\n <mat-form-field fxFlex=\"100%\" class=\"px-1\">\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" />\n <button mat-button *ngIf=\"updateRowForm.get('title').value || updateRowForm.get('title').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('title', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('title').value || updateRowForm.get('title').value===0)\n && updateRowForm.get('title').valid\" (click)=\"bulkUpdate('title')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"100%\" class=\"px-1\">\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n <button mat-button *ngIf=\"updateRowForm.get('details').value || updateRowForm.get('details').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('details', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('details').value || updateRowForm.get('details').value===0)\n && updateRowForm.get('details').valid\" (click)=\"bulkUpdate('details')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field modelType=\"entity-file\" formControlName=\"tag_ids\"\n placeholder=\"Enter new tag\">\n </app-techlify-tagger-tag-form-field>\n <button mat-button *ngIf=\"updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('tag_ids', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0)\n && updateRowForm.get('tag_ids').valid\" (click)=\"bulkUpdate('tag_ids')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n </div>\n\n <div>\n <div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div fxLayout=\"row\" fxLayoutGap=\"1rem\">\n <mat-card [fxFlex]=\"this.documentIds.length ? '100%' : '70%'\">\n <mat-card-title>\n <div fxLayout fxLayoutGap=\"1rem\">\n <h3 class=\"font-weight-bold primary-color\" fxLayout=\"center center\">\n <mat-icon>\n <span class=\"material-icons\">\n description\n </span>\n </mat-icon>\n {{title}}s\n </h3>\n <div>\n <button type=\"button\" class=\"mx-1\" mat-raised-button color=\"primary\" (click)=\"addEntityFile()\"\n *ngIf=\"!viewOnly\">\n <mat-icon>\n <span class=\"material-icons\">\n add_circle_outline\n </span>\n </mat-icon>\n {{title}}\n </button>\n </div>\n </div>\n </mat-card-title>\n <mat-card-subtitle>\n <form [formGroup]=\"filterFormGroup\" style=\"font-size: 10px;\" fxLayout fxLayoutGap=\"1rem\">\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Search\" name=\"title\"\n autocomplete=\"off\" />\n <button mat-button *ngIf=\"filters.title\" matSuffix mat-icon-button\n (click)=\"resetFieldValue($event, 'title')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" *ngIf=\"useTechlifyTags\">\n <mat-label>Tag</mat-label>\n <app-searchable-selector formControlName=\"tag_ids\" apiUrl=\"api/techlify-tagger-tags\" [multiple]=\"true\"\n placeHolder=\"Tag\">\n </app-searchable-selector>\n <button mat-icon-button matSuffix *ngIf=\"filterFormGroup.get('tag_ids').value.length\"\n (click)=\"resetFieldValue($event, 'tag_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <button mat-icon-button (click)=\"reload()\" *ngIf=\"isReload\" type=\"button\" matTooltip=\"Refresh\">\n <mat-icon>\n <span class=\"material-icons\">\n refresh\n </span>\n </mat-icon>\n </button>\n </form>\n </mat-card-subtitle>\n <mat-card-content class=\"entity-file-card\">\n <table mat-table [dataSource]=\"dataSource\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef style=\"width:30px\">\n <mat-checkbox name=\"employee\" [(ngModel)]=\"isAllSelected\" (change)=\"selectAll()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let element\" style=\"width:30px\">\n <mat-checkbox name=\"employee[{{element?.id}}]\" (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"element.is_selected\" (change)=\"employeeListModified($event, element)\"\n [disabled]=\"!entityFiles.length\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n <span>\n {{element.title}}\n </span>\n <span>\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted\">\n <button mat-icon-button type=\"button\">\n <mat-icon>download</mat-icon>\n </button>\n </a>\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\">\n <app-read-more [text]=\"element.details\" [maxLength]=\"50\"></app-read-more>\n </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\"> {{ sizeOf(element.file_size)}} </td>\n </ng-container>\n\n <!-- Tags Column -->\n <ng-container matColumnDef=\"tag\">\n <th mat-header-cell *matHeaderCellDef> Tag </th>\n <td mat-cell *matCellDef=\"let element\" class=\"p-1\">\n <mat-chip-list aria-label=\"Tags\">\n <mat-chip *ngFor=\"let tag of element.tags\">\n {{ tag?.title }}\n </mat-chip>\n </mat-chip-list>\n </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" style=\"min-width:110px\" class=\"text-muted\">\n <button type=\"button\" mat-icon-button (click)=\"editEntityFile(element)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"deleteEntityFile(element)\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n <section fxFlex=\"30%\" *ngIf=\"!this.documentIds.length\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </section>\n </div>\n </div>\n </div>\n\n <div fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" class=\"mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of entityFiles\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n </div>\n</div>\n" }]
|
|
308
|
-
}], ctorParameters: function () { return [{ type: i1.EntityFileService }, { type: i2.Location }, { type: i3.AlertService }, { type: i4.MatDialog }, { type: i5.UntypedFormBuilder }, { type: i6.ErrorHandlerService }]; }, propDecorators: { entityId: [{
|
|
321
|
+
args: [{ selector: 'app-entity-files-view-all', template: "<div>\n <div fxLayout=\"column\" [fxHide]=\"!this.documentIds.length\" fxHide.xs fxHide.sm fxHide.lt-md>\n <mat-card class=\"update_card\" *ngIf=\"this.documentIds.length\">\n <mat-card-header>\n <mat-card-title>\n <div mat-dialog-title class=\"mt-2 ml-2 text-center\">\n <div>Update Selected Rows</div>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content fxLayout=\"column\">\n <form [formGroup]=\"updateRowForm\">\n <div fxLayout=\"column\">\n\n <mat-form-field fxFlex=\"100%\" class=\"px-1\">\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" />\n <button mat-button *ngIf=\"updateRowForm.get('title').value || updateRowForm.get('title').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('title', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('title').value || updateRowForm.get('title').value===0)\n && updateRowForm.get('title').valid\" (click)=\"bulkUpdate('title')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"100%\" class=\"px-1\">\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n <button mat-button *ngIf=\"updateRowForm.get('details').value || updateRowForm.get('details').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('details', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('details').value || updateRowForm.get('details').value===0)\n && updateRowForm.get('details').valid\" (click)=\"bulkUpdate('details')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field modelType=\"entity-file\" formControlName=\"tag_ids\"\n placeholder=\"Enter new tag\">\n </app-techlify-tagger-tag-form-field>\n <button mat-button *ngIf=\"updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0\"\n matSuffix mat-icon-button style=\"color:red\" (click)=\"resetFieldValueOfRow('tag_ids', $event)\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0)\n && updateRowForm.get('tag_ids').valid\" (click)=\"bulkUpdate('tag_ids')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n </div>\n\n <div>\n <div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div fxLayout=\"row\" fxLayoutGap=\"1rem\">\n <mat-card [fxFlex]=\"this.documentIds.length ? '100%' : '70%'\">\n <mat-card-title>\n <div fxLayout fxLayoutGap=\"1rem\">\n <h3 class=\"font-weight-bold primary-color\" fxLayout=\"center center\">\n <mat-icon>\n <span class=\"material-icons\">\n description\n </span>\n </mat-icon>\n {{title}}s\n </h3>\n <div>\n <button type=\"button\" class=\"mx-1\" mat-raised-button color=\"primary\" (click)=\"addEntityFile()\"\n *ngIf=\"!viewOnly && isShowCreateAction\">\n <mat-icon>\n <span class=\"material-icons\">\n add_circle_outline\n </span>\n </mat-icon>\n {{title}}\n </button>\n </div>\n </div>\n </mat-card-title>\n <mat-card-subtitle>\n <form [formGroup]=\"filterFormGroup\" style=\"font-size: 10px;\" fxLayout fxLayoutGap=\"1rem\">\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Search\" name=\"title\"\n autocomplete=\"off\" />\n <button mat-button *ngIf=\"filters.title\" matSuffix mat-icon-button\n (click)=\"resetFieldValue($event, 'title')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field\n [categories]=\"techlifyTagCategories\"\n formControlName=\"tag_ids\"\n placeholder=\"Select Tags\"\n [config]=\"techlifyTagConfig\"\n ></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n </ng-container>\n\n\n <button mat-icon-button (click)=\"reload()\" *ngIf=\"isReload\" type=\"button\" matTooltip=\"Refresh\">\n <mat-icon>\n <span class=\"material-icons\">\n refresh\n </span>\n </mat-icon>\n </button>\n </form>\n </mat-card-subtitle>\n <mat-card-content class=\"entity-file-card\">\n <table mat-table [dataSource]=\"dataSource\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef style=\"width:30px\">\n <mat-checkbox name=\"employee\" [(ngModel)]=\"isAllSelected\" (change)=\"selectAll()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let element\" style=\"width:30px\">\n <mat-checkbox name=\"employee[{{element?.id}}]\" (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"element.is_selected\" (change)=\"employeeListModified($event, element)\"\n [disabled]=\"!entityFiles.length\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n <span>\n {{element.title}}\n </span>\n <span>\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted\">\n <button mat-icon-button type=\"button\">\n <mat-icon>download</mat-icon>\n </button>\n </a>\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\">\n <app-read-more [text]=\"element.details\" [maxLength]=\"50\"></app-read-more>\n </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\"> {{ sizeOf(element.file_size)}} </td>\n </ng-container>\n\n <!-- Tags Column -->\n <ng-container matColumnDef=\"tag\">\n <th mat-header-cell *matHeaderCellDef> Tag </th>\n <td mat-cell *matCellDef=\"let element\" class=\"p-1\">\n <mat-chip-list aria-label=\"Tags\">\n <mat-chip *ngFor=\"let tag of element.tags\">\n {{ tag?.title }}\n </mat-chip>\n </mat-chip-list>\n </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" style=\"min-width:110px\" class=\"text-muted\">\n <button *ngIf=\"isShowUpdateAction\" type=\"button\" mat-icon-button (click)=\"editEntityFile(element)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button *ngIf=\"isShowDeleteAction\" type=\"button\" mat-icon-button (click)=\"deleteEntityFile(element)\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n <section fxFlex=\"30%\" *ngIf=\"!this.documentIds.length\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </section>\n </div>\n </div>\n </div>\n\n <div fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" class=\"mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of entityFiles\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n </div>\n</div>\n" }]
|
|
322
|
+
}], ctorParameters: function () { return [{ type: i1.EntityFileService }, { type: i2.Location }, { type: i3.AlertService }, { type: i4.MatDialog }, { type: i5.UntypedFormBuilder }, { type: i6.ErrorHandlerService }, { type: i7.CurrentUserService }]; }, propDecorators: { entityId: [{
|
|
309
323
|
type: Input
|
|
310
324
|
}], entityType: [{
|
|
311
325
|
type: Input
|
|
@@ -329,5 +343,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImpor
|
|
|
329
343
|
type: Input
|
|
330
344
|
}], title: [{
|
|
331
345
|
type: Input
|
|
346
|
+
}], permission: [{
|
|
347
|
+
type: Input
|
|
332
348
|
}] } });
|
|
333
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZpbGVzLXZpZXctYWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvZW50aXR5LWZpbGVzL2VudGl0eS1maWxlcy12aWV3LWFsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2VudGl0eS1maWxlcy9lbnRpdHktZmlsZXMtdmlldy1hbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBR3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBSzlFLE9BQU8sRUFDTCxnQ0FBZ0MsRUFDakMsTUFBTSx5RUFBeUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBU3BFLDJCQUEyQixTQUEzQiwyQkFBMkI7SUF5Q3RDLFlBQ1UsaUJBQW9DLEVBQ3JDLFFBQWtCLEVBQ2pCLFlBQTBCLEVBQzFCLE1BQWlCLEVBQ2pCLEVBQXNCLEVBQ3RCLFlBQWlDO1FBTGpDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDckMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNqQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLE9BQUUsR0FBRixFQUFF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SztnQkFHRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBFbnRpdHlGaWxlRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vZW50aXR5LWZpbGUtZm9ybS9lbnRpdHktZmlsZS1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbnRpdHlGaWxlU2VydmljZSB9IGZyb20gJy4vZW50aXR5LWZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSBcIkBuZ25lYXQvdW50aWwtZGVzdHJveVwiO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGlvblBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vYWN0aW9uLXBvcHVwL2FjdGlvbi1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlld2VyQ29uZmlnIH0gZnJvbSAnLi4vZG9jdW1lbnQtdmlld2VyL3ZpZXdlci1jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgRmlsZURyb3BwZXJDb25maWcgfSBmcm9tICcuLi9maWxlLWRyb3BwZXInO1xuaW1wb3J0IHsgQWN0aW9uUG9wdXAgfSBmcm9tICcuLi9hY3Rpb24tcG9wdXAvYWN0aW9uLXBvcHVwLm1vZGVsJztcbmltcG9ydCB7IEVycm9ySGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL2Vycm9yLWhhbmRsZXIuc2VydmljZSc7XG5pbXBvcnQge1xuICBUZWNobGlmeVRhZ2dlclRhZ0Zvcm1Db25maWdNb2RlbFxufSBmcm9tIFwiLi4vdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkL3RlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1jb25maWcubW9kZWxcIjtcblxuXG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1lbnRpdHktZmlsZXMtdmlldy1hbGwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZpbGVzLXZpZXctYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZW50aXR5LWZpbGVzLXZpZXctYWxsLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlGaWxlc1ZpZXdBbGxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBlbnRpdHlJZDogbnVtYmVyO1xuICBASW5wdXQoKSBlbnRpdHlUeXBlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHZpZXdPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlbW92ZVNlYXJjaDogYm9vbGVhbjtcbiAgQElucHV0KCkgaGlkZVRpdGxlQW5kRGV0YWlsczogYm9vbGVhbjtcbiAgQElucHV0KCkgZGlzcGxheU1vZGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFsbG93TXVsdGlwbGVGaWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd0J1bGtVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZG9jdW1lbnRJZHM6IGFueVtdID0gW107XG4gIGlzQWxsU2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2hvdWxkIHdlIGFsbG93IHRhZ2dpbmcgZW50aXR5LWZpbGVzP1xuICAgKi9cbiAgQElucHV0KCkgdXNlVGVjaGxpZnlUYWdzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRlY2hsaWZ5VGFnQ2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgdGVjaGxpZnlUYWdDb25maWc6IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsID0gbmV3IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsKCk7XG5cbiAgdmlld2VyQ29uZmlnOiBWaWV3ZXJDb25maWc7XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSBcIkZpbGVcIjtcbiAgZmlsdGVyczogYW55ID0ge307XG4gIGVudGl0eUZpbGVzOiBhbnlbXSA9IFtdO1xuICBkaXNwbGF5ZWRDb2x1bW5zID0gW1xuICAgICdpbmRleCcsXG4gICAgJ3RpdGxlJyxcbiAgICAnZGV0YWlscycsXG4gICAgJ2ZpbGVfc2l6ZScsXG4gICAgJ3VwbG9hZGVkX29uJyxcbiAgXTtcbiAgaXNXb3JraW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHBhZ2U6IG51bWJlciA9IDE7XG4gIHBlclBhZ2U6IG51bWJlciA9IDI1O1xuICBsYXN0UGFnZTogbnVtYmVyID0gMDtcbiAgZmlsZUNvbmZpZzogRmlsZURyb3BwZXJDb25maWc7XG4gIGZpbGVMaXN0OiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJGb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXA7XG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKCk7XG4gIHVwZGF0ZVJvd0Zvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIGlzUmVsb2FkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbnRpdHlGaWxlU2VydmljZTogRW50aXR5RmlsZVNlcnZpY2UsXG4gICAgcHVibGljIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdGl0bGU6IFtcIlwiXSxcbiAgICAgIHRhZ19pZHM6IFtcIlwiXVxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVSb3dGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICB0aXRsZTogWycnXSxcbiAgICAgIGRldGFpbHM6IFsnJ10sXG4gICAgICB0YWdfaWRzOiBbJyddLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gRmlsZSBkcm9wcGVyIGNvbmZpZ1xuICAgIHRoaXMuZmlsZUNvbmZpZyA9IHtcbiAgICAgIGZpbGVJZDogXCJlbnRpdHlEYXNoYm9hcmREcm9wcGVyXCIsXG4gICAgICBjb250YWluZXJJZDogXCJlbnRpdHlEYXNoYm9hcmREcm9wcGVyQ29udGFpbmVyXCIsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgaGVpZ2h0OiBcIjUwMHB4XCJcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZTogdGhpcy5hbGxvd011bHRpcGxlRmlsZXMsXG4gICAgICBhY2NlcHRGaWxlOiBcIipcIixcbiAgICAgIG1heFNpemU6IDEwLFxuICAgICAgYWNjZXB0RmlsZVRleHQ6IFwiQWxsIEZpbGVzXCJcbiAgICB9O1xuXG4gICAgdGhpcy52aWV3ZXJDb25maWcgPSB7XG4gICAgICBpbWFnZVN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogJzIwMHB4JyxcbiAgICAgICAgd2lkdGg6ICcyMDBweCdcbiAgICAgIH0sXG4gICAgICB2aWV3ZXJTdHlsZToge1xuICAgICAgICBoZWlnaHQ6ICcgMTYwcHgnLFxuICAgICAgICB3aWR0aDogJzIwMHB4J1xuICAgICAgfSxcbiAgICAgIGhpZGVSZW1vdmU6IHRydWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuaGlkZVRpdGxlQW5kRGV0YWlscykge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmZpbHRlcih4ID0+ICh4ICE9PSAnZGV0YWlscycpICYmICh4ICE9PSAndGl0bGUnKSk7XG4gICAgfVxuICAgIHRoaXMubGlzdGVuUm91dGVzKCk7XG4gICAgdGhpcy5maWx0ZXJzID0ge1xuICAgICAgZW50aXR5X3R5cGU6IHRoaXMuZW50aXR5VHlwZSxcbiAgICAgIGVudGl0eV9pZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgIHRpdGxlOiBcIlwiXG4gICAgfTtcbiAgICB0aGlzLmZldGNoRW50aXR5RmlsZXNEZXRhaWxzKCk7XG4gICAgaWYgKHRoaXMudXNlVGVjaGxpZnlUYWdzKSB7XG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMucHVzaCgndGFnJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy52aWV3T25seSkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ2FjdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWxsb3dCdWxrVXBkYXRlKSB7XG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMucHVzaCgnc2VsZWN0Jyk7XG4gICAgfVxuICB9XG5cbiAgbGlzdGVuUm91dGVzKCkge1xuICAgIHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg1MDApLCB1bnRpbERlc3Ryb3llZCh0aGlzKSlcbiAgICAgIC5zdWJzY3JpYmUoY2hhbmdlcyA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZldGNoRW50aXR5RmlsZXNEZXRhaWxzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVycy5wYWdlID0gdGhpcy5wYWdlO1xuICAgIHRoaXMuZmlsdGVycy5wZXJQYWdlID0gdGhpcy5wZXJQYWdlO1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlO1xuICAgIGZvcm1Hcm91cC50YWdfaWRzID0gZm9ybUdyb3VwLnRhZ19pZHMudG9TdHJpbmcoKTtcbiAgICB0aGlzLmZpbHRlcnMgPSB7XG4gICAgICAuLi50aGlzLmZpbHRlcnMsXG4gICAgICAuLi5mb3JtR3JvdXAsXG4gICAgICB3aXRoOiAnY3JlYXRvcix0YWdzJ1xuICAgIH07XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIHRoaXMuZW50aXR5RmlsZVNlcnZpY2UuaW5kZXgodGhpcy5maWx0ZXJzKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXN1bHQubGFzdF9wYWdlIHx8IHRoaXMucGFnZTtcbiAgICAgICAgdGhpcy5lbnRpdHlGaWxlcyA9IHRoaXMuZW50aXR5RmlsZXMuY29uY2F0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmVudGl0eUZpbGVzKTtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5pc1dvcmtpbmcgPSBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgYWRkRW50aXR5RmlsZSgpIHtcbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFbnRpdHlGaWxlRm9ybUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6IFwiNzAwcHhcIixcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZW50aXR5OiB0aGlzLmZpbHRlcnMsXG4gICAgICAgIGhpZGVUaXRsZUFuZERldGFpbHM6IHRoaXMuaGlkZVRpdGxlQW5kRGV0YWlscyxcbiAgICAgICAgdXNlVGVjaGxpZnlUYWdzOiB0aGlzLnVzZVRlY2hsaWZ5VGFncyxcbiAgICAgICAgdGVjaGxpZnlUYWdDYXRlZ29yaWVzOiB0aGlzLnRlY2hsaWZ5VGFnQ2F0ZWdvcmllcyxcbiAgICAgICAgdGVjaGxpZnlUYWdDb25maWc6IHRoaXMudGVjaGxpZnlUYWdDb25maWcsXG4gICAgICB9LFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShhc3luYyByZXN1bHQgPT4ge1xuICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGVkaXRFbnRpdHlGaWxlKGZpbGU6IGFueSkge1xuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVudGl0eUZpbGVGb3JtQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogXCI3MDBweFwiLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgaGlkZVRpdGxlQW5kRGV0YWlsczogdGhpcy5oaWRlVGl0bGVBbmREZXRhaWxzLFxuICAgICAgICB1c2VUZWNobGlmeVRhZ3M6IHRoaXMudXNlVGVjaGxpZnlUYWdzLFxuICAgICAgICB0ZWNobGlmeVRhZ0NhdGVnb3JpZXM6IHRoaXMudGVjaGxpZnlUYWdDYXRlZ29yaWVzLFxuICAgICAgICB0ZWNobGlmeVRhZ0NvbmZpZzogdGhpcy50ZWNobGlmeVRhZ0NvbmZpZyxcbiAgICAgIH0gLy8gQW55IGRhdGEgcGFzc2VkIGhlcmUgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBtb2RlbFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlRW50aXR5RmlsZShmaWxlOiBhbnkpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFjdGlvblBvcHVwQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogXCI0MDBweFwiLFxuICAgICAgZGF0YTogPEFjdGlvblBvcHVwPntcbiAgICAgICAgdGl0bGU6IFwiRGVsZXRlIEZpbGVcIixcbiAgICAgICAgbWVzc2FnZTogYEFyZSB5b3Ugc3VyZSB0byBwcm9jZWVkIGRlbGV0ZSB0aGUgZmlsZSAke2ZpbGUudGl0bGV9P2BcbiAgICAgIH0sXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoYXN5bmMgcmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy9BY3Rpb24gY29uZmlybWVkXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZW50aXR5RmlsZVNlcnZpY2UuZGVsZXRlRW50aXR5RmlsZShcbiAgICAgICAgICBmaWxlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KFxuICAgICAgICAgIFwiRmlsZSBzdWNjZXNzZnVsbHkgZGVsZXRlZFwiLFxuICAgICAgICAgIFwic3VjY2Vzc1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uU2Nyb2xsKCkge1xuICAgIGlmICh0aGlzLnBhZ2UgPCB0aGlzLmxhc3RQYWdlICYmICF0aGlzLmlzV29ya2luZykge1xuICAgICAgdGhpcy5wYWdlICs9IDE7XG4gICAgICB0aGlzLmZldGNoRW50aXR5RmlsZXNEZXRhaWxzKCk7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkKCkge1xuICAgIHRoaXMuZW50aXR5RmlsZXMgPSBbXTtcbiAgICB0aGlzLmRvY3VtZW50SWRzID0gW107XG4gICAgdGhpcy5pc1JlbG9hZCA9IGZhbHNlO1xuICAgIHRoaXMucGFnZSA9IDE7XG4gICAgaWYgKCF0aGlzLmlzV29ya2luZykge1xuICAgICAgdGhpcy5mZXRjaEVudGl0eUZpbGVzRGV0YWlscygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkgeyB9XG5cbiAgcmVzZXRGaWVsZFZhbHVlKGV2ZW50OiBhbnksIGZpZWxkOiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC5nZXQoZmllbGQpLnNldFZhbHVlKFwiXCIpO1xuICB9XG5cbiAgc2l6ZU9mKGJ5dGVzKSB7XG4gICAgaWYgKCFieXRlcykgeyByZXR1cm4gXCIwLjAwIEJcIjsgfVxuICAgIHZhciBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZygxMDI0KSk7XG4gICAgcmV0dXJuIChieXRlcyAvIE1hdGgucG93KDEwMjQsIGUpKS50b0ZpeGVkKDIpICsgJyAnICsgJyBLTUdUUCcuY2hhckF0KGUpICsgJ0InO1xuICB9XG5cbiAgYXN5bmMgZmlsZUNoYW5nZWQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZmlsZUxpc3QgPSBldmVudDtcbiAgICBpZiAodGhpcy5maWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVMaXN0LmZvckVhY2goYXN5bmMgZmlsZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gYXdhaXQgdGhpcy5lbnRpdHlGaWxlU2VydmljZS51cGxvYWRFbnRpdHlGaWxlKFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50aXR5X3R5cGU6IHRoaXMuZW50aXR5VHlwZSxcbiAgICAgICAgICAgIGVudGl0eV9pZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmlsZUxpc3QgPSBbXTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdGaWxlcyB1cGxvYWRlZCBzdWNjZXNzZnVsbHkhJywgJ3N1Y2Nlc3MnKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5kb2N1bWVudElkcyA9IFtdO1xuICAgIHRoaXMuZW50aXR5RmlsZXMubWFwKChlbXBsb3llZTogYW55KSA9PiB7XG4gICAgICBlbXBsb3llZS5pc19zZWxlY3RlZCA9IHRoaXMuaXNBbGxTZWxlY3RlZDtcbiAgICAgIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudElkcy5wdXNoKGVtcGxveWVlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuZW50aXR5RmlsZXMpO1xuICB9XG5cbiAgZW1wbG95ZWVMaXN0TW9kaWZpZWQoZXZlbnQ6IGFueSwgZW1wbG95ZWU6IGFueSkge1xuICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmRvY3VtZW50SWRzLnB1c2goZW1wbG95ZWUuaWQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRJZHMgPSB0aGlzLmRvY3VtZW50SWRzLmZpbHRlcigoZW1wbG95ZWVEYXRhOiBhbnkpID0+IGVtcGxveWVlRGF0YSAhPSBlbXBsb3llZS5pZCk7XG4gICAgfVxuICB9XG5cbiAgdW5DaGVja0FsbCgpIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRvY3VtZW50SWRzID0gW107XG4gICAgdGhpcy5lbnRpdHlGaWxlcy5tYXAoKGVtcGxveWVlOiBhbnkpID0+IHtcbiAgICAgIGVtcGxveWVlLmlzX3NlbGVjdGVkID0gZmFsc2U7XG4gICAgfSk7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmVudGl0eUZpbGVzKTtcbiAgfVxuXG4gIHJlc2V0RmllbGRWYWx1ZU9mUm93KGZpZWxkOiBzdHJpbmcsIGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnVwZGF0ZVJvd0Zvcm0uZ2V0KGZpZWxkKS5zZXRWYWx1ZShcIlwiKTtcbiAgfVxuXG4gIGFzeW5jIGJ1bGtVcGRhdGUoZmllbGROYW1lOiBhbnkpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMudXBkYXRlUm93Rm9ybS52YWx1ZTtcbiAgICB0aGlzLmlzUmVsb2FkID0gdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIGRhdGEuZmllbGRfbmFtZSA9IGZpZWxkTmFtZTtcbiAgICBkYXRhLmRvY3VtZW50X2lkcyA9IHRoaXMuZG9jdW1lbnRJZHM7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lbnRpdHlGaWxlU2VydmljZS5idWxrVXBkYXRlKGRhdGEpLnRoZW4oXG4gICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoXCJTdWNjZXNzZnVsbHkgdXBkYXRlZFwiLCBcInN1Y2Nlc3NcIik7XG4gICAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2PlxuICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgW2Z4SGlkZV09XCIhdGhpcy5kb2N1bWVudElkcy5sZW5ndGhcIiBmeEhpZGUueHMgZnhIaWRlLnNtIGZ4SGlkZS5sdC1tZD5cbiAgICA8bWF0LWNhcmQgY2xhc3M9XCJ1cGRhdGVfY2FyZFwiICpuZ0lmPVwidGhpcy5kb2N1bWVudElkcy5sZW5ndGhcIj5cbiAgICAgIDxtYXQtY2FyZC1oZWFkZXI+XG4gICAgICAgIDxtYXQtY2FyZC10aXRsZT5cbiAgICAgICAgICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9XCJtdC0yIG1sLTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXY+VXBkYXRlIFNlbGVjdGVkIFJvd3M8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtY2FyZC10aXRsZT5cbiAgICAgIDwvbWF0LWNhcmQtaGVhZGVyPlxuICAgICAgPG1hdC1jYXJkLWNvbnRlbnQgZnhMYXlvdXQ9XCJjb2x1bW5cIj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ1cGRhdGVSb3dGb3JtXCI+XG4gICAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiPlxuXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTAwJVwiIGNsYXNzPVwicHgtMVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBwbGFjZWhvbGRlcj1cIlRpdGxlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwidXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsdWU9PT0wXCJcbiAgICAgICAgICAgICAgICBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHN0eWxlPVwiY29sb3I6cmVkXCIgKGNsaWNrKT1cInJlc2V0RmllbGRWYWx1ZU9mUm93KCd0aXRsZScsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwiY29sb3I6Z3JlZW5cIiAqbmdJZj1cIih1cGRhdGVSb3dGb3JtLmdldCgndGl0bGUnKS52YWx1ZSB8fCB1cGRhdGVSb3dGb3JtLmdldCgndGl0bGUnKS52YWx1ZT09PTApXG4gICAgICAgICAgICAgICAgJiYgdXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsaWRcIiAoY2xpY2spPVwiYnVsa1VwZGF0ZSgndGl0bGUnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kb25lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTAwJVwiIGNsYXNzPVwicHgtMVwiPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV0YWlsc1wiIHBsYWNlaG9sZGVyPVwiRGV0YWlsc1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cInVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ2RldGFpbHMnKS52YWx1ZT09PTBcIlxuICAgICAgICAgICAgICAgIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gc3R5bGU9XCJjb2xvcjpyZWRcIiAoY2xpY2spPVwicmVzZXRGaWVsZFZhbHVlT2ZSb3coJ2RldGFpbHMnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cImNvbG9yOmdyZWVuXCIgKm5nSWY9XCIodXBkYXRlUm93Rm9ybS5nZXQoJ2RldGFpbHMnKS52YWx1ZSB8fCB1cGRhdGVSb3dGb3JtLmdldCgnZGV0YWlscycpLnZhbHVlPT09MClcbiAgICAgICAgICAgICAgICAmJiB1cGRhdGVSb3dGb3JtLmdldCgnZGV0YWlscycpLnZhbGlkXCIgKGNsaWNrKT1cImJ1bGtVcGRhdGUoJ2RldGFpbHMnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kb25lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlVGVjaGxpZnlUYWdzXCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlRhZzwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxhcHAtdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkIG1vZGVsVHlwZT1cImVudGl0eS1maWxlXCIgZm9ybUNvbnRyb2xOYW1lPVwidGFnX2lkc1wiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIG5ldyB0YWdcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwidXBkYXRlUm93Rm9ybS5nZXQoJ3RhZ19pZHMnKS52YWx1ZSB8fCB1cGRhdGVSb3dGb3JtLmdldCgndGFnX2lkcycpLnZhbHVlPT09MFwiXG4gICAgICAgICAgICAgICAgICBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHN0eWxlPVwiY29sb3I6cmVkXCIgKGNsaWNrKT1cInJlc2V0RmllbGRWYWx1ZU9mUm93KCd0YWdfaWRzJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJjb2xvcjpncmVlblwiICpuZ0lmPVwiKHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0YWdfaWRzJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ3RhZ19pZHMnKS52YWx1ZT09PTApXG4gICAgICAgICAgICAgICAgICAmJiB1cGRhdGVSb3dGb3JtLmdldCgndGFnX2lkcycpLnZhbGlkXCIgKGNsaWNrKT1cImJ1bGtVcGRhdGUoJ3RhZ19pZHMnKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRvbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICA8L21hdC1jYXJkPlxuXG4gIDwvZGl2PlxuXG4gIDxkaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5XCIgKm5nSWY9XCIhZGlzcGxheU1vZGVcIj5cbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjFyZW1cIj5cbiAgICAgICAgPG1hdC1jYXJkIFtmeEZsZXhdPVwidGhpcy5kb2N1bWVudElkcy5sZW5ndGggPyAnMTAwJScgOiAnNzAlJ1wiPlxuICAgICAgICAgIDxtYXQtY2FyZC10aXRsZT5cbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQgZnhMYXlvdXRHYXA9XCIxcmVtXCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgcHJpbWFyeS1jb2xvclwiIGZ4TGF5b3V0PVwiY2VudGVyIGNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIHt7dGl0bGV9fXNcbiAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm14LTFcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiYWRkRW50aXR5RmlsZSgpXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXZpZXdPbmx5XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICBhZGRfY2lyY2xlX291dGxpbmVcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIHt7dGl0bGV9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gICAgICAgICAgPG1hdC1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtR3JvdXBcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTBweDtcIiBmeExheW91dCBmeExheW91dEdhcD1cIjFyZW1cIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiIXJlbW92ZVNlYXJjaFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgbmFtZT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiZmlsdGVycy50aXRsZVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpZWxkVmFsdWUoJGV2ZW50LCAndGl0bGUnKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgKm5nSWY9XCJ1c2VUZWNobGlmeVRhZ3NcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlRhZzwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBmb3JtQ29udHJvbE5hbWU9XCJ0YWdfaWRzXCIgYXBpVXJsPVwiYXBpL3RlY2hsaWZ5LXRhZ2dlci10YWdzXCIgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJUYWdcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAqbmdJZj1cImZpbHRlckZvcm1Hcm91cC5nZXQoJ3RhZ19pZHMnKS52YWx1ZS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGRWYWx1ZSgkZXZlbnQsICd0YWdfaWRzJylcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWxvYWQoKVwiICpuZ0lmPVwiaXNSZWxvYWRcIiB0eXBlPVwiYnV0dG9uXCIgbWF0VG9vbHRpcD1cIlJlZnJlc2hcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8L21hdC1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwiZW50aXR5LWZpbGUtY2FyZFwiPlxuICAgICAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgY2xhc3M9XCJ3LTEwMFwiIG1hdFNvcnQgbXVsdGlUZW1wbGF0ZURhdGFSb3dzIGluZmluaXRlU2Nyb2xsXG4gICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjEuNVwiIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCIgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKClcIj5cblxuICAgICAgICAgICAgICA8IS0tIFNlbGVjdCBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBzdHlsZT1cIndpZHRoOjMwcHhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggbmFtZT1cImVtcGxveWVlXCIgWyhuZ01vZGVsKV09XCJpc0FsbFNlbGVjdGVkXCIgKGNoYW5nZSk9XCJzZWxlY3RBbGwoKVwiPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIHN0eWxlPVwid2lkdGg6MzBweFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBuYW1lPVwiZW1wbG95ZWVbe3tlbGVtZW50Py5pZH19XVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVsZW1lbnQuaXNfc2VsZWN0ZWRcIiAoY2hhbmdlKT1cImVtcGxveWVlTGlzdE1vZGlmaWVkKCRldmVudCwgZWxlbWVudClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVudGl0eUZpbGVzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBJbmRleCBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiAjIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gZGF0YUluZGV4XCI+IHt7IGkrMSB9fSA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8IS0tIFRpdGxlIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFRpdGxlIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ZWxlbWVudC50aXRsZX19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7ZWxlbWVudC51cmx9fVwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwidGV4dC1kZWNvcmF0aW9uLW5vbmUgdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8IS0tIERldGFpbHMgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBEZXRhaWxzIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtcmVhZC1tb3JlIFt0ZXh0XT1cImVsZW1lbnQuZGV0YWlsc1wiIFttYXhMZW5ndGhdPVwiNTBcIj48L2FwcC1yZWFkLW1vcmU+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBGaWxlIHNpemUgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZpbGVfc2l6ZVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEZpbGUgU2l6ZSA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7IHNpemVPZihlbGVtZW50LmZpbGVfc2l6ZSl9fSA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8IS0tIFRhZ3MgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInRhZ1wiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFRhZyA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJwLTFcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1saXN0IGFyaWEtbGFiZWw9XCJUYWdzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCAqbmdGb3I9XCJsZXQgdGFnIG9mIGVsZW1lbnQudGFnc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHRhZz8udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8IS0tIFVwbG9hZGVkIE9uIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1cGxvYWRlZF9vblwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFVwbG9hZGVkIE9uIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIHt7ZWxlbWVudC5jcmVhdGVkX2F0IHwgZGF0ZTogJ21lZGl1bURhdGUnfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgQnkge3tlbGVtZW50LmNyZWF0b3I/Lm5hbWV9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBBY3Rpb25zIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQWN0aW9ucyA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6MTEwcHhcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZWRpdEVudGl0eUZpbGUoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImRlbGV0ZUVudGl0eUZpbGUoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIj48L3RyPlxuICAgICAgICAgICAgPC90YWJsZT5cblxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgIDxzZWN0aW9uIGZ4RmxleD1cIjMwJVwiICpuZ0lmPVwiIXRoaXMuZG9jdW1lbnRJZHMubGVuZ3RoXCI+XG4gICAgICAgICAgPGFwcC1maWxlLWRyb3BwZXIgW2NvbmZpZ109XCJmaWxlQ29uZmlnXCIgKGZpbGVDaGFuZ2VkKT1cImZpbGVDaGFuZ2VkKCRldmVudClcIiBbZmlsZUFycmF5XT1cImZpbGVMaXN0XCI+XG4gICAgICAgICAgPC9hcHAtZmlsZS1kcm9wcGVyPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBmeExheW91dD1cInJvdyB3cmFwXCIgZnhMYXlvdXRHYXA9XCIxcmVtXCIgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeSBwLTRcIiAqbmdJZj1cImRpc3BsYXlNb2RlXCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgZWZpbGUgb2YgZW50aXR5RmlsZXNcIj5cbiAgICAgIDxhcHAtZG9jdW1lbnQtdmlld2VyIFtmaWxlXT1cImVmaWxlLmZpbGVcIiBbZmlsZVVybF09XCJlZmlsZS51cmxcIiBbY29uZmlnXT1cInRoaXMudmlld2VyQ29uZmlnXCIgW2Rpc2FibGVFZGl0XT1cInRydWVcIj5cbiAgICAgIDwvYXBwLWRvY3VtZW50LXZpZXdlcj5cbiAgICAgIDxhIGhyZWY9XCJ7e2VmaWxlLnVybH19XCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+VmlldzwvYnV0dG9uPlxuICAgICAgPC9hPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
349
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZpbGVzLXZpZXctYWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvZW50aXR5LWZpbGVzL2VudGl0eS1maWxlcy12aWV3LWFsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2VudGl0eS1maWxlcy9lbnRpdHktZmlsZXMtdmlldy1hbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBR3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBSzlFLE9BQU8sRUFDTCxnQ0FBZ0MsRUFDakMsTUFBTSx5RUFBeUUsQ0FBQztBQUVqRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQVN2QywyQkFBMkIsU0FBM0IsMkJBQTJCO0lBK0N0QyxZQUNVLGlCQUFvQyxFQUNyQyxRQUFrQixFQUNqQixZQUEwQixFQUMxQixNQUFpQixFQUNqQixFQUFzQixFQUN0QixZQUFpQyxFQUNsQyxrQkFBc0M7UUFOckMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNyQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2pCLGlCQUFZLEdBQVos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ZTtzQkFBdkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkF5QkcsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEVudGl0eUZpbGVGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9lbnRpdHktZmlsZS1mb3JtL2VudGl0eS1maWxlLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEVudGl0eUZpbGVTZXJ2aWNlIH0gZnJvbSAnLi9lbnRpdHktZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tIFwiQG5nbmVhdC91bnRpbC1kZXN0cm95XCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aW9uUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb24tcG9wdXAvYWN0aW9uLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWV3ZXJDb25maWcgfSBmcm9tICcuLi9kb2N1bWVudC12aWV3ZXIvdmlld2VyLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBGaWxlRHJvcHBlckNvbmZpZyB9IGZyb20gJy4uL2ZpbGUtZHJvcHBlcic7XG5pbXBvcnQgeyBBY3Rpb25Qb3B1cCB9IGZyb20gJy4uL2FjdGlvbi1wb3B1cC9hY3Rpb24tcG9wdXAubW9kZWwnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyU2VydmljZSB9IGZyb20gJy4uL2NvcmUvZXJyb3ItaGFuZGxlci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsXG59IGZyb20gXCIuLi90ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQvdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWNvbmZpZy5tb2RlbFwiO1xuaW1wb3J0IHtDdXJyZW50VXNlclNlcnZpY2UsIFVzZXJ9IGZyb20gXCIuLi91c2VyXCI7XG5pbXBvcnQge1VzZXJUeXBlRW51bX0gZnJvbSBcIi4uL3VzZXIvdXNlci10eXBlLmVudW1cIjtcblxuXG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1lbnRpdHktZmlsZXMtdmlldy1hbGwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZpbGVzLXZpZXctYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZW50aXR5LWZpbGVzLXZpZXctYWxsLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlGaWxlc1ZpZXdBbGxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBlbnRpdHlJZDogbnVtYmVyO1xuICBASW5wdXQoKSBlbnRpdHlUeXBlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHZpZXdPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlbW92ZVNlYXJjaDogYm9vbGVhbjtcbiAgQElucHV0KCkgaGlkZVRpdGxlQW5kRGV0YWlsczogYm9vbGVhbjtcbiAgQElucHV0KCkgZGlzcGxheU1vZGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFsbG93TXVsdGlwbGVGaWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd0J1bGtVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZG9jdW1lbnRJZHM6IGFueVtdID0gW107XG4gIGlzQWxsU2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2hvdWxkIHdlIGFsbG93IHRhZ2dpbmcgZW50aXR5LWZpbGVzP1xuICAgKi9cbiAgQElucHV0KCkgdXNlVGVjaGxpZnlUYWdzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRlY2hsaWZ5VGFnQ2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgdGVjaGxpZnlUYWdDb25maWc6IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsID0gbmV3IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsKCk7XG5cbiAgdmlld2VyQ29uZmlnOiBWaWV3ZXJDb25maWc7XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSBcIkZpbGVcIjtcbiAgZmlsdGVyczogYW55ID0ge307XG4gIGVudGl0eUZpbGVzOiBhbnlbXSA9IFtdO1xuICBkaXNwbGF5ZWRDb2x1bW5zID0gW1xuICAgICdpbmRleCcsXG4gICAgJ3RpdGxlJyxcbiAgICAnZGV0YWlscycsXG4gICAgJ2ZpbGVfc2l6ZScsXG4gICAgJ3VwbG9hZGVkX29uJyxcbiAgXTtcbiAgaXNXb3JraW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHBhZ2U6IG51bWJlciA9IDE7XG4gIHBlclBhZ2U6IG51bWJlciA9IDI1O1xuICBsYXN0UGFnZTogbnVtYmVyID0gMDtcbiAgZmlsZUNvbmZpZzogRmlsZURyb3BwZXJDb25maWc7XG4gIGZpbGVMaXN0OiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJGb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXA7XG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKCk7XG4gIHVwZGF0ZVJvd0Zvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIGlzUmVsb2FkOiBib29sZWFuID0gZmFsc2U7XG4gIHVzZXI6IFVzZXI7XG4gIGlzU2hvd0NyZWF0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd1VwZGF0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd0RlbGV0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd1JlYWRBY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwZXJtaXNzaW9uOiB7IGNyZWF0ZTogc3RyaW5nLCB1cGRhdGU6IHN0cmluZywgZGVsZXRlOiBzdHJpbmcsIHJlYWQ6IHN0cmluZyAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVudGl0eUZpbGVTZXJ2aWNlOiBFbnRpdHlGaWxlU2VydmljZSxcbiAgICBwdWJsaWMgbG9jYXRpb246IExvY2F0aW9uLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlclNlcnZpY2UsXG4gICAgcHVibGljIGN1cnJlbnRVc2VyU2VydmljZTogQ3VycmVudFVzZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMudXNlciA9IHRoaXMuY3VycmVudFVzZXJTZXJ2aWNlLmdldFVzZXIoKTtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdGl0bGU6IFtcIlwiXSxcbiAgICAgIHRhZ19pZHM6IFtcIlwiXVxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVSb3dGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICB0aXRsZTogWycnXSxcbiAgICAgIGRldGFpbHM6IFsnJ10sXG4gICAgICB0YWdfaWRzOiBbJyddLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgcGVybWlzc2lvbnNcbiAgICBpZiAodGhpcy51c2VyLnVzZXJfdHlwZV9pZCAhPT0gVXNlclR5cGVFbnVtLkNMSUVOVF9BRE1JTikge1xuICAgICAgdGhpcy5pc1Nob3dDcmVhdGVBY3Rpb24gPSB0aGlzLnBlcm1pc3Npb24/LmNyZWF0ZSA/IHRoaXMuY3VycmVudFVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24odGhpcy5wZXJtaXNzaW9uLmNyZWF0ZSkgOiB0cnVlO1xuICAgICAgdGhpcy5pc1Nob3dVcGRhdGVBY3Rpb24gPSB0aGlzLnBlcm1pc3Npb24/LnVwZGF0ZSA/IHRoaXMuY3VycmVudFVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24odGhpcy5wZXJtaXNzaW9uLnVwZGF0ZSkgOiB0cnVlO1xuICAgICAgdGhpcy5pc1Nob3dSZWFkQWN0aW9uID0gdGhpcy5wZXJtaXNzaW9uPy5yZWFkID8gdGhpcy5jdXJyZW50VXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb24ucmVhZCkgOiB0cnVlO1xuICAgICAgdGhpcy5pc1Nob3dEZWxldGVBY3Rpb24gPSB0aGlzLnBlcm1pc3Npb24/LmRlbGV0ZSA/IHRoaXMuY3VycmVudFVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24odGhpcy5wZXJtaXNzaW9uLmRlbGV0ZSkgOiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZpbGUgZHJvcHBlciBjb25maWdcbiAgICB0aGlzLmZpbGVDb25maWcgPSB7XG4gICAgICBmaWxlSWQ6IFwiZW50aXR5RGFzaGJvYXJkRHJvcHBlclwiLFxuICAgICAgY29udGFpbmVySWQ6IFwiZW50aXR5RGFzaGJvYXJkRHJvcHBlckNvbnRhaW5lclwiLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIGhlaWdodDogXCI1MDBweFwiXG4gICAgICB9LFxuICAgICAgbXVsdGlwbGU6IHRoaXMuYWxsb3dNdWx0aXBsZUZpbGVzLFxuICAgICAgYWNjZXB0RmlsZTogXCIqXCIsXG4gICAgICBtYXhTaXplOiAxMCxcbiAgICAgIGFjY2VwdEZpbGVUZXh0OiBcIkFsbCBGaWxlc1wiXG4gICAgfTtcblxuICAgIHRoaXMudmlld2VyQ29uZmlnID0ge1xuICAgICAgaW1hZ2VTdHlsZToge1xuICAgICAgICBoZWlnaHQ6ICcyMDBweCcsXG4gICAgICAgIHdpZHRoOiAnMjAwcHgnXG4gICAgICB9LFxuICAgICAgdmlld2VyU3R5bGU6IHtcbiAgICAgICAgaGVpZ2h0OiAnIDE2MHB4JyxcbiAgICAgICAgd2lkdGg6ICcyMDBweCdcbiAgICAgIH0sXG4gICAgICBoaWRlUmVtb3ZlOiB0cnVlXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmhpZGVUaXRsZUFuZERldGFpbHMpIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5maWx0ZXIoeCA9PiAoeCAhPT0gJ2RldGFpbHMnKSAmJiAoeCAhPT0gJ3RpdGxlJykpO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlblJvdXRlcygpO1xuICAgIHRoaXMuZmlsdGVycyA9IHtcbiAgICAgIGVudGl0eV90eXBlOiB0aGlzLmVudGl0eVR5cGUsXG4gICAgICBlbnRpdHlfaWQ6IHRoaXMuZW50aXR5SWQsXG4gICAgICB0aXRsZTogXCJcIlxuICAgIH07XG4gICAgdGhpcy5mZXRjaEVudGl0eUZpbGVzRGV0YWlscygpO1xuICAgIGlmICh0aGlzLnVzZVRlY2hsaWZ5VGFncykge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ3RhZycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudmlld09ubHkpIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5wdXNoKCdhY3Rpb25zJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFsbG93QnVsa1VwZGF0ZSkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ3NlbGVjdCcpO1xuICAgIH1cbiAgfVxuXG4gIGxpc3RlblJvdXRlcygpIHtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoNTAwKSwgdW50aWxEZXN0cm95ZWQodGhpcykpXG4gICAgICAuc3Vic2NyaWJlKGNoYW5nZXMgPT4ge1xuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBmZXRjaEVudGl0eUZpbGVzRGV0YWlscygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnMucGFnZSA9IHRoaXMucGFnZTtcbiAgICB0aGlzLmZpbHRlcnMucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZpbHRlckZvcm1Hcm91cC52YWx1ZTtcbiAgICBmb3JtR3JvdXAudGFnX2lkcyA9IGZvcm1Hcm91cC50YWdfaWRzLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5maWx0ZXJzID0ge1xuICAgICAgLi4udGhpcy5maWx0ZXJzLFxuICAgICAgLi4uZm9ybUdyb3VwLFxuICAgICAgd2l0aDogJ2NyZWF0b3IsdGFncydcbiAgICB9O1xuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICB0aGlzLmVudGl0eUZpbGVTZXJ2aWNlLmluZGV4KHRoaXMuZmlsdGVycykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxhc3RQYWdlID0gcmVzdWx0Lmxhc3RfcGFnZSB8fCB0aGlzLnBhZ2U7XG4gICAgICAgIHRoaXMuZW50aXR5RmlsZXMgPSB0aGlzLmVudGl0eUZpbGVzLmNvbmNhdChyZXN1bHQuZGF0YSk7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5lbnRpdHlGaWxlcyk7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMuaXNXb3JraW5nID0gZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEVudGl0eUZpbGUoKSB7XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRW50aXR5RmlsZUZvcm1Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiBcIjcwMHB4XCIsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVudGl0eTogdGhpcy5maWx0ZXJzLFxuICAgICAgICBoaWRlVGl0bGVBbmREZXRhaWxzOiB0aGlzLmhpZGVUaXRsZUFuZERldGFpbHMsXG4gICAgICAgIHVzZVRlY2hsaWZ5VGFnczogdGhpcy51c2VUZWNobGlmeVRhZ3MsXG4gICAgICAgIHRlY2hsaWZ5VGFnQ2F0ZWdvcmllczogdGhpcy50ZWNobGlmeVRhZ0NhdGVnb3JpZXMsXG4gICAgICAgIHRlY2hsaWZ5VGFnQ29uZmlnOiB0aGlzLnRlY2hsaWZ5VGFnQ29uZmlnLFxuICAgICAgfSxcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoYXN5bmMgcmVzdWx0ID0+IHtcbiAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBlZGl0RW50aXR5RmlsZShmaWxlOiBhbnkpIHtcbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFbnRpdHlGaWxlRm9ybUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6IFwiNzAwcHhcIixcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIGhpZGVUaXRsZUFuZERldGFpbHM6IHRoaXMuaGlkZVRpdGxlQW5kRGV0YWlscyxcbiAgICAgICAgdXNlVGVjaGxpZnlUYWdzOiB0aGlzLnVzZVRlY2hsaWZ5VGFncyxcbiAgICAgICAgdGVjaGxpZnlUYWdDYXRlZ29yaWVzOiB0aGlzLnRlY2hsaWZ5VGFnQ2F0ZWdvcmllcyxcbiAgICAgICAgdGVjaGxpZnlUYWdDb25maWc6IHRoaXMudGVjaGxpZnlUYWdDb25maWcsXG4gICAgICB9IC8vIEFueSBkYXRhIHBhc3NlZCBoZXJlIHdpbGwgYmUgaW5qZWN0ZWQgaW50byB0aGUgbW9kZWxcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZUVudGl0eUZpbGUoZmlsZTogYW55KSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Qb3B1cENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6IFwiNDAwcHhcIixcbiAgICAgIGRhdGE6IDxBY3Rpb25Qb3B1cD57XG4gICAgICAgIHRpdGxlOiBcIkRlbGV0ZSBGaWxlXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBBcmUgeW91IHN1cmUgdG8gcHJvY2VlZCBkZWxldGUgdGhlIGZpbGUgJHtmaWxlLnRpdGxlfT9gXG4gICAgICB9LFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jIHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIC8vQWN0aW9uIGNvbmZpcm1lZFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVudGl0eUZpbGVTZXJ2aWNlLmRlbGV0ZUVudGl0eUZpbGUoXG4gICAgICAgICAgZmlsZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydChcbiAgICAgICAgICBcIkZpbGUgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcIixcbiAgICAgICAgICBcInN1Y2Nlc3NcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblNjcm9sbCgpIHtcbiAgICBpZiAodGhpcy5wYWdlIDwgdGhpcy5sYXN0UGFnZSAmJiAhdGhpcy5pc1dvcmtpbmcpIHtcbiAgICAgIHRoaXMucGFnZSArPSAxO1xuICAgICAgdGhpcy5mZXRjaEVudGl0eUZpbGVzRGV0YWlscygpO1xuICAgIH1cbiAgfVxuXG4gIHJlbG9hZCgpIHtcbiAgICB0aGlzLmVudGl0eUZpbGVzID0gW107XG4gICAgdGhpcy5kb2N1bWVudElkcyA9IFtdO1xuICAgIHRoaXMuaXNSZWxvYWQgPSBmYWxzZTtcbiAgICB0aGlzLnBhZ2UgPSAxO1xuICAgIGlmICghdGhpcy5pc1dvcmtpbmcpIHtcbiAgICAgIHRoaXMuZmV0Y2hFbnRpdHlGaWxlc0RldGFpbHMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHsgfVxuXG4gIHJlc2V0RmllbGRWYWx1ZShldmVudDogYW55LCBmaWVsZDogYW55KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAuZ2V0KGZpZWxkKS5zZXRWYWx1ZShcIlwiKTtcbiAgfVxuXG4gIHNpemVPZihieXRlcykge1xuICAgIGlmICghYnl0ZXMpIHsgcmV0dXJuIFwiMC4wMCBCXCI7IH1cbiAgICB2YXIgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coMTAyNCkpO1xuICAgIHJldHVybiAoYnl0ZXMgLyBNYXRoLnBvdygxMDI0LCBlKSkudG9GaXhlZCgyKSArICcgJyArICcgS01HVFAnLmNoYXJBdChlKSArICdCJztcbiAgfVxuXG4gIGFzeW5jIGZpbGVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZpbGVMaXN0ID0gZXZlbnQ7XG4gICAgaWYgKHRoaXMuZmlsZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5maWxlTGlzdC5mb3JFYWNoKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IHRoaXMuZW50aXR5RmlsZVNlcnZpY2UudXBsb2FkRW50aXR5RmlsZShcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGl0eV90eXBlOiB0aGlzLmVudGl0eVR5cGUsXG4gICAgICAgICAgICBlbnRpdHlfaWQ6IHRoaXMuZW50aXR5SWQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVMaXN0ID0gW107XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnRmlsZXMgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0QWxsKCkge1xuICAgIHRoaXMuZG9jdW1lbnRJZHMgPSBbXTtcbiAgICB0aGlzLmVudGl0eUZpbGVzLm1hcCgoZW1wbG95ZWU6IGFueSkgPT4ge1xuICAgICAgZW1wbG95ZWUuaXNfc2VsZWN0ZWQgPSB0aGlzLmlzQWxsU2VsZWN0ZWQ7XG4gICAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRJZHMucHVzaChlbXBsb3llZS5pZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmVudGl0eUZpbGVzKTtcbiAgfVxuXG4gIGVtcGxveWVlTGlzdE1vZGlmaWVkKGV2ZW50OiBhbnksIGVtcGxveWVlOiBhbnkpIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5kb2N1bWVudElkcy5wdXNoKGVtcGxveWVlLmlkKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRvY3VtZW50SWRzID0gdGhpcy5kb2N1bWVudElkcy5maWx0ZXIoKGVtcGxveWVlRGF0YTogYW55KSA9PiBlbXBsb3llZURhdGEgIT0gZW1wbG95ZWUuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHVuQ2hlY2tBbGwoKSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5kb2N1bWVudElkcyA9IFtdO1xuICAgIHRoaXMuZW50aXR5RmlsZXMubWFwKChlbXBsb3llZTogYW55KSA9PiB7XG4gICAgICBlbXBsb3llZS5pc19zZWxlY3RlZCA9IGZhbHNlO1xuICAgIH0pO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5lbnRpdHlGaWxlcyk7XG4gIH1cblxuICByZXNldEZpZWxkVmFsdWVPZlJvdyhmaWVsZDogc3RyaW5nLCBldmVudDogYW55KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVSb3dGb3JtLmdldChmaWVsZCkuc2V0VmFsdWUoXCJcIik7XG4gIH1cblxuICBhc3luYyBidWxrVXBkYXRlKGZpZWxkTmFtZTogYW55KSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnVwZGF0ZVJvd0Zvcm0udmFsdWU7XG4gICAgdGhpcy5pc1JlbG9hZCA9IHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICBkYXRhLmZpZWxkX25hbWUgPSBmaWVsZE5hbWU7XG4gICAgZGF0YS5kb2N1bWVudF9pZHMgPSB0aGlzLmRvY3VtZW50SWRzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZW50aXR5RmlsZVNlcnZpY2UuYnVsa1VwZGF0ZShkYXRhKS50aGVuKFxuICAgICAgICByZXMgPT4ge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KFwiU3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcIiwgXCJzdWNjZXNzXCIpO1xuICAgICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdj5cbiAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIFtmeEhpZGVdPVwiIXRoaXMuZG9jdW1lbnRJZHMubGVuZ3RoXCIgZnhIaWRlLnhzIGZ4SGlkZS5zbSBmeEhpZGUubHQtbWQ+XG4gICAgPG1hdC1jYXJkIGNsYXNzPVwidXBkYXRlX2NhcmRcIiAqbmdJZj1cInRoaXMuZG9jdW1lbnRJZHMubGVuZ3RoXCI+XG4gICAgICA8bWF0LWNhcmQtaGVhZGVyPlxuICAgICAgICA8bWF0LWNhcmQtdGl0bGU+XG4gICAgICAgICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwibXQtMiBtbC0yIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2PlVwZGF0ZSBTZWxlY3RlZCBSb3dzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gICAgICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtY2FyZC1jb250ZW50IGZ4TGF5b3V0PVwiY29sdW1uXCI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwidXBkYXRlUm93Rm9ybVwiPlxuICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIj5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEwMCVcIiBjbGFzcz1cInB4LTFcIj5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcGxhY2Vob2xkZXI9XCJUaXRsZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cInVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbHVlPT09MFwiXG4gICAgICAgICAgICAgICAgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBzdHlsZT1cImNvbG9yOnJlZFwiIChjbGljayk9XCJyZXNldEZpZWxkVmFsdWVPZlJvdygndGl0bGUnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cImNvbG9yOmdyZWVuXCIgKm5nSWY9XCIodXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsdWU9PT0wKVxuICAgICAgICAgICAgICAgICYmIHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbGlkXCIgKGNsaWNrKT1cImJ1bGtVcGRhdGUoJ3RpdGxlJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEwMCVcIiBjbGFzcz1cInB4LTFcIj5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRldGFpbHNcIiBwbGFjZWhvbGRlcj1cIkRldGFpbHNcIiBhdXRvY29tcGxldGU9XCJvZmZcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKm5nSWY9XCJ1cGRhdGVSb3dGb3JtLmdldCgnZGV0YWlscycpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykudmFsdWU9PT0wXCJcbiAgICAgICAgICAgICAgICBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHN0eWxlPVwiY29sb3I6cmVkXCIgKGNsaWNrKT1cInJlc2V0RmllbGRWYWx1ZU9mUm93KCdkZXRhaWxzJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJjb2xvcjpncmVlblwiICpuZ0lmPVwiKHVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ2RldGFpbHMnKS52YWx1ZT09PTApXG4gICAgICAgICAgICAgICAgJiYgdXBkYXRlUm93Rm9ybS5nZXQoJ2RldGFpbHMnKS52YWxpZFwiIChjbGljayk9XCJidWxrVXBkYXRlKCdkZXRhaWxzJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZVRlY2hsaWZ5VGFnc1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UYWc8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8YXBwLXRlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1maWVsZCBtb2RlbFR5cGU9XCJlbnRpdHktZmlsZVwiIGZvcm1Db250cm9sTmFtZT1cInRhZ19pZHNcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBuZXcgdGFnXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cInVwZGF0ZVJvd0Zvcm0uZ2V0KCd0YWdfaWRzJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ3RhZ19pZHMnKS52YWx1ZT09PTBcIlxuICAgICAgICAgICAgICAgICAgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBzdHlsZT1cImNvbG9yOnJlZFwiIChjbGljayk9XCJyZXNldEZpZWxkVmFsdWVPZlJvdygndGFnX2lkcycsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwiY29sb3I6Z3JlZW5cIiAqbmdJZj1cIih1cGRhdGVSb3dGb3JtLmdldCgndGFnX2lkcycpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0YWdfaWRzJykudmFsdWU9PT0wKVxuICAgICAgICAgICAgICAgICAgJiYgdXBkYXRlUm93Rm9ybS5nZXQoJ3RhZ19pZHMnKS52YWxpZFwiIChjbGljayk9XCJidWxrVXBkYXRlKCd0YWdfaWRzJylcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kb25lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPC9tYXQtY2FyZD5cblxuICA8L2Rpdj5cblxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiICpuZ0lmPVwiIWRpc3BsYXlNb2RlXCI+XG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIxcmVtXCI+XG4gICAgICAgIDxtYXQtY2FyZCBbZnhGbGV4XT1cInRoaXMuZG9jdW1lbnRJZHMubGVuZ3RoID8gJzEwMCUnIDogJzcwJSdcIj5cbiAgICAgICAgICA8bWF0LWNhcmQtdGl0bGU+XG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0IGZ4TGF5b3V0R2FwPVwiMXJlbVwiPlxuICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJmb250LXdlaWdodC1ib2xkIHByaW1hcnktY29sb3JcIiBmeExheW91dD1cImNlbnRlciBjZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7e3RpdGxlfX1zXG4gICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJteC0xXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImFkZEVudGl0eUZpbGUoKVwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiF2aWV3T25seSAmJiBpc1Nob3dDcmVhdGVBY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIGFkZF9jaXJjbGVfb3V0bGluZVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAge3t0aXRsZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtY2FyZC10aXRsZT5cbiAgICAgICAgICA8bWF0LWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1Hcm91cFwiIHN0eWxlPVwiZm9udC1zaXplOiAxMHB4O1wiIGZ4TGF5b3V0IGZ4TGF5b3V0R2FwPVwiMXJlbVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhcmVtb3ZlU2VhcmNoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlNlYXJjaDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBuYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKm5nSWY9XCJmaWx0ZXJzLnRpdGxlXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGRWYWx1ZSgkZXZlbnQsICd0aXRsZScpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VUZWNobGlmeVRhZ3NcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlRhZzwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPGFwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGRcbiAgICAgICAgICAgICAgICAgICAgW2NhdGVnb3JpZXNdPVwidGVjaGxpZnlUYWdDYXRlZ29yaWVzXCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGFnX2lkc1wiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFRhZ3NcIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInRlY2hsaWZ5VGFnQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgID48L2FwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVsb2FkKClcIiAqbmdJZj1cImlzUmVsb2FkXCIgdHlwZT1cImJ1dHRvblwiIG1hdFRvb2x0aXA9XCJSZWZyZXNoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPC9tYXQtY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImVudGl0eS1maWxlLWNhcmRcIj5cbiAgICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIGNsYXNzPVwidy0xMDBcIiBtYXRTb3J0IG11bHRpVGVtcGxhdGVEYXRhUm93cyBpbmZpbml0ZVNjcm9sbFxuICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIxLjVcIiBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MFwiIChzY3JvbGxlZCk9XCJvblNjcm9sbCgpXCI+XG5cbiAgICAgICAgICAgICAgPCEtLSBTZWxlY3QgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgc3R5bGU9XCJ3aWR0aDozMHB4XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJlbXBsb3llZVwiIFsobmdNb2RlbCldPVwiaXNBbGxTZWxlY3RlZFwiIChjaGFuZ2UpPVwic2VsZWN0QWxsKClcIj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBzdHlsZT1cIndpZHRoOjMwcHhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggbmFtZT1cImVtcGxveWVlW3t7ZWxlbWVudD8uaWR9fV1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlbGVtZW50LmlzX3NlbGVjdGVkXCIgKGNoYW5nZSk9XCJlbXBsb3llZUxpc3RNb2RpZmllZCgkZXZlbnQsIGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlbnRpdHlGaWxlcy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDwhLS0gSW5kZXggQ29sdW1uIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gIyA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgaSA9IGRhdGFJbmRleFwiPiB7eyBpKzEgfX0gPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBUaXRsZSBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBUaXRsZSA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7e2VsZW1lbnQudGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJ7e2VsZW1lbnQudXJsfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi1ub25lIHRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBEZXRhaWxzIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRGV0YWlscyA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICA8YXBwLXJlYWQtbW9yZSBbdGV4dF09XCJlbGVtZW50LmRldGFpbHNcIiBbbWF4TGVuZ3RoXT1cIjUwXCI+PC9hcHAtcmVhZC1tb3JlPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDwhLS0gRmlsZSBzaXplIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmaWxlX3NpemVcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBGaWxlIFNpemUgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7eyBzaXplT2YoZWxlbWVudC5maWxlX3NpemUpfX0gPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBUYWdzIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ0YWdcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBUYWcgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwicC0xXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCBhcmlhLWxhYmVsPVwiVGFnc1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IHRhZyBvZiBlbGVtZW50LnRhZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyB0YWc/LnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBVcGxvYWRlZCBPbiBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXBsb2FkZWRfb25cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBVcGxvYWRlZCBPbiA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICB7e2VsZW1lbnQuY3JlYXRlZF9hdCB8IGRhdGU6ICdtZWRpdW1EYXRlJ319XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIEJ5IHt7ZWxlbWVudC5jcmVhdG9yPy5uYW1lfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDwhLS0gQWN0aW9ucyBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFjdGlvbnMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIHN0eWxlPVwibWluLXdpZHRoOjExMHB4XCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNTaG93VXBkYXRlQWN0aW9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZWRpdEVudGl0eUZpbGUoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNTaG93RGVsZXRlQWN0aW9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlRW50aXR5RmlsZShlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNXb3JraW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgICAgPHNlY3Rpb24gZnhGbGV4PVwiMzAlXCIgKm5nSWY9XCIhdGhpcy5kb2N1bWVudElkcy5sZW5ndGhcIj5cbiAgICAgICAgICA8YXBwLWZpbGUtZHJvcHBlciBbY29uZmlnXT1cImZpbGVDb25maWdcIiAoZmlsZUNoYW5nZWQpPVwiZmlsZUNoYW5nZWQoJGV2ZW50KVwiIFtmaWxlQXJyYXldPVwiZmlsZUxpc3RcIj5cbiAgICAgICAgICA8L2FwcC1maWxlLWRyb3BwZXI+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGZ4TGF5b3V0PVwicm93IHdyYXBcIiBmeExheW91dEdhcD1cIjFyZW1cIiBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5IHAtNFwiICpuZ0lmPVwiZGlzcGxheU1vZGVcIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlZmlsZSBvZiBlbnRpdHlGaWxlc1wiPlxuICAgICAgPGFwcC1kb2N1bWVudC12aWV3ZXIgW2ZpbGVdPVwiZWZpbGUuZmlsZVwiIFtmaWxlVXJsXT1cImVmaWxlLnVybFwiIFtjb25maWddPVwidGhpcy52aWV3ZXJDb25maWdcIiBbZGlzYWJsZUVkaXRdPVwidHJ1ZVwiPlxuICAgICAgPC9hcHAtZG9jdW1lbnQtdmlld2VyPlxuICAgICAgPGEgaHJlZj1cInt7ZWZpbGUudXJsfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIj5WaWV3PC9idXR0b24+XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|