@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
136 lines • 16.2 kB
JavaScript
import { Injectable, InjectionToken, Injector } from '@angular/core';
import { Router } from '@angular/router';
import { shareReplay, map, distinctUntilChanged } from 'rxjs/operators';
import { fromTrigger, hookGeneric, getInjectedHooks, sortByPriority, stateToFactory, ExtensionPointForPlugins } from '../common/extension-hooks';
import { groupBy } from 'lodash-es';
import { PluginsResolveService } from '../plugins/plugins-resolve.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "../plugins/plugins-resolve.service";
/**
* A hook to add ActionBarItems using the multi provider extension concept.
* Consider using the `hookActionBar` function instead.
*
* ```typescript
* providers: [
* {
* provide: HOOK_ACTION_BAR,
* useValue: [{ template: SomeComponent, priority: 10, placement: 'left' } as ActionBarItem],
* multi: true
* }
* ]
* ```
* @deprecated Consider using the `hookActionBar` function instead.
*/
export const HOOK_ACTION_BAR = new InjectionToken('HOOK_ACTION_BAR');
/**
* A hook to add ActionBarItems using the multi provider extension concept.
*
* You can either provide a single `ActionBarItem` as parameter:
* ```typescript
* hookActionBar(...)
* ```
*
* Or an array to directly register multiple:
* ```typescript
* hookActionBar([...])
* ```
*
* Or you provide an Service that implements `ExtensionFactory<ActionBarItem>`
* ```typescript
* export class MyActionBarFactory implements ExtensionFactory<ActionBarItem> {...}
* ...
* hookActionBar(MyActionBarFactory)
* ```
* A typed alternative to `HOOK_ACTION_BAR`.
* @param items The `ActionBarItem`'s or `ExtensionFactory` to be provided.
* @returns An `Provider` to be provided in your module.
*/
export function hookActionBar(items, options) {
return hookGeneric(items, HOOK_ACTION_BAR, options);
}
/**
* A service which defines action-bar items via the multi provider concept.
*
* ```typescript
* // preferred way, multi provider concept:
* providers: [
* {
* provide: HOOK_ACTION_BAR,
* useValue: [{ template: SomeComponent, priority: 10, placement: 'left' } as ActionBarItem],
* multi: true
* }
* ]
*
* // use services:
* this.actionBarService.add({ template: SomeComponent, priority: 10, placement: 'left' });
* ```
*/
export class ActionBarService extends ExtensionPointForPlugins {
/**
* @ignore
*/
constructor(rootInjector, router, plugins) {
super(rootInjector, plugins);
this.router = router;
this.items$ = this.setupItemsObservable();
}
/**
* Returns the current state.
* @readonly
* @returns The current set of actions.
*/
get state() {
return this.state$.value;
}
/**
* Adds a new item to the action bar in the header and emits a state change.
* @param item The item to add.
*/
add(item) {
this.state.add(item);
this.emitNewState();
}
/**
* Removes an action bar item from the header and emits a state change.
* @param item The item to remove.
*/
remove(item) {
this.state.delete(item);
this.emitNewState();
}
setupItemsObservable() {
return fromTrigger(this.router, this.refresh$, [
getInjectedHooks(HOOK_ACTION_BAR, this.injectors),
() => this.factories,
stateToFactory(this.state$)
]).pipe(map((items) => {
const grouped = groupBy(items, 'groupId');
// groupBy stores undefined as a string key -> all undefined a ungrouped
const ungroupedItems = grouped.undefined || [];
const groupedItems = Object.keys(grouped)
.filter(key => key !== 'undefined')
.map(key => this.pickItemFromGroup(grouped[key]));
return [...ungroupedItems, ...groupedItems];
}), map(items => sortByPriority(items)), shareReplay(1), distinctUntilChanged());
}
pickItemFromGroup(groupedItems) {
const groupIsPrioritized = groupedItems.some(item => item.hasOwnProperty('inGroupPriority'));
if (!groupIsPrioritized) {
return groupedItems[0];
}
const itemWithHighestPriority = groupedItems.reduce((prev, current) => {
return prev.inGroupPriority > current.inGroupPriority ? prev : current;
});
return itemWithHighestPriority;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionBarService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionBarService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionBarService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i2.PluginsResolveService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWJhci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9hY3Rpb24tYmFyL2FjdGlvbi1iYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUVMLFdBQVcsRUFFWCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxjQUFjLEVBQ2Qsd0JBQXdCLEVBRXpCLE1BQU0sMkJBQTJCLENBQUM7QUFFbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7OztBQXNCM0U7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxjQUFjLENBQXFCLGlCQUFpQixDQUFDLENBQUM7QUFFekY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixLQUFxQyxFQUNyQyxPQUFxQztJQUVyQyxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSx3QkFBdUM7SUFDM0U7O09BRUc7SUFDSCxZQUNFLFlBQXNCLEVBQ2QsTUFBYyxFQUN0QixPQUE4QjtRQUU5QixLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSHJCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFJdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxJQUFtQjtRQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFtQjtRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLG9CQUFvQjtRQUM1QixPQUFPLFdBQVcsQ0FBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzVELGdCQUFnQixDQUFnQixlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNoRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNwQixjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUM1QixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLEtBQXNCLEVBQUUsRUFBRTtZQUM3QixNQUFNLE9BQU8sR0FBb0MsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRSx3RUFBd0U7WUFDeEUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7aUJBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUM7aUJBQ2xDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxHQUFHLGNBQWMsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNuQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQ2Qsb0JBQW9CLEVBQUUsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxZQUE2QjtRQUN2RCxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN4QixPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSx1QkFBdUIsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3BFLE9BQU8sSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sdUJBQXVCLENBQUM7SUFDakMsQ0FBQzsrR0F0RVUsZ0JBQWdCO21IQUFoQixnQkFBZ0IsY0FGZixNQUFNOzs0RkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmVSZXBsYXksIG1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBFeHRlbnNpb25GYWN0b3J5LFxuICBmcm9tVHJpZ2dlcixcbiAgR2VuZXJpY0hvb2tUeXBlLFxuICBob29rR2VuZXJpYyxcbiAgZ2V0SW5qZWN0ZWRIb29rcyxcbiAgc29ydEJ5UHJpb3JpdHksXG4gIHN0YXRlVG9GYWN0b3J5LFxuICBFeHRlbnNpb25Qb2ludEZvclBsdWdpbnMsXG4gIEdlbmVyaWNIb29rT3B0aW9uc1xufSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IEFjdGlvbkJhckl0ZW0gfSBmcm9tICcuL2FjdGlvbi1iYXIubW9kZWwnO1xuaW1wb3J0IHsgZ3JvdXBCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBQbHVnaW5zUmVzb2x2ZVNlcnZpY2UgfSBmcm9tICcuLi9wbHVnaW5zL3BsdWdpbnMtcmVzb2x2ZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBBbiBleHRlbnNpb24gSE9PSyBjYW4gdXNlIGVpdGhlciBhIHB1cmUgdmFsdWU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgeyBwcm92aWRlOiBIT09LX1gsIHVzZVZhbHVlOiB7IC4uLmhvb2tWYWx1ZSB9LCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqXG4gKiBPciBhbiBhcnJheSB0byBkaXJlY3RseSByZWdpc3RlciBtdWx0aXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICB7IHByb3ZpZGU6IEhPT0tfWCwgdXNlVmFsdWU6IFt7IC4uLmhvb2tWYWx1ZXMgfV0sIG11bHRpOiB0cnVlIH1cbiAqIGBgYFxuICpcbiAqIE9yIGFuIEV4dGVuc2lvbkZhY3Rvcnkgd2hpY2ggYWxsb3dzIHRvIGRlZmluZSBhIGdldCgpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uXG4gKiBnZXRzIGNhbGxlZCBvbiBlYWNoIG5hdmlnYXRpb24gd2l0aCB0aGUgY3VycmVudCByb3V0ZSBhbmQgY2FuIHJldHVybiB2YWx1ZXNcbiAqIGFzeW5jIChvYnNlcnZhYmxlIG9yIHByb21pc2UpLlxuICogYGBgdHlwZXNjcmlwdFxuICogIHsgcHJvdmlkZTogSE9PS19YLCB1c2VGYWN0b3J5OiB7IGdldDogKHJvdXRlKSA9PiBkb1NvbWV0aGluZ0FzeW5jKHJvdXRlKSB9LCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgQWN0aW9uQmFyRXh0ZW5zaW9uID0gQWN0aW9uQmFySXRlbSB8IEFjdGlvbkJhckl0ZW1bXSB8IEV4dGVuc2lvbkZhY3Rvcnk8QWN0aW9uQmFySXRlbT47XG5cbi8qKlxuICogQSBob29rIHRvIGFkZCBBY3Rpb25CYXJJdGVtcyB1c2luZyB0aGUgbXVsdGkgcHJvdmlkZXIgZXh0ZW5zaW9uIGNvbmNlcHQuXG4gKiBDb25zaWRlciB1c2luZyB0aGUgYGhvb2tBY3Rpb25CYXJgIGZ1bmN0aW9uIGluc3RlYWQuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogcHJvdmlkZXJzOiBbXG4gKiAgIHtcbiAqICAgICBwcm92aWRlOiBIT09LX0FDVElPTl9CQVIsXG4gKiAgICAgdXNlVmFsdWU6IFt7IHRlbXBsYXRlOiBTb21lQ29tcG9uZW50LCBwcmlvcml0eTogMTAsIHBsYWNlbWVudDogJ2xlZnQnIH0gYXMgQWN0aW9uQmFySXRlbV0sXG4gKiAgICAgbXVsdGk6IHRydWVcbiAqICAgfVxuICogXVxuICogYGBgXG4gKiBAZGVwcmVjYXRlZCBDb25zaWRlciB1c2luZyB0aGUgYGhvb2tBY3Rpb25CYXJgIGZ1bmN0aW9uIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBIT09LX0FDVElPTl9CQVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48QWN0aW9uQmFyRXh0ZW5zaW9uPignSE9PS19BQ1RJT05fQkFSJyk7XG5cbi8qKlxuICogQSBob29rIHRvIGFkZCBBY3Rpb25CYXJJdGVtcyB1c2luZyB0aGUgbXVsdGkgcHJvdmlkZXIgZXh0ZW5zaW9uIGNvbmNlcHQuXG4gKlxuICogWW91IGNhbiBlaXRoZXIgcHJvdmlkZSBhIHNpbmdsZSBgQWN0aW9uQmFySXRlbWAgYXMgcGFyYW1ldGVyOlxuICogYGBgdHlwZXNjcmlwdFxuICogIGhvb2tBY3Rpb25CYXIoLi4uKVxuICogYGBgXG4gKlxuICogT3IgYW4gYXJyYXkgdG8gZGlyZWN0bHkgcmVnaXN0ZXIgbXVsdGlwbGU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgaG9va0FjdGlvbkJhcihbLi4uXSlcbiAqIGBgYFxuICpcbiAqIE9yIHlvdSBwcm92aWRlIGFuIFNlcnZpY2UgdGhhdCBpbXBsZW1lbnRzIGBFeHRlbnNpb25GYWN0b3J5PEFjdGlvbkJhckl0ZW0+YFxuICogYGBgdHlwZXNjcmlwdFxuICogIGV4cG9ydCBjbGFzcyBNeUFjdGlvbkJhckZhY3RvcnkgaW1wbGVtZW50cyBFeHRlbnNpb25GYWN0b3J5PEFjdGlvbkJhckl0ZW0+IHsuLi59XG4gKiAgLi4uXG4gKiAgaG9va0FjdGlvbkJhcihNeUFjdGlvbkJhckZhY3RvcnkpXG4gKiBgYGBcbiAqIEEgdHlwZWQgYWx0ZXJuYXRpdmUgdG8gYEhPT0tfQUNUSU9OX0JBUmAuXG4gKiBAcGFyYW0gaXRlbXMgVGhlIGBBY3Rpb25CYXJJdGVtYCdzIG9yIGBFeHRlbnNpb25GYWN0b3J5YCB0byBiZSBwcm92aWRlZC5cbiAqIEByZXR1cm5zIEFuIGBQcm92aWRlcmAgdG8gYmUgcHJvdmlkZWQgaW4geW91ciBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rQWN0aW9uQmFyKFxuICBpdGVtczogR2VuZXJpY0hvb2tUeXBlPEFjdGlvbkJhckl0ZW0+LFxuICBvcHRpb25zPzogUGFydGlhbDxHZW5lcmljSG9va09wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIGhvb2tHZW5lcmljKGl0ZW1zLCBIT09LX0FDVElPTl9CQVIsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEEgc2VydmljZSB3aGljaCBkZWZpbmVzIGFjdGlvbi1iYXIgaXRlbXMgdmlhIHRoZSBtdWx0aSBwcm92aWRlciBjb25jZXB0LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHByZWZlcnJlZCB3YXksIG11bHRpIHByb3ZpZGVyIGNvbmNlcHQ6XG4gKiBwcm92aWRlcnM6IFtcbiAqICAge1xuICogICAgIHByb3ZpZGU6IEhPT0tfQUNUSU9OX0JBUixcbiAqICAgICB1c2VWYWx1ZTogW3sgdGVtcGxhdGU6IFNvbWVDb21wb25lbnQsIHByaW9yaXR5OiAxMCwgcGxhY2VtZW50OiAnbGVmdCcgfSBhcyBBY3Rpb25CYXJJdGVtXSxcbiAqICAgICBtdWx0aTogdHJ1ZVxuICogICB9XG4gKiBdXG4gKlxuICogLy8gdXNlIHNlcnZpY2VzOlxuICogdGhpcy5hY3Rpb25CYXJTZXJ2aWNlLmFkZCh7IHRlbXBsYXRlOiBTb21lQ29tcG9uZW50LCBwcmlvcml0eTogMTAsIHBsYWNlbWVudDogJ2xlZnQnIH0pO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFjdGlvbkJhclNlcnZpY2UgZXh0ZW5kcyBFeHRlbnNpb25Qb2ludEZvclBsdWdpbnM8QWN0aW9uQmFySXRlbT4ge1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdEluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHBsdWdpbnM6IFBsdWdpbnNSZXNvbHZlU2VydmljZVxuICApIHtcbiAgICBzdXBlcihyb290SW5qZWN0b3IsIHBsdWdpbnMpO1xuICAgIHRoaXMuaXRlbXMkID0gdGhpcy5zZXR1cEl0ZW1zT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAqIEByZWFkb25seVxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXQgb2YgYWN0aW9ucy5cbiAgICovXG4gIGdldCBzdGF0ZSgpOiBTZXQ8QWN0aW9uQmFySXRlbT4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlJC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGl0ZW0gdG8gdGhlIGFjdGlvbiBiYXIgaW4gdGhlIGhlYWRlciBhbmQgZW1pdHMgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGFkZC5cbiAgICovXG4gIGFkZChpdGVtOiBBY3Rpb25CYXJJdGVtKSB7XG4gICAgdGhpcy5zdGF0ZS5hZGQoaXRlbSk7XG4gICAgdGhpcy5lbWl0TmV3U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGFjdGlvbiBiYXIgaXRlbSBmcm9tIHRoZSBoZWFkZXIgYW5kIGVtaXRzIGEgc3RhdGUgY2hhbmdlLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byByZW1vdmUuXG4gICAqL1xuICByZW1vdmUoaXRlbTogQWN0aW9uQmFySXRlbSkge1xuICAgIHRoaXMuc3RhdGUuZGVsZXRlKGl0ZW0pO1xuICAgIHRoaXMuZW1pdE5ld1N0YXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBJdGVtc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxBY3Rpb25CYXJJdGVtW10+IHtcbiAgICByZXR1cm4gZnJvbVRyaWdnZXI8QWN0aW9uQmFySXRlbT4odGhpcy5yb3V0ZXIsIHRoaXMucmVmcmVzaCQsIFtcbiAgICAgIGdldEluamVjdGVkSG9va3M8QWN0aW9uQmFySXRlbT4oSE9PS19BQ1RJT05fQkFSLCB0aGlzLmluamVjdG9ycyksXG4gICAgICAoKSA9PiB0aGlzLmZhY3RvcmllcyxcbiAgICAgIHN0YXRlVG9GYWN0b3J5KHRoaXMuc3RhdGUkKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKGl0ZW1zOiBBY3Rpb25CYXJJdGVtW10pID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBlZDogUmVjb3JkPHN0cmluZywgQWN0aW9uQmFySXRlbVtdPiA9IGdyb3VwQnkoaXRlbXMsICdncm91cElkJyk7XG4gICAgICAgIC8vIGdyb3VwQnkgc3RvcmVzIHVuZGVmaW5lZCBhcyBhIHN0cmluZyBrZXkgLT4gYWxsIHVuZGVmaW5lZCBhIHVuZ3JvdXBlZFxuICAgICAgICBjb25zdCB1bmdyb3VwZWRJdGVtcyA9IGdyb3VwZWQudW5kZWZpbmVkIHx8IFtdO1xuICAgICAgICBjb25zdCBncm91cGVkSXRlbXMgPSBPYmplY3Qua2V5cyhncm91cGVkKVxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgLm1hcChrZXkgPT4gdGhpcy5waWNrSXRlbUZyb21Hcm91cChncm91cGVkW2tleV0pKTtcbiAgICAgICAgcmV0dXJuIFsuLi51bmdyb3VwZWRJdGVtcywgLi4uZ3JvdXBlZEl0ZW1zXTtcbiAgICAgIH0pLFxuICAgICAgbWFwKGl0ZW1zID0+IHNvcnRCeVByaW9yaXR5KGl0ZW1zKSksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBpY2tJdGVtRnJvbUdyb3VwKGdyb3VwZWRJdGVtczogQWN0aW9uQmFySXRlbVtdKTogQWN0aW9uQmFySXRlbSB7XG4gICAgY29uc3QgZ3JvdXBJc1ByaW9yaXRpemVkID0gZ3JvdXBlZEl0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLmhhc093blByb3BlcnR5KCdpbkdyb3VwUHJpb3JpdHknKSk7XG4gICAgaWYgKCFncm91cElzUHJpb3JpdGl6ZWQpIHtcbiAgICAgIHJldHVybiBncm91cGVkSXRlbXNbMF07XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1XaXRoSGlnaGVzdFByaW9yaXR5ID0gZ3JvdXBlZEl0ZW1zLnJlZHVjZSgocHJldiwgY3VycmVudCkgPT4ge1xuICAgICAgcmV0dXJuIHByZXYuaW5Hcm91cFByaW9yaXR5ID4gY3VycmVudC5pbkdyb3VwUHJpb3JpdHkgPyBwcmV2IDogY3VycmVudDtcbiAgICB9KTtcbiAgICByZXR1cm4gaXRlbVdpdGhIaWdoZXN0UHJpb3JpdHk7XG4gIH1cbn1cbiJdfQ==