ornamentum
Version:
Angular Toolkit
508 lines • 44.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ContentChild, Input, TemplateRef } from '@angular/core';
import { DataTableConfigService } from '../../services/data-table-config.service';
import { DataTableEventStateService } from '../../services/data-table-event.service';
import { DataTableDataStateService } from '../../services/data-table-data-state.service';
/**
* Data table column component. Data table columns associated data is captured via this component.
*/
var DataTableColumnComponent = /** @class */ (function () {
function DataTableColumnComponent(dataTableConfigService, eventStateService, dataStateService) {
this.dataTableConfigService = dataTableConfigService;
this.eventStateService = eventStateService;
this.dataStateService = dataStateService;
this.currentSortOrder = '';
this.baseSortOrder = '';
/**
* Show filed in column selector popup if true.
*/
this.showInColumnSelector = true; // TODO: move to base conf
// Table column config
this.sortable = dataTableConfigService.sortable;
this.currentSortOrder = dataTableConfigService.sortOrder;
this.filterable = dataTableConfigService.filterable;
this.filterPlaceholder = dataTableConfigService.filterPlaceholder;
this.resizable = dataTableConfigService.columnResizable;
this.visible = dataTableConfigService.columnVisible;
this.showDropdownFilter = dataTableConfigService.showDropdownFilter;
this.showFilterClearButton = dataTableConfigService.showFilterClearButton;
// Dropdown filter config
this.dropdownFilterMenuPosition = dataTableConfigService.dropdownFilterMenuPosition;
this.dropdownFilterSelectMode = dataTableConfigService.dropdownFilterSelectMode;
this.dropdownFilterSearchable = dataTableConfigService.dropdownFilterSearchable;
this.dropdownFilterSearchDebounceTime = dataTableConfigService.dropdownFilterSearchDebounceTime;
this.dropdownFilterSearchDebounce = dataTableConfigService.dropdownFilterSearchDebounce;
this.dropdownFilterWrapDisplaySelectLimit = dataTableConfigService.dropdownFilterWrapDisplaySelectLimit;
this.dropdownFilterGroupByField = dataTableConfigService.dropdownFilterGroupByField;
this.dropdownFilterShowSelectedOptionRemoveButton = dataTableConfigService.dropdownFilterShowSelectedOptionRemoveButton;
this.dropdownFilterShowClearSelectionButton = dataTableConfigService.dropdownFilterShowClearSelectionButton;
this.dropdownFilterMenuWidth = dataTableConfigService.dropdownFilterMenuWidth;
this.dropdownFilterMenuHeight = dataTableConfigService.dropdownFilterMenuHeight;
this.dropdownFilterMultiSelectOptionMaxWidth = dataTableConfigService.dropdownFilterMultiSelectOptionMaxWidth;
this.dropdownFilterCloseMenuOnSelect = dataTableConfigService.dropdownFilterCloseMenuOnSelect;
this.dropdownFilterDynamicDimensionCalculation = dataTableConfigService.dropdownFilterDynamicDimensionCalculation;
this.dropdownFilterDynamicWidthRatio = dataTableConfigService.dropdownFilterDynamicWidthRatio;
this.dropdownFilterDynamicHeightRatio = dataTableConfigService.dropdownFilterDynamicHeightRatio;
}
Object.defineProperty(DataTableColumnComponent.prototype, "sortOrder", {
/**
* Get initial column sort order.
*/
get: /**
* Get initial column sort order.
* @return {?}
*/
function () {
return this.currentSortOrder;
},
/**
* Set initial column sort order.
*/
set: /**
* Set initial column sort order.
* @param {?} value
* @return {?}
*/
function (value) {
this.currentSortOrder = value;
this.baseSortOrder = value;
},
enumerable: true,
configurable: true
});
/**
* Reset data sort order.
*/
/**
* Reset data sort order.
* @return {?}
*/
DataTableColumnComponent.prototype.resetSortOrder = /**
* Reset data sort order.
* @return {?}
*/
function () {
this.currentSortOrder = this.baseSortOrder;
};
/**
* Get dynamic cell color.
* @param row Data row object.
* @return Cell color string.
*/
/**
* Get dynamic cell color.
* @param {?} row Data row object.
* @return {?} Cell color string.
*/
DataTableColumnComponent.prototype.getCellColor = /**
* Get dynamic cell color.
* @param {?} row Data row object.
* @return {?} Cell color string.
*/
function (row) {
if (this.onCellColorRender !== undefined) {
return this.onCellColorRender(row, this);
}
};
/**
* Get new sort order upon sort click.
* @return New sort order enum value.
*/
/**
* Get new sort order upon sort click.
* @return {?} New sort order enum value.
*/
DataTableColumnComponent.prototype.getNewSortOrder = /**
* Get new sort order upon sort click.
* @return {?} New sort order enum value.
*/
function () {
/** @type {?} */
var newSortOrder;
switch (this.sortOrder) {
case 'asc':
newSortOrder = 'desc';
break;
case 'desc':
newSortOrder = '';
break;
case '':
newSortOrder = 'asc';
break;
}
return newSortOrder;
};
/**
* Get current sort state icon css class enabled state.
* @return Sort order icon css class collection object.
*/
/**
* Get current sort state icon css class enabled state.
* @return {?} Sort order icon css class collection object.
*/
DataTableColumnComponent.prototype.getSortIconClass = /**
* Get current sort state icon css class enabled state.
* @return {?} Sort order icon css class collection object.
*/
function () {
return {
'sort-asc': this.sortOrder === 'asc',
'sort-dsc': this.sortOrder === 'desc',
'sort-reset': !this.sortOrder
};
};
/**
* Component destroy lifecycle event handler.
*/
/**
* Component destroy lifecycle event handler.
* @return {?}
*/
DataTableColumnComponent.prototype.ngOnDestroy = /**
* Component destroy lifecycle event handler.
* @return {?}
*/
function () {
if (this.filterValueExtractorSubscription) {
this.filterValueExtractorSubscription.unsubscribe();
}
};
/**
* Component initialize lifecycle event handler.
*/
/**
* Component initialize lifecycle event handler.
* @return {?}
*/
DataTableColumnComponent.prototype.ngOnInit = /**
* Component initialize lifecycle event handler.
* @return {?}
*/
function () {
if (!this.cssClass && this.field) {
if (/^[a-zA-Z0-9_]+$/.test(this.field)) {
this.cssClass = 'column-' + this.field;
}
else {
this.cssClass = 'column-' + this.field.replace(/[^a-zA-Z0-9_]/g, '');
}
}
this.eventStateService.columnBind.emit(this);
if (this.dataTableConfigService.multiColumnSortable && this.sortable) {
if (this.sortOrder === '') {
if (this.sortPriority !== undefined) {
throw Error('[sortPriority] should be ignored when multi column sorting is enabled with natural sort order.');
}
}
else {
if (this.sortPriority === undefined) {
throw Error('[sortPriority] is required when multi column sorting is enabled with an explicit sort order.');
}
}
if (this.sortPriority < 1) {
throw Error('[sortPriority] must be greater than 1.');
}
if (this.dataStateService.currentSortPriority < this.sortPriority) {
this.dataStateService.currentSortPriority = this.sortPriority;
}
}
};
DataTableColumnComponent.decorators = [
{ type: Component, args: [{
selector: 'ng-data-table-column',
template: ''
}] }
];
/** @nocollapse */
DataTableColumnComponent.ctorParameters = function () { return [
{ type: DataTableConfigService },
{ type: DataTableEventStateService },
{ type: DataTableDataStateService }
]; };
DataTableColumnComponent.propDecorators = {
cellTemplate: [{ type: ContentChild, args: ['ngDataTableCell', { static: true },] }],
headerTemplate: [{ type: ContentChild, args: ['ngDataTableHeader', { static: true },] }],
filterTemplate: [{ type: ContentChild, args: ['ngDataTableFilter', { static: true },] }],
dropdownFilterLoadingSpinnerTemplate: [{ type: ContentChild, args: ['ngFilterDropdownLoadingSpinner', { static: true },] }],
dropdownFilterOptionTemplate: [{ type: ContentChild, args: ['ngFilterDropdownOption', { static: true },] }],
dropdownFilterOptionGroupHeaderTemplate: [{ type: ContentChild, args: ['ngFilterDropdownOptionGroupHeader', { static: true },] }],
filterExpression: [{ type: Input }],
filterFieldMapper: [{ type: Input }],
onCellColorRender: [{ type: Input }],
title: [{ type: Input }],
sortable: [{ type: Input }],
sortPriority: [{ type: Input }],
sortOrder: [{ type: Input }],
filterable: [{ type: Input }],
resizable: [{ type: Input }],
field: [{ type: Input }],
filterField: [{ type: Input }],
sortField: [{ type: Input }],
cssClass: [{ type: Input }],
width: [{ type: Input }],
visible: [{ type: Input }],
showInColumnSelector: [{ type: Input }],
filterPlaceholder: [{ type: Input }],
filter: [{ type: Input }],
showFilterClearButton: [{ type: Input }],
resizeMinLimit: [{ type: Input }],
showDropdownFilter: [{ type: Input }],
dropdownFilterMenuPosition: [{ type: Input }],
dropdownFilterSelectMode: [{ type: Input }],
dropdownFilterSearchable: [{ type: Input }],
dropdownFilterSearchDebounceTime: [{ type: Input }],
dropdownFilterSearchDebounce: [{ type: Input }],
dropDownFilterShowOptionSelectCheckbox: [{ type: Input }],
dropdownFilterWrapDisplaySelectLimit: [{ type: Input }],
dropdownFilterGroupByField: [{ type: Input }],
dropdownFilterShowSelectedOptionRemoveButton: [{ type: Input }],
dropdownFilterShowClearSelectionButton: [{ type: Input }],
dropdownFilterMenuWidth: [{ type: Input }],
dropdownFilterMenuHeight: [{ type: Input }],
dropdownFilterMultiSelectOptionMaxWidth: [{ type: Input }],
dropdownFilterCloseMenuOnSelect: [{ type: Input }],
dropdownFilterDynamicDimensionCalculation: [{ type: Input }],
dropdownFilterDynamicWidthRatio: [{ type: Input }],
dropdownFilterDynamicHeightRatio: [{ type: Input }]
};
return DataTableColumnComponent;
}());
export { DataTableColumnComponent };
if (false) {
/**
* @type {?}
* @private
*/
DataTableColumnComponent.prototype.filterValueExtractorSubscription;
/**
* @type {?}
* @private
*/
DataTableColumnComponent.prototype.currentSortOrder;
/**
* @type {?}
* @private
*/
DataTableColumnComponent.prototype.baseSortOrder;
/** @type {?} */
DataTableColumnComponent.prototype.actualWidth;
/** @type {?} */
DataTableColumnComponent.prototype.cellTemplate;
/** @type {?} */
DataTableColumnComponent.prototype.headerTemplate;
/** @type {?} */
DataTableColumnComponent.prototype.filterTemplate;
/** @type {?} */
DataTableColumnComponent.prototype.dropdownFilterLoadingSpinnerTemplate;
/** @type {?} */
DataTableColumnComponent.prototype.dropdownFilterOptionTemplate;
/** @type {?} */
DataTableColumnComponent.prototype.dropdownFilterOptionGroupHeaderTemplate;
/**
* Filter expression event handler callback. Used to apply custom data filter expression logic.
* @type {?}
*/
DataTableColumnComponent.prototype.filterExpression;
/**
* Custom filter field map event handler callback. Used to extract filter field when showDropdownFilter option is true.
* @type {?}
*/
DataTableColumnComponent.prototype.filterFieldMapper;
/**
* Cell color render event handler callback.
* @type {?}
*/
DataTableColumnComponent.prototype.onCellColorRender;
/**
* Column display title.
* @type {?}
*/
DataTableColumnComponent.prototype.title;
/**
* Columns sortable if true. Show sort indicator on column title.
* @type {?}
*/
DataTableColumnComponent.prototype.sortable;
/**
* Multi column sort priority. Lowest number will get the height precedence. Usage of same precedence number in
* multiple columns may lead to unexpected behaviors. This priority number will be displayed in the column header
* when multi column sorting is enabled hence, consider indexing accordingly.
* @type {?}
*/
DataTableColumnComponent.prototype.sortPriority;
/**
* Column filterable if true. Show filter options on filter header row when enabled.
* @type {?}
*/
DataTableColumnComponent.prototype.filterable;
/**
* Column resizeable if true. Show column resize indicator on column right corner.
* @type {?}
*/
DataTableColumnComponent.prototype.resizable;
/**
* Data item mapping field name.
* @type {?}
*/
DataTableColumnComponent.prototype.field;
/**
* Filter field identifier. Fallback to field if not provided.
* @type {?}
*/
DataTableColumnComponent.prototype.filterField;
/**
* Sort field identifier. Fallback to field if not provided.
* @type {?}
*/
DataTableColumnComponent.prototype.sortField;
/**
* Column title CSS class names. Use space delimiter to separate class names.
* @type {?}
*/
DataTableColumnComponent.prototype.cssClass;
/**
* Static column width in pixels or percentage.
* @type {?}
*/
DataTableColumnComponent.prototype.width;
/**
* Render column if true. Else include in column selector but not rendered.
* @type {?}
*/
DataTableColumnComponent.prototype.visible;
/**
* Show filed in column selector popup if true.
* @type {?}
*/
DataTableColumnComponent.prototype.showInColumnSelector;
/**
* Filter placeholder value. Placeholder text to show on filter text box. Applicable only for none dropdown filter mode.
* @type {?}
*/
DataTableColumnComponent.prototype.filterPlaceholder;
/**
* Applied filter value on initialize.
* @type {?}
*/
DataTableColumnComponent.prototype.filter;
/**
* Show filter clear button if true. Applicable only for none dropdown filter mode.
* @type {?}
*/
DataTableColumnComponent.prototype.showFilterClearButton;
/**
* Resize minimum limit. Column cannot be resized to fit less than the number of pixels specified here.
* @type {?}
*/
DataTableColumnComponent.prototype.resizeMinLimit;
/**
* Show dropdown filter if true. Filter data using dropdown filter.
* @type {?}
*/
DataTableColumnComponent.prototype.showDropdownFilter;
/**
* Dropdown filter menu position. Placement of filter popup menu.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterMenuPosition;
/**
* Dropdown select mode. Filter option select mode.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterSelectMode;
/**
* Dropdown filter searchable if true. Display search box within filter option menu.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterSearchable;
/**
* Dropdown filter search debounce time in milliseconds. Applicable only when dropdownFilterSearchDebounce is true.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterSearchDebounceTime;
/**
* Enable dropdown filter data search debounce with provided dropdownFilterSearchDebounceTime if true.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterSearchDebounce;
/**
* Dropdown filter show option select checkbox.
* @type {?}
*/
DataTableColumnComponent.prototype.dropDownFilterShowOptionSelectCheckbox;
/**
* Dropdown filter selected items display limit.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterWrapDisplaySelectLimit;
/**
* Dropdown filter group by field name in item schema.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterGroupByField;
/**
* Dropdown filter show selected option remove button if true.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterShowSelectedOptionRemoveButton;
/**
* Dropdown filter show all select options clear button if true.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterShowClearSelectionButton;
/**
* Dropdown filter menu width in pixels.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterMenuWidth;
/**
* Dropdown filter menu height in pixels.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterMenuHeight;
/**
* Dropdown filter multi select option max width.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterMultiSelectOptionMaxWidth;
/**
* Dropdown filter close menu on select if true.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterCloseMenuOnSelect;
/**
* Dynamically calculate Dropdown filter menu dimensions relative to column width; dropdownFilterMenuWidth and
* dropdownFilterMenuHeight configuration are ignored when true.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterDynamicDimensionCalculation;
/**
* Dynamic dropdown view width ratio. Used for dynamic dimension calculation.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterDynamicWidthRatio;
/**
* Dynamic dropdown view height ratio. Used for dynamic dimension calculation.
* @type {?}
*/
DataTableColumnComponent.prototype.dropdownFilterDynamicHeightRatio;
/**
* @type {?}
* @private
*/
DataTableColumnComponent.prototype.dataTableConfigService;
/**
* @type {?}
* @private
*/
DataTableColumnComponent.prototype.eventStateService;
/**
* @type {?}
* @private
*/
DataTableColumnComponent.prototype.dataStateService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vb3JuYW1lbnR1bS8iLCJzb3VyY2VzIjpbImRhdGEtdGFibGUvY29tcG9uZW50cy9kYXRhLXRhYmxlLWNvbHVtbi9kYXRhLXRhYmxlLWNvbHVtbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBWS9GLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXJGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7O0FBS3pGO0lBdVJFLGtDQUNVLHNCQUE4QyxFQUM5QyxpQkFBNkMsRUFDN0MsZ0JBQTJDO1FBRjNDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUE0QjtRQUM3QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTJCO1FBblI3QyxxQkFBZ0IsR0FBdUIsRUFBRSxDQUFDO1FBQzFDLGtCQUFhLEdBQXVCLEVBQUUsQ0FBQzs7OztRQXNJeEMseUJBQW9CLEdBQUcsSUFBSSxDQUFDLENBQUMsMEJBQTBCO1FBNkk1RCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUM7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQztRQUN6RCxJQUFJLENBQUMsVUFBVSxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQztRQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsc0JBQXNCLENBQUMsaUJBQWlCLENBQUM7UUFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxzQkFBc0Is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b0Q7Ozs7O0lBS3BELDhEQUMwQzs7Ozs7SUFLMUMsZ0ZBQzZEOzs7OztJQUs3RCwwRUFDdUQ7Ozs7O0lBS3ZELDJEQUN1Qzs7Ozs7SUFLdkMsNERBQ3dDOzs7OztJQUt4QywyRUFDdUQ7Ozs7O0lBS3ZELG1FQUNnRDs7Ozs7O0lBTWhELDZFQUMwRDs7Ozs7SUFLMUQsbUVBQytDOzs7OztJQUsvQyxvRUFDZ0Q7Ozs7O0lBRzlDLDBEQUFzRDs7Ozs7SUFDdEQscURBQXFEOzs7OztJQUNyRCxvREFBbUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRGF0YVRhYmxlQ2VsbENvbG9yUmVuZGVyQ2FsbGJhY2sgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0YS10YWJsZS1jZWxsLWNvbG9yLXJlbmRlci1jYWxsYmFjay5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhVGFibGVSb3cgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0YS10YWJsZS1yb3cubW9kZWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyRmllbGRNYXBwZXJDYWxsYmFjayB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRhLXRhYmxlLWZpbHRlci1maWVsZC1tYXBwZXItY2FsbGJhY2subW9kZWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyRXhwcmVzc2lvbkNhbGxiYWNrIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGEtdGFibGUtZmlsdGVyLWV4cHJlc3Npb24tY2FsbGJhY2subW9kZWwnO1xuXG5pbXBvcnQgeyBEcm9wZG93blNlbGVjdE1vZGUgfSBmcm9tICcuLi8uLi8uLi9kcm9wZG93bi9kcm9wZG93bi5tb2R1bGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU29ydE9yZGVyIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGEtdGFibGUtc29ydC1vcmRlci5tb2RlbCc7XG5cbmltcG9ydCB7IERhdGFUYWJsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLXRhYmxlLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGFUYWJsZUV2ZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS10YWJsZS1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFZpZXdQb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvbW9kZWxzL3ZpZXctcG9zaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRGF0YVN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtdGFibGUtZGF0YS1zdGF0ZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBEYXRhIHRhYmxlIGNvbHVtbiBjb21wb25lbnQuIERhdGEgdGFibGUgY29sdW1ucyBhc3NvY2lhdGVkIGRhdGEgaXMgY2FwdHVyZWQgdmlhIHRoaXMgY29tcG9uZW50LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZy1kYXRhLXRhYmxlLWNvbHVtbicsXG4gIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgZmlsdGVyVmFsdWVFeHRyYWN0b3JTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIGN1cnJlbnRTb3J0T3JkZXI6IERhdGFUYWJsZVNvcnRPcmRlciA9ICcnO1xuICBwcml2YXRlIGJhc2VTb3J0T3JkZXI6IERhdGFUYWJsZVNvcnRPcmRlciA9ICcnO1xuXG4gIHB1YmxpYyBhY3R1YWxXaWR0aDogbnVtYmVyO1xuXG4gIC8vIENvbnRlbnQgQ2hpbGQgUHJvcGVydGllc1xuXG4gIEBDb250ZW50Q2hpbGQoJ25nRGF0YVRhYmxlQ2VsbCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHB1YmxpYyBjZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZCgnbmdEYXRhVGFibGVIZWFkZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwdWJsaWMgaGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZCgnbmdEYXRhVGFibGVGaWx0ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwdWJsaWMgZmlsdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZCgnbmdGaWx0ZXJEcm9wZG93bkxvYWRpbmdTcGlubmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHVibGljIGRyb3Bkb3duRmlsdGVyTG9hZGluZ1NwaW5uZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAQ29udGVudENoaWxkKCduZ0ZpbHRlckRyb3Bkb3duT3B0aW9uJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHVibGljIGRyb3Bkb3duRmlsdGVyT3B0aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZCgnbmdGaWx0ZXJEcm9wZG93bk9wdGlvbkdyb3VwSGVhZGVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHVibGljIGRyb3Bkb3duRmlsdGVyT3B0aW9uR3JvdXBIZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyBDYWxsYmFjayBldmVudCBoYW5kbGVyc1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgZXhwcmVzc2lvbiBldmVudCBoYW5kbGVyIGNhbGxiYWNrLiBVc2VkIHRvIGFwcGx5IGN1c3RvbSBkYXRhIGZpbHRlciBleHByZXNzaW9uIGxvZ2ljLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZpbHRlckV4cHJlc3Npb246IERhdGFUYWJsZUZpbHRlckV4cHJlc3Npb25DYWxsYmFjaztcblxuICAvKipcbiAgICogQ3VzdG9tIGZpbHRlciBmaWVsZCBtYXAgZXZlbnQgaGFuZGxlciBjYWxsYmFjay4gVXNlZCB0byBleHRyYWN0IGZpbHRlciBmaWVsZCB3aGVuIHNob3dEcm9wZG93bkZpbHRlciBvcHRpb24gaXMgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaWx0ZXJGaWVsZE1hcHBlcjogRGF0YVRhYmxlRmlsdGVyRmllbGRNYXBwZXJDYWxsYmFjaztcblxuICAvKipcbiAgICogQ2VsbCBjb2xvciByZW5kZXIgZXZlbnQgaGFuZGxlciBjYWxsYmFjay5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvbkNlbGxDb2xvclJlbmRlcjogRGF0YVRhYmxlQ2VsbENvbG9yUmVuZGVyQ2FsbGJhY2s8YW55PjtcblxuICAvLyBJbnB1dHNcblxuICAvKipcbiAgICogQ29sdW1uIGRpc3BsYXkgdGl0bGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29sdW1ucyBzb3J0YWJsZSBpZiB0cnVlLiBTaG93IHNvcnQgaW5kaWNhdG9yIG9uIGNvbHVtbiB0aXRsZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzb3J0YWJsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogTXVsdGkgY29sdW1uIHNvcnQgcHJpb3JpdHkuIExvd2VzdCBudW1iZXIgd2lsbCBnZXQgdGhlIGhlaWdodCBwcmVjZWRlbmNlLiBVc2FnZSBvZiBzYW1lIHByZWNlZGVuY2UgbnVtYmVyIGluXG4gICAqIG11bHRpcGxlIGNvbHVtbnMgbWF5IGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvcnMuIFRoaXMgcHJpb3JpdHkgbnVtYmVyIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBjb2x1bW4gaGVhZGVyXG4gICAqIHdoZW4gbXVsdGkgY29sdW1uIHNvcnRpbmcgaXMgZW5hYmxlZCBoZW5jZSwgY29uc2lkZXIgaW5kZXhpbmcgYWNjb3JkaW5nbHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc29ydFByaW9yaXR5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldCBpbml0aWFsIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzb3J0T3JkZXIodmFsdWU6IERhdGFUYWJsZVNvcnRPcmRlcikge1xuICAgIHRoaXMuY3VycmVudFNvcnRPcmRlciA9IHZhbHVlO1xuICAgIHRoaXMuYmFzZVNvcnRPcmRlciA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbml0aWFsIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBzb3J0T3JkZXIoKTogRGF0YVRhYmxlU29ydE9yZGVyIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydE9yZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbHVtbiBmaWx0ZXJhYmxlIGlmIHRydWUuIFNob3cgZmlsdGVyIG9wdGlvbnMgb24gZmlsdGVyIGhlYWRlciByb3cgd2hlbiBlbmFibGVkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZpbHRlcmFibGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbHVtbiByZXNpemVhYmxlIGlmIHRydWUuIFNob3cgY29sdW1uIHJlc2l6ZSBpbmRpY2F0b3Igb24gY29sdW1uIHJpZ2h0IGNvcm5lci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZXNpemFibGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERhdGEgaXRlbSBtYXBwaW5nIGZpZWxkIG5hbWUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZmllbGQ6IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVyIGZpZWxkIGlkZW50aWZpZXIuIEZhbGxiYWNrIHRvIGZpZWxkIGlmIG5vdCBwcm92aWRlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaWx0ZXJGaWVsZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkIGlkZW50aWZpZXIuIEZhbGxiYWNrIHRvIGZpZWxkIGlmIG5vdCBwcm92aWRlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzb3J0RmllbGQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ29sdW1uIHRpdGxlIENTUyBjbGFzcyBuYW1lcy4gVXNlIHNwYWNlIGRlbGltaXRlciB0byBzZXBhcmF0ZSBjbGFzcyBuYW1lcy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjc3NDbGFzczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgY29sdW1uIHdpZHRoIGluIHBpeGVscyBvciBwZXJjZW50YWdlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHdpZHRoOiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlbmRlciBjb2x1bW4gaWYgdHJ1ZS4gRWxzZSBpbmNsdWRlIGluIGNvbHVtbiBzZWxlY3RvciBidXQgbm90IHJlbmRlcmVkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHZpc2libGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNob3cgZmlsZWQgaW4gY29sdW1uIHNlbGVjdG9yIHBvcHVwIGlmIHRydWUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0luQ29sdW1uU2VsZWN0b3IgPSB0cnVlOyAvLyBUT0RPOiBtb3ZlIHRvIGJhc2UgY29uZlxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgcGxhY2Vob2xkZXIgdmFsdWUuIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyBvbiBmaWx0ZXIgdGV4dCBib3guIEFwcGxpY2FibGUgb25seSBmb3Igbm9uZSBkcm9wZG93biBmaWx0ZXIgbW9kZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaWx0ZXJQbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVkIGZpbHRlciB2YWx1ZSBvbiBpbml0aWFsaXplLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZpbHRlcjogYW55O1xuXG4gIC8qKlxuICAgKiBTaG93IGZpbHRlciBjbGVhciBidXR0b24gaWYgdHJ1ZS4gQXBwbGljYWJsZSBvbmx5IGZvciBub25lIGRyb3Bkb3duIGZpbHRlciBtb2RlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dGaWx0ZXJDbGVhckJ1dHRvbjogYW55O1xuXG4gIC8qKlxuICAgKiBSZXNpemUgbWluaW11bSBsaW1pdC4gQ29sdW1uIGNhbm5vdCBiZSByZXNpemVkIHRvIGZpdCBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBwaXhlbHMgc3BlY2lmaWVkIGhlcmUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcmVzaXplTWluTGltaXQ6IG51bWJlcjtcblxuICAvLyBEcm9wZG93biBmaWx0ZXIgcHJvcGVydGllc1xuXG4gIC8qKlxuICAgKiBTaG93IGRyb3Bkb3duIGZpbHRlciBpZiB0cnVlLiBGaWx0ZXIgZGF0YSB1c2luZyBkcm9wZG93biBmaWx0ZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0Ryb3Bkb3duRmlsdGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEcm9wZG93biBmaWx0ZXIgbWVudSBwb3NpdGlvbi4gUGxhY2VtZW50IG9mIGZpbHRlciBwb3B1cCBtZW51LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRyb3Bkb3duRmlsdGVyTWVudVBvc2l0aW9uOiBWaWV3UG9zaXRpb247XG5cbiAgLyoqXG4gICAqIERyb3Bkb3duIHNlbGVjdCBtb2RlLiBGaWx0ZXIgb3B0aW9uIHNlbGVjdCBtb2RlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRyb3Bkb3duRmlsdGVyU2VsZWN0TW9kZTogRHJvcGRvd25TZWxlY3RNb2RlO1xuXG4gIC8qKlxuICAgKiBEcm9wZG93biBmaWx0ZXIgc2VhcmNoYWJsZSBpZiB0cnVlLiBEaXNwbGF5IHNlYXJjaCBib3ggd2l0aGluIGZpbHRlciBvcHRpb24gbWVudS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkcm9wZG93bkZpbHRlclNlYXJjaGFibGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERyb3Bkb3duIGZpbHRlciBzZWFyY2ggZGVib3VuY2UgdGltZSBpbiBtaWxsaXNlY29uZHMuIEFwcGxpY2FibGUgb25seSB3aGVuIGRyb3Bkb3duRmlsdGVyU2VhcmNoRGVib3VuY2UgaXMgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkcm9wZG93bkZpbHRlclNlYXJjaERlYm91bmNlVGltZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgZHJvcGRvd24gZmlsdGVyIGRhdGEgc2VhcmNoIGRlYm91bmNlIHdpdGggcHJvdmlkZWQgZHJvcGRvd25GaWx0ZXJTZWFyY2hEZWJvdW5jZVRpbWUgaWYgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkcm9wZG93bkZpbHRlclNlYXJjaERlYm91bmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEcm9wZG93biBmaWx0ZXIgc2hvdyBvcHRpb24gc2VsZWN0IGNoZWNrYm94LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRyb3BEb3duRmlsdGVyU2hvd09wdGlvblNlbGVjdENoZWNrYm94OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEcm9wZG93biBmaWx0ZXIgc2VsZWN0ZWQgaXRlbXMgZGlzcGxheSBsaW1pdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkcm9wZG93bkZpbHRlcldyYXBEaXNwbGF5U2VsZWN0TGltaXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogRHJvcGRvd24gZmlsdGVyIGdyb3VwIGJ5IGZpZWxkIG5hbWUgaW4gaXRlbSBzY2hlbWEuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZHJvcGRvd25GaWx0ZXJHcm91cEJ5RmllbGQ6IHN0cmluZztcblxuICAvKipcbiAgICogRHJvcGRvd24gZmlsdGVyIHNob3cgc2VsZWN0ZWQgb3B0aW9uIHJlbW92ZSBidXR0b24gaWYgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkcm9wZG93bkZpbHRlclNob3dTZWxlY3RlZE9wdGlvblJlbW92ZUJ1dHRvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogRHJvcGRvd24gZmlsdGVyIHNob3cgYWxsIHNlbGVjdCBvcHRpb25zIGNsZWFyIGJ1dHRvbiBpZiB0cnVlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRyb3Bkb3duRmlsdGVyU2hvd0NsZWFyU2VsZWN0aW9uQnV0dG9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEcm9wZG93biBmaWx0ZXIgbWVudSB3aWR0aCBpbiBwaXhlbHMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZHJvcGRvd25GaWx0ZXJNZW51V2lkdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogRHJvcGRvd24gZmlsdGVyIG1lbnUgaGVpZ2h0IGluIHBpeGVscy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkcm9wZG93bkZpbHRlck1lbnVIZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogRHJvcGRvd24gZmlsdGVyIG11bHRpIHNlbGVjdCBvcHRpb24gbWF4IHdpZHRoLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRyb3Bkb3duRmlsdGVyTXVsdGlTZWxlY3RPcHRpb25NYXhXaWR0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEcm9wZG93biBmaWx0ZXIgY2xvc2UgbWVudSBvbiBzZWxlY3QgaWYgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkcm9wZG93bkZpbHRlckNsb3NlTWVudU9uU2VsZWN0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEeW5hbWljYWxseSBjYWxjdWxhdGUgRHJvcGRvd24gZmlsdGVyIG1lbnUgZGltZW5zaW9ucyByZWxhdGl2ZSB0byBjb2x1bW4gd2lkdGg7IGRyb3Bkb3duRmlsdGVyTWVudVdpZHRoIGFuZFxuICAgKiBkcm9wZG93bkZpbHRlck1lbnVIZWlnaHQgY29uZmlndXJhdGlvbiBhcmUgaWdub3JlZCB3aGVuIHRydWUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZHJvcGRvd25GaWx0ZXJEeW5hbWljRGltZW5zaW9uQ2FsY3VsYXRpb246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIER5bmFtaWMgZHJvcGRvd24gdmlldyB3aWR0aCByYXRpby4gVXNlZCBmb3IgZHluYW1pYyBkaW1lbnNpb24gY2FsY3VsYXRpb24uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZHJvcGRvd25GaWx0ZXJEeW5hbWljV2lkdGhSYXRpbzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEeW5hbWljIGRyb3Bkb3duIHZpZXcgaGVpZ2h0IHJhdGlvLiBVc2VkIGZvciBkeW5hbWljIGRpbWVuc2lvbiBjYWxjdWxhdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkcm9wZG93bkZpbHRlckR5bmFtaWNIZWlnaHRSYXRpbzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGF0YVRhYmxlQ29uZmlnU2VydmljZTogRGF0YVRhYmxlQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U3RhdGVTZXJ2aWNlOiBEYXRhVGFibGVFdmVudFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFTdGF0ZVNlcnZpY2U6IERhdGFUYWJsZURhdGFTdGF0ZVNlcnZpY2UpIHtcbiAgICAvLyBUYWJsZSBjb2x1bW4gY29uZmlnXG4gICAgdGhpcy5zb3J0YWJsZSA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2Uuc29ydGFibGU7XG4gICAgdGhpcy5jdXJyZW50U29ydE9yZGVyID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5zb3J0T3JkZXI7XG4gICAgdGhpcy5maWx0ZXJhYmxlID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5maWx0ZXJhYmxlO1xuICAgIHRoaXMuZmlsdGVyUGxhY2Vob2xkZXIgPSBkYXRhVGFibGVDb25maWdTZXJ2aWNlLmZpbHRlclBsYWNlaG9sZGVyO1xuICAgIHRoaXMucmVzaXphYmxlID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5jb2x1bW5SZXNpemFibGU7XG4gICAgdGhpcy52aXNpYmxlID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5jb2x1bW5WaXNpYmxlO1xuICAgIHRoaXMuc2hvd0Ryb3Bkb3duRmlsdGVyID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5zaG93RHJvcGRvd25GaWx0ZXI7XG4gICAgdGhpcy5zaG93RmlsdGVyQ2xlYXJCdXR0b24gPSBkYXRhVGFibGVDb25maWdTZXJ2aWNlLnNob3dGaWx0ZXJDbGVhckJ1dHRvbjtcblxuICAgIC8vIERyb3Bkb3duIGZpbHRlciBjb25maWdcbiAgICB0aGlzLmRyb3Bkb3duRmlsdGVyTWVudVBvc2l0aW9uID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5kcm9wZG93bkZpbHRlck1lbnVQb3NpdGlvbjtcbiAgICB0aGlzLmRyb3Bkb3duRmlsdGVyU2VsZWN0TW9kZSA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJTZWxlY3RNb2RlO1xuICAgIHRoaXMuZHJvcGRvd25GaWx0ZXJTZWFyY2hhYmxlID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5kcm9wZG93bkZpbHRlclNlYXJjaGFibGU7XG4gICAgdGhpcy5kcm9wZG93bkZpbHRlclNlYXJjaERlYm91bmNlVGltZSA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJTZWFyY2hEZWJvdW5jZVRpbWU7XG4gICAgdGhpcy5kcm9wZG93bkZpbHRlclNlYXJjaERlYm91bmNlID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5kcm9wZG93bkZpbHRlclNlYXJjaERlYm91bmNlO1xuICAgIHRoaXMuZHJvcGRvd25GaWx0ZXJXcmFwRGlzcGxheVNlbGVjdExpbWl0ID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5kcm9wZG93bkZpbHRlcldyYXBEaXNwbGF5U2VsZWN0TGltaXQ7XG4gICAgdGhpcy5kcm9wZG93bkZpbHRlckdyb3VwQnlGaWVsZCA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJHcm91cEJ5RmllbGQ7XG4gICAgdGhpcy5kcm9wZG93bkZpbHRlclNob3dTZWxlY3RlZE9wdGlvblJlbW92ZUJ1dHRvbiA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJTaG93U2VsZWN0ZWRPcHRpb25SZW1vdmVCdXR0b247XG4gICAgdGhpcy5kcm9wZG93bkZpbHRlclNob3dDbGVhclNlbGVjdGlvbkJ1dHRvbiA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJTaG93Q2xlYXJTZWxlY3Rpb25CdXR0b247XG4gICAgdGhpcy5kcm9wZG93bkZpbHRlck1lbnVXaWR0aCA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJNZW51V2lkdGg7XG4gICAgdGhpcy5kcm9wZG93bkZpbHRlck1lbnVIZWlnaHQgPSBkYXRhVGFibGVDb25maWdTZXJ2aWNlLmRyb3Bkb3duRmlsdGVyTWVudUhlaWdodDtcbiAgICB0aGlzLmRyb3Bkb3duRmlsdGVyTXVsdGlTZWxlY3RPcHRpb25NYXhXaWR0aCA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJNdWx0aVNlbGVjdE9wdGlvbk1heFdpZHRoO1xuICAgIHRoaXMuZHJvcGRvd25GaWx0ZXJDbG9zZU1lbnVPblNlbGVjdCA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJDbG9zZU1lbnVPblNlbGVjdDtcbiAgICB0aGlzLmRyb3Bkb3duRmlsdGVyRHluYW1pY0RpbWVuc2lvbkNhbGN1bGF0aW9uID0gZGF0YVRhYmxlQ29uZmlnU2VydmljZS5kcm9wZG93bkZpbHRlckR5bmFtaWNEaW1lbnNpb25DYWxjdWxhdGlvbjtcbiAgICB0aGlzLmRyb3Bkb3duRmlsdGVyRHluYW1pY1dpZHRoUmF0aW8gPSBkYXRhVGFibGVDb25maWdTZXJ2aWNlLmRyb3Bkb3duRmlsdGVyRHluYW1pY1dpZHRoUmF0aW87XG4gICAgdGhpcy5kcm9wZG93bkZpbHRlckR5bmFtaWNIZWlnaHRSYXRpbyA9IGRhdGFUYWJsZUNvbmZpZ1NlcnZpY2UuZHJvcGRvd25GaWx0ZXJEeW5hbWljSGVpZ2h0UmF0aW87XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZGF0YSBzb3J0IG9yZGVyLlxuICAgKi9cbiAgcHVibGljIHJlc2V0U29ydE9yZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFNvcnRPcmRlciA9IHRoaXMuYmFzZVNvcnRPcmRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZHluYW1pYyBjZWxsIGNvbG9yLlxuICAgKiBAcGFyYW0gcm93IERhdGEgcm93IG9iamVjdC5cbiAgICogQHJldHVybiBDZWxsIGNvbG9yIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXRDZWxsQ29sb3Iocm93OiBEYXRhVGFibGVSb3c8YW55Pikge1xuICAgIGlmICh0aGlzLm9uQ2VsbENvbG9yUmVuZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uQ2VsbENvbG9yUmVuZGVyKHJvdywgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBuZXcgc29ydCBvcmRlciB1cG9uIHNvcnQgY2xpY2suXG4gICAqIEByZXR1cm4gTmV3IHNvcnQgb3JkZXIgZW51bSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXROZXdTb3J0T3JkZXIoKTogRGF0YVRhYmxlU29ydE9yZGVyIHtcbiAgICBsZXQgbmV3U29ydE9yZGVyOiBEYXRhVGFibGVTb3J0T3JkZXI7XG4gICAgc3dpdGNoICh0aGlzLnNvcnRPcmRlcikge1xuICAgICAgY2FzZSAnYXNjJzpcbiAgICAgICAgbmV3U29ydE9yZGVyID0gJ2Rlc2MnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rlc2MnOlxuICAgICAgICBuZXdTb3J0T3JkZXIgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcnOlxuICAgICAgICBuZXdTb3J0T3JkZXIgPSAnYXNjJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1NvcnRPcmRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBzb3J0IHN0YXRlIGljb24gY3NzIGNsYXNzIGVuYWJsZWQgc3RhdGUuXG4gICAqIEByZXR1cm4gU29ydCBvcmRlciBpY29uIGNzcyBjbGFzcyBjb2xsZWN0aW9uIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXRTb3J0SWNvbkNsYXNzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdzb3J0LWFzYyc6IHRoaXMuc29ydE9yZGVyID09PSAnYXNjJyxcbiAgICAgICdzb3J0LWRzYyc6IHRoaXMuc29ydE9yZGVyID09PSAnZGVzYycsXG4gICAgICAnc29ydC1yZXNldCc6ICF0aGlzLnNvcnRPcmRlclxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29tcG9uZW50IGRlc3Ryb3kgbGlmZWN5Y2xlIGV2ZW50IGhhbmRsZXIuXG4gICAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsdGVyVmFsdWVFeHRyYWN0b3JTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZmlsdGVyVmFsdWVFeHRyYWN0b3JTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcG9uZW50IGluaXRpYWxpemUgbGlmZWN5Y2xlIGV2ZW50IGhhbmRsZXIuXG4gICAqL1xuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNzc0NsYXNzICYmIHRoaXMuZmllbGQpIHtcbiAgICAgIGlmICgvXlthLXpBLVowLTlfXSskLy50ZXN0KHRoaXMuZmllbGQpKSB7XG4gICAgICAgIHRoaXMuY3NzQ2xhc3MgPSAnY29sdW1uLScgKyB0aGlzLmZpZWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jc3NDbGFzcyA9ICdjb2x1bW4tJyArIHRoaXMuZmllbGQucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudFN0YXRlU2VydmljZS5jb2x1bW5CaW5kLmVtaXQodGhpcyk7XG5cbiAgICBpZiAodGhpcy5kYXRhVGFibGVDb25maWdTZXJ2aWNlLm11bHRpQ29sdW1uU29ydGFibGUgJiYgdGhpcy5zb3J0YWJsZSkge1xuICAgICAgaWYgKHRoaXMuc29ydE9yZGVyID09PSAnJykge1xuICAgICAgICBpZiAodGhpcy5zb3J0UHJpb3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdbc29ydFByaW9yaXR5XSBzaG91bGQgYmUgaWdub3JlZCB3aGVuIG11bHRpIGNvbHVtbiBzb3J0aW5nIGlzIGVuYWJsZWQgd2l0aCBuYXR1cmFsIHNvcnQgb3JkZXIuJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnNvcnRQcmlvcml0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ1tzb3J0UHJpb3JpdHldIGlzIHJlcXVpcmVkIHdoZW4gbXVsdGkgY29sdW1uIHNvcnRpbmcgaXMgZW5hYmxlZCB3aXRoIGFuIGV4cGxpY2l0IHNvcnQgb3JkZXIuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc29ydFByaW9yaXR5IDwgMSkge1xuICAgICAgICB0aHJvdyBFcnJvcignW3NvcnRQcmlvcml0eV0gbXVzdCBiZSBncmVhdGVyIHRoYW4gMS4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGF0YVN0YXRlU2VydmljZS5jdXJyZW50U29ydFByaW9yaXR5IDwgdGhpcy5zb3J0UHJpb3JpdHkpIHtcbiAgICAgICAgdGhpcy5kYXRhU3RhdGVTZXJ2aWNlLmN1cnJlbnRTb3J0UHJpb3JpdHkgPSB0aGlzLnNvcnRQcmlvcml0eTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==