UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

261 lines 33.2 kB
/** * Copyright (c) 2025 Visa, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { ChangeDetectorRef, ContentChildren, Directive, EventEmitter, HostBinding, Input, Optional, Output, QueryList } from '@angular/core'; import { FlexDirective } from '../flex/flex.directive'; import { AccordionHeadingDirective } from '../accordion-heading/accordion-heading.directive'; import { AccordionDetailsDirective } from '../accordion-item/accordion-item.directive'; import { AccordionPanelDirective } from '../accordion-panel/accordion-panel.directive'; import { ButtonColor } from '../button/button.constants'; import { WizardDirective } from '../wizard/wizard.directive'; import { AccordionService } from './accordion.service'; import { UUIDService } from '../_utilities/services/uuid.service'; import * as i0 from "@angular/core"; import * as i1 from "./accordion.service"; import * as i2 from "../_utilities/services/uuid.service"; import * as i3 from "../flex/flex.directive"; import * as i4 from "../wizard/wizard.directive"; export class AccordionDirective { /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-accordion */ get class() { return [ this._class, this.accordionItems.length <= 0 && !this.wizard ? 'v-accordion' : '', !this._removeDefaultFlex && this.accordionItems.length > 0 ? 'v-flex v-flex-col' : '', !this._removeDefaultGap && this.accordionItems.length > 0 ? 'v-gap-6' : '' ].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } /** * Allows multiple accordion items to be expanded when true. * @default false */ get multiselect() { return this._multiselect; } set multiselect(value) { this._multiselect = coerceBooleanProperty(value); } /** * Applies subtle accordion styling when true. * @default false */ get subtle() { return this._subtle; } set subtle(value) { this._subtle = coerceBooleanProperty(value); this.setAsSubtle(); } constructor(accordionService, cdRef, uuidService, flex, wizard) { this.accordionService = accordionService; this.cdRef = cdRef; this.uuidService = uuidService; this.flex = flex; this.wizard = wizard; this.buttonClickedSubscriptions = []; this._removeDefaultFlex = false; this._removeDefaultGap = false; this._class = ''; this._multiselect = false; this._subtle = false; /** * Emits indexes of expanded items when an accordion item is toggled. */ this.itemsChanged = new EventEmitter(); /** variable that maintains the array of indexes of expanded items */ this.itemsExpanded = []; } ngAfterContentInit() { if (!this.accordionItems.length) this.accordionService.setUpAccordion(this); this.cdRef.detectChanges(); // detect changes made to component within setUpAccordion this.setAsSubtle(); // remove default flex and gap if user has set their own this._removeDefaultFlex = this.flex && this.flex.vFlexRow; this._removeDefaultGap = this.flex && this.flex.vGap; if (this.accordionItems) { if (this.accordionItems.length > 0) { this.setUpAccordionItems(); } this.accordionItems.changes.subscribe(() => { this.setUpAccordionItems(); }); } if (this.headings) { // custom accessible markup this.setUpHeadings(); this.headings.changes.subscribe(() => { this.accordionItemsChanged(); }); } if (this.panels) { this.panels.changes.subscribe(() => { this.accordionItemsChanged(); }); } } setUpAccordionItems() { const singleSelectName = this.uuidService.getUUID('accordion-details-'); // detail/summary markup this.accordionItems.toArray().forEach((item, index) => { if (item.expanded) this.itemsExpanded.push(index); if (!this.multiselect && item.heading.hostButton) { item.name = singleSelectName; // a new item is clicked in a non-multiselect item.heading.hostButton.clicked.subscribe(() => { if (item.expanded) { // clear all expanded items if an expanded item is clicked (it's closing) this.itemsExpanded = []; return; } this.itemsExpanded = [index]; }); } else if (this.multiselect) { item.toggled.subscribe((expanded) => { this.handleToggle(index, expanded, true); }); } }); } setUpHeadings() { // prioritize the accordion items (native details/summary behavior) if they are present if (this.accordionItems.length > 0) return; // loop through the headings this.headings.toArray().forEach((heading) => { // subscribe to clicks and programmatic toggles if (heading.hostButton) { this.buttonSubscribe(heading.hostButton, heading._index); } else if (heading._buttonHeading) { this.buttonSubscribe(heading._buttonHeading, heading._index); } if (heading.expanded) this.itemsExpanded.push(heading._index); // subscribe to changes in heading.expanded heading.toggled.subscribe((index) => { this.handleToggle(index, heading.expanded, false); }); }); } setAsSubtle() { if (this.headings) { this.headings.toArray().forEach((heading) => { heading._subtle.set(this.subtle); if (this.subtle) { const button = heading._buttonHeading || heading.hostButton; if (!button._buttonColorSetByUser) button.buttonColor = ButtonColor.TERTIARY; } }); } if (this.panels) { this.panels.toArray().forEach((panel) => { panel._subtle.set(this.subtle); }); } } buttonSubscribe(button, index) { this.buttonClickedSubscriptions[index] = button.clicked.subscribe(() => { this.accordionService.toggleItem(index); }); } accordionItemsChanged() { // when accordion items change we need to recreate the accordion and service if (this.headings.length !== this.panels.length) return; // accordion hasn't been fully changed yet, waiting on matching heading or panel // reset this.buttonClickedSubscriptions.forEach((subscription) => { subscription.unsubscribe(); }); this.buttonClickedSubscriptions = []; this.accordionService.setUpAccordion(this); this.setAsSubtle(); if (this.headings) this.setUpHeadings(); this.cdRef.detectChanges(); } handleToggle(index, expanded, isDetails) { const _prevItemsExpanded = this.itemsExpanded; if (expanded) { if (!isDetails) this.accordionService.expandItem(index); if (!this.multiselect) { const prevExpanded = this.itemsExpanded[0]; const arr = this.accordionItems.length > 0 ? this.accordionItems.toArray() : this.headings.toArray(); if (prevExpanded >= 0 && prevExpanded !== index) arr[prevExpanded].expanded = false; this.itemsExpanded = [index]; } else if (!this.itemsExpanded.includes(index)) this.itemsExpanded.push(index); } else { if (!isDetails) this.accordionService.collapseItem(index); this.itemsExpanded.filter((item) => item !== index); } if (this.itemsExpanded !== _prevItemsExpanded) this.itemsChanged.emit(this.itemsExpanded); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionDirective, deps: [{ token: i1.AccordionService }, { token: i0.ChangeDetectorRef }, { token: i2.UUIDService }, { token: i3.FlexDirective, optional: true }, { token: i4.WizardDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AccordionDirective, isStandalone: true, selector: "[v-accordion]", inputs: { class: "class", multiselect: "multiselect", subtle: "subtle" }, outputs: { itemsChanged: "itemsChanged" }, host: { properties: { "class": "this.hostClass" } }, providers: [AccordionService], queries: [{ propertyName: "headings", predicate: AccordionHeadingDirective, descendants: true }, { propertyName: "panels", predicate: AccordionPanelDirective, descendants: true }, { propertyName: "accordionItems", predicate: AccordionDetailsDirective, descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[v-accordion]', providers: [AccordionService] }] }], ctorParameters: () => [{ type: i1.AccordionService }, { type: i0.ChangeDetectorRef }, { type: i2.UUIDService }, { type: i3.FlexDirective, decorators: [{ type: Optional }] }, { type: i4.WizardDirective, decorators: [{ type: Optional }] }], propDecorators: { headings: [{ type: ContentChildren, args: [AccordionHeadingDirective, { descendants: true }] }], panels: [{ type: ContentChildren, args: [AccordionPanelDirective, { descendants: true }] }], accordionItems: [{ type: ContentChildren, args: [AccordionDetailsDirective, { descendants: true }] }], class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], multiselect: [{ type: Input }], subtle: [{ type: Input }], itemsChanged: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9hY2NvcmRpb24vYWNjb3JkaW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7O0FBT2xFLE1BQU0sT0FBTyxrQkFBa0I7SUFXN0I7OztPQUdHO0lBQ0gsSUFDSSxLQUFLO1FBQ1AsT0FBTztZQUNMLElBQUksQ0FBQyxNQUFNO1lBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDckYsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDM0UsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLEtBQW1CO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUdEOzs7T0FHRztJQUNILElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsS0FBbUI7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQVdELFlBQ1UsZ0JBQWtDLEVBQ2xDLEtBQXdCLEVBQ3hCLFdBQXdCLEVBQ1osSUFBb0IsRUFDcEIsTUFBd0I7UUFKcEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNaLFNBQUksR0FBSixJQUFJLENBQWdCO1FBQ3BCLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBcEU5QywrQkFBMEIsR0FBVSxFQUFFLENBQUM7UUFHdkMsdUJBQWtCLEdBQXdCLEtBQUssQ0FBQztRQUNoRCxzQkFBaUIsR0FBcUMsS0FBSyxDQUFDO1FBa0I1RCxXQUFNLEdBQVcsRUFBRSxDQUFDO1FBaUJwQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQWM5QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBRXpCOztXQUVHO1FBQ08saUJBQVksR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRXRELHFFQUFxRTtRQUNyRSxrQkFBYSxHQUFrQixFQUFFLENBQUM7SUFRL0IsQ0FBQztJQUVKLGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMseURBQXlEO1FBQ3JGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQix3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFckQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLDJCQUEyQjtZQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDakMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEUsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3BELElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztnQkFDN0IsNkNBQTZDO2dCQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDN0MsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ2xCLHlFQUF5RTt3QkFDekUsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7d0JBQ3hCLE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxhQUFhO1FBQ1gsdUZBQXVGO1FBQ3ZGLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFDM0MsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDMUMsK0NBQStDO1lBQy9DLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNELENBQUM7aUJBQU0sSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTlELDJDQUEyQztZQUMzQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUI7d0JBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO2dCQUMvRSxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDdEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsTUFBdUIsRUFBRSxLQUFhO1FBQ3BELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDckUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsNEVBQTRFO1FBQzVFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLGdGQUFnRjtRQUV6SSxRQUFRO1FBQ1IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3ZELFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQywwQkFBMEIsR0FBRyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBYSxFQUFFLFFBQWlCLEVBQUUsU0FBa0I7UUFDL0QsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsU0FBUztnQkFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckcsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLFlBQVksS0FBSyxLQUFLO29CQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUNwRixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVM7Z0JBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssa0JBQWtCO1lBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVGLENBQUM7K0dBL01VLGtCQUFrQjttR0FBbEIsa0JBQWtCLHNPQUZsQixDQUFDLGdCQUFnQixDQUFDLG1EQUdaLHlCQUF5Qiw0REFFekIsdUJBQXVCLG9FQUd2Qix5QkFBeUI7OzRGQU4vQixrQkFBa0I7a0JBTDlCLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxlQUFlO29CQUN6QixTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDOUI7OzBCQXlFSSxRQUFROzswQkFDUixRQUFRO3lDQXZFWCxRQUFRO3NCQURQLGVBQWU7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUdqRSxNQUFNO3NCQURMLGVBQWU7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUkvRCxjQUFjO3NCQURiLGVBQWU7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQVU3RCxLQUFLO3NCQURSLEtBQUs7Z0JBY0YsU0FBUztzQkFEWixXQUFXO3VCQUFDLE9BQU87Z0JBVWhCLFdBQVc7c0JBRGQsS0FBSztnQkFjRixNQUFNO3NCQURULEtBQUs7Z0JBYUksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAyNSBWaXNhLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbGV4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZmxleC9mbGV4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25IZWFkaW5nRGlyZWN0aXZlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLWhlYWRpbmcvYWNjb3JkaW9uLWhlYWRpbmcuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY29yZGlvbkRldGFpbHNEaXJlY3RpdmUgfSBmcm9tICcuLi9hY2NvcmRpb24taXRlbS9hY2NvcmRpb24taXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWNjb3JkaW9uUGFuZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9hY2NvcmRpb24tcGFuZWwvYWNjb3JkaW9uLXBhbmVsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCdXR0b25Db2xvciB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29uc3RhbnRzJztcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IFdpemFyZERpcmVjdGl2ZSB9IGZyb20gJy4uL3dpemFyZC93aXphcmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY29yZGlvblNlcnZpY2UgfSBmcm9tICcuL2FjY29yZGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFVVSURTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbdi1hY2NvcmRpb25dJyxcbiAgcHJvdmlkZXJzOiBbQWNjb3JkaW9uU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgQWNjb3JkaW9uRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGRyZW4oQWNjb3JkaW9uSGVhZGluZ0RpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBoZWFkaW5nczogUXVlcnlMaXN0PEFjY29yZGlvbkhlYWRpbmdEaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkcmVuKEFjY29yZGlvblBhbmVsRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHBhbmVsczogUXVlcnlMaXN0PEFjY29yZGlvblBhbmVsRGlyZWN0aXZlPjtcbiAgYnV0dG9uQ2xpY2tlZFN1YnNjcmlwdGlvbnM6IGFueVtdID0gW107XG4gIEBDb250ZW50Q2hpbGRyZW4oQWNjb3JkaW9uRGV0YWlsc0RpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBhY2NvcmRpb25JdGVtczogUXVlcnlMaXN0PEFjY29yZGlvbkRldGFpbHNEaXJlY3RpdmU+O1xuICBfcmVtb3ZlRGVmYXVsdEZsZXg6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcbiAgX3JlbW92ZURlZmF1bHRHYXA6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsIHwgYW55ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGN1c3RvbSBjbGFzcyYjNDA7ZXMmIzQxOyBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBkZWZhdWx0IC52LWFjY29yZGlvblxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX2NsYXNzLFxuICAgICAgdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPD0gMCAmJiAhdGhpcy53aXphcmQgPyAndi1hY2NvcmRpb24nIDogJycsXG4gICAgICAhdGhpcy5fcmVtb3ZlRGVmYXVsdEZsZXggJiYgdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwID8gJ3YtZmxleCB2LWZsZXgtY29sJyA6ICcnLFxuICAgICAgIXRoaXMuX3JlbW92ZURlZmF1bHRHYXAgJiYgdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwID8gJ3YtZ2FwLTYnIDogJydcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NsYXNzID0gdmFsdWU7XG4gIH1cbiAgX2NsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgbXVsdGlwbGUgYWNjb3JkaW9uIGl0ZW1zIHRvIGJlIGV4cGFuZGVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBtdWx0aXNlbGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlzZWxlY3Q7XG4gIH1cbiAgc2V0IG11bHRpc2VsZWN0KHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9tdWx0aXNlbGVjdCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX211bHRpc2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgc3VidGxlIGFjY29yZGlvbiBzdHlsaW5nIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBzdWJ0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnRsZTtcbiAgfVxuICBzZXQgc3VidGxlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9zdWJ0bGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuc2V0QXNTdWJ0bGUoKTtcbiAgfVxuICBfc3VidGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGluZGV4ZXMgb2YgZXhwYW5kZWQgaXRlbXMgd2hlbiBhbiBhY2NvcmRpb24gaXRlbSBpcyB0b2dnbGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyW10+KCk7XG5cbiAgLyoqIHZhcmlhYmxlIHRoYXQgbWFpbnRhaW5zIHRoZSBhcnJheSBvZiBpbmRleGVzIG9mIGV4cGFuZGVkIGl0ZW1zICovXG4gIGl0ZW1zRXhwYW5kZWQ6IEFycmF5PG51bWJlcj4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFjY29yZGlvblNlcnZpY2U6IEFjY29yZGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB1dWlkU2VydmljZTogVVVJRFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmbGV4PzogRmxleERpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHdpemFyZD86IFdpemFyZERpcmVjdGl2ZVxuICApIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGgpIHRoaXMuYWNjb3JkaW9uU2VydmljZS5zZXRVcEFjY29yZGlvbih0aGlzKTtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTsgLy8gZGV0ZWN0IGNoYW5nZXMgbWFkZSB0byBjb21wb25lbnQgd2l0aGluIHNldFVwQWNjb3JkaW9uXG4gICAgdGhpcy5zZXRBc1N1YnRsZSgpO1xuXG4gICAgLy8gcmVtb3ZlIGRlZmF1bHQgZmxleCBhbmQgZ2FwIGlmIHVzZXIgaGFzIHNldCB0aGVpciBvd25cbiAgICB0aGlzLl9yZW1vdmVEZWZhdWx0RmxleCA9IHRoaXMuZmxleCAmJiB0aGlzLmZsZXgudkZsZXhSb3c7XG4gICAgdGhpcy5fcmVtb3ZlRGVmYXVsdEdhcCA9IHRoaXMuZmxleCAmJiB0aGlzLmZsZXgudkdhcDtcblxuICAgIGlmICh0aGlzLmFjY29yZGlvbkl0ZW1zKSB7XG4gICAgICBpZiAodGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2V0VXBBY2NvcmRpb25JdGVtcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5hY2NvcmRpb25JdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0VXBBY2NvcmRpb25JdGVtcygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGVhZGluZ3MpIHtcbiAgICAgIC8vIGN1c3RvbSBhY2Nlc3NpYmxlIG1hcmt1cFxuICAgICAgdGhpcy5zZXRVcEhlYWRpbmdzKCk7XG5cbiAgICAgIHRoaXMuaGVhZGluZ3MuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFjY29yZGlvbkl0ZW1zQ2hhbmdlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFuZWxzKSB7XG4gICAgICB0aGlzLnBhbmVscy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWNjb3JkaW9uSXRlbXNDaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZXRVcEFjY29yZGlvbkl0ZW1zKCkge1xuICAgIGNvbnN0IHNpbmdsZVNlbGVjdE5hbWUgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ2FjY29yZGlvbi1kZXRhaWxzLScpO1xuICAgIC8vIGRldGFpbC9zdW1tYXJ5IG1hcmt1cFxuICAgIHRoaXMuYWNjb3JkaW9uSXRlbXMudG9BcnJheSgpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCkgdGhpcy5pdGVtc0V4cGFuZGVkLnB1c2goaW5kZXgpO1xuICAgICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0ICYmIGl0ZW0uaGVhZGluZy5ob3N0QnV0dG9uKSB7XG4gICAgICAgIGl0ZW0ubmFtZSA9IHNpbmdsZVNlbGVjdE5hbWU7XG4gICAgICAgIC8vIGEgbmV3IGl0ZW0gaXMgY2xpY2tlZCBpbiBhIG5vbi1tdWx0aXNlbGVjdFxuICAgICAgICBpdGVtLmhlYWRpbmcuaG9zdEJ1dHRvbi5jbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0uZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBleHBhbmRlZCBpdGVtcyBpZiBhbiBleHBhbmRlZCBpdGVtIGlzIGNsaWNrZWQgKGl0J3MgY2xvc2luZylcbiAgICAgICAgICAgIHRoaXMuaXRlbXNFeHBhbmRlZCA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLml0ZW1zRXhwYW5kZWQgPSBbaW5kZXhdO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICBpdGVtLnRvZ2dsZWQuc3Vic2NyaWJlKChleHBhbmRlZCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlVG9nZ2xlKGluZGV4LCBleHBhbmRlZCwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0VXBIZWFkaW5ncygpIHtcbiAgICAvLyBwcmlvcml0aXplIHRoZSBhY2NvcmRpb24gaXRlbXMgKG5hdGl2ZSBkZXRhaWxzL3N1bW1hcnkgYmVoYXZpb3IpIGlmIHRoZXkgYXJlIHByZXNlbnRcbiAgICBpZiAodGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBoZWFkaW5nc1xuICAgIHRoaXMuaGVhZGluZ3MudG9BcnJheSgpLmZvckVhY2goKGhlYWRpbmcpID0+IHtcbiAgICAgIC8vIHN1YnNjcmliZSB0byBjbGlja3MgYW5kIHByb2dyYW1tYXRpYyB0b2dnbGVzXG4gICAgICBpZiAoaGVhZGluZy5ob3N0QnV0dG9uKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uU3Vic2NyaWJlKGhlYWRpbmcuaG9zdEJ1dHRvbiwgaGVhZGluZy5faW5kZXgpO1xuICAgICAgfSBlbHNlIGlmIChoZWFkaW5nLl9idXR0b25IZWFkaW5nKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uU3Vic2NyaWJlKGhlYWRpbmcuX2J1dHRvbkhlYWRpbmcsIGhlYWRpbmcuX2luZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkaW5nLmV4cGFuZGVkKSB0aGlzLml0ZW1zRXhwYW5kZWQucHVzaChoZWFkaW5nLl9pbmRleCk7XG5cbiAgICAgIC8vIHN1YnNjcmliZSB0byBjaGFuZ2VzIGluIGhlYWRpbmcuZXhwYW5kZWRcbiAgICAgIGhlYWRpbmcudG9nZ2xlZC5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlVG9nZ2xlKGluZGV4LCBoZWFkaW5nLmV4cGFuZGVkLCBmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldEFzU3VidGxlKCkge1xuICAgIGlmICh0aGlzLmhlYWRpbmdzKSB7XG4gICAgICB0aGlzLmhlYWRpbmdzLnRvQXJyYXkoKS5mb3JFYWNoKChoZWFkaW5nKSA9PiB7XG4gICAgICAgIGhlYWRpbmcuX3N1YnRsZS5zZXQodGhpcy5zdWJ0bGUpO1xuICAgICAgICBpZiAodGhpcy5zdWJ0bGUpIHtcbiAgICAgICAgICBjb25zdCBidXR0b24gPSBoZWFkaW5nLl9idXR0b25IZWFkaW5nIHx8IGhlYWRpbmcuaG9zdEJ1dHRvbjtcbiAgICAgICAgICBpZiAoIWJ1dHRvbi5fYnV0dG9uQ29sb3JTZXRCeVVzZXIpIGJ1dHRvbi5idXR0b25Db2xvciA9IEJ1dHRvbkNvbG9yLlRFUlRJQVJZO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFuZWxzKSB7XG4gICAgICB0aGlzLnBhbmVscy50b0FycmF5KCkuZm9yRWFjaCgocGFuZWwpID0+IHtcbiAgICAgICAgcGFuZWwuX3N1YnRsZS5zZXQodGhpcy5zdWJ0bGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYnV0dG9uU3Vic2NyaWJlKGJ1dHRvbjogQnV0dG9uRGlyZWN0aXZlLCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5idXR0b25DbGlja2VkU3Vic2NyaXB0aW9uc1tpbmRleF0gPSBidXR0b24uY2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLnRvZ2dsZUl0ZW0oaW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgYWNjb3JkaW9uSXRlbXNDaGFuZ2VkKCkge1xuICAgIC8vIHdoZW4gYWNjb3JkaW9uIGl0ZW1zIGNoYW5nZSB3ZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBhY2NvcmRpb24gYW5kIHNlcnZpY2VcbiAgICBpZiAodGhpcy5oZWFkaW5ncy5sZW5ndGggIT09IHRoaXMucGFuZWxzLmxlbmd0aCkgcmV0dXJuOyAvLyBhY2NvcmRpb24gaGFzbid0IGJlZW4gZnVsbHkgY2hhbmdlZCB5ZXQsIHdhaXRpbmcgb24gbWF0Y2hpbmcgaGVhZGluZyBvciBwYW5lbFxuXG4gICAgLy8gcmVzZXRcbiAgICB0aGlzLmJ1dHRvbkNsaWNrZWRTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YnNjcmlwdGlvbikgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5idXR0b25DbGlja2VkU3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIHRoaXMuYWNjb3JkaW9uU2VydmljZS5zZXRVcEFjY29yZGlvbih0aGlzKTtcbiAgICB0aGlzLnNldEFzU3VidGxlKCk7XG4gICAgaWYgKHRoaXMuaGVhZGluZ3MpIHRoaXMuc2V0VXBIZWFkaW5ncygpO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgaGFuZGxlVG9nZ2xlKGluZGV4OiBudW1iZXIsIGV4cGFuZGVkOiBib29sZWFuLCBpc0RldGFpbHM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBfcHJldkl0ZW1zRXhwYW5kZWQgPSB0aGlzLml0ZW1zRXhwYW5kZWQ7XG4gICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICBpZiAoIWlzRGV0YWlscykgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLmV4cGFuZEl0ZW0oaW5kZXgpO1xuICAgICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IHByZXZFeHBhbmRlZCA9IHRoaXMuaXRlbXNFeHBhbmRlZFswXTtcbiAgICAgICAgY29uc3QgYXJyID0gdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwID8gdGhpcy5hY2NvcmRpb25JdGVtcy50b0FycmF5KCkgOiB0aGlzLmhlYWRpbmdzLnRvQXJyYXkoKTtcbiAgICAgICAgaWYgKHByZXZFeHBhbmRlZCA+PSAwICYmIHByZXZFeHBhbmRlZCAhPT0gaW5kZXgpIGFycltwcmV2RXhwYW5kZWRdLmV4cGFuZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXRlbXNFeHBhbmRlZCA9IFtpbmRleF07XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLml0ZW1zRXhwYW5kZWQuaW5jbHVkZXMoaW5kZXgpKSB0aGlzLml0ZW1zRXhwYW5kZWQucHVzaChpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNEZXRhaWxzKSB0aGlzLmFjY29yZGlvblNlcnZpY2UuY29sbGFwc2VJdGVtKGluZGV4KTtcbiAgICAgIHRoaXMuaXRlbXNFeHBhbmRlZC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IGluZGV4KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXRlbXNFeHBhbmRlZCAhPT0gX3ByZXZJdGVtc0V4cGFuZGVkKSB0aGlzLml0ZW1zQ2hhbmdlZC5lbWl0KHRoaXMuaXRlbXNFeHBhbmRlZCk7XG4gIH1cbn1cbiJdfQ==