@eo-sdk/client 10.5.0-rc.2 → 10.6.0-rc.2

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.
Files changed (57) hide show
  1. package/app/eo-client/dashboard/widgets/charts-widget/charts-setup/charts-setup.component.d.ts +14 -0
  2. package/app/eo-client/dashboard/widgets/charts-widget/charts-setup/charts-setup.component.d.ts.map +1 -1
  3. package/app/eo-client/dashboard/widgets/charts-widget/charts-widget.component.d.ts +1 -2
  4. package/app/eo-client/dashboard/widgets/charts-widget/charts-widget.component.d.ts.map +1 -1
  5. package/app/eo-client/dashboard/widgets/charts-widget/icharts.d.ts +1 -0
  6. package/app/eo-client/dashboard/widgets/charts-widget/icharts.d.ts.map +1 -1
  7. package/app/eo-client/dashboard/widgets/hitlist-widget/hitlist-setup/hitlist-setup.component.d.ts.map +1 -1
  8. package/app/eo-client/dashboard/widgets/hitlist-widget/hitlist-widget.component.d.ts.map +1 -1
  9. package/app/eo-client/dashboard/widgets/search-widget/search-widget.component.d.ts +1 -0
  10. package/app/eo-client/dashboard/widgets/search-widget/search-widget.component.d.ts.map +1 -1
  11. package/app/eo-framework/actions/actions/clipboard/clipboard-action.d.ts.map +1 -1
  12. package/app/eo-framework/object-form/object-form/form-element-table/form-element-table.component.d.ts +13 -4
  13. package/app/eo-framework/object-form/object-form/form-element-table/form-element-table.component.d.ts.map +1 -1
  14. package/app/eo-framework/object-form/object-form/form-element-table/row-edit/row-edit.component.d.ts.map +1 -1
  15. package/assets/_default/i18n/de.json +22 -3
  16. package/assets/_default/i18n/en.json +35 -16
  17. package/assets/_default/svg/ic_upload2.svg +1 -0
  18. package/esm2020/app/eo-client/about-state/about-state.component.mjs +3 -3
  19. package/esm2020/app/eo-client/dashboard/widgets/charts-widget/charts-setup/charts-setup.component.mjs +73 -7
  20. package/esm2020/app/eo-client/dashboard/widgets/charts-widget/charts-widget.component.mjs +113 -68
  21. package/esm2020/app/eo-client/dashboard/widgets/charts-widget/icharts.mjs +1 -1
  22. package/esm2020/app/eo-client/dashboard/widgets/hitlist-widget/hitlist-setup/hitlist-setup.component.mjs +15 -6
  23. package/esm2020/app/eo-client/dashboard/widgets/hitlist-widget/hitlist-widget.component.mjs +15 -4
  24. package/esm2020/app/eo-client/dashboard/widgets/last-edited-widget/last-edited-and-created.component.mjs +6 -7
  25. package/esm2020/app/eo-client/dashboard/widgets/search-widget/search-widget.component.mjs +11 -3
  26. package/esm2020/app/eo-framework/actions/actions/clipboard/clipboard-action.mjs +2 -3
  27. package/esm2020/app/eo-framework/app-shell/app-bar/app-add/app-add-dialog/app-add-dialog.component.mjs +1 -1
  28. package/esm2020/app/eo-framework/app-shell/app-bar/app-search/app-search.component.mjs +1 -1
  29. package/esm2020/app/eo-framework/app-shell/app-bar/side-bar/side-bar.component.mjs +2 -2
  30. package/esm2020/app/eo-framework/form-elements/codesystem/codesystem.component.mjs +1 -1
  31. package/esm2020/app/eo-framework/form-elements/date/date.component.mjs +1 -1
  32. package/esm2020/app/eo-framework/form-elements/dynamic-list/dynamic-list.component.mjs +3 -3
  33. package/esm2020/app/eo-framework/form-elements/form-input/form-input.component.mjs +2 -2
  34. package/esm2020/app/eo-framework/form-elements/id-reference/id-reference.component.mjs +1 -1
  35. package/esm2020/app/eo-framework/form-elements/organization/organization.component.mjs +1 -1
  36. package/esm2020/app/eo-framework/form-elements/reference/reference.component.mjs +1 -1
  37. package/esm2020/app/eo-framework/form-elements/string/string.component.mjs +1 -1
  38. package/esm2020/app/eo-framework/grid/filters/codesystem-filter.component.mjs +1 -1
  39. package/esm2020/app/eo-framework/grid/filters/datetime-filter.component.mjs +1 -1
  40. package/esm2020/app/eo-framework/grid/filters/dynamic-list-filter.component.mjs +3 -3
  41. package/esm2020/app/eo-framework/grid/filters/organization-filter.component.mjs +1 -1
  42. package/esm2020/app/eo-framework/grid/grid.component.mjs +2 -2
  43. package/esm2020/app/eo-framework/object-form/object-form/form-element/form-element.component.mjs +3 -3
  44. package/esm2020/app/eo-framework/object-form/object-form/form-element-table/form-element-table.component.mjs +140 -15
  45. package/esm2020/app/eo-framework/object-form/object-form/form-element-table/row-edit/row-edit.component.mjs +2 -1
  46. package/esm2020/app/eo-framework/prepare-details/prepare-details.component.mjs +3 -3
  47. package/esm2020/projects/eo-sdk/core/lib/service/auth/auth.service.mjs +6 -1
  48. package/fesm2015/eo-sdk-client-projects-eo-sdk-core.mjs +5 -0
  49. package/fesm2015/eo-sdk-client-projects-eo-sdk-core.mjs.map +1 -1
  50. package/fesm2015/eo-sdk-client.mjs +388 -130
  51. package/fesm2015/eo-sdk-client.mjs.map +1 -1
  52. package/fesm2020/eo-sdk-client-projects-eo-sdk-core.mjs +5 -0
  53. package/fesm2020/eo-sdk-client-projects-eo-sdk-core.mjs.map +1 -1
  54. package/fesm2020/eo-sdk-client.mjs +383 -120
  55. package/fesm2020/eo-sdk-client.mjs.map +1 -1
  56. package/package.json +3 -3
  57. package/projects/eo-sdk/core/lib/service/auth/auth.service.d.ts.map +1 -1
@@ -5,22 +5,23 @@ import { CsvExportModule } from '@ag-grid-community/csv-export';
5
5
  import { Component, HostListener, Input, ViewChild, forwardRef } from '@angular/core';
6
6
  import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
7
7
  import { Utils } from '@eo-sdk/core';
8
- import { forkJoin } from 'rxjs';
8
+ import { firstValueFrom, forkJoin } from 'rxjs';
9
9
  import { map } from 'rxjs/operators';
10
10
  import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
11
11
  import { CellRenderer } from '../../../../eo-framework-core/api/grid.service';
12
+ import { LocaleNumberPipe } from "../../../../eo-framework-core";
12
13
  import * as i0 from "@angular/core";
13
14
  import * as i1 from "@eo-sdk/core";
14
15
  import * as i2 from "./../../../../eo-framework-core/pending-changes/pending-changes.service";
15
16
  import * as i3 from "../../../../eo-framework-core/api/grid.service";
16
17
  import * as i4 from "@angular/common";
17
- import * as i5 from "../../../ui/eo-icon/eo-icon.component";
18
- import * as i6 from "../../../ui/eo-dialog/eo-dialog.component";
19
- import * as i7 from "@ag-grid-community/angular";
20
- import * as i8 from "../../../media/media.component";
21
- import * as i9 from "@yuuvis/components/split-view";
22
- import * as i10 from "./row-edit/row-edit.component";
23
- import * as i11 from "@ngx-translate/core";
18
+ import * as i5 from "@ngx-translate/core";
19
+ import * as i6 from "../../../ui/eo-icon/eo-icon.component";
20
+ import * as i7 from "../../../ui/eo-dialog/eo-dialog.component";
21
+ import * as i8 from "@ag-grid-community/angular";
22
+ import * as i9 from "../../../media/media.component";
23
+ import * as i10 from "@yuuvis/components/split-view";
24
+ import * as i11 from "./row-edit/row-edit.component";
24
25
  let FormElementTableComponent = FormElementTableComponent_1 = class FormElementTableComponent {
25
26
  set params(p) {
26
27
  this.cacheLayoutKey = p ? `${this.BASE_CACHE_LAYOUT_KEY}.${p.element.name}` : this.BASE_CACHE_LAYOUT_KEY;
@@ -54,11 +55,13 @@ let FormElementTableComponent = FormElementTableComponent_1 = class FormElementT
54
55
  copyCellHandler(event) {
55
56
  this.gridApi.copyToClipboard(event, this.gridOptions);
56
57
  }
57
- constructor(storageService, systemService, pendingChanges, gridApi) {
58
+ constructor(storageService, systemService, pendingChanges, gridApi, toast, translate) {
58
59
  this.storageService = storageService;
59
60
  this.systemService = systemService;
60
61
  this.pendingChanges = pendingChanges;
61
62
  this.gridApi = gridApi;
63
+ this.toast = toast;
64
+ this.translate = translate;
62
65
  this.modules = [ClientSideRowModelModule, CsvExportModule];
63
66
  this.BASE_CACHE_LAYOUT_KEY = 'table.state';
64
67
  this.cacheLayoutKey = this.BASE_CACHE_LAYOUT_KEY;
@@ -67,6 +70,9 @@ let FormElementTableComponent = FormElementTableComponent_1 = class FormElementT
67
70
  this.gridReady = false;
68
71
  this.showDialog = false;
69
72
  this.showPreview = false;
73
+ this.showImportReportDialog = false;
74
+ this.mappedRows = [];
75
+ this.mappingErrorFields = [];
70
76
  this.propagateChange = (_) => {
71
77
  };
72
78
  this.gridOptions = {
@@ -296,6 +302,11 @@ let FormElementTableComponent = FormElementTableComponent_1 = class FormElementT
296
302
  this.editingRow = null;
297
303
  this.showDialog = false;
298
304
  }
305
+ closeImportReport() {
306
+ this.showImportReportDialog = false;
307
+ this.mappedRows = [];
308
+ this.mappingErrorFields = [];
309
+ }
299
310
  updateRow(rowResult) {
300
311
  const isNewRow = rowResult.index === -1;
301
312
  if (isNewRow) {
@@ -360,6 +371,117 @@ let FormElementTableComponent = FormElementTableComponent_1 = class FormElementT
360
371
  fileName: this._params.element.label
361
372
  });
362
373
  }
374
+ importCSV(event) {
375
+ const fields = this._params.element.elements;
376
+ const file = event.files[0];
377
+ const reader = new FileReader();
378
+ reader.addEventListener('load', async (e) => {
379
+ let parsedata = [];
380
+ if (typeof e.target.result === 'string') {
381
+ let newLineBreak = e.target.result.split('\n').filter(result => result !== '');
382
+ for (let i = 0; i < newLineBreak.length; i++) {
383
+ parsedata.push(newLineBreak[i].split(';'));
384
+ }
385
+ if (parsedata.length > 5000) {
386
+ this.toast.error(this.translate.instant('eo.form.table.options.btn.upload.error'));
387
+ return;
388
+ }
389
+ parsedata = parsedata.map(data => data.map(d => d.replace(/"/gi, '').replace('\n', '').replace(/[^-.:,a-zA-Z0-9() ]/g, '').trim()));
390
+ const columns = this.gridOptions.columnDefs.map(column => column['field']);
391
+ const columnsUploaded = parsedata[0];
392
+ parsedata.shift();
393
+ const rowsUploaded = parsedata;
394
+ if (columns.length !== columnsUploaded.length) {
395
+ this.toast.error(this.translate.instant('eo.form.table.csv.import.error.columnAmount', { number: columnsUploaded.length, number2: columns.length }));
396
+ return;
397
+ }
398
+ for (let i = 0; i < columns.length; i++) {
399
+ if (columns[i] !== columnsUploaded[i]) {
400
+ this.toast.error(this.translate.instant('eo.form.table.csv.import.error.columnMapping', { columnName: columnsUploaded[i], columnNumber: i + 1, expectedColumnName: columns[i] }));
401
+ return;
402
+ }
403
+ }
404
+ const metaFields = [];
405
+ for (let rowIndex = 0; rowIndex < rowsUploaded.length; rowIndex++) {
406
+ const mappedRow = {};
407
+ let currentRow = rowsUploaded[rowIndex];
408
+ for (let i = 0; i < currentRow.length; i++) {
409
+ if (currentRow[i] !== '') {
410
+ const currentField = fields.find(field => field.name === columns[i]);
411
+ if (currentField.type === 'ORGANIZATION') {
412
+ let orgObj = await firstValueFrom(this.systemService.getOrganizationObject(currentRow[i]));
413
+ if (orgObj.active) {
414
+ mappedRow[columns[i]] = currentRow[i];
415
+ metaFields.push({ column: columns[i], rowIndex: rowIndex, value: orgObj });
416
+ }
417
+ else {
418
+ mappedRow[columns[i]] = '';
419
+ this.mappingErrorFields.push({ field: columns[i], row: rowIndex, value: currentRow[i] });
420
+ }
421
+ }
422
+ else if (currentField.type === 'CODESYSTEM') {
423
+ const codesystem = this.systemService.getCodesystem(currentField.codesystem.id);
424
+ const codesystemEntry = codesystem.entries.find(entry => entry.data === currentRow[i] || entry.defaultrepresentation === currentRow[i]);
425
+ if (codesystemEntry) {
426
+ mappedRow[columns[i]] = currentRow[i];
427
+ metaFields.push({
428
+ column: columns[i],
429
+ rowIndex: rowIndex,
430
+ value: { id: codesystemEntry.id, defaultrepresentation: codesystemEntry.defaultrepresentation, label: codesystemEntry.label
431
+ }
432
+ });
433
+ }
434
+ else {
435
+ mappedRow[columns[i]] = '';
436
+ this.mappingErrorFields.push({ field: columns[i], row: rowIndex, value: currentRow[i] });
437
+ }
438
+ }
439
+ else if (currentField.type === 'REFERENCE') {
440
+ if (currentRow[i].length === 32) {
441
+ mappedRow[columns[i]] = currentRow[i];
442
+ }
443
+ else {
444
+ mappedRow[columns[i]] = '';
445
+ this.mappingErrorFields.push({ field: columns[i], row: rowIndex, value: currentRow[i] });
446
+ }
447
+ }
448
+ else if (currentField.type === 'DATETIME') {
449
+ if (new Date(currentRow[i]).toString() === 'Invalid Date') {
450
+ mappedRow[columns[i]] = '';
451
+ this.mappingErrorFields.push({ field: columns[i], row: rowIndex, value: currentRow[i] });
452
+ }
453
+ else {
454
+ mappedRow[columns[i]] = currentRow[i];
455
+ }
456
+ }
457
+ else if (currentField.type === 'NUMBER') {
458
+ mappedRow[columns[i]] = new LocaleNumberPipe(this.translate).stringToNumber(currentRow[i]);
459
+ if (isNaN(mappedRow[columns[i]])) {
460
+ mappedRow[columns[i]] = '';
461
+ this.mappingErrorFields.push({ field: columns[i], row: rowIndex, value: currentRow[i] });
462
+ }
463
+ }
464
+ else {
465
+ mappedRow[columns[i]] = currentRow[i];
466
+ }
467
+ }
468
+ }
469
+ this.mappedRows.push(mappedRow);
470
+ }
471
+ metaFields.forEach(field => {
472
+ this.mappedRows[field.rowIndex][field.column + '_meta'] = field.value;
473
+ });
474
+ this.openImportReportDialog();
475
+ }
476
+ });
477
+ reader.readAsBinaryString(file);
478
+ }
479
+ addImportValuesToTable() {
480
+ this.closeImportReport();
481
+ this.openDialog();
482
+ this.innerValue = [...this.innerValue, ...this.mappedRows];
483
+ this.updateTableValue();
484
+ }
363
485
  sizeToFit(overlay) {
364
486
  if (overlay) {
365
487
  this.overlayGridOptions.api.sizeColumnsToFit();
@@ -372,6 +494,9 @@ let FormElementTableComponent = FormElementTableComponent_1 = class FormElementT
372
494
  // TODO: Still necessary? this.overlayGridOptions.api.refreshView();
373
495
  this.showDialog = true;
374
496
  }
497
+ openImportReportDialog() {
498
+ this.showImportReportDialog = true;
499
+ }
375
500
  validateTableData() {
376
501
  // todo: implement
377
502
  return true;
@@ -405,7 +530,7 @@ let FormElementTableComponent = FormElementTableComponent_1 = class FormElementT
405
530
  this.overlayGridOptions.api.ensureNodeVisible(rowNode);
406
531
  }
407
532
  onCellClicked($event) {
408
- if ($event.rowIndex !== null) {
533
+ if ($event.rowIndex !== null && !this.pendingChanges.check()) {
409
534
  if (!$event.node.group && $event.data) {
410
535
  if ($event.colDef.cellClass === 'router-link-cell') {
411
536
  this.gridApi.openRouterLink($event.event, 'ag-row');
@@ -448,7 +573,7 @@ let FormElementTableComponent = FormElementTableComponent_1 = class FormElementT
448
573
  this.hasPreviewFile = this.hasPreviewFile !== undefined ? this.hasPreviewFile : !!this.params.object?.content;
449
574
  }
450
575
  };
451
- FormElementTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: FormElementTableComponent, deps: [{ token: i1.LocalStorageService }, { token: i1.SystemService }, { token: i2.PendingChangesService }, { token: i3.GridService }], target: i0.ɵɵFactoryTarget.Component });
576
+ FormElementTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: FormElementTableComponent, deps: [{ token: i1.LocalStorageService }, { token: i1.SystemService }, { token: i2.PendingChangesService }, { token: i3.GridService }, { token: i1.NotificationsService }, { token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
452
577
  FormElementTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: FormElementTableComponent, selector: "eo-table", inputs: { limit: "limit", hasPreviewFile: "hasPreviewFile", minWidth: "minWidth", height: "height", params: "params" }, host: { listeners: { "keydown.control.alt.shift.c": "copyCellHandler($event)", "keydown.control.shift.c": "copyCellHandler($event)", "keydown.control.alt.c": "copyCellHandler($event)", "keydown.control.c": "copyCellHandler($event)" } }, providers: [
453
578
  {
454
579
  provide: NG_VALUE_ACCESSOR,
@@ -460,7 +585,7 @@ FormElementTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.
460
585
  useExisting: forwardRef(() => FormElementTableComponent_1),
461
586
  multi: true,
462
587
  }
463
- ], viewQueries: [{ propertyName: "rowEdit", first: true, predicate: ["rowEdit"], descendants: true }], ngImport: i0, template: "<div class=\"object-form-table\" [ngClass]=\"{medium: _params.size === 'medium', large: _params.size === 'large'}\">\n <div class=\"label\">\n <span>{{_params.element.label}}</span>\n <ng-container *ngIf=\"_params.situation !== 'SEARCH'\">\n\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_expand.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.open'| translate)\" (click)=\"openDialog()\"></eo-icon>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_size_to_fit.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.fit'| translate)\" (click)=\"sizeToFit()\"></eo-icon>\n <eo-icon class=\"stf\" *ngIf=\"gridOptions.rowData?.length\" [iconSrc]=\"'assets/_default/svg/ic_content-download.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.csv'| translate)\" (click)=\"exportCSV()\"></eo-icon>\n <eo-icon class=\"stf add-row\" *ngIf=\"!_params.element.readonly\" [iconSrc]=\"'assets/_default/svg/ic_add.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.add'| translate)\" (click)=\"addRow()\"></eo-icon>\n\n </ng-container>\n </div>\n <div class=\"grid-body size-{{ params.size }}\">\n <ag-grid-angular #agGrid *ngIf=\"gridReady\" class=\"ag-theme-balham\" [modules]=\"modules\" [gridOptions]=\"gridOptions\"\n (rowDoubleClicked)=\"editRow($event)\" (cellClicked)=\"onCellClicked($event)\" (sortChanged)=\"onSortChanged()\"\n (cellValueChanged)=\"onEditComplete($event)\" (columnResized)=\"onColumnResized($event.column)\">\n </ag-grid-angular>\n </div>\n</div>\n\n\n<eo-dialog [title]=\"params.element.label\" [visible]=\"showDialog\" [dirtyCheck]=\"rowEdit?.pendingTaskId\"\n [minWidth]=\"_params.situation !== 'SEARCH' ? minWidth : 200\"\n [width]=\"_params.situation !== 'SEARCH' ? '95vw' : 500\"\n [height]=\"height\"\n [styleClass]=\"'object-form-table-dialog'\" (hide)=\"onClose()\" [isFormTable]=\"true\" [hasPreviewFile]=\"hasPreviewFile\"\n [showPreview]=\"showPreview\" (onTogglePreview)=\"togglePreview()\">\n\n <div class=\"body\" *ngIf=\"showDialog\">\n\n <!-- <yvc-split-view [layoutSettingsID]=\"cacheLayoutKey\"> -->\n <yvc-split-view>\n\n <!-- the table itself-->\n <ng-template yvcSplitArea [size]=\"40\" [visible]=\"_params.situation !== 'SEARCH'\">\n <div class=\"table-body\">\n <div class=\"object-form-table\">\n <div class=\"label\">\n <span></span>\n <ng-container>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_size_to_fit.svg'\" [iconTitle]=\"('eo.form.table.options.btn.fit'| translate)\" (click)=\"sizeToFit(true)\"></eo-icon>\n <eo-icon class=\"stf\" *ngIf=\"gridOptions.rowData.length\" [iconSrc]=\"'assets/_default/svg/ic_content-download.svg'\" [iconTitle]=\"('eo.form.table.options.btn.csv'| translate)\" (click)=\"exportCSV()\"></eo-icon>\n <eo-icon class=\"stf add-row\" *ngIf=\"!_params.element.readonly\" [iconSrc]=\"'assets/_default/svg/ic_add.svg'\" [iconTitle]=\"('eo.form.table.options.btn.add'| translate)\" (click)=\"addRow()\"></eo-icon>\n </ng-container>\n </div>\n <div class=\"grid-body\">\n <ag-grid-angular #agGrid2 *ngIf=\"gridReady\" class=\"ag-theme-balham\" [modules]=\"modules\"\n [gridOptions]=\"overlayGridOptions\"\n (cellClicked)=\"onCellClicked($event);editRow($event)\"\n (mousedown)=\"onMouseDown($event)\"\n (sortChanged)=\"onSortChanged()\"\n (cellValueChanged)=\"onEditComplete($event)\"\n (columnResized)=\"onColumnResized($event.column, true)\">\n </ag-grid-angular>\n </div>\n </div>\n </div>\n </ng-template>\n\n <!-- table edit component-->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"!!editingRow\">\n <div class=\"edit-body\">\n <eo-row-edit [row]=\"editingRow\" [limitReached]=\"limit <= overlayGridOptions.rowData.length\" #rowEdit\n (onSave)=\"updateRow($event)\" (onSaveCopy)=\"copyRow($event)\" (onDelete)=\"deleteRow($event)\"\n (onCancel)=\"cancelRowEdit()\"></eo-row-edit>\n </div>\n </ng-template>\n\n <!-- viewer-->\n <ng-template yvcSplitArea [size]=\"40\" [visible]=\"showPreview && hasPreviewFile\">\n <eo-media *ngIf=\"hasPreviewFile\" [dmsObject]=\"params.object\" [undockDisabled]=\"true\"\n [useVersion]=\"params.object?.id === params.object?.content?.id\"></eo-media>\n </ng-template>\n\n </yvc-split-view>\n </div>\n</eo-dialog>\n", styles: [":host-context(.dark) .label{color:var(--color-white);background-color:rgba(var(--color-white-rgb),.1)}:host-context(.dark) ::ng-deep .ag-theme-balham .ag-header-cell{color:rgba(var(--color-white-rgb),.7);background-color:rgba(var(--color-white-rgb),.1)}:host-context(.dark) ::ng-deep .ag-theme-balham .ag-root{background-color:transparent}:host ::ng-deep{--oft-row-height: 30px}:host ::ng-deep .ag-theme-balham{position:absolute;top:0;bottom:0;width:100%;box-sizing:border-box}:host ::ng-deep .ag-theme-balham .ag-root{background-color:var(--color-white)}:host ::ng-deep .ag-theme-balham .copy-cell{animation-name:copy-cell;animation-duration:4s}@keyframes copy-cell{0%{background-color:var(--color-accent)}to{background-color:none}}:host ::ng-deep .ag-theme-balham .ag-cell{display:flex;align-items:center;padding:0 calc(var(--app-pane-padding) / 4);font-size:var(--font-caption);line-height:var(--oft-row-height)}:host ::ng-deep .ag-theme-balham .ag-cell.ag-cell-focus{background-color:var(--list-item-hover-background);outline:0!important;border-color:transparent!important}:host ::ng-deep .ag-theme-balham .ag-cell svg{pointer-events:none}:host ::ng-deep .ag-theme-balham .ag-cell.res-ico,:host ::ng-deep .ag-theme-balham .ag-cell.col-boolean{justify-content:center}:host ::ng-deep .ag-theme-balham .ag-cell.col-number{justify-content:flex-end}:host ::ng-deep .ag-theme-balham .ag-cell .no-value{border-radius:2px;font-size:var(--font-hint);background-color:var(--color-accent);padding:calc(var(--app-pane-padding) / 4);color:var(--color-white)}:host ::ng-deep .ag-theme-balham .ag-cell .action-icon{display:flex;cursor:pointer}:host ::ng-deep .ag-theme-balham .ag-cell .action-icon svg{fill:var(--text-color-caption)}:host ::ng-deep .ag-theme-balham .ag-header-cell{color:var(--text-color-caption);font-size:var(--font-caption);line-height:var(--oft-row-height);padding-left:calc(var(--app-pane-padding) / 2);padding-right:calc(var(--app-pane-padding) / 2);font-weight:400;border-bottom-color:var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .ag-header-cell:after{opacity:0}:host ::ng-deep .ag-theme-balham .ag-ltr .ag-header-cell{border-right:1px solid var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .ag-rtl .ag-header-cell{border-left:1px solid var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .chip{display:flex;align-items:center}:host ::ng-deep .ag-theme-balham .chip .link{display:flex;align-items:center}:host{width:100%;display:block;padding:0!important;background:rgba(var(--color-black-rgb),.02);border:1px solid var(--color-gainsboro)}:host.ng-invalid{border-color:var(--color-error);background:rgba(var(--color-error),.15)}:host .object-form-table .grid-body{width:100%;position:relative}:host .object-form-table .grid-body.size-supersmall{height:100px}:host .object-form-table .grid-body.size-small{height:200px}:host .object-form-table .grid-body.size-medium{height:300px}:host .object-form-table .grid-body.size-large{height:400px}:host .object-form-table .grid-body ag-grid-angular{width:100%;height:100%;background-color:transparent}:host .object-form-table.medium .body{height:300px}:host .object-form-table.large .body{height:500px}:host .label{display:flex;flex-flow:row nowrap;align-items:center;padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2) calc(var(--app-pane-padding) / 4);border-bottom:0}:host .label span{display:block;flex:1 1 auto}:host .label eo-icon.stf{width:16px;height:16px;margin:calc(var(--app-pane-padding) / 4);color:var(--text-color-caption);cursor:pointer}:host .label eo-icon.stf.add-row{width:24px;height:24px;background-color:var(--text-color-hint);color:#fff;border-radius:2px}:host .label button.add{border-radius:2px;padding:calc(var(--app-pane-padding) / 2)}:host .label button.export{border-radius:2px;border:1px solid black;color:#000;padding:calc(var(--app-pane-padding) / 8) calc(var(--app-pane-padding) / 4);font-size:var(--font-hint);margin:0 calc(var(--app-pane-padding) / 4)}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.EoIconComponent, selector: "eo-icon", inputs: ["objectType", "iconId", "iconSrc", "badge", "iconTitle"] }, { kind: "component", type: i6.EoDialogComponent, selector: "eo-dialog", inputs: ["hasPreviewFile", "title", "subtitle", "styleClass", "dirtyCheck", "minWidth", "minHeight", "height", "width", "focusOnShow", "align", "isFormTable", "showPreview", "visible"], outputs: ["onTogglePreview", "visibleChange", "hide", "show"] }, { kind: "component", type: i7.AgGridAngular, selector: "ag-grid-angular", inputs: ["slaveGrids", "alignedGrids", "rowData", "columnDefs", "excelStyles", "pinnedTopRowData", "pinnedBottomRowData", "components", "frameworkComponents", "rowStyle", "context", "autoGroupColumnDef", "groupColumnDef", "localeText", "icons", "datasource", "serverSideDatasource", "viewportDatasource", "groupRowRendererParams", "aggFuncs", "fullWidthCellRendererParams", "defaultColGroupDef", "defaultColDef", "defaultExportParams", "columnTypes", "rowClassRules", "detailGridOptions", "detailCellRendererParams", "loadingCellRendererParams", "loadingOverlayComponentParams", "noRowsOverlayComponentParams", "popupParent", "colResizeDefault", "reduxStore", "statusBar", "sideBar", "sortingOrder", "rowClass", "rowSelection", "overlayLoadingTemplate", "overlayNoRowsTemplate", "quickFilterText", "rowModelType", "editType", "domLayout", "clipboardDeliminator", "rowGroupPanelShow", "multiSortKey", "pivotColumnGroupTotals", "pivotRowTotals", "pivotPanelShow", "rowHeight", "detailRowHeight", "rowBuffer", "colWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "groupDefaultExpanded", "minColWidth", "maxColWidth", "viewportRowModelPageSize", "viewportRowModelBufferSize", "autoSizePadding", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "cacheOverflowSize", "paginationPageSize", "cacheBlockSize", "infiniteInitialRowCount", "scrollbarWidth", "paginationStartPage", "infiniteBlockSize", "batchUpdateWaitMillis", "blockLoadDebounceMillis", "keepDetailRowsCount", "undoRedoCellEditingLimit", "localeTextFunc", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "dateComponent", "dateComponentFramework", "groupRowRenderer", "groupRowRendererFramework", "isExternalFilterPresent", "getRowHeight", "doesExternalFilterPass", "getRowClass", "getRowStyle", "getRowClassRules", "traverseNode", "getContextMenuItems", "getMainMenuItems", "processRowPostCreate", "processCellForClipboard", "getNodeChildDetails", "groupRowAggNodes", "getRowNodeId", "isFullWidthCell", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "doesDataFlower", "processSecondaryColDef", "processSecondaryColGroupDef", "getBusinessKeyForNode", "sendToClipboard", "navigateToNextCell", "tabToNextCell", "getDetailRowData", "processCellFromClipboard", "getDocument", "postProcessPopup", "getChildCount", "getDataPath", "loadingCellRenderer", "loadingCellRendererFramework", "loadingOverlayComponent", "loadingOverlayComponentFramework", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "detailCellRenderer", "detailCellRendererFramework", "defaultGroupSortComparator", "isRowMaster", "isRowSelectable", "postSort", "processHeaderForClipboard", "paginationNumberFormatter", "processDataFromClipboard", "getServerSideGroupKey", "isServerSideGroup", "suppressKeyboardEvent", "createChartContainer", "processChartOptions", "getChartToolbarItems", "fillOperation", "toolPanelSuppressRowGroups", "toolPanelSuppressValues", "toolPanelSuppressPivots", "toolPanelSuppressPivotMode", "toolPanelSuppressSideButtons", "toolPanelSuppressColumnFilter", "toolPanelSuppressColumnSelectAll", "toolPanelSuppressColumnExpandAll", "suppressMakeColumnVisibleAfterUnGroup", "suppressRowClickSelection", "suppressCellSelection", "suppressHorizontalScroll", "alwaysShowVerticalScroll", "debug", "enableBrowserTooltips", "enableColResize", "enableCellExpressions", "enableSorting", "enableServerSideSorting", "enableFilter", "enableServerSideFilter", "angularCompileRows", "angularCompileFilters", "angularCompileHeaders", "groupSuppressAutoColumn", "groupSelectsChildren", "groupIncludeFooter", "groupIncludeTotalFooter", "groupUseEntireRow", "groupSuppressRow", "groupSuppressBlankHeader", "forPrint", "suppressMenuHide", "rowDeselection", "unSortIcon", "suppressMultiSort", "singleClickEdit", "suppressLoadingOverlay", "suppressNoRowsOverlay", "suppressAutoSize", "skipHeaderOnAutoSize", "suppressParentsInRowNodes", "showToolPanel", "suppressColumnMoveAnimation", "suppressMovableColumns", "suppressFieldDotNotation", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "suppressClearOnFillReduction", "deltaSort", "suppressTouch", "suppressAsyncEvents", "allowContextMenuWithControlKey", "suppressContextMenu", "suppressMenuFilterPanel", "suppressMenuMainPanel", "suppressMenuColumnPanel", "rememberGroupStateWhenNewData", "enableCellChangeFlash", "suppressDragLeaveHidesColumns", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "suppressUseColIdForGroups", "suppressCopyRowsToClipboard", "copyHeadersToClipboard", "pivotMode", "suppressAggFuncInHeader", "suppressColumnVirtualisation", "suppressAggAtRootLevel", "suppressFocusAfterRefresh", "functionsPassive", "functionsReadOnly", "animateRows", "groupSelectsFiltered", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "enableRtl", "suppressClickEdit", "rowDragManaged", "suppressRowDrag", "enableGroupEdit", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "suppressTabbing", "suppressPaginationPanel", "floatingFilter", "groupHideOpenParents", "groupMultiAutoColumn", "pagination", "stopEditingWhenGridLosesFocus", "paginationAutoPageSize", "suppressScrollOnNewData", "purgeClosedRowNodes", "cacheQuickFilter", "deltaRowDataMode", "ensureDomOrder", "accentedSort", "pivotTotals", "suppressChangeDetection", "valueCache", "valueCacheNeverExpires", "aggregateOnlyChangedColumns", "suppressAnimationFrame", "suppressExcelExport", "suppressCsvExport", "treeData", "masterDetail", "suppressMultiRangeSelection", "enterMovesDownAfterEdit", "enterMovesDown", "suppressPropertyNamesCheck", "rowMultiSelectWithClick", "contractColumnSelection", "suppressEnterpriseResetOnNewColumns", "enableOldSetFilterModel", "suppressRowHoverHighlight", "gridAutoHeight", "suppressRowTransform", "suppressClipboardPaste", "serverSideSortingAlwaysResets", "reactNext", "suppressSetColumnStateEvents", "enableCharts", "deltaColumnMode", "suppressMaintainUnsortedOrder", "enableCellTextSelection", "suppressBrowserResizeObserver", "suppressMaxRenderedRowRestriction", "excludeChildrenWhenTreeDataFiltering", "keepDetailRows", "paginateChildRows", "preventDefaultOnContextMenu", "undoRedoCellEditing", "allowDragFromColumnsToolPanel", "gridOptions", "modules"], outputs: ["columnEverythingChanged", "newColumnsLoaded", "columnPivotModeChanged", "columnRowGroupChanged", "expandOrCollapseAll", "columnPivotChanged", "gridColumnsChanged", "columnValueChanged", "columnMoved", "columnVisible", "columnPinned", "columnGroupOpened", "columnResized", "displayedColumnsChanged", "virtualColumnsChanged", "rowGroupOpened", "rowDataChanged", "rowDataUpdated", "pinnedRowDataChanged", "rangeSelectionChanged", "chartRangeSelectionChanged", "chartOptionsChanged", "toolPanelVisibleChanged", "modelUpdated", "pasteStart", "pasteEnd", "fillStart", "fillEnd", "cellClicked", "cellDoubleClicked", "cellMouseDown", "cellContextMenu", "cellValueChanged", "rowValueChanged", "cellFocused", "rowSelected", "selectionChanged", "cellKeyDown", "cellKeyPress", "cellMouseOver", "cellMouseOut", "filterChanged", "filterModified", "filterOpened", "sortChanged", "virtualRowRemoved", "rowClicked", "rowDoubleClicked", "gridReady", "gridSizeChanged", "viewportChanged", "firstDataRendered", "dragStarted", "dragStopped", "rowEditingStarted", "rowEditingStopped", "cellEditingStarted", "cellEditingStopped", "bodyScroll", "animationQueueEmpty", "heightScaleChanged", "paginationChanged", "componentStateChanged", "bodyHeightChanged", "displayedColumnsWidthChanged", "scrollVisibilityChanged", "columnHoverChanged", "flashCells", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "popupToFront", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: i8.MediaComponent, selector: "eo-media", inputs: ["undockDisabled", "enableCloseBtn", "useVersion", "attachments", "searchTerm", "previewUri", "previewFile", "dmsObject"] }, { kind: "component", type: i9.SplitViewComponent, selector: "yvc-split-view", inputs: ["direction", "gutterSize", "restrictMove", "disabled", "gutterDblClickDuration", "layoutSettingsID"], outputs: ["layoutSettingsChange", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"] }, { kind: "directive", type: i9.SplitAreaDirective, selector: "[yvcSplitArea]", inputs: ["size", "order", "minSize", "maxSize", "panelClass", "visible"] }, { kind: "component", type: i10.RowEditComponent, selector: "eo-row-edit", inputs: ["limitReached", "row"], outputs: ["onCancel", "onSave", "onSaveCopy", "onDelete"] }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] });
588
+ ], viewQueries: [{ propertyName: "rowEdit", first: true, predicate: ["rowEdit"], descendants: true }], ngImport: i0, template: "<div class=\"object-form-table\" [ngClass]=\"{medium: _params.size === 'medium', large: _params.size === 'large'}\">\n <div class=\"label\">\n <span>{{_params.element.label}}</span>\n <ng-container *ngIf=\"_params.situation !== 'SEARCH'\">\n\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_expand.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.open'| translate)\" (click)=\"openDialog()\"></eo-icon>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_size_to_fit.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.fit'| translate)\" (click)=\"sizeToFit()\"></eo-icon>\n <eo-icon class=\"stf\" *ngIf=\"gridOptions.rowData?.length\" [iconSrc]=\"'assets/_default/svg/ic_content-download.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.csv'| translate)\" (click)=\"exportCSV()\"></eo-icon>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_upload2.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.upload'| translate)\" (click)=\"file.click()\"></eo-icon>\n <input type=\"file\" accept=\".csv\" style=\"display:none;\" #file (change)=\"importCSV($event.target)\" (click)=\"$event.target.value = null\">\n <eo-icon class=\"stf add-row\" *ngIf=\"!_params.element.readonly\" [iconSrc]=\"'assets/_default/svg/ic_add.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.add'| translate)\" (click)=\"addRow()\"></eo-icon>\n\n </ng-container>\n </div>\n <div class=\"grid-body size-{{ params.size }}\">\n <ag-grid-angular #agGrid *ngIf=\"gridReady\" class=\"ag-theme-balham\" [modules]=\"modules\" [gridOptions]=\"gridOptions\"\n (rowDoubleClicked)=\"editRow($event)\" (cellClicked)=\"onCellClicked($event)\" (sortChanged)=\"onSortChanged()\"\n (cellValueChanged)=\"onEditComplete($event)\" (columnResized)=\"onColumnResized($event.column)\">\n </ag-grid-angular>\n </div>\n</div>\n\n\n<eo-dialog [title]=\"params.element.label\" [visible]=\"showDialog\" [dirtyCheck]=\"rowEdit?.pendingTaskId\"\n [minWidth]=\"_params.situation !== 'SEARCH' ? minWidth : 200\"\n [width]=\"_params.situation !== 'SEARCH' ? '95vw' : 500\"\n [height]=\"height\"\n [styleClass]=\"'object-form-table-dialog'\" (hide)=\"onClose()\" [isFormTable]=\"true\" [hasPreviewFile]=\"hasPreviewFile\"\n [showPreview]=\"showPreview\" (onTogglePreview)=\"togglePreview()\">\n\n <div class=\"body\" *ngIf=\"showDialog\">\n\n <!-- <yvc-split-view [layoutSettingsID]=\"cacheLayoutKey\"> -->\n <yvc-split-view>\n\n <!-- the table itself-->\n <ng-template yvcSplitArea [size]=\"40\" [visible]=\"_params.situation !== 'SEARCH'\">\n <div class=\"table-body\">\n <div class=\"object-form-table\">\n <div class=\"label\">\n <span></span>\n <ng-container>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_size_to_fit.svg'\" [iconTitle]=\"('eo.form.table.options.btn.fit'| translate)\" (click)=\"sizeToFit(true)\"></eo-icon>\n <eo-icon class=\"stf\" *ngIf=\"gridOptions.rowData.length\" [iconSrc]=\"'assets/_default/svg/ic_content-download.svg'\" [iconTitle]=\"('eo.form.table.options.btn.csv'| translate)\" (click)=\"exportCSV()\"></eo-icon>\n <eo-icon class=\"stf add-row\" *ngIf=\"!_params.element.readonly\" [iconSrc]=\"'assets/_default/svg/ic_add.svg'\" [iconTitle]=\"('eo.form.table.options.btn.add'| translate)\" (click)=\"addRow()\"></eo-icon>\n </ng-container>\n </div>\n <div class=\"grid-body\">\n <ag-grid-angular #agGrid2 *ngIf=\"gridReady\" class=\"ag-theme-balham\" [modules]=\"modules\"\n [gridOptions]=\"overlayGridOptions\"\n (cellClicked)=\"onCellClicked($event);editRow($event)\"\n (mousedown)=\"onMouseDown($event)\"\n (sortChanged)=\"onSortChanged()\"\n (cellValueChanged)=\"onEditComplete($event)\"\n (columnResized)=\"onColumnResized($event.column, true)\">\n </ag-grid-angular>\n </div>\n </div>\n </div>\n </ng-template>\n\n <!-- table edit component-->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"!!editingRow\">\n <div class=\"edit-body\">\n <eo-row-edit [row]=\"editingRow\" [limitReached]=\"limit <= overlayGridOptions.rowData.length\" #rowEdit\n (onSave)=\"updateRow($event)\" (onSaveCopy)=\"copyRow($event)\" (onDelete)=\"deleteRow($event)\"\n (onCancel)=\"cancelRowEdit()\"></eo-row-edit>\n </div>\n </ng-template>\n\n <!-- viewer-->\n <ng-template yvcSplitArea [size]=\"40\" [visible]=\"showPreview && hasPreviewFile\">\n <eo-media *ngIf=\"hasPreviewFile\" [dmsObject]=\"params.object\" [undockDisabled]=\"true\"\n [useVersion]=\"params.object?.id === params.object?.content?.id\"></eo-media>\n </ng-template>\n\n </yvc-split-view>\n </div>\n</eo-dialog>\n\n<eo-dialog [title]=\"('eo.form.table.csv.import.report.title' | translate)\" [visible]=\"showImportReportDialog\"\n (hide)=\"closeImportReport()\" [styleClass]=\"'import-report__dialog'\">\n <div class=\"body\">\n <h4 translate [translateParams]=\"{readRows: mappedRows.length}\">eo.form.table.csv.import.report.readRows</h4>\n <div *ngIf=\"mappingErrorFields.length !== 0\" class=\"flex-col\">\n <h4 translate>eo.form.table.csv.import.report.errors</h4>\n <table>\n <thead>\n <tr>\n <th translate>eo.form.table.csv.import.report.errors.row</th>\n <th translate>eo.form.table.csv.import.report.errors.column</th>\n <th translate>eo.form.table.csv.import.report.errors.value</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let error of mappingErrorFields; let i = index\">\n <tr>\n <td>{{error.row + 1}}</td>\n <td>{{error.field}}</td>\n <td>{{error.value}}</td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"actions\">\n <button (click)=\"closeImportReport()\" class=\"button-cancel\" translate>eo.resubmission.cancel</button>\n <button (click)=\"addImportValuesToTable()\" class=\"primary\" translate>eo.form.table.csv.import.report.import</button>\n </div>\n</eo-dialog>\n", styles: [":host-context(.dark) .label{color:var(--color-white);background-color:rgba(var(--color-white-rgb),.1)}:host-context(.dark) ::ng-deep .ag-theme-balham .ag-header-cell{color:rgba(var(--color-white-rgb),.7);background-color:rgba(var(--color-white-rgb),.1)}:host-context(.dark) ::ng-deep .ag-theme-balham .ag-root{background-color:transparent}:host ::ng-deep{--oft-row-height: 30px}:host ::ng-deep .ag-theme-balham{position:absolute;top:0;bottom:0;width:100%;box-sizing:border-box}:host ::ng-deep .ag-theme-balham .ag-root{background-color:var(--color-white)}:host ::ng-deep .ag-theme-balham .copy-cell{animation-name:copy-cell;animation-duration:4s}@keyframes copy-cell{0%{background-color:var(--color-accent)}to{background-color:none}}:host ::ng-deep .ag-theme-balham .ag-cell{display:flex;align-items:center;padding:0 calc(var(--app-pane-padding) / 4);font-size:var(--font-caption);line-height:var(--oft-row-height)}:host ::ng-deep .ag-theme-balham .ag-cell.ag-cell-focus{background-color:var(--list-item-hover-background);outline:0!important;border-color:transparent!important}:host ::ng-deep .ag-theme-balham .ag-cell svg{pointer-events:none}:host ::ng-deep .ag-theme-balham .ag-cell.res-ico,:host ::ng-deep .ag-theme-balham .ag-cell.col-boolean{justify-content:center}:host ::ng-deep .ag-theme-balham .ag-cell.col-number{justify-content:flex-end}:host ::ng-deep .ag-theme-balham .ag-cell .no-value{border-radius:2px;font-size:var(--font-hint);background-color:var(--color-accent);padding:calc(var(--app-pane-padding) / 4);color:var(--color-white)}:host ::ng-deep .ag-theme-balham .ag-cell .action-icon{display:flex;cursor:pointer}:host ::ng-deep .ag-theme-balham .ag-cell .action-icon svg{fill:var(--text-color-caption)}:host ::ng-deep .ag-theme-balham .ag-header-cell{color:var(--text-color-caption);font-size:var(--font-caption);line-height:var(--oft-row-height);padding-left:calc(var(--app-pane-padding) / 2);padding-right:calc(var(--app-pane-padding) / 2);font-weight:400;border-bottom-color:var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .ag-header-cell:after{opacity:0}:host ::ng-deep .ag-theme-balham .ag-ltr .ag-header-cell{border-right:1px solid var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .ag-rtl .ag-header-cell{border-left:1px solid var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .chip{display:flex;align-items:center}:host ::ng-deep .ag-theme-balham .chip .link{display:flex;align-items:center}:host{width:100%;display:block;padding:0!important;background:rgba(var(--color-black-rgb),.02);border:1px solid var(--color-gainsboro)}:host.ng-invalid{border-color:var(--color-error);background:rgba(var(--color-error),.15)}:host .object-form-table .grid-body{width:100%;position:relative}:host .object-form-table .grid-body.size-supersmall{height:100px}:host .object-form-table .grid-body.size-small{height:200px}:host .object-form-table .grid-body.size-medium{height:300px}:host .object-form-table .grid-body.size-large{height:400px}:host .object-form-table .grid-body ag-grid-angular{width:100%;height:100%;background-color:transparent}:host .object-form-table.medium .body{height:300px}:host .object-form-table.large .body{height:500px}:host .label{display:flex;flex-flow:row nowrap;align-items:center;padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2) calc(var(--app-pane-padding) / 4);border-bottom:0}:host .label span{display:block;flex:1 1 auto}:host .label eo-icon.stf{width:16px;height:16px;margin:calc(var(--app-pane-padding) / 4);color:var(--text-color-caption);cursor:pointer}:host .label eo-icon.stf.add-row{width:24px;height:24px;background-color:var(--text-color-hint);color:#fff;border-radius:2px}:host .label button.add{border-radius:2px;padding:calc(var(--app-pane-padding) / 2)}:host .label button.export{border-radius:2px;border:1px solid black;color:#000;padding:calc(var(--app-pane-padding) / 8) calc(var(--app-pane-padding) / 4);font-size:var(--font-hint);margin:0 calc(var(--app-pane-padding) / 4)}::ng-deep .import-report__dialog{padding:8px;min-height:unset!important;overflow:hidden}::ng-deep .import-report__dialog .body{overflow:auto}::ng-deep .import-report__dialog--header{font-size:1.17em!important;font-weight:400!important;color:rgba(var(--color-black-rgb),.54)!important;padding:0 0 1em!important;margin:0;background:white!important}::ng-deep .import-report__dialog td,::ng-deep .import-report__dialog th{border:1px solid #dddddd;text-align:left;padding:8px}::ng-deep .import-report__dialog .actions{display:flex;flex:0;flex-direction:row;min-height:0;min-width:0;align-items:flex-end;justify-content:flex-end;margin:0 var(--app-pane-padding) var(--app-pane-padding);min-height:3em}::ng-deep .import-report__dialog .actions button{white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.EoIconComponent, selector: "eo-icon", inputs: ["objectType", "iconId", "iconSrc", "badge", "iconTitle"] }, { kind: "component", type: i7.EoDialogComponent, selector: "eo-dialog", inputs: ["hasPreviewFile", "title", "subtitle", "styleClass", "dirtyCheck", "minWidth", "minHeight", "height", "width", "focusOnShow", "align", "isFormTable", "showPreview", "visible"], outputs: ["onTogglePreview", "visibleChange", "hide", "show"] }, { kind: "component", type: i8.AgGridAngular, selector: "ag-grid-angular", inputs: ["slaveGrids", "alignedGrids", "rowData", "columnDefs", "excelStyles", "pinnedTopRowData", "pinnedBottomRowData", "components", "frameworkComponents", "rowStyle", "context", "autoGroupColumnDef", "groupColumnDef", "localeText", "icons", "datasource", "serverSideDatasource", "viewportDatasource", "groupRowRendererParams", "aggFuncs", "fullWidthCellRendererParams", "defaultColGroupDef", "defaultColDef", "defaultExportParams", "columnTypes", "rowClassRules", "detailGridOptions", "detailCellRendererParams", "loadingCellRendererParams", "loadingOverlayComponentParams", "noRowsOverlayComponentParams", "popupParent", "colResizeDefault", "reduxStore", "statusBar", "sideBar", "sortingOrder", "rowClass", "rowSelection", "overlayLoadingTemplate", "overlayNoRowsTemplate", "quickFilterText", "rowModelType", "editType", "domLayout", "clipboardDeliminator", "rowGroupPanelShow", "multiSortKey", "pivotColumnGroupTotals", "pivotRowTotals", "pivotPanelShow", "rowHeight", "detailRowHeight", "rowBuffer", "colWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "groupDefaultExpanded", "minColWidth", "maxColWidth", "viewportRowModelPageSize", "viewportRowModelBufferSize", "autoSizePadding", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "cacheOverflowSize", "paginationPageSize", "cacheBlockSize", "infiniteInitialRowCount", "scrollbarWidth", "paginationStartPage", "infiniteBlockSize", "batchUpdateWaitMillis", "blockLoadDebounceMillis", "keepDetailRowsCount", "undoRedoCellEditingLimit", "localeTextFunc", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "dateComponent", "dateComponentFramework", "groupRowRenderer", "groupRowRendererFramework", "isExternalFilterPresent", "getRowHeight", "doesExternalFilterPass", "getRowClass", "getRowStyle", "getRowClassRules", "traverseNode", "getContextMenuItems", "getMainMenuItems", "processRowPostCreate", "processCellForClipboard", "getNodeChildDetails", "groupRowAggNodes", "getRowNodeId", "isFullWidthCell", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "doesDataFlower", "processSecondaryColDef", "processSecondaryColGroupDef", "getBusinessKeyForNode", "sendToClipboard", "navigateToNextCell", "tabToNextCell", "getDetailRowData", "processCellFromClipboard", "getDocument", "postProcessPopup", "getChildCount", "getDataPath", "loadingCellRenderer", "loadingCellRendererFramework", "loadingOverlayComponent", "loadingOverlayComponentFramework", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "detailCellRenderer", "detailCellRendererFramework", "defaultGroupSortComparator", "isRowMaster", "isRowSelectable", "postSort", "processHeaderForClipboard", "paginationNumberFormatter", "processDataFromClipboard", "getServerSideGroupKey", "isServerSideGroup", "suppressKeyboardEvent", "createChartContainer", "processChartOptions", "getChartToolbarItems", "fillOperation", "toolPanelSuppressRowGroups", "toolPanelSuppressValues", "toolPanelSuppressPivots", "toolPanelSuppressPivotMode", "toolPanelSuppressSideButtons", "toolPanelSuppressColumnFilter", "toolPanelSuppressColumnSelectAll", "toolPanelSuppressColumnExpandAll", "suppressMakeColumnVisibleAfterUnGroup", "suppressRowClickSelection", "suppressCellSelection", "suppressHorizontalScroll", "alwaysShowVerticalScroll", "debug", "enableBrowserTooltips", "enableColResize", "enableCellExpressions", "enableSorting", "enableServerSideSorting", "enableFilter", "enableServerSideFilter", "angularCompileRows", "angularCompileFilters", "angularCompileHeaders", "groupSuppressAutoColumn", "groupSelectsChildren", "groupIncludeFooter", "groupIncludeTotalFooter", "groupUseEntireRow", "groupSuppressRow", "groupSuppressBlankHeader", "forPrint", "suppressMenuHide", "rowDeselection", "unSortIcon", "suppressMultiSort", "singleClickEdit", "suppressLoadingOverlay", "suppressNoRowsOverlay", "suppressAutoSize", "skipHeaderOnAutoSize", "suppressParentsInRowNodes", "showToolPanel", "suppressColumnMoveAnimation", "suppressMovableColumns", "suppressFieldDotNotation", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "suppressClearOnFillReduction", "deltaSort", "suppressTouch", "suppressAsyncEvents", "allowContextMenuWithControlKey", "suppressContextMenu", "suppressMenuFilterPanel", "suppressMenuMainPanel", "suppressMenuColumnPanel", "rememberGroupStateWhenNewData", "enableCellChangeFlash", "suppressDragLeaveHidesColumns", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "suppressUseColIdForGroups", "suppressCopyRowsToClipboard", "copyHeadersToClipboard", "pivotMode", "suppressAggFuncInHeader", "suppressColumnVirtualisation", "suppressAggAtRootLevel", "suppressFocusAfterRefresh", "functionsPassive", "functionsReadOnly", "animateRows", "groupSelectsFiltered", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "enableRtl", "suppressClickEdit", "rowDragManaged", "suppressRowDrag", "enableGroupEdit", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "suppressTabbing", "suppressPaginationPanel", "floatingFilter", "groupHideOpenParents", "groupMultiAutoColumn", "pagination", "stopEditingWhenGridLosesFocus", "paginationAutoPageSize", "suppressScrollOnNewData", "purgeClosedRowNodes", "cacheQuickFilter", "deltaRowDataMode", "ensureDomOrder", "accentedSort", "pivotTotals", "suppressChangeDetection", "valueCache", "valueCacheNeverExpires", "aggregateOnlyChangedColumns", "suppressAnimationFrame", "suppressExcelExport", "suppressCsvExport", "treeData", "masterDetail", "suppressMultiRangeSelection", "enterMovesDownAfterEdit", "enterMovesDown", "suppressPropertyNamesCheck", "rowMultiSelectWithClick", "contractColumnSelection", "suppressEnterpriseResetOnNewColumns", "enableOldSetFilterModel", "suppressRowHoverHighlight", "gridAutoHeight", "suppressRowTransform", "suppressClipboardPaste", "serverSideSortingAlwaysResets", "reactNext", "suppressSetColumnStateEvents", "enableCharts", "deltaColumnMode", "suppressMaintainUnsortedOrder", "enableCellTextSelection", "suppressBrowserResizeObserver", "suppressMaxRenderedRowRestriction", "excludeChildrenWhenTreeDataFiltering", "keepDetailRows", "paginateChildRows", "preventDefaultOnContextMenu", "undoRedoCellEditing", "allowDragFromColumnsToolPanel", "gridOptions", "modules"], outputs: ["columnEverythingChanged", "newColumnsLoaded", "columnPivotModeChanged", "columnRowGroupChanged", "expandOrCollapseAll", "columnPivotChanged", "gridColumnsChanged", "columnValueChanged", "columnMoved", "columnVisible", "columnPinned", "columnGroupOpened", "columnResized", "displayedColumnsChanged", "virtualColumnsChanged", "rowGroupOpened", "rowDataChanged", "rowDataUpdated", "pinnedRowDataChanged", "rangeSelectionChanged", "chartRangeSelectionChanged", "chartOptionsChanged", "toolPanelVisibleChanged", "modelUpdated", "pasteStart", "pasteEnd", "fillStart", "fillEnd", "cellClicked", "cellDoubleClicked", "cellMouseDown", "cellContextMenu", "cellValueChanged", "rowValueChanged", "cellFocused", "rowSelected", "selectionChanged", "cellKeyDown", "cellKeyPress", "cellMouseOver", "cellMouseOut", "filterChanged", "filterModified", "filterOpened", "sortChanged", "virtualRowRemoved", "rowClicked", "rowDoubleClicked", "gridReady", "gridSizeChanged", "viewportChanged", "firstDataRendered", "dragStarted", "dragStopped", "rowEditingStarted", "rowEditingStopped", "cellEditingStarted", "cellEditingStopped", "bodyScroll", "animationQueueEmpty", "heightScaleChanged", "paginationChanged", "componentStateChanged", "bodyHeightChanged", "displayedColumnsWidthChanged", "scrollVisibilityChanged", "columnHoverChanged", "flashCells", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "popupToFront", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: i9.MediaComponent, selector: "eo-media", inputs: ["undockDisabled", "enableCloseBtn", "useVersion", "attachments", "searchTerm", "previewUri", "previewFile", "dmsObject"] }, { kind: "component", type: i10.SplitViewComponent, selector: "yvc-split-view", inputs: ["direction", "gutterSize", "restrictMove", "disabled", "gutterDblClickDuration", "layoutSettingsID"], outputs: ["layoutSettingsChange", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"] }, { kind: "directive", type: i10.SplitAreaDirective, selector: "[yvcSplitArea]", inputs: ["size", "order", "minSize", "maxSize", "panelClass", "visible"] }, { kind: "component", type: i11.RowEditComponent, selector: "eo-row-edit", inputs: ["limitReached", "row"], outputs: ["onCancel", "onSave", "onSaveCopy", "onDelete"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] });
464
589
  FormElementTableComponent = FormElementTableComponent_1 = __decorate([
465
590
  UntilDestroy()
466
591
  ], FormElementTableComponent);
@@ -478,8 +603,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
478
603
  useExisting: forwardRef(() => FormElementTableComponent),
479
604
  multi: true,
480
605
  }
481
- ], template: "<div class=\"object-form-table\" [ngClass]=\"{medium: _params.size === 'medium', large: _params.size === 'large'}\">\n <div class=\"label\">\n <span>{{_params.element.label}}</span>\n <ng-container *ngIf=\"_params.situation !== 'SEARCH'\">\n\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_expand.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.open'| translate)\" (click)=\"openDialog()\"></eo-icon>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_size_to_fit.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.fit'| translate)\" (click)=\"sizeToFit()\"></eo-icon>\n <eo-icon class=\"stf\" *ngIf=\"gridOptions.rowData?.length\" [iconSrc]=\"'assets/_default/svg/ic_content-download.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.csv'| translate)\" (click)=\"exportCSV()\"></eo-icon>\n <eo-icon class=\"stf add-row\" *ngIf=\"!_params.element.readonly\" [iconSrc]=\"'assets/_default/svg/ic_add.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.add'| translate)\" (click)=\"addRow()\"></eo-icon>\n\n </ng-container>\n </div>\n <div class=\"grid-body size-{{ params.size }}\">\n <ag-grid-angular #agGrid *ngIf=\"gridReady\" class=\"ag-theme-balham\" [modules]=\"modules\" [gridOptions]=\"gridOptions\"\n (rowDoubleClicked)=\"editRow($event)\" (cellClicked)=\"onCellClicked($event)\" (sortChanged)=\"onSortChanged()\"\n (cellValueChanged)=\"onEditComplete($event)\" (columnResized)=\"onColumnResized($event.column)\">\n </ag-grid-angular>\n </div>\n</div>\n\n\n<eo-dialog [title]=\"params.element.label\" [visible]=\"showDialog\" [dirtyCheck]=\"rowEdit?.pendingTaskId\"\n [minWidth]=\"_params.situation !== 'SEARCH' ? minWidth : 200\"\n [width]=\"_params.situation !== 'SEARCH' ? '95vw' : 500\"\n [height]=\"height\"\n [styleClass]=\"'object-form-table-dialog'\" (hide)=\"onClose()\" [isFormTable]=\"true\" [hasPreviewFile]=\"hasPreviewFile\"\n [showPreview]=\"showPreview\" (onTogglePreview)=\"togglePreview()\">\n\n <div class=\"body\" *ngIf=\"showDialog\">\n\n <!-- <yvc-split-view [layoutSettingsID]=\"cacheLayoutKey\"> -->\n <yvc-split-view>\n\n <!-- the table itself-->\n <ng-template yvcSplitArea [size]=\"40\" [visible]=\"_params.situation !== 'SEARCH'\">\n <div class=\"table-body\">\n <div class=\"object-form-table\">\n <div class=\"label\">\n <span></span>\n <ng-container>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_size_to_fit.svg'\" [iconTitle]=\"('eo.form.table.options.btn.fit'| translate)\" (click)=\"sizeToFit(true)\"></eo-icon>\n <eo-icon class=\"stf\" *ngIf=\"gridOptions.rowData.length\" [iconSrc]=\"'assets/_default/svg/ic_content-download.svg'\" [iconTitle]=\"('eo.form.table.options.btn.csv'| translate)\" (click)=\"exportCSV()\"></eo-icon>\n <eo-icon class=\"stf add-row\" *ngIf=\"!_params.element.readonly\" [iconSrc]=\"'assets/_default/svg/ic_add.svg'\" [iconTitle]=\"('eo.form.table.options.btn.add'| translate)\" (click)=\"addRow()\"></eo-icon>\n </ng-container>\n </div>\n <div class=\"grid-body\">\n <ag-grid-angular #agGrid2 *ngIf=\"gridReady\" class=\"ag-theme-balham\" [modules]=\"modules\"\n [gridOptions]=\"overlayGridOptions\"\n (cellClicked)=\"onCellClicked($event);editRow($event)\"\n (mousedown)=\"onMouseDown($event)\"\n (sortChanged)=\"onSortChanged()\"\n (cellValueChanged)=\"onEditComplete($event)\"\n (columnResized)=\"onColumnResized($event.column, true)\">\n </ag-grid-angular>\n </div>\n </div>\n </div>\n </ng-template>\n\n <!-- table edit component-->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"!!editingRow\">\n <div class=\"edit-body\">\n <eo-row-edit [row]=\"editingRow\" [limitReached]=\"limit <= overlayGridOptions.rowData.length\" #rowEdit\n (onSave)=\"updateRow($event)\" (onSaveCopy)=\"copyRow($event)\" (onDelete)=\"deleteRow($event)\"\n (onCancel)=\"cancelRowEdit()\"></eo-row-edit>\n </div>\n </ng-template>\n\n <!-- viewer-->\n <ng-template yvcSplitArea [size]=\"40\" [visible]=\"showPreview && hasPreviewFile\">\n <eo-media *ngIf=\"hasPreviewFile\" [dmsObject]=\"params.object\" [undockDisabled]=\"true\"\n [useVersion]=\"params.object?.id === params.object?.content?.id\"></eo-media>\n </ng-template>\n\n </yvc-split-view>\n </div>\n</eo-dialog>\n", styles: [":host-context(.dark) .label{color:var(--color-white);background-color:rgba(var(--color-white-rgb),.1)}:host-context(.dark) ::ng-deep .ag-theme-balham .ag-header-cell{color:rgba(var(--color-white-rgb),.7);background-color:rgba(var(--color-white-rgb),.1)}:host-context(.dark) ::ng-deep .ag-theme-balham .ag-root{background-color:transparent}:host ::ng-deep{--oft-row-height: 30px}:host ::ng-deep .ag-theme-balham{position:absolute;top:0;bottom:0;width:100%;box-sizing:border-box}:host ::ng-deep .ag-theme-balham .ag-root{background-color:var(--color-white)}:host ::ng-deep .ag-theme-balham .copy-cell{animation-name:copy-cell;animation-duration:4s}@keyframes copy-cell{0%{background-color:var(--color-accent)}to{background-color:none}}:host ::ng-deep .ag-theme-balham .ag-cell{display:flex;align-items:center;padding:0 calc(var(--app-pane-padding) / 4);font-size:var(--font-caption);line-height:var(--oft-row-height)}:host ::ng-deep .ag-theme-balham .ag-cell.ag-cell-focus{background-color:var(--list-item-hover-background);outline:0!important;border-color:transparent!important}:host ::ng-deep .ag-theme-balham .ag-cell svg{pointer-events:none}:host ::ng-deep .ag-theme-balham .ag-cell.res-ico,:host ::ng-deep .ag-theme-balham .ag-cell.col-boolean{justify-content:center}:host ::ng-deep .ag-theme-balham .ag-cell.col-number{justify-content:flex-end}:host ::ng-deep .ag-theme-balham .ag-cell .no-value{border-radius:2px;font-size:var(--font-hint);background-color:var(--color-accent);padding:calc(var(--app-pane-padding) / 4);color:var(--color-white)}:host ::ng-deep .ag-theme-balham .ag-cell .action-icon{display:flex;cursor:pointer}:host ::ng-deep .ag-theme-balham .ag-cell .action-icon svg{fill:var(--text-color-caption)}:host ::ng-deep .ag-theme-balham .ag-header-cell{color:var(--text-color-caption);font-size:var(--font-caption);line-height:var(--oft-row-height);padding-left:calc(var(--app-pane-padding) / 2);padding-right:calc(var(--app-pane-padding) / 2);font-weight:400;border-bottom-color:var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .ag-header-cell:after{opacity:0}:host ::ng-deep .ag-theme-balham .ag-ltr .ag-header-cell{border-right:1px solid var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .ag-rtl .ag-header-cell{border-left:1px solid var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .chip{display:flex;align-items:center}:host ::ng-deep .ag-theme-balham .chip .link{display:flex;align-items:center}:host{width:100%;display:block;padding:0!important;background:rgba(var(--color-black-rgb),.02);border:1px solid var(--color-gainsboro)}:host.ng-invalid{border-color:var(--color-error);background:rgba(var(--color-error),.15)}:host .object-form-table .grid-body{width:100%;position:relative}:host .object-form-table .grid-body.size-supersmall{height:100px}:host .object-form-table .grid-body.size-small{height:200px}:host .object-form-table .grid-body.size-medium{height:300px}:host .object-form-table .grid-body.size-large{height:400px}:host .object-form-table .grid-body ag-grid-angular{width:100%;height:100%;background-color:transparent}:host .object-form-table.medium .body{height:300px}:host .object-form-table.large .body{height:500px}:host .label{display:flex;flex-flow:row nowrap;align-items:center;padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2) calc(var(--app-pane-padding) / 4);border-bottom:0}:host .label span{display:block;flex:1 1 auto}:host .label eo-icon.stf{width:16px;height:16px;margin:calc(var(--app-pane-padding) / 4);color:var(--text-color-caption);cursor:pointer}:host .label eo-icon.stf.add-row{width:24px;height:24px;background-color:var(--text-color-hint);color:#fff;border-radius:2px}:host .label button.add{border-radius:2px;padding:calc(var(--app-pane-padding) / 2)}:host .label button.export{border-radius:2px;border:1px solid black;color:#000;padding:calc(var(--app-pane-padding) / 8) calc(var(--app-pane-padding) / 4);font-size:var(--font-hint);margin:0 calc(var(--app-pane-padding) / 4)}\n"] }]
482
- }], ctorParameters: function () { return [{ type: i1.LocalStorageService }, { type: i1.SystemService }, { type: i2.PendingChangesService }, { type: i3.GridService }]; }, propDecorators: { rowEdit: [{
606
+ ], template: "<div class=\"object-form-table\" [ngClass]=\"{medium: _params.size === 'medium', large: _params.size === 'large'}\">\n <div class=\"label\">\n <span>{{_params.element.label}}</span>\n <ng-container *ngIf=\"_params.situation !== 'SEARCH'\">\n\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_expand.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.open'| translate)\" (click)=\"openDialog()\"></eo-icon>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_size_to_fit.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.fit'| translate)\" (click)=\"sizeToFit()\"></eo-icon>\n <eo-icon class=\"stf\" *ngIf=\"gridOptions.rowData?.length\" [iconSrc]=\"'assets/_default/svg/ic_content-download.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.csv'| translate)\" (click)=\"exportCSV()\"></eo-icon>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_upload2.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.upload'| translate)\" (click)=\"file.click()\"></eo-icon>\n <input type=\"file\" accept=\".csv\" style=\"display:none;\" #file (change)=\"importCSV($event.target)\" (click)=\"$event.target.value = null\">\n <eo-icon class=\"stf add-row\" *ngIf=\"!_params.element.readonly\" [iconSrc]=\"'assets/_default/svg/ic_add.svg'\"\n [iconTitle]=\"('eo.form.table.options.btn.add'| translate)\" (click)=\"addRow()\"></eo-icon>\n\n </ng-container>\n </div>\n <div class=\"grid-body size-{{ params.size }}\">\n <ag-grid-angular #agGrid *ngIf=\"gridReady\" class=\"ag-theme-balham\" [modules]=\"modules\" [gridOptions]=\"gridOptions\"\n (rowDoubleClicked)=\"editRow($event)\" (cellClicked)=\"onCellClicked($event)\" (sortChanged)=\"onSortChanged()\"\n (cellValueChanged)=\"onEditComplete($event)\" (columnResized)=\"onColumnResized($event.column)\">\n </ag-grid-angular>\n </div>\n</div>\n\n\n<eo-dialog [title]=\"params.element.label\" [visible]=\"showDialog\" [dirtyCheck]=\"rowEdit?.pendingTaskId\"\n [minWidth]=\"_params.situation !== 'SEARCH' ? minWidth : 200\"\n [width]=\"_params.situation !== 'SEARCH' ? '95vw' : 500\"\n [height]=\"height\"\n [styleClass]=\"'object-form-table-dialog'\" (hide)=\"onClose()\" [isFormTable]=\"true\" [hasPreviewFile]=\"hasPreviewFile\"\n [showPreview]=\"showPreview\" (onTogglePreview)=\"togglePreview()\">\n\n <div class=\"body\" *ngIf=\"showDialog\">\n\n <!-- <yvc-split-view [layoutSettingsID]=\"cacheLayoutKey\"> -->\n <yvc-split-view>\n\n <!-- the table itself-->\n <ng-template yvcSplitArea [size]=\"40\" [visible]=\"_params.situation !== 'SEARCH'\">\n <div class=\"table-body\">\n <div class=\"object-form-table\">\n <div class=\"label\">\n <span></span>\n <ng-container>\n <eo-icon class=\"stf\" [iconSrc]=\"'assets/_default/svg/ic_size_to_fit.svg'\" [iconTitle]=\"('eo.form.table.options.btn.fit'| translate)\" (click)=\"sizeToFit(true)\"></eo-icon>\n <eo-icon class=\"stf\" *ngIf=\"gridOptions.rowData.length\" [iconSrc]=\"'assets/_default/svg/ic_content-download.svg'\" [iconTitle]=\"('eo.form.table.options.btn.csv'| translate)\" (click)=\"exportCSV()\"></eo-icon>\n <eo-icon class=\"stf add-row\" *ngIf=\"!_params.element.readonly\" [iconSrc]=\"'assets/_default/svg/ic_add.svg'\" [iconTitle]=\"('eo.form.table.options.btn.add'| translate)\" (click)=\"addRow()\"></eo-icon>\n </ng-container>\n </div>\n <div class=\"grid-body\">\n <ag-grid-angular #agGrid2 *ngIf=\"gridReady\" class=\"ag-theme-balham\" [modules]=\"modules\"\n [gridOptions]=\"overlayGridOptions\"\n (cellClicked)=\"onCellClicked($event);editRow($event)\"\n (mousedown)=\"onMouseDown($event)\"\n (sortChanged)=\"onSortChanged()\"\n (cellValueChanged)=\"onEditComplete($event)\"\n (columnResized)=\"onColumnResized($event.column, true)\">\n </ag-grid-angular>\n </div>\n </div>\n </div>\n </ng-template>\n\n <!-- table edit component-->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"!!editingRow\">\n <div class=\"edit-body\">\n <eo-row-edit [row]=\"editingRow\" [limitReached]=\"limit <= overlayGridOptions.rowData.length\" #rowEdit\n (onSave)=\"updateRow($event)\" (onSaveCopy)=\"copyRow($event)\" (onDelete)=\"deleteRow($event)\"\n (onCancel)=\"cancelRowEdit()\"></eo-row-edit>\n </div>\n </ng-template>\n\n <!-- viewer-->\n <ng-template yvcSplitArea [size]=\"40\" [visible]=\"showPreview && hasPreviewFile\">\n <eo-media *ngIf=\"hasPreviewFile\" [dmsObject]=\"params.object\" [undockDisabled]=\"true\"\n [useVersion]=\"params.object?.id === params.object?.content?.id\"></eo-media>\n </ng-template>\n\n </yvc-split-view>\n </div>\n</eo-dialog>\n\n<eo-dialog [title]=\"('eo.form.table.csv.import.report.title' | translate)\" [visible]=\"showImportReportDialog\"\n (hide)=\"closeImportReport()\" [styleClass]=\"'import-report__dialog'\">\n <div class=\"body\">\n <h4 translate [translateParams]=\"{readRows: mappedRows.length}\">eo.form.table.csv.import.report.readRows</h4>\n <div *ngIf=\"mappingErrorFields.length !== 0\" class=\"flex-col\">\n <h4 translate>eo.form.table.csv.import.report.errors</h4>\n <table>\n <thead>\n <tr>\n <th translate>eo.form.table.csv.import.report.errors.row</th>\n <th translate>eo.form.table.csv.import.report.errors.column</th>\n <th translate>eo.form.table.csv.import.report.errors.value</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let error of mappingErrorFields; let i = index\">\n <tr>\n <td>{{error.row + 1}}</td>\n <td>{{error.field}}</td>\n <td>{{error.value}}</td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"actions\">\n <button (click)=\"closeImportReport()\" class=\"button-cancel\" translate>eo.resubmission.cancel</button>\n <button (click)=\"addImportValuesToTable()\" class=\"primary\" translate>eo.form.table.csv.import.report.import</button>\n </div>\n</eo-dialog>\n", styles: [":host-context(.dark) .label{color:var(--color-white);background-color:rgba(var(--color-white-rgb),.1)}:host-context(.dark) ::ng-deep .ag-theme-balham .ag-header-cell{color:rgba(var(--color-white-rgb),.7);background-color:rgba(var(--color-white-rgb),.1)}:host-context(.dark) ::ng-deep .ag-theme-balham .ag-root{background-color:transparent}:host ::ng-deep{--oft-row-height: 30px}:host ::ng-deep .ag-theme-balham{position:absolute;top:0;bottom:0;width:100%;box-sizing:border-box}:host ::ng-deep .ag-theme-balham .ag-root{background-color:var(--color-white)}:host ::ng-deep .ag-theme-balham .copy-cell{animation-name:copy-cell;animation-duration:4s}@keyframes copy-cell{0%{background-color:var(--color-accent)}to{background-color:none}}:host ::ng-deep .ag-theme-balham .ag-cell{display:flex;align-items:center;padding:0 calc(var(--app-pane-padding) / 4);font-size:var(--font-caption);line-height:var(--oft-row-height)}:host ::ng-deep .ag-theme-balham .ag-cell.ag-cell-focus{background-color:var(--list-item-hover-background);outline:0!important;border-color:transparent!important}:host ::ng-deep .ag-theme-balham .ag-cell svg{pointer-events:none}:host ::ng-deep .ag-theme-balham .ag-cell.res-ico,:host ::ng-deep .ag-theme-balham .ag-cell.col-boolean{justify-content:center}:host ::ng-deep .ag-theme-balham .ag-cell.col-number{justify-content:flex-end}:host ::ng-deep .ag-theme-balham .ag-cell .no-value{border-radius:2px;font-size:var(--font-hint);background-color:var(--color-accent);padding:calc(var(--app-pane-padding) / 4);color:var(--color-white)}:host ::ng-deep .ag-theme-balham .ag-cell .action-icon{display:flex;cursor:pointer}:host ::ng-deep .ag-theme-balham .ag-cell .action-icon svg{fill:var(--text-color-caption)}:host ::ng-deep .ag-theme-balham .ag-header-cell{color:var(--text-color-caption);font-size:var(--font-caption);line-height:var(--oft-row-height);padding-left:calc(var(--app-pane-padding) / 2);padding-right:calc(var(--app-pane-padding) / 2);font-weight:400;border-bottom-color:var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .ag-header-cell:after{opacity:0}:host ::ng-deep .ag-theme-balham .ag-ltr .ag-header-cell{border-right:1px solid var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .ag-rtl .ag-header-cell{border-left:1px solid var(--color-gainsboro)}:host ::ng-deep .ag-theme-balham .chip{display:flex;align-items:center}:host ::ng-deep .ag-theme-balham .chip .link{display:flex;align-items:center}:host{width:100%;display:block;padding:0!important;background:rgba(var(--color-black-rgb),.02);border:1px solid var(--color-gainsboro)}:host.ng-invalid{border-color:var(--color-error);background:rgba(var(--color-error),.15)}:host .object-form-table .grid-body{width:100%;position:relative}:host .object-form-table .grid-body.size-supersmall{height:100px}:host .object-form-table .grid-body.size-small{height:200px}:host .object-form-table .grid-body.size-medium{height:300px}:host .object-form-table .grid-body.size-large{height:400px}:host .object-form-table .grid-body ag-grid-angular{width:100%;height:100%;background-color:transparent}:host .object-form-table.medium .body{height:300px}:host .object-form-table.large .body{height:500px}:host .label{display:flex;flex-flow:row nowrap;align-items:center;padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2) calc(var(--app-pane-padding) / 4);border-bottom:0}:host .label span{display:block;flex:1 1 auto}:host .label eo-icon.stf{width:16px;height:16px;margin:calc(var(--app-pane-padding) / 4);color:var(--text-color-caption);cursor:pointer}:host .label eo-icon.stf.add-row{width:24px;height:24px;background-color:var(--text-color-hint);color:#fff;border-radius:2px}:host .label button.add{border-radius:2px;padding:calc(var(--app-pane-padding) / 2)}:host .label button.export{border-radius:2px;border:1px solid black;color:#000;padding:calc(var(--app-pane-padding) / 8) calc(var(--app-pane-padding) / 4);font-size:var(--font-hint);margin:0 calc(var(--app-pane-padding) / 4)}::ng-deep .import-report__dialog{padding:8px;min-height:unset!important;overflow:hidden}::ng-deep .import-report__dialog .body{overflow:auto}::ng-deep .import-report__dialog--header{font-size:1.17em!important;font-weight:400!important;color:rgba(var(--color-black-rgb),.54)!important;padding:0 0 1em!important;margin:0;background:white!important}::ng-deep .import-report__dialog td,::ng-deep .import-report__dialog th{border:1px solid #dddddd;text-align:left;padding:8px}::ng-deep .import-report__dialog .actions{display:flex;flex:0;flex-direction:row;min-height:0;min-width:0;align-items:flex-end;justify-content:flex-end;margin:0 var(--app-pane-padding) var(--app-pane-padding);min-height:3em}::ng-deep .import-report__dialog .actions button{white-space:nowrap}\n"] }]
607
+ }], ctorParameters: function () { return [{ type: i1.LocalStorageService }, { type: i1.SystemService }, { type: i2.PendingChangesService }, { type: i3.GridService }, { type: i1.NotificationsService }, { type: i1.TranslateService }]; }, propDecorators: { rowEdit: [{
483
608
  type: ViewChild,
484
609
  args: ['rowEdit']
485
610
  }], limit: [{
@@ -505,4 +630,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
505
630
  type: HostListener,
506
631
  args: ['keydown.control.c', ['$event']]
507
632
  }] } });
508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lbGVtZW50LXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZW8tZnJhbWV3b3JrL29iamVjdC1mb3JtL29iamVjdC1mb3JtL2Zvcm0tZWxlbWVudC10YWJsZS9mb3JtLWVsZW1lbnQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9lby1mcmFtZXdvcmsvb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0vZm9ybS1lbGVtZW50LXRhYmxlL2Zvcm0tZWxlbWVudC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBRWxGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXVCLGFBQWEsRUFBRSxpQkFBaUIsRUFBZ0MsTUFBTSxnQkFBZ0IsQ0FBQztBQUNySCxPQUFPLEVBQXFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxPQUFPLEVBQUMsWUFBWSxFQUFFLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxZQUFZLEVBQWMsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7Ozs7Ozs7OztBQXlCbEYsSUFBTSx5QkFBeUIsaUNBQS9CLE1BQU0seUJBQXlCO0lBa0JwQyxJQUNJLE1BQU0sQ0FBQyxDQUF1QjtRQUNoQyxJQUFJLENBQUMs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RSxVQUFVLGFBS1Q7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUM7NEJBQ3hELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7b01BWXFCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFHWCxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFHRixNQUFNO3NCQURULEtBQUs7Z0JBK0NOLGVBQWU7c0JBSmQsWUFBWTt1QkFBQyw2QkFBNkIsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ3RELFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUNsRCxZQUFZO3VCQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDaEQsWUFBWTt1QkFBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2xpZW50U2lkZVJvd01vZGVsTW9kdWxlfSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvY2xpZW50LXNpZGUtcm93LW1vZGVsJztcbmltcG9ydCB7Q29sRGVmLCBHcmlkT3B0aW9ucywgTW9kdWxlfSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvY29yZSc7XG5pbXBvcnQge0NzdkV4cG9ydE1vZHVsZX0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2Nzdi1leHBvcnQnO1xuaW1wb3J0IHtDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtMb2NhbFN0b3JhZ2VTZXJ2aWNlLCBTeXN0ZW1TZXJ2aWNlLCBVdGlsc30gZnJvbSAnQGVvLXNkay9jb3JlJztcbmltcG9ydCB7Zm9ya0pvaW59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHtDZWxsUmVuZGVyZXIsIEdyaWRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9lby1mcmFtZXdvcmstY29yZS9hcGkvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7UGVuZGluZ0NoYW5nZXNTZXJ2aWNlfSBmcm9tICcuLy4uLy4uLy4uLy4uL2VvLWZyYW1ld29yay1jb3JlL3BlbmRpbmctY2hhbmdlcy9wZW5kaW5nLWNoYW5nZXMuc2VydmljZSc7XG5pbXBvcnQge0VkaXRSb3csIFRhYmxlQ29tcG9uZW50UGFyYW1zfSBmcm9tICcuL2Zvcm0tZWxlbWVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtSb3dFZGl0Q29tcG9uZW50fSBmcm9tICcuL3Jvdy1lZGl0L3Jvdy1lZGl0LmNvbXBvbmVudCc7XG5cbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZW8tdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1lbGVtZW50LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vZm9ybS1lbGVtZW50LXRhYmxlLmNvbXBvbmVudC5zY3NzJ1xuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvcm1FbGVtZW50VGFibGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb3JtRWxlbWVudFRhYmxlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtRWxlbWVudFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0IHtcblxuICBwcml2YXRlIF9jYWNoZWRDb2x1bW5zOiBhbnlbXTtcbiAgcHJpdmF0ZSBfY2FjaGVkQ29sdW1uc092ZXJsYXk6IGFueVtdO1xuXG4gIHB1YmxpYyBtb2R1bGVzOiBNb2R1bGVbXSA9IFtDbGllbnRTaWRlUm93TW9kZWxNb2R1bGUsIENzdkV4cG9ydE1vZHVsZV07XG5cbiAgQkFTRV9DQUNIRV9MQVlPVVRfS0VZID0gJ3RhYmxlLnN0YXRlJztcbiAgY2FjaGVMYXlvdXRLZXkgPSB0aGlzLkJBU0VfQ0FDSEVfTEFZT1VUX0tFWTtcblxuICBAVmlld0NoaWxkKCdyb3dFZGl0Jykgcm93RWRpdDogUm93RWRpdENvbXBvbmVudDtcbiAgLy8gQFZpZXdDaGlsZCgnc3BsaXRWaWV3Jykgc3BsaXRWaWV3OiBTcGxpdENvbXBvbmVudDtcblxuICBASW5wdXQoKSBsaW1pdDogbnVtYmVyO1xuICBASW5wdXQoKSBoYXNQcmV2aWV3RmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgbWluV2lkdGggPSAnOTd2dyc7XG4gIEBJbnB1dCgpIGhlaWdodCA9ICc5NXZoJztcblxuICBASW5wdXQoKVxuICBzZXQgcGFyYW1zKHA6IFRhYmxlQ29tcG9uZW50UGFyYW1zKSB7XG4gICAgdGhpcy5jYWNoZUxheW91dEtleSA9IHAgPyBgJHt0aGlzLkJBU0VfQ0FDSEVfTEFZT1VUX0tFWX0uJHtwLmVsZW1lbnQubmFtZX1gIDogdGhpcy5CQVNFX0NBQ0hFX0xBWU9VVF9LRVlcbiAgICBpZiAocCkge1xuICAgICAgdGhpcy5fcGFyYW1zID0gcDtcbiAgICAgIHRoaXMuX2NhY2hlZENvbHVtbnMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0odGhpcy5jYWNoZUxheW91dEtleSArICcuY29sRGVmJykgfHwgW107XG4gICAgICB0aGlzLl9jYWNoZWRDb2x1bW5zT3ZlcmxheSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSh0aGlzLmNhY2hlTGF5b3V0S2V5ICsgJy5jb2xEZWZPdmVybGF5JykgfHwgW107XG4gICAgICB0aGlzLnNob3dQcmV2aWV3ID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRJdGVtKHRoaXMuY2FjaGVMYXlvdXRLZXkgKyAnLnNob3dQcmV2aWV3Jyk7XG5cblxuICAgICAgQ2VsbFJlbmRlcmVyLnNpdHVhdGlvbiA9IHRoaXMuX3BhcmFtcy5zaXR1YXRpb247XG4gICAgICBpZiAodGhpcy5fcGFyYW1zLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcpIHtcbiAgICAgICAgdGhpcy5fcGFyYW1zLnNpemUgPSAnc3VwZXJzbWFsbCc7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl9wYXJhbXMuc2l6ZSkge1xuICAgICAgICB0aGlzLl9wYXJhbXMuc2l6ZSA9ICdzbWFsbCc7XG4gICAgICB9XG4gICAgICB0aGlzLmdyaWRSZWFkeSA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWxlbWVudHMgPSBwLmVsZW1lbnQuZWxlbWVudHM7XG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMgPSB0aGlzLmNyZWF0ZUNvbHVtbkRlZmluaXRpb24oKTtcbiAgICAgIGlmICh0aGlzLl9wYXJhbXMuc2l0dWF0aW9uID09PSAnU0VBUkNIJykge1xuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMucHVzaCh7aGVhZGVyTmFtZTogJycsIGNvbElkOiAnYWN0aW9ucycsIHdpZHRoOiAzNCwgbWluV2lkdGg6IDM0LCBwaW5uZWQ6ICdyaWdodCcsIGNlbGxSZW5kZXJlcjogdGhpcy5hY3Rpb25zQ2VsbFJlbmRlcmVyfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5jb2x1bW5EZWZzID0gdGhpcy5jcmVhdGVDb2x1bW5EZWZpbml0aW9uKHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmdyaWRSZWFkeSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGdldCBwYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtcztcbiAgfVxuXG4gIF9wYXJhbXM6IFRhYmxlQ29tcG9uZW50UGFyYW1zO1xuICBwcml2YXRlIF9lbGVtZW50czogYW55W107XG4gIGdyaWRSZWFkeSA9IGZhbHNlO1xuICB2YWx1ZTogYW55W107XG4gIGlubmVyVmFsdWU6IGFueVtdO1xuICBncmlkT3B0aW9uczogR3JpZE9wdGlvbnM7XG4gIG92ZXJsYXlHcmlkT3B0aW9uczogR3JpZE9wdGlvbnM7XG4gIGVkaXRpbmdSb3c6IEVkaXRSb3c7XG4gIHNob3dEaWFsb2cgPSBmYWxzZTtcbiAgc2hvd1ByZXZpZXcgPSBmYWxzZTtcblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmNvbnRyb2wuYWx0LnNoaWZ0LmMnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmNvbnRyb2wuc2hpZnQuYycsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uY29udHJvbC5hbHQuYycsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uY29udHJvbC5jJywgWyckZXZlbnQnXSlcbiAgY29weUNlbGxIYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5ncmlkQXBpLmNvcHlUb0NsaXBib2FyZChldmVudCwgdGhpcy5ncmlkT3B0aW9ucyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3lzdGVtU2VydmljZTogU3lzdGVtU2VydmljZSwgcHJpdmF0ZSBwZW5kaW5nQ2hhbmdlczogUGVuZGluZ0NoYW5nZXNTZXJ2aWNlLFxuICAgIHB1YmxpYyBncmlkQXBpOiBHcmlkU2VydmljZSkge1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSA8R3JpZE9wdGlvbnM+e1xuICAgICAgY29udGV4dDogdGhpcy5ncmlkQXBpLmdldENvbnRleHQoKSxcbiAgICAgIGhlYWRlckhlaWdodDogMzAsXG4gICAgICByb3dIZWlnaHQ6IDMwLFxuICAgICAgcm93QnVmZmVyOiAyMCxcbiAgICAgIG11bHRpU29ydEtleTogJ2N0cmwnLFxuICAgICAgYWNjZW50ZWRTb3J0OiB0cnVlLFxuICAgICAgLy8gc3VwcHJlc3NDZWxsU2VsZWN0aW9uOiB0cnVlLFxuICAgICAgcm93U2VsZWN0aW9uOiAnc2luZ2xlJyxcbiAgICAgIHN1cHByZXNzTW92YWJsZUNvbHVtbnM6IHRydWUsXG4gICAgICBlbmFibGVGaWx0ZXI6IGZhbHNlLFxuICAgICAgc3VwcHJlc3NOb1Jvd3NPdmVybGF5OiB0cnVlLFxuICAgICAgc3VwcHJlc3NMb2FkaW5nT3ZlcmxheTogdHJ1ZSxcbiAgICAgIHN1cHByZXNzQ29udGV4dE1lbnU6IHRydWVcbiAgICB9O1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMuY29udGV4dC50YWJsZUNvbXBvbmVudCA9IHRoaXM7XG5cbiAgICB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucyA9IDxHcmlkT3B0aW9ucz57XG4gICAgICBjb250ZXh0OiB0aGlzLmdyaWRBcGkuZ2V0Q29udGV4dCgpLFxuICAgICAgaGVhZGVySGVpZ2h0OiAzMCxcbiAgICAgIHJvd0hlaWdodDogMzAsXG4gICAgICByb3dCdWZmZXI6IDIwLFxuICAgICAgbXVsdGlTb3J0S2V5OiAnY3RybCcsXG4gICAgICBhY2NlbnRlZFNvcnQ6IHRydWUsXG4gICAgICAvLyBzdXBwcmVzc0NlbGxTZWxlY3Rpb246IHRydWUsXG4gICAgICByb3dTZWxlY3Rpb246ICdzaW5nbGUnLFxuICAgICAgc3VwcHJlc3NNb3ZhYmxlQ29sdW1uczogdHJ1ZSxcbiAgICAgIGVuYWJsZUZpbHRlcjogZmFsc2UsXG4gICAgICBzdXBwcmVzc05vUm93c092ZXJsYXk6IHRydWUsXG4gICAgICBzdXBwcmVzc0xvYWRpbmdPdmVybGF5OiB0cnVlLFxuICAgICAgc3VwcHJlc3NDb250ZXh0TWVudTogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuY29udGV4dC50YWJsZUNvbXBvbmVudCA9IHRoaXM7XG4gICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMucm93Q2xhc3NSdWxlcyA9IHtcbiAgICAgICduZXctcm93JzogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zLmRhdGEuaXNOZXdSb3cpIHtcbiAgICAgICAgICBkZWxldGUgcGFyYW1zLmRhdGEuaXNOZXdSb3c7XG4gICAgICAgICAgZGVsZXRlIHBhcmFtcy5jb250ZXh0LnRhYmxlQ29tcG9uZW50LmlubmVyVmFsdWVbcGFyYW1zLmNvbnRleHQudGFibGVDb21wb25lbnQuaW5uZXJWYWx1ZS5sZW5ndGggLSAxXS5pc05ld1JvdztcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdDaGFuZ2VzLnRhc2tzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHVudGlsRGVzdHJveWVkKHRoaXMpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHRhc2tzID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuc3VwcHJlc3NSb3dDbGlja1NlbGVjdGlvbiA9ICEhdGhpcy5yb3dFZGl0ICYmICEhdGFza3MuaW5jbHVkZXModGhpcy5yb3dFZGl0LnBlbmRpbmdUYXNrSWQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYWN0aW9uc0NlbGxSZW5kZXJlcihwYXJhbXMpIHtcbiAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBpZiAocGFyYW1zLmNvbnRleHQudGFibGVDb21wb25lbnQucGFyYW1zLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcpIHtcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImFjdGlvbi1pY29uXCIgaWQ9XCJhY3Rpb25JY29uLSR7cGFyYW1zLnJvd0luZGV4fVwiPlxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgPHBhdGggZD1cIk0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6XCIvPlxuICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5gO1xuICAgICAgbGV0IGNsZWFySWNvbiA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKGAjYWN0aW9uSWNvbi0ke3BhcmFtcy5yb3dJbmRleH1gKVswXTtcbiAgICAgIGNsZWFySWNvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhcmFtcy5jb250ZXh0LnRhYmxlQ29tcG9uZW50LmNsZWFyUm93KHBhcmFtcy5yb3dJbmRleCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJhY3Rpb24taWNvblwiIGlkPVwiYWN0aW9uSWNvbi0ke3BhcmFtcy5yb3dJbmRleH1cIj5cbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgIDxwYXRoIGQ9XCJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0elwiLz5cbiAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+YDtcbiAgICAgIGxldCBkZWxldGVJY29uID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoYCNhY3Rpb25JY29uLSR7cGFyYW1zLnJvd0luZGV4fWApWzBdO1xuICAgICAgZGVsZXRlSWNvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHBhcmFtcy5jb250ZXh0LnRhYmxlQ29tcG9uZW50LmRlbGV0ZVJvdyhwYXJhbXMucm93SW5kZXgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGl2O1xuICB9XG5cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4ge1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55W10pOiB2b2lkIHtcblxuICAgIGlmICghdmFsdWUgJiYgdGhpcy5fcGFyYW1zLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcpIHtcbiAgICAgIC8vIGZvciBzZWFyY2ggcm93IGRhdGEgd2lsbCBhbHdheXMgYmUgb25lIGVtcHR5IHJvd1xuICAgICAgLy8gdG9kbzogcmUtZW5hYmxlIGFnYWluIHdoZW4gc2VhcmNoIGluIHRhYmxlcyBpcyBzdXBwb3J0ZWRcbiAgICAgIHZhbHVlID0gW3t9XTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgPyB2YWx1ZSA6IFtdO1xuICAgIC8vIGNyZWF0ZSBhIGNsb25lIG9mIHRoZSBhY3R1YWwgdmFsdWUgZm9yIGludGVybmFsIHVzYWdlXG4gICAgdGhpcy5pbm5lclZhbHVlID0gVXRpbHMuZm9ybURhdGFQYXJzZShVdGlscy5mb3JtRGF0YVN0cmluZ2lmeSh0aGlzLnZhbHVlKSk7XG5cbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5hcGkpIHtcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNldFJvd0RhdGEodGhpcy5pbm5lclZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5yb3dEYXRhID0gdGhpcy5pbm5lclZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkpIHtcbiAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5zZXRSb3dEYXRhKHRoaXMuaW5uZXJWYWx1ZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0RWRpdFJvdygpLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMucm93RGF0YSA9IHRoaXMuaW5uZXJWYWx1ZTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjb2x1bW4gZGVmaW5pdGlvbiBmcm9tIGZvcm0gZWxlbWVudC5cbiAgICogQHJldHVybnMgY29sdW1uIGRlZmluaXRpb24gdG8gYmUgYWRkZWQgdG8gdGhlIGdyaWRPcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbHVtbkRlZmluaXRpb24ob3ZlcmxheT86IGJvb2xlYW4pOiBDb2xEZWZbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLm1hcCgoZWwpID0+IHtcbiAgICAgIGxldCBjb2w6IENvbERlZiA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5EZWZpbml0aW9uKGVsKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY29sLCB7XG4gICAgICAgIGhlYWRlck5hbWU6IGVsLmxhYmVsLFxuICAgICAgICBzdXBwcmVzc01lbnU6IHRydWUsXG4gICAgICAgIGZpbHRlcjogZmFsc2UsXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgICByZXNpemFibGU6IHRydWUsXG4gICAgICAgIGZpZWxkOiBlbC5uYW1lLFxuICAgICAgICByZWZEYXRhOiB7XG4gICAgICAgICAgLi4uY29sLnJlZkRhdGEsXG4gICAgICAgICAgX2VvRm9ybUVsZW1lbnQ6IGVsLFxuICAgICAgICAgIF9zaXR1YXRpb246IHRoaXMuX3BhcmFtcy5zaXR1YXRpb25cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgY2FjaGVkQ29sdW1ucyA9IHRoaXMuX2NhY2hlZENvbHVtbnM7XG4gICAgICBpZiAob3ZlcmxheSkge1xuICAgICAgICBjYWNoZWRDb2x1bW5zID0gdGhpcy5fY2FjaGVkQ29sdW1uc092ZXJsYXk7XG4gICAgICB9XG4gICAgICBsZXQgY2FjaGVkQ29sdW1uID0gY2FjaGVkQ29sdW1ucy5maW5kKGYgPT4gZi5xbmFtZSA9PT0gZWwucW5hbWUpO1xuICAgICAgaWYgKGNhY2hlZENvbHVtbikge1xuICAgICAgICBjb2wud2lkdGggPSBjYWNoZWRDb2x1bW4ud2lkdGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkUm93KCkge1xuICAgIGNvbnN0IHJvd0RhdGEgPSB7fTtcbiAgICBjb25zdCBhc3luY0ZldGNoZXMgPSBbXTtcbiAgICB0aGlzLl9lbGVtZW50c1xuICAgICAgLmZvckVhY2goZWwgPT4ge1xuICAgICAgICBpZiAoZWwuZGVmYXVsdHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByb3dEYXRhW2VsLm5hbWVdID0gZWwuZGVmYXVsdHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKGVsLmRlZmF1bHR2YWx1ZWZ1bmN0aW9uKSB7XG4gICAgICAgICAgcm93RGF0YVtlbC5uYW1lXSA9IHRoaXMuc3lzdGVtU2VydmljZS5nZXREZWZhdWx0VmFsdWUoZWwuZGVmYXVsdHZhbHVlZnVuY3Rpb24pO1xuICAgICAgICAgIGlmIChlbC5kZWZhdWx0dmFsdWVmdW5jdGlvbiA9PT0gJ0NVUlJFTlRfVVNFUicpIHtcbiAgICAgICAgICAgIGFzeW5jRmV0Y2hlcy5wdXNoKHRoaXMucmVzb2x2ZU9yZ0RhdGFNZXRhKGVsLm5hbWUsIHJvd0RhdGFbZWwubmFtZV0pKVxuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBpZiAoYXN5bmNGZXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvcmtKb2luKGFzeW5jRmV0Y2hlcykuc3Vic2NyaWJlKChyZXM6IHtrZXk6IHN0cmluZywgdmFsdWU6IGFueX1bXSkgPT4ge1xuICAgICAgICByZXMuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICByb3dEYXRhW3Iua2V5XSA9IHIudmFsdWU7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuc2V0RWRpdFJvdygtMSwgcm93RGF0YSk7XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEVkaXRSb3coLTEsIHJvd0RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9yZ0RhdGFNZXRhKGVsZW1lbnROYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zeXN0ZW1TZXJ2aWNlLmdldE9yZ2FuaXphdGlvbk9iamVjdCh2YWx1ZSkucGlwZShcbiAgICAgIG1hcChyZXMgPT4gKHtcbiAgICAgICAga2V5OiBgJHtlbGVtZW50TmFtZX1fbWV0YWAsXG4gICAgICAgIHZhbHVlOiByZXNcbiAgICAgIH0pKVxuICAgIClcbiAgfVxuXG4gIGVkaXRSb3coZXZlbnQpIHtcbiAgICB0aGlzLnNldEVkaXRSb3coZXZlbnQubm9kZS5pZCwgZXZlbnQubm9kZS5kYXRhKTtcbiAgfVxuXG4gIG9uRWRpdENvbXBsZXRlKGV2ZW50KSB7XG4gICAgLy90b2RvOiBpcyBpdCBvYnNvbGV0ZT9cbiAgfVxuXG4gIHByaXZhdGUgc2V0RWRpdFJvdyhpbmRleDogbnVtYmVyLCBkYXRhOiBhbnkpIHtcbiAgICAvLyBzZXR1cCB0aGUgcm93IHRvIGJlIGVkaXRlZC4gQmVzaWRlIHNvbWUgcHJvcGVydGllcywgdGhlXG4gICAgLy8gcm93IGNvbnRhaW5zIGEgZm9ybSBtb2RlbCBhbmQgZm9ybSBkYXRhLiBJZiB0aGUgcGFyZW50IGZvcm0gbW9kZWxcbiAgICAvLyBwcm92aWRlZCBhIHNjcmlwdCwgdGhpcyB3aWxsIGJlIGFkZGVkIGFzIHdlbGwsIHNvIGVkaXRpbmcgYSByb3cgd2lsbFxuICAgIC8vIHJlc3BlY3QgdGhlIGZvcm0gc2NyaXB0LlxuICAgIHRoaXMuZWRpdGluZ1JvdyA9IHtcbiAgICAgIHNpdHVhdGlvbjogdGhpcy5fcGFyYW1zLnNpdHVhdGlvbixcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHRhYmxlRWxlbWVudDogdGhpcy5fcGFyYW1zLmVsZW1lbnQsXG4gICAgICBmb3JtOiB7XG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLl9lbGVtZW50cyxcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMuX3BhcmFtcy5lbGVtZW50LnJlYWRvbmx5LFxuICAgICAgICBkYXRhXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnNob3dEaWFsb2cgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZWxlY3RFZGl0Um93KCksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RFZGl0Um93KCkge1xuICAgIGlmICh0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkpIHtcbiAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5kZXNlbGVjdEFsbCgpO1xuICAgICAgaWYgKHRoaXMuZWRpdGluZ1JvdyAmJiB0aGlzLmVkaXRpbmdSb3cuaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGxldCByb3dOb2RlID0gdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLmdldFJvd05vZGUoJycgKyB0aGlzLmVkaXRpbmdSb3cuaW5kZXgpO1xuICAgICAgICByb3dOb2RlLnNldFNlbGVjdGVkKHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkuZW5zdXJlTm9kZVZpc2libGUocm93Tm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUYWJsZVZhbHVlKCkge1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNldFJvd0RhdGEodGhpcy5pbm5lclZhbHVlKTtcbiAgICBpZiAodGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpKSB7XG4gICAgICB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkuc2V0Um93RGF0YSh0aGlzLmlubmVyVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5yb3dEYXRhID0gdGhpcy5pbm5lclZhbHVlO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5pbm5lclZhbHVlO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnZhbHVlLmluY2x1ZGVzKCdpc05ld1JvdycpKSkge1xuICAgICAgZGVsZXRlIHRoaXMudmFsdWVbJ2lzTmV3Um93J107XG4gICAgfVxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgY2FuY2VsUm93RWRpdCgpIHtcbiAgICBpZiAodGhpcy5yb3dFZGl0KSB7XG4gICAgICB0aGlzLnJvd0VkaXQuZmluaXNoUGVuZGluZygpO1xuICAgIH1cbiAgICB0aGlzLmVkaXRpbmdSb3cgPSBudWxsO1xuICAgIGlmICh0aGlzLl9wYXJhbXMuc2l0dWF0aW9uID09PSAnU0VBUkNIJykge1xuICAgICAgdGhpcy5zaG93RGlhbG9nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb25DbG9zZSgpIHtcbiAgICB0aGlzLmVkaXRpbmdSb3cgPSBudWxsO1xuICAgIHRoaXMuc2hvd0RpYWxvZyA9IGZhbHNlO1xuICB9XG5cbiAgdXBkYXRlUm93KHJvd1Jlc3VsdDogYW55KSB7XG4gICAgY29uc3QgaXNOZXdSb3cgPSByb3dSZXN1bHQuaW5kZXggPT09IC0xO1xuICAgIGlmIChpc05ld1Jvdykge1xuICAgICAgdGhpcy5pbm5lclZhbHVlLnB1c2goey4uLnJvd1Jlc3VsdC5yb3dEYXRhLCAuLi57aXNOZXdSb3c6IHRydWV9fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAvLyB0aGlzLmlubmVyVmFsdWVbcm93UmVzdWx0LmluZGV4XSA9IHsuLi50aGlzLmlubmVyVmFsdWVbcm93UmVzdWx0LmluZGV4XSwgLi4ucm93UmVzdWx0LnJvd0RhdGF9O1xuICAgICAgICB0aGlzLmlubmVyVmFsdWVbcm93UmVzdWx0LmluZGV4XVtlbC5uYW1lXSA9IHJvd1Jlc3VsdC5yb3dEYXRhW2VsLm5hbWVdO1xuICAgICAgICBpZiAodGhpcy5pbm5lclZhbHVlW3Jvd1Jlc3VsdC5pbmRleF1bZWwubmFtZSArICdfbWV0YSddKSB7XG4gICAgICAgICAgdGhpcy5pbm5lclZhbHVlW3Jvd1Jlc3VsdC5pbmRleF1bZWwubmFtZSArICdfbWV0YSddID0gcm93UmVzdWx0LnJvd0RhdGFbZWwubmFtZSArICdfbWV0YSddO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUYWJsZVZhbHVlKCk7XG4gICAgaWYgKHRoaXMuX3BhcmFtcy5zaXR1YXRpb24gPT09ICdTRUFSQ0gnKSB7XG4gICAgICB0aGlzLnNob3dEaWFsb2cgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlzTmV3Um93ICYmICFyb3dSZXN1bHQuY3JlYXRlTmV3Um93KSB7XG4gICAgICB0aGlzLnNldEVkaXRSb3codGhpcy5pbm5lclZhbHVlLmxlbmd0aCAtIDEsIHRoaXMuaW5uZXJWYWx1ZVt0aGlzLmlubmVyVmFsdWUubGVuZ3RoIC0gMV0pO1xuICAgIH0gZWxzZSBpZiAocm93UmVzdWx0LmNyZWF0ZU5ld1Jvdykge1xuICAgICAgdGhpcy5hZGRSb3coKTtcbiAgICAgIGxldCByb3dOb2RlID0gdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLmdldFJvd05vZGUoJycgKyAodGhpcy5pbm5lclZhbHVlLmxlbmd0aCAtIDEpKTtcbiAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5lbnN1cmVOb2RlVmlzaWJsZShyb3dOb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFZGl0Um93KHJvd1Jlc3VsdC5pbmRleCwgdGhpcy5pbm5lclZhbHVlW3Jvd1Jlc3VsdC5pbmRleF0pO1xuICAgIH1cbiAgfVxuXG4gIGNvcHlSb3cocm93UmVzdWx0OiBhbnkpIHtcbiAgICByb3dSZXN1bHQuaW5kZXggPSAtMTtcbiAgICB0aGlzLmlubmVyVmFsdWUucHVzaCh7Li4ucm93UmVzdWx0LnJvd0RhdGEsIC4uLntpc05ld1JvdzogdHJ1ZX19KTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlVmFsdWUoKTtcbiAgICBpZiAocm93UmVzdWx0LmNyZWF0ZU5ld1Jvdykge1xuICAgICAgdGhpcy5hZGRSb3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFZGl0Um93KHRoaXMuaW5uZXJWYWx1ZS5sZW5ndGggLSAxLCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJvd1Jlc3VsdC5yb3dEYXRhKSkpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy51cGRhdGVUYWJsZVZhbHVlKCk7XG4gICAgICBpZiAodGhpcy5pbm5lclZhbHVlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBpbmRleCA9PSB0aGlzLmlubmVyVmFsdWUubGVuZ3RoID8gdGhpcy5pbm5lclZhbHVlLmxlbmd0aCAtIDEgOiBpbmRleDtcbiAgICAgICAgdGhpcy5zZXRFZGl0Um93KG5leHRJbmRleCwgdGhpcy5pbm5lclZhbHVlW25leHRJbmRleF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jYW5jZWxSb3dFZGl0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJSb3coaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuaW5uZXJWYWx1ZVtpbmRleF0gPSB7fTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlVmFsdWUoKTtcbiAgfVxuXG4gIGV4cG9ydENTVigpIHtcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5leHBvcnREYXRhQXNDc3Yoe1xuICAgICAgLi4udGhpcy5ncmlkQXBpLmNzdkV4cG9ydFBhcmFtcyxcbiAgICAgIGZpbGVOYW1lOiB0aGlzLl9wYXJhbXMuZWxlbWVudC5sYWJlbFxuICAgIH0pO1xuICB9XG5cbiAgc2l6ZVRvRml0KG92ZXJsYXk/OiBib29sZWFuKSB7XG4gICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcbiAgICB9XG4gIH1cblxuICBvcGVuRGlhbG9nKCkge1xuICAgIC8vIFRPRE86IFN0aWxsIG5lY2Vzc2FyeT8gdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLnJlZnJlc2hWaWV3KCk7XG4gICAgdGhpcy5zaG93RGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVUYWJsZURhdGEoKTogYm9vbGVhbiB7XG4gICAgLy8gdG9kbzogaW1wbGVtZW50XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YWxpZGF0ZShjOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhYmxlRGF0YSgpID8gbnVsbCA6IHtcbiAgICAgIHRhYmxlOiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBvbk1vdXNlRG93bigkZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5zdXBwcmVzc1Jvd0NsaWNrU2VsZWN0aW9uKSB7XG4gICAgICBpZiAoIXRoaXMucGVuZGluZ0NoYW5nZXMuY2hlY2tGb3JQZW5kaW5nVGFza3ModGhpcy5yb3dFZGl0LnBlbmRpbmdUYXNrSWQpKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLnN1cHByZXNzUm93Q2xpY2tTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yb3dFZGl0LmZpbmlzaFBlbmRpbmcoKTtcbiAgICAgICAgbGV0IHJvd0luZGV4ID0gdGhpcy5ncmlkQXBpLmdldFJvd0luZGV4KCRldmVudC50YXJnZXQsICdhZy1ib2R5Jyk7XG4gICAgICAgIGlmIChyb3dJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5nZXRSb3dOb2RlKCcnICsgcm93SW5kZXgpLnNldFNlbGVjdGVkKHRydWUsIHRydWUpO1xuICAgICAgICAgICRldmVudC50YXJnZXQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblNvcnRDaGFuZ2VkKCkge1xuICAgIGxldCByb3dOb2RlID0gdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLmdldFJvd05vZGUoJycgKyB0aGlzLmVkaXRpbmdSb3cuaW5kZXgpO1xuICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5lbnN1cmVOb2RlVmlzaWJsZShyb3dOb2RlKTtcbiAgfVxuXG4gIG9uQ2VsbENsaWNrZWQoJGV2ZW50KSB7XG4gICAgaWYgKCRldmVudC5yb3dJbmRleCAhPT0gbnVsbCkge1xuICAgICAgaWYgKCEkZXZlbnQubm9kZS5ncm91cCAmJiAkZXZlbnQuZGF0YSkge1xuICAgICAgICBpZiAoJGV2ZW50LmNvbERlZi5jZWxsQ2xhc3MgPT09ICdyb3V0ZXItbGluay1jZWxsJykge1xuICAgICAgICAgIHRoaXMuZ3JpZEFwaS5vcGVuUm91dGVyTGluaygkZXZlbnQuZXZlbnQsICdhZy1yb3cnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ29sdW1uUmVzaXplZChjb2x1bW46IGFueSwgb3ZlcmxheT86IGJvb2xlYW4pIHtcbiAgICBsZXQgY29sdW1uc0RlZmluaXRpb24gPSB0aGlzLmNhY2hlTGF5b3V0S2V5ICsgJy5jb2xEZWYnO1xuICAgIGxldCBjYWNoZWRDb2x1bW5zID0gdGhpcy5fY2FjaGVkQ29sdW1ucztcbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgY29sdW1uc0RlZmluaXRpb24gPSB0aGlzLmNhY2hlTGF5b3V0S2V5ICsgJy5jb2xEZWZPdmVybGF5JztcbiAgICAgIGNhY2hlZENvbHVtbnMgPSB0aGlzLl9jYWNoZWRDb2x1bW5zT3ZlcmxheTtcbiAgICB9XG4gICAgbGV0IGNvbCA9IGNhY2hlZENvbHVtbnMuZmluZChjID0+IGMucW5hbWUgPT09IGNvbHVtbi5jb2xEZWYucmVmRGF0YS5xbmFtZSk7XG4gICAgaWYgKGNvbCkge1xuICAgICAgY29sLndpZHRoID0gY29sdW1uLmFjdHVhbFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZWRDb2x1bW5zLnB1c2goe3FuYW1lOiBjb2x1bW4uY29sRGVmLnJlZkRhdGEucW5hbWUsIHdpZHRoOiBjb2x1bW4uYWN0dWFsV2lkdGh9KTtcbiAgICB9XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRJdGVtKGNvbHVtbnNEZWZpbml0aW9uLCBjYWNoZWRDb2x1bW5zKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgX3VwZGF0ZVNwbGl0Vmlld0xheW91dENhY2hlKCkge1xuICAvLyAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgICAgdGhpcy5zcGxpdFZpZXc/LnVwZGF0ZUxheW91dENhY2hlKCk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICB0b2dnbGVQcmV2aWV3KCkge1xuICAgIHRoaXMuc2hvd1ByZXZpZXcgPSAhdGhpcy5zaG93UHJldmlldztcbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgbGF5b3V0IG9mIHRoZSBzcGxpdCB2aWV3IGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIHByZXZpZXcgcGFuZWxzXG4gICAgLy8gdmlzaWJpbGl0eSBjaGFuZ2VkXG4gICAgLy8gdGhpcy5fdXBkYXRlU3BsaXRWaWV3TGF5b3V0Q2FjaGUoKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0odGhpcy5jYWNoZUxheW91dEtleSArICcuc2hvd1ByZXZpZXcnLCB0aGlzLnNob3dQcmV2aWV3KTtcbiAgfVxuXG4gIC8vIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgLy8gICB0aGlzLl91cGRhdGVTcGxpdFZpZXdMYXlvdXRDYWNoZSgpO1xuICAvLyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5oYXNQcmV2aWV3RmlsZSA9IHRoaXMuaGFzUHJldmlld0ZpbGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuaGFzUHJldmlld0ZpbGUgOiAhIXRoaXMucGFyYW1zLm9iamVjdD8uY29udGVudDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm9iamVjdC1mb3JtLXRhYmxlXCIgW25nQ2xhc3NdPVwie21lZGl1bTogX3BhcmFtcy5zaXplID09PSAnbWVkaXVtJywgbGFyZ2U6IF9wYXJhbXMuc2l6ZSA9PT0gJ2xhcmdlJ31cIj5cbiAgPGRpdiBjbGFzcz1cImxhYmVsXCI+XG4gICAgPHNwYW4+e3tfcGFyYW1zLmVsZW1lbnQubGFiZWx9fTwvc3Bhbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX3BhcmFtcy5zaXR1YXRpb24gIT09ICdTRUFSQ0gnXCI+XG5cbiAgICAgIDxlby1pY29uIGNsYXNzPVwic3RmXCIgW2ljb25TcmNdPVwiJ2Fzc2V0cy9fZGVmYXVsdC9zdmcvaWNfZXhwYW5kLnN2ZydcIlxuICAgICAgICBbaWNvblRpdGxlXT1cIignZW8uZm9ybS50YWJsZS5vcHRpb25zLmJ0bi5vcGVuJ3wgdHJhbnNsYXRlKVwiIChjbGljayk9XCJvcGVuRGlhbG9nKClcIj48L2VvLWljb24+XG4gICAgICA8ZW8taWNvbiBjbGFzcz1cInN0ZlwiIFtpY29uU3JjXT1cIidhc3NldHMvX2RlZmF1bHQvc3ZnL2ljX3NpemVfdG9fZml0LnN2ZydcIlxuICAgICAgICBbaWNvblRpdGxlXT1cIignZW8uZm9ybS50YWJsZS5vcHRpb25zLmJ0bi5maXQnfCB0cmFuc2xhdGUpXCIgKGNsaWNrKT1cInNpemVUb0ZpdCgpXCI+PC9lby1pY29uPlxuICAgICAgPGVvLWljb24gY2xhc3M9XCJzdGZcIiAqbmdJZj1cImdyaWRPcHRpb25zLnJvd0RhdGE/Lmxlbmd0aFwiIFtpY29uU3JjXT1cIidhc3NldHMvX2RlZmF1bHQvc3ZnL2ljX2NvbnRlbnQtZG93bmxvYWQuc3ZnJ1wiXG4gICAgICAgIFtpY29uVGl0bGVdPVwiKCdlby5mb3JtLnRhYmxlLm9wdGlvbnMuYnRuLmNzdid8IHRyYW5zbGF0ZSlcIiAoY2xpY2spPVwiZXhwb3J0Q1NWKClcIj48L2VvLWljb24+XG4gICAgICA8ZW8taWNvbiBjbGFzcz1cInN0ZiBhZGQtcm93XCIgKm5nSWY9XCIhX3BhcmFtcy5lbGVtZW50LnJlYWRvbmx5XCIgW2ljb25TcmNdPVwiJ2Fzc2V0cy9fZGVmYXVsdC9zdmcvaWNfYWRkLnN2ZydcIlxuICAgICAgICBbaWNvblRpdGxlXT1cIignZW8uZm9ybS50YWJsZS5vcHRpb25zLmJ0bi5hZGQnfCB0cmFuc2xhdGUpXCIgKGNsaWNrKT1cImFkZFJvdygpXCI+PC9lby1pY29uPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZ3JpZC1ib2R5IHNpemUte3sgcGFyYW1zLnNpemUgfX1cIj5cbiAgICA8YWctZ3JpZC1hbmd1bGFyICNhZ0dyaWQgKm5nSWY9XCJncmlkUmVhZHlcIiBjbGFzcz1cImFnLXRoZW1lLWJhbGhhbVwiIFttb2R1bGVzXT1cIm1vZHVsZXNcIiBbZ3JpZE9wdGlvbnNdPVwiZ3JpZE9wdGlvbnNcIlxuICAgICAgKHJvd0RvdWJsZUNsaWNrZWQpPVwiZWRpdFJvdygkZXZlbnQpXCIgKGNlbGxDbGlja2VkKT1cIm9uQ2VsbENsaWNrZWQoJGV2ZW50KVwiIChzb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkKClcIlxuICAgICAgKGNlbGxWYWx1ZUNoYW5nZWQpPVwib25FZGl0Q29tcGxldGUoJGV2ZW50KVwiIChjb2x1bW5SZXNpemVkKT1cIm9uQ29sdW1uUmVzaXplZCgkZXZlbnQuY29sdW1uKVwiPlxuICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxlby1kaWFsb2cgW3RpdGxlXT1cInBhcmFtcy5lbGVtZW50LmxhYmVsXCIgW3Zpc2libGVdPVwic2hvd0RpYWxvZ1wiIFtkaXJ0eUNoZWNrXT1cInJvd0VkaXQ/LnBlbmRpbmdUYXNrSWRcIlxuICBbbWluV2lkdGhdPVwiX3BhcmFtcy5zaXR1YXRpb24gIT09ICdTRUFSQ0gnID8gbWluV2lkdGggOiAyMDBcIlxuICBbd2lkdGhdPVwiX3BhcmFtcy5zaXR1YXRpb24gIT09ICdTRUFSQ0gnID8gJzk1dncnIDogNTAwXCJcbiAgW2hlaWdodF09XCJoZWlnaHRcIlxuICBbc3R5bGVDbGFzc109XCInb2JqZWN0LWZvcm0tdGFibGUtZGlhbG9nJ1wiIChoaWRlKT1cIm9uQ2xvc2UoKVwiIFtpc0Zvcm1UYWJsZV09XCJ0cnVlXCIgW2hhc1ByZXZpZXdGaWxlXT1cImhhc1ByZXZpZXdGaWxlXCJcbiAgW3Nob3dQcmV2aWV3XT1cInNob3dQcmV2aWV3XCIgKG9uVG9nZ2xlUHJldmlldyk9XCJ0b2dnbGVQcmV2aWV3KClcIj5cblxuICA8ZGl2IGNsYXNzPVwiYm9keVwiICpuZ0lmPVwic2hvd0RpYWxvZ1wiPlxuXG4gICAgPCEtLSA8eXZjLXNwbGl0LXZpZXcgW2xheW91dFNldHRpbmdzSURdPVwiY2FjaGVMYXlvdXRLZXlcIj4gLS0+XG4gICAgPHl2Yy1zcGxpdC12aWV3PlxuXG4gICAgICA8IS0tIHRoZSB0YWJsZSBpdHNlbGYtLT5cbiAgICAgIDxuZy10ZW1wbGF0ZSB5dmNTcGxpdEFyZWEgW3NpemVdPVwiNDBcIiBbdmlzaWJsZV09XCJfcGFyYW1zLnNpdHVhdGlvbiAhPT0gJ1NFQVJDSCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib2JqZWN0LWZvcm0tdGFibGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGVvLWljb24gY2xhc3M9XCJzdGZcIiBbaWNvblNyY109XCInYXNzZXRzL19kZWZhdWx0L3N2Zy9pY19zaXplX3RvX2ZpdC5zdmcnXCIgW2ljb25UaXRsZV09XCIoJ2VvLmZvcm0udGFibGUub3B0aW9ucy5idG4uZml0J3wgdHJhbnNsYXRlKVwiIChjbGljayk9XCJzaXplVG9GaXQodHJ1ZSlcIj48L2VvLWljb24+XG4gICAgICAgICAgICAgICAgPGVvLWljb24gY2xhc3M9XCJzdGZcIiAqbmdJZj1cImdyaWRPcHRpb25zLnJvd0RhdGEubGVuZ3RoXCIgW2ljb25TcmNdPVwiJ2Fzc2V0cy9fZGVmYXVsdC9zdmcvaWNfY29udGVudC1kb3dubG9hZC5zdmcnXCIgW2ljb25UaXRsZV09XCIoJ2VvLmZvcm0udGFibGUub3B0aW9ucy5idG4uY3N2J3wgdHJhbnNsYXRlKVwiIChjbGljayk9XCJleHBvcnRDU1YoKVwiPjwvZW8taWNvbj5cbiAgICAgICAgICAgICAgICA8ZW8taWNvbiBjbGFzcz1cInN0ZiBhZGQtcm93XCIgKm5nSWY9XCIhX3BhcmFtcy5lbGVtZW50LnJlYWRvbmx5XCIgW2ljb25TcmNdPVwiJ2Fzc2V0cy9fZGVmYXVsdC9zdmcvaWNfYWRkLnN2ZydcIiBbaWNvblRpdGxlXT1cIignZW8uZm9ybS50YWJsZS5vcHRpb25zLmJ0bi5hZGQnfCB0cmFuc2xhdGUpXCIgKGNsaWNrKT1cImFkZFJvdygpXCI+PC9lby1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtYm9keVwiPlxuICAgICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyICNhZ0dyaWQyICpuZ0lmPVwiZ3JpZFJlYWR5XCIgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW1cIiBbbW9kdWxlc109XCJtb2R1bGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkT3B0aW9uc109XCJvdmVybGF5R3JpZE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGxDbGlja2VkKT1cIm9uQ2VsbENsaWNrZWQoJGV2ZW50KTtlZGl0Um93KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsVmFsdWVDaGFuZ2VkKT1cIm9uRWRpdENvbXBsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2x1bW5SZXNpemVkKT1cIm9uQ29sdW1uUmVzaXplZCgkZXZlbnQuY29sdW1uLCB0cnVlKVwiPlxuICAgICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDwhLS0gdGFibGUgZWRpdCBjb21wb25lbnQtLT5cbiAgICAgIDxuZy10ZW1wbGF0ZSB5dmNTcGxpdEFyZWEgW3NpemVdPVwiMjBcIiBbdmlzaWJsZV09XCIhIWVkaXRpbmdSb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtYm9keVwiPlxuICAgICAgICAgIDxlby1yb3ctZWRpdCBbcm93XT1cImVkaXRpbmdSb3dcIiBbbGltaXRSZWFjaGVkXT1cImxpbWl0IDw9IG92ZXJsYXlHcmlkT3B0aW9ucy5yb3dEYXRhLmxlbmd0aFwiICNyb3dFZGl0XG4gICAgICAgICAgICAob25TYXZlKT1cInVwZGF0ZVJvdygkZXZlbnQpXCIgKG9uU2F2ZUNvcHkpPVwiY29weVJvdygkZXZlbnQpXCIgKG9uRGVsZXRlKT1cImRlbGV0ZVJvdygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNhbmNlbCk9XCJjYW5jZWxSb3dFZGl0KClcIj48L2VvLXJvdy1lZGl0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDwhLS0gdmlld2VyLS0+XG4gICAgICA8bmctdGVtcGxhdGUgeXZjU3BsaXRBcmVhIFtzaXplXT1cIjQwXCIgW3Zpc2libGVdPVwic2hvd1ByZXZpZXcgJiYgaGFzUHJldmlld0ZpbGVcIj5cbiAgICAgICAgPGVvLW1lZGlhICpuZ0lmPVwiaGFzUHJldmlld0ZpbGVcIiBbZG1zT2JqZWN0XT1cInBhcmFtcy5vYmplY3RcIiBbdW5kb2NrRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgIFt1c2VWZXJzaW9uXT1cInBhcmFtcy5vYmplY3Q/LmlkID09PSBwYXJhbXMub2JqZWN0Py5jb250ZW50Py5pZFwiPjwvZW8tbWVkaWE+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPC95dmMtc3BsaXQtdmlldz5cbiAgPC9kaXY+XG48L2VvLWRpYWxvZz5cbiJdfQ==
633
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lbGVtZW50LXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZW8tZnJhbWV3b3JrL29iamVjdC1mb3JtL29iamVjdC1mb3JtL2Zvcm0tZWxlbWVudC10YWJsZS9mb3JtLWVsZW1lbnQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9lby1mcmFtZXdvcmsvb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0vZm9ybS1lbGVtZW50LXRhYmxlL2Zvcm0tZWxlbWVudC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBRWxGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXVCLGFBQWEsRUFBRSxpQkFBaUIsRUFBZ0MsTUFBTSxnQkFBZ0IsQ0FBQztBQUNySCxPQUFPLEVBQTZFLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUMvRyxPQUFPLEVBQUMsY0FBYyxFQUFFLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLFlBQVksRUFBRSxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFjLE1BQU0sZ0RBQWdELENBQUM7QUFJekYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFzQnhELElBQU0seUJBQXlCLGlDQUEvQixN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c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFHWCxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFpQkYsTUFBTTtzQkFEVCxLQUFLO2dCQW9DTixlQUFlO3NCQUpkLFlBQVk7dUJBQUMsNkJBQTZCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUN0RCxZQUFZO3VCQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDbEQsWUFBWTt1QkFBQyx1QkFBdUIsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ2hELFlBQVk7dUJBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NsaWVudFNpZGVSb3dNb2RlbE1vZHVsZX0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2NsaWVudC1zaWRlLXJvdy1tb2RlbCc7XG5pbXBvcnQge0NvbERlZiwgR3JpZE9wdGlvbnMsIE1vZHVsZX0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2NvcmUnO1xuaW1wb3J0IHtDc3ZFeHBvcnRNb2R1bGV9IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS9jc3YtZXhwb3J0JztcbmltcG9ydCB7Q29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TG9jYWxTdG9yYWdlU2VydmljZSwgTm90aWZpY2F0aW9uc1NlcnZpY2UsIFN5c3RlbVNlcnZpY2UsIFRyYW5zbGF0ZVNlcnZpY2UsIFV0aWxzfSBmcm9tICdAZW8tc2RrL2NvcmUnO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbSwgZm9ya0pvaW59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHtDZWxsUmVuZGVyZXIsIEdyaWRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9lby1mcmFtZXdvcmstY29yZS9hcGkvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7UGVuZGluZ0NoYW5nZXNTZXJ2aWNlfSBmcm9tICcuLy4uLy4uLy4uLy4uL2VvLWZyYW1ld29yay1jb3JlL3BlbmRpbmctY2hhbmdlcy9wZW5kaW5nLWNoYW5nZXMuc2VydmljZSc7XG5pbXBvcnQge0VkaXRSb3csIFRhYmxlQ29tcG9uZW50UGFyYW1zfSBmcm9tICcuL2Zvcm0tZWxlbWVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtSb3dFZGl0Q29tcG9uZW50fSBmcm9tICcuL3Jvdy1lZGl0L3Jvdy1lZGl0LmNvbXBvbmVudCc7XG5pbXBvcnQge0xvY2FsZU51bWJlclBpcGV9IGZyb20gXCIuLi8uLi8uLi8uLi9lby1mcmFtZXdvcmstY29yZVwiO1xuXG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2VvLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZWxlbWVudC10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgICcuL2Zvcm0tZWxlbWVudC10YWJsZS5jb21wb25lbnQuc2NzcydcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb3JtRWxlbWVudFRhYmxlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9ybUVsZW1lbnRUYWJsZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUVsZW1lbnRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSBfY2FjaGVkQ29sdW1uczogYW55W107XG4gIHByaXZhdGUgX2NhY2hlZENvbHVtbnNPdmVybGF5OiBhbnlbXTtcblxuICBwdWJsaWMgbW9kdWxlczogTW9kdWxlW10gPSBbQ2xpZW50U2lkZVJvd01vZGVsTW9kdWxlLCBDc3ZFeHBvcnRNb2R1bGVdO1xuXG4gIEJBU0VfQ0FDSEVfTEFZT1VUX0tFWSA9ICd0YWJsZS5zdGF0ZSc7XG4gIGNhY2hlTGF5b3V0S2V5ID0gdGhpcy5CQVNFX0NBQ0hFX0xBWU9VVF9LRVk7XG5cbiAgQFZpZXdDaGlsZCgncm93RWRpdCcpIHJvd0VkaXQ6IFJvd0VkaXRDb21wb25lbnQ7XG4gIC8vIEBWaWV3Q2hpbGQoJ3NwbGl0VmlldycpIHNwbGl0VmlldzogU3BsaXRDb21wb25lbnQ7XG5cbiAgQElucHV0KCkgbGltaXQ6IG51bWJlcjtcbiAgQElucHV0KCkgaGFzUHJldmlld0ZpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIG1pbldpZHRoID0gJzk3dncnO1xuICBASW5wdXQoKSBoZWlnaHQgPSAnOTV2aCc7XG5cbiAgX3BhcmFtczogVGFibGVDb21wb25lbnRQYXJhbXM7XG4gIHByaXZhdGUgX2VsZW1lbnRzOiBhbnlbXTtcbiAgZ3JpZFJlYWR5ID0gZmFsc2U7XG4gIHZhbHVlOiBhbnlbXTtcbiAgaW5uZXJWYWx1ZTogYW55W107XG4gIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9ucztcbiAgb3ZlcmxheUdyaWRPcHRpb25zOiBHcmlkT3B0aW9ucztcbiAgZWRpdGluZ1JvdzogRWRpdFJvdztcbiAgc2hvd0RpYWxvZyA9IGZhbHNlO1xuICBzaG93UHJldmlldyA9IGZhbHNlO1xuICBzaG93SW1wb3J0UmVwb3J0RGlhbG9nID0gZmFsc2U7XG4gIG1hcHBlZFJvd3MgPSBbXTtcbiAgbWFwcGluZ0Vycm9yRmllbGRzID0gW107XG5cbiAgQElucHV0KClcbiAgc2V0IHBhcmFtcyhwOiBUYWJsZUNvbXBvbmVudFBhcmFtcykge1xuICAgIHRoaXMuY2FjaGVMYXlvdXRLZXkgPSBwID8gYCR7dGhpcy5CQVNFX0NBQ0hFX0xBWU9VVF9LRVl9LiR7cC5lbGVtZW50Lm5hbWV9YCA6IHRoaXMuQkFTRV9DQUNIRV9MQVlPVVRfS0VZO1xuICAgIGlmIChwKSB7XG4gICAgICB0aGlzLl9wYXJhbXMgPSBwO1xuICAgICAgdGhpcy5fY2FjaGVkQ29sdW1ucyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSh0aGlzLmNhY2hlTGF5b3V0S2V5ICsgJy5jb2xEZWYnKSB8fCBbXTtcbiAgICAgIHRoaXMuX2NhY2hlZENvbHVtbnNPdmVybGF5ID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRJdGVtKHRoaXMuY2FjaGVMYXlvdXRLZXkgKyAnLmNvbERlZk92ZXJsYXknKSB8fCBbXTtcbiAgICAgIHRoaXMuc2hvd1ByZXZpZXcgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0odGhpcy5jYWNoZUxheW91dEtleSArICcuc2hvd1ByZXZpZXcnKTtcblxuXG4gICAgICBDZWxsUmVuZGVyZXIuc2l0dWF0aW9uID0gdGhpcy5fcGFyYW1zLnNpdHVhdGlvbjtcbiAgICAgIGlmICh0aGlzLl9wYXJhbXMuc2l0dWF0aW9uID09PSAnU0VBUkNIJykge1xuICAgICAgICB0aGlzLl9wYXJhbXMuc2l6ZSA9ICdzdXBlcnNtYWxsJztcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3BhcmFtcy5zaXplKSB7XG4gICAgICAgIHRoaXMuX3BhcmFtcy5zaXplID0gJ3NtYWxsJztcbiAgICAgIH1cbiAgICAgIHRoaXMuZ3JpZFJlYWR5ID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbGVtZW50cyA9IHAuZWxlbWVudC5lbGVtZW50cztcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcyA9IHRoaXMuY3JlYXRlQ29sdW1uRGVmaW5pdGlvbigpO1xuICAgICAgaWYgKHRoaXMuX3BhcmFtcy5zaXR1YXRpb24gPT09ICdTRUFSQ0gnKSB7XG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcy5wdXNoKHtoZWFkZXJOYW1lOiAnJywgY29sSWQ6ICdhY3Rpb25zJywgd2lkdGg6IDM0LCBtaW5XaWR0aDogMzQsIHBpbm5lZDogJ3JpZ2h0JywgY2VsbFJlbmRlcmVyOiB0aGlzLmFjdGlvbnNDZWxsUmVuZGVyZXJ9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmNvbHVtbkRlZnMgPSB0aGlzLmNyZWF0ZUNvbHVtbkRlZmluaXRpb24odHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ3JpZFJlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgZ2V0IHBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1zO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5jb250cm9sLmFsdC5zaGlmdC5jJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5jb250cm9sLnNoaWZ0LmMnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmNvbnRyb2wuYWx0LmMnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmNvbnRyb2wuYycsIFsnJGV2ZW50J10pXG4gIGNvcHlDZWxsSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHRoaXMuZ3JpZEFwaS5jb3B5VG9DbGlwYm9hcmQoZXZlbnQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogTG9jYWxTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHN5c3RlbVNlcnZpY2U6IFN5c3RlbVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZW5kaW5nQ2hhbmdlczogUGVuZGluZ0NoYW5nZXNTZXJ2aWNlLFxuICAgIHB1YmxpYyBncmlkQXBpOiBHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0OiBOb3RpZmljYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkge1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSA8R3JpZE9wdGlvbnM+e1xuICAgICAgY29udGV4dDogdGhpcy5ncmlkQXBpLmdldENvbnRleHQoKSxcbiAgICAgIGhlYWRlckhlaWdodDogMzAsXG4gICAgICByb3dIZWlnaHQ6IDMwLFxuICAgICAgcm93QnVmZmVyOiAyMCxcbiAgICAgIG11bHRpU29ydEtleTogJ2N0cmwnLFxuICAgICAgYWNjZW50ZWRTb3J0OiB0cnVlLFxuICAgICAgLy8gc3VwcHJlc3NDZWxsU2VsZWN0aW9uOiB0cnVlLFxuICAgICAgcm93U2VsZWN0aW9uOiAnc2luZ2xlJyxcbiAgICAgIHN1cHByZXNzTW92YWJsZUNvbHVtbnM6IHRydWUsXG4gICAgICBlbmFibGVGaWx0ZXI6IGZhbHNlLFxuICAgICAgc3VwcHJlc3NOb1Jvd3NPdmVybGF5OiB0cnVlLFxuICAgICAgc3VwcHJlc3NMb2FkaW5nT3ZlcmxheTogdHJ1ZSxcbiAgICAgIHN1cHByZXNzQ29udGV4dE1lbnU6IHRydWVcbiAgICB9O1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMuY29udGV4dC50YWJsZUNvbXBvbmVudCA9IHRoaXM7XG5cbiAgICB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucyA9IDxHcmlkT3B0aW9ucz57XG4gICAgICBjb250ZXh0OiB0aGlzLmdyaWRBcGkuZ2V0Q29udGV4dCgpLFxuICAgICAgaGVhZGVySGVpZ2h0OiAzMCxcbiAgICAgIHJvd0hlaWdodDogMzAsXG4gICAgICByb3dCdWZmZXI6IDIwLFxuICAgICAgbXVsdGlTb3J0S2V5OiAnY3RybCcsXG4gICAgICBhY2NlbnRlZFNvcnQ6IHRydWUsXG4gICAgICAvLyBzdXBwcmVzc0NlbGxTZWxlY3Rpb246IHRydWUsXG4gICAgICByb3dTZWxlY3Rpb246ICdzaW5nbGUnLFxuICAgICAgc3VwcHJlc3NNb3ZhYmxlQ29sdW1uczogdHJ1ZSxcbiAgICAgIGVuYWJsZUZpbHRlcjogZmFsc2UsXG4gICAgICBzdXBwcmVzc05vUm93c092ZXJsYXk6IHRydWUsXG4gICAgICBzdXBwcmVzc0xvYWRpbmdPdmVybGF5OiB0cnVlLFxuICAgICAgc3VwcHJlc3NDb250ZXh0TWVudTogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuY29udGV4dC50YWJsZUNvbXBvbmVudCA9IHRoaXM7XG4gICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMucm93Q2xhc3NSdWxlcyA9IHtcbiAgICAgICduZXctcm93JzogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zLmRhdGEuaXNOZXdSb3cpIHtcbiAgICAgICAgICBkZWxldGUgcGFyYW1zLmRhdGEuaXNOZXdSb3c7XG4gICAgICAgICAgZGVsZXRlIHBhcmFtcy5jb250ZXh0LnRhYmxlQ29tcG9uZW50LmlubmVyVmFsdWVbcGFyYW1zLmNvbnRleHQudGFibGVDb21wb25lbnQuaW5uZXJWYWx1ZS5sZW5ndGggLSAxXS5pc05ld1JvdztcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5wZW5kaW5nQ2hhbmdlcy50YXNrcyRcbiAgICAgIC5waXBlKFxuICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh0YXNrcyA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLnN1cHByZXNzUm93Q2xpY2tTZWxlY3Rpb24gPSAhIXRoaXMucm93RWRpdCAmJiAhIXRhc2tzLmluY2x1ZGVzKHRoaXMucm93RWRpdC5wZW5kaW5nVGFza0lkKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFjdGlvbnNDZWxsUmVuZGVyZXIocGFyYW1zKSB7XG4gICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgaWYgKHBhcmFtcy5jb250ZXh0LnRhYmxlQ29tcG9uZW50LnBhcmFtcy5zaXR1YXRpb24gPT09ICdTRUFSQ0gnKSB7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJhY3Rpb24taWNvblwiIGlkPVwiYWN0aW9uSWNvbi0ke3BhcmFtcy5yb3dJbmRleH1cIj5cbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyelwiLz5cbiAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+YDtcbiAgICAgIGxldCBjbGVhckljb24gPSBkaXYucXVlcnlTZWxlY3RvckFsbChgI2FjdGlvbkljb24tJHtwYXJhbXMucm93SW5kZXh9YClbMF07XG4gICAgICBjbGVhckljb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBwYXJhbXMuY29udGV4dC50YWJsZUNvbXBvbmVudC5jbGVhclJvdyhwYXJhbXMucm93SW5kZXgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGl2LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiYWN0aW9uLWljb25cIiBpZD1cImFjdGlvbkljb24tJHtwYXJhbXMucm93SW5kZXh9XCI+XG4gICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICA8cGF0aCBkPVwiTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnpNMTkgNGgtMy41bC0xLTFoLTVsLTEgMUg1djJoMTRWNHpcIi8+XG4gICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PmA7XG4gICAgICBsZXQgZGVsZXRlSWNvbiA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKGAjYWN0aW9uSWNvbi0ke3BhcmFtcy5yb3dJbmRleH1gKVswXTtcbiAgICAgIGRlbGV0ZUljb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBwYXJhbXMuY29udGV4dC50YWJsZUNvbXBvbmVudC5kZWxldGVSb3cocGFyYW1zLnJvd0luZGV4KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueVtdKTogdm9pZCB7XG5cbiAgICBpZiAoIXZhbHVlICYmIHRoaXMuX3BhcmFtcy5zaXR1YXRpb24gPT09ICdTRUFSQ0gnKSB7XG4gICAgICAvLyBmb3Igc2VhcmNoIHJvdyBkYXRhIHdpbGwgYWx3YXlzIGJlIG9uZSBlbXB0eSByb3dcbiAgICAgIC8vIHRvZG86IHJlLWVuYWJsZSBhZ2FpbiB3aGVuIHNlYXJjaCBpbiB0YWJsZXMgaXMgc3VwcG9ydGVkXG4gICAgICB2YWx1ZSA9IFt7fV07XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ID8gdmFsdWUgOiBbXTtcbiAgICAvLyBjcmVhdGUgYSBjbG9uZSBvZiB0aGUgYWN0dWFsIHZhbHVlIGZvciBpbnRlcm5hbCB1c2FnZVxuICAgIHRoaXMuaW5uZXJWYWx1ZSA9IFV0aWxzLmZvcm1EYXRhUGFyc2UoVXRpbHMuZm9ybURhdGFTdHJpbmdpZnkodGhpcy52YWx1ZSkpO1xuXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuYXBpKSB7XG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zZXRSb3dEYXRhKHRoaXMuaW5uZXJWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMucm93RGF0YSA9IHRoaXMuaW5uZXJWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpKSB7XG4gICAgICB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkuc2V0Um93RGF0YSh0aGlzLmlubmVyVmFsdWUpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbGVjdEVkaXRSb3coKSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLnJvd0RhdGEgPSB0aGlzLmlubmVyVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY29sdW1uIGRlZmluaXRpb24gZnJvbSBmb3JtIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIGNvbHVtbiBkZWZpbml0aW9uIHRvIGJlIGFkZGVkIHRvIHRoZSBncmlkT3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW5EZWZpbml0aW9uKG92ZXJsYXk/OiBib29sZWFuKTogQ29sRGVmW10ge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5tYXAoKGVsKSA9PiB7XG4gICAgICBsZXQgY29sOiBDb2xEZWYgPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRGVmaW5pdGlvbihlbCk7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbCwge1xuICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgc3VwcHJlc3NNZW51OiB0cnVlLFxuICAgICAgICBmaWx0ZXI6IGZhbHNlLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgICBmaWVsZDogZWwubmFtZSxcbiAgICAgICAgcmVmRGF0YToge1xuICAgICAgICAgIC4uLmNvbC5yZWZEYXRhLFxuICAgICAgICAgIF9lb0Zvcm1FbGVtZW50OiBlbCxcbiAgICAgICAgICBfc2l0dWF0aW9uOiB0aGlzLl9wYXJhbXMuc2l0dWF0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGV0IGNhY2hlZENvbHVtbnMgPSB0aGlzLl9jYWNoZWRDb2x1bW5zO1xuICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgY2FjaGVkQ29sdW1ucyA9IHRoaXMuX2NhY2hlZENvbHVtbnNPdmVybGF5O1xuICAgICAgfVxuICAgICAgbGV0IGNhY2hlZENvbHVtbiA9IGNhY2hlZENvbHVtbnMuZmluZChmID0+IGYucW5hbWUgPT09IGVsLnFuYW1lKTtcbiAgICAgIGlmIChjYWNoZWRDb2x1bW4pIHtcbiAgICAgICAgY29sLndpZHRoID0gY2FjaGVkQ29sdW1uLndpZHRoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbDtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFJvdygpIHtcbiAgICBjb25zdCByb3dEYXRhID0ge307XG4gICAgY29uc3QgYXN5bmNGZXRjaGVzID0gW107XG4gICAgdGhpcy5fZWxlbWVudHNcbiAgICAgIC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgaWYgKGVsLmRlZmF1bHR2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcm93RGF0YVtlbC5uYW1lXSA9IGVsLmRlZmF1bHR2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChlbC5kZWZhdWx0dmFsdWVmdW5jdGlvbikge1xuICAgICAgICAgIHJvd0RhdGFbZWwubmFtZV0gPSB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0RGVmYXVsdFZhbHVlKGVsLmRlZmF1bHR2YWx1ZWZ1bmN0aW9uKTtcbiAgICAgICAgICBpZiAoZWwuZGVmYXVsdHZhbHVlZnVuY3Rpb24gPT09ICdDVVJSRU5UX1VTRVInKSB7XG4gICAgICAgICAgICBhc3luY0ZldGNoZXMucHVzaCh0aGlzLnJlc29sdmVPcmdEYXRhTWV0YShlbC5uYW1lLCByb3dEYXRhW2VsLm5hbWVdKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGlmIChhc3luY0ZldGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9ya0pvaW4oYXN5bmNGZXRjaGVzKS5zdWJzY3JpYmUoKHJlczoge2tleTogc3RyaW5nLCB2YWx1ZTogYW55fVtdKSA9PiB7XG4gICAgICAgIHJlcy5mb3JFYWNoKHIgPT4ge1xuICAgICAgICAgIHJvd0RhdGFbci5rZXldID0gci52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0RWRpdFJvdygtMSwgcm93RGF0YSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFZGl0Um93KC0xLCByb3dEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVPcmdEYXRhTWV0YShlbGVtZW50TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuc3lzdGVtU2VydmljZS5nZXRPcmdhbml6YXRpb25PYmplY3QodmFsdWUpLnBpcGUoXG4gICAgICBtYXAocmVzID0+ICh7XG4gICAgICAgIGtleTogYCR7ZWxlbWVudE5hbWV9X21ldGFgLFxuICAgICAgICB2YWx1ZTogcmVzXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgZWRpdFJvdyhldmVudCkge1xuICAgIHRoaXMuc2V0RWRpdFJvdyhldmVudC5ub2RlLmlkLCBldmVudC5ub2RlLmRhdGEpO1xuICB9XG5cbiAgb25FZGl0Q29tcGxldGUoZXZlbnQpIHtcbiAgICAvL3RvZG86IGlzIGl0IG9ic29sZXRlP1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFZGl0Um93KGluZGV4OiBudW1iZXIsIGRhdGE6IGFueSkge1xuICAgIC8vIHNldHVwIHRoZSByb3cgdG8gYmUgZWRpdGVkLiBCZXNpZGUgc29tZSBwcm9wZXJ0aWVzLCB0aGVcbiAgICAvLyByb3cgY29udGFpbnMgYSBmb3JtIG1vZGVsIGFuZCBmb3JtIGRhdGEuIElmIHRoZSBwYXJlbnQgZm9ybSBtb2RlbFxuICAgIC8vIHByb3ZpZGVkIGEgc2NyaXB0LCB0aGlzIHdpbGwgYmUgYWRkZWQgYXMgd2VsbCwgc28gZWRpdGluZyBhIHJvdyB3aWxsXG4gICAgLy8gcmVzcGVjdCB0aGUgZm9ybSBzY3JpcHQuXG4gICAgdGhpcy5lZGl0aW5nUm93ID0ge1xuICAgICAgc2l0dWF0aW9uOiB0aGlzLl9wYXJhbXMuc2l0dWF0aW9uLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgdGFibGVFbGVtZW50OiB0aGlzLl9wYXJhbXMuZWxlbWVudCxcbiAgICAgIGZvcm06IHtcbiAgICAgICAgZWxlbWVudHM6IHRoaXMuX2VsZW1lbnRzLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5fcGFyYW1zLmVsZW1lbnQucmVhZG9ubHksXG4gICAgICAgIGRhdGFcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuc2hvd0RpYWxvZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbGVjdEVkaXRSb3coKSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEVkaXRSb3coKSB7XG4gICAgaWYgKHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaSkge1xuICAgICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLmRlc2VsZWN0QWxsKCk7XG4gICAgICBpZiAodGhpcy5lZGl0aW5nUm93ICYmIHRoaXMuZWRpdGluZ1Jvdy5pbmRleCAhPT0gLTEpIHtcbiAgICAgICAgbGV0IHJvd05vZGUgPSB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkuZ2V0Um93Tm9kZSgnJyArIHRoaXMuZWRpdGluZ1Jvdy5pbmRleCk7XG4gICAgICAgIHJvd05vZGUuc2V0U2VsZWN0ZWQodHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5lbnN1cmVOb2RlVmlzaWJsZShyb3dOb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYmxlVmFsdWUoKSB7XG4gICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2V0Um93RGF0YSh0aGlzLmlubmVyVmFsdWUpO1xuICAgIGlmICh0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkpIHtcbiAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5zZXRSb3dEYXRhKHRoaXMuaW5uZXJWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLnJvd0RhdGEgPSB0aGlzLmlubmVyVmFsdWU7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB0aGlzLmlubmVyVmFsdWU7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudmFsdWUuaW5jbHVkZXMoJ2lzTmV3Um93JykpKSB7XG4gICAgICBkZWxldGUgdGhpcy52YWx1ZVsnaXNOZXdSb3cnXTtcbiAgICB9XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBjYW5jZWxSb3dFZGl0KCkge1xuICAgIGlmICh0aGlzLnJvd0VkaXQpIHtcbiAgICAgIHRoaXMucm93RWRpdC5maW5pc2hQZW5kaW5nKCk7XG4gICAgfVxuICAgIHRoaXMuZWRpdGluZ1JvdyA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3BhcmFtcy5zaXR1YXRpb24gPT09ICdTRUFSQ0gnKSB7XG4gICAgICB0aGlzLnNob3dEaWFsb2cgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBvbkNsb3NlKCkge1xuICAgIHRoaXMuZWRpdGluZ1JvdyA9IG51bGw7XG4gICAgdGhpcy5zaG93RGlhbG9nID0gZmFsc2U7XG4gIH1cblxuICBjbG9zZUltcG9ydFJlcG9ydCgpIHtcbiAgICB0aGlzLnNob3dJbXBvcnRSZXBvcnREaWFsb2cgPSBmYWxzZTtcbiAgICB0aGlzLm1hcHBlZFJvd3MgPSBbXTtcbiAgICB0aGlzLm1hcHBpbmdFcnJvckZpZWxkcyA9IFtdO1xuICB9XG5cbiAgdXBkYXRlUm93KHJvd1Jlc3VsdDogYW55KSB7XG4gICAgY29uc3QgaXNOZXdSb3cgPSByb3dSZXN1bHQuaW5kZXggPT09IC0xO1xuICAgIGlmIChpc05ld1Jvdykge1xuICAgICAgdGhpcy5pbm5lclZhbHVlLnB1c2goey4uLnJvd1Jlc3VsdC5yb3dEYXRhLCAuLi57aXNOZXdSb3c6IHRydWV9fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAvLyB0aGlzLmlubmVyVmFsdWVbcm93UmVzdWx0LmluZGV4XSA9IHsuLi50aGlzLmlubmVyVmFsdWVbcm93UmVzdWx0LmluZGV4XSwgLi4ucm93UmVzdWx0LnJvd0RhdGF9O1xuICAgICAgICB0aGlzLmlubmVyVmFsdWVbcm93UmVzdWx0LmluZGV4XVtlbC5uYW1lXSA9IHJvd1Jlc3VsdC5yb3dEYXRhW2VsLm5hbWVdO1xuICAgICAgICBpZiAodGhpcy5pbm5lclZhbHVlW3Jvd1Jlc3VsdC5pbmRleF1bZWwubmFtZSArICdfbWV0YSddKSB7XG4gICAgICAgICAgdGhpcy5pbm5lclZhbHVlW3Jvd1Jlc3VsdC5pbmRleF1bZWwubmFtZSArICdfbWV0YSddID0gcm93UmVzdWx0LnJvd0RhdGFbZWwubmFtZSArICdfbWV0YSddO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUYWJsZVZhbHVlKCk7XG4gICAgaWYgKHRoaXMuX3BhcmFtcy5zaXR1YXRpb24gPT09ICdTRUFSQ0gnKSB7XG4gICAgICB0aGlzLnNob3dEaWFsb2cgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlzTmV3Um93ICYmICFyb3dSZXN1bHQuY3JlYXRlTmV3Um93KSB7XG4gICAgICB0aGlzLnNldEVkaXRSb3codGhpcy5pbm5lclZhbHVlLmxlbmd0aCAtIDEsIHRoaXMuaW5uZXJWYWx1ZVt0aGlzLmlubmVyVmFsdWUubGVuZ3RoIC0gMV0pO1xuICAgIH0gZWxzZSBpZiAocm93UmVzdWx0LmNyZWF0ZU5ld1Jvdykge1xuICAgICAgdGhpcy5hZGRSb3coKTtcbiAgICAgIGxldCByb3dOb2RlID0gdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLmdldFJvd05vZGUoJycgKyAodGhpcy5pbm5lclZhbHVlLmxlbmd0aCAtIDEpKTtcbiAgICAgIHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLmFwaS5lbnN1cmVOb2RlVmlzaWJsZShyb3dOb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFZGl0Um93KHJvd1Jlc3VsdC5pbmRleCwgdGhpcy5pbm5lclZhbHVlW3Jvd1Jlc3VsdC5pbmRleF0pO1xuICAgIH1cbiAgfVxuXG4gIGNvcHlSb3cocm93UmVzdWx0OiBhbnkpIHtcbiAgICByb3dSZXN1bHQuaW5kZXggPSAtMTtcbiAgICB0aGlzLmlubmVyVmFsdWUucHVzaCh7Li4ucm93UmVzdWx0LnJvd0RhdGEsIC4uLntpc05ld1JvdzogdHJ1ZX19KTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlVmFsdWUoKTtcbiAgICBpZiAocm93UmVzdWx0LmNyZWF0ZU5ld1Jvdykge1xuICAgICAgdGhpcy5hZGRSb3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFZGl0Um93KHRoaXMuaW5uZXJWYWx1ZS5sZW5ndGggLSAxLCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJvd1Jlc3VsdC5yb3dEYXRhKSkpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy51cGRhdGVUYWJsZVZhbHVlKCk7XG4gICAgICBpZiAodGhpcy5pbm5lclZhbHVlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBpbmRleCA9PSB0aGlzLmlubmVyVmFsdWUubGVuZ3RoID8gdGhpcy5pbm5lclZhbHVlLmxlbmd0aCAtIDEgOiBpbmRleDtcbiAgICAgICAgdGhpcy5zZXRFZGl0Um93KG5leHRJbmRleCwgdGhpcy5pbm5lclZhbHVlW25leHRJbmRleF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jYW5jZWxSb3dFZGl0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJSb3coaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuaW5uZXJWYWx1ZVtpbmRleF0gPSB7fTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlVmFsdWUoKTtcbiAgfVxuXG4gIGV4cG9ydENTVigpIHtcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5leHBvcnREYXRhQXNDc3Yoe1xuICAgICAgLi4udGhpcy5ncmlkQXBpLmNzdkV4cG9ydFBhcmFtcyxcbiAgICAgIGZpbGVOYW1lOiB0aGlzLl9wYXJhbXMuZWxlbWVudC5sYWJlbFxuICAgIH0pO1xuICB9XG5cbiAgaW1wb3J0Q1NWKGV2ZW50KSB7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5fcGFyYW1zLmVsZW1lbnQuZWxlbWVudHM7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGFzeW5jIGUgPT4ge1xuICAgICAgbGV0IHBhcnNlZGF0YSA9IFtdO1xuICAgICAgaWYgKHR5cGVvZiBlLnRhcmdldC5yZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxldCBuZXdMaW5lQnJlYWsgPSBlLnRhcmdldC5yZXN1bHQuc3BsaXQoJ1xcbicpLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0ICE9PSAnJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3TGluZUJyZWFrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcGFyc2VkYXRhLnB1c2gobmV3TGluZUJyZWFrW2ldLnNwbGl0KCc7JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlZGF0YS5sZW5ndGggPiA1MDAwKSB7XG4gICAgICAgICAgdGhpcy50b2FzdC5lcnJvcih0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlby5mb3JtLnRhYmxlLm9wdGlvbnMuYnRuLnVwbG9hZC5lcnJvcicpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VkYXRhID0gcGFyc2VkYXRhLm1hcChkYXRhID0+IGRhdGEubWFwKGQgPT4gZC5yZXBsYWNlKC9cIi9naSwgJycpLnJlcGxhY2UoJ1xcbicsICcnKS5yZXBsYWNlKC9bXi0uOixhLXpBLVowLTkoKSBdL2csICcnKS50cmltKCkpKTtcblxuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzLm1hcChjb2x1bW4gPT4gY29sdW1uWydmaWVsZCddKTtcbiAgICAgICAgY29uc3QgY29sdW1uc1VwbG9hZGVkID0gcGFyc2VkYXRhWzBdO1xuICAgICAgICBwYXJzZWRhdGEuc2hpZnQoKTtcbiAgICAgICAgY29uc3Qgcm93c1VwbG9hZGVkID0gcGFyc2VkYXRhO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggIT09IGNvbHVtbnNVcGxvYWRlZC5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmVycm9yKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLmZvcm0udGFibGUuY3N2LmltcG9ydC5lcnJvci5jb2x1bW5BbW91bnQnLCB7bnVtYmVyOiBjb2x1bW5zVXBsb2FkZWQubGVuZ3RoLCBudW1iZXIyOiBjb2x1bW5zLmxlbmd0aH0pKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoY29sdW1uc1tpXSAhPT0gY29sdW1uc1VwbG9hZGVkW2ldKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmVycm9yKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLmZvcm0udGFibGUuY3N2LmltcG9ydC5lcnJvci5jb2x1bW5NYXBwaW5nJywge2NvbHVtbk5hbWU6IGNvbHVtbnNVcGxvYWRlZFtpXSwgY29sdW1uTnVtYmVyOiBpICsgMSwgZXhwZWN0ZWRDb2x1bW5OYW1lOiBjb2x1bW5zW2ldfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhRmllbGRzID0gW107XG4gICAgICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzVXBsb2FkZWQubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgICAgY29uc3QgbWFwcGVkUm93ID0ge307XG4gICAgICAgICAgbGV0IGN1cnJlbnRSb3cgPSByb3dzVXBsb2FkZWRbcm93SW5kZXhdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudFJvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3dbaV0gIT09ICcnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaWVsZCA9IGZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09IGNvbHVtbnNbaV0pO1xuICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLnR5cGUgPT09ICdPUkdBTklaQVRJT04nKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9yZ09iaiA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuc3lzdGVtU2VydmljZS5nZXRPcmdhbml6YXRpb25PYmplY3QoY3VycmVudFJvd1tpXSkpO1xuICAgICAgICAgICAgICAgIGlmIChvcmdPYmouYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICBtYXBwZWRSb3dbY29sdW1uc1tpXV0gPSBjdXJyZW50Um93W2ldO1xuICAgICAgICAgICAgICAgICAgbWV0YUZpZWxkcy5wdXNoKHtjb2x1bW46IGNvbHVtbnNbaV0sIHJvd0luZGV4OiByb3dJbmRleCwgdmFsdWU6IG9yZ09ian0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtYXBwZWRSb3dbY29sdW1uc1tpXV0gPSAnJztcbiAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGluZ0Vycm9yRmllbGRzLnB1c2goe2ZpZWxkOiBjb2x1bW5zW2ldLCByb3c6IHJvd0luZGV4LCB2YWx1ZTogY3VycmVudFJvd1tpXX0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RmllbGQudHlwZSA9PT0gJ0NPREVTWVNURU0nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZXN5c3RlbSA9IHRoaXMuc3lzdGVtU2VydmljZS5nZXRDb2Rlc3lzdGVtKGN1cnJlbnRGaWVsZC5jb2Rlc3lzdGVtLmlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2Rlc3lzdGVtRW50cnkgPSBjb2Rlc3lzdGVtLmVudHJpZXMuZmluZChlbnRyeSA9PiBlbnRyeS5kYXRhID09PSBjdXJyZW50Um93W2ldIHx8IGVudHJ5LmRlZmF1bHRyZXByZXNlbnRhdGlvbiA9PT0gY3VycmVudFJvd1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGVzeXN0ZW1FbnRyeSkge1xuICAgICAgICAgICAgICAgICAgbWFwcGVkUm93W2NvbHVtbnNbaV1dID0gY3VycmVudFJvd1tpXTtcbiAgICAgICAgICAgICAgICAgIG1ldGFGaWVsZHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtpZDogY29kZXN5c3RlbUVudHJ5LmlkLCBkZWZhdWx0cmVwcmVzZW50YXRpb246IGNvZGVzeXN0ZW1FbnRyeS5kZWZhdWx0cmVwcmVzZW50YXRpb24sIGxhYmVsOiBjb2Rlc3lzdGVtRW50cnkubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG1hcHBlZFJvd1tjb2x1bW5zW2ldXSA9ICcnO1xuICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwaW5nRXJyb3JGaWVsZHMucHVzaCh7ZmllbGQ6IGNvbHVtbnNbaV0sIHJvdzogcm93SW5kZXgsIHZhbHVlOiBjdXJyZW50Um93W2ldfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRGaWVsZC50eXBlID09PSAnUkVGRVJFTkNFJykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Um93W2ldLmxlbmd0aCA9PT0gMzIpIHtcbiAgICAgICAgICAgICAgICAgIG1hcHBlZFJvd1tjb2x1bW5zW2ldXSA9IGN1cnJlbnRSb3dbaV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG1hcHBlZFJvd1tjb2x1bW5zW2ldXSA9ICcnO1xuICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwaW5nRXJyb3JGaWVsZHMucHVzaCh7ZmllbGQ6IGNvbHVtbnNbaV0sIHJvdzogcm93SW5kZXgsIHZhbHVlOiBjdXJyZW50Um93W2ldfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRGaWVsZC50eXBlID09PSAnREFURVRJTUUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ldyBEYXRlKGN1cnJlbnRSb3dbaV0pLnRvU3RyaW5nKCkgPT09ICdJbnZhbGlkIERhdGUnKSB7XG4gICAgICAgICAgICAgICAgICBtYXBwZWRSb3dbY29sdW1uc1tpXV0gPSAnJztcbiAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGluZ0Vycm9yRmllbGRzLnB1c2goe2ZpZWxkOiBjb2x1bW5zW2ldLCByb3c6IHJvd0luZGV4LCB2YWx1ZTogY3VycmVudFJvd1tpXX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtYXBwZWRSb3dbY29sdW1uc1tpXV0gPSBjdXJyZW50Um93W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RmllbGQudHlwZSA9PT0gJ05VTUJFUicpIHtcbiAgICAgICAgICAgICAgICBtYXBwZWRSb3dbY29sdW1uc1tpXV0gPSBuZXcgTG9jYWxlTnVtYmVyUGlwZSh0aGlzLnRyYW5zbGF0ZSkuc3RyaW5nVG9OdW1iZXIoY3VycmVudFJvd1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKG1hcHBlZFJvd1tjb2x1bW5zW2ldXSkpIHtcbiAgICAgICAgICAgICAgICAgIG1hcHBlZFJvd1tjb2x1bW5zW2ldXSA9ICcnO1xuICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwaW5nRXJyb3JGaWVsZHMucHVzaCh7ZmllbGQ6IGNvbHVtbnNbaV0sIHJvdzogcm93SW5kZXgsIHZhbHVlOiBjdXJyZW50Um93W2ldfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hcHBlZFJvd1tjb2x1bW5zW2ldXSA9IGN1cnJlbnRSb3dbaV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tYXBwZWRSb3dzLnB1c2gobWFwcGVkUm93KTtcbiAgICAgICAgfVxuICAgICAgICBtZXRhRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgIHRoaXMubWFwcGVkUm93c1tmaWVsZC5yb3dJbmRleF1bZmllbGQuY29sdW1uICsgJ19tZXRhJ10gPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3BlbkltcG9ydFJlcG9ydERpYWxvZygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKTtcbiAgfVxuXG4gIGFkZEltcG9ydFZhbHVlc1RvVGFibGUoKSB7XG4gICAgdGhpcy5jbG9zZUltcG9ydFJlcG9ydCgpO1xuICAgIHRoaXMub3BlbkRpYWxvZygpO1xuICAgIHRoaXMuaW5uZXJWYWx1ZSA9IFsuLi50aGlzLmlubmVyVmFsdWUsIC4uLnRoaXMubWFwcGVkUm93c107XG4gICAgdGhpcy51cGRhdGVUYWJsZVZhbHVlKCk7XG4gIH1cblxuICBzaXplVG9GaXQob3ZlcmxheT86IGJvb2xlYW4pIHtcbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5EaWFsb2coKSB7XG4gICAgLy8gVE9ETzogU3RpbGwgbmVjZXNzYXJ5PyB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkucmVmcmVzaFZpZXcoKTtcbiAgICB0aGlzLnNob3dEaWFsb2cgPSB0cnVlO1xuICB9XG5cbiAgb3BlbkltcG9ydFJlcG9ydERpYWxvZygpIHtcbiAgICB0aGlzLnNob3dJbXBvcnRSZXBvcnREaWFsb2cgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRhYmxlRGF0YSgpOiBib29sZWFuIHtcbiAgICAvLyB0b2RvOiBpbXBsZW1lbnRcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhbGlkYXRlKGM6IFVudHlwZWRGb3JtQ29udHJvbCkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVGFibGVEYXRhKCkgPyBudWxsIDoge1xuICAgICAgdGFibGU6IHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG9uTW91c2VEb3duKCRldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMub3ZlcmxheUdyaWRPcHRpb25zLnN1cHByZXNzUm93Q2xpY2tTZWxlY3Rpb24pIHtcbiAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2hhbmdlcy5jaGVja0ZvclBlbmRpbmdUYXNrcyh0aGlzLnJvd0VkaXQucGVuZGluZ1Rhc2tJZCkpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuc3VwcHJlc3NSb3dDbGlja1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJvd0VkaXQuZmluaXNoUGVuZGluZygpO1xuICAgICAgICBsZXQgcm93SW5kZXggPSB0aGlzLmdyaWRBcGkuZ2V0Um93SW5kZXgoJGV2ZW50LnRhcmdldCwgJ2FnLWJvZHknKTtcbiAgICAgICAgaWYgKHJvd0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLmdldFJvd05vZGUoJycgKyByb3dJbmRleCkuc2V0U2VsZWN0ZWQodHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgJGV2ZW50LnRhcmdldC5jbGljaygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU29ydENoYW5nZWQoKSB7XG4gICAgbGV0IHJvd05vZGUgPSB0aGlzLm92ZXJsYXlHcmlkT3B0aW9ucy5hcGkuZ2V0Um93Tm9kZSgnJyArIHRoaXMuZWRpdGluZ1Jvdy5pbmRleCk7XG4gICAgdGhpcy5vdmVybGF5R3JpZE9wdGlvbnMuYXBpLmVuc3VyZU5vZGVWaXNpYmxlKHJvd05vZGUpO1xuICB9XG5cbiAgb25DZWxsQ2xpY2tlZCgkZXZlbnQpIHtcbiAgICBpZiAoJGV2ZW50LnJvd0luZGV4ICE9PSBudWxsICYmICF0aGlzLnBlbmRpbmdDaGFuZ2VzLmNoZWNrKCkpIHtcbiAgICAgIGlmICghJGV2ZW50Lm5vZGUuZ3JvdXAgJiYgJGV2ZW50LmRhdGEpIHtcbiAgICAgICAgaWYgKCRldmVudC5jb2xEZWYuY2VsbENsYXNzID09PSAncm91dGVyLWxpbmstY2VsbCcpIHtcbiAgICAgICAgICB0aGlzLmdyaWRBcGkub3BlblJvdXRlckxpbmsoJGV2ZW50LmV2ZW50LCAnYWctcm93Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNvbHVtblJlc2l6ZWQoY29sdW1uOiBhbnksIG92ZXJsYXk/OiBib29sZWFuKSB7XG4gICAgbGV0IGNvbHVtbnNEZWZpbml0aW9uID0gdGhpcy5jYWNoZUxheW91dEtleSArICcuY29sRGVmJztcbiAgICBsZXQgY2FjaGVkQ29sdW1ucyA9IHRoaXMuX2NhY2hlZENvbHVtbnM7XG4gICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgIGNvbHVtbnNEZWZpbml0aW9uID0gdGhpcy5jYWNoZUxheW91dEtleSArICcuY29sRGVmT3ZlcmxheSc7XG4gICAgICBjYWNoZWRDb2x1bW5zID0gdGhpcy5fY2FjaGVkQ29sdW1uc092ZXJsYXk7XG4gICAgfVxuICAgIGxldCBjb2wgPSBjYWNoZWRDb2x1bW5zLmZpbmQoYyA9PiBjLnFuYW1lID09PSBjb2x1bW4uY29sRGVmLnJlZkRhdGEucW5hbWUpO1xuICAgIGlmIChjb2wpIHtcbiAgICAgIGNvbC53aWR0aCA9IGNvbHVtbi5hY3R1YWxXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FjaGVkQ29sdW1ucy5wdXNoKHtxbmFtZTogY29sdW1uLmNvbERlZi5yZWZEYXRhLnFuYW1lLCB3aWR0aDogY29sdW1uLmFjdHVhbFdpZHRofSk7XG4gICAgfVxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShjb2x1bW5zRGVmaW5pdGlvbiwgY2FjaGVkQ29sdW1ucyk7XG4gIH1cblxuICAvLyBwcml2YXRlIF91cGRhdGVTcGxpdFZpZXdMYXlvdXRDYWNoZSgpIHtcbiAgLy8gICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgLy8gICAgIHRoaXMuc3BsaXRWaWV3Py51cGRhdGVMYXlvdXRDYWNoZSgpO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgdG9nZ2xlUHJldmlldygpIHtcbiAgICB0aGlzLnNob3dQcmV2aWV3ID0gIXRoaXMuc2hvd1ByZXZpZXc7XG4gICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGxheW91dCBvZiB0aGUgc3BsaXQgdmlldyBpcyB1cGRhdGVkIGFmdGVyIHRoZSBwcmV2aWV3IHBhbmVsc1xuICAgIC8vIHZpc2liaWxpdHkgY2hhbmdlZFxuICAgIC8vIHRoaXMuX3VwZGF0ZVNwbGl0Vmlld0xheW91dENhY2hlKCk7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRJdGVtKHRoaXMuY2FjaGVMYXlvdXRLZXkgKyAnLnNob3dQcmV2aWV3JywgdGhpcy5zaG93UHJldmlldyk7XG4gIH1cblxuICAvLyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gIC8vICAgdGhpcy5fdXBkYXRlU3BsaXRWaWV3TGF5b3V0Q2FjaGUoKTtcbiAgLy8gfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaGFzUHJldmlld0ZpbGUgPSB0aGlzLmhhc1ByZXZpZXdGaWxlICE9PSB1bmRlZmluZWQgPyB0aGlzLmhhc1ByZXZpZXdGaWxlIDogISF0aGlzLnBhcmFtcy5vYmplY3Q/LmNvbnRlbnQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJvYmplY3QtZm9ybS10YWJsZVwiIFtuZ0NsYXNzXT1cInttZWRpdW06IF9wYXJhbXMuc2l6ZSA9PT0gJ21lZGl1bScsIGxhcmdlOiBfcGFyYW1zLnNpemUgPT09ICdsYXJnZSd9XCI+XG4gIDxkaXYgY2xhc3M9XCJsYWJlbFwiPlxuICAgIDxzcGFuPnt7X3BhcmFtcy5lbGVtZW50LmxhYmVsfX08L3NwYW4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9wYXJhbXMuc2l0dWF0aW9uICE9PSAnU0VBUkNIJ1wiPlxuXG4gICAgICA8ZW8taWNvbiBjbGFzcz1cInN0ZlwiIFtpY29uU3JjXT1cIidhc3NldHMvX2RlZmF1bHQvc3ZnL2ljX2V4cGFuZC5zdmcnXCJcbiAgICAgICAgW2ljb25UaXRsZV09XCIoJ2VvLmZvcm0udGFibGUub3B0aW9ucy5idG4ub3Blbid8IHRyYW5zbGF0ZSlcIiAoY2xpY2spPVwib3BlbkRpYWxvZygpXCI+PC9lby1pY29uPlxuICAgICAgPGVvLWljb24gY2xhc3M9XCJzdGZcIiBbaWNvblNyY109XCInYXNzZXRzL19kZWZhdWx0L3N2Zy9pY19zaXplX3RvX2ZpdC5zdmcnXCJcbiAgICAgICAgW2ljb25UaXRsZV09XCIoJ2VvLmZvcm0udGFibGUub3B0aW9ucy5idG4uZml0J3wgdHJhbnNsYXRlKVwiIChjbGljayk9XCJzaXplVG9GaXQoKVwiPjwvZW8taWNvbj5cbiAgICAgIDxlby1pY29uIGNsYXNzPVwic3RmXCIgKm5nSWY9XCJncmlkT3B0aW9ucy5yb3dEYXRhPy5sZW5ndGhcIiBbaWNvblNyY109XCInYXNzZXRzL19kZWZhdWx0L3N2Zy9pY19jb250ZW50LWRvd25sb2FkLnN2ZydcIlxuICAgICAgICBbaWNvblRpdGxlXT1cIignZW8uZm9ybS50YWJsZS5vcHRpb25zLmJ0bi5jc3YnfCB0cmFuc2xhdGUpXCIgKGNsaWNrKT1cImV4cG9ydENTVigpXCI+PC9lby1pY29uPlxuICAgICAgPGVvLWljb24gY2xhc3M9XCJzdGZcIiBbaWNvblNyY109XCInYXNzZXRzL19kZWZhdWx0L3N2Zy9pY191cGxvYWQyLnN2ZydcIlxuICAgICAgICAgICAgICAgW2ljb25UaXRsZV09XCIoJ2VvLmZvcm0udGFibGUub3B0aW9ucy5idG4udXBsb2FkJ3wgdHJhbnNsYXRlKVwiIChjbGljayk9XCJmaWxlLmNsaWNrKClcIj48L2VvLWljb24+XG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIuY3N2XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgI2ZpbGUgKGNoYW5nZSk9XCJpbXBvcnRDU1YoJGV2ZW50LnRhcmdldClcIiAoY2xpY2spPVwiJGV2ZW50LnRhcmdldC52YWx1ZSA9IG51bGxcIj5cbiAgICAgIDxlby1pY29uIGNsYXNzPVwic3RmIGFkZC1yb3dcIiAqbmdJZj1cIiFfcGFyYW1zLmVsZW1lbnQucmVhZG9ubHlcIiBbaWNvblNyY109XCInYXNzZXRzL19kZWZhdWx0L3N2Zy9pY19hZGQuc3ZnJ1wiXG4gICAgICAgIFtpY29uVGl0bGVdPVwiKCdlby5mb3JtLnRhYmxlLm9wdGlvbnMuYnRuLmFkZCd8IHRyYW5zbGF0ZSlcIiAoY2xpY2spPVwiYWRkUm93KClcIj48L2VvLWljb24+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJncmlkLWJvZHkgc2l6ZS17eyBwYXJhbXMuc2l6ZSB9fVwiPlxuICAgIDxhZy1ncmlkLWFuZ3VsYXIgI2FnR3JpZCAqbmdJZj1cImdyaWRSZWFkeVwiIGNsYXNzPVwiYWctdGhlbWUtYmFsaGFtXCIgW21vZHVsZXNdPVwibW9kdWxlc1wiIFtncmlkT3B0aW9uc109XCJncmlkT3B0aW9uc1wiXG4gICAgICAocm93RG91YmxlQ2xpY2tlZCk9XCJlZGl0Um93KCRldmVudClcIiAoY2VsbENsaWNrZWQpPVwib25DZWxsQ2xpY2tlZCgkZXZlbnQpXCIgKHNvcnRDaGFuZ2VkKT1cIm9uU29ydENoYW5nZWQoKVwiXG4gICAgICAoY2VsbFZhbHVlQ2hhbmdlZCk9XCJvbkVkaXRDb21wbGV0ZSgkZXZlbnQpXCIgKGNvbHVtblJlc2l6ZWQpPVwib25Db2x1bW5SZXNpemVkKCRldmVudC5jb2x1bW4pXCI+XG4gICAgPC9hZy1ncmlkLWFuZ3VsYXI+XG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuPGVvLWRpYWxvZyBbdGl0bGVdPVwicGFyYW1zLmVsZW1lbnQubGFiZWxcIiBbdmlzaWJsZV09XCJzaG93RGlhbG9nXCIgW2RpcnR5Q2hlY2tdPVwicm93RWRpdD8ucGVuZGluZ1Rhc2tJZFwiXG4gIFttaW5XaWR0aF09XCJfcGFyYW1zLnNpdHVhdGlvbiAhPT0gJ1NFQVJDSCcgPyBtaW5XaWR0aCA6IDIwMFwiXG4gIFt3aWR0aF09XCJfcGFyYW1zLnNpdHVhdGlvbiAhPT0gJ1NFQVJDSCcgPyAnOTV2dycgOiA1MDBcIlxuICBbaGVpZ2h0XT1cImhlaWdodFwiXG4gIFtzdHlsZUNsYXNzXT1cIidvYmplY3QtZm9ybS10YWJsZS1kaWFsb2cnXCIgKGhpZGUpPVwib25DbG9zZSgpXCIgW2lzRm9ybVRhYmxlXT1cInRydWVcIiBbaGFzUHJldmlld0ZpbGVdPVwiaGFzUHJldmlld0ZpbGVcIlxuICBbc2hvd1ByZXZpZXddPVwic2hvd1ByZXZpZXdcIiAob25Ub2dnbGVQcmV2aWV3KT1cInRvZ2dsZVByZXZpZXcoKVwiPlxuXG4gIDxkaXYgY2xhc3M9XCJib2R5XCIgKm5nSWY9XCJzaG93RGlhbG9nXCI+XG5cbiAgICA8IS0tIDx5dmMtc3BsaXQtdmlldyBbbGF5b3V0U2V0dGluZ3NJRF09XCJjYWNoZUxheW91dEtleVwiPiAtLT5cbiAgICA8eXZjLXNwbGl0LXZpZXc+XG5cbiAgICAgIDwhLS0gdGhlIHRhYmxlIGl0c2VsZi0tPlxuICAgICAgPG5nLXRlbXBsYXRlIHl2Y1NwbGl0QXJlYSBbc2l6ZV09XCI0MFwiIFt2aXNpYmxlXT1cIl9wYXJhbXMuc2l0dWF0aW9uICE9PSAnU0VBUkNIJ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvYmplY3QtZm9ybS10YWJsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZW8taWNvbiBjbGFzcz1cInN0ZlwiIFtpY29uU3JjXT1cIidhc3NldHMvX2RlZmF1bHQvc3ZnL2ljX3NpemVfdG9fZml0LnN2ZydcIiBbaWNvblRpdGxlXT1cIignZW8uZm9ybS50YWJsZS5vcHRpb25zLmJ0bi5maXQnfCB0cmFuc2xhdGUpXCIgKGNsaWNrKT1cInNpemVUb0ZpdCh0cnVlKVwiPjwvZW8taWNvbj5cbiAgICAgICAgICAgICAgICA8ZW8taWNvbiBjbGFzcz1cInN0ZlwiICpuZ0lmPVwiZ3JpZE9wdGlvbnMucm93RGF0YS5sZW5ndGhcIiBbaWNvblNyY109XCInYXNzZXRzL19kZWZhdWx0L3N2Zy9pY19jb250ZW50LWRvd25sb2FkLnN2ZydcIiBbaWNvblRpdGxlXT1cIignZW8uZm9ybS50YWJsZS5vcHRpb25zLmJ0bi5jc3YnfCB0cmFuc2xhdGUpXCIgKGNsaWNrKT1cImV4cG9ydENTVigpXCI+PC9lby1pY29uPlxuICAgICAgICAgICAgICAgIDxlby1pY29uIGNsYXNzPVwic3RmIGFkZC1yb3dcIiAqbmdJZj1cIiFfcGFyYW1zLmVsZW1lbnQucmVhZG9ubHlcIiBbaWNvblNyY109XCInYXNzZXRzL19kZWZhdWx0L3N2Zy9pY19hZGQuc3ZnJ1wiIFtpY29uVGl0bGVdPVwiKCdlby5mb3JtLnRhYmxlLm9wdGlvbnMuYnRuLmFkZCd8IHRyYW5zbGF0ZSlcIiAoY2xpY2spPVwiYWRkUm93KClcIj48L2VvLWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1ib2R5XCI+XG4gICAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgI2FnR3JpZDIgKm5nSWY9XCJncmlkUmVhZHlcIiBjbGFzcz1cImFnLXRoZW1lLWJhbGhhbVwiIFttb2R1bGVzXT1cIm1vZHVsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cIm92ZXJsYXlHcmlkT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2VsbENsaWNrZWQpPVwib25DZWxsQ2xpY2tlZCgkZXZlbnQpO2VkaXRSb3coJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvcnRDaGFuZ2VkKT1cIm9uU29ydENoYW5nZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGxWYWx1ZUNoYW5nZWQpPVwib25FZGl0Q29tcGxldGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtblJlc2l6ZWQpPVwib25Db2x1bW5SZXNpemVkKCRldmVudC5jb2x1bW4sIHRydWUpXCI+XG4gICAgICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPCEtLSB0YWJsZSBlZGl0IGNvbXBvbmVudC0tPlxuICAgICAgPG5nLXRlbXBsYXRlIHl2Y1NwbGl0QXJlYSBbc2l6ZV09XCIyMFwiIFt2aXNpYmxlXT1cIiEhZWRpdGluZ1Jvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1ib2R5XCI+XG4gICAgICAgICAgPGVvLXJvdy1lZGl0IFtyb3ddPVwiZWRpdGluZ1Jvd1wiIFtsaW1pdFJlYWNoZWRdPVwibGltaXQgPD0gb3ZlcmxheUdyaWRPcHRpb25zLnJvd0RhdGEubGVuZ3RoXCIgI3Jvd0VkaXRcbiAgICAgICAgICAgIChvblNhdmUpPVwidXBkYXRlUm93KCRldmVudClcIiAob25TYXZlQ29weSk9XCJjb3B5Um93KCRldmVudClcIiAob25EZWxldGUpPVwiZGVsZXRlUm93KCRldmVudClcIlxuICAgICAgICAgICAgKG9uQ2FuY2VsKT1cImNhbmNlbFJvd0VkaXQoKVwiPjwvZW8tcm93LWVkaXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPCEtLSB2aWV3ZXItLT5cbiAgICAgIDxuZy10ZW1wbGF0ZSB5dmNTcGxpdEFyZWEgW3NpemVdPVwiNDBcIiBbdmlzaWJsZV09XCJzaG93UHJldmlldyAmJiBoYXNQcmV2aWV3RmlsZVwiPlxuICAgICAgICA8ZW8tbWVkaWEgKm5nSWY9XCJoYXNQcmV2aWV3RmlsZVwiIFtkbXNPYmplY3RdPVwicGFyYW1zLm9iamVjdFwiIFt1bmRvY2tEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgW3VzZVZlcnNpb25dPVwicGFyYW1zLm9iamVjdD8uaWQgPT09IHBhcmFtcy5vYmplY3Q/LmNvbnRlbnQ/LmlkXCI+PC9lby1tZWRpYT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8L3l2Yy1zcGxpdC12aWV3PlxuICA8L2Rpdj5cbjwvZW8tZGlhbG9nPlxuXG48ZW8tZGlhbG9nIFt0aXRsZV09XCIoJ2VvLmZvcm0udGFibGUuY3N2LmltcG9ydC5yZXBvcnQudGl0bGUnIHwgdHJhbnNsYXRlKVwiIFt2aXNpYmxlXT1cInNob3dJbXBvcnRSZXBvcnREaWFsb2dcIlxuICAgICAgICAgICAoaGlkZSk9XCJjbG9zZUltcG9ydFJlcG9ydCgpXCIgW3N0eWxlQ2xhc3NdPVwiJ2ltcG9ydC1yZXBvcnRfX2RpYWxvZydcIj5cbiAgPGRpdiBjbGFzcz1cImJvZHlcIj5cbiAgICA8aDQgdHJhbnNsYXRlIFt0cmFuc2xhdGVQYXJhbXNdPVwie3JlYWRSb3dzOiBtYXBwZWRSb3dzLmxlbmd0aH1cIj5lby5mb3JtLnRhYmxlLmNzdi5pbXBvcnQucmVwb3J0LnJlYWRSb3dzPC9oND5cbiAgICA8ZGl2ICpuZ0lmPVwibWFwcGluZ0Vycm9yRmllbGRzLmxlbmd0aCAhPT0gMFwiIGNsYXNzPVwiZmxleC1jb2xcIj5cbiAgICAgIDxoNCB0cmFuc2xhdGU+ZW8uZm9ybS50YWJsZS5jc3YuaW1wb3J0LnJlcG9ydC5lcnJvcnM8L2g0PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGggdHJhbnNsYXRlPmVvLmZvcm0udGFibGUuY3N2LmltcG9ydC5yZXBvcnQuZXJyb3JzLnJvdzwvdGg+XG4gICAgICAgICAgPHRoIHRyYW5zbGF0ZT5lby5mb3JtLnRhYmxlLmNzdi5pbXBvcnQucmVwb3J0LmVycm9ycy5jb2x1bW48L3RoPlxuICAgICAgICAgIDx0aCB0cmFuc2xhdGU+ZW8uZm9ybS50YWJsZS5jc3YuaW1wb3J0LnJlcG9ydC5lcnJvcnMudmFsdWU8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgbWFwcGluZ0Vycm9yRmllbGRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZD57e2Vycm9yLnJvdyArIDF9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57e2Vycm9yLmZpZWxkfX08L3RkPlxuICAgICAgICAgICAgICA8dGQ+e3tlcnJvci52YWx1ZX19PC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJjbG9zZUltcG9ydFJlcG9ydCgpXCIgY2xhc3M9XCJidXR0b24tY2FuY2VsXCIgdHJhbnNsYXRlPmVvLnJlc3VibWlzc2lvbi5jYW5jZWw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJhZGRJbXBvcnRWYWx1ZXNUb1RhYmxlKClcIiBjbGFzcz1cInByaW1hcnlcIiB0cmFuc2xhdGU+ZW8uZm9ybS50YWJsZS5jc3YuaW1wb3J0LnJlcG9ydC5pbXBvcnQ8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2VvLWRpYWxvZz5cbiJdfQ==