UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

322 lines 39.3 kB
var IgxRowIslandComponent_1; import { __decorate, __metadata, __param } from "tslib"; import { AfterContentInit, ChangeDetectionStrategy, Component, ContentChildren, Input, QueryList, OnInit, Inject, ElementRef, ChangeDetectorRef, ComponentFactoryResolver, IterableDiffers, ViewContainerRef, NgZone, AfterViewInit, OnChanges, Output, EventEmitter, Optional, OnDestroy, DoCheck } from '@angular/core'; import { IgxGridTransaction } from '../grid-base.directive'; import { GridBaseAPIService } from '../api.service'; import { DOCUMENT } from '@angular/common'; import { IgxFilteringService } from '../filtering/grid-filtering.service'; import { DisplayDensityToken } from '../../core/displayDensity'; import { IgxGridSummaryService } from '../summaries/grid-summary.service'; import { IgxHierarchicalGridBaseDirective } from './hierarchical-grid-base.directive'; import { IgxHierarchicalGridNavigationService } from './hierarchical-grid-navigation.service'; import { IgxGridSelectionService, IgxGridCRUDService } from '../selection/selection.service'; import { IgxOverlayService } from '../../services/index'; import { takeUntil } from 'rxjs/operators'; import { IgxColumnComponent } from '../columns/column.component'; import { IgxRowIslandAPIService } from './row-island-api.service'; import { IgxColumnResizingService } from '../resizing/resizing.service'; let IgxRowIslandComponent = IgxRowIslandComponent_1 = class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective { constructor(selectionService, crudService, colResizingService, gridAPI, transactionFactory, elementRef, zone, document, cdr, resolver, differs, viewRef, navigation, filteringService, overlayService, summaryService, _displayDensityOptions, rowIslandAPI) { super(selectionService, crudService, colResizingService, gridAPI, typeof transactionFactory === 'function' ? transactionFactory() : transactionFactory, elementRef, zone, document, cdr, resolver, differs, viewRef, navigation, filteringService, overlayService, summaryService, _displayDensityOptions); this.selectionService = selectionService; this.colResizingService = colResizingService; this.transactionFactory = transactionFactory; this.document = document; this.overlayService = overlayService; this.summaryService = summaryService; this._displayDensityOptions = _displayDensityOptions; this.rowIslandAPI = rowIslandAPI; /** * @hidden */ this.children = new QueryList(); /** * @hidden */ this.childColumns = new QueryList(); /** * @hidden */ this.onLayoutChange = new EventEmitter(); /** * Event emmited when a grid is being created based on this row island. * ```html * <igx-hierarchical-grid [data]="Data" [autoGenerate]="true"> * <igx-row-island [key]="'childData'" (onGridCreated)="gridCreated($event)" #rowIsland> * <!-- ... --> * </igx-row-island> * </igx-hierarchical-grid> * ``` * @memberof IgxRowIslandComponent */ this.onGridCreated = new EventEmitter(); /** * @hidden */ this.initialChanges = []; /** * @hidden */ this.rootGrid = null; this.layout_id = `igx-row-island-`; this.isInit = false; this.hgridAPI = gridAPI; } /** * Sets if all immediate children of the grids for this `IgxRowIslandComponent` should be expanded/collapsed. * ```html * <igx-hierarchical-grid [data]="Data" [autoGenerate]="true"> * <igx-row-island [key]="'childData'" [expandChildren]="true" #rowIsland> * <!-- ... --> * </igx-row-island> * </igx-hierarchical-grid> * ``` * @memberof IgxRowIslandComponent */ set expandChildren(value) { this._expandChildren = value; this.rowIslandAPI.getChildGrids().forEach((grid) => { if (document.body.contains(grid.nativeElement)) { // Detect changes right away if the grid is visible grid.expandChildren = value; grid.markForCheck(); } else { // Else defer the detection on changes when the grid gets into view for performance. grid.updateOnRender = true; } }); } /** * Gets if all immediate children of the grids for this `IgxRowIslandComponent` have been set to be expanded/collapsed. * ```typescript * const expanded = this.rowIsland.expandChildren; * ``` * @memberof IgxRowIslandComponent */ get expandChildren() { return this._expandChildren; } /** * @hidden */ get id() { const pId = this.parentId ? this.parentId.substring(this.parentId.indexOf(this.layout_id) + this.layout_id.length) + '-' : ''; return this.layout_id + pId + this.key; } /** * @hidden */ get parentId() { return this.parentIsland ? this.parentIsland.id : null; } /** * @hidden */ get level() { let ptr = this.parentIsland; let lvl = 0; while (ptr) { lvl++; ptr = ptr.parentIsland; } return lvl + 1; } /** * @hidden */ ngOnInit() { this.rootGrid = this.hgridAPI.grid; this.rowIslandAPI.rowIsland = this; } /** * @hidden */ ngDoCheck() { } /** * @hidden */ ngAfterContentInit() { this.updateChildren(); this.children.notifyOnChanges(); this.children.changes.pipe(takeUntil(this.destroy$)) .subscribe((change) => { this.updateChildren(); // update existing grids since their child ri have been changed. this.getGridsForIsland(this.key).forEach(grid => { grid.onRowIslandChange(this.children); }); }); const nestedColumns = this.children.map((layout) => layout.columnList.toArray()); const colsArray = [].concat.apply([], nestedColumns); const topCols = this.columnList.filter((item) => { return colsArray.indexOf(item) === -1; }); this.childColumns.reset(topCols); this.columnList.changes.pipe(takeUntil(this.destroy$)).subscribe(() => { this.updateColumnList(); }); } updateChildren() { if (this.children.first === this) { this.children.reset(this.children.toArray().slice(1)); } this.children.forEach(child => { child.parentIsland = this; }); } /** * @hidden */ ngAfterViewInit() { this.rowIslandAPI.register(this); if (this.parentIsland) { this.parentIsland.rowIslandAPI.registerChildRowIsland(this); } else { this.rootGrid.hgridAPI.registerChildRowIsland(this); } this._init = false; } /** * @hidden */ ngOnChanges(changes) { this.onLayoutChange.emit(changes); if (!this.isInit) { this.initialChanges.push(changes); } } /** * @hidden */ ngOnDestroy() { // Override the base destroy because we don't have rendered anything to use removeEventListener on this.destroy$.next(true); this.destroy$.complete(); this._destroyed = true; this.rowIslandAPI.unset(this.id); if (this.parentIsland) { this.getGridsForIsland(this.key).forEach(grid => { this.cleanGridState(grid); grid.hgridAPI.unsetChildRowIsland(this); }); this.parentIsland.rowIslandAPI.unsetChildRowIsland(this); } else { this.rootGrid.hgridAPI.unsetChildRowIsland(this); this.cleanGridState(this.rootGrid); } } cleanGridState(grid) { grid.childGridTemplates.forEach((tmpl) => { tmpl.owner.cleanView(tmpl.context.templateID); }); grid.childGridTemplates.clear(); grid.onRowIslandChange(); } /** * @hidden */ reflow() { } /** * @hidden */ calculateGridHeight() { } updateColumnList() { const nestedColumns = this.children.map((layout) => layout.columnList.toArray()); const colsArray = [].concat.apply([], nestedColumns); const topCols = this.columnList.filter((item) => { if (colsArray.indexOf(item) === -1) { /* Reset the default width of the columns that come into this row island, because the root catches them first during the detectChanges() and sets their defaultWidth. */ item.defaultWidth = undefined; return true; } return false; }); this.childColumns.reset(topCols); if (this.parentIsland) { this.parentIsland.columnList.notifyOnChanges(); } else { this.rootGrid.columnList.notifyOnChanges(); } this.rowIslandAPI.getChildGrids().forEach((grid) => { grid.createColumnsList(this.childColumns.toArray()); if (!document.body.contains(grid.nativeElement)) { grid.updateOnRender = true; } }); } }; IgxRowIslandComponent.ctorParameters = () => [ { type: IgxGridSelectionService }, { type: IgxGridCRUDService }, { type: IgxColumnResizingService }, { type: GridBaseAPIService }, { type: undefined, decorators: [{ type: Inject, args: [IgxGridTransaction,] }] }, { type: ElementRef }, { type: NgZone }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: ChangeDetectorRef }, { type: ComponentFactoryResolver }, { type: IterableDiffers }, { type: ViewContainerRef }, { type: IgxHierarchicalGridNavigationService }, { type: IgxFilteringService }, { type: IgxOverlayService, decorators: [{ type: Inject, args: [IgxOverlayService,] }] }, { type: IgxGridSummaryService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }, { type: IgxRowIslandAPIService } ]; __decorate([ Input(), __metadata("design:type", String) ], IgxRowIslandComponent.prototype, "key", void 0); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxRowIslandComponent.prototype, "expandChildren", null); __decorate([ ContentChildren(IgxRowIslandComponent_1, { read: IgxRowIslandComponent_1, descendants: false }), __metadata("design:type", Object) ], IgxRowIslandComponent.prototype, "children", void 0); __decorate([ ContentChildren(IgxColumnComponent, { read: IgxColumnComponent, descendants: false }), __metadata("design:type", Object) ], IgxRowIslandComponent.prototype, "childColumns", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxRowIslandComponent.prototype, "onLayoutChange", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxRowIslandComponent.prototype, "onGridCreated", void 0); IgxRowIslandComponent = IgxRowIslandComponent_1 = __decorate([ Component({ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-row-island', template: ``, providers: [IgxRowIslandAPIService] }), __param(4, Inject(IgxGridTransaction)), __param(7, Inject(DOCUMENT)), __param(14, Inject(IgxOverlayService)), __param(16, Optional()), __param(16, Inject(DisplayDensityToken)), __metadata("design:paramtypes", [IgxGridSelectionService, IgxGridCRUDService, IgxColumnResizingService, GridBaseAPIService, Object, ElementRef, NgZone, Object, ChangeDetectorRef, ComponentFactoryResolver, IterableDiffers, ViewContainerRef, IgxHierarchicalGridNavigationService, IgxFilteringService, IgxOverlayService, IgxGridSummaryService, Object, IgxRowIslandAPIService]) ], IgxRowIslandComponent); export { IgxRowIslandComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93LWlzbGFuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL2hpZXJhcmNoaWNhbC1ncmlkL3Jvdy1pc2xhbmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNILGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sVUFBVSxFQUNWLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sYUFBYSxFQUNiLFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxFQUNaLFFBQVEsRUFDUixTQUFTLEVBQ1QsT0FBTyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBd0IsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDMUUsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXhGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTdGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9B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UUFDbkMsa0JBQWtCO1FBQ0osd0JBQXdCO1FBQzFDLGtCQUFrQixVQUVmLFVBQVU7UUFDaEIsTUFBTSxVQUVQLGlCQUFpQjtRQUNaLHdCQUF3QjtRQUN6QixlQUFlO1FBQ2YsZ0JBQWdCO1FBQ2Isb0NBQW9DO1FBQzlCLG1CQUFtQjtRQUNnQixpQkFBaUI7UUFDL0MscUJBQXFCLFVBRXZCLHNCQUFzQjtHQWpKdEMscUJBQXFCLENBK1NqQztTQS9TWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBJbnB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgT25Jbml0LFxuICAgIEluamVjdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBJdGVyYWJsZURpZmZlcnMsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBOZ1pvbmUsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPcHRpb25hbCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgRG9DaGVja1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnQgfSBmcm9tICcuL2hpZXJhcmNoaWNhbC1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkVHJhbnNhY3Rpb24sIElneEdyaWRCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZ3JpZC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBHcmlkQmFzZUFQSVNlcnZpY2UgfSBmcm9tICcuLi9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkQVBJU2VydmljZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSWd4RmlsdGVyaW5nU2VydmljZSB9IGZyb20gJy4uL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4gfSBmcm9tICcuLi8uLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uU2VydmljZSwgVHJhbnNhY3Rpb24sIFN0YXRlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgSWd4R3JpZFN1bW1hcnlTZXJ2aWNlIH0gZnJvbSAnLi4vc3VtbWFyaWVzL2dyaWQtc3VtbWFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWRCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtZ3JpZC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL2hpZXJhcmNoaWNhbC1ncmlkLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSwgSWd4R3JpZENSVURTZXJ2aWNlIH0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcblxuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbmRleCc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Um93SXNsYW5kQVBJU2VydmljZSB9IGZyb20gJy4vcm93LWlzbGFuZC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi4vcmVzaXppbmcvcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQ3JlYXRlZEV2ZW50QXJncyBleHRlbmRzIElCYXNlRXZlbnRBcmdzIHtcbiAgICBvd25lcjogSWd4Um93SXNsYW5kQ29tcG9uZW50O1xuICAgIHBhcmVudElEOiBhbnk7XG4gICAgZ3JpZDogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc2VsZWN0b3I6ICdpZ3gtcm93LWlzbGFuZCcsXG4gICAgdGVtcGxhdGU6IGBgLFxuICAgIHByb3ZpZGVyczogW0lneFJvd0lzbGFuZEFQSVNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIElneFJvd0lzbGFuZENvbXBvbmVudCBleHRlbmRzIElneEhpZXJhcmNoaWNhbEdyaWRCYXNlRGlyZWN0aXZlXG4gICAgICAgICAgICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3ksIERvQ2hlY2sge1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGtleSBvZiB0aGUgcm93IGlzbGFuZCBieSB3aGljaCBjaGlsZCBkYXRhIHdvdWxkIGJlIHRha2VuIGZyb20gdGhlIHJvdyBkYXRhIGlmIHN1Y2ggaXMgcHJvdmlkZWQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICAgICAgPGlneC1yb3ctaXNsYW5kIFtrZXldPVwiJ2NoaWxkRGF0YSdcIj5cbiAgICAgKiAgICAgICAgICA8IS0tIC4uLiAtLT5cbiAgICAgKiAgICAgIDwvaWd4LXJvdy1pc2xhbmQ+XG4gICAgICogPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJvd0lzbGFuZENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGtleTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBpZiBhbGwgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBncmlkcyBmb3IgdGhpcyBgSWd4Um93SXNsYW5kQ29tcG9uZW50YCBzaG91bGQgYmUgZXhwYW5kZWQvY29sbGFwc2VkLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWhpZXJhcmNoaWNhbC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj5cbiAgICAgKiAgICAgIDxpZ3gtcm93LWlzbGFuZCBba2V5XT1cIidjaGlsZERhdGEnXCIgW2V4cGFuZENoaWxkcmVuXT1cInRydWVcIiAjcm93SXNsYW5kPlxuICAgICAqICAgICAgICAgIDwhLS0gLi4uIC0tPlxuICAgICAqICAgICAgPC9pZ3gtcm93LWlzbGFuZD5cbiAgICAgKiA8L2lneC1oaWVyYXJjaGljYWwtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Um93SXNsYW5kQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgZXhwYW5kQ2hpbGRyZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kQ2hpbGRyZW4gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5yb3dJc2xhbmRBUEkuZ2V0Q2hpbGRHcmlkcygpLmZvckVhY2goKGdyaWQpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGdyaWQubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEZXRlY3QgY2hhbmdlcyByaWdodCBhd2F5IGlmIHRoZSBncmlkIGlzIHZpc2libGVcbiAgICAgICAgICAgICAgICBncmlkLmV4cGFuZENoaWxkcmVuID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRWxzZSBkZWZlciB0aGUgZGV0ZWN0aW9uIG9uIGNoYW5nZXMgd2hlbiB0aGUgZ3JpZCBnZXRzIGludG8gdmlldyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgICAgICAgICAgICAgZ3JpZC51cGRhdGVPblJlbmRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgaWYgYWxsIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ3JpZHMgZm9yIHRoaXMgYElneFJvd0lzbGFuZENvbXBvbmVudGAgaGF2ZSBiZWVuIHNldCB0byBiZSBleHBhbmRlZC9jb2xsYXBzZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5yb3dJc2xhbmQuZXhwYW5kQ2hpbGRyZW47XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJvd0lzbGFuZENvbXBvbmVudFxuICAgICAqL1xuICAgIGdldCBleHBhbmRDaGlsZHJlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZENoaWxkcmVuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0lzbGFuZENvbXBvbmVudCwgeyByZWFkOiBJZ3hSb3dJc2xhbmRDb21wb25lbnQsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBjaGlsZHJlbiA9IG5ldyBRdWVyeUxpc3Q8SWd4Um93SXNsYW5kQ29tcG9uZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Q29sdW1uQ29tcG9uZW50LCB7IHJlYWQ6IElneENvbHVtbkNvbXBvbmVudCwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGNoaWxkQ29sdW1ucyA9IG5ldyBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkxheW91dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1taXRlZCB3aGVuIGEgZ3JpZCBpcyBiZWluZyBjcmVhdGVkIGJhc2VkIG9uIHRoaXMgcm93IGlzbGFuZC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1oaWVyYXJjaGljYWwtZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+XG4gICAgICogICAgICA8aWd4LXJvdy1pc2xhbmQgW2tleV09XCInY2hpbGREYXRhJ1wiIChvbkdyaWRDcmVhdGVkKT1cImdyaWRDcmVhdGVkKCRldmVudClcIiAjcm93SXNsYW5kPlxuICAgICAqICAgICAgICAgIDwhLS0gLi4uIC0tPlxuICAgICAqICAgICAgPC9pZ3gtcm93LWlzbGFuZD5cbiAgICAgKiA8L2lneC1oaWVyYXJjaGljYWwtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Um93SXNsYW5kQ29tcG9uZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uR3JpZENyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ3JlYXRlZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIGNvbnN0IHBJZCA9IHRoaXMucGFyZW50SWQgPyB0aGlzLnBhcmVudElkLnN1YnN0cmluZyh0aGlzLnBhcmVudElkLmluZGV4T2YodGhpcy5sYXlvdXRfaWQpICsgdGhpcy5sYXlvdXRfaWQubGVuZ3RoKSArICctJyA6ICcnO1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRfaWQgKyBwSWQgKyAgdGhpcy5rZXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBwYXJlbnRJZCgpIHtcbiAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRJc2xhbmQgPyB0aGlzLnBhcmVudElzbGFuZC5pZCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBsZXZlbCgpIHtcbiAgICAgICAgbGV0IHB0ciA9IHRoaXMucGFyZW50SXNsYW5kO1xuICAgICAgICBsZXQgbHZsID0gMDtcbiAgICAgICAgd2hpbGUgKHB0cikge1xuICAgICAgICAgICAgbHZsKys7XG4gICAgICAgICAgICBwdHIgPSBwdHIucGFyZW50SXNsYW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsdmwgKyAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdGlhbENoYW5nZXMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcm9vdEdyaWQgPSBudWxsO1xuICAgIHJlYWRvbmx5IGRhdGE6IGFueVtdO1xuICAgIHJlYWRvbmx5IGZpbHRlcmVkRGF0YTogYW55W107XG4gICAgcHJpdmF0ZSBsYXlvdXRfaWQgPSBgaWd4LXJvdy1pc2xhbmQtYDtcbiAgICBwcml2YXRlIGlzSW5pdCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgY3J1ZFNlcnZpY2U6IElneEdyaWRDUlVEU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICBncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4sXG4gICAgICAgIEBJbmplY3QoSWd4R3JpZFRyYW5zYWN0aW9uKSBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25GYWN0b3J5OiBhbnksXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50LFxuICAgICAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBkaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgICAgIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIG5hdmlnYXRpb246IElneEhpZXJhcmNoaWNhbEdyaWROYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgZmlsdGVyaW5nU2VydmljZTogSWd4RmlsdGVyaW5nU2VydmljZSxcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJvdGVjdGVkIG92ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICAgICAgcHVibGljIHN1bW1hcnlTZXJ2aWNlOiBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIHB1YmxpYyByb3dJc2xhbmRBUEk6IElneFJvd0lzbGFuZEFQSVNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBzZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICAgICAgY3J1ZFNlcnZpY2UsXG4gICAgICAgICAgICBjb2xSZXNpemluZ1NlcnZpY2UsXG4gICAgICAgICAgICBncmlkQVBJLFxuICAgICAgICAgICAgdHlwZW9mIHRyYW5zYWN0aW9uRmFjdG9yeSA9PT0gJ2Z1bmN0aW9uJyA/IHRyYW5zYWN0aW9uRmFjdG9yeSgpIDogdHJhbnNhY3Rpb25GYWN0b3J5LFxuICAgICAgICAgICAgZWxlbWVudFJlZixcbiAgICAgICAgICAgIHpvbmUsXG4gICAgICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgICAgIGNkcixcbiAgICAgICAgICAgIHJlc29sdmVyLFxuICAgICAgICAgICAgZGlmZmVycyxcbiAgICAgICAgICAgIHZpZXdSZWYsXG4gICAgICAgICAgICBuYXZpZ2F0aW9uLFxuICAgICAgICAgICAgZmlsdGVyaW5nU2VydmljZSxcbiAgICAgICAgICAgIG92ZXJsYXlTZXJ2aWNlLFxuICAgICAgICAgICAgc3VtbWFyeVNlcnZpY2UsXG4gICAgICAgICAgICBfZGlzcGxheURlbnNpdHlPcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaGdyaWRBUEkgPSA8SWd4SGllcmFyY2hpY2FsR3JpZEFQSVNlcnZpY2U+Z3JpZEFQSTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucm9vdEdyaWQgPSB0aGlzLmhncmlkQVBJLmdyaWQ7XG4gICAgICAgIHRoaXMucm93SXNsYW5kQVBJLnJvd0lzbGFuZCA9IHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nRG9DaGVjaygpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XG4gICAgICAgICAgICAvLyB1cGRhdGUgZXhpc3RpbmcgZ3JpZHMgc2luY2UgdGhlaXIgY2hpbGQgcmkgaGF2ZSBiZWVuIGNoYW5nZWQuXG4gICAgICAgICAgICB0aGlzLmdldEdyaWRzRm9ySXNsYW5kKHRoaXMua2V5KS5mb3JFYWNoKGdyaWQgPT4ge1xuICAgICAgICAgICAgICAgIChncmlkIGFzIGFueSkub25Sb3dJc2xhbmRDaGFuZ2UodGhpcy5jaGlsZHJlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5lc3RlZENvbHVtbnMgPSB0aGlzLmNoaWxkcmVuLm1hcCgobGF5b3V0KSA9PiBsYXlvdXQuY29sdW1uTGlzdC50b0FycmF5KCkpO1xuICAgICAgICBjb25zdCBjb2xzQXJyYXkgPSBbXS5jb25jYXQuYXBwbHkoW10sIG5lc3RlZENvbHVtbnMpO1xuICAgICAgICBjb25zdCB0b3BDb2xzID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHNBcnJheS5pbmRleE9mKGl0ZW0pID09PSAtMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hpbGRDb2x1bW5zLnJlc2V0KHRvcENvbHMpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3QuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy51cGRhdGVDb2x1bW5MaXN0KCk7IH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVDaGlsZHJlbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uZmlyc3QgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucmVzZXQodGhpcy5jaGlsZHJlbi50b0FycmF5KCkuc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgICBjaGlsZC5wYXJlbnRJc2xhbmQgPSB0aGlzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnJvd0lzbGFuZEFQSS5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50SXNsYW5kKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5yb3dJc2xhbmRBUEkucmVnaXN0ZXJDaGlsZFJvd0lzbGFuZCh0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyaWQuaGdyaWRBUEkucmVnaXN0ZXJDaGlsZFJvd0lzbGFuZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pbml0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZS5lbWl0KGNoYW5nZXMpO1xuICAgICAgICBpZiAoIXRoaXMuaXNJbml0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxDaGFuZ2VzLnB1c2goY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGRlc3Ryb3kgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHJlbmRlcmVkIGFueXRoaW5nIHRvIHVzZSByZW1vdmVFdmVudExpc3RlbmVyIG9uXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJvd0lzbGFuZEFQSS51bnNldCh0aGlzLmlkKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50SXNsYW5kKSB7XG4gICAgICAgICAgICB0aGlzLmdldEdyaWRzRm9ySXNsYW5kKHRoaXMua2V5KS5mb3JFYWNoKGdyaWQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5HcmlkU3RhdGUoZ3JpZCk7XG4gICAgICAgICAgICAgICAgZ3JpZC5oZ3JpZEFQSS51bnNldENoaWxkUm93SXNsYW5kKHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5yb3dJc2xhbmRBUEkudW5zZXRDaGlsZFJvd0lzbGFuZCh0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyaWQuaGdyaWRBUEkudW5zZXRDaGlsZFJvd0lzbGFuZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW5HcmlkU3RhdGUodGhpcy5yb290R3JpZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFuR3JpZFN0YXRlKGdyaWQpIHtcbiAgICAgICAgZ3JpZC5jaGlsZEdyaWRUZW1wbGF0ZXMuZm9yRWFjaCgodG1wbCkgPT4ge1xuICAgICAgICAgICAgdG1wbC5vd25lci5jbGVhblZpZXcodG1wbC5jb250ZXh0LnRlbXBsYXRlSUQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZ3JpZC5jaGlsZEdyaWRUZW1wbGF0ZXMuY2xlYXIoKTtcbiAgICAgICAgZ3JpZC5vblJvd0lzbGFuZENoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZWZsb3coKSB7fVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNhbGN1bGF0ZUdyaWRIZWlnaHQoKSB7fVxuXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUNvbHVtbkxpc3QoKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZENvbHVtbnMgPSB0aGlzLmNoaWxkcmVuLm1hcCgobGF5b3V0KSA9PiBsYXlvdXQuY29sdW1uTGlzdC50b0FycmF5KCkpO1xuICAgICAgICBjb25zdCBjb2xzQXJyYXkgPSBbXS5jb25jYXQuYXBwbHkoW10sIG5lc3RlZENvbHVtbnMpO1xuICAgICAgICBjb25zdCB0b3BDb2xzID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHNBcnJheS5pbmRleE9mKGl0ZW0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBkZWZhdWx0IHdpZHRoIG9mIHRoZSBjb2x1bW5zIHRoYXQgY29tZSBpbnRvIHRoaXMgcm93IGlzbGFuZCxcbiAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSByb290IGNhdGNoZXMgdGhlbSBmaXJzdCBkdXJpbmcgdGhlIGRldGVjdENoYW5nZXMoKSBhbmQgc2V0cyB0aGVpciBkZWZhdWx0V2lkdGguICovXG4gICAgICAgICAgICAgICAgaXRlbS5kZWZhdWx0V2lkdGggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoaWxkQ29sdW1ucy5yZXNldCh0b3BDb2xzKTtcblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50SXNsYW5kLmNvbHVtbkxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvb3RHcmlkLmNvbHVtbkxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvd0lzbGFuZEFQSS5nZXRDaGlsZEdyaWRzKCkuZm9yRWFjaCgoZ3JpZDogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgZ3JpZC5jcmVhdGVDb2x1bW5zTGlzdCh0aGlzLmNoaWxkQ29sdW1ucy50b0FycmF5KCkpO1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGdyaWQubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBncmlkLnVwZGF0ZU9uUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19