@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
137 lines • 18.7 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable, Subject, isObservable, of } from 'rxjs';
import { first } from 'rxjs/operators';
import * as i0 from "@angular/core";
export class HierarchyBarService {
constructor() {
/** Define the list of selected nodes */
this.nodes$ = new BehaviorSubject([]);
/** Define the events that show the popover when interacting with the arrows */
this.popoverShowTriggers = ['click'];
/** Define the events that hide the popover when interacting with the arrows */
this.popoverHideTriggers = ['click', 'clickoutside', 'escape'];
/** Emit the selected node when it changes */
this.selection$ = new Subject();
/** Define the aria label for the show siblings popover button */
this.showSiblingsAriaLabel = 'Show Siblings';
/** Store nodes as a flattened list */
this._nodes = [];
}
/**
* Store the root node of the hierarchy tree
*/
setRootNode(root) {
// if the node is null or undefined then do nothing
if (!root) {
return;
}
// store the root node
this._root = root;
// create a flat structure of nodes
this._nodes = this.getNodeList(root);
// flatten the array - based on the selected node
this.nodes$.next(this.getSelectedChildren(root));
}
/**
* Select a node. This causes all nodes to be
* deselected and the path to the selected node
* to be selected
*/
selectNode(node) {
// deselect all nodes
this.deselectAll();
// if the node is undefined then do nothing
if (!node) {
return;
}
// ensure the current node is selected and its parents
this.select(node);
// emit a new node list to trigger change detection
this.nodes$.next(this.getSelectedChildren(this._root));
// emit the new selection
this.selection$.next(node);
}
/**
* Handles getting children with support for both arrays and observables
*/
getChildren(node) {
if (Array.isArray(node.children)) {
return of({ loading: false, children: node.children });
}
const children$ = node.children;
// if it is an observable then handle loading
return Observable.create((observer) => {
// emit initial value
observer.next({ loading: true, children: [] });
// now wait until the children observable completes
children$.pipe(first()).subscribe(children => {
// replace the observable with an array for future loading
node.children = children;
// rebuild the node tree
this.setRootNode(this._root);
// emit the latest value
observer.next({ loading: false, children });
// close the observable stream
observer.complete();
});
});
}
/**
* Utility function to get the sibling nodes, taking into account that
* a node may be a root node and may not have a parent.
*/
getSiblings(node) {
return node.parent ? this.getChildren(node.parent) : of({ loading: false, children: [] });
}
/**
* Traverses all the parents to ensure they are selected
*/
select(node) {
node.selected = true;
if (node.parent) {
this.select(node.parent);
}
}
/**
* Deselects all nodes
*/
deselectAll() {
this._nodes.forEach(node => node.selected = false);
}
/**
* Gets all the nodes in the tree as a flat array.
* It also stores the parent node in a parent property
* on the node for easy traversal in both directions
*/
getNodeList(node) {
// if there are no children then return only itself
if (!node.children || isObservable(node.children) || node.children.length === 0) {
return [node];
}
// store the parent property
node.children.forEach(child => child.parent = node);
// get all descendants of this node
const descendants = node.children.reduce((nodes, current) => [...nodes, ...this.getNodeList(current)], []);
return [node, ...descendants];
}
/**
* Gets all selected nodes from the parent node.
*/
getSelectedChildren(node) {
if (isObservable(node.children)) {
return [node];
}
// get the children - and account for when there is none
const children = node.children || [];
// check if any child is selected
const child = children.find(_child => _child.selected);
// return the remaining chain of selected items
return child ? [node, ...this.getSelectedChildren(child)] : [node];
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HierarchyBarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HierarchyBarService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HierarchyBarService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2h5LWJhci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaGllcmFyY2h5LWJhci9oaWVyYXJjaHktYmFyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBWSxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBT3ZDLE1BQU0sT0FBTyxtQkFBbUI7SUFEaEM7UUFHSSx3Q0FBd0M7UUFDeEMsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFxQixFQUFFLENBQUMsQ0FBQztRQVFyRCwrRUFBK0U7UUFDL0Usd0JBQW1CLEdBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEQsK0VBQStFO1FBQy9FLHdCQUFtQixHQUFxQixDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFNUUsNkNBQTZDO1FBQzdDLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBb0IsQ0FBQztRQUU3QyxpRUFBaUU7UUFDakUsMEJBQXFCLEdBQVcsZUFBZSxDQUFDO1FBUWhELHNDQUFzQztRQUM5QixXQUFNLEdBQXVCLEVBQUUsQ0FBQztLQWtKM0M7SUFoSkc7O09BRUc7SUFDSCxXQUFXLENBQUMsSUFBc0I7UUFFOUIsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU87UUFDWCxDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRWxCLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENB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QyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7K0dBL0tRLG1CQUFtQjttSEFBbkIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIFN1YmplY3QsIGlzT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT3ZlcmxheVRyaWdnZXIgfSBmcm9tICcuLi90b29sdGlwL2luZGV4JztcbmltcG9ydCB7IEhpZXJhcmNoeUJhck5vZGVDaGlsZHJlbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9oaWVyYXJjaHktYmFyLW5vZGUtY2hpbGRyZW4uaW50ZXJmYWNlJztcbmltcG9ydCB7IEhpZXJhcmNoeUJhckljb25Db250ZXh0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2hpZXJhcmNoeS1iYXItbm9kZS1pY29uLWNvbnRleHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEhpZXJhcmNoeUJhck5vZGUgfSBmcm9tICcuL2ludGVyZmFjZXMvaGllcmFyY2h5LWJhci1ub2RlLmludGVyZmFjZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIaWVyYXJjaHlCYXJTZXJ2aWNlIHtcblxuICAgIC8qKiBEZWZpbmUgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgbm9kZXMgKi9cbiAgICBub2RlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEhpZXJhcmNoeUJhck5vZGVbXT4oW10pO1xuXG4gICAgLyoqIERlZmluZSBhIGN1c3RvbSBsb2FkaW5nIGluZGljYXRvciAqL1xuICAgIGxvYWRpbmdJbmRpY2F0b3I6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gICAgLyoqIERlZmluZSBhIGN1c3RvbSBvdmVyZmxvdyB0ZW1wbGF0ZSAqL1xuICAgIG92ZXJmbG93VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gICAgLyoqIERlZmluZSB0aGUgZXZlbnRzIHRoYXQgc2hvdyB0aGUgcG9wb3ZlciB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGFycm93cyAqL1xuICAgIHBvcG92ZXJTaG93VHJpZ2dlcnM6IE92ZXJsYXlUcmlnZ2VyW10gPSBbJ2NsaWNrJ107XG5cbiAgICAvKiogRGVmaW5lIHRoZSBldmVudHMgdGhhdCBoaWRlIHRoZSBwb3BvdmVyIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgYXJyb3dzICovXG4gICAgcG9wb3ZlckhpZGVUcmlnZ2VyczogT3ZlcmxheVRyaWdnZXJbXSA9IFsnY2xpY2snLCAnY2xpY2tvdXRzaWRlJywgJ2VzY2FwZSddO1xuXG4gICAgLyoqIEVtaXQgdGhlIHNlbGVjdGVkIG5vZGUgd2hlbiBpdCBjaGFuZ2VzICovXG4gICAgc2VsZWN0aW9uJCA9IG5ldyBTdWJqZWN0PEhpZXJhcmNoeUJhck5vZGU+KCk7XG5cbiAgICAvKiogRGVmaW5lIHRoZSBhcmlhIGxhYmVsIGZvciB0aGUgc2hvdyBzaWJsaW5ncyBwb3BvdmVyIGJ1dHRvbiAqL1xuICAgIHNob3dTaWJsaW5nc0FyaWFMYWJlbDogc3RyaW5nID0gJ1Nob3cgU2libGluZ3MnO1xuXG4gICAgLyoqIEFsbG93IGEgY3VzdG9tIGljb24gdGVtcGxhdGUgdG8gYmUgc3BlY2lmaWVkICovXG4gICAgaWNvbjogVGVtcGxhdGVSZWY8SGllcmFyY2h5QmFySWNvbkNvbnRleHQ+O1xuXG4gICAgLyoqIFN0b3JlIHRoZSByb290IG5vZGUgKi9cbiAgICBwcml2YXRlIF9yb290OiBIaWVyYXJjaHlCYXJOb2RlO1xuXG4gICAgLyoqIFN0b3JlIG5vZGVzIGFzIGEgZmxhdHRlbmVkIGxpc3QgKi9cbiAgICBwcml2YXRlIF9ub2RlczogSGllcmFyY2h5QmFyTm9kZVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSB0aGUgcm9vdCBub2RlIG9mIHRoZSBoaWVyYXJjaHkgdHJlZVxuICAgICAqL1xuICAgIHNldFJvb3ROb2RlKHJvb3Q6IEhpZXJhcmNoeUJhck5vZGUpIHtcblxuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpcyBudWxsIG9yIHVuZGVmaW5lZCB0aGVuIGRvIG5vdGhpbmdcbiAgICAgICAgaWYgKCFyb290KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9yZSB0aGUgcm9vdCBub2RlXG4gICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuXG4gICAgICAgIC8vIGNyZWF0ZSBhIGZsYXQgc3RydWN0dXJlIG9mIG5vZGVzXG4gICAgICAgIHRoaXMuX25vZGVzID0gdGhpcy5nZXROb2RlTGlzdChyb290KTtcblxuICAgICAgICAvLyBmbGF0dGVuIHRoZSBhcnJheSAtIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBub2RlXG4gICAgICAgIHRoaXMubm9kZXMkLm5leHQodGhpcy5nZXRTZWxlY3RlZENoaWxkcmVuKHJvb3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgYSBub2RlLiBUaGlzIGNhdXNlcyBhbGwgbm9kZXMgdG8gYmVcbiAgICAgKiBkZXNlbGVjdGVkIGFuZCB0aGUgcGF0aCB0byB0aGUgc2VsZWN0ZWQgbm9kZVxuICAgICAqIHRvIGJlIHNlbGVjdGVkXG4gICAgICovXG4gICAgc2VsZWN0Tm9kZShub2RlOiBIaWVyYXJjaHlCYXJOb2RlKTogdm9pZCB7XG5cbiAgICAgICAgLy8gZGVzZWxlY3QgYWxsIG5vZGVzXG4gICAgICAgIHRoaXMuZGVzZWxlY3RBbGwoKTtcblxuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpcyB1bmRlZmluZWQgdGhlbiBkbyBub3RoaW5nXG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5zdXJlIHRoZSBjdXJyZW50IG5vZGUgaXMgc2VsZWN0ZWQgYW5kIGl0cyBwYXJlbnRzXG4gICAgICAgIHRoaXMuc2VsZWN0KG5vZGUpO1xuXG4gICAgICAgIC8vIGVtaXQgYSBuZXcgbm9kZSBsaXN0IHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICB0aGlzLm5vZGVzJC5uZXh0KHRoaXMuZ2V0U2VsZWN0ZWRDaGlsZHJlbih0aGlzLl9yb290KSk7XG5cbiAgICAgICAgLy8gZW1pdCB0aGUgbmV3IHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiQubmV4dChub2RlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGdldHRpbmcgY2hpbGRyZW4gd2l0aCBzdXBwb3J0IGZvciBib3RoIGFycmF5cyBhbmQgb2JzZXJ2YWJsZXNcbiAgICAgKi9cbiAgICBnZXRDaGlsZHJlbihub2RlOiBIaWVyYXJjaHlCYXJOb2RlKTogT2JzZXJ2YWJsZTxIaWVyYXJjaHlCYXJOb2RlQ2hpbGRyZW4+IHtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlLmNoaWxkcmVuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHsgbG9hZGluZzogZmFsc2UsIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4kOiBPYnNlcnZhYmxlPEhpZXJhcmNoeUJhck5vZGVbXT4gPSBub2RlLmNoaWxkcmVuO1xuXG4gICAgICAgIC8vIGlmIGl0IGlzIGFuIG9ic2VydmFibGUgdGhlbiBoYW5kbGUgbG9hZGluZ1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoKG9ic2VydmVyOiBPYnNlcnZlcjxIaWVyYXJjaHlCYXJOb2RlQ2hpbGRyZW4+KSA9PiB7XG4gICAgICAgICAgICAvLyBlbWl0IGluaXRpYWwgdmFsdWVcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBsb2FkaW5nOiB0cnVlLCBjaGlsZHJlbjogW10gfSk7XG5cbiAgICAgICAgICAgIC8vIG5vdyB3YWl0IHVudGlsIHRoZSBjaGlsZHJlbiBvYnNlcnZhYmxlIGNvbXBsZXRlc1xuICAgICAgICAgICAgY2hpbGRyZW4kLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGNoaWxkcmVuID0+IHtcblxuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG9ic2VydmFibGUgd2l0aCBhbiBhcnJheSBmb3IgZnV0dXJlIGxvYWRpbmdcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIHRoZSBub2RlIHRyZWVcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJvb3ROb2RlKHRoaXMuX3Jvb3QpO1xuXG4gICAgICAgICAgICAgICAgLy8gZW1pdCB0aGUgbGF0ZXN0IHZhbHVlXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGxvYWRpbmc6IGZhbHNlLCBjaGlsZHJlbiB9KTtcblxuICAgICAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBvYnNlcnZhYmxlIHN0cmVhbVxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgdGhlIHNpYmxpbmcgbm9kZXMsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdFxuICAgICAqIGEgbm9kZSBtYXkgYmUgYSByb290IG5vZGUgYW5kIG1heSBub3QgaGF2ZSBhIHBhcmVudC5cbiAgICAgKi9cbiAgICBnZXRTaWJsaW5ncyhub2RlOiBIaWVyYXJjaHlCYXJOb2RlKTogT2JzZXJ2YWJsZTxIaWVyYXJjaHlCYXJOb2RlQ2hpbGRyZW4+IHtcbiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50ID8gdGhpcy5nZXRDaGlsZHJlbihub2RlLnBhcmVudCkgOiBvZih7IGxvYWRpbmc6IGZhbHNlLCBjaGlsZHJlbjogW10gfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2VzIGFsbCB0aGUgcGFyZW50cyB0byBlbnN1cmUgdGhleSBhcmUgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBwcml2YXRlIHNlbGVjdChub2RlOiBIaWVyYXJjaHlCYXJOb2RlKTogdm9pZCB7XG4gICAgICAgIG5vZGUuc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Qobm9kZS5wYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIGFsbCBub2Rlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHRoZSBub2RlcyBpbiB0aGUgdHJlZSBhcyBhIGZsYXQgYXJyYXkuXG4gICAgICogSXQgYWxzbyBzdG9yZXMgdGhlIHBhcmVudCBub2RlIGluIGEgcGFyZW50IHByb3BlcnR5XG4gICAgICogb24gdGhlIG5vZGUgZm9yIGVhc3kgdHJhdmVyc2FsIGluIGJvdGggZGlyZWN0aW9uc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Tm9kZUxpc3Qobm9kZTogSGllcmFyY2h5QmFyTm9kZSk6IEhpZXJhcmNoeUJhck5vZGVbXSB7XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuIHRoZW4gcmV0dXJuIG9ubHkgaXRzZWxmXG4gICAgICAgIGlmICghbm9kZS5jaGlsZHJlbiB8fCBpc09ic2VydmFibGUobm9kZS5jaGlsZHJlbikgfHwgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbbm9kZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9yZSB0aGUgcGFyZW50IHByb3BlcnR5XG4gICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5wYXJlbnQgPSBub2RlKTtcblxuICAgICAgICAvLyBnZXQgYWxsIGRlc2NlbmRhbnRzIG9mIHRoaXMgbm9kZVxuICAgICAgICBjb25zdCBkZXNjZW5kYW50cyA9IG5vZGUuY2hpbGRyZW4ucmVkdWNlPEhpZXJhcmNoeUJhck5vZGVbXT4oKG5vZGVzLCBjdXJyZW50KSA9PiBbLi4ubm9kZXMsIC4uLnRoaXMuZ2V0Tm9kZUxpc3QoY3VycmVudCldLCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIFtub2RlLCAuLi5kZXNjZW5kYW50c107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgc2VsZWN0ZWQgbm9kZXMgZnJvbSB0aGUgcGFyZW50IG5vZGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTZWxlY3RlZENoaWxkcmVuKG5vZGU6IEhpZXJhcmNoeUJhck5vZGUpOiBIaWVyYXJjaHlCYXJOb2RlW10ge1xuXG4gICAgICAgIGlmIChpc09ic2VydmFibGUobm9kZS5jaGlsZHJlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBbbm9kZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuIC0gYW5kIGFjY291bnQgZm9yIHdoZW4gdGhlcmUgaXMgbm9uZVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4gfHwgW107XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYW55IGNoaWxkIGlzIHNlbGVjdGVkXG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uZmluZChfY2hpbGQgPT4gX2NoaWxkLnNlbGVjdGVkKTtcblxuICAgICAgICAvLyByZXR1cm4gdGhlIHJlbWFpbmluZyBjaGFpbiBvZiBzZWxlY3RlZCBpdGVtc1xuICAgICAgICByZXR1cm4gY2hpbGQgPyBbbm9kZSwgLi4udGhpcy5nZXRTZWxlY3RlZENoaWxkcmVuKGNoaWxkKV0gOiBbbm9kZV07XG4gICAgfVxufSJdfQ==