igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
217 lines • 19.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, HostBinding, Input, ViewChild, QueryList, ViewChildren, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, HostListener } from '@angular/core';
import { IgxColumnComponent } from './column.component';
import { IgxFilteringService } from './filtering/grid-filtering.service';
import { GridBaseAPIService } from './api.service';
import { IgxColumnResizingService } from './grid-column-resizing.service';
import { IgxGridHeaderComponent } from './grid-header.component';
import { IgxGridFilteringCellComponent } from './filtering/grid-filtering-cell.component';
/** @type {?} */
const Z_INDEX = 9999;
/**
* @hidden
*/
export class IgxGridHeaderGroupComponent {
/**
* @param {?} cdr
* @param {?} gridAPI
* @param {?} element
* @param {?} colResizingService
* @param {?} filteringService
*/
constructor(cdr, gridAPI, element, colResizingService, filteringService) {
this.cdr = cdr;
this.gridAPI = gridAPI;
this.element = element;
this.colResizingService = colResizingService;
this.filteringService = filteringService;
}
/**
* Gets the width of the header group.
* \@memberof IgxGridHeaderGroupComponent
* @return {?}
*/
get width() {
return this.grid.getHeaderGroupWidth(this.column);
}
/**
* Gets the style classes of the header group.
* \@memberof IgxGridHeaderGroupComponent
* @return {?}
*/
get styleClasses() {
/** @type {?} */
const defaultClasses = [
'igx-grid__thead-item',
this.column.headerGroupClasses
];
/** @type {?} */
const classList = {
'igx-grid__th--pinned': this.isPinned,
'igx-grid__th--pinned-last': this.isLastPinned,
'igx-grid__drag-col-header': this.isHeaderDragged,
'igx-grid__th--filtering': this.isFiltered
};
Object.entries(classList).forEach(([className, value]) => {
if (value) {
defaultClasses.push(className);
}
});
return defaultClasses.join(' ');
}
/**
* @hidden
* @return {?}
*/
get zIndex() {
if (!this.column.pinned) {
return null;
}
return Z_INDEX - this.grid.pinnedColumns.indexOf(this.column);
}
/**
* Gets the grid of the header group.
* \@memberof IgxGridHeaderGroupComponent
* @return {?}
*/
get grid() {
return this.gridAPI.grid;
}
/**
* Gets whether the header group belongs to a column that is filtered.
* \@memberof IgxGridHeaderGroupComponent
* @return {?}
*/
get isFiltered() {
return this.filteringService.filteredColumn === this.column;
}
/**
* Gets whether the header group is stored in the last column in the pinned area.
* \@memberof IgxGridHeaderGroupComponent
* @return {?}
*/
get isLastPinned() {
return this.column.isLastPinned;
}
/**
* Gets whether the header group is stored in a pinned column.
* \@memberof IgxGridHeaderGroupComponent
* @return {?}
*/
get isPinned() {
return this.column.pinned;
}
/**
* Gets whether the header group belongs to a column that is moved.
* \@memberof IgxGridHeaderGroupComponent
* @return {?}
*/
get isHeaderDragged() {
return this.grid.draggedColumn === this.column;
}
/**
* @hidden
* @return {?}
*/
get hasLastPinnedChildColumn() {
return this.column.allChildren.some(child => child.isLastPinned);
}
/**
* @hidden
* @return {?}
*/
get height() {
return this.element.nativeElement.getBoundingClientRect().height;
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onMouseDown(event) {
// hack for preventing text selection in IE and Edge while dragging the resizer
event.preventDefault();
}
/**
* @return {?}
*/
ngDoCheck() {
this.cdr.markForCheck();
}
}
IgxGridHeaderGroupComponent.decorators = [
{ type: Component, args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
selector: 'igx-grid-header-group',
template: "<ng-container *ngIf=\"column.columnGroup\">\n <span *ngIf=\"grid.hasMovableColumns\" class=\"igx-grid__th-drop-indicator-left\"></span>\n <div class=\"igx-grid__thead-title\"\n [ngClass]=\"{'igx-grid__th--pinned-last': hasLastPinnedChildColumn}\"\n [igxColumnMovingDrag]=\"column\"\n [dragGhostHost]=\"grid.outletDirective.nativeElement\"\n [attr.droppable]=\"true\"\n [igxColumnMovingDrop]=\"column\">{{ column.header }}</div>\n <div class=\"igx-grid__thead-group\">\n <ng-container *ngFor=\"let child of column.children\">\n <igx-grid-header-group *ngIf=\"!child.hidden\" class=\"igx-grid__thead-subgroup\"\n [column]=\"child\"\n [gridID]=\"child.grid.id\"\n [style.min-width.px]=\"grid.getHeaderGroupWidth(child)\"\n [style.flex-basis.px]=\"grid.getHeaderGroupWidth(child)\">\n </igx-grid-header-group>\n </ng-container>\n </div>\n <span *ngIf=\"grid.hasMovableColumns\" class=\"igx-grid__th-drop-indicator-right\"></span>\n</ng-container>\n\n<ng-container *ngIf=\"!column.columnGroup\">\n <span *ngIf=\"grid.hasMovableColumns\" class=\"igx-grid__th-drop-indicator-left\"></span>\n <igx-grid-header [igxColumnMovingDrag]=\"column\" [dragGhostHost]=\"grid.igxFilteringOverlayOutlet\" [attr.droppable]=\"true\" [igxColumnMovingDrop]=\"column\" [gridID]=\"column.grid.id\" [column]=\"column\"></igx-grid-header>\n <igx-grid-filtering-cell *ngIf=\"grid.allowFiltering && grid.filterMode == 'quickFilter'\" [column]=\"column\" [attr.draggable]=\"false\"></igx-grid-filtering-cell>\n <span *ngIf=\"!column.columnGroup && column.resizable\" class=\"igx-grid__th-resize-handle\"\n [igxResizeHandle]=\"column\"\n [attr.draggable]=\"false\"\n [style.cursor]=\"colResizingService.resizeCursor\">\n </span>\n <span *ngIf=\"grid.hasMovableColumns\" class=\"igx-grid__th-drop-indicator-right\"></span>\n</ng-container>\n"
}] }
];
/** @nocollapse */
IgxGridHeaderGroupComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: GridBaseAPIService },
{ type: ElementRef },
{ type: IgxColumnResizingService },
{ type: IgxFilteringService }
];
IgxGridHeaderGroupComponent.propDecorators = {
column: [{ type: Input }],
gridID: [{ type: Input }],
headerCell: [{ type: ViewChild, args: [IgxGridHeaderComponent,] }],
filterCell: [{ type: ViewChild, args: [IgxGridFilteringCellComponent,] }],
children: [{ type: ViewChildren, args: [forwardRef(() => IgxGridHeaderGroupComponent), { read: IgxGridHeaderGroupComponent },] }],
width: [{ type: HostBinding, args: ['style.min-width',] }, { type: HostBinding, args: ['style.flex-basis',] }],
styleClasses: [{ type: HostBinding, args: ['class',] }],
zIndex: [{ type: HostBinding, args: ['style.z-index',] }],
onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
};
if (false) {
/**
* Gets the column of the header group.
* \@memberof IgxGridHeaderGroupComponent
* @type {?}
*/
IgxGridHeaderGroupComponent.prototype.column;
/**
* Gets the `id` of the grid in which the header group is stored.
* \@memberof IgxGridHeaderGroupComponent
* @type {?}
*/
IgxGridHeaderGroupComponent.prototype.gridID;
/**
* @hidden
* @type {?}
*/
IgxGridHeaderGroupComponent.prototype.headerCell;
/**
* @hidden
* @type {?}
*/
IgxGridHeaderGroupComponent.prototype.filterCell;
/**
* @hidden
* @type {?}
*/
IgxGridHeaderGroupComponent.prototype.children;
/**
* @type {?}
* @private
*/
IgxGridHeaderGroupComponent.prototype.cdr;
/** @type {?} */
IgxGridHeaderGroupComponent.prototype.gridAPI;
/**
* @type {?}
* @private
*/
IgxGridHeaderGroupComponent.prototype.element;
/** @type {?} */
IgxGridHeaderGroupComponent.prototype.colResizingService;
/** @type {?} */
IgxGridHeaderGroupComponent.prototype.filteringService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkLWhlYWRlci1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUVqQixVQUFVLEVBQ1YsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7TUFFcEYsT0FBTyxHQUFHLElBQUk7Ozs7QUFXcEIsTUFBTSxPQUFPLDJCQUEyQjs7Ozs7Ozs7SUFvSnBDLFlBQW9CLEdBQXNCLEVBQ3ZCLE9BQXFFLEVBQ3BFLE9BQW1CLEVBQ3BCLGtCQUE0QyxFQUM1QyxnQkFBcUM7UUFKcEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBOEQ7UUFDcEUsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNwQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTBCO1FBQzVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBcUI7SUFBSSxDQUFDOzs7Ozs7SUFsSDdELElBRUksS0FBSztRQUNMLE9BQU8sSUFB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QUMsRUFBRSxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRTtvQkFPakcsV0FBVyxTQUFDLGlCQUFpQixjQUM3QixXQUFXLFNBQUMsa0JBQWtCOzJCQVM5QixXQUFXLFNBQUMsT0FBTztxQkF5Qm5CLFdBQVcsU0FBQyxlQUFlOzBCQWlFM0IsWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7SUFwSXJDLDZDQUNrQzs7Ozs7O0lBTWxDLDZDQUNzQjs7Ozs7SUFLdEIsaURBQzBDOzs7OztJQUsxQyxpREFDaUQ7Ozs7O0lBS2pELCtDQUN3RDs7Ozs7SUFvSDVDLDBDQUE4Qjs7SUFDOUIsOENBQTRFOzs7OztJQUM1RSw4Q0FBMkI7O0lBQzNCLHlEQUFtRDs7SUFDbkQsdURBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgZm9yd2FyZFJlZixcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VDb21wb25lbnQsIElHcmlkRGF0YUJpbmRhYmxlIH0gZnJvbSAnLi9ncmlkLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4vZ3JpZC1jb2x1bW4tcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy1jZWxsLmNvbXBvbmVudCc7XG5cbmNvbnN0IFpfSU5ERVggPSA5OTk5O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1oZWFkZXItZ3JvdXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncmlkLWhlYWRlci1ncm91cC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjayB7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2x1bW4gb2YgdGhlIGhlYWRlciBncm91cC5cbiAgICAgKiBAbWVtYmVyb2YgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgaWRgIG9mIHRoZSBncmlkIGluIHdoaWNoIHRoZSBoZWFkZXIgZ3JvdXAgaXMgc3RvcmVkLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncmlkSUQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneEdyaWRIZWFkZXJDb21wb25lbnQpXG4gICAgcHVibGljIGhlYWRlckNlbGw6IElneEdyaWRIZWFkZXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudClcbiAgICBwdWJsaWMgZmlsdGVyQ2VsbDogSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudCksIHsgcmVhZDogSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IH0pXG4gICAgcHVibGljIGNoaWxkcmVuOiBRdWVyeUxpc3Q8SWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBoZWFkZXIgZ3JvdXAuXG4gICAgICogQG1lbWJlcm9mIElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUubWluLXdpZHRoJylcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmZsZXgtYmFzaXMnKVxuICAgIGdldCB3aWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5nZXRIZWFkZXJHcm91cFdpZHRoKHRoaXMuY29sdW1uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdHlsZSBjbGFzc2VzIG9mIHRoZSBoZWFkZXIgZ3JvdXAuXG4gICAgICogQG1lbWJlcm9mIElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICAgIGdldCBzdHlsZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdENsYXNzZXMgPSBbXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoZWFkLWl0ZW0nLFxuICAgICAgICAgICAgdGhpcy5jb2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0ge1xuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tcGlubmVkJzogdGhpcy5pc1Bpbm5lZCxcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgtLXBpbm5lZC1sYXN0JzogdGhpcy5pc0xhc3RQaW5uZWQsXG4gICAgICAgICAgICAnaWd4LWdyaWRfX2RyYWctY29sLWhlYWRlcic6IHRoaXMuaXNIZWFkZXJEcmFnZ2VkLFxuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tZmlsdGVyaW5nJzogdGhpcy5pc0ZpbHRlcmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2xhc3NMaXN0KS5mb3JFYWNoKChbY2xhc3NOYW1lLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRDbGFzc2VzLnB1c2goY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkZWZhdWx0Q2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuei1pbmRleCcpXG4gICAgZ2V0IHpJbmRleCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbi5waW5uZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBaX0lOREVYIC0gdGhpcy5ncmlkLnBpbm5lZENvbHVtbnMuaW5kZXhPZih0aGlzLmNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZ3JpZCBvZiB0aGUgaGVhZGVyIGdyb3VwLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXQgZ3JpZCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmdyaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBoZWFkZXIgZ3JvdXAgYmVsb25ncyB0byBhIGNvbHVtbiB0aGF0IGlzIGZpbHRlcmVkLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXQgaXNGaWx0ZXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9PT0gdGhpcy5jb2x1bW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBoZWFkZXIgZ3JvdXAgaXMgc3RvcmVkIGluIHRoZSBsYXN0IGNvbHVtbiBpbiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICogQG1lbWJlcm9mIElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIGdldCBpc0xhc3RQaW5uZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5pc0xhc3RQaW5uZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBoZWFkZXIgZ3JvdXAgaXMgc3RvcmVkIGluIGEgcGlubmVkIGNvbHVtbi5cbiAgICAgKiBAbWVtYmVyb2YgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGlzUGlubmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4ucGlubmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaGVhZGVyIGdyb3VwIGJlbG9uZ3MgdG8gYSBjb2x1bW4gdGhhdCBpcyBtb3ZlZC5cbiAgICAgKiBAbWVtYmVyb2YgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGlzSGVhZGVyRHJhZ2dlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5kcmFnZ2VkQ29sdW1uID09PSAgdGhpcy5jb2x1bW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBoYXNMYXN0UGlubmVkQ2hpbGRDb2x1bW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5hbGxDaGlsZHJlbi5zb21lKGNoaWxkID0+IGNoaWxkLmlzTGFzdFBpbm5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uTW91c2VEb3duKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIGhhY2sgZm9yIHByZXZlbnRpbmcgdGV4dCBzZWxlY3Rpb24gaW4gSUUgYW5kIEVkZ2Ugd2hpbGUgZHJhZ2dpbmcgdGhlIHJlc2l6ZXJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZUNvbXBvbmVudCAmIElHcmlkRGF0YUJpbmRhYmxlPixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBmaWx0ZXJpbmdTZXJ2aWNlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlKSB7IH1cbn1cbiJdfQ==