dynamic-mat-table
Version:
dynamic-mat-table is an Angular component for presenting large and complex data with a lightning fast performance (at least 10x faster) and excellent level of control over the presentation.
402 lines • 55 kB
JavaScript
import { TableVirtualScrollDataSource } from "./table-data-source";
import { ViewChild, Input, Output, EventEmitter, HostBinding, ChangeDetectorRef, } from "@angular/core";
import { titleCase } from "../utilizes/utilizes";
import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
import { moveItemInArray } from "@angular/cdk/drag-drop";
import { SelectionModel } from "@angular/cdk/collections";
import { TableService } from "../dynamic-mat-table/dynamic-mat-table.service";
import { TableSetting } from "../models/table-setting.model";
import { MatSort } from "@angular/material/sort";
import { MatPaginator } from "@angular/material/paginator";
import { MatTable } from "@angular/material/table";
import { Directive } from "@angular/core";
import { clone, getObjectProp, isNullorUndefined } from "./type";
import { BehaviorSubject } from "rxjs";
export class TableCoreDirective {
constructor(tableService, cdr, config) {
this.tableService = tableService;
this.cdr = cdr;
this.config = config;
this.backgroundColor = null;
this.contextMenuItems = [];
this.expandColumn = [];
this.defaultWidth = null;
this.minWidth = 120;
/*************************************** I/O parameters *********************************/
this.printConfig = {};
this.rowHeight = 48;
this.headerHeight = 56;
this.footerHeight = 48;
this.headerEnable = true;
this.footerEnable = false;
// tslint:disable-next-line: no-output-on-prefix
this.onTableEvent = new EventEmitter();
this.onRowEvent = new EventEmitter();
this.settingChange = new EventEmitter();
this.paginationChange = new EventEmitter();
this.noData = true;
// Variables //
this.progressColumn = [];
this.displayedColumns = [];
this.displayedFooter = [];
this.tvsDataSource = new TableVirtualScrollDataSource([]);
this._rowSelectionModel = new SelectionModel(true, []);
this._tablePagination = {
pageIndex: 0,
pageSize: 10,
pageSizeOptions: [5, 10, 100, 1000, 10000]
};
this.tablePagingMode = "none";
this.viewportClass = "viewport-with-pagination";
this.showProgress = true;
this.tableSetting = {
direction: "ltr",
columnSetting: null,
visibleActionMenu: null,
};
if (this.config) {
this.tableSetting = Object.assign(Object.assign({}, this.tableSetting), this.config);
}
}
get direction() {
var _a;
return (_a = this.tableSetting) === null || _a === void 0 ? void 0 : _a.direction;
}
set direction(value) {
this.tableSetting.direction = value;
}
get ScrollStrategyType() {
return this.tableSetting.scrollStrategy;
}
set ScrollStrategyType(value) {
this.viewport["_scrollStrategy"].scrollStrategyMode = value;
this.tableSetting.scrollStrategy = value;
}
get pagingMode() {
return this.tablePagingMode;
}
set pagingMode(value) {
this.tablePagingMode = value;
this.updatePagination();
}
get pagination() {
return this._tablePagination;
}
set pagination(value) {
if (value && value !== null) {
this._tablePagination = value;
if (isNullorUndefined(this._tablePagination.pageSizeOptions)) {
this._tablePagination.pageSizeOptions = [5, 10, 25, 100];
}
if (isNullorUndefined(this._tablePagination.pageSize)) {
this._tablePagination.pageSize =
this._tablePagination.pageSizeOptions[0];
}
this.updatePagination();
}
}
get rowSelectionModel() {
return this._rowSelectionModel;
}
set rowSelectionModel(value) {
if (!isNullorUndefined(value)) {
if (this._rowSelectionMode &&
value &&
this._rowSelectionMode !== "none") {
this._rowSelectionMode =
value.isMultipleSelection() === true ? "multi" : "single";
}
this._rowSelectionModel = value;
}
}
get rowSelectionMode() {
return this._rowSelectionMode;
}
set rowSelectionMode(selection) {
var _a, _b;
selection = selection || "none";
const isSelectionColumn = selection === "single" || selection === "multi";
if (this._rowSelectionModel === null ||
(this._rowSelectionModel.isMultipleSelection() === true &&
selection === "single") ||
(this._rowSelectionModel.isMultipleSelection() === false &&
selection === "multi")) {
this._rowSelectionModel = new SelectionModel(selection === "multi", []);
}
if (((_a = this.displayedColumns) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
!isSelectionColumn &&
this.displayedColumns[0] === "row-checkbox") {
this.displayedColumns.shift();
}
else if (((_b = this.displayedColumns) === null || _b === void 0 ? void 0 : _b.length) > 0 &&
isSelectionColumn &&
this.displayedColumns[0] !== "row-checkbox") {
this.displayedColumns.unshift("row-checkbox");
}
this._rowSelectionMode = selection;
}
get tableName() {
return this.tableService.tableName;
}
set tableName(value) {
this.tableService.tableName = value;
}
get showProgress() {
return this.progressColumn.length > 0;
}
set showProgress(value) {
this.progressColumn = [];
if (value === true) {
this.progressColumn.push("progress");
}
}
initSystemField(data) {
if (data) {
data = data.map((item, index) => {
item.id = index;
item.option = item.option || {};
return item;
});
}
}
get expandComponent() {
return this._expandComponent;
}
set expandComponent(value) {
this._expandComponent = value;
if (this._expandComponent !== null && this._expandComponent !== undefined) {
this.expandColumn = ["expandedDetail"];
}
else {
this.expandColumn = [];
}
}
get columns() {
return this.tableColumns;
}
set columns(fields) {
(fields || []).forEach((f, i) => {
// key name error //
if (f.name.toLowerCase() === "id") {
throw 'Field name is reserved.["id"]';
}
const settingFields = (this.tableSetting.columnSetting || []).filter((s) => s.name === f.name);
const settingField = settingFields.length > 0 ? settingFields[0] : null;
/* default value for fields */
f.printable = f.printable || true;
f.exportable = f.exportable || true;
f.toExport =
f.toExport ||
((row, type) => (typeof row === "object" ? row[f.name] : ""));
f.toPrint = (row) => (typeof row === "object" ? row[f.name] : "");
f.enableContextMenu = f.enableContextMenu || true;
f.header = f.header || titleCase(f.name);
f.display = getObjectProp("display", "visible", settingField, f);
f.filter = getObjectProp("filter", "client-side", settingField, f);
f.sort = getObjectProp("sort", "client-side", settingField, f);
f.sticky = getObjectProp("sticky", "none", settingField, f);
f.width = getObjectProp("width", this.defaultWidth, settingField, f);
const unit = f.widthUnit || "px";
const style = unit === "px" ? f.width + "px" : `calc( ${f.widthPercentage}% )`;
if (f.width) {
f.style = Object.assign(Object.assign({}, f.style), { "max-width": style, "min-width": style });
}
});
this.tableColumns = fields;
this.updateColumn();
}
updateColumn() {
if (this.tableColumns) {
// isNullorUndefined(this.tableSetting.columnSetting)
this.tableSetting.columnSetting = clone(this.tableColumns);
}
this.setDisplayedColumns();
}
/**************************************** Methods **********************************************/
updatePagination() {
if (isNullorUndefined(this.tvsDataSource)) {
return;
}
if (this.tablePagingMode === "client-side" ||
this.tablePagingMode === "server-side") {
this.viewportClass = "viewport-with-pagination";
if (!isNullorUndefined(this.tvsDataSource.paginator)) {
let dataLen = this.tvsDataSource.paginator.length;
if (!isNullorUndefined(this._tablePagination.length) &&
this._tablePagination.length > dataLen) {
dataLen = this._tablePagination.length;
}
this.tvsDataSource.paginator.length = dataLen;
}
}
else {
this.viewportClass = "viewport";
if (this.tvsDataSource._paginator !== undefined) {
delete this.tvsDataSource._paginator;
}
}
this.tvsDataSource.refreshFilterPredicate();
}
clearSelection() {
if (this._rowSelectionModel) {
this._rowSelectionModel.clear();
}
}
clear() {
if (!isNullorUndefined(this.tvsDataSource)) {
if (this.viewport) {
this.viewport.scrollTo({ top: 0, behavior: "auto" });
}
this.tvsDataSource.clearData();
this.expandedElement = null;
}
this.clearSelection();
this.cdr.detectChanges();
}
setDisplayedColumns() {
if (this.columns) {
this.displayedColumns.splice(0, this.displayedColumns.length);
this.columns.forEach((column, index) => {
column.index = index;
if (column.display === undefined ||
column.display === "visible" ||
column.display === "prevent-hidden") {
this.displayedColumns.push(column.name);
}
});
if ((this._rowSelectionMode === "multi" ||
this._rowSelectionMode === "single") &&
this.displayedColumns.indexOf("row-checkbox") === -1) {
this.displayedColumns.unshift("row-checkbox");
}
this.displayedFooter = this.columns
.filter((item) => item.footer !== null && item.footer !== undefined)
.map((item) => item.name);
if (this.tableSetting.visibleTableMenu !== false) {
this.displayedColumns.push("table-menu");
}
}
}
/************************************ Drag & Drop Column *******************************************/
refreshGrid() {
this.cdr.detectChanges();
this.refreshColumn(this.tableColumns);
this.table.renderRows();
this.viewport.checkViewportSize();
}
moveRow(from, to) {
if (from >= 0 &&
from < this.tvsDataSource.data.length &&
to >= 0 &&
to < this.tvsDataSource.data.length) {
this.tvsDataSource.data[from].id = to;
this.tvsDataSource.data[to].id = from;
moveItemInArray(this.tvsDataSource.data, from, to);
this.tvsDataSource.data = Object.assign([], this.tvsDataSource.data);
}
}
moveColumn(from, to) {
setTimeout(() => {
moveItemInArray(this.columns, from, to);
this.refreshColumn(this.columns);
});
}
refreshColumn(columns) {
if (this.viewport) {
const currentOffset = this.viewport.measureScrollOffset();
this.columns = columns;
// this.setDisplayedColumns();
setTimeout(() => this.viewport.scrollTo({ top: currentOffset, behavior: "auto" }), 0);
}
}
/************************************ Selection Table Row *******************************************/
/** Whether the number of selected elements matches the total number of rows. */
isAllSelected() {
const numSelected = this._rowSelectionModel.selected.length;
const numRows = this.tvsDataSource.filteredData.length;
return numSelected === numRows;
}
/** Selects all rows if they are not all selected; otherwise clear selection. */
masterToggle() {
const isAllSelected = this.isAllSelected();
if (isAllSelected === false) {
this.tvsDataSource.filteredData.forEach((row) => this._rowSelectionModel.select(row));
}
else {
this._rowSelectionModel.clear();
}
this.onRowEvent.emit({
event: "MasterSelectionChange",
sender: { selectionModel: this._rowSelectionModel },
});
}
onRowSelectionChange(e, row) {
if (e) {
this._rowSelectionModel.toggle(row);
this.onRowEvent.emit({
event: "RowSelectionChange",
sender: {
selectionModel: this._rowSelectionModel,
row: row
},
});
}
}
}
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TableCoreDirective.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: "[core]",
},] }
];
/**
* @type {function(): !Array<(null|{
* type: ?,
* decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>),
* })>}
* @nocollapse
*/
TableCoreDirective.ctorParameters = () => [
{ type: TableService },
{ type: ChangeDetectorRef },
{ type: TableSetting }
];
/** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TableCoreDirective.propDecorators = {
sort: [{ type: ViewChild, args: [MatSort, { static: true },] }],
paginator: [{ type: ViewChild, args: [MatPaginator, { static: true },] }],
dataSource: [{ type: Input }],
backgroundColor: [{ type: Input }],
direction: [{ type: Input }, { type: HostBinding, args: ["style.direction",] }],
contextMenuItems: [{ type: Input }],
ScrollStrategyType: [{ type: Input }],
pagingMode: [{ type: Input }],
pagination: [{ type: Input }],
rowSelectionModel: [{ type: Input }],
rowSelectionMode: [{ type: Input }],
tableName: [{ type: Input }],
showProgress: [{ type: Input }],
expandComponent: [{ type: Input }],
rowContextMenuItems: [{ type: Input }],
defaultWidth: [{ type: Input }],
minWidth: [{ type: Input }],
columns: [{ type: Input }],
printConfig: [{ type: Input }],
sticky: [{ type: Input }],
pending: [{ type: Input }],
rowHeight: [{ type: Input }],
headerHeight: [{ type: Input }],
footerHeight: [{ type: Input }],
headerEnable: [{ type: Input }],
footerEnable: [{ type: Input }],
showNoData: [{ type: Input }],
showReload: [{ type: Input }],
onTableEvent: [{ type: Output }],
onRowEvent: [{ type: Output }],
settingChange: [{ type: Output }],
paginationChange: [{ type: Output }],
table: [{ type: ViewChild, args: [MatTable, { static: true },] }],
viewport: [{ type: ViewChild, args: [CdkVirtualScrollViewport, { static: true },] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29yZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLW1hdC10YWJsZS9zcmMvbGliL2NvcmVzL3RhYmxlLmNvcmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25FLE9BQ0EsRUFDRSxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFPOUUsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLCtCQUErQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFHakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU12QyxNQUFNLE9BQU8sa0JBQWtCO0lBMFE3QixZQUNTLFlBQTBCLEVBQzFCLEdB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QyxJQUFJLENBQUM7Z0JBQ25CLEtBQUssRUFBRSxvQkFBb0I7Z0JBQzNCLE1BQU0sRUFBRTtvQkFDTixjQUFjLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtvQkFDdkMsR0FBRyxFQUFFLEdBQUc7aUJBQ1Q7YUFDRixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Ozs7WUFuZkYsU0FBUyxTQUFDO2dCQUNULDhDQUE4QztnQkFDOUMsUUFBUSxFQUFFLFFBQVE7YUFDbkI7Ozs7Ozs7Ozs7WUFwQlEsWUFBWTtZQVBuQixpQkFBaUI7WUFjVixZQUFZOzs7O21CQWVsQixTQUFTLFNBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTt3QkFDbkMsU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7eUJBQ3hDLEtBQUs7OEJBQ0wsS0FBSzt3QkFDTCxLQUFLLFlBQ0wsV0FBVyxTQUFDLGlCQUFpQjsrQkFVN0IsS0FBSztpQ0FDTCxLQUFLO3lCQVdMLEtBQUs7eUJBV0wsS0FBSztnQ0F1QkwsS0FBSzsrQkFzQkwsS0FBSzt3QkF3Q0wsS0FBSzsyQkFVTCxLQUFLOzhCQTZCTCxLQUFLO2tDQWlCTCxLQUFLOzJCQUNMLEtBQUs7dUJBQ0wsS0FBSztzQkFDTCxLQUFLOzBCQTJETCxLQUFLO3FCQUNMLEtBQUs7c0JBQ0wsS0FBSzt3QkFDTCxLQUFLOzJCQUNMLEtBQUs7MkJBQ0wsS0FBSzsyQkFDTCxLQUFLOzJCQUNMLEtBQUs7eUJBQ0wsS0FBSzt5QkFDTCxLQUFLOzJCQUVMLE1BQU07eUJBQ04sTUFBTTs0QkFDTixNQUFNOytCQUNOLE1BQU07b0JBaUROLFNBQVMsU0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3VCQUNwQyxTQUFTLFNBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0XHJcbntcclxuICBJUm93RXZlbnQsXHJcbiAgVGFibGVSb3csXHJcbiAgVGFibGVTZWxlY3Rpb25Nb2RlLFxyXG4gIElUYWJsZUV2ZW50LFxyXG59IGZyb20gXCIuLi9tb2RlbHMvdGFibGUtcm93Lm1vZGVsXCI7XHJcbmltcG9ydCB7IFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2UgfSBmcm9tIFwiLi90YWJsZS1kYXRhLXNvdXJjZVwiO1xyXG5pbXBvcnRcclxue1xyXG4gIFZpZXdDaGlsZCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFRhYmxlRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL3RhYmxlLWZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IHRpdGxlQ2FzZSB9IGZyb20gXCIuLi91dGlsaXplcy91dGlsaXplc1wiO1xyXG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xyXG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2RyYWctZHJvcFwiO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2R5bmFtaWMtbWF0LXRhYmxlL2R5bmFtaWMtbWF0LXRhYmxlLnNlcnZpY2VcIjtcclxuaW1wb3J0XHJcbntcclxuICBUYWJsZVBhZ2luYXRpb24sXHJcbiAgVGFibGVQYWdpbmF0aW9uTW9kZSxcclxufSBmcm9tIFwiLi4vbW9kZWxzL3RhYmxlLXBhZ2luYXRpb24ubW9kZWxcIjtcclxuaW1wb3J0IHsgUHJpbnRDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL3ByaW50LWNvbmZpZy5tb2RlbFwiO1xyXG5pbXBvcnQgeyBUYWJsZVNldHRpbmcsIERpcmVjdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvdGFibGUtc2V0dGluZy5tb2RlbFwiO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NvcnRcIjtcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvclwiO1xyXG5pbXBvcnQgeyBNYXRUYWJsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xyXG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBjbG9uZSwgZ2V0T2JqZWN0UHJvcCwgaXNOdWxsb3JVbmRlZmluZWQgfSBmcm9tIFwiLi90eXBlXCI7XHJcbmltcG9ydCB7IFRhYmxlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tIFwiLi9maXhlZC1zaXplLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXN0cmF0ZWd5XCI7XHJcbmltcG9ydCB7IENvbnRleHRNZW51SXRlbSB9IGZyb20gXCIuLi9tb2RlbHMvY29udGV4dC1tZW51Lm1vZGVsXCI7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6IFwiW2NvcmVdXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvcmVEaXJlY3RpdmU8VCBleHRlbmRzIFRhYmxlUm93PiB7XHJcbiAgQFZpZXdDaGlsZChNYXRTb3J0LCB7IHN0YXRpYzogdHJ1ZSB9KSBzb3J0OiBNYXRTb3J0O1xyXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yLCB7IHN0YXRpYzogdHJ1ZSB9KSBwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuICBASW5wdXQoKSBwdWJsaWMgZGF0YVNvdXJjZTogQmVoYXZpb3JTdWJqZWN0PGFueVtdPjtcclxuICBASW5wdXQoKSBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KClcclxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS5kaXJlY3Rpb25cIilcclxuICBnZXQgZGlyZWN0aW9uKCk6IERpcmVjdGlvblxyXG4gIHtcclxuICAgIHJldHVybiB0aGlzLnRhYmxlU2V0dGluZz8uZGlyZWN0aW9uO1xyXG4gIH1cclxuICBzZXQgZGlyZWN0aW9uKHZhbHVlOiBEaXJlY3Rpb24pXHJcbiAge1xyXG4gICAgdGhpcy50YWJsZVNldHRpbmcuZGlyZWN0aW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBjb250ZXh0TWVudUl0ZW1zOiBDb250ZXh0TWVudUl0ZW1bXSA9IFtdO1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IFNjcm9sbFN0cmF0ZWd5VHlwZSgpXHJcbiAge1xyXG4gICAgcmV0dXJuIHRoaXMudGFibGVTZXR0aW5nLnNjcm9sbFN0cmF0ZWd5O1xyXG4gIH1cclxuICBzZXQgU2Nyb2xsU3RyYXRlZ3lUeXBlKHZhbHVlOiBUYWJsZVNjcm9sbFN0cmF0ZWd5KVxyXG4gIHtcclxuICAgIHRoaXMudmlld3BvcnRbXCJfc2Nyb2xsU3RyYXRlZ3lcIl0uc2Nyb2xsU3RyYXRlZ3lNb2RlID0gdmFsdWU7XHJcbiAgICB0aGlzLnRhYmxlU2V0dGluZy5zY3JvbGxTdHJhdGVneSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgcGFnaW5nTW9kZSgpXHJcbiAge1xyXG4gICAgcmV0dXJuIHRoaXMudGFibGVQYWdpbmdNb2RlO1xyXG4gIH1cclxuICBzZXQgcGFnaW5nTW9kZSh2YWx1ZTogVGFibGVQYWdpbmF0aW9uTW9kZSlcclxuICB7XHJcbiAgICB0aGlzLnRhYmxlUGFnaW5nTW9kZSA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBwYWdpbmF0aW9uKClcclxuICB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVQYWdpbmF0aW9uO1xyXG4gIH1cclxuICBzZXQgcGFnaW5hdGlvbih2YWx1ZTogVGFibGVQYWdpbmF0aW9uKVxyXG4gIHtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgdGhpcy5fdGFibGVQYWdpbmF0aW9uID0gdmFsdWU7XHJcbiAgICAgIGlmIChpc051bGxvclVuZGVmaW5lZCh0aGlzLl90YWJsZVBhZ2luYXRpb24ucGFnZVNpemVPcHRpb25zKSlcclxuICAgICAge1xyXG4gICAgICAgIHRoaXMuX3RhYmxlUGFnaW5hdGlvbi5wYWdlU2l6ZU9wdGlvbnMgPSBbNSwgMTAsIDI1LCAxMDBdO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc051bGxvclVuZGVmaW5lZCh0aGlzLl90YWJsZVBhZ2luYXRpb24ucGFnZVNpemUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5fdGFibGVQYWdpbmF0aW9uLnBhZ2VTaXplID1cclxuICAgICAgICAgIHRoaXMuX3RhYmxlUGFnaW5hdGlvbi5wYWdlU2l6ZU9wdGlvbnNbMF07XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCByb3dTZWxlY3Rpb25Nb2RlbCgpXHJcbiAge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGVsO1xyXG4gIH1cclxuICBzZXQgcm93U2VsZWN0aW9uTW9kZWwodmFsdWU6IFNlbGVjdGlvbk1vZGVsPFQ+KVxyXG4gIHtcclxuICAgIGlmICghaXNOdWxsb3JVbmRlZmluZWQodmFsdWUpKVxyXG4gICAge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5fcm93U2VsZWN0aW9uTW9kZSAmJlxyXG4gICAgICAgIHZhbHVlICYmXHJcbiAgICAgICAgdGhpcy5fcm93U2VsZWN0aW9uTW9kZSAhPT0gXCJub25lXCJcclxuICAgICAgKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5fcm93U2VsZWN0aW9uTW9kZSA9XHJcbiAgICAgICAgICB2YWx1ZS5pc011bHRpcGxlU2VsZWN0aW9uKCkgPT09IHRydWUgPyBcIm11bHRpXCIgOiBcInNpbmdsZVwiO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGVsID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCByb3dTZWxlY3Rpb25Nb2RlKClcclxuICB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm93U2VsZWN0aW9uTW9kZTtcclxuICB9XHJcbiAgc2V0IHJvd1NlbGVjdGlvbk1vZGUoc2VsZWN0aW9uOiBUYWJsZVNlbGVjdGlvbk1vZGUpXHJcbiAge1xyXG4gICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uIHx8IFwibm9uZVwiO1xyXG4gICAgY29uc3QgaXNTZWxlY3Rpb25Db2x1bW4gPSBzZWxlY3Rpb24gPT09IFwic2luZ2xlXCIgfHwgc2VsZWN0aW9uID09PSBcIm11bHRpXCI7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGVsID09PSBudWxsIHx8XHJcbiAgICAgICh0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlbC5pc011bHRpcGxlU2VsZWN0aW9uKCkgPT09IHRydWUgJiZcclxuICAgICAgICBzZWxlY3Rpb24gPT09IFwic2luZ2xlXCIpIHx8XHJcbiAgICAgICh0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlbC5pc011bHRpcGxlU2VsZWN0aW9uKCkgPT09IGZhbHNlICYmXHJcbiAgICAgICAgc2VsZWN0aW9uID09PSBcIm11bHRpXCIpXHJcbiAgICApXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPFQ+KFxyXG4gICAgICAgIHNlbGVjdGlvbiA9PT0gXCJtdWx0aVwiLFxyXG4gICAgICAgIFtdXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucz8ubGVuZ3RoID4gMCAmJlxyXG4gICAgICAhaXNTZWxlY3Rpb25Db2x1bW4gJiZcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zWzBdID09PSBcInJvdy1jaGVja2JveFwiXHJcbiAgICApXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5zaGlmdCgpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zPy5sZW5ndGggPiAwICYmXHJcbiAgICAgIGlzU2VsZWN0aW9uQ29sdW1uICYmXHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1uc1swXSAhPT0gXCJyb3ctY2hlY2tib3hcIlxyXG4gICAgKVxyXG4gICAge1xyXG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMudW5zaGlmdChcInJvdy1jaGVja2JveFwiKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCB0YWJsZU5hbWUoKVxyXG4gIHtcclxuICAgIHJldHVybiB0aGlzLnRhYmxlU2VydmljZS50YWJsZU5hbWU7XHJcbiAgfVxyXG4gIHNldCB0YWJsZU5hbWUodmFsdWU6IHN0cmluZylcclxuICB7XHJcbiAgICB0aGlzLnRhYmxlU2VydmljZS50YWJsZU5hbWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHNob3dQcm9ncmVzcygpXHJcbiAge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3NDb2x1bW4ubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgc2V0IHNob3dQcm9ncmVzcyh2YWx1ZTogYm9vbGVhbilcclxuICB7XHJcbiAgICB0aGlzLnByb2dyZXNzQ29sdW1uID0gW107XHJcbiAgICBpZiAodmFsdWUgPT09IHRydWUpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMucHJvZ3Jlc3NDb2x1bW4ucHVzaChcInByb2dyZXNzXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGluaXRTeXN0ZW1GaWVsZChkYXRhOiBhbnlbXSlcclxuICB7XHJcbiAgICBpZiAoZGF0YSlcclxuICAgIHtcclxuICAgICAgZGF0YSA9IGRhdGEubWFwKChpdGVtLCBpbmRleCkgPT5cclxuICAgICAge1xyXG4gICAgICAgIGl0ZW0uaWQgPSBpbmRleDtcclxuICAgICAgICBpdGVtLm9wdGlvbiA9IGl0ZW0ub3B0aW9uIHx8IHt9O1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBleHBhbmRDb2x1bW4gPSBbXTtcclxuICBwcml2YXRlIF9leHBhbmRDb21wb25lbnQ6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIGdldCBleHBhbmRDb21wb25lbnQoKTogYW55XHJcbiAge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V4cGFuZENvbXBvbmVudDtcclxuICB9XHJcbiAgc2V0IGV4cGFuZENvbXBvbmVudCh2YWx1ZTogYW55KVxyXG4gIHtcclxuICAgIHRoaXMuX2V4cGFuZENvbXBvbmVudCA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuX2V4cGFuZENvbXBvbmVudCAhPT0gbnVsbCAmJiB0aGlzLl9leHBhbmRDb21wb25lbnQgIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgdGhpcy5leHBhbmRDb2x1bW4gPSBbXCJleHBhbmRlZERldGFpbFwiXTtcclxuICAgIH0gZWxzZVxyXG4gICAge1xyXG4gICAgICB0aGlzLmV4cGFuZENvbHVtbiA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgcHVibGljIHJvd0NvbnRleHRNZW51SXRlbXM6IENvbnRleHRNZW51SXRlbVtdO1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRXaWR0aDogbnVtYmVyID0gbnVsbDtcclxuICBASW5wdXQoKSBtaW5XaWR0aCA9IDEyMDtcclxuICBASW5wdXQoKVxyXG4gIGdldCBjb2x1bW5zKClcclxuICB7XHJcbiAgICByZXR1cm4gdGhpcy50YWJsZUNvbHVtbnM7XHJcbiAgfVxyXG4gIHNldCBjb2x1bW5zKGZpZWxkczogVGFibGVGaWVsZDxUPltdKVxyXG4gIHtcclxuICAgIChmaWVsZHMgfHwgW10pLmZvckVhY2goKGYsIGkpID0+XHJcbiAgICB7XHJcbiAgICAgIC8vIGtleSBuYW1lIGVycm9yIC8vXHJcbiAgICAgIGlmIChmLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpZFwiKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhyb3cgJ0ZpZWxkIG5hbWUgaXMgcmVzZXJ2ZWQuW1wiaWRcIl0nO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNldHRpbmdGaWVsZHMgPSAodGhpcy50YWJsZVNldHRpbmcuY29sdW1uU2V0dGluZyB8fCBbXSkuZmlsdGVyKFxyXG4gICAgICAgIChzKSA9PiBzLm5hbWUgPT09IGYubmFtZVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzZXR0aW5nRmllbGQgPSBzZXR0aW5nRmllbGRzLmxlbmd0aCA+IDAgPyBzZXR0aW5nRmllbGRzWzBdIDogbnVsbDtcclxuICAgICAgLyogZGVmYXVsdCB2YWx1ZSBmb3IgZmllbGRzICovXHJcbiAgICAgIGYucHJpbnRhYmxlID0gZi5wcmludGFibGUgfHwgdHJ1ZTtcclxuICAgICAgZi5leHBvcnRhYmxlID0gZi5leHBvcnRhYmxlIHx8IHRydWU7XHJcbiAgICAgIGYudG9FeHBvcnQgPVxyXG4gICAgICAgIGYudG9FeHBvcnQgfHxcclxuICAgICAgICAoKHJvdywgdHlwZSkgPT4gKHR5cGVvZiByb3cgPT09IFwib2JqZWN0XCIgPyByb3dbZi5uYW1lXSA6IFwiXCIpKTtcclxuICAgICAgZi50b1ByaW50ID0gKHJvdykgPT4gKHR5cGVvZiByb3cgPT09IFwib2JqZWN0XCIgPyByb3dbZi5uYW1lXSA6IFwiXCIpO1xyXG4gICAgICBmLmVuYWJsZUNvbnRleHRNZW51ID0gZi5lbmFibGVDb250ZXh0TWVudSB8fCB0cnVlO1xyXG4gICAgICBmLmhlYWRlciA9IGYuaGVhZGVyIHx8IHRpdGxlQ2FzZShmLm5hbWUpO1xyXG4gICAgICBmLmRpc3BsYXkgPSBnZXRPYmplY3RQcm9wKFwiZGlzcGxheVwiLCBcInZpc2libGVcIiwgc2V0dGluZ0ZpZWxkLCBmKTtcclxuICAgICAgZi5maWx0ZXIgPSBnZXRPYmplY3RQcm9wKFwiZmlsdGVyXCIsIFwiY2xpZW50LXNpZGVcIiwgc2V0dGluZ0ZpZWxkLCBmKTtcclxuICAgICAgZi5zb3J0ID0gZ2V0T2JqZWN0UHJvcChcInNvcnRcIiwgXCJjbGllbnQtc2lkZVwiLCBzZXR0aW5nRmllbGQsIGYpO1xyXG4gICAgICBmLnN0aWNreSA9IGdldE9iamVjdFByb3AoXCJzdGlja3lcIiwgXCJub25lXCIsIHNldHRpbmdGaWVsZCwgZik7XHJcbiAgICAgIGYud2lkdGggPSBnZXRPYmplY3RQcm9wKFwid2lkdGhcIiwgdGhpcy5kZWZhdWx0V2lkdGgsIHNldHRpbmdGaWVsZCwgZik7XHJcbiAgICAgIGNvbnN0IHVuaXQgPSBmLndpZHRoVW5pdCB8fCBcInB4XCI7XHJcbiAgICAgIGNvbnN0IHN0eWxlID0gdW5pdCA9PT0gXCJweFwiID8gZi53aWR0aCArIFwicHhcIiA6IGBjYWxjKCAke2Yud2lkdGhQZXJjZW50YWdlfSUgKWA7XHJcbiAgICAgIGlmIChmLndpZHRoKVxyXG4gICAgICB7XHJcbiAgICAgICAgZi5zdHlsZSA9IHtcclxuICAgICAgICAgIC4uLmYuc3R5bGUsXHJcbiAgICAgICAgICBcIm1heC13aWR0aFwiOiBzdHlsZSxcclxuICAgICAgICAgIFwibWluLXdpZHRoXCI6IHN0eWxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy50YWJsZUNvbHVtbnMgPSBmaWVsZHM7XHJcblxyXG4gICAgdGhpcy51cGRhdGVDb2x1bW4oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVDb2x1bW4oKVxyXG4gIHtcclxuICAgIGlmICh0aGlzLnRhYmxlQ29sdW1ucylcclxuICAgIHtcclxuICAgICAgLy8gaXNOdWxsb3JVbmRlZmluZWQodGhpcy50YWJsZVNldHRpbmcuY29sdW1uU2V0dGluZylcclxuICAgICAgdGhpcy50YWJsZVNldHRpbmcuY29sdW1uU2V0dGluZyA9IGNsb25lKHRoaXMudGFibGVDb2x1bW5zKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0RGlzcGxheWVkQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJL08gcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgQElucHV0KCkgcHJpbnRDb25maWc6IFByaW50Q29uZmlnID0ge307XHJcbiAgQElucHV0KCkgc3RpY2t5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHBlbmRpbmc6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgcm93SGVpZ2h0ID0gNDg7XHJcbiAgQElucHV0KCkgaGVhZGVySGVpZ2h0ID0gNTY7XHJcbiAgQElucHV0KCkgZm9vdGVySGVpZ2h0ID0gNDg7XHJcbiAgQElucHV0KCkgaGVhZGVyRW5hYmxlID0gdHJ1ZTtcclxuICBASW5wdXQoKSBmb290ZXJFbmFibGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93Tm9EYXRhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHNob3dSZWxvYWQ6IGJvb2xlYW47XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgQE91dHB1dCgpIG9uVGFibGVFdmVudDogRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25Sb3dFdmVudDogRXZlbnRFbWl0dGVyPElSb3dFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHNldHRpbmdDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IHR5cGU6ICdjcmVhdGUnIHwgJ3NhdmUnIHwgJ2FwcGx5JyB8ICdkZWxldGUnIHwgJ2RlZmF1bHQnIHwgJ3NlbGVjdCcgfCAnZXJyb3InLCBzZXR0aW5nOiBUYWJsZVNldHRpbmcgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHBhZ2luYXRpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2luYXRpb24+ID1cclxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBwdWJsaWMgbm9EYXRhOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8qKnRoaXMgZXZlbnQgaXMgZGVwcmVjYXRlIGFuZCBtb3ZlIHRvIG9uUm93RXZlbnQgKi9cclxuICAvLyBAT3V0cHV0KCkgcm93QWN0aW9uTWVudUNoYW5nZTogRXZlbnRFbWl0dGVyPElSb3dBY3Rpb25NZW51RXZlbnQ8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRXhwYW5kIFJvdyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgZXhwYW5kZWRFbGVtZW50OiBUYWJsZVJvdyB8IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHRhYmxlU2VydmljZTogVGFibGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBUYWJsZVNldHRpbmdcclxuICApXHJcbiAge1xyXG4gICAgdGhpcy5zaG93UHJvZ3Jlc3MgPSB0cnVlO1xyXG4gICAgdGhpcy50YWJsZVNldHRpbmcgPSB7XHJcbiAgICAgIGRpcmVjdGlvbjogXCJsdHJcIixcclxuICAgICAgY29sdW1uU2V0dGluZzogbnVsbCxcclxuICAgICAgdmlzaWJsZUFjdGlvbk1lbnU6IG51bGwsXHJcbiAgICB9O1xyXG4gICAgaWYodGhpcy5jb25maWcpIHtcclxuICAgICAgdGhpcy50YWJsZVNldHRpbmcgPSB7Li4udGhpcy50YWJsZVNldHRpbmcsIC4uLnRoaXMuY29uZmlnfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFZhcmlhYmxlcyAvL1xyXG4gIHByb2dyZXNzQ29sdW1uOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcbiAgZGlzcGxheWVkRm9vdGVyOiBzdHJpbmdbXSA9IFtdO1xyXG4gIC8vIHByaXZhdGUgbWVudXM6IFRhYmxlTWVudVtdID0gW107XHJcbiAgcHVibGljIHRhYmxlQ29sdW1uczogVGFibGVGaWVsZDxUPltdO1xyXG4gIHB1YmxpYyB0dnNEYXRhU291cmNlOiBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlPFQ+ID1cclxuICAgIG5ldyBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlPFQ+KFtdKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9yb3dTZWxlY3Rpb25Nb2RlOiBUYWJsZVNlbGVjdGlvbk1vZGU7XHJcbiAgcHJpdmF0ZSBfcm93U2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8VD4odHJ1ZSwgW10pO1xyXG4gIHByaXZhdGUgX3RhYmxlUGFnaW5hdGlvbjogVGFibGVQYWdpbmF0aW9uID0ge1xyXG4gICAgcGFnZUluZGV4OiAwLFxyXG4gICAgcGFnZVNpemU6IDEwLFxyXG4gICAgcGFnZVNpemVPcHRpb25zOiBbNSwgMTAsIDEwMCwgMTAwMCwgMTAwMDBdXHJcbiAgfTtcclxuICBwdWJsaWMgdGFibGVQYWdpbmdNb2RlOiBUYWJsZVBhZ2luYXRpb25Nb2RlID0gXCJub25lXCI7XHJcbiAgcHVibGljIHZpZXdwb3J0Q2xhc3M6IFwidmlld3BvcnRcIiB8IFwidmlld3BvcnQtd2l0aC1wYWdpbmF0aW9uXCIgPVxyXG4gICAgXCJ2aWV3cG9ydC13aXRoLXBhZ2luYXRpb25cIjtcclxuICB0YWJsZVNldHRpbmc6IFRhYmxlU2V0dGluZztcclxuXHJcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUmVmZXJlbmNlIFZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgQFZpZXdDaGlsZChNYXRUYWJsZSwgeyBzdGF0aWM6IHRydWUgfSkgdGFibGUhOiBNYXRUYWJsZTxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHZpZXdwb3J0ITogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xyXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbiAgdXBkYXRlUGFnaW5hdGlvbigpXHJcbiAge1xyXG4gICAgaWYgKGlzTnVsbG9yVW5kZWZpbmVkKHRoaXMudHZzRGF0YVNvdXJjZSkpXHJcbiAgICB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy50YWJsZVBhZ2luZ01vZGUgPT09IFwiY2xpZW50LXNpZGVcIiB8fFxyXG4gICAgICB0aGlzLnRhYmxlUGFnaW5nTW9kZSA9PT0gXCJzZXJ2ZXItc2lkZVwiXHJcbiAgICApXHJcbiAgICB7XHJcbiAgICAgIHRoaXMudmlld3BvcnRDbGFzcyA9IFwidmlld3BvcnQtd2l0aC1wYWdpbmF0aW9uXCI7XHJcbiAgICAgIGlmICghaXNOdWxsb3JVbmRlZmluZWQodGhpcy50dnNEYXRhU291cmNlLnBhZ2luYXRvcikpXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgZGF0YUxlbiA9IHRoaXMudHZzRGF0YVNvdXJjZS5wYWdpbmF0b3IubGVuZ3RoO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICFpc051bGxvclVuZGVmaW5lZCh0aGlzLl90YWJsZVBhZ2luYXRpb24ubGVuZ3RoKSAmJlxyXG4gICAgICAgICAgdGhpcy5fdGFibGVQYWdpbmF0aW9uLmxlbmd0aCA+IGRhdGFMZW5cclxuICAgICAgICApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUxlbiA9IHRoaXMuX3RhYmxlUGFnaW5hdGlvbi5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudHZzRGF0YVNvdXJjZS5wYWdpbmF0b3IubGVuZ3RoID0gZGF0YUxlbjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHRoaXMudmlld3BvcnRDbGFzcyA9IFwidmlld3BvcnRcIjtcclxuICAgICAgaWYgKCh0aGlzLnR2c0RhdGFTb3VyY2UgYXMgYW55KS5fcGFnaW5hdG9yICE9PSB1bmRlZmluZWQpXHJcbiAgICAgIHtcclxuICAgICAgICBkZWxldGUgKHRoaXMudHZzRGF0YVNvdXJjZSBhcyBhbnkpLl9wYWdpbmF0b3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudHZzRGF0YVNvdXJjZS5yZWZyZXNoRmlsdGVyUHJlZGljYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKVxyXG4gIHtcclxuICAgIGlmICh0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlbClcclxuICAgIHtcclxuICAgICAgdGhpcy5fcm93U2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhcigpXHJcbiAge1xyXG4gICAgaWYgKCFpc051bGxvclVuZGVmaW5lZCh0aGlzLnR2c0RhdGFTb3VyY2UpKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy52aWV3cG9ydClcclxuICAgICAge1xyXG4gICAgICAgIHRoaXMudmlld3BvcnQuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiBcImF1dG9cIiB9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnR2c0RhdGFTb3VyY2UuY2xlYXJEYXRhKCk7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWRFbGVtZW50ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG5cclxuICBzZXREaXNwbGF5ZWRDb2x1bW5zKClcclxuIC