UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

111 lines 19.8 kB
import { FocusKeyManager } from '@angular/cdk/a11y'; import { Component, EventEmitter, HostBinding, inject, Input, Output, ViewChildren } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { FacetDeselect, FacetDeselectAll, FacetSelect } from '../facet-events'; import { FacetService } from '../facet.service'; import { FacetCheckListItemComponent } from './check-list-item/facet-check-list-item.component'; import * as i0 from "@angular/core"; import * as i1 from "../base/facet-header/facet-header.component"; import * as i2 from "./check-list-item/facet-check-list-item.component"; let uniqueId = 0; export class FacetCheckListComponent { /** This will allow you to define an initial set of selected facets. */ set selected(selection) { if (Array.isArray(selection)) { selection.forEach(facet => this.facetService.select(facet)); } } constructor() { this.facetService = inject(FacetService); this.id = `ux-facet-check-list-${uniqueId++}`; /** Defines the complete list of facets that can be selected. */ this.facets = []; /** If `false` the list will grow to display all possible facets. If `true` a scrollbar will appear to prevent the list from growing too large. */ this.scrollbar = true; /** Defines whether or not the checkboxes will appear in simplified form. */ this.simplified = false; /** Defines whether or not the Facet Check List should be initially expanded or not. */ this.expanded = true; /** * This will be triggered when a facet is selected, deselected or all facets are deselected. * The event will be an instance of either `FacetSelect`, `FacetDeselect` or `FacetDeselectAll` and * will contain the facet being selected or deselected in a `facet` property (deselect all will not contain affected facets). */ this.events = new Subject(); /** If two-way binding is used this array will get updated any time the selected facets change. */ this.selectedChange = new EventEmitter(); this.isFocused = false; this.activeIndex = 0; this._onDestroy = new Subject(); this.facetService.events$.pipe(takeUntil(this._onDestroy)).subscribe(event => { // deselect all events should always be emitted if (event instanceof FacetDeselectAll) { this.events.next(event); this.selectedChange.next([]); } // selection and deselection events should only be emitted when the facet belongs to this component if ((event instanceof FacetSelect || event instanceof FacetDeselect) && this.isOwnFacet(event.facet)) { this.events.next(event); this.selectedChange.next(this.getSelectedFacets()); } }); } ngAfterViewInit() { this._focusKeyManager = new FocusKeyManager(this.options) .withVerticalOrientation(); this._focusKeyManager.change.pipe(takeUntil(this._onDestroy)).subscribe(index => this.activeIndex = index); } ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } onFocus(index) { if (this._focusKeyManager.activeItemIndex === -1) { this._focusKeyManager.setActiveItem(index); } } onKeydown(event) { this._focusKeyManager.onKeydown(event); } toggleFacet(index, facet) { this.facetService.toggle(facet); this._focusKeyManager.setActiveItem(index); } getSelectedFacets() { return this.facetService.facets$.value.filter(facet => this.isOwnFacet(facet)); } isOwnFacet(facet) { return this.facets.indexOf(facet) !== -1; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FacetCheckListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: FacetCheckListComponent, selector: "ux-facet-check-list", inputs: { id: "id", selected: "selected", facets: "facets", header: "header", scrollbar: "scrollbar", simplified: "simplified", expanded: "expanded" }, outputs: { events: "events", selectedChange: "selectedChange" }, host: { properties: { "id": "this.id" } }, viewQueries: [{ propertyName: "options", predicate: FacetCheckListItemComponent, descendants: true }], ngImport: i0, template: "<ux-facet-header [header]=\"header\" [(expanded)]=\"expanded\"></ux-facet-header>\n\n<!-- Create a container which will show when section is expanded -->\n@if (expanded) {\n <div class=\"facet-check-list-container\"\n tabindex=\"-1\"\n role=\"listbox\"\n [class.facet-check-list-scrollbar]=\"scrollbar\"\n [class.facet-check-list-scrollbar-focused]=\"isFocused\"\n >\n <!-- Iterate through each possible facet -->\n @for (facet of facets; track facet; let index = $index) {\n <ux-facet-check-list-item\n [id]=\"id + '-check-list-item-' + index\"\n [facet]=\"facet\"\n [simplified]=\"simplified\"\n [tabbable]=\"activeIndex === index\"\n [selected]=\"facetService.isSelected(facet)\"\n (selectedChange)=\"toggleFacet(index, facet)\"\n (keydown)=\"onKeydown($event)\"\n (itemFocus)=\"isFocused = true; onFocus(index)\"\n (itemBlur)=\"isFocused = false\">\n </ux-facet-check-list-item>\n }\n </div>\n}", dependencies: [{ kind: "component", type: i1.FacetHeaderComponent, selector: "ux-facet-header", inputs: ["header", "canExpand", "expanded"], outputs: ["expandedChange"] }, { kind: "component", type: i2.FacetCheckListItemComponent, selector: "ux-facet-check-list-item", inputs: ["id", "facet", "selected", "tabbable", "simplified"], outputs: ["selectedChange", "itemFocus", "itemBlur"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FacetCheckListComponent, decorators: [{ type: Component, args: [{ selector: 'ux-facet-check-list', template: "<ux-facet-header [header]=\"header\" [(expanded)]=\"expanded\"></ux-facet-header>\n\n<!-- Create a container which will show when section is expanded -->\n@if (expanded) {\n <div class=\"facet-check-list-container\"\n tabindex=\"-1\"\n role=\"listbox\"\n [class.facet-check-list-scrollbar]=\"scrollbar\"\n [class.facet-check-list-scrollbar-focused]=\"isFocused\"\n >\n <!-- Iterate through each possible facet -->\n @for (facet of facets; track facet; let index = $index) {\n <ux-facet-check-list-item\n [id]=\"id + '-check-list-item-' + index\"\n [facet]=\"facet\"\n [simplified]=\"simplified\"\n [tabbable]=\"activeIndex === index\"\n [selected]=\"facetService.isSelected(facet)\"\n (selectedChange)=\"toggleFacet(index, facet)\"\n (keydown)=\"onKeydown($event)\"\n (itemFocus)=\"isFocused = true; onFocus(index)\"\n (itemBlur)=\"isFocused = false\">\n </ux-facet-check-list-item>\n }\n </div>\n}" }] }], ctorParameters: () => [], propDecorators: { id: [{ type: Input }, { type: HostBinding }], selected: [{ type: Input }], facets: [{ type: Input }], header: [{ type: Input }], scrollbar: [{ type: Input }], simplified: [{ type: Input }], expanded: [{ type: Input }], events: [{ type: Output }], selectedChange: [{ type: Output }], options: [{ type: ViewChildren, args: [FacetCheckListItemComponent] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXQtY2hlY2stbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mYWNldHMvZmFjZXQtY2hlY2stbGlzdC9mYWNldC1jaGVjay1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ZhY2V0cy9mYWNldC1jaGVjay1saXN0L2ZhY2V0LWNoZWNrLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9JLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQWMsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDOzs7O0FBRWhHLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQU1qQixNQUFNLE9BQU8sdUJBQXVCO0lBTWhDLHVFQUF1RTtJQUN2RSxJQUFhLFFBQVEsQ0FBQyxTQUFrQjtRQUNwQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMzQixTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENB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QUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFZO1FBQzNCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQzsrR0FqR1EsdUJBQXVCO21HQUF2Qix1QkFBdUIsMlZBc0NsQiwyQkFBMkIsZ0RDckQ3Qyx1K0JBeUJDOzs0RkRWWSx1QkFBdUI7a0JBSm5DLFNBQVM7K0JBQ0kscUJBQXFCO3dEQU8vQixFQUFFO3NCQURELEtBQUs7O3NCQUFJLFdBQVc7Z0JBSVIsUUFBUTtzQkFBcEIsS0FBSztnQkFPRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQU9JLE1BQU07c0JBQWYsTUFBTTtnQkFHRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVvQyxPQUFPO3NCQUFqRCxZQUFZO3VCQUFDLDJCQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzS2V5TWFuYWdlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGYWNldERlc2VsZWN0LCBGYWNldERlc2VsZWN0QWxsLCBGYWNldEV2ZW50LCBGYWNldFNlbGVjdCB9IGZyb20gJy4uL2ZhY2V0LWV2ZW50cyc7XG5pbXBvcnQgeyBGYWNldFNlcnZpY2UgfSBmcm9tICcuLi9mYWNldC5zZXJ2aWNlJztcbmltcG9ydCB7IEZhY2V0IH0gZnJvbSAnLi4vbW9kZWxzL2ZhY2V0JztcbmltcG9ydCB7IEZhY2V0Q2hlY2tMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY2hlY2stbGlzdC1pdGVtL2ZhY2V0LWNoZWNrLWxpc3QtaXRlbS5jb21wb25lbnQnO1xuXG5sZXQgdW5pcXVlSWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3V4LWZhY2V0LWNoZWNrLWxpc3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mYWNldC1jaGVjay1saXN0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBGYWNldENoZWNrTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgcmVhZG9ubHkgZmFjZXRTZXJ2aWNlID0gaW5qZWN0KEZhY2V0U2VydmljZSk7XG5cbiAgICBASW5wdXQoKSBASG9zdEJpbmRpbmcoKVxuICAgIGlkOiBzdHJpbmcgPSBgdXgtZmFjZXQtY2hlY2stbGlzdC0ke3VuaXF1ZUlkKyt9YDtcblxuICAgIC8qKiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIGRlZmluZSBhbiBpbml0aWFsIHNldCBvZiBzZWxlY3RlZCBmYWNldHMuICovXG4gICAgQElucHV0KCkgc2V0IHNlbGVjdGVkKHNlbGVjdGlvbjogRmFjZXRbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24uZm9yRWFjaChmYWNldCA9PiB0aGlzLmZhY2V0U2VydmljZS5zZWxlY3QoZmFjZXQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBEZWZpbmVzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGZhY2V0cyB0aGF0IGNhbiBiZSBzZWxlY3RlZC4gKi9cbiAgICBASW5wdXQoKSBmYWNldHM6IEZhY2V0W10gPSBbXTtcblxuICAgIC8qKiBEZWZpbmVzIHRoZSB0ZXh0IGRpc3BsYXllZCBhdCB0aGUgdG9wIG9mIHRoZSBGYWNldCBDaGVjayBMaXN0LiAqL1xuICAgIEBJbnB1dCgpIGhlYWRlcjogc3RyaW5nO1xuXG4gICAgLyoqIElmIGBmYWxzZWAgdGhlIGxpc3Qgd2lsbCBncm93IHRvIGRpc3BsYXkgYWxsIHBvc3NpYmxlIGZhY2V0cy4gSWYgYHRydWVgIGEgc2Nyb2xsYmFyIHdpbGwgYXBwZWFyIHRvIHByZXZlbnQgdGhlIGxpc3QgZnJvbSBncm93aW5nIHRvbyBsYXJnZS4gKi9cbiAgICBASW5wdXQoKSBzY3JvbGxiYXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIERlZmluZXMgd2hldGhlciBvciBub3QgdGhlIGNoZWNrYm94ZXMgd2lsbCBhcHBlYXIgaW4gc2ltcGxpZmllZCBmb3JtLiAqL1xuICAgIEBJbnB1dCgpIHNpbXBsaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBEZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBGYWNldCBDaGVjayBMaXN0IHNob3VsZCBiZSBpbml0aWFsbHkgZXhwYW5kZWQgb3Igbm90LiAqL1xuICAgIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBhIGZhY2V0IGlzIHNlbGVjdGVkLCBkZXNlbGVjdGVkIG9yIGFsbCBmYWNldHMgYXJlIGRlc2VsZWN0ZWQuXG4gICAgICogVGhlIGV2ZW50IHdpbGwgYmUgYW4gaW5zdGFuY2Ugb2YgZWl0aGVyIGBGYWNldFNlbGVjdGAsIGBGYWNldERlc2VsZWN0YCBvciBgRmFjZXREZXNlbGVjdEFsbGAgYW5kXG4gICAgICogd2lsbCBjb250YWluIHRoZSBmYWNldCBiZWluZyBzZWxlY3RlZCBvciBkZXNlbGVjdGVkIGluIGEgYGZhY2V0YCBwcm9wZXJ0eSAoZGVzZWxlY3QgYWxsIHdpbGwgbm90IGNvbnRhaW4gYWZmZWN0ZWQgZmFjZXRzKS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZXZlbnRzOiBTdWJqZWN0PEZhY2V0RXZlbnQ+ID0gbmV3IFN1YmplY3Q8RmFjZXRFdmVudD4oKTtcblxuICAgIC8qKiBJZiB0d28td2F5IGJpbmRpbmcgaXMgdXNlZCB0aGlzIGFycmF5IHdpbGwgZ2V0IHVwZGF0ZWQgYW55IHRpbWUgdGhlIHNlbGVjdGVkIGZhY2V0cyBjaGFuZ2UuICovXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RmFjZXRbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZhY2V0W10+KCk7XG5cbiAgICBAVmlld0NoaWxkcmVuKEZhY2V0Q2hlY2tMaXN0SXRlbUNvbXBvbmVudCkgb3B0aW9uczogUXVlcnlMaXN0PEZhY2V0Q2hlY2tMaXN0SXRlbUNvbXBvbmVudD47XG5cbiAgICBpc0ZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBhY3RpdmVJbmRleDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSBfZm9jdXNLZXlNYW5hZ2VyOiBGb2N1c0tleU1hbmFnZXI8RmFjZXRDaGVja0xpc3RJdGVtQ29tcG9uZW50PjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgICAgIHRoaXMuZmFjZXRTZXJ2aWNlLmV2ZW50cyQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcblxuICAgICAgICAgICAgLy8gZGVzZWxlY3QgYWxsIGV2ZW50cyBzaG91bGQgYWx3YXlzIGJlIGVtaXR0ZWRcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEZhY2V0RGVzZWxlY3RBbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5uZXh0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLm5leHQoW10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gYW5kIGRlc2VsZWN0aW9uIGV2ZW50cyBzaG91bGQgb25seSBiZSBlbWl0dGVkIHdoZW4gdGhlIGZhY2V0IGJlbG9uZ3MgdG8gdGhpcyBjb21wb25lbnRcbiAgICAgICAgICAgIGlmICgoZXZlbnQgaW5zdGFuY2VvZiBGYWNldFNlbGVjdCB8fCBldmVudCBpbnN0YW5jZW9mIEZhY2V0RGVzZWxlY3QpICYmIHRoaXMuaXNPd25GYWNldChldmVudC5mYWNldCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5uZXh0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLm5leHQodGhpcy5nZXRTZWxlY3RlZEZhY2V0cygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c0tleU1hbmFnZXIgPSBuZXcgRm9jdXNLZXlNYW5hZ2VyKHRoaXMub3B0aW9ucylcbiAgICAgICAgICAgIC53aXRoVmVydGljYWxPcmllbnRhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuX2ZvY3VzS2V5TWFuYWdlci5jaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSkuc3Vic2NyaWJlKGluZGV4ID0+IHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9uRm9jdXMoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fZm9jdXNLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzS2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c0tleU1hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICB0b2dnbGVGYWNldChpbmRleDogbnVtYmVyLCBmYWNldDogRmFjZXQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mYWNldFNlcnZpY2UudG9nZ2xlKGZhY2V0KTtcbiAgICAgICAgdGhpcy5fZm9jdXNLZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oaW5kZXgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VsZWN0ZWRGYWNldHMoKTogRmFjZXRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhY2V0U2VydmljZS5mYWNldHMkLnZhbHVlLmZpbHRlcihmYWNldCA9PiB0aGlzLmlzT3duRmFjZXQoZmFjZXQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzT3duRmFjZXQoZmFjZXQ6IEZhY2V0KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5pbmRleE9mKGZhY2V0KSAhPT0gLTE7XG4gICAgfVxufVxuIiwiPHV4LWZhY2V0LWhlYWRlciBbaGVhZGVyXT1cImhlYWRlclwiIFsoZXhwYW5kZWQpXT1cImV4cGFuZGVkXCI+PC91eC1mYWNldC1oZWFkZXI+XG5cbjwhLS0gQ3JlYXRlIGEgY29udGFpbmVyIHdoaWNoIHdpbGwgc2hvdyB3aGVuIHNlY3Rpb24gaXMgZXhwYW5kZWQgLS0+XG5AaWYgKGV4cGFuZGVkKSB7XG4gIDxkaXYgY2xhc3M9XCJmYWNldC1jaGVjay1saXN0LWNvbnRhaW5lclwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gICAgcm9sZT1cImxpc3Rib3hcIlxuICAgIFtjbGFzcy5mYWNldC1jaGVjay1saXN0LXNjcm9sbGJhcl09XCJzY3JvbGxiYXJcIlxuICAgIFtjbGFzcy5mYWNldC1jaGVjay1saXN0LXNjcm9sbGJhci1mb2N1c2VkXT1cImlzRm9jdXNlZFwiXG4gICAgPlxuICAgIDwhLS0gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcG9zc2libGUgZmFjZXQgLS0+XG4gICAgQGZvciAoZmFjZXQgb2YgZmFjZXRzOyB0cmFjayBmYWNldDsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICA8dXgtZmFjZXQtY2hlY2stbGlzdC1pdGVtXG4gICAgICAgIFtpZF09XCJpZCArICctY2hlY2stbGlzdC1pdGVtLScgKyBpbmRleFwiXG4gICAgICAgIFtmYWNldF09XCJmYWNldFwiXG4gICAgICAgIFtzaW1wbGlmaWVkXT1cInNpbXBsaWZpZWRcIlxuICAgICAgICBbdGFiYmFibGVdPVwiYWN0aXZlSW5kZXggPT09IGluZGV4XCJcbiAgICAgICAgW3NlbGVjdGVkXT1cImZhY2V0U2VydmljZS5pc1NlbGVjdGVkKGZhY2V0KVwiXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJ0b2dnbGVGYWNldChpbmRleCwgZmFjZXQpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudClcIlxuICAgICAgICAoaXRlbUZvY3VzKT1cImlzRm9jdXNlZCA9IHRydWU7IG9uRm9jdXMoaW5kZXgpXCJcbiAgICAgICAgKGl0ZW1CbHVyKT1cImlzRm9jdXNlZCA9IGZhbHNlXCI+XG4gICAgICA8L3V4LWZhY2V0LWNoZWNrLWxpc3QtaXRlbT5cbiAgICB9XG4gIDwvZGl2PlxufSJdfQ==