@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
254 lines • 34.2 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DoCheck, ElementRef, HostBinding, HostListener, Input, NgZone, OnInit, Inject, OnDestroy, NgModuleRef } from '@angular/core';
import { DataType } from '../../data-operations/data-util';
import { SortingDirection } from '../../data-operations/sorting-expression.interface';
import { GridBaseAPIService } from '../api.service';
import { IgxColumnComponent } from '../columns/column.component';
import { IgxFilteringService } from '../filtering/grid-filtering.service';
import { IgxColumnResizingService } from '../resizing/resizing.service';
import { IgxOverlayService } from '../../services/overlay/overlay';
import { IgxGridExcelStyleFilteringComponent } from '../filtering/excel-style/grid.excel-style-filtering.component';
import { VerticalAlignment } from '../../services/overlay/utilities';
import { AutoPositionStrategy } from '../../services/overlay/position/auto-position-strategy';
import { useAnimation } from '@angular/animations';
import { filter, takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { fadeIn, fadeOut } from '../../animations/main';
import { AbsoluteScrollStrategy } from '../../services/overlay/scroll/absolute-scroll-strategy';
/**
* @hidden
*/
let IgxGridHeaderComponent = class IgxGridHeaderComponent {
constructor(gridAPI, colResizingService, cdr, elementRef, zone, _filteringService, _moduleRef, _overlayService) {
this.gridAPI = gridAPI;
this.colResizingService = colResizingService;
this.cdr = cdr;
this.elementRef = elementRef;
this.zone = zone;
this._filteringService = _filteringService;
this._moduleRef = _moduleRef;
this._overlayService = _overlayService;
this._destroy$ = new Subject();
this.hostRole = 'columnheader';
this.tabindex = 0;
this.sortDirection = SortingDirection.None;
}
get styleClasses() {
const defaultClasses = [
'igx-grid__th--fw',
this.column.headerClasses
];
const classList = {
'igx-grid__th': !this.column.columnGroup,
'asc': this.ascending,
'desc': this.descending,
'igx-grid__th--number': this.column.dataType === DataType.Number,
'igx-grid__th--sortable': this.column.sortable,
'igx-grid__th--filtrable': this.column.filterable && this.grid.filteringService.isFilterRowVisible,
'igx-grid__th--sorted': this.sorted
};
for (const klass of Object.keys(classList)) {
if (classList[klass]) {
defaultClasses.push(klass);
}
}
return defaultClasses.join(' ');
}
get height() {
if (this.grid.hasColumnGroups) {
return (this.grid.maxLevelHeaderDepth + 1 - this.column.level) * this.grid.defaultRowHeight / this.grid._baseFontSize;
}
return null;
}
get ascending() {
return this.sortDirection === SortingDirection.Asc;
}
get descending() {
return this.sortDirection === SortingDirection.Desc;
}
get sortingIcon() {
if (this.sortDirection !== SortingDirection.None) {
// arrow_downward and arrow_upward
// are material icons ligature strings
return this.sortDirection === SortingDirection.Asc ? 'arrow_upward' : 'arrow_downward';
}
return 'arrow_upward';
}
get sorted() {
return this.sortDirection !== SortingDirection.None;
}
get filterIconClassName() {
return this.column.filteringExpressionsTree ? 'igx-excel-filter__icon--filtered' : 'igx-excel-filter__icon';
}
get headerID() {
return `${this.gridID}_${this.column.field}`;
}
ngOnInit() {
this.initFilteringSettings();
}
ngDoCheck() {
this.getSortDirection();
this.cdr.markForCheck();
}
ngOnDestroy() {
this._destroy$.next(true);
this._destroy$.complete();
if (this._componentOverlayId) {
this._overlayService.hide(this._componentOverlayId);
}
}
onClick(event) {
if (!this.colResizingService.isColumnResizing) {
event.stopPropagation();
if (this.grid.filteringService.isFilterRowVisible) {
if (this.column.filterable && !this.column.columnGroup &&
!this.grid.filteringService.isFilterComplex(this.column.field)) {
this.grid.filteringService.filteredColumn = this.column;
}
}
else if (this.column.sortable) {
this.triggerSort();
}
}
}
onFilteringIconClick(event) {
event.stopPropagation();
this.toggleFilterDropdown();
}
get grid() {
return this.gridAPI.grid;
}
getSortDirection() {
const expr = this.gridAPI.grid.sortingExpressions.find((x) => x.fieldName === this.column.field);
this.sortDirection = expr ? expr.dir : SortingDirection.None;
}
onSortingIconClick(event) {
if (this.grid.filteringService.isFilterRowVisible) {
event.stopPropagation();
this.triggerSort();
}
}
triggerSort() {
const groupingExpr = this.grid.groupingExpressions ?
this.grid.groupingExpressions.find((expr) => expr.fieldName === this.column.field) : null;
const sortDir = groupingExpr ?
this.sortDirection + 1 > SortingDirection.Desc ? SortingDirection.Asc : SortingDirection.Desc
: this.sortDirection + 1 > SortingDirection.Desc ? SortingDirection.None : this.sortDirection + 1;
this.sortDirection = sortDir;
this.grid.sort({ fieldName: this.column.field, dir: this.sortDirection, ignoreCase: this.column.sortingIgnoreCase,
strategy: this.column.sortStrategy });
}
toggleFilterDropdown() {
if (!this._componentOverlayId) {
const headerTarget = this.elementRef.nativeElement;
const filterIconTarget = headerTarget.querySelector('.' + this.filterIconClassName);
this._filterMenuOverlaySettings.positionStrategy.settings.target = filterIconTarget;
this._filterMenuOverlaySettings.outlet = this.grid.outlet;
this._componentOverlayId =
this._overlayService.attach(IgxGridExcelStyleFilteringComponent, this._filterMenuOverlaySettings, this._moduleRef);
this._overlayService.show(this._componentOverlayId, this._filterMenuOverlaySettings);
}
}
initFilteringSettings() {
this._filterMenuPositionSettings = {
verticalStartPoint: VerticalAlignment.Bottom,
openAnimation: useAnimation(fadeIn, {
params: {
duration: '250ms'
}
}),
closeAnimation: useAnimation(fadeOut, {
params: {
duration: '200ms'
}
})
};
this._filterMenuOverlaySettings = {
closeOnOutsideClick: true,
modal: false,
positionStrategy: new AutoPositionStrategy(this._filterMenuPositionSettings),
scrollStrategy: new AbsoluteScrollStrategy()
};
this._overlayService.onOpening.pipe(filter((overlay) => overlay.id === this._componentOverlayId), takeUntil(this._destroy$)).subscribe((eventArgs) => {
this.onOverlayOpening(eventArgs);
});
this._overlayService.onClosed.pipe(filter(overlay => overlay.id === this._componentOverlayId), takeUntil(this._destroy$)).subscribe(() => {
this.onOverlayClosed();
});
}
onOverlayOpening(eventArgs) {
const instance = eventArgs.componentRef.instance;
if (instance) {
instance.initialize(this.column, this._overlayService, eventArgs.id);
}
}
onOverlayClosed() {
this._componentOverlayId = null;
}
};
IgxGridHeaderComponent.ctorParameters = () => [
{ type: GridBaseAPIService },
{ type: IgxColumnResizingService },
{ type: ChangeDetectorRef },
{ type: ElementRef },
{ type: NgZone },
{ type: IgxFilteringService },
{ type: NgModuleRef },
{ type: IgxOverlayService, decorators: [{ type: Inject, args: [IgxOverlayService,] }] }
];
__decorate([
Input(),
__metadata("design:type", IgxColumnComponent)
], IgxGridHeaderComponent.prototype, "column", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxGridHeaderComponent.prototype, "gridID", void 0);
__decorate([
HostBinding('class'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxGridHeaderComponent.prototype, "styleClasses", null);
__decorate([
HostBinding('style.height.rem'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxGridHeaderComponent.prototype, "height", null);
__decorate([
HostBinding('attr.role'),
__metadata("design:type", Object)
], IgxGridHeaderComponent.prototype, "hostRole", void 0);
__decorate([
HostBinding('attr.tabindex'),
__metadata("design:type", Object)
], IgxGridHeaderComponent.prototype, "tabindex", void 0);
__decorate([
HostBinding('attr.id'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxGridHeaderComponent.prototype, "headerID", null);
__decorate([
HostListener('click', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxGridHeaderComponent.prototype, "onClick", null);
IgxGridHeaderComponent = __decorate([
Component({
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
selector: 'igx-grid-header',
template: "<ng-template #defaultColumn>\n <span [attr.title]=\"column.header || column.field\">{{ column.header || column.field }}</span>\n</ng-template>\n\n<span class=\"igx-grid__th-title\">\n <ng-container *ngTemplateOutlet=\"column.headerTemplate ? column.headerTemplate : defaultColumn; context: { $implicit: column, column: column}\">\n </ng-container>\n</span>\n<div class=\"igx-grid__th-icons\" *ngIf=\"!column.columnGroup\">\n <igx-icon [attr.draggable]=\"false\"\n class=\"sort-icon\"\n *ngIf=\"column.sortable\"\n (click)=\"onSortingIconClick($event)\">\n {{sortingIcon}}\n </igx-icon>\n\n <igx-icon [ngClass]=\"filterIconClassName\" [attr.draggable]=\"false\" (click)=\"onFilteringIconClick($event)\"\n *ngIf=\"grid.allowFiltering == true && column.filterable && grid.filterMode == 'excelStyleFilter'\">\n filter_list\n </igx-icon>\n</div>\n"
}),
__param(7, Inject(IgxOverlayService)),
__metadata("design:paramtypes", [GridBaseAPIService,
IgxColumnResizingService,
ChangeDetectorRef,
ElementRef,
NgZone,
IgxFilteringService,
NgModuleRef,
IgxOverlayService])
], IgxGridHeaderComponent);
export { IgxGridHeaderComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9oZWFkZXJzL2dyaWQtaGVhZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULE9BQU8sRUFDUCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDdEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDcEgsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVB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SyxFQUFFOzhCQUNPLGtCQUFrQjtzREFBQztBQUdsQztJQURDLEtBQUssRUFBRTs7c0RBQ2M7QUFHdEI7SUFEQyxXQUFXLENBQUMsT0FBTyxDQUFDOzs7MERBdUJwQjtBQUdEO0lBREMsV0FBVyxDQUFDLGtCQUFrQixDQUFDOzs7b0RBTS9CO0FBNEJEO0lBREMsV0FBVyxDQUFDLFdBQVcsQ0FBQzs7d0RBQ1E7QUFHakM7SUFEQyxXQUFXLENBQUMsZUFBZSxDQUFDOzt3REFDVDtBQUdwQjtJQURDLFdBQVcsQ0FBQyxTQUFTLENBQUM7OztzREFHdEI7QUFrQ0Q7SUFEQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7cURBYWpDO0FBOUhRLHNCQUFzQjtJQU5sQyxTQUFTLENBQUM7UUFDUCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtRQUMvQyxtQkFBbUIsRUFBRSxLQUFLO1FBQzFCLFFBQVEsRUFBRSxpQkFBaUI7UUFDM0IscTVCQUEyQztLQUM5QyxDQUFDO0lBNkZPLFdBQUEsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7cUNBUFYsa0JBQWtCO1FBQ1Asd0JBQXdCO1FBQ3ZDLGlCQUFpQjtRQUNWLFVBQVU7UUFDaEIsTUFBTTtRQUNRLG1CQUFtQjtRQUMxQixXQUFXO1FBQ3FCLGlCQUFpQjtHQTVGaEUsc0JBQXNCLENBNE5sQztTQTVOWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkluaXQsXG4gICAgSW5qZWN0LFxuICAgIE9uRGVzdHJveSxcbiAgICBOZ01vZHVsZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZEJhc2VBUElTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWQtYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi4vcmVzaXppbmcvcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvb3ZlcmxheSc7XG5pbXBvcnQgeyBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9ncmlkLmV4Y2VsLXN0eWxlLWZpbHRlcmluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgT3ZlcmxheVNldHRpbmdzLCBQb3NpdGlvblNldHRpbmdzLCBWZXJ0aWNhbEFsaWdubWVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvdXRpbGl0aWVzJztcbmltcG9ydCB7IEF1dG9Qb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS9wb3NpdGlvbi9hdXRvLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IHVzZUFuaW1hdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmYWRlSW4sIGZhZGVPdXQgfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL21haW4nO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvc2Nyb2xsL2Fic29sdXRlLXNjcm9sbC1zdHJhdGVneSc7XG5pbXBvcnQgeyBHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBzZWxlY3RvcjogJ2lneC1ncmlkLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyaWQtaGVhZGVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjaywgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50T3ZlcmxheUlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBfZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzO1xuICAgIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ3JpZElEOiBzdHJpbmc7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBnZXQgc3R5bGVDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDbGFzc2VzID0gW1xuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tZncnLFxuICAgICAgICAgICAgdGhpcy5jb2x1bW4uaGVhZGVyQ2xhc3Nlc1xuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHtcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgnOiAhdGhpcy5jb2x1bW4uY29sdW1uR3JvdXAsXG4gICAgICAgICAgICAnYXNjJzogdGhpcy5hc2NlbmRpbmcsXG4gICAgICAgICAgICAnZGVzYyc6IHRoaXMuZGVzY2VuZGluZyxcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgtLW51bWJlcic6IHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBEYXRhVHlwZS5OdW1iZXIsXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoLS1zb3J0YWJsZSc6IHRoaXMuY29sdW1uLnNvcnRhYmxlLFxuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tZmlsdHJhYmxlJzogdGhpcy5jb2x1bW4uZmlsdGVyYWJsZSAmJiB0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUsXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoLS1zb3J0ZWQnOiB0aGlzLnNvcnRlZFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3Qga2xhc3Mgb2YgT2JqZWN0LmtleXMoY2xhc3NMaXN0KSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTGlzdFtrbGFzc10pIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0Q2xhc3Nlcy5wdXNoKGtsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmYXVsdENsYXNzZXMuam9pbignICcpO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0LnJlbScpXG4gICAgZ2V0IGhlaWdodCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5oYXNDb2x1bW5Hcm91cHMpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5ncmlkLm1heExldmVsSGVhZGVyRGVwdGggKyAxIC0gdGhpcy5jb2x1bW4ubGV2ZWwpICogdGhpcy5ncmlkLmRlZmF1bHRSb3dIZWlnaHQgLyB0aGlzLmdyaWQuX2Jhc2VGb250U2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgYXNjZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uID09PSBTb3J0aW5nRGlyZWN0aW9uLkFzYztcbiAgICB9XG5cbiAgICBnZXQgZGVzY2VuZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiA9PT0gU29ydGluZ0RpcmVjdGlvbi5EZXNjO1xuICAgIH1cblxuICAgIGdldCBzb3J0aW5nSWNvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uICE9PSBTb3J0aW5nRGlyZWN0aW9uLk5vbmUpIHtcbiAgICAgICAgICAgIC8vIGFycm93X2Rvd253YXJkIGFuZCBhcnJvd191cHdhcmRcbiAgICAgICAgICAgIC8vIGFyZSBtYXRlcmlhbCBpY29ucyBsaWdhdHVyZSBzdHJpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uID09PSBTb3J0aW5nRGlyZWN0aW9uLkFzYyA/ICdhcnJvd191cHdhcmQnIDogJ2Fycm93X2Rvd253YXJkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2Fycm93X3Vwd2FyZCc7XG4gICAgfVxuXG4gICAgZ2V0IHNvcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiAhPT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lO1xuICAgIH1cblxuICAgIGdldCBmaWx0ZXJJY29uQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID8gJ2lneC1leGNlbC1maWx0ZXJfX2ljb24tLWZpbHRlcmVkJyA6ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGhvc3RSb2xlID0gJ2NvbHVtbmhlYWRlcic7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIGdldCBoZWFkZXJJRCgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ3JpZElEfV8ke3RoaXMuY29sdW1uLmZpZWxkfWA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNvcnREaXJlY3Rpb24gPSBTb3J0aW5nRGlyZWN0aW9uLk5vbmU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPixcbiAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHB1YmxpYyB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgX2ZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX21vZHVsZVJlZjogTmdNb2R1bGVSZWY8YW55PixcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJpdmF0ZSBfb3ZlcmxheVNlcnZpY2U6IElneE92ZXJsYXlTZXJ2aWNlXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RmlsdGVyaW5nU2V0dGluZ3MoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmdldFNvcnREaXJlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuaGlkZSh0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb2xSZXNpemluZ1NlcnZpY2UuaXNDb2x1bW5SZXNpemluZykge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uLmZpbHRlcmFibGUgJiYgIXRoaXMuY29sdW1uLmNvbHVtbkdyb3VwICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlckNvbXBsZXgodGhpcy5jb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbHVtbi5zb3J0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkZpbHRlcmluZ0ljb25DbGljayhldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUZpbHRlckRyb3Bkb3duKCk7XG4gICAgfVxuXG4gICAgZ2V0IGdyaWQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRTb3J0RGlyZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBleHByID0gdGhpcy5ncmlkQVBJLmdyaWQuc29ydGluZ0V4cHJlc3Npb25zLmZpbmQoKHgpID0+IHguZmllbGROYW1lID09PSB0aGlzLmNvbHVtbi5maWVsZCk7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IGV4cHIgPyBleHByLmRpciA6IFNvcnRpbmdEaXJlY3Rpb24uTm9uZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Tb3J0aW5nSWNvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyU29ydCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyU29ydCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBpbmdFeHByID0gdGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnMgP1xuICAgICAgICAgICAgdGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnMuZmluZCgoZXhwcikgPT4gZXhwci5maWVsZE5hbWUgPT09IHRoaXMuY29sdW1uLmZpZWxkKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHNvcnREaXIgPSBncm91cGluZ0V4cHIgP1xuICAgICAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uICsgMSA+IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyA/IFNvcnRpbmdEaXJlY3Rpb24uQXNjIDogU29ydGluZ0RpcmVjdGlvbi5EZXNjXG4gICAgICAgICAgICA6IHRoaXMuc29ydERpcmVjdGlvbiArIDEgPiBTb3J0aW5nRGlyZWN0aW9uLkRlc2MgPyBTb3J0aW5nRGlyZWN0aW9uLk5vbmUgOiB0aGlzLnNvcnREaXJlY3Rpb24gKyAxO1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSBzb3J0RGlyO1xuICAgICAgICB0aGlzLmdyaWQuc29ydCh7IGZpZWxkTmFtZTogdGhpcy5jb2x1bW4uZmllbGQsIGRpcjogdGhpcy5zb3J0RGlyZWN0aW9uLCBpZ25vcmVDYXNlOiB0aGlzLmNvbHVtbi5zb3J0aW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgIHN0cmF0ZWd5OiB0aGlzLmNvbHVtbi5zb3J0U3RyYXRlZ3kgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVGaWx0ZXJEcm9wZG93bigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclRhcmdldCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgZmlsdGVySWNvblRhcmdldCA9IGhlYWRlclRhcmdldC5xdWVyeVNlbGVjdG9yKCcuJyArIHRoaXMuZmlsdGVySWNvbkNsYXNzTmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy50YXJnZXQgPSBmaWx0ZXJJY29uVGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmdyaWQub3V0bGV0O1xuXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgPVxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmF0dGFjaChJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCwgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncywgdGhpcy5fbW9kdWxlUmVmKTtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLnNob3codGhpcy5fY29tcG9uZW50T3ZlcmxheUlkLCB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZpbHRlcmluZ1NldHRpbmdzKCkge1xuICAgICAgICB0aGlzLl9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogdXNlQW5pbWF0aW9uKGZhZGVJbiwge1xuICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogJzI1MG1zJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IHVzZUFuaW1hdGlvbihmYWRlT3V0LCB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAnMjAwbXMnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSh0aGlzLl9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLm9uT3BlbmluZy5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChvdmVybGF5KSA9PiBvdmVybGF5LmlkID09PSB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKChldmVudEFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3ZlcmxheU9wZW5pbmcoZXZlbnRBcmdzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLm9uQ2xvc2VkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIob3ZlcmxheSA9PiBvdmVybGF5LmlkID09PSB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3ZlcmxheUNsb3NlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk92ZXJsYXlPcGVuaW5nKGV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGV2ZW50QXJncy5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQ7XG4gICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdGFuY2UuaW5pdGlhbGl6ZSh0aGlzLmNvbHVtbiwgdGhpcy5fb3ZlcmxheVNlcnZpY2UsIGV2ZW50QXJncy5pZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uT3ZlcmxheUNsb3NlZCgpIHtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkID0gbnVsbDtcbiAgICB9XG59XG4iXX0=