@wertzui/ngx-restworld-client 12.2.0 → 12.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/restworld-table/restworld-table.component.mjs +12 -3
- package/fesm2022/wertzui-ngx-restworld-client.mjs +10 -2
- package/fesm2022/wertzui-ngx-restworld-client.mjs.map +1 -1
- package/lib/components/restworld-table/restworld-table.component.d.ts +1 -0
- package/lib/components/restworld-table/restworld-table.component.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Component, EventEmitter, Input, Optional, Output, ViewChild } from '@angular/core';
|
|
2
2
|
import { PropertyType, Template } from '@wertzui/ngx-hal-client';
|
|
3
3
|
import * as _ from 'lodash';
|
|
4
|
+
import { FilterMatchMode } from 'primeng/api';
|
|
4
5
|
import { ODataService } from '../../services/o-data.service';
|
|
5
6
|
import { ControlContainer, FormArrayName } from '@angular/forms';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
@@ -376,6 +377,14 @@ export class RestWorldTableComponent {
|
|
|
376
377
|
return ColumnFilterType.text;
|
|
377
378
|
}
|
|
378
379
|
}
|
|
380
|
+
toMatchMode(propertyType) {
|
|
381
|
+
// There is a bug in PrimeNG returning CONTAINS for boolean columns
|
|
382
|
+
// Once the bug has been fixed, we can remove this workaround
|
|
383
|
+
// https://github.com/primefaces/primeng/issues/14210
|
|
384
|
+
if (propertyType === PropertyType.Bool)
|
|
385
|
+
return FilterMatchMode.EQUALS;
|
|
386
|
+
return undefined;
|
|
387
|
+
}
|
|
379
388
|
showInputField(column) {
|
|
380
389
|
if (!this.isEditable)
|
|
381
390
|
return false;
|
|
@@ -401,7 +410,7 @@ export class RestWorldTableComponent {
|
|
|
401
410
|
this._editProperties = Object.fromEntries(this.editTemplate.properties.map(p => [p.name, p]));
|
|
402
411
|
}
|
|
403
412
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: RestWorldTableComponent, deps: [{ token: i1.ControlContainer }, { token: i2.FormService }], target: i0.ɵɵFactoryTarget.Component });
|
|
404
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: RestWorldTableComponent, selector: "rw-table", inputs: { apiName: "apiName", formArray: "formArray", searchTemplate: "searchTemplate", editTemplate: "editTemplate", rows: "rows", rowsPerPageOptions: "rowsPerPageOptions", headerMenu: "headerMenu", rowMenu: "rowMenu", showRowMenuAsColumn: "showRowMenuAsColumn", showRowMenuOnRightClick: "showRowMenuOnRightClick", rowStyleClass: "rowStyleClass", cellStyleClass: "cellStyleClass", totalRecords: "totalRecords", styleClass: "styleClass", tableStyle: "tableStyle", scrollable: "scrollable", scrollHeight: "scrollHeight", selectionMode: "selectionMode", rowHover: "rowHover", selection: "selection", isLoading: "isLoading" }, outputs: { onFilterOrSortChanged: "onFilterOrSortChanged", onRowSelect: "onRowSelect", onRowUnselect: "onRowUnselect", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "contextMenu", first: true, predicate: ["contextMenu"], descendants: true }], ngImport: i0, template: "<p-table\n #table\n [value]=\"rows\"\n [columns]=\"columns\"\n [lazy]=\"true\"\n [lazyLoadOnInit]=\"false\"\n (onLazyLoad)=\"load($event)\"\n responsiveLayout=\"scroll\"\n [paginator]=\"true\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rows]=\"rows.length\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"isLoading\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"multiSortMeta\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [selectionMode]=\"selectionMode\"\n (onRowSelect)=\"onRowSelectInternal($event)\"\n (onRowUnselect)=\"onRowUnselectInternal($event)\"\n [rowHover]=\"rowHover\"\n [(selection)]=\"_selection\"\n (selectionChange)=\"onSelectionChangeInternal($event)\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.name\">\n <div class=\"p-d-flex p-jc-between p-ai-center\">\n {{col.prompt}}\n <ng-container *ngIf=\"!col.readOnly\">\n <p-sortIcon [field]=\"col.name\"></p-sortIcon>\n <p-columnFilter [type]=\"toColumnFilterType(col.type)\" [field]=\"col.name\" display=\"menu\"></p-columnFilter>\n </ng-container>\n </div>\n </th>\n <th *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button [items]=\"headerMenu\"></rw-menu-button>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\" let-rowIndex=\"rowIndex\">\n <tr (contextmenu)=\"openContextMenu($event, entity)\" [pSelectableRow]=\"entity\" [pSelectableRowDisabled]=\"selectionMode === null\" [className]=\"rowStyleClasses[rowIndex - (table.first ?? 0)]\">\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\" [className]=\"cellStyleClasses[rowIndex - (table.first ?? 0)][col.name]\">\n <ng-container *ngIf=\"showInputField(col); else textField\" [formGroup]=\"formArray!.controls[rowIndex - (table.first ?? 0)]\" >\n <rw-input [apiName]=\"apiName!\" [property]=\"editProperties[col.name]\"></rw-input>\n </ng-container>\n <ng-template #textField>\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\n <rw-avatar *ngIf=\"col.name === 'createdBy' || col.name === 'lastChangedBy'\" [user]=\"entity[col.name]\"></rw-avatar>\n <span *ngIf=\"col.name !== 'createdBy' && col.name !== 'lastChangedBy'\">{{entity[col.name]}}</span>\n </ng-container>\n <span *ngSwitchCase=\"PropertyType.Number\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Percent\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Currency\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Bool\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.name]\" [readonly]=\"true\"></p-triStateCheckbox></span>\n <span *ngSwitchCase=\"PropertyType.Date\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Time\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Duration\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeLocal\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeOffset\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.Collection\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.name]\">{{arrayElement | json}}</p></span>\n <span *ngSwitchCase=\"PropertyType.Object\" class=\"flex justify-content-end\">{{entity[col.name] | json}}</span>\n <span *ngSwitchDefault [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n </ng-template>\n </td>\n <td *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button *ngIf=\"showRowMenuAsColumn\" [items]=\"rowMenus[rowIndex - (table.first ?? 0)]\"></rw-menu-button>\n </td>\n </tr>\n </ng-template>\n\n <p-contextMenu #contextMenu appendTo=\"body\" [model]=\"contextMenuItems\"></p-contextMenu>\n</p-table>\n", styles: [".p-tooltip{max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"], dependencies: [{ kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { 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: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i5.ContextMenu, selector: "p-contextMenu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "id", "ariaLabel", "ariaLabelledBy"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i7.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i7.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i7.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons"] }, { kind: "component", type: i8.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "component", type: i9.RestWorldAvatarComponent, selector: "rw-avatar", inputs: ["user"] }, { kind: "component", type: i10.RestWorldInputComponent, selector: "rw-input", inputs: ["property", "apiName"] }, { kind: "component", type: i11.RestWorldMenuButtonComponent, selector: "rw-menu-button", inputs: ["items"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }, { kind: "pipe", type: i12.PropertyTypeFormatPipe, name: "propertyTypeFormat" }], viewProviders: [{
|
|
413
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: RestWorldTableComponent, selector: "rw-table", inputs: { apiName: "apiName", formArray: "formArray", searchTemplate: "searchTemplate", editTemplate: "editTemplate", rows: "rows", rowsPerPageOptions: "rowsPerPageOptions", headerMenu: "headerMenu", rowMenu: "rowMenu", showRowMenuAsColumn: "showRowMenuAsColumn", showRowMenuOnRightClick: "showRowMenuOnRightClick", rowStyleClass: "rowStyleClass", cellStyleClass: "cellStyleClass", totalRecords: "totalRecords", styleClass: "styleClass", tableStyle: "tableStyle", scrollable: "scrollable", scrollHeight: "scrollHeight", selectionMode: "selectionMode", rowHover: "rowHover", selection: "selection", isLoading: "isLoading" }, outputs: { onFilterOrSortChanged: "onFilterOrSortChanged", onRowSelect: "onRowSelect", onRowUnselect: "onRowUnselect", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "contextMenu", first: true, predicate: ["contextMenu"], descendants: true }], ngImport: i0, template: "<p-table\n #table\n [value]=\"rows\"\n [columns]=\"columns\"\n [lazy]=\"true\"\n [lazyLoadOnInit]=\"false\"\n (onLazyLoad)=\"load($event)\"\n responsiveLayout=\"scroll\"\n [paginator]=\"true\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rows]=\"rows.length\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"isLoading\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"multiSortMeta\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [selectionMode]=\"selectionMode\"\n (onRowSelect)=\"onRowSelectInternal($event)\"\n (onRowUnselect)=\"onRowUnselectInternal($event)\"\n [rowHover]=\"rowHover\"\n [(selection)]=\"_selection\"\n (selectionChange)=\"onSelectionChangeInternal($event)\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.name\">\n <div class=\"p-d-flex p-jc-between p-ai-center\">\n {{col.prompt}}\n <ng-container *ngIf=\"!col.readOnly\">\n <p-sortIcon [field]=\"col.name\"></p-sortIcon>\n <p-columnFilter [type]=\"toColumnFilterType(col.type)\" [matchMode]=\"toMatchMode(col.type)\" [field]=\"col.name\" display=\"menu\"></p-columnFilter>\n </ng-container>\n </div>\n </th>\n <th *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button [items]=\"headerMenu\"></rw-menu-button>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\" let-rowIndex=\"rowIndex\">\n <tr (contextmenu)=\"openContextMenu($event, entity)\" [pSelectableRow]=\"entity\" [pSelectableRowDisabled]=\"selectionMode === null\" [className]=\"rowStyleClasses[rowIndex - (table.first ?? 0)]\">\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\" [className]=\"cellStyleClasses[rowIndex - (table.first ?? 0)][col.name]\">\n <ng-container *ngIf=\"showInputField(col); else textField\" [formGroup]=\"formArray!.controls[rowIndex - (table.first ?? 0)]\" >\n <rw-input [apiName]=\"apiName!\" [property]=\"editProperties[col.name]\"></rw-input>\n </ng-container>\n <ng-template #textField>\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\n <rw-avatar *ngIf=\"col.name === 'createdBy' || col.name === 'lastChangedBy'\" [user]=\"entity[col.name]\"></rw-avatar>\n <span *ngIf=\"col.name !== 'createdBy' && col.name !== 'lastChangedBy'\">{{entity[col.name]}}</span>\n </ng-container>\n <span *ngSwitchCase=\"PropertyType.Number\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Percent\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Currency\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Bool\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.name]\" [readonly]=\"true\" [disabled]=\"true\"></p-triStateCheckbox></span>\n <span *ngSwitchCase=\"PropertyType.Date\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Time\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Duration\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeLocal\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeOffset\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.Collection\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.name]\">{{arrayElement | json}}</p></span>\n <span *ngSwitchCase=\"PropertyType.Object\" class=\"flex justify-content-end\">{{entity[col.name] | json}}</span>\n <span *ngSwitchDefault [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n </ng-template>\n </td>\n <td *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button *ngIf=\"showRowMenuAsColumn\" [items]=\"rowMenus[rowIndex - (table.first ?? 0)]\"></rw-menu-button>\n </td>\n </tr>\n </ng-template>\n\n <p-contextMenu #contextMenu appendTo=\"body\" [model]=\"contextMenuItems\"></p-contextMenu>\n</p-table>\n", styles: [".p-tooltip{max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"], dependencies: [{ kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { 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: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i5.ContextMenu, selector: "p-contextMenu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "id", "ariaLabel", "ariaLabelledBy"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i7.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i7.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i7.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons"] }, { kind: "component", type: i8.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "component", type: i9.RestWorldAvatarComponent, selector: "rw-avatar", inputs: ["user"] }, { kind: "component", type: i10.RestWorldInputComponent, selector: "rw-input", inputs: ["property", "apiName"] }, { kind: "component", type: i11.RestWorldMenuButtonComponent, selector: "rw-menu-button", inputs: ["items"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }, { kind: "pipe", type: i12.PropertyTypeFormatPipe, name: "propertyTypeFormat" }], viewProviders: [{
|
|
405
414
|
provide: ControlContainer,
|
|
406
415
|
deps: [[Optional, FormArrayName]],
|
|
407
416
|
useFactory: (arrayName) => arrayName,
|
|
@@ -413,7 +422,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImpor
|
|
|
413
422
|
provide: ControlContainer,
|
|
414
423
|
deps: [[Optional, FormArrayName]],
|
|
415
424
|
useFactory: (arrayName) => arrayName,
|
|
416
|
-
}], template: "<p-table\n #table\n [value]=\"rows\"\n [columns]=\"columns\"\n [lazy]=\"true\"\n [lazyLoadOnInit]=\"false\"\n (onLazyLoad)=\"load($event)\"\n responsiveLayout=\"scroll\"\n [paginator]=\"true\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rows]=\"rows.length\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"isLoading\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"multiSortMeta\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [selectionMode]=\"selectionMode\"\n (onRowSelect)=\"onRowSelectInternal($event)\"\n (onRowUnselect)=\"onRowUnselectInternal($event)\"\n [rowHover]=\"rowHover\"\n [(selection)]=\"_selection\"\n (selectionChange)=\"onSelectionChangeInternal($event)\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.name\">\n <div class=\"p-d-flex p-jc-between p-ai-center\">\n {{col.prompt}}\n <ng-container *ngIf=\"!col.readOnly\">\n <p-sortIcon [field]=\"col.name\"></p-sortIcon>\n <p-columnFilter [type]=\"toColumnFilterType(col.type)\" [field]=\"col.name\" display=\"menu\"></p-columnFilter>\n </ng-container>\n </div>\n </th>\n <th *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button [items]=\"headerMenu\"></rw-menu-button>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\" let-rowIndex=\"rowIndex\">\n <tr (contextmenu)=\"openContextMenu($event, entity)\" [pSelectableRow]=\"entity\" [pSelectableRowDisabled]=\"selectionMode === null\" [className]=\"rowStyleClasses[rowIndex - (table.first ?? 0)]\">\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\" [className]=\"cellStyleClasses[rowIndex - (table.first ?? 0)][col.name]\">\n <ng-container *ngIf=\"showInputField(col); else textField\" [formGroup]=\"formArray!.controls[rowIndex - (table.first ?? 0)]\" >\n <rw-input [apiName]=\"apiName!\" [property]=\"editProperties[col.name]\"></rw-input>\n </ng-container>\n <ng-template #textField>\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\n <rw-avatar *ngIf=\"col.name === 'createdBy' || col.name === 'lastChangedBy'\" [user]=\"entity[col.name]\"></rw-avatar>\n <span *ngIf=\"col.name !== 'createdBy' && col.name !== 'lastChangedBy'\">{{entity[col.name]}}</span>\n </ng-container>\n <span *ngSwitchCase=\"PropertyType.Number\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Percent\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Currency\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Bool\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.name]\" [readonly]=\"true\"></p-triStateCheckbox></span>\n <span *ngSwitchCase=\"PropertyType.Date\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Time\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Duration\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeLocal\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeOffset\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.Collection\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.name]\">{{arrayElement | json}}</p></span>\n <span *ngSwitchCase=\"PropertyType.Object\" class=\"flex justify-content-end\">{{entity[col.name] | json}}</span>\n <span *ngSwitchDefault [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n </ng-template>\n </td>\n <td *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button *ngIf=\"showRowMenuAsColumn\" [items]=\"rowMenus[rowIndex - (table.first ?? 0)]\"></rw-menu-button>\n </td>\n </tr>\n </ng-template>\n\n <p-contextMenu #contextMenu appendTo=\"body\" [model]=\"contextMenuItems\"></p-contextMenu>\n</p-table>\n", styles: [".p-tooltip{max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"] }]
|
|
425
|
+
}], template: "<p-table\n #table\n [value]=\"rows\"\n [columns]=\"columns\"\n [lazy]=\"true\"\n [lazyLoadOnInit]=\"false\"\n (onLazyLoad)=\"load($event)\"\n responsiveLayout=\"scroll\"\n [paginator]=\"true\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rows]=\"rows.length\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"isLoading\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"multiSortMeta\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [selectionMode]=\"selectionMode\"\n (onRowSelect)=\"onRowSelectInternal($event)\"\n (onRowUnselect)=\"onRowUnselectInternal($event)\"\n [rowHover]=\"rowHover\"\n [(selection)]=\"_selection\"\n (selectionChange)=\"onSelectionChangeInternal($event)\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.name\">\n <div class=\"p-d-flex p-jc-between p-ai-center\">\n {{col.prompt}}\n <ng-container *ngIf=\"!col.readOnly\">\n <p-sortIcon [field]=\"col.name\"></p-sortIcon>\n <p-columnFilter [type]=\"toColumnFilterType(col.type)\" [matchMode]=\"toMatchMode(col.type)\" [field]=\"col.name\" display=\"menu\"></p-columnFilter>\n </ng-container>\n </div>\n </th>\n <th *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button [items]=\"headerMenu\"></rw-menu-button>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\" let-rowIndex=\"rowIndex\">\n <tr (contextmenu)=\"openContextMenu($event, entity)\" [pSelectableRow]=\"entity\" [pSelectableRowDisabled]=\"selectionMode === null\" [className]=\"rowStyleClasses[rowIndex - (table.first ?? 0)]\">\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\" [className]=\"cellStyleClasses[rowIndex - (table.first ?? 0)][col.name]\">\n <ng-container *ngIf=\"showInputField(col); else textField\" [formGroup]=\"formArray!.controls[rowIndex - (table.first ?? 0)]\" >\n <rw-input [apiName]=\"apiName!\" [property]=\"editProperties[col.name]\"></rw-input>\n </ng-container>\n <ng-template #textField>\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\n <rw-avatar *ngIf=\"col.name === 'createdBy' || col.name === 'lastChangedBy'\" [user]=\"entity[col.name]\"></rw-avatar>\n <span *ngIf=\"col.name !== 'createdBy' && col.name !== 'lastChangedBy'\">{{entity[col.name]}}</span>\n </ng-container>\n <span *ngSwitchCase=\"PropertyType.Number\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Percent\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Currency\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Bool\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.name]\" [readonly]=\"true\" [disabled]=\"true\"></p-triStateCheckbox></span>\n <span *ngSwitchCase=\"PropertyType.Date\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Time\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Duration\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeLocal\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeOffset\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.Collection\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.name]\">{{arrayElement | json}}</p></span>\n <span *ngSwitchCase=\"PropertyType.Object\" class=\"flex justify-content-end\">{{entity[col.name] | json}}</span>\n <span *ngSwitchDefault [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n </ng-template>\n </td>\n <td *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button *ngIf=\"showRowMenuAsColumn\" [items]=\"rowMenus[rowIndex - (table.first ?? 0)]\"></rw-menu-button>\n </td>\n </tr>\n </ng-template>\n\n <p-contextMenu #contextMenu appendTo=\"body\" [model]=\"contextMenuItems\"></p-contextMenu>\n</p-table>\n", styles: [".p-tooltip{max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"] }]
|
|
417
426
|
}], ctorParameters: function () { return [{ type: i1.ControlContainer }, { type: i2.FormService }]; }, propDecorators: { apiName: [{
|
|
418
427
|
type: Input
|
|
419
428
|
}], formArray: [{
|
|
@@ -470,4 +479,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImpor
|
|
|
470
479
|
}], isLoading: [{
|
|
471
480
|
type: Input
|
|
472
481
|
}] } });
|
|
473
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvY29tcG9uZW50cy9yZXN0d29ybGQtdGFibGUvcmVzdHdvcmxkLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvY29tcG9uZW50cy9yZXN0d29ybGQtdGFibGUvcmVzdHdvcmxkLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXlCLFlBQVksRUFBZSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUc1QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFN0QsT0FBTyxFQUFtQixnQkFBZ0IsRUFBYSxhQUFhLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFHeEcsSUFBSyxnQkFLSjtBQUxELFdBQUssZ0JBQWdCO0lBQ25CLGlDQUFhLENBQUE7SUFDYix1Q0FBbUIsQ0FBQTtJQUNuQix1Q0FBbUIsQ0FBQTtJQUNuQixpQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUxJLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFLcEI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFVSCxNQUFNLE9BQU8sdUJBQXVCO0lBc05mO0lBQ0E7SUF0Tm5COzs7T0FHRztJQUVJLE9BQU8sQ0FBVTtJQUVoQixVQUFVLENBQTZFO0lBRS9GOzs7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RG5CLE1BQU07Z0JBUUEsYUFBYTtzQkFEbkIsS0FBSztnQkFPQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0ssU0FBUztzQkFEbkIsS0FBSztnQkFjTixlQUFlO3NCQURkLE1BQU07Z0JBSVAsV0FBVztzQkFEVixTQUFTO3VCQUFDLGFBQWE7Z0JBYWpCLFNBQVM7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtU2VydmljZSwgUHJvcGVydHksIFByb3BlcnR5VHlwZSwgU2ltcGxlVmFsdWUsIFRlbXBsYXRlIH0gZnJvbSAnQHdlcnR6dWkvbmd4LWhhbC1jbGllbnQnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgTWVudUl0ZW0sIFNvcnRNZXRhIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgT0RhdGFQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL28tZGF0YSc7XG5pbXBvcnQgeyBPRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJ3ByaW1lbmcvY29udGV4dG1lbnUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sQ29udGFpbmVyLCBGb3JtQXJyYXksIEZvcm1BcnJheU5hbWUsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRhYmxlTGF6eUxvYWRFdmVudCwgVGFibGVSb3dTZWxlY3RFdmVudCwgVGFibGVSb3dVblNlbGVjdEV2ZW50IH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5cbmVudW0gQ29sdW1uRmlsdGVyVHlwZSB7XG4gIHRleHQgPSAndGV4dCcsXG4gIG51bWVyaWMgPSAnbnVtZXJpYycsXG4gIGJvb2xlYW4gPSAnYm9vbGVhbicsXG4gIGRhdGUgPSAnZGF0ZSdcbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhIHRhYmxlIGJhc2VkIG9uIGEgc2VhcmNoLSwgYW4gZWRpdC10ZW1wbGF0ZSBhbmQgYSBsaXN0IG9mIGl0ZW1zLlxuICogVGhlIHNlYXJjaC10ZW1wbGF0ZSBpcyByZXF1aXJlZCBhbmQgdXNlZCB0byBkaXNwbGF5IHRoZSB0YWJsZSBjb2x1bW5zIGFuZCB0byBmaWx0ZXIgYW5kIHNvcnQgdGhlIGl0ZW1zLlxuICogVGhlIGVkaXQtdGVtcGxhdGUgaXMgb3B0aW9uYWwgYW5kIHVzZWQgdG8gZWRpdCB0aGUgaXRlbXMuIEZvciB0aGUgZWRpdCBjYXBhYmlsaXR5LCB0aGUgdGFibGUgbXVzdCBiZSBwYXJ0IG9mIGEgcmVhY3RpdmUgZm9ybS5cbiAqIFRoZSBpdGVtcyBhcmUgZGlzcGxheWVkIGFzIHRhYmxlIHJvd3MuXG4gKiBUaGUgdGFibGUgc3VwcG9ydHMgbGF6eSBsb2FkaW5nLCByb3cgc2VsZWN0aW9uLCByb3cgbWVudXMsIGFuZCBjb250ZXh0IG1lbnVzLlxuICogXG4gKiBAZXhhbXBsZVxuICogPHJ3LXRhYmxlXG4gKiAgIFthcGlOYW1lXT1cImFwaU5hbWVcIlxuICogICBbc2VhcmNoVGVtcGxhdGVdPVwic2VhcmNoVGVtcGxhdGVcIlxuICogICBbZWRpdFRlbXBsYXRlXT1cImVkaXRUZW1wbGF0ZVwiXG4gKiAgIFtyb3dzXT1cInJvd3NcIlxuICogICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIlsxMCwgMjUsIDUwXVwiXG4gKiAgIFtoZWFkZXJNZW51XT1cImhlYWRlck1lbnVcIlxuICogICBbcm93TWVudV09XCJyb3dNZW51XCJcbiAqICAgW3Jvd1N0eWxlQ2xhc3NdPVwicm93U3R5bGVDbGFzc1wiXG4gKiAgIFtjZWxsU3R5bGVDbGFzc109XCJjZWxsU3R5bGVDbGFzc1wiXG4gKiAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAqICAgW211bHRpU29ydE1ldGFdPVwibXVsdGlTb3J0TWV0YVwiXG4gKiAgIFtzdHlsZUNsYXNzXT1cInN0eWxlQ2xhc3NcIlxuICogICBbdGFibGVTdHlsZV09XCJ0YWJsZVN0eWxlXCJcbiAqICAgW3Njcm9sbGFibGVdPVwic2Nyb2xsYWJsZVwiXG4gKiAgIFtzY3JvbGxIZWlnaHRdPVwic2Nyb2xsSGVpZ2h0XCJcbiAqICAgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uTW9kZVwiXG4gKiAgIFtyb3dIb3Zlcl09XCJyb3dIb3ZlclwiXG4gKiAgIFtzZWxlY3Rpb25dPVwic2VsZWN0aW9uXCJcbiAqICAgW2NvbnRleHRNZW51SXRlbXNdPVwiY29udGV4dE1lbnVJdGVtc1wiXG4gKiAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAqICAgKG9uRmlsdGVyT3JTb3J0Q2hhbmdlZCk9XCJvbkZpbHRlck9yU29ydENoYW5nZWQoJGV2ZW50KVwiXG4gKiAgIChvblJvd1NlbGVjdCk9XCJvblJvd1NlbGVjdCgkZXZlbnQpXCJcbiAqICAgKG9uUm93VW5zZWxlY3QpPVwib25Sb3dVbnNlbGVjdCgkZXZlbnQpXCJcbiAqICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICogPC9ydy10YWJsZT5cbiAqIFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydy10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN0d29ybGQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXN0d29ybGQtdGFibGUuY29tcG9uZW50LmNzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsXG4gICAgZGVwczogW1tPcHRpb25hbCwgRm9ybUFycmF5TmFtZV1dLFxuICAgIHVzZUZhY3Rvcnk6IChhcnJheU5hbWU6IEZvcm1BcnJheU5hbWUpID0+IGFycmF5TmFtZSwgfV1cbiAgfSlcbmV4cG9ydCBjbGFzcyBSZXN0V29ybGRUYWJsZUNvbXBvbmVudDxUTGlzdEl0ZW0gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBpLlxuICAgKiBGb3IgdGhlIGVkaXRpbmcgY2FwYWJpbGl0eSwgeW91IG11c3QgYWxzbyBzZXQgdGhlIGVkaXRUZW1wbGF0ZSBhbmQgdGhlIGZvcm1BcnJheS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcGlOYW1lPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2Zvcm1BcnJheT86IEZvcm1BcnJheTxGb3JtR3JvdXA8e1tLIGluIGtleW9mIFRMaXN0SXRlbV0gOiBBYnN0cmFjdENvbnRyb2w8dW5rbm93bj59Pj47XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGZvcm0gZ3JvdXBzIGZvciB0aGUgaXRlbXMuXG4gICAqIEJpbmQgdGhpcyB0byB0aGUgZm9ybSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBmb3JtIGdyb3VwcyBmb3IgdGhlIGl0ZW1zLlxuICAgKiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSByZXByZXNlbnRzIG9uZSByb3cgaW4gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZSBvZiB0aGUgdGFibGUuXG4gICAqIEZvciB0aGUgZWRpdGluZyBjYXBhYmlsaXR5LCB5b3UgbXVzdCBhbHNvIHNldCB0aGUgYXBpTmFtZSBhbmQgdGhlIGVkaXRUZW1wbGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZm9ybUFycmF5KHZhbHVlOiBGb3JtQXJyYXk8Rm9ybUdyb3VwPHtbSyBpbiBrZXlvZiBUTGlzdEl0ZW1dIDogQWJzdHJhY3RDb250cm9sPHVua25vd24+fT4+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZm9ybUFycmF5ID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1BcnJheSgpOiBGb3JtQXJyYXk8Rm9ybUdyb3VwPHtbSyBpbiBrZXlvZiBUTGlzdEl0ZW1dIDogQWJzdHJhY3RDb250cm9sPHVua25vd24+fT4+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybUFycmF5ID8/IHRoaXMuX2NvbnRyb2xDb250YWluZXI/LmNvbnRyb2wgYXMgRm9ybUFycmF5PEZvcm1Hcm91cDx7W0sgaW4ga2V5b2YgVExpc3RJdGVtXSA6IEFic3RyYWN0Q29udHJvbDx1bmtub3duPn0+PiB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlYXJjaFRlbXBsYXRlOiBUZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZSh7cHJvcGVydGllczogW119KTtcblxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIHRoYXQgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSB0YWJsZSBjb2x1bW5zIGFuZCB0byBmaWx0ZXIgYW5kIHNvcnQgdGhlIGl0ZW1zLlxuICAgKiBCaW5kIHRoaXMgdG8gdGhlIHRlbXBsYXRlIHRoYXQgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSB0YWJsZSBjb2x1bW5zIGFuZCB0byBmaWx0ZXIgYW5kIHNvcnQgdGhlIGl0ZW1zLlxuICAgKiBOb3JtYWxseSB0aGlzIGlzIHJldHVybmVkIGZyb20gdGhlIGJhY2tlbmQgYXMgcGFydCBvZiB0aGUgaGFsLWZvcm1zIHJlc291cmNlIGZyb20gYSBsaXN0IGVuZHBvaW50LlxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgcHVibGljIHNldCBzZWFyY2hUZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGUpe1xuICAgIHRoaXMuX3NlYXJjaFRlbXBsYXRlID0gdmFsdWU7XG4gICAgdGhpcy5fY29sdW1ucyA9IHZhbHVlPy5wcm9wZXJ0aWVzLmZpbHRlcihwID0+IHAudHlwZSAhPT0gUHJvcGVydHlUeXBlLkhpZGRlbikgPz8gW107XG4gICAgdGhpcy5zZXRTb3J0RmllbGRBbmRTb3J0T3JkZXIodmFsdWUpXG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaFRlbXBsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hUZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2VkaXRUZW1wbGF0ZT86IFRlbXBsYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgdGhhdCBpcyB1c2VkIHRvIGVkaXQgdGhlIGl0ZW1zLlxuICAgKiBCaW5kIHRoaXMgdG8gdGhlIHRlbXBsYXRlIHRoYXQgaXMgdXNlZCB0byBlZGl0IHRoZSBpdGVtcy5cbiAgICogTm9ybWFsbHkgdGhpcyBpcyByZXR1cm5lZCBmcm9tIHRoZSBiYWNrZW5kIGFzIHBhcnQgb2YgdGhlIGhhbC1mb3JtcyByZXNvdXJjZSBmcm9tIGEgbGlzdCBlbmRwb2ludC5cbiAgICogRm9yIHRoZSBlZGl0aW5nIGNhcGFiaWxpdHksIHlvdSBtdXN0IGFsc28gc2V0IHRoZSBhcGlOYW1lIGFuZCB0aGUgZm9ybUFycmF5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBlZGl0VGVtcGxhdGUodmFsdWU6IFRlbXBsYXRlIHwgdW5kZWZpbmVkKXtcbiAgICB0aGlzLl9lZGl0VGVtcGxhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUVkaXRQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy51cGRhdGVGb3JtQXJyYXkoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWRpdFRlbXBsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9lZGl0VGVtcGxhdGU7XG4gIH1cblxuICBwcml2YXRlIF9lZGl0UHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUHJvcGVydHk8U2ltcGxlVmFsdWUsIHN0cmluZywgc3RyaW5nPj4gPSB7fTtcbiAgcHVibGljIGdldCBlZGl0UHJvcGVydGllcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdFByb3BlcnRpZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRWRpdGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdFRlbXBsYXRlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5mb3JtQXJyYXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmFwaU5hbWU7XG4gIH1cblxuICBwcml2YXRlIF9yb3dzOiBUTGlzdEl0ZW1bXSA9IFtdO1xuICBwdWJsaWMgZ2V0IHJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3M7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGl0ZW1zIHRoYXQgYXJlIGRpc3BsYXllZCBhcyB0YWJsZSByb3dzLlxuICAgKiBCaW5kIHRoaXMgdG8gdGhlIGl0ZW1zIHRoYXQgYXJlIGRpc3BsYXllZCBhcyB0YWJsZSByb3dzLlxuICAgKiBOb3JtYWxseSB0aGlzIGlzIHJldHVybmVkIGZyb20gdGhlIGJhY2tlbmQgYXMgcGFydCBvZiB0aGUgaGFsLWZvcm1zIHJlc291cmNlIGZyb20gYSBsaXN0IGVuZHBvaW50LlxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgcHVibGljIHNldCByb3dzKHZhbHVlOiBUTGlzdEl0ZW1bXSkge1xuICAgIHRoaXMuX3Jvd3MgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUNhbGN1bGF0ZWRGdW5jdGlvblZhbHVlcyh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVGb3JtQXJyYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuXG4gICAqIFRoZSBkZWZhdWx0IGlzIFsxMCwgMjUsIDUwXS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByb3dzUGVyUGFnZU9wdGlvbnMgPSBbMTAsIDI1LCA1MF07XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIG1lbnUgdGhhdCBpcyBkaXNwbGF5ZWQgYXQgdGhlIHRvcCByaWdodCBvZiB0aGUgdGFibGUuXG4gICAqIEBzZWUgUmVzdFdvcmxkTWVudUJ1dHRvbkNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhlYWRlck1lbnU6IE1lbnVJdGVtW10gPSBbXTtcblxuICBwcml2YXRlIF9yb3dNZW51OiAocm93OiBUTGlzdEl0ZW0sIG9wZW5lZEJ5UmlnaHRDbGljazogYm9vbGVhbikgPT4gTWVudUl0ZW1bXSA9ICgpID0+IFtdO1xuICBwdWJsaWMgZ2V0IHJvd01lbnUoKTogKHJvdzogVExpc3RJdGVtLCBvcGVuZWRCeVJpZ2h0Q2xpY2s6IGJvb2xlYW4pID0+IE1lbnVJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLl9yb3dNZW51O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtZW51IGZvciBhIHJvdy5cbiAgICogQmFzZWQgb24gdGhlIG9wZW5lZEJ5UmlnaHRDbGljayBwYXJhbWV0ZXIsIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGRpZmZlcmVudCBtZW51cy5cbiAgICogVGhlIG1lbnUgd2hlbiBpdCBoYXMgbm90IGJlZW4gb3BlbmVkIGJ5IGEgcmlnaHQgY2xpY2sgaXMgZGlzcGxheWVkIGluIGFuIGV4dHJhIGNvbHVtbiB0byB0aGUgcmlnaHQgb2YgdGhlIHRhYmxlIGlmIGBzaG93Um93TWVudUFzQ29sdW1uYCBpcyBgdHJ1ZWAuXG4gICAqIFRoZSBtZW51IHdoZW4gaXQgaGFzIGJlZW4gb3BlbmVkIGJ5IGEgcmlnaHQgY2xpY2sgaXMgZGlzcGxheWVkIGFzIGEgY29udGV4dCBtZW51IGlmIGBzaG93Um93TWVudU9uUmlnaHRDbGlja2AgaXMgYHRydWVgLlxuICAgKiBAcGFyYW0gcm93IFRoZSByb3cgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgbWVudS5cbiAgICogQHBhcmFtIG9wZW5lZEJ5UmlnaHRDbGljayBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVudSB3YXMgb3BlbmVkIGJ5IGEgcmlnaHQgY2xpY2suXG4gICAqIEByZXR1cm5zIFRoZSBtZW51IGZvciB0aGUgcm93LlxuICAgKiBAc2VlIHNob3dSb3dNZW51QXNDb2x1bW5cbiAgICogQHNlZSBzaG93Um93TWVudU9uUmlnaHRDbGlja1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCByb3dNZW51KHZhbHVlOiAocm93OiBUTGlzdEl0ZW0sIG9wZW5lZEJ5UmlnaHRDbGljazogYm9vbGVhbikgPT4gTWVudUl0ZW1bXSkge1xuICAgIHRoaXMuX3Jvd01lbnUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVJvd01lbnVzKHRoaXMucm93cyk7XG4gIH1cblxuICBwcml2YXRlIF9yb3dNZW51czogTWVudUl0ZW1bXVtdID0gW107XG5cbiAgcHJpdmF0ZSB1cGRhdGVDYWxjdWxhdGVkRnVuY3Rpb25WYWx1ZXModmFsdWU6IFRMaXN0SXRlbVtdKSB7XG4gICAgdGhpcy51cGRhdGVSb3dNZW51cyh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVSb3dTdHlsZXModmFsdWUpO1xuICAgIHRoaXMudXBkYXRlQ2VsbFN0eWxlcyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNlbGxTdHlsZXModmFsdWU6IFRMaXN0SXRlbVtdKSB7XG4gICAgdGhpcy5fY2VsbFN0eWxlQ2xhc3NlcyA9IHZhbHVlLm1hcCgociwgcmkpID0+IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmNvbHVtbnMubWFwKChjLCBjaSkgPT4gW2MubmFtZSwgdGhpcy5jZWxsU3R5bGVDbGFzcyhyLCBjLCByaSwgY2kpXSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUm93U3R5bGVzKHZhbHVlOiBUTGlzdEl0ZW1bXSkge1xuICAgIHRoaXMuX3Jvd1N0eWxlQ2xhc3NlcyA9IHZhbHVlLm1hcCgociwgaSkgPT4gdGhpcy5yb3dTdHlsZUNsYXNzKHIsIGkpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUm93TWVudXModmFsdWU6IFRMaXN0SXRlbVtdKSB7XG4gICAgaWYgKHRoaXMuc2hvd1Jvd01lbnVBc0NvbHVtbilcbiAgICAgIHRoaXMuX3Jvd01lbnVzID0gdmFsdWUubWFwKHIgPT4gdGhpcy5yb3dNZW51KHIsIGZhbHNlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvd01lbnVzKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3dNZW51cztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd01lbnVDb2x1bW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyTWVudS5sZW5ndGggPiAwIHx8ICh0aGlzLnNob3dSb3dNZW51QXNDb2x1bW4gJiYgdGhpcy5yb3dNZW51cy5zb21lKG0gPT4gbS5sZW5ndGggPiAwKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJvdyBtZW51IGlzIGRpc3BsYXllZCBhcyBhIGNvbHVtbiB0byB0aGUgcmlnaHQgb2YgdGhlIHRhYmxlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dSb3dNZW51QXNDb2x1bW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcm93IG1lbnUgaXMgZGlzcGxheWVkIGFzIGEgY29udGV4dCBtZW51IHdoZW4gdGhlIHVzZXIgcmlnaHQgY2xpY2tzIG9uIGEgcm93LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dSb3dNZW51T25SaWdodENsaWNrID0gdHJ1ZTtcblxuICBwcml2YXRlIF9yb3dTdHlsZUNsYXNzOiAocm93OiBUTGlzdEl0ZW0sIHJvd0luZGV4OiBudW1iZXIpID0+IHN0cmluZyA9ICgpID0+IFwiXCI7XG4gIHB1YmxpYyBnZXQgcm93U3R5bGVDbGFzcygpOiAocm93OiBUTGlzdEl0ZW0sIHJvd0luZGV4OiBudW1iZXIpID0+IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd1N0eWxlQ2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHN0eWxlIGNsYXNzIGZvciBhIHJvdy5cbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IGZvciB3aGljaCB0byByZXR1cm4gdGhlIHN0eWxlIGNsYXNzLlxuICAgKiBAcGFyYW0gcm93SW5kZXggVGhlIGluZGV4IG9mIHRoZSByb3cgb24gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZS5cbiAgICogQHJldHVybnMgVGhlIHN0eWxlIGNsYXNzIGZvciB0aGUgcm93LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCByb3dTdHlsZUNsYXNzKHZhbHVlOiAocm93OiBUTGlzdEl0ZW0sIHJvd0luZGV4OiBudW1iZXIpID0+IHN0cmluZykge1xuICAgIHRoaXMuX3Jvd1N0eWxlQ2xhc3MgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVJvd1N0eWxlcyh0aGlzLnJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcm93U3R5bGVDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgZ2V0IHJvd1N0eWxlQ2xhc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcm93U3R5bGVDbGFzc2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2VsbFN0eWxlQ2xhc3M6IChyb3c6IFRMaXN0SXRlbSwgY29sdW1uOiBQcm9wZXJ0eTxTaW1wbGVWYWx1ZSwgc3RyaW5nLCBzdHJpbmc+LCByb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKSA9PiBzdHJpbmcgPSAoKSA9PiBcIlwiO1xuICBwdWJsaWMgZ2V0IGNlbGxTdHlsZUNsYXNzKCk6IChyb3c6IFRMaXN0SXRlbSwgY29sdW1uOiBQcm9wZXJ0eTxTaW1wbGVWYWx1ZSwgc3RyaW5nLCBzdHJpbmc+LCByb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKSA9PiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jZWxsU3R5bGVDbGFzcztcbiAgfVxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHN0eWxlIGNsYXNzIGZvciBhIGNlbGwuXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBzdHlsZSBjbGFzcy5cbiAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGZvciB3aGljaCB0byByZXR1cm4gdGhlIHN0eWxlIGNsYXNzLlxuICAgKiBAcGFyYW0gcm93SW5kZXggVGhlIGluZGV4IG9mIHRoZSByb3cgb24gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZS5cbiAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uLlxuICAgKiBAcmV0dXJucyBUaGUgc3R5bGUgY2xhc3MgZm9yIHRoZSBjZWxsLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjZWxsU3R5bGVDbGFzcyh2YWx1ZTogKHJvdzogVExpc3RJdGVtLCBjb2x1bW46IFByb3BlcnR5PFNpbXBsZVZhbHVlLCBzdHJpbmcsIHN0cmluZz4sIHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbkluZGV4OiBudW1iZXIpID0+IHN0cmluZykge1xuICAgIHRoaXMuX2NlbGxTdHlsZUNsYXNzID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVDZWxsU3R5bGVzKHRoaXMucm93cyk7XG4gIH1cblxuICBwcml2YXRlIF9jZWxsU3R5bGVDbGFzc2VzOiBSZWNvcmQ8c3RyaW5nLHN0cmluZz5bXSA9IFtdO1xuICBwdWJsaWMgZ2V0IGNlbGxTdHlsZUNsYXNzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbGxTdHlsZUNsYXNzZXM7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgdG90YWxSZWNvcmRzID0gMDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mb3JtU2VydmljZTogRm9ybVNlcnZpY2UsKSB7XG4gIH1cblxuICBwcml2YXRlIHNldFNvcnRGaWVsZEFuZFNvcnRPcmRlcih0ZW1wbGF0ZTogVGVtcGxhdGUgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvcmRlckJ5ID0gdGVtcGxhdGU/LnByb3BlcnRpZXM/LmZpbmQocCA9PiBwPy5uYW1lID09PSBcIiRvcmRlcmJ5XCIpPy52YWx1ZTtcblxuICAgIGlmKG9yZGVyQnkgPT09IG51bGwgfHwgb3JkZXJCeSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcmRlckJ5ICE9PSAnc3RyaW5nJylcbiAgICByZXR1cm47XG5cbiAgICBjb25zdCBbZmllbGQsIG9yZGVyXSA9IG9yZGVyQnkuc3BsaXQoXCIgXCIpO1xuICAgIGNvbnN0IG9yZGVyQXNOdW1iZXIgPSBvcmRlcj8udG9Mb3dlckNhc2UoKSA9PT0gXCJkZXNjXCIgPyAtMSA6IDE7XG5cbiAgICBpZiAodGhpcy5tdWx0aVNvcnRNZXRhPy5sZW5ndGggIT09IDEgfHwgdGhpcy5tdWx0aVNvcnRNZXRhWzBdLmZpZWxkICE9PSBmaWVsZCB8fCB0aGlzLm11bHRpU29ydE1ldGFbMF0ub3JkZXIgIT09IG9yZGVyQXNOdW1iZXIpXG4gICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBbe2ZpZWxkOiBmaWVsZCwgb3JkZXI6IG9yZGVyQXNOdW1iZXJ9XVxuICB9XG5cbiAgcHVibGljIG11bHRpU29ydE1ldGE/OiBTb3J0TWV0YVtdIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN0eWxlIGNsYXNzIGZvciB0aGUgdGFibGUuXG4gICAqIFRoZSBkZWZhdWx0IGlzIFwiXCIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc3R5bGVDbGFzczogc3RyaW5nID0gXCJcIjtcblxuICAvKipcbiAgICogVGhlIGlubGluZSBzdHlsZSBmb3IgdGhlIHRhYmxlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHRhYmxlU3R5bGU/OiBSZWNvcmQ8c3RyaW5nLHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSBpcyBzY3JvbGxhYmxlLlxuICAgKiBUaGUgZGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2Nyb2xsYWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIHNjcm9sbGFibGUgdGFibGUuXG4gICAqIFRoZSBkZWZhdWx0IGlzIFwiZmxleFwiLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNjcm9sbEhlaWdodDogc3RyaW5nID0gXCJmbGV4XCI7XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgZmlsdGVyIG9yIHNvcnQgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuXG4gICAqIFN1YnNjcmliZSB0byB0aGlzIGV2ZW50IHRvIGxvYWQgdGhlIGl0ZW1zIGZyb20gdGhlIGJhY2tlbmQuXG4gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBjb3JlIGZlYXR1cmVzIG9mIHRoZSB0YWJsZS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25GaWx0ZXJPclNvcnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxPRGF0YVBhcmFtZXRlcnM+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiBzZWxlY3RlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25Sb3dTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFRMaXN0SXRlbT4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcm93IGhhcyBiZWVuIHVuc2VsZWN0ZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIG9uUm93VW5zZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFRMaXN0SXRlbT4oKTtcblxuICAvKipcbiAgICogVGhlIG1vZGUgaG93IHJvd3MgY2FuIGJlIHNlbGVjdGVkLlxuICAgKiBUaGUgZGVmYXVsdCBpcyBgbnVsbGAgd2hpY2ggbWVhbnMgcm93cyBjYW5ub3QgYmUgc2VsZWN0ZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2VsZWN0aW9uTW9kZTogXCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFibGUgcm93cyBhcmUgaGlnaGxpZ2h0ZWQgd2hlbiB0aGUgbW91c2UgaG92ZXJzIG92ZXIgdGhlbS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByb3dIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvd3MuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpOiBUTGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIF8uaXNBcnJheSh0aGlzLl9zZWxlY3Rpb24pID8gdGhpcy5fc2VsZWN0aW9uIDogW3RoaXMuX3NlbGVjdGlvbl07XG4gIH1cbiAgcHVibGljIHNldCBzZWxlY3Rpb24odmFsdWU6IFRMaXN0SXRlbVtdKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIF9zZWxlY3Rpb246IFRMaXN0SXRlbSB8IFRMaXN0SXRlbVtdID0gW107XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG5ldyBzZWxlY3Rpb24uXG4gICAqL1xuICBAT3V0cHV0KClcbiAgc2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VExpc3RJdGVtW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoXCJjb250ZXh0TWVudVwiKVxuICBjb250ZXh0TWVudT86IENvbnRleHRNZW51O1xuXG4gIHByaXZhdGUgX2NvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcbiAgcHVibGljIGdldCBjb250ZXh0TWVudUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0TWVudUl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSBpcyBjdXJyZW50bHkgbG9hZGluZy5cbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSB3aGlsZSBsb2FkaW5nIG5ldyBpdGVtcyBmcm9tIHRoZSBiYWNrZW5kIHdoZW4gcmVhY3RpbmcgdG8gdGhlIGBvbkZpbHRlck9yU29ydENoYW5nZWRgIGV2ZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGlzTG9hZGluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2NvbHVtbnM6IFByb3BlcnR5PFNpbXBsZVZhbHVlLCBzdHJpbmcsIHN0cmluZz5bXSA9IFtdO1xuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogUHJvcGVydHk8U2ltcGxlVmFsdWUsIHN0cmluZywgc3RyaW5nPltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHByaXZhdGUgX3Jvd3NCZWZvcmVDdXJyZW50UGFnZTogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCByb3dzQmVmb3JlQ3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcm93c0JlZm9yZUN1cnJlbnRQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgX2RhdGVGb3JtYXQgPSBuZXcgRGF0ZSgzMzMzLCAxMCwgMjIpIC8vIG1vbnRocyBzdGFydCBhdCAwIGluIEpTXG4gICAgLnRvTG9jYWxlRGF0ZVN0cmluZygpXG4gICAgLnJlcGxhY2UoXCIyMlwiLCBcImRkXCIpXG4gICAgLnJlcGxhY2UoXCIxMVwiLCBcIk1NXCIpXG4gICAgLnJlcGxhY2UoXCIzMzMzXCIsIFwieXlcIilcbiAgICAucmVwbGFjZShcIjMzXCIsIFwieVwiKTtcblxuICBwdWJsaWMgZ2V0IGRhdGVGb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gUmVzdFdvcmxkVGFibGVDb21wb25lbnQuX2RhdGVGb3JtYXQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfdGltZUZvcm1hdCA9IG5ldyBEYXRlKDEsIDEsIDEsIDIyLCAzMywgNDQpXG4gICAgLnRvTG9jYWxlVGltZVN0cmluZygpXG4gICAgLnJlcGxhY2UoXCIyMlwiLCBcImhoXCIpXG4gICAgLnJlcGxhY2UoXCIzM1wiLCBcIm1tXCIpXG4gICAgLnJlcGxhY2UoXCI0NFwiLCBcInNzXCIpO1xuXG4gIHB1YmxpYyBnZXQgdGltZUZvcm1hdCgpIHtcbiAgICByZXR1cm4gUmVzdFdvcmxkVGFibGVDb21wb25lbnQuX3RpbWVGb3JtYXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFByb3BlcnR5VHlwZSgpOiB0eXBlb2YgUHJvcGVydHlUeXBlIHtcbiAgICByZXR1cm4gUHJvcGVydHlUeXBlO1xuICB9XG5cbiAgcHVibGljIGxvYWQoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCkge1xuICAgIHRoaXMubXVsdGlTb3J0TWV0YSA9IGV2ZW50Lm11bHRpU29ydE1ldGE7XG4gICAgdGhpcy5fcm93c0JlZm9yZUN1cnJlbnRQYWdlID0gZXZlbnQuZmlyc3QgPz8gMDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gT0RhdGFTZXJ2aWNlLmNyZWF0ZVBhcmFtZXRlcnNGcm9tVGFibGVMb2FkRXZlbnQoZXZlbnQsIHRoaXMuc2VhcmNoVGVtcGxhdGUpO1xuICAgIHRoaXMub25GaWx0ZXJPclNvcnRDaGFuZ2VkLmVtaXQocGFyYW1ldGVycyk7XG4gIH1cblxuICBwdWJsaWMgb3BlbkNvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50LCByb3c6IFRMaXN0SXRlbSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93Um93TWVudU9uUmlnaHRDbGljayB8fCB0aGlzLmNvbnRleHRNZW51ID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLl9jb250ZXh0TWVudUl0ZW1zID0gdGhpcy5yb3dNZW51KHJvdywgdHJ1ZSk7XG4gICAgdGhpcy5jb250ZXh0TWVudS5zaG93KGV2ZW50KTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJvd1NlbGVjdEludGVybmFsKGV2ZW50OiBUYWJsZVJvd1NlbGVjdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KGV2ZW50LmRhdGEpO1xuICB9XG5cbiAgcHVibGljIG9uUm93VW5zZWxlY3RJbnRlcm5hbChldmVudDogVGFibGVSb3dVblNlbGVjdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vblJvd1Vuc2VsZWN0LmVtaXQoZXZlbnQuZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2VJbnRlcm5hbChldmVudDogVExpc3RJdGVtIHwgVExpc3RJdGVtW10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KF8uaXNBcnJheShldmVudCkgPyBldmVudCA6IFtldmVudF0pO1xuICB9XG5cbiAgcHVibGljIHRvQ29sdW1uRmlsdGVyVHlwZShwcm9wZXJ0eVR5cGU6IFByb3BlcnR5VHlwZSkgOiBDb2x1bW5GaWx0ZXJUeXBle1xuICAgIHN3aXRjaChwcm9wZXJ0eVR5cGUpIHtcbiAgICAgIGNhc2UgUHJvcGVydHlUeXBlLk51bWJlcjpcbiAgICAgIGNhc2UgUHJvcGVydHlUeXBlLlBlcmNlbnQ6XG4gICAgICBjYXNlIFByb3BlcnR5VHlwZS5DdXJyZW5jeTpcbiAgICAgIGNhc2UgUHJvcGVydHlUeXBlLk1vbnRoOlxuICAgICAgICByZXR1cm4gQ29sdW1uRmlsdGVyVHlwZS5udW1lcmljO1xuICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIENvbHVtbkZpbHRlclR5cGUuYm9vbGVhbjtcbiAgICAgIGNhc2UgUHJvcGVydHlUeXBlLkRhdGU6XG4gICAgICBjYXNlIFByb3BlcnR5VHlwZS5EYXRldGltZUxvY2FsOlxuICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuRGF0ZXRpbWVPZmZzZXQ6XG4gICAgICAgIHJldHVybiBDb2x1bW5GaWx0ZXJUeXBlLmRhdGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gQ29sdW1uRmlsdGVyVHlwZS50ZXh0O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaG93SW5wdXRGaWVsZChjb2x1bW46IFByb3BlcnR5KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzRWRpdGFibGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBlZGl0UHJvcGVydHkgPSB0aGlzLmVkaXRQcm9wZXJ0aWVzW2NvbHVtbi5uYW1lXTtcblxuICAgIHJldHVybiBlZGl0UHJvcGVydHkgIT09IHVuZGVmaW5lZCAmJiBlZGl0UHJvcGVydHkudHlwZSAhPT0gUHJvcGVydHlUeXBlLkhpZGRlbiAmJiAhZWRpdFByb3BlcnR5LnJlYWRPbmx5O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGb3JtQXJyYXkoKTogdm9pZCB7XG4gICAgaWYoIXRoaXMuaXNFZGl0YWJsZSB8fCAhdGhpcy5yb3dzIHx8ICF0aGlzLmZvcm1BcnJheSB8fCAhdGhpcy5lZGl0VGVtcGxhdGUpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLmZvcm1BcnJheS5jbGVhcigpO1xuXG4gICAgY29uc3QgbmV3Q29udHJvbHMgPSB0aGlzLnJvd3NcbiAgICAgIC5tYXAociA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuX2Zvcm1TZXJ2aWNlLmNyZWF0ZUZvcm1Hcm91cEZyb21UZW1wbGF0ZSh0aGlzLmVkaXRUZW1wbGF0ZSEpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgZm9ybUdyb3VwLnBhdGNoVmFsdWUocik7XG4gICAgICAgIHJldHVybiBmb3JtR3JvdXA7XG4gICAgICB9KTtcblxuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBuZXdDb250cm9scylcbiAgICAgIHRoaXMuZm9ybUFycmF5LnB1c2goY29udHJvbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVkaXRQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0VGVtcGxhdGUpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLl9lZGl0UHJvcGVydGllcyA9IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmVkaXRUZW1wbGF0ZS5wcm9wZXJ0aWVzLm1hcChwID0+IFsgcC5uYW1lLCBwIF0pKTtcbiAgfVxufVxuIiwiPHAtdGFibGVcbiAgI3RhYmxlXG4gIFt2YWx1ZV09XCJyb3dzXCJcbiAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gIFtsYXp5XT1cInRydWVcIlxuICBbbGF6eUxvYWRPbkluaXRdPVwiZmFsc2VcIlxuICAob25MYXp5TG9hZCk9XCJsb2FkKCRldmVudClcIlxuICByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgW3BhZ2luYXRvcl09XCJ0cnVlXCJcbiAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZU9wdGlvbnNcIlxuICBbcm93c109XCJyb3dzLmxlbmd0aFwiXG4gIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgc29ydE1vZGU9XCJtdWx0aXBsZVwiXG4gIFttdWx0aVNvcnRNZXRhXT1cIm11bHRpU29ydE1ldGFcIlxuICBbc3R5bGVDbGFzc109XCJzdHlsZUNsYXNzXCJcbiAgW3RhYmxlU3R5bGVdPVwidGFibGVTdHlsZVwiXG4gIFtzY3JvbGxhYmxlXT1cInNjcm9sbGFibGVcIlxuICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXG4gIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIlxuICAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3RJbnRlcm5hbCgkZXZlbnQpXCJcbiAgKG9uUm93VW5zZWxlY3QpPVwib25Sb3dVbnNlbGVjdEludGVybmFsKCRldmVudClcIlxuICBbcm93SG92ZXJdPVwicm93SG92ZXJcIlxuICBbKHNlbGVjdGlvbildPVwiX3NlbGVjdGlvblwiXG4gIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2VJbnRlcm5hbCgkZXZlbnQpXCI+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxuICAgIDx0cj5cbiAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLm5hbWVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWQtZmxleCBwLWpjLWJldHdlZW4gcC1haS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICB7e2NvbC5wcm9tcHR9fVxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sLnJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLm5hbWVcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwidG9Db2x1bW5GaWx0ZXJUeXBlKGNvbC50eXBlKVwiIFtmaWVsZF09XCJjb2wubmFtZVwiIGRpc3BsYXk9XCJtZW51XCI+PC9wLWNvbHVtbkZpbHRlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGggKm5nSWY9XCJzaG93TWVudUNvbHVtblwiIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgPHJ3LW1lbnUtYnV0dG9uIFtpdGVtc109XCJoZWFkZXJNZW51XCI+PC9ydy1tZW51LWJ1dHRvbj5cbiAgICAgICAgPC90aD5cbiAgICA8L3RyPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWVudGl0eSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiPlxuICAgIDx0ciAoY29udGV4dG1lbnUpPVwib3BlbkNvbnRleHRNZW51KCRldmVudCwgZW50aXR5KVwiIFtwU2VsZWN0YWJsZVJvd109XCJlbnRpdHlcIiBbcFNlbGVjdGFibGVSb3dEaXNhYmxlZF09XCJzZWxlY3Rpb25Nb2RlID09PSBudWxsXCIgW2NsYXNzTmFtZV09XCJyb3dTdHlsZUNsYXNzZXNbcm93SW5kZXggLSAodGFibGUuZmlyc3QgPz8gMCldXCI+XG4gICAgICA8dGQgW25nU3dpdGNoXT1cImNvbC50eXBlXCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCIgW2NsYXNzTmFtZV09XCJjZWxsU3R5bGVDbGFzc2VzW3Jvd0luZGV4IC0gKHRhYmxlLmZpcnN0ID8/IDApXVtjb2wubmFtZV1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0lucHV0RmllbGQoY29sKTsgZWxzZSB0ZXh0RmllbGRcIiBbZm9ybUdyb3VwXT1cImZvcm1BcnJheSEuY29udHJvbHNbcm93SW5kZXggLSAodGFibGUuZmlyc3QgPz8gMCldXCIgPlxuICAgICAgICAgICAgPHJ3LWlucHV0IFthcGlOYW1lXT1cImFwaU5hbWUhXCIgW3Byb3BlcnR5XT1cImVkaXRQcm9wZXJ0aWVzW2NvbC5uYW1lXVwiPjwvcnctaW5wdXQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICN0ZXh0RmllbGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuVGV4dFwiPlxuICAgICAgICAgICAgICAgIDxydy1hdmF0YXIgKm5nSWY9XCJjb2wubmFtZSA9PT0gJ2NyZWF0ZWRCeScgfHwgY29sLm5hbWUgPT09ICdsYXN0Q2hhbmdlZEJ5J1wiIFt1c2VyXT1cImVudGl0eVtjb2wubmFtZV1cIj48L3J3LWF2YXRhcj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbC5uYW1lICE9PSAnY3JlYXRlZEJ5JyAmJiBjb2wubmFtZSAhPT0gJ2xhc3RDaGFuZ2VkQnknXCI+e3tlbnRpdHlbY29sLm5hbWVdfX08L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuTnVtYmVyXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj57e2VudGl0eVtjb2wubmFtZV0gfCBwcm9wZXJ0eVR5cGVGb3JtYXQ6Y29sLnR5cGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuUGVyY2VudFwiIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+e3tlbnRpdHlbY29sLm5hbWVdIHwgcHJvcGVydHlUeXBlRm9ybWF0OmNvbC50eXBlfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLkN1cnJlbmN5XCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj57e2VudGl0eVtjb2wubmFtZV0gfCBwcm9wZXJ0eVR5cGVGb3JtYXQ6Y29sLnR5cGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuQm9vbFwiIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+PHAtdHJpU3RhdGVDaGVja2JveCBbKG5nTW9kZWwpXT1cImVudGl0eVtjb2wubmFtZV1cIiBbcmVhZG9ubHldPVwidHJ1ZVwiPjwvcC10cmlTdGF0ZUNoZWNrYm94Pjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRGF0ZVwiIFtwVG9vbHRpcF09XCJlbnRpdHlbY29sLm5hbWVdXCI+e3tlbnRpdHlbY29sLm5hbWVdIHwgcHJvcGVydHlUeXBlRm9ybWF0OmNvbC50eXBlfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlRpbWVcIiBbcFRvb2x0aXBdPVwiZW50aXR5W2NvbC5uYW1lXVwiPnt7ZW50aXR5W2NvbC5uYW1lXSB8IHByb3BlcnR5VHlwZUZvcm1hdDpjb2wudHlwZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EdXJhdGlvblwiIFtwVG9vbHRpcF09XCJlbnRpdHlbY29sLm5hbWVdXCI+e3tlbnRpdHlbY29sLm5hbWVdIHwgcHJvcGVydHlUeXBlRm9ybWF0OmNvbC50eXBlfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLkRhdGV0aW1lTG9jYWxcIiBbcFRvb2x0aXBdPVwiZW50aXR5W2NvbC5uYW1lXVwiPnt7ZW50aXR5W2NvbC5uYW1lXSB8IHByb3BlcnR5VHlwZUZvcm1hdDpQcm9wZXJ0eVR5cGUuRGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EYXRldGltZU9mZnNldFwiIFtwVG9vbHRpcF09XCJlbnRpdHlbY29sLm5hbWVdXCI+e3tlbnRpdHlbY29sLm5hbWVdIHwgcHJvcGVydHlUeXBlRm9ybWF0OlByb3BlcnR5VHlwZS5EYXRlfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLkNvbGxlY3Rpb25cIiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPjxwICpuZ0Zvcj1cImxldCBhcnJheUVsZW1lbnQgb2YgZW50aXR5W2NvbC5uYW1lXVwiPnt7YXJyYXlFbGVtZW50IHwganNvbn19PC9wPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuT2JqZWN0XCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj57e2VudGl0eVtjb2wubmFtZV0gfCBqc29ufX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IFtwVG9vbHRpcF09XCJlbnRpdHlbY29sLm5hbWVdXCI+e3tlbnRpdHlbY29sLm5hbWVdIHwgcHJvcGVydHlUeXBlRm9ybWF0OmNvbC50eXBlfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkICpuZ0lmPVwic2hvd01lbnVDb2x1bW5cIiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgIDxydy1tZW51LWJ1dHRvbiAqbmdJZj1cInNob3dSb3dNZW51QXNDb2x1bW5cIiBbaXRlbXNdPVwicm93TWVudXNbcm93SW5kZXggLSAodGFibGUuZmlyc3QgPz8gMCldXCI+PC9ydy1tZW51LWJ1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxwLWNvbnRleHRNZW51ICNjb250ZXh0TWVudSBhcHBlbmRUbz1cImJvZHlcIiBbbW9kZWxdPVwiY29udGV4dE1lbnVJdGVtc1wiPjwvcC1jb250ZXh0TWVudT5cbjwvcC10YWJsZT5cbiJdfQ==
|
|
482
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvY29tcG9uZW50cy9yZXN0d29ybGQtdGFibGUvcmVzdHdvcmxkLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvY29tcG9uZW50cy9yZXN0d29ybGQtdGFibGUvcmVzdHdvcmxkLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXlCLFlBQVksRUFBZSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsZUFBZSxFQUFzQixNQUFNLGFBQWEsQ0FBQztBQUVsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFN0QsT0FBTyxFQUFtQixnQkFBZ0IsRUFBYSxhQUFhLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFHeEcsSUFBSyxnQkFLSjtBQUxELFdBQUssZ0JBQWdCO0lBQ25CLGlDQUFhLENBQUE7SUFDYix1Q0FBbUIsQ0FBQTtJQUNuQix1Q0FBbUIsQ0FBQTtJQUNuQixpQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUxJLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFLcEI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFVSCxNQUFNLE9BQU8sdUJBQXVCO0lBc05mO0lBQ0E7SUF0Tm5COzs7T0FH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QkF3QkssY0FBYztzQkFEeEIsS0FBSztnQkFZQyxZQUFZO3NCQURsQixLQUFLO2dCQTRCQyxVQUFVO3NCQURoQixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBUUMsVUFBVTtzQkFEaEIsS0FBSztnQkFRQyxZQUFZO3NCQURsQixLQUFLO2dCQVNDLHFCQUFxQjtzQkFEM0IsTUFBTTtnQkFPQSxXQUFXO3NCQURqQixNQUFNO2dCQU9BLGFBQWE7c0JBRG5CLE1BQU07Z0JBUUEsYUFBYTtzQkFEbkIsS0FBSztnQkFPQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0ssU0FBUztzQkFEbkIsS0FBSztnQkFjTixlQUFlO3NCQURkLE1BQU07Z0JBSVAsV0FBVztzQkFEVixTQUFTO3VCQUFDLGFBQWE7Z0JBYWpCLFNBQVM7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtU2VydmljZSwgUHJvcGVydHksIFByb3BlcnR5VHlwZSwgU2ltcGxlVmFsdWUsIFRlbXBsYXRlIH0gZnJvbSAnQHdlcnR6dWkvbmd4LWhhbC1jbGllbnQnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRmlsdGVyTWF0Y2hNb2RlLCBNZW51SXRlbSwgU29ydE1ldGEgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBPRGF0YVBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9tb2RlbHMvby1kYXRhJztcbmltcG9ydCB7IE9EYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL28tZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAncHJpbWVuZy9jb250ZXh0bWVudSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xDb250YWluZXIsIEZvcm1BcnJheSwgRm9ybUFycmF5TmFtZSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVGFibGVMYXp5TG9hZEV2ZW50LCBUYWJsZVJvd1NlbGVjdEV2ZW50LCBUYWJsZVJvd1VuU2VsZWN0RXZlbnQgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcblxuZW51bSBDb2x1bW5GaWx0ZXJUeXBlIHtcbiAgdGV4dCA9ICd0ZXh0JyxcbiAgbnVtZXJpYyA9ICdudW1lcmljJyxcbiAgYm9vbGVhbiA9ICdib29sZWFuJyxcbiAgZGF0ZSA9ICdkYXRlJ1xufVxuXG4vKipcbiAqIERpc3BsYXlzIGEgdGFibGUgYmFzZWQgb24gYSBzZWFyY2gtLCBhbiBlZGl0LXRlbXBsYXRlIGFuZCBhIGxpc3Qgb2YgaXRlbXMuXG4gKiBUaGUgc2VhcmNoLXRlbXBsYXRlIGlzIHJlcXVpcmVkIGFuZCB1c2VkIHRvIGRpc3BsYXkgdGhlIHRhYmxlIGNvbHVtbnMgYW5kIHRvIGZpbHRlciBhbmQgc29ydCB0aGUgaXRlbXMuXG4gKiBUaGUgZWRpdC10ZW1wbGF0ZSBpcyBvcHRpb25hbCBhbmQgdXNlZCB0byBlZGl0IHRoZSBpdGVtcy4gRm9yIHRoZSBlZGl0IGNhcGFiaWxpdHksIHRoZSB0YWJsZSBtdXN0IGJlIHBhcnQgb2YgYSByZWFjdGl2ZSBmb3JtLlxuICogVGhlIGl0ZW1zIGFyZSBkaXNwbGF5ZWQgYXMgdGFibGUgcm93cy5cbiAqIFRoZSB0YWJsZSBzdXBwb3J0cyBsYXp5IGxvYWRpbmcsIHJvdyBzZWxlY3Rpb24sIHJvdyBtZW51cywgYW5kIGNvbnRleHQgbWVudXMuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiA8cnctdGFibGVcbiAqICAgW2FwaU5hbWVdPVwiYXBpTmFtZVwiXG4gKiAgIFtzZWFyY2hUZW1wbGF0ZV09XCJzZWFyY2hUZW1wbGF0ZVwiXG4gKiAgIFtlZGl0VGVtcGxhdGVdPVwiZWRpdFRlbXBsYXRlXCJcbiAqICAgW3Jvd3NdPVwicm93c1wiXG4gKiAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiWzEwLCAyNSwgNTBdXCJcbiAqICAgW2hlYWRlck1lbnVdPVwiaGVhZGVyTWVudVwiXG4gKiAgIFtyb3dNZW51XT1cInJvd01lbnVcIlxuICogICBbcm93U3R5bGVDbGFzc109XCJyb3dTdHlsZUNsYXNzXCJcbiAqICAgW2NlbGxTdHlsZUNsYXNzXT1cImNlbGxTdHlsZUNsYXNzXCJcbiAqICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIlxuICogICBbbXVsdGlTb3J0TWV0YV09XCJtdWx0aVNvcnRNZXRhXCJcbiAqICAgW3N0eWxlQ2xhc3NdPVwic3R5bGVDbGFzc1wiXG4gKiAgIFt0YWJsZVN0eWxlXT1cInRhYmxlU3R5bGVcIlxuICogICBbc2Nyb2xsYWJsZV09XCJzY3JvbGxhYmxlXCJcbiAqICAgW3Njcm9sbEhlaWdodF09XCJzY3JvbGxIZWlnaHRcIlxuICogICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCJcbiAqICAgW3Jvd0hvdmVyXT1cInJvd0hvdmVyXCJcbiAqICAgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIlxuICogICBbY29udGV4dE1lbnVJdGVtc109XCJjb250ZXh0TWVudUl0ZW1zXCJcbiAqICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICogICAob25GaWx0ZXJPclNvcnRDaGFuZ2VkKT1cIm9uRmlsdGVyT3JTb3J0Q2hhbmdlZCgkZXZlbnQpXCJcbiAqICAgKG9uUm93U2VsZWN0KT1cIm9uUm93U2VsZWN0KCRldmVudClcIlxuICogICAob25Sb3dVbnNlbGVjdCk9XCJvblJvd1Vuc2VsZWN0KCRldmVudClcIlxuICogICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gKiA8L3J3LXRhYmxlPlxuICogXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3J3LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc3R3b3JsZC10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC10YWJsZS5jb21wb25lbnQuY3NzJ10sXG4gIHZpZXdQcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcbiAgICBkZXBzOiBbW09wdGlvbmFsLCBGb3JtQXJyYXlOYW1lXV0sXG4gICAgdXNlRmFjdG9yeTogKGFycmF5TmFtZTogRm9ybUFycmF5TmFtZSkgPT4gYXJyYXlOYW1lLCB9XVxuICB9KVxuZXhwb3J0IGNsYXNzIFJlc3RXb3JsZFRhYmxlQ29tcG9uZW50PFRMaXN0SXRlbSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhcGkuXG4gICAqIEZvciB0aGUgZWRpdGluZyBjYXBhYmlsaXR5LCB5b3UgbXVzdCBhbHNvIHNldCB0aGUgZWRpdFRlbXBsYXRlIGFuZCB0aGUgZm9ybUFycmF5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFwaU5hbWU/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfZm9ybUFycmF5PzogRm9ybUFycmF5PEZvcm1Hcm91cDx7W0sgaW4ga2V5b2YgVExpc3RJdGVtXSA6IEFic3RyYWN0Q29udHJvbDx1bmtub3duPn0+PjtcblxuICAvKipcbiAgICogVGhlIGZvcm0gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZm9ybSBncm91cHMgZm9yIHRoZSBpdGVtcy5cbiAgICogQmluZCB0aGlzIHRvIHRoZSBmb3JtIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGZvcm0gZ3JvdXBzIGZvciB0aGUgaXRlbXMuXG4gICAqIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IHJlcHJlc2VudHMgb25lIHJvdyBpbiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlIG9mIHRoZSB0YWJsZS5cbiAgICogRm9yIHRoZSBlZGl0aW5nIGNhcGFiaWxpdHksIHlvdSBtdXN0IGFsc28gc2V0IHRoZSBhcGlOYW1lIGFuZCB0aGUgZWRpdFRlbXBsYXRlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmb3JtQXJyYXkodmFsdWU6IEZvcm1BcnJheTxGb3JtR3JvdXA8e1tLIGluIGtleW9mIFRMaXN0SXRlbV0gOiBBYnN0cmFjdENvbnRyb2w8dW5rbm93bj59Pj4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9mb3JtQXJyYXkgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybUFycmF5KCk6IEZvcm1BcnJheTxGb3JtR3JvdXA8e1tLIGluIGtleW9mIFRMaXN0SXRlbV0gOiBBYnN0cmFjdENvbnRyb2w8dW5rbm93bj59Pj4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtQXJyYXkgPz8gdGhpcy5fY29udHJvbENvbnRhaW5lcj8uY29udHJvbCBhcyBGb3JtQXJyYXk8Rm9ybUdyb3VwPHtbSyBpbiBrZXlvZiBUTGlzdEl0ZW1dIDogQWJzdHJhY3RDb250cm9sPHVua25vd24+fT4+IHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VhcmNoVGVtcGxhdGU6IFRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHtwcm9wZXJ0aWVzOiBbXX0pO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgdGhhdCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHRhYmxlIGNvbHVtbnMgYW5kIHRvIGZpbHRlciBhbmQgc29ydCB0aGUgaXRlbXMuXG4gICAqIEJpbmQgdGhpcyB0byB0aGUgdGVtcGxhdGUgdGhhdCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHRhYmxlIGNvbHVtbnMgYW5kIHRvIGZpbHRlciBhbmQgc29ydCB0aGUgaXRlbXMuXG4gICAqIE5vcm1hbGx5IHRoaXMgaXMgcmV0dXJuZWQgZnJvbSB0aGUgYmFja2VuZCBhcyBwYXJ0IG9mIHRoZSBoYWwtZm9ybXMgcmVzb3VyY2UgZnJvbSBhIGxpc3QgZW5kcG9pbnQuXG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBwdWJsaWMgc2V0IHNlYXJjaFRlbXBsYXRlKHZhbHVlOiBUZW1wbGF0ZSl7XG4gICAgdGhpcy5fc2VhcmNoVGVtcGxhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLl9jb2x1bW5zID0gdmFsdWU/LnByb3BlcnRpZXMuZmlsdGVyKHAgPT4gcC50eXBlICE9PSBQcm9wZXJ0eVR5cGUuSGlkZGVuKSA/PyBbXTtcbiAgICB0aGlzLnNldFNvcnRGaWVsZEFuZFNvcnRPcmRlcih2YWx1ZSlcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VhcmNoVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaFRlbXBsYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZWRpdFRlbXBsYXRlPzogVGVtcGxhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSB0aGF0IGlzIHVzZWQgdG8gZWRpdCB0aGUgaXRlbXMuXG4gICAqIEJpbmQgdGhpcyB0byB0aGUgdGVtcGxhdGUgdGhhdCBpcyB1c2VkIHRvIGVkaXQgdGhlIGl0ZW1zLlxuICAgKiBOb3JtYWxseSB0aGlzIGlzIHJldHVybmVkIGZyb20gdGhlIGJhY2tlbmQgYXMgcGFydCBvZiB0aGUgaGFsLWZvcm1zIHJlc291cmNlIGZyb20gYSBsaXN0IGVuZHBvaW50LlxuICAgKiBGb3IgdGhlIGVkaXRpbmcgY2FwYWJpbGl0eSwgeW91IG11c3QgYWxzbyBzZXQgdGhlIGFwaU5hbWUgYW5kIHRoZSBmb3JtQXJyYXkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGVkaXRUZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGUgfCB1bmRlZmluZWQpe1xuICAgIHRoaXMuX2VkaXRUZW1wbGF0ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlRWRpdFByb3BlcnRpZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1BcnJheSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBlZGl0VGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRUZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2VkaXRQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eTxTaW1wbGVWYWx1ZSwgc3RyaW5nLCBzdHJpbmc+PiA9IHt9O1xuICBwdWJsaWMgZ2V0IGVkaXRQcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9lZGl0UHJvcGVydGllcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFZGl0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0VGVtcGxhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZvcm1BcnJheSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYXBpTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jvd3M6IFRMaXN0SXRlbVtdID0gW107XG4gIHB1YmxpYyBnZXQgcm93cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaXRlbXMgdGhhdCBhcmUgZGlzcGxheWVkIGFzIHRhYmxlIHJvd3MuXG4gICAqIEJpbmQgdGhpcyB0byB0aGUgaXRlbXMgdGhhdCBhcmUgZGlzcGxheWVkIGFzIHRhYmxlIHJvd3MuXG4gICAqIE5vcm1hbGx5IHRoaXMgaXMgcmV0dXJuZWQgZnJvbSB0aGUgYmFja2VuZCBhcyBwYXJ0IG9mIHRoZSBoYWwtZm9ybXMgcmVzb3VyY2UgZnJvbSBhIGxpc3QgZW5kcG9pbnQuXG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBwdWJsaWMgc2V0IHJvd3ModmFsdWU6IFRMaXN0SXRlbVtdKSB7XG4gICAgdGhpcy5fcm93cyA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlQ2FsY3VsYXRlZEZ1bmN0aW9uVmFsdWVzKHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1BcnJheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS5cbiAgICogVGhlIGRlZmF1bHQgaXMgWzEwLCAyNSwgNTBdLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHJvd3NQZXJQYWdlT3B0aW9ucyA9IFsxMCwgMjUsIDUwXTtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbWVudSB0aGF0IGlzIGRpc3BsYXllZCBhdCB0aGUgdG9wIHJpZ2h0IG9mIHRoZSB0YWJsZS5cbiAgICogQHNlZSBSZXN0V29ybGRNZW51QnV0dG9uQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVhZGVyTWVudTogTWVudUl0ZW1bXSA9IFtdO1xuXG4gIHByaXZhdGUgX3Jvd01lbnU6IChyb3c6IFRMaXN0SXRlbSwgb3BlbmVkQnlSaWdodENsaWNrOiBib29sZWFuKSA9PiBNZW51SXRlbVtdID0gKCkgPT4gW107XG4gIHB1YmxpYyBnZXQgcm93TWVudSgpOiAocm93OiBUTGlzdEl0ZW0sIG9wZW5lZEJ5UmlnaHRDbGljazogYm9vbGVhbikgPT4gTWVudUl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd01lbnU7XG4gIH1cblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1lbnUgZm9yIGEgcm93LlxuICAgKiBCYXNlZCBvbiB0aGUgb3BlbmVkQnlSaWdodENsaWNrIHBhcmFtZXRlciwgdGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gZGlmZmVyZW50IG1lbnVzLlxuICAgKiBUaGUgbWVudSB3aGVuIGl0IGhhcyBub3QgYmVlbiBvcGVuZWQgYnkgYSByaWdodCBjbGljayBpcyBkaXNwbGF5ZWQgaW4gYW4gZXh0cmEgY29sdW1uIHRvIHRoZSByaWdodCBvZiB0aGUgdGFibGUgaWYgYHNob3dSb3dNZW51QXNDb2x1bW5gIGlzIGB0cnVlYC5cbiAgICogVGhlIG1lbnUgd2hlbiBpdCBoYXMgYmVlbiBvcGVuZWQgYnkgYSByaWdodCBjbGljayBpcyBkaXNwbGF5ZWQgYXMgYSBjb250ZXh0IG1lbnUgaWYgYHNob3dSb3dNZW51T25SaWdodENsaWNrYCBpcyBgdHJ1ZWAuXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBtZW51LlxuICAgKiBAcGFyYW0gb3BlbmVkQnlSaWdodENsaWNrIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtZW51IHdhcyBvcGVuZWQgYnkgYSByaWdodCBjbGljay5cbiAgICogQHJldHVybnMgVGhlIG1lbnUgZm9yIHRoZSByb3cuXG4gICAqIEBzZWUgc2hvd1Jvd01lbnVBc0NvbHVtblxuICAgKiBAc2VlIHNob3dSb3dNZW51T25SaWdodENsaWNrXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHJvd01lbnUodmFsdWU6IChyb3c6IFRMaXN0SXRlbSwgb3BlbmVkQnlSaWdodENsaWNrOiBib29sZWFuKSA9PiBNZW51SXRlbVtdKSB7XG4gICAgdGhpcy5fcm93TWVudSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlUm93TWVudXModGhpcy5yb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jvd01lbnVzOiBNZW51SXRlbVtdW10gPSBbXTtcblxuICBwcml2YXRlIHVwZGF0ZUNhbGN1bGF0ZWRGdW5jdGlvblZhbHVlcyh2YWx1ZTogVExpc3RJdGVtW10pIHtcbiAgICB0aGlzLnVwZGF0ZVJvd01lbnVzKHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVJvd1N0eWxlcyh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVDZWxsU3R5bGVzKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2VsbFN0eWxlcyh2YWx1ZTogVExpc3RJdGVtW10pIHtcbiAgICB0aGlzLl9jZWxsU3R5bGVDbGFzc2VzID0gdmFsdWUubWFwKChyLCByaSkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuY29sdW1ucy5tYXAoKGMsIGNpKSA9PiBbYy5uYW1lLCB0aGlzLmNlbGxTdHlsZUNsYXNzKHIsIGMsIHJpLCBjaSldKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSb3dTdHlsZXModmFsdWU6IFRMaXN0SXRlbVtdKSB7XG4gICAgdGhpcy5fcm93U3R5bGVDbGFzc2VzID0gdmFsdWUubWFwKChyLCBpKSA9PiB0aGlzLnJvd1N0eWxlQ2xhc3MociwgaSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSb3dNZW51cyh2YWx1ZTogVExpc3RJdGVtW10pIHtcbiAgICBpZiAodGhpcy5zaG93Um93TWVudUFzQ29sdW1uKVxuICAgICAgdGhpcy5fcm93TWVudXMgPSB2YWx1ZS5tYXAociA9PiB0aGlzLnJvd01lbnUociwgZmFsc2UpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm93TWVudXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd01lbnVzO1xuICB9XG5cbiAgcHVibGljIGdldCBzaG93TWVudUNvbHVtbigpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJNZW51Lmxlbmd0aCA+IDAgfHwgKHRoaXMuc2hvd1Jvd01lbnVBc0NvbHVtbiAmJiB0aGlzLnJvd01lbnVzLnNvbWUobSA9PiBtLmxlbmd0aCA+IDApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcm93IG1lbnUgaXMgZGlzcGxheWVkIGFzIGEgY29sdW1uIHRvIHRoZSByaWdodCBvZiB0aGUgdGFibGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1Jvd01lbnVBc0NvbHVtbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSByb3cgbWVudSBpcyBkaXNwbGF5ZWQgYXMgYSBjb250ZXh0IG1lbnUgd2hlbiB0aGUgdXNlciByaWdodCBjbGlja3Mgb24gYSByb3cuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1Jvd01lbnVPblJpZ2h0Q2xpY2sgPSB0cnVlO1xuXG4gIHByaXZhdGUgX3Jvd1N0eWxlQ2xhc3M6IChyb3c6IFRMaXN0SXRlbSwgcm93SW5kZXg6IG51bWJlcikgPT4gc3RyaW5nID0gKCkgPT4gXCJcIjtcbiAgcHVibGljIGdldCByb3dTdHlsZUNsYXNzKCk6IChyb3c6IFRMaXN0SXRlbSwgcm93SW5kZXg6IG51bWJlcikgPT4gc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcm93U3R5bGVDbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgc3R5bGUgY2xhc3MgZm9yIGEgcm93LlxuICAgKiBAcGFyYW0gcm93IFRoZSByb3cgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgc3R5bGUgY2xhc3MuXG4gICAqIEBwYXJhbSByb3dJbmRleCBUaGUgaW5kZXggb2YgdGhlIHJvdyBvbiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlLlxuICAgKiBAcmV0dXJucyBUaGUgc3R5bGUgY2xhc3MgZm9yIHRoZSByb3cuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHJvd1N0eWxlQ2xhc3ModmFsdWU6IChyb3c6IFRMaXN0SXRlbSwgcm93SW5kZXg6IG51bWJlcikgPT4gc3RyaW5nKSB7XG4gICAgdGhpcy5fcm93U3R5bGVDbGFzcyA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlUm93U3R5bGVzKHRoaXMucm93cyk7XG4gIH1cblxuICBwcml2YXRlIF9yb3dTdHlsZUNsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBnZXQgcm93U3R5bGVDbGFzc2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3dTdHlsZUNsYXNzZXM7XG4gIH1cblxuICBwcml2YXRlIF9jZWxsU3R5bGVDbGFzczogKHJvdzogVExpc3RJdGVtLCBjb2x1bW46IFByb3BlcnR5PFNpbXBsZVZhbHVlLCBzdHJpbmcsIHN0cmluZz4sIHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbkluZGV4OiBudW1iZXIpID0+IHN0cmluZyA9ICgpID0+IFwiXCI7XG4gIHB1YmxpYyBnZXQgY2VsbFN0eWxlQ2xhc3MoKTogKHJvdzogVExpc3RJdGVtLCBjb2x1bW46IFByb3BlcnR5PFNpbXBsZVZhbHVlLCBzdHJpbmcsIHN0cmluZz4sIHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbkluZGV4OiBudW1iZXIpID0+IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbGxTdHlsZUNsYXNzO1xuICB9XG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgc3R5bGUgY2xhc3MgZm9yIGEgY2VsbC5cbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IGZvciB3aGljaCB0byByZXR1cm4gdGhlIHN0eWxlIGNsYXNzLlxuICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgc3R5bGUgY2xhc3MuXG4gICAqIEBwYXJhbSByb3dJbmRleCBUaGUgaW5kZXggb2YgdGhlIHJvdyBvbiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlLlxuICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4uXG4gICAqIEByZXR1cm5zIFRoZSBzdHlsZSBjbGFzcyBmb3IgdGhlIGNlbGwuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNlbGxTdHlsZUNsYXNzKHZhbHVlOiAocm93OiBUTGlzdEl0ZW0sIGNvbHVtbjogUHJvcGVydHk8U2ltcGxlVmFsdWUsIHN0cmluZywgc3RyaW5nPiwgcm93SW5kZXg6IG51bWJlciwgY29sdW1uSW5kZXg6IG51bWJlcikgPT4gc3RyaW5nKSB7XG4gICAgdGhpcy5fY2VsbFN0eWxlQ2xhc3MgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUNlbGxTdHlsZXModGhpcy5yb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NlbGxTdHlsZUNsYXNzZXM6IFJlY29yZDxzdHJpbmcsc3RyaW5nPltdID0gW107XG4gIHB1YmxpYyBnZXQgY2VsbFN0eWxlQ2xhc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY2VsbFN0eWxlQ2xhc3NlcztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0b3RhbFJlY29yZHMgPSAwO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Zvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSwpIHtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U29ydEZpZWxkQW5kU29ydE9yZGVyKHRlbXBsYXRlOiBUZW1wbGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG9yZGVyQnkgPSB0ZW1wbGF0ZT8ucHJvcGVydGllcz8uZmluZChwID0+IHA/Lm5hbWUgPT09IFwiJG9yZGVyYnlcIik/LnZhbHVlO1xuXG4gICAgaWYob3JkZXJCeSA9PT0gbnVsbCB8fCBvcmRlckJ5ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG9yZGVyQnkgIT09ICdzdHJpbmcnKVxuICAgIHJldHVybjtcblxuICAgIGNvbnN0IFtmaWVsZCwgb3JkZXJdID0gb3JkZXJCeS5zcGxpdChcIiBcIik7XG4gICAgY29uc3Qgb3JkZXJBc051bWJlciA9IG9yZGVyPy50b0xvd2VyQ2FzZSgpID09PSBcImRlc2NcIiA/IC0xIDogMTtcblxuICAgIGlmICh0aGlzLm11bHRpU29ydE1ldGE/Lmxlbmd0aCAhPT0gMSB8fCB0aGlzLm11bHRpU29ydE1ldGFbMF0uZmllbGQgIT09IGZpZWxkIHx8IHRoaXMubXVsdGlTb3J0TWV0YVswXS5vcmRlciAhPT0gb3JkZXJBc051bWJlcilcbiAgICAgIHRoaXMubXVsdGlTb3J0TWV0YSA9IFt7ZmllbGQ6IGZpZWxkLCBvcmRlcjogb3JkZXJBc051bWJlcn1dXG4gIH1cblxuICBwdWJsaWMgbXVsdGlTb3J0TWV0YT86IFNvcnRNZXRhW10gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3R5bGUgY2xhc3MgZm9yIHRoZSB0YWJsZS5cbiAgICogVGhlIGRlZmF1bHQgaXMgXCJcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzdHlsZUNsYXNzOiBzdHJpbmcgPSBcIlwiO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5saW5lIHN0eWxlIGZvciB0aGUgdGFibGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdGFibGVTdHlsZT86IFJlY29yZDxzdHJpbmcsc3RyaW5nPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhYmxlIGlzIHNjcm9sbGFibGUuXG4gICAqIFRoZSBkZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzY3JvbGxhYmxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgc2Nyb2xsYWJsZSB0YWJsZS5cbiAgICogVGhlIGRlZmF1bHQgaXMgXCJmbGV4XCIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSBcImZsZXhcIjtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBmaWx0ZXIgb3Igc29ydCBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZC5cbiAgICogU3Vic2NyaWJlIHRvIHRoaXMgZXZlbnQgdG8gbG9hZCB0aGUgaXRlbXMgZnJvbSB0aGUgYmFja2VuZC5cbiAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGNvcmUgZmVhdHVyZXMgb2YgdGhlIHRhYmxlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvbkZpbHRlck9yU29ydENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE9EYXRhUGFyYW1ldGVycz4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcm93IGhhcyBiZWVuIHNlbGVjdGVkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvblJvd1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8VExpc3RJdGVtPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSByb3cgaGFzIGJlZW4gdW5zZWxlY3RlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25Sb3dVbnNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8VExpc3RJdGVtPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBob3cgcm93cyBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqIFRoZSBkZWZhdWx0IGlzIGBudWxsYCB3aGljaCBtZWFucyByb3dzIGNhbm5vdCBiZSBzZWxlY3RlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWxlY3Rpb25Nb2RlOiBcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwiIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSByb3dzIGFyZSBoaWdobGlnaHRlZCB3aGVuIHRoZSBtb3VzZSBob3ZlcnMgb3ZlciB0aGVtLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHJvd0hvdmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm93cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgc2VsZWN0aW9uKCk6IFRMaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gXy5pc0FycmF5KHRoaXMuX3NlbGVjdGlvbikgPyB0aGlzLl9zZWxlY3Rpb24gOiBbdGhpcy5fc2VsZWN0aW9uXTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlbGVjdGlvbih2YWx1ZTogVExpc3RJdGVtW10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgX3NlbGVjdGlvbjogVExpc3RJdGVtIHwgVExpc3RJdGVtW10gPSBbXTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbmV3IHNlbGVjdGlvbi5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBzZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxUTGlzdEl0ZW1bXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZChcImNvbnRleHRNZW51XCIpXG4gIGNvbnRleHRNZW51PzogQ29udGV4dE1lbnU7XG5cbiAgcHJpdmF0ZSBfY29udGV4dE1lbnVJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuICBwdWJsaWMgZ2V0IGNvbnRleHRNZW51SXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHRNZW51SXRlbXM7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhYmxlIGlzIGN1cnJlbnRseSBsb2FkaW5nLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHdoaWxlIGxvYWRpbmcgbmV3IGl0ZW1zIGZyb20gdGhlIGJhY2tlbmQgd2hlbiByZWFjdGluZyB0byB0aGUgYG9uRmlsdGVyT3JTb3J0Q2hhbmdlZGAgZXZlbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY29sdW1uczogUHJvcGVydHk8U2ltcGxlVmFsdWUsIHN0cmluZywgc3RyaW5nPltdID0gW107XG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBQcm9wZXJ0eTxTaW1wbGVWYWx1ZSwgc3RyaW5nLCBzdHJpbmc+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBfcm93c0JlZm9yZUN1cnJlbnRQYWdlOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZ2V0IHJvd3NCZWZvcmVDdXJyZW50UGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yb3dzQmVmb3JlQ3VycmVudFBhZ2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfZGF0ZUZvcm1hdCA9IG5ldyBEYXRlKDMzMzMsIDEwLCAyMikgLy8gbW9udGhzIHN0YXJ0IGF0IDAgaW4gSlNcbiAgICAudG9Mb2NhbGVEYXRlU3RyaW5nKClcbiAgICAucmVwbGFjZShcIjIyXCIsIFwiZGRcIilcbiAgICAucmVwbGFjZShcIjExXCIsIFwiTU1cIilcbiAgICAucmVwbGFjZShcIjMzMzNcIiwgXCJ5eVwiKVxuICAgIC5yZXBsYWNlKFwiMzNcIiwgXCJ5XCIpO1xuXG4gIHB1YmxpYyBnZXQgZGF0ZUZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBSZXN0V29ybGRUYWJsZUNvbXBvbmVudC5fZGF0ZUZvcm1hdDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IF90aW1lRm9ybWF0ID0gbmV3IERhdGUoMSwgMSwgMSwgMjIsIDMzLCA0NClcbiAgICAudG9Mb2NhbGVUaW1lU3RyaW5nKClcbiAgICAucmVwbGFjZShcIjIyXCIsIFwiaGhcIilcbiAgICAucmVwbGFjZShcIjMzXCIsIFwibW1cIilcbiAgICAucmVwbGFjZShcIjQ0XCIsIFwic3NcIik7XG5cbiAgcHVibGljIGdldCB0aW1lRm9ybWF0KCkge1xuICAgIHJldHVybiBSZXN0V29ybGRUYWJsZUNvbXBvbmVudC5fdGltZUZvcm1hdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgUHJvcGVydHlUeXBlKCk6IHR5cGVvZiBQcm9wZXJ0eVR5cGUge1xuICAgIHJldHVybiBQcm9wZXJ0eVR5cGU7XG4gIH1cblxuICBwdWJsaWMgbG9hZChldmVudDogVGFibGVMYXp5TG9hZEV2ZW50KSB7XG4gICAgdGhpcy5tdWx0aVNvcnRNZXRhID0gZXZlbnQubXVsdGlTb3J0TWV0YTtcbiAgICB0aGlzLl9yb3dzQmVmb3JlQ3VycmVudFBhZ2UgPSBldmVudC5maXJzdCA/PyAwO1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPRGF0YVNlcnZpY2UuY3JlYXRlUGFyYW1ldGVyc0Zyb21UYWJsZUxvYWRFdmVudChldmVudCwgdGhpcy5zZWFyY2hUZW1wbGF0ZSk7XG4gICAgdGhpcy5vbkZpbHRlck9yU29ydENoYW5nZWQuZW1pdChwYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuQ29udGV4dE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogVExpc3RJdGVtKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dSb3dNZW51T25SaWdodENsaWNrIHx8IHRoaXMuY29udGV4dE1lbnUgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybjtcblxuICAgIHRoaXMuX2NvbnRleHRNZW51SXRlbXMgPSB0aGlzLnJvd01lbnUocm93LCB0cnVlKTtcbiAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZlbnQpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG9uUm93U2VsZWN0SW50ZXJuYWwoZXZlbnQ6IFRhYmxlUm93U2VsZWN0RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQoZXZlbnQuZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgb25Sb3dVbnNlbGVjdEludGVybmFsKGV2ZW50OiBUYWJsZVJvd1VuU2VsZWN0RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uUm93VW5zZWxlY3QuZW1pdChldmVudC5kYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdGlvbkNoYW5nZUludGVybmFsKGV2ZW50OiBUTGlzdEl0ZW0gfCBUTGlzdEl0ZW1bXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoXy5pc0FycmF5KGV2ZW50KSA/IGV2ZW50IDogW2V2ZW50XSk7XG4gIH1cblxuICBwdWJsaWMgdG9Db2x1bW5GaWx0ZXJUeXBlKHByb3BlcnR5VHlwZTogUHJvcGVydHlUeXBlKSA6IENvbHVtbkZpbHRlclR5cGV7XG4gICAgc3dpdGNoKHByb3BlcnR5VHlwZSkge1xuICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuTnVtYmVyOlxuICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuUGVyY2VudDpcbiAgICAgIGNhc2UgUHJvcGVydHlUeXBlLkN1cnJlbmN5OlxuICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuTW9udGg6XG4gICAgICAgIHJldHVybiBDb2x1bW5GaWx0ZXJUeXBlLm51bWVyaWM7XG4gICAgICBjYXNlIFByb3BlcnR5VHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gQ29sdW1uRmlsdGVyVHlwZS5ib29sZWFuO1xuICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuRGF0ZTpcbiAgICAgIGNhc2UgUHJvcGVydHlUeXBlLkRhdGV0aW1lTG9jYWw6XG4gICAgICBjYXNlIFByb3BlcnR5VHlwZS5EYXRldGltZU9mZnNldDpcbiAgICAgICAgcmV0dXJuIENvbHVtbkZpbHRlclR5cGUuZGF0ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBDb2x1bW5GaWx0ZXJUeXBlLnRleHQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvTWF0Y2hNb2RlKHByb3BlcnR5VHlwZTogUHJvcGVydHlUeXBlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBQcmltZU5HIHJldHVybmluZyBDT05UQUlOUyBmb3IgYm9vbGVhbiBjb2x1bW5zXG4gICAgLy8gT25jZSB0aGUgYnVnIGhhcyBiZWVuIGZpeGVkLCB3ZSBjYW4gcmVtb3ZlIHRoaXMgd29ya2Fyb3VuZFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1lbmcvaXNzdWVzLzE0MjEwXG4gICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gUHJvcGVydHlUeXBlLkJvb2wpXG4gICAgICByZXR1cm4gRmlsdGVyTWF0Y2hNb2RlLkVRVUFMUztcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzaG93SW5wdXRGaWVsZChjb2x1bW46IFByb3BlcnR5KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzRWRpdGFibGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBlZGl0UHJvcGVydHkgPSB0aGlzLmVkaXRQcm9wZXJ0aWVzW2NvbHVtbi5uYW1lXTtcblxuICAgIHJldHVybiBlZGl0UHJvcGVydHkgIT09IHVuZGVmaW5lZCAmJiBlZGl0UHJvcGVydHkudHlwZSAhPT0gUHJvcGVydHlUeXBlLkhpZGRlbiAmJiAhZWRpdFByb3BlcnR5LnJlYWRPbmx5O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGb3JtQXJyYXkoKTogdm9pZCB7XG4gICAgaWYoIXRoaXMuaXNFZGl0YWJsZSB8fCAhdGhpcy5yb3dzIHx8ICF0aGlzLmZvcm1BcnJheSB8fCAhdGhpcy5lZGl0VGVtcGxhdGUpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLmZvcm1BcnJheS5jbGVhcigpO1xuXG4gICAgY29uc3QgbmV3Q29udHJvbHMgPSB0aGlzLnJvd3NcbiAgICAgIC5tYXAociA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuX2Zvcm1TZXJ2aWNlLmNyZWF0ZUZvcm1Hcm91cEZyb21UZW1wbGF0ZSh0aGlzLmVkaXRUZW1wbGF0ZSEpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgZm9ybUdyb3VwLnBhdGNoVmFsdWUocik7XG4gICAgICAgIHJldHVybiBmb3JtR3JvdXA7XG4gICAgICB9KTtcblxuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBuZXdDb250cm9scylcbiAgICAgIHRoaXMuZm9ybUFycmF5LnB1c2goY29udHJvbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVkaXRQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0VGVtcGxhdGUpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLl9lZGl0UHJvcGVydGllcyA9IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmVkaXRUZW1wbGF0ZS5wcm9wZXJ0aWVzLm1hcChwID0+IFsgcC5uYW1lLCBwIF0pKTtcbiAgfVxufVxuIiwiPHAtdGFibGVcbiAgI3RhYmxlXG4gIFt2YWx1ZV09XCJyb3dzXCJcbiAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gIFtsYXp5XT1cInRydWVcIlxuICBbbGF6eUxvYWRPbkluaXRdPVwiZmFsc2VcIlxuICAob25MYXp5TG9hZCk9XCJsb2FkKCRldmVudClcIlxuICByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgW3BhZ2luYXRvcl09XCJ0cnVlXCJcbiAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZU9wdGlvbnNcIlxuICBbcm93c109XCJyb3dzLmxlbmd0aFwiXG4gIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgc29ydE1vZGU9XCJtdWx0aXBsZVwiXG4gIFttdWx0aVNvcnRNZXRhXT1cIm11bHRpU29ydE1ldGFcIlxuICBbc3R5bGVDbGFzc109XCJzdHlsZUNsYXNzXCJcbiAgW3RhYmxlU3R5bGVdPVwidGFibGVTdHlsZVwiXG4gIFtzY3JvbGxhYmxlXT1cInNjcm9sbGFibGVcIlxuICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXG4gIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIlxuICAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3RJbnRlcm5hbCgkZXZlbnQpXCJcbiAgKG9uUm93VW5zZWxlY3QpPVwib25Sb3dVbnNlbGVjdEludGVybmFsKCRldmVudClcIlxuICBbcm93SG92ZXJdPVwicm93SG92ZXJcIlxuICBbKHNlbGVjdGlvbildPVwiX3NlbGVjdGlvblwiXG4gIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2VJbnRlcm5hbCgkZXZlbnQpXCI+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxuICAgIDx0cj5cbiAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLm5hbWVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWQtZmxleCBwLWpjLWJldHdlZW4gcC1haS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICB7e2NvbC5wcm9tcHR9fVxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sLnJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLm5hbWVcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwidG9Db2x1bW5GaWx0ZXJUeXBlKGNvbC50eXBlKVwiIFttYXRjaE1vZGVdPVwidG9NYXRjaE1vZGUoY29sLnR5cGUpXCIgW2ZpZWxkXT1cImNvbC5uYW1lXCIgZGlzcGxheT1cIm1lbnVcIj48L3AtY29sdW1uRmlsdGVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCAqbmdJZj1cInNob3dNZW51Q29sdW1uXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICA8cnctbWVudS1idXR0b24gW2l0ZW1zXT1cImhlYWRlck1lbnVcIj48L3J3LW1lbnUtYnV0dG9uPlxuICAgICAgICA8L3RoPlxuICAgIDwvdHI+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtZW50aXR5IGxldC1jb2x1bW5zPVwiY29sdW1uc1wiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XG4gICAgPHRyIChjb250ZXh0bWVudSk9XCJvcGVuQ29udGV4dE1lbnUoJGV2ZW50LCBlbnRpdHkpXCIgW3BTZWxlY3RhYmxlUm93XT1cImVudGl0eVwiIFtwU2VsZWN0YWJsZVJvd0Rpc2FibGVkXT1cInNlbGVjdGlvbk1vZGUgPT09IG51bGxcIiBbY2xhc3NOYW1lXT1cInJvd1N0eWxlQ2xhc3Nlc1tyb3dJbmRleCAtICh0YWJsZS5maXJzdCA/PyAwKV1cIj5cbiAgICAgIDx0ZCBbbmdTd2l0Y2hdPVwiY29sLnR5cGVcIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIiBbY2xhc3NOYW1lXT1cImNlbGxTdHlsZUNsYXNzZXNbcm93SW5kZXggLSAodGFibGUuZmlyc3QgPz8gMCldW2NvbC5uYW1lXVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93SW5wdXRGaWVsZChjb2wpOyBlbHNlIHRleHRGaWVsZFwiIFtmb3JtR3JvdXBdPVwiZm9ybUFycmF5IS5jb250cm9sc1tyb3dJbmRleCAtICh0YWJsZS5maXJzdCA/PyAwKV1cIiA+XG4gICAgICAgICAgICA8cnctaW5wdXQgW2FwaU5hbWVdPVwiYXBpTmFtZSFcIiBbcHJvcGVydHldPVwiZWRpdFByb3BlcnRpZXNbY29sLm5hbWVdXCI+PC9ydy1pbnB1dD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3RleHRGaWVsZD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5UZXh0XCI+XG4gICAgICAgICAgICAgICAgPHJ3LWF2YXRhciAqbmdJZj1cImNvbC5uYW1lID09PSAnY3JlYXRlZEJ5JyB8fCBjb2wubmFtZSA9PT0gJ2xhc3RDaGFuZ2VkQnknXCIgW3VzZXJdPVwiZW50aXR5W2NvbC5uYW1lXVwiPjwvcnctYXZhdGFyPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sLm5hbWUgIT09ICdjcmVhdGVkQnknICYmIGNvbC5uYW1lICE9PSAnbGFzdENoYW5nZWRCeSdcIj57e2VudGl0eVtjb2wubmFtZV19fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5OdW1iZXJcIiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPnt7ZW50aXR5W2NvbC5uYW1lXSB8IHByb3BlcnR5VHlwZUZvcm1hdDpjb2wudHlwZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5QZXJjZW50XCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj57e2VudGl0eVtjb2wubmFtZV0gfCBwcm9wZXJ0eVR5cGVGb3JtYXQ6Y29sLnR5cGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuQ3VycmVuY3lcIiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPnt7ZW50aXR5W2NvbC5uYW1lXSB8IHByb3BlcnR5VHlwZUZvcm1hdDpjb2wudHlwZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Cb29sXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj48cC10cmlTdGF0ZUNoZWNrYm94IFsobmdNb2RlbCldPVwiZW50aXR5W2NvbC5uYW1lXVwiIFtyZWFkb25seV09XCJ0cnVlXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L3AtdHJpU3RhdGVDaGVja2JveD48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLkRhdGVcIiBbcFRvb2x0aXBdPVwiZW50aXR5W2NvbC5uYW1lXVwiPnt7ZW50aXR5W2NvbC5uYW1lXSB8IHByb3BlcnR5VHlwZUZvcm1hdDpjb2wudHlwZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5UaW1lXCIgW3BUb29sdGlwXT1cImVudGl0eVtjb2wubmFtZV1cIj57e2VudGl0eVtjb2wubmFtZV0gfCBwcm9wZXJ0eVR5cGVGb3JtYXQ6Y29sLnR5cGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRHVyYXRpb25cIiBbcFRvb2x0aXBdPVwiZW50aXR5W2NvbC5uYW1lXVwiPnt7ZW50aXR5W2NvbC5uYW1lXSB8IHByb3BlcnR5VHlwZUZvcm1hdDpjb2wudHlwZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EYXRldGltZUxvY2FsXCIgW3BUb29sdGlwXT1cImVudGl0eVtjb2wubmFtZV1cIj57e2VudGl0eVtjb2wubmFtZV0gfCBwcm9wZXJ0eVR5cGVGb3JtYXQ6UHJvcGVydHlUeXBlLkRhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRGF0ZXRpbWVPZmZzZXRcIiBbcFRvb2x0aXBdPVwiZW50aXR5W2NvbC5uYW1lXVwiPnt7ZW50aXR5W2NvbC5uYW1lXSB8IHByb3BlcnR5VHlwZUZvcm1hdDpQcm9wZXJ0eVR5cGUuRGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Db2xsZWN0aW9uXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj48cCAqbmdGb3I9XCJsZXQgYXJyYXlFbGVtZW50IG9mIGVudGl0eVtjb2wubmFtZV1cIj57e2FycmF5RWxlbWVudCB8IGpzb259fTwvcD48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLk9iamVjdFwiIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+e3tlbnRpdHlbY29sLm5hbWVdIHwganNvbn19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBbcFRvb2x0aXBdPVwiZW50aXR5W2NvbC5uYW1lXVwiPnt7ZW50aXR5W2NvbC5uYW1lXSB8IHByb3BlcnR5VHlwZUZvcm1hdDpjb2wudHlwZX19PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCAqbmdJZj1cInNob3dNZW51Q29sdW1uXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICA8cnctbWVudS1idXR0b24gKm5nSWY9XCJzaG93Um93TWVudUFzQ29sdW1uXCIgW2l0ZW1zXT1cInJvd01lbnVzW3Jvd0luZGV4IC0gKHRhYmxlLmZpcnN0ID8/IDApXVwiPjwvcnctbWVudS1idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8cC1jb250ZXh0TWVudSAjY29udGV4dE1lbnUgYXBwZW5kVG89XCJib2R5XCIgW21vZGVsXT1cImNvbnRleHRNZW51SXRlbXNcIj48L3AtY29udGV4dE1lbnU+XG48L3AtdGFibGU+XG4iXX0=
|
|
@@ -2341,6 +2341,14 @@ class RestWorldTableComponent {
|
|
|
2341
2341
|
return ColumnFilterType.text;
|
|
2342
2342
|
}
|
|
2343
2343
|
}
|
|
2344
|
+
toMatchMode(propertyType) {
|
|
2345
|
+
// There is a bug in PrimeNG returning CONTAINS for boolean columns
|
|
2346
|
+
// Once the bug has been fixed, we can remove this workaround
|
|
2347
|
+
// https://github.com/primefaces/primeng/issues/14210
|
|
2348
|
+
if (propertyType === PropertyType.Bool)
|
|
2349
|
+
return FilterMatchMode.EQUALS;
|
|
2350
|
+
return undefined;
|
|
2351
|
+
}
|
|
2344
2352
|
showInputField(column) {
|
|
2345
2353
|
if (!this.isEditable)
|
|
2346
2354
|
return false;
|
|
@@ -2366,7 +2374,7 @@ class RestWorldTableComponent {
|
|
|
2366
2374
|
this._editProperties = Object.fromEntries(this.editTemplate.properties.map(p => [p.name, p]));
|
|
2367
2375
|
}
|
|
2368
2376
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: RestWorldTableComponent, deps: [{ token: i4$1.ControlContainer }, { token: i1$2.FormService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2369
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: RestWorldTableComponent, selector: "rw-table", inputs: { apiName: "apiName", formArray: "formArray", searchTemplate: "searchTemplate", editTemplate: "editTemplate", rows: "rows", rowsPerPageOptions: "rowsPerPageOptions", headerMenu: "headerMenu", rowMenu: "rowMenu", showRowMenuAsColumn: "showRowMenuAsColumn", showRowMenuOnRightClick: "showRowMenuOnRightClick", rowStyleClass: "rowStyleClass", cellStyleClass: "cellStyleClass", totalRecords: "totalRecords", styleClass: "styleClass", tableStyle: "tableStyle", scrollable: "scrollable", scrollHeight: "scrollHeight", selectionMode: "selectionMode", rowHover: "rowHover", selection: "selection", isLoading: "isLoading" }, outputs: { onFilterOrSortChanged: "onFilterOrSortChanged", onRowSelect: "onRowSelect", onRowUnselect: "onRowUnselect", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "contextMenu", first: true, predicate: ["contextMenu"], descendants: true }], ngImport: i0, template: "<p-table\n #table\n [value]=\"rows\"\n [columns]=\"columns\"\n [lazy]=\"true\"\n [lazyLoadOnInit]=\"false\"\n (onLazyLoad)=\"load($event)\"\n responsiveLayout=\"scroll\"\n [paginator]=\"true\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rows]=\"rows.length\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"isLoading\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"multiSortMeta\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [selectionMode]=\"selectionMode\"\n (onRowSelect)=\"onRowSelectInternal($event)\"\n (onRowUnselect)=\"onRowUnselectInternal($event)\"\n [rowHover]=\"rowHover\"\n [(selection)]=\"_selection\"\n (selectionChange)=\"onSelectionChangeInternal($event)\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.name\">\n <div class=\"p-d-flex p-jc-between p-ai-center\">\n {{col.prompt}}\n <ng-container *ngIf=\"!col.readOnly\">\n <p-sortIcon [field]=\"col.name\"></p-sortIcon>\n <p-columnFilter [type]=\"toColumnFilterType(col.type)\" [field]=\"col.name\" display=\"menu\"></p-columnFilter>\n </ng-container>\n </div>\n </th>\n <th *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button [items]=\"headerMenu\"></rw-menu-button>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\" let-rowIndex=\"rowIndex\">\n <tr (contextmenu)=\"openContextMenu($event, entity)\" [pSelectableRow]=\"entity\" [pSelectableRowDisabled]=\"selectionMode === null\" [className]=\"rowStyleClasses[rowIndex - (table.first ?? 0)]\">\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\" [className]=\"cellStyleClasses[rowIndex - (table.first ?? 0)][col.name]\">\n <ng-container *ngIf=\"showInputField(col); else textField\" [formGroup]=\"formArray!.controls[rowIndex - (table.first ?? 0)]\" >\n <rw-input [apiName]=\"apiName!\" [property]=\"editProperties[col.name]\"></rw-input>\n </ng-container>\n <ng-template #textField>\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\n <rw-avatar *ngIf=\"col.name === 'createdBy' || col.name === 'lastChangedBy'\" [user]=\"entity[col.name]\"></rw-avatar>\n <span *ngIf=\"col.name !== 'createdBy' && col.name !== 'lastChangedBy'\">{{entity[col.name]}}</span>\n </ng-container>\n <span *ngSwitchCase=\"PropertyType.Number\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Percent\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Currency\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Bool\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.name]\" [readonly]=\"true\"></p-triStateCheckbox></span>\n <span *ngSwitchCase=\"PropertyType.Date\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Time\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Duration\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeLocal\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeOffset\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.Collection\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.name]\">{{arrayElement | json}}</p></span>\n <span *ngSwitchCase=\"PropertyType.Object\" class=\"flex justify-content-end\">{{entity[col.name] | json}}</span>\n <span *ngSwitchDefault [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n </ng-template>\n </td>\n <td *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button *ngIf=\"showRowMenuAsColumn\" [items]=\"rowMenus[rowIndex - (table.first ?? 0)]\"></rw-menu-button>\n </td>\n </tr>\n </ng-template>\n\n <p-contextMenu #contextMenu appendTo=\"body\" [model]=\"contextMenuItems\"></p-contextMenu>\n</p-table>\n", styles: [".p-tooltip{max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"], dependencies: [{ kind: "directive", type: i2$4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i5$2.ContextMenu, selector: "p-contextMenu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "id", "ariaLabel", "ariaLabelledBy"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7$2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7$2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i7$2.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i7$2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i7$2.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons"] }, { kind: "component", type: i21.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "component", type: RestWorldAvatarComponent, selector: "rw-avatar", inputs: ["user"] }, { kind: "component", type: RestWorldInputComponent, selector: "rw-input", inputs: ["property", "apiName"] }, { kind: "component", type: RestWorldMenuButtonComponent, selector: "rw-menu-button", inputs: ["items"] }, { kind: "pipe", type: i2$1.JsonPipe, name: "json" }, { kind: "pipe", type: PropertyTypeFormatPipe, name: "propertyTypeFormat" }], viewProviders: [{
|
|
2377
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: RestWorldTableComponent, selector: "rw-table", inputs: { apiName: "apiName", formArray: "formArray", searchTemplate: "searchTemplate", editTemplate: "editTemplate", rows: "rows", rowsPerPageOptions: "rowsPerPageOptions", headerMenu: "headerMenu", rowMenu: "rowMenu", showRowMenuAsColumn: "showRowMenuAsColumn", showRowMenuOnRightClick: "showRowMenuOnRightClick", rowStyleClass: "rowStyleClass", cellStyleClass: "cellStyleClass", totalRecords: "totalRecords", styleClass: "styleClass", tableStyle: "tableStyle", scrollable: "scrollable", scrollHeight: "scrollHeight", selectionMode: "selectionMode", rowHover: "rowHover", selection: "selection", isLoading: "isLoading" }, outputs: { onFilterOrSortChanged: "onFilterOrSortChanged", onRowSelect: "onRowSelect", onRowUnselect: "onRowUnselect", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "contextMenu", first: true, predicate: ["contextMenu"], descendants: true }], ngImport: i0, template: "<p-table\n #table\n [value]=\"rows\"\n [columns]=\"columns\"\n [lazy]=\"true\"\n [lazyLoadOnInit]=\"false\"\n (onLazyLoad)=\"load($event)\"\n responsiveLayout=\"scroll\"\n [paginator]=\"true\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rows]=\"rows.length\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"isLoading\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"multiSortMeta\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [selectionMode]=\"selectionMode\"\n (onRowSelect)=\"onRowSelectInternal($event)\"\n (onRowUnselect)=\"onRowUnselectInternal($event)\"\n [rowHover]=\"rowHover\"\n [(selection)]=\"_selection\"\n (selectionChange)=\"onSelectionChangeInternal($event)\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.name\">\n <div class=\"p-d-flex p-jc-between p-ai-center\">\n {{col.prompt}}\n <ng-container *ngIf=\"!col.readOnly\">\n <p-sortIcon [field]=\"col.name\"></p-sortIcon>\n <p-columnFilter [type]=\"toColumnFilterType(col.type)\" [matchMode]=\"toMatchMode(col.type)\" [field]=\"col.name\" display=\"menu\"></p-columnFilter>\n </ng-container>\n </div>\n </th>\n <th *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button [items]=\"headerMenu\"></rw-menu-button>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\" let-rowIndex=\"rowIndex\">\n <tr (contextmenu)=\"openContextMenu($event, entity)\" [pSelectableRow]=\"entity\" [pSelectableRowDisabled]=\"selectionMode === null\" [className]=\"rowStyleClasses[rowIndex - (table.first ?? 0)]\">\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\" [className]=\"cellStyleClasses[rowIndex - (table.first ?? 0)][col.name]\">\n <ng-container *ngIf=\"showInputField(col); else textField\" [formGroup]=\"formArray!.controls[rowIndex - (table.first ?? 0)]\" >\n <rw-input [apiName]=\"apiName!\" [property]=\"editProperties[col.name]\"></rw-input>\n </ng-container>\n <ng-template #textField>\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\n <rw-avatar *ngIf=\"col.name === 'createdBy' || col.name === 'lastChangedBy'\" [user]=\"entity[col.name]\"></rw-avatar>\n <span *ngIf=\"col.name !== 'createdBy' && col.name !== 'lastChangedBy'\">{{entity[col.name]}}</span>\n </ng-container>\n <span *ngSwitchCase=\"PropertyType.Number\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Percent\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Currency\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Bool\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.name]\" [readonly]=\"true\" [disabled]=\"true\"></p-triStateCheckbox></span>\n <span *ngSwitchCase=\"PropertyType.Date\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Time\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Duration\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeLocal\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeOffset\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.Collection\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.name]\">{{arrayElement | json}}</p></span>\n <span *ngSwitchCase=\"PropertyType.Object\" class=\"flex justify-content-end\">{{entity[col.name] | json}}</span>\n <span *ngSwitchDefault [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n </ng-template>\n </td>\n <td *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button *ngIf=\"showRowMenuAsColumn\" [items]=\"rowMenus[rowIndex - (table.first ?? 0)]\"></rw-menu-button>\n </td>\n </tr>\n </ng-template>\n\n <p-contextMenu #contextMenu appendTo=\"body\" [model]=\"contextMenuItems\"></p-contextMenu>\n</p-table>\n", styles: [".p-tooltip{max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"], dependencies: [{ kind: "directive", type: i2$4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i5$2.ContextMenu, selector: "p-contextMenu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "id", "ariaLabel", "ariaLabelledBy"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7$2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7$2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i7$2.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i7$2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i7$2.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons"] }, { kind: "component", type: i21.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "component", type: RestWorldAvatarComponent, selector: "rw-avatar", inputs: ["user"] }, { kind: "component", type: RestWorldInputComponent, selector: "rw-input", inputs: ["property", "apiName"] }, { kind: "component", type: RestWorldMenuButtonComponent, selector: "rw-menu-button", inputs: ["items"] }, { kind: "pipe", type: i2$1.JsonPipe, name: "json" }, { kind: "pipe", type: PropertyTypeFormatPipe, name: "propertyTypeFormat" }], viewProviders: [{
|
|
2370
2378
|
provide: ControlContainer,
|
|
2371
2379
|
deps: [[Optional, FormArrayName]],
|
|
2372
2380
|
useFactory: (arrayName) => arrayName,
|
|
@@ -2378,7 +2386,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImpor
|
|
|
2378
2386
|
provide: ControlContainer,
|
|
2379
2387
|
deps: [[Optional, FormArrayName]],
|
|
2380
2388
|
useFactory: (arrayName) => arrayName,
|
|
2381
|
-
}], template: "<p-table\n #table\n [value]=\"rows\"\n [columns]=\"columns\"\n [lazy]=\"true\"\n [lazyLoadOnInit]=\"false\"\n (onLazyLoad)=\"load($event)\"\n responsiveLayout=\"scroll\"\n [paginator]=\"true\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rows]=\"rows.length\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"isLoading\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"multiSortMeta\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [selectionMode]=\"selectionMode\"\n (onRowSelect)=\"onRowSelectInternal($event)\"\n (onRowUnselect)=\"onRowUnselectInternal($event)\"\n [rowHover]=\"rowHover\"\n [(selection)]=\"_selection\"\n (selectionChange)=\"onSelectionChangeInternal($event)\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.name\">\n <div class=\"p-d-flex p-jc-between p-ai-center\">\n {{col.prompt}}\n <ng-container *ngIf=\"!col.readOnly\">\n <p-sortIcon [field]=\"col.name\"></p-sortIcon>\n <p-columnFilter [type]=\"toColumnFilterType(col.type)\" [field]=\"col.name\" display=\"menu\"></p-columnFilter>\n </ng-container>\n </div>\n </th>\n <th *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button [items]=\"headerMenu\"></rw-menu-button>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\" let-rowIndex=\"rowIndex\">\n <tr (contextmenu)=\"openContextMenu($event, entity)\" [pSelectableRow]=\"entity\" [pSelectableRowDisabled]=\"selectionMode === null\" [className]=\"rowStyleClasses[rowIndex - (table.first ?? 0)]\">\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\" [className]=\"cellStyleClasses[rowIndex - (table.first ?? 0)][col.name]\">\n <ng-container *ngIf=\"showInputField(col); else textField\" [formGroup]=\"formArray!.controls[rowIndex - (table.first ?? 0)]\" >\n <rw-input [apiName]=\"apiName!\" [property]=\"editProperties[col.name]\"></rw-input>\n </ng-container>\n <ng-template #textField>\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\n <rw-avatar *ngIf=\"col.name === 'createdBy' || col.name === 'lastChangedBy'\" [user]=\"entity[col.name]\"></rw-avatar>\n <span *ngIf=\"col.name !== 'createdBy' && col.name !== 'lastChangedBy'\">{{entity[col.name]}}</span>\n </ng-container>\n <span *ngSwitchCase=\"PropertyType.Number\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Percent\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Currency\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Bool\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.name]\" [readonly]=\"true\"></p-triStateCheckbox></span>\n <span *ngSwitchCase=\"PropertyType.Date\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Time\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Duration\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeLocal\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeOffset\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.Collection\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.name]\">{{arrayElement | json}}</p></span>\n <span *ngSwitchCase=\"PropertyType.Object\" class=\"flex justify-content-end\">{{entity[col.name] | json}}</span>\n <span *ngSwitchDefault [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n </ng-template>\n </td>\n <td *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button *ngIf=\"showRowMenuAsColumn\" [items]=\"rowMenus[rowIndex - (table.first ?? 0)]\"></rw-menu-button>\n </td>\n </tr>\n </ng-template>\n\n <p-contextMenu #contextMenu appendTo=\"body\" [model]=\"contextMenuItems\"></p-contextMenu>\n</p-table>\n", styles: [".p-tooltip{max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"] }]
|
|
2389
|
+
}], template: "<p-table\n #table\n [value]=\"rows\"\n [columns]=\"columns\"\n [lazy]=\"true\"\n [lazyLoadOnInit]=\"false\"\n (onLazyLoad)=\"load($event)\"\n responsiveLayout=\"scroll\"\n [paginator]=\"true\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rows]=\"rows.length\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"isLoading\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"multiSortMeta\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [selectionMode]=\"selectionMode\"\n (onRowSelect)=\"onRowSelectInternal($event)\"\n (onRowUnselect)=\"onRowUnselectInternal($event)\"\n [rowHover]=\"rowHover\"\n [(selection)]=\"_selection\"\n (selectionChange)=\"onSelectionChangeInternal($event)\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.name\">\n <div class=\"p-d-flex p-jc-between p-ai-center\">\n {{col.prompt}}\n <ng-container *ngIf=\"!col.readOnly\">\n <p-sortIcon [field]=\"col.name\"></p-sortIcon>\n <p-columnFilter [type]=\"toColumnFilterType(col.type)\" [matchMode]=\"toMatchMode(col.type)\" [field]=\"col.name\" display=\"menu\"></p-columnFilter>\n </ng-container>\n </div>\n </th>\n <th *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button [items]=\"headerMenu\"></rw-menu-button>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\" let-rowIndex=\"rowIndex\">\n <tr (contextmenu)=\"openContextMenu($event, entity)\" [pSelectableRow]=\"entity\" [pSelectableRowDisabled]=\"selectionMode === null\" [className]=\"rowStyleClasses[rowIndex - (table.first ?? 0)]\">\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\" [className]=\"cellStyleClasses[rowIndex - (table.first ?? 0)][col.name]\">\n <ng-container *ngIf=\"showInputField(col); else textField\" [formGroup]=\"formArray!.controls[rowIndex - (table.first ?? 0)]\" >\n <rw-input [apiName]=\"apiName!\" [property]=\"editProperties[col.name]\"></rw-input>\n </ng-container>\n <ng-template #textField>\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\n <rw-avatar *ngIf=\"col.name === 'createdBy' || col.name === 'lastChangedBy'\" [user]=\"entity[col.name]\"></rw-avatar>\n <span *ngIf=\"col.name !== 'createdBy' && col.name !== 'lastChangedBy'\">{{entity[col.name]}}</span>\n </ng-container>\n <span *ngSwitchCase=\"PropertyType.Number\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Percent\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Currency\" class=\"flex justify-content-end\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Bool\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.name]\" [readonly]=\"true\" [disabled]=\"true\"></p-triStateCheckbox></span>\n <span *ngSwitchCase=\"PropertyType.Date\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Time\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.Duration\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeLocal\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.DatetimeOffset\" [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:PropertyType.Date}}</span>\n <span *ngSwitchCase=\"PropertyType.Collection\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.name]\">{{arrayElement | json}}</p></span>\n <span *ngSwitchCase=\"PropertyType.Object\" class=\"flex justify-content-end\">{{entity[col.name] | json}}</span>\n <span *ngSwitchDefault [pTooltip]=\"entity[col.name]\">{{entity[col.name] | propertyTypeFormat:col.type}}</span>\n </ng-template>\n </td>\n <td *ngIf=\"showMenuColumn\" class=\"flex justify-content-end\">\n <rw-menu-button *ngIf=\"showRowMenuAsColumn\" [items]=\"rowMenus[rowIndex - (table.first ?? 0)]\"></rw-menu-button>\n </td>\n </tr>\n </ng-template>\n\n <p-contextMenu #contextMenu appendTo=\"body\" [model]=\"contextMenuItems\"></p-contextMenu>\n</p-table>\n", styles: [".p-tooltip{max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"] }]
|
|
2382
2390
|
}], ctorParameters: function () { return [{ type: i4$1.ControlContainer }, { type: i1$2.FormService }]; }, propDecorators: { apiName: [{
|
|
2383
2391
|
type: Input
|
|
2384
2392
|
}], formArray: [{
|