@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
157 lines • 24.1 kB
JavaScript
/**
* 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 { Injectable } from '@angular/core';
import { UUIDService } from '../_utilities/services/uuid.service';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/uuid.service";
/**
* AccordionService is an internal service used to create accordion behavior and is used within the accordion component.
*/
export class AccordionService {
constructor(uuidService) {
this.uuidService = uuidService;
/** @ignore */
this.items = [];
}
/**
* The setUpAccordion method sets up the accordion by pairing accordion headings with their respective panels and having them reflect the same expanded state.
* @param accordion Accordion to set up.
* @returns void
*/
setUpAccordion(accordion) {
this.items = []; // reset items array
// provide service with necessary Directives
this.accordion = accordion;
this.headings = accordion.headings.toArray();
this.panels = accordion.panels.toArray();
// return or warn for edge cases of no or mismatched headings + panels
if (this.headings.length === 0 || this.panels.length === 0)
return;
if (this.headings.length !== this.panels.length) {
console.warn(`
The number of accordion headings and panels are not equal.
Behavior may be off as a result.
Please ensure each heading has a matching panel.
`);
}
this.headings.forEach((heading, index) => {
// set index at heading level.
heading._index = index;
/**
* Each item requires a controlling button
* This will either be an [v-button][v-accordion-heading] or a child button of an accordion-heading
*/
let buttonHeading = heading.hostButton
? heading.hostButton
: heading._buttonHeading
? heading._buttonHeading
: undefined;
// create array of items with each controlling button and respective panel
if (this.panels[index] && buttonHeading) {
this.items.push({ heading: heading, button: buttonHeading, panel: this.panels[index] });
this.setUpPanel(index, heading.expanded);
this.setUpButton(buttonHeading, index, heading.expanded);
}
});
}
/**
* The setUpPanel method configures a panel with index, expanded state, and assigns an id if not provided.
* @param index Index of panel to set up.
* @param expanded Expanded state of panel's associated accordion item.
*/
setUpPanel(index, expanded) {
// aligns panel index and expanded to associated heading
this.panels[index]._index = index;
this.panels[index]._expanded = expanded;
this.panels[index].id = this.panels[index].id
? this.panels[index].id
: this.uuidService.getUUID('v-accordion-panel-');
}
/**
* The setUpButton method configures a button with id, aria-controls, aria-expanded attributes, and the appropriate toggle icon.
* @param buttonHeading Button to set up.
* @param index Index of button to set up.
* @param expanded Expanded state of button's associated accordion item.
*/
setUpButton(buttonHeading, index, expanded) {
// sets up controlling button's aria properties
buttonHeading.id = buttonHeading.id ? buttonHeading.id : this.uuidService.getUUID('v-accordion-button-');
buttonHeading.ariaControls = this.panels[index].id;
buttonHeading.ariaExpanded = expanded;
if (buttonHeading.toggleIcon) {
buttonHeading.toggleIcon.class = [buttonHeading.toggleIcon.class, 'v-accordion-toggle-icon'].join(' ');
if (!buttonHeading.toggleIcon._iconSet) {
if (!buttonHeading.toggleIcon._expandedSet)
buttonHeading.toggleIcon.expandedIcon = 'chevron-down';
if (!buttonHeading.toggleIcon._collapsedSet)
buttonHeading.toggleIcon.collapsedIcon = 'chevron-right';
buttonHeading.toggleIcon.icon.icon = expanded
? buttonHeading.toggleIcon.expandedIcon
: buttonHeading.toggleIcon.collapsedIcon;
}
}
else if (buttonHeading.toggleIconComponent) {
buttonHeading.toggleIconComponent._accordionToggle = true;
buttonHeading.toggleIconComponent.rotated = expanded;
}
}
/**
* The toggleItem method reverses the current state of the accordion. If collapsed, it expands; if expanded, it collapses. If it was collapsed, the function will expand. If it was expanded, the function will collapse.
* @param index Index of accordion item to toggle.
*/
toggleItem(index) {
this.items[index]['heading'].expanded = !this.items[index]['heading'].expanded;
}
/**
* The expandItem method expands the accordion by showing panel content, setting the button’s aria-expanded to true, and changing the toggle icon to expandedIcon.
* @param index Index of accordion item to expand.
*/
expandItem(index) {
if (this.items[index]) {
this.items[index]['panel']._expanded = true;
this.items[index]['button'].ariaExpanded = true;
if (this.items[index]['button'].toggleIcon && !this.items[index]['button'].toggleIcon._iconSet) {
this.items[index]['button'].toggleIcon.icon.icon = this.items[index]['button'].toggleIcon.expandedIcon;
}
else if (this.items[index]['button'].toggleIconComponent) {
this.items[index]['button'].toggleIconComponent.rotated = true;
}
}
}
/**
* The collapseItem method collapses the accordion by hiding panel content, setting the button’s aria-expanded to false, and changing the toggle icon to collapsedIcon.
* @param index Index of accordion item to collapse.
*/
collapseItem(index) {
if (this.items[index]) {
this.items[index]['panel']._expanded = false;
this.items[index]['button'].ariaExpanded = false;
if (this.items[index]['button'].toggleIcon && !this.items[index]['button'].toggleIcon._iconSet) {
this.items[index]['button'].toggleIcon.icon.icon = this.items[index]['button'].toggleIcon.collapsedIcon;
}
else if (this.items[index]['button'].toggleIconComponent) {
this.items[index]['button'].toggleIconComponent.rotated = false;
}
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService, deps: [{ token: i1.UUIDService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.UUIDService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvYWNjb3JkaW9uL2FjY29yZGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7QUFNbEU7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBSTVDLGNBQWM7UUFDZCxVQUFLLEdBQXNHLEVBQUUsQ0FBQztJQUwvRCxDQUFDO0lBV2hEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsU0FBNkI7UUFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7UUFDckMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFekMsc0VBQXNFO1FBQ3RFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ25FLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDOzs7O09BSVosQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLDhCQUE4QjtZQUM5QixPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUV2Qjs7O2VBR0c7WUFDSCxJQUFJLGFBQWEsR0FBZ0MsT0FBTyxDQUFDLFVBQVU7Z0JBQ2pFLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVTtnQkFDcEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjO29CQUN0QixDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWM7b0JBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFaEIsMEVBQTBFO1lBQzFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUV4RixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsS0FBYSxFQUFFLFFBQWlCO1FBQ3pDLHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUMzQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxhQUE4QixFQUFFLEtBQWEsRUFBRSxRQUFpQjtRQUMxRSwrQ0FBK0M7UUFDL0MsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pHLGFBQWEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkQsYUFBYSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDdEMsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsYUFBYSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSx5QkFBeUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2RyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsWUFBWTtvQkFBRSxhQUFhLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUM7Z0JBQ25HLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGFBQWE7b0JBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsZUFBZSxDQUFDO2dCQUN0RyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUTtvQkFDM0MsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsWUFBWTtvQkFDdkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QyxhQUFhLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzFELGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNqRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNoRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQy9GLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQ3pHLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsbUJBQW1CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNqRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLENBQUMsS0FBYTtRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQ2pELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFDMUcsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0F4SVUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVVVJRFNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL3V1aWQuc2VydmljZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25IZWFkaW5nRGlyZWN0aXZlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLWhlYWRpbmcvYWNjb3JkaW9uLWhlYWRpbmcuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY29yZGlvblBhbmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLXBhbmVsL2FjY29yZGlvbi1wYW5lbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWNjb3JkaW9uRGlyZWN0aXZlIH0gZnJvbSAnLi9hY2NvcmRpb24uZGlyZWN0aXZlJztcblxuLyoqXG4gKiBBY2NvcmRpb25TZXJ2aWNlIGlzIGFuIGludGVybmFsIHNlcnZpY2UgdXNlZCB0byBjcmVhdGUgYWNjb3JkaW9uIGJlaGF2aW9yIGFuZCBpcyB1c2VkIHdpdGhpbiB0aGUgYWNjb3JkaW9uIGNvbXBvbmVudC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFjY29yZGlvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV1aWRTZXJ2aWNlOiBVVUlEU2VydmljZSkge31cblxuICAvKiogQGlnbm9yZSAqL1xuICBhY2NvcmRpb246IEFjY29yZGlvbkRpcmVjdGl2ZTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgaXRlbXM6IHsgaGVhZGluZzogQWNjb3JkaW9uSGVhZGluZ0RpcmVjdGl2ZTsgYnV0dG9uOiBCdXR0b25EaXJlY3RpdmU7IHBhbmVsOiBBY2NvcmRpb25QYW5lbERpcmVjdGl2ZSB9W10gPSBbXTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgaGVhZGluZ3M6IEFjY29yZGlvbkhlYWRpbmdEaXJlY3RpdmVbXTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcGFuZWxzOiBBY2NvcmRpb25QYW5lbERpcmVjdGl2ZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0VXBBY2NvcmRpb24gbWV0aG9kIHNldHMgdXAgdGhlIGFjY29yZGlvbiBieSBwYWlyaW5nIGFjY29yZGlvbiBoZWFkaW5ncyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgcGFuZWxzIGFuZCBoYXZpbmcgdGhlbSByZWZsZWN0IHRoZSBzYW1lIGV4cGFuZGVkIHN0YXRlLlxuICAgKiBAcGFyYW0gYWNjb3JkaW9uIEFjY29yZGlvbiB0byBzZXQgdXAuXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHNldFVwQWNjb3JkaW9uKGFjY29yZGlvbjogQWNjb3JkaW9uRGlyZWN0aXZlKSB7XG4gICAgdGhpcy5pdGVtcyA9IFtdOyAvLyByZXNldCBpdGVtcyBhcnJheVxuICAgIC8vIHByb3ZpZGUgc2VydmljZSB3aXRoIG5lY2Vzc2FyeSBEaXJlY3RpdmVzXG4gICAgdGhpcy5hY2NvcmRpb24gPSBhY2NvcmRpb247XG4gICAgdGhpcy5oZWFkaW5ncyA9IGFjY29yZGlvbi5oZWFkaW5ncy50b0FycmF5KCk7XG4gICAgdGhpcy5wYW5lbHMgPSBhY2NvcmRpb24ucGFuZWxzLnRvQXJyYXkoKTtcblxuICAgIC8vIHJldHVybiBvciB3YXJuIGZvciBlZGdlIGNhc2VzIG9mIG5vIG9yIG1pc21hdGNoZWQgaGVhZGluZ3MgKyBwYW5lbHNcbiAgICBpZiAodGhpcy5oZWFkaW5ncy5sZW5ndGggPT09IDAgfHwgdGhpcy5wYW5lbHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaGVhZGluZ3MubGVuZ3RoICE9PSB0aGlzLnBhbmVscy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgXG4gICAgICAgIFRoZSBudW1iZXIgb2YgYWNjb3JkaW9uIGhlYWRpbmdzIGFuZCBwYW5lbHMgYXJlIG5vdCBlcXVhbC4gXG4gICAgICAgIEJlaGF2aW9yIG1heSBiZSBvZmYgYXMgYSByZXN1bHQuIFxuICAgICAgICBQbGVhc2UgZW5zdXJlIGVhY2ggaGVhZGluZyBoYXMgYSBtYXRjaGluZyBwYW5lbC5cbiAgICAgIGApO1xuICAgIH1cblxuICAgIHRoaXMuaGVhZGluZ3MuZm9yRWFjaCgoaGVhZGluZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIHNldCBpbmRleCBhdCBoZWFkaW5nIGxldmVsLlxuICAgICAgaGVhZGluZy5faW5kZXggPSBpbmRleDtcblxuICAgICAgLyoqXG4gICAgICAgKiBFYWNoIGl0ZW0gcmVxdWlyZXMgYSBjb250cm9sbGluZyBidXR0b25cbiAgICAgICAqIFRoaXMgd2lsbCBlaXRoZXIgYmUgYW4gW3YtYnV0dG9uXVt2LWFjY29yZGlvbi1oZWFkaW5nXSBvciBhIGNoaWxkIGJ1dHRvbiBvZiBhbiBhY2NvcmRpb24taGVhZGluZ1xuICAgICAgICovXG4gICAgICBsZXQgYnV0dG9uSGVhZGluZzogQnV0dG9uRGlyZWN0aXZlIHwgdW5kZWZpbmVkID0gaGVhZGluZy5ob3N0QnV0dG9uXG4gICAgICAgID8gaGVhZGluZy5ob3N0QnV0dG9uXG4gICAgICAgIDogaGVhZGluZy5fYnV0dG9uSGVhZGluZ1xuICAgICAgICAgID8gaGVhZGluZy5fYnV0dG9uSGVhZGluZ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBjcmVhdGUgYXJyYXkgb2YgaXRlbXMgd2l0aCBlYWNoIGNvbnRyb2xsaW5nIGJ1dHRvbiBhbmQgcmVzcGVjdGl2ZSBwYW5lbFxuICAgICAgaWYgKHRoaXMucGFuZWxzW2luZGV4XSAmJiBidXR0b25IZWFkaW5nKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh7IGhlYWRpbmc6IGhlYWRpbmcsIGJ1dHRvbjogYnV0dG9uSGVhZGluZywgcGFuZWw6IHRoaXMucGFuZWxzW2luZGV4XSB9KTtcblxuICAgICAgICB0aGlzLnNldFVwUGFuZWwoaW5kZXgsIGhlYWRpbmcuZXhwYW5kZWQpO1xuICAgICAgICB0aGlzLnNldFVwQnV0dG9uKGJ1dHRvbkhlYWRpbmcsIGluZGV4LCBoZWFkaW5nLmV4cGFuZGVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGXCoHNldFVwUGFuZWzCoG1ldGhvZCBjb25maWd1cmVzIGEgcGFuZWwgd2l0aCBpbmRleCwgZXhwYW5kZWQgc3RhdGUsIGFuZCBhc3NpZ25zIGFuIGlkIGlmIG5vdCBwcm92aWRlZC5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHBhbmVsIHRvIHNldCB1cC5cbiAgICogQHBhcmFtIGV4cGFuZGVkIEV4cGFuZGVkIHN0YXRlIG9mIHBhbmVsJ3MgYXNzb2NpYXRlZCBhY2NvcmRpb24gaXRlbS5cbiAgICovXG4gIHNldFVwUGFuZWwoaW5kZXg6IG51bWJlciwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcbiAgICAvLyBhbGlnbnMgcGFuZWwgaW5kZXggYW5kIGV4cGFuZGVkIHRvIGFzc29jaWF0ZWQgaGVhZGluZ1xuICAgIHRoaXMucGFuZWxzW2luZGV4XS5faW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnBhbmVsc1tpbmRleF0uX2V4cGFuZGVkID0gZXhwYW5kZWQ7XG4gICAgdGhpcy5wYW5lbHNbaW5kZXhdLmlkID0gdGhpcy5wYW5lbHNbaW5kZXhdLmlkXG4gICAgICA/IHRoaXMucGFuZWxzW2luZGV4XS5pZFxuICAgICAgOiB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtYWNjb3JkaW9uLXBhbmVsLScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZcKgc2V0VXBCdXR0b27CoG1ldGhvZCBjb25maWd1cmVzIGEgYnV0dG9uIHdpdGggaWQsIGFyaWEtY29udHJvbHMsIGFyaWEtZXhwYW5kZWQgYXR0cmlidXRlcywgYW5kIHRoZSBhcHByb3ByaWF0ZSB0b2dnbGUgaWNvbi5cbiAgICogQHBhcmFtIGJ1dHRvbkhlYWRpbmcgQnV0dG9uIHRvIHNldCB1cC5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIGJ1dHRvbiB0byBzZXQgdXAuXG4gICAqIEBwYXJhbSBleHBhbmRlZCBFeHBhbmRlZCBzdGF0ZSBvZiBidXR0b24ncyBhc3NvY2lhdGVkIGFjY29yZGlvbiBpdGVtLlxuICAgKi9cbiAgc2V0VXBCdXR0b24oYnV0dG9uSGVhZGluZzogQnV0dG9uRGlyZWN0aXZlLCBpbmRleDogbnVtYmVyLCBleHBhbmRlZDogYm9vbGVhbikge1xuICAgIC8vIHNldHMgdXAgY29udHJvbGxpbmcgYnV0dG9uJ3MgYXJpYSBwcm9wZXJ0aWVzXG4gICAgYnV0dG9uSGVhZGluZy5pZCA9IGJ1dHRvbkhlYWRpbmcuaWQgPyBidXR0b25IZWFkaW5nLmlkIDogdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LWFjY29yZGlvbi1idXR0b24tJyk7XG4gICAgYnV0dG9uSGVhZGluZy5hcmlhQ29udHJvbHMgPSB0aGlzLnBhbmVsc1tpbmRleF0uaWQ7XG4gICAgYnV0dG9uSGVhZGluZy5hcmlhRXhwYW5kZWQgPSBleHBhbmRlZDtcbiAgICBpZiAoYnV0dG9uSGVhZGluZy50b2dnbGVJY29uKSB7XG4gICAgICBidXR0b25IZWFkaW5nLnRvZ2dsZUljb24uY2xhc3MgPSBbYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmNsYXNzLCAndi1hY2NvcmRpb24tdG9nZ2xlLWljb24nXS5qb2luKCcgJyk7XG4gICAgICBpZiAoIWJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5faWNvblNldCkge1xuICAgICAgICBpZiAoIWJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5fZXhwYW5kZWRTZXQpIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5leHBhbmRlZEljb24gPSAnY2hldnJvbi1kb3duJztcbiAgICAgICAgaWYgKCFidXR0b25IZWFkaW5nLnRvZ2dsZUljb24uX2NvbGxhcHNlZFNldCkgYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmNvbGxhcHNlZEljb24gPSAnY2hldnJvbi1yaWdodCc7XG4gICAgICAgIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5pY29uLmljb24gPSBleHBhbmRlZFxuICAgICAgICAgID8gYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmV4cGFuZGVkSWNvblxuICAgICAgICAgIDogYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmNvbGxhcHNlZEljb247XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChidXR0b25IZWFkaW5nLnRvZ2dsZUljb25Db21wb25lbnQpIHtcbiAgICAgIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbkNvbXBvbmVudC5fYWNjb3JkaW9uVG9nZ2xlID0gdHJ1ZTtcbiAgICAgIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbkNvbXBvbmVudC5yb3RhdGVkID0gZXhwYW5kZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZcKgdG9nZ2xlSXRlbcKgbWV0aG9kIHJldmVyc2VzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhY2NvcmRpb24uIElmIGNvbGxhcHNlZCwgaXQgZXhwYW5kczsgaWYgZXhwYW5kZWQsIGl0IGNvbGxhcHNlcy4gSWYgaXQgd2FzIGNvbGxhcHNlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgZXhwYW5kLiBJZiBpdCB3YXMgZXhwYW5kZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbGxhcHNlLlxuICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgYWNjb3JkaW9uIGl0ZW0gdG8gdG9nZ2xlLlxuICAgKi9cbiAgdG9nZ2xlSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5pdGVtc1tpbmRleF1bJ2hlYWRpbmcnXS5leHBhbmRlZCA9ICF0aGlzLml0ZW1zW2luZGV4XVsnaGVhZGluZyddLmV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBleHBhbmRJdGVtIG1ldGhvZCBleHBhbmRzIHRoZSBhY2NvcmRpb24gYnkgc2hvd2luZyBwYW5lbCBjb250ZW50LCBzZXR0aW5nIHRoZSBidXR0b27igJlzIGFyaWEtZXhwYW5kZWQgdG8gdHJ1ZSwgYW5kIGNoYW5naW5nIHRoZSB0b2dnbGUgaWNvbiB0byBleHBhbmRlZEljb24uXG4gICAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiBhY2NvcmRpb24gaXRlbSB0byBleHBhbmQuXG4gICAqL1xuICBleHBhbmRJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5pdGVtc1tpbmRleF0pIHtcbiAgICAgIHRoaXMuaXRlbXNbaW5kZXhdWydwYW5lbCddLl9leHBhbmRlZCA9IHRydWU7XG4gICAgICB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10uYXJpYUV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbiAmJiAhdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24uX2ljb25TZXQpIHtcbiAgICAgICAgdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24uaWNvbi5pY29uID0gdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24uZXhwYW5kZWRJY29uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbkNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbkNvbXBvbmVudC5yb3RhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbGxhcHNlSXRlbSBtZXRob2QgY29sbGFwc2VzIHRoZSBhY2NvcmRpb24gYnkgaGlkaW5nIHBhbmVsIGNvbnRlbnQsIHNldHRpbmcgdGhlIGJ1dHRvbuKAmXMgYXJpYS1leHBhbmRlZCB0byBmYWxzZSwgYW5kIGNoYW5naW5nIHRoZSB0b2dnbGUgaWNvbiB0byBjb2xsYXBzZWRJY29uLlxuICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgYWNjb3JkaW9uIGl0ZW0gdG8gY29sbGFwc2UuXG4gICAqL1xuICBjb2xsYXBzZUl0ZW0oaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLml0ZW1zW2luZGV4XSkge1xuICAgICAgdGhpcy5pdGVtc1tpbmRleF1bJ3BhbmVsJ10uX2V4cGFuZGVkID0gZmFsc2U7XG4gICAgICB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10uYXJpYUV4cGFuZGVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24gJiYgIXRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLl9pY29uU2V0KSB7XG4gICAgICAgIHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLmljb24uaWNvbiA9IHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLmNvbGxhcHNlZEljb247XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uQ29tcG9uZW50LnJvdGF0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==