@vm721/ui-kit
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.1.1.
170 lines • 27.4 kB
JavaScript
import { Directive, ElementRef, Renderer2, HostListener, Input } from '@angular/core';
import { PointerMapService } from "../../dev-ninja/services/pointer-map.service";
var ToggleModes;
(function (ToggleModes) {
ToggleModes["AUTO"] = "auto";
ToggleModes["OPEN"] = "open";
ToggleModes["CLOSE"] = "close";
})(ToggleModes || (ToggleModes = {}));
var EventListenerModes;
(function (EventListenerModes) {
EventListenerModes["ADD"] = "add";
EventListenerModes["REMOVE"] = "remove";
})(EventListenerModes || (EventListenerModes = {}));
var OriginSides;
(function (OriginSides) {
OriginSides["LEFT"] = "left";
OriginSides["RIGHT"] = "right";
})(OriginSides || (OriginSides = {}));
export class DropdownDirective {
constructor(dropdownElemRef, renderer, pointerMap) {
this.dropdownElemRef = dropdownElemRef;
this.renderer = renderer;
this.pointerMap = pointerMap;
this.dropdownOpen = false;
this.DropdownOriginSide = OriginSides.LEFT;
this.DropdownClass = 'dropdown';
this.DropdownContentClass = 'dropdown__content';
this.DropdownOpenClass = 'dropdown__content_--show';
this.DropdownLeftOriginClass = 'dropdown__content--left';
this.DropdownRightOriginClass = 'dropdown__content--right';
this.dropdownElem = this.dropdownElemRef.nativeElement;
this.domEventListenerHandlersMap = this.pointerMap.create(true);
}
ngOnInit() {
this.renderer.addClass(this.dropdownElem, this.DropdownClass);
this.renderer.addClass(this.DropdownContentElemRef, this.DropdownContentClass);
if (this.DropdownOriginSide === OriginSides.RIGHT) {
this.renderer.addClass(this.DropdownContentElemRef, this.DropdownRightOriginClass);
}
else if (this.DropdownOriginSide === OriginSides.LEFT) {
this.renderer.addClass(this.dropdownElem, this.DropdownLeftOriginClass);
}
else {
console.warn("----- Dropdown Directive Setup Failed -----");
console.error('Error: DropdownDirective.DropdownOriginSide was not recognised.');
console.info(`Current OriginSide Set:${this.DropdownOriginSide}`, '\nAllowed OriginSides:', {
[OriginSides.LEFT]: 'Will add the DropdownLeftOriginClass to DropdownContentElement. [DEFAULT (if not set)]',
[OriginSides.RIGHT]: 'Will add the DropdownRightOriginClass to DropdownContentElement.'
});
console.warn("----- ----- -----");
}
}
ngAfterViewInit() {
this.dropdownContentElem = this.DropdownContentElemRef;
this.dropdownOpen = this.dropdownContentElem.classList.contains(this.DropdownOpenClass);
// console.log('The Elements', this.dropdownElem, this.dropdownContentElem);
}
ngOnDestroy() {
PointerMapService.clear(this.domEventListenerHandlersMap);
}
onDropdownClick(event) {
// console.log("Binded:", this.DropdownContentElemRef);
// console.log('dropdown clicked on', event, this.dropdownElem, this.dropdownContentElem);
this.toggleDropdown();
// console.log("EventListenerHandlers:", this.domEventListenerHandlers);
}
getContentElem(parent_elem) {
for (let i = 0; i < parent_elem.children.length; i++) {
if (parent_elem.children[i].classList.contains(this.DropdownContentClass)) {
return parent_elem.children[i];
}
}
}
OutsideClickHandler(thisArg, mode = EventListenerModes.ADD, EID) {
let EventID;
let clickOutsidetoCloseHandler;
if (EID) {
EventID = EID;
clickOutsidetoCloseHandler = this.domEventListenerHandlersMap.getPointer(EID);
}
else {
EventID = this.domEventListenerHandlersMap.createEmptyPointer();
clickOutsidetoCloseHandler = this.domEventListenerHandlersMap.useEmptyPointer(EventID, (ev) => {
if (!thisArg.dropdownElem.contains(ev.target) && !thisArg.dropdownContentElem.contains(ev.target)) {
console.log(EventID, "-->clicked outside:", this.dropdownElem, this.dropdownContentElem, ev.target, thisArg.dropdownElem.contains(ev.target), thisArg.dropdownContentElem.contains(ev.target));
thisArg.toggleDropdown(ToggleModes.CLOSE, EventID);
}
});
}
console.log('OutsideClickHandler ->', mode, EventID, clickOutsidetoCloseHandler);
if (mode === EventListenerModes.ADD) {
document.addEventListener('click', clickOutsidetoCloseHandler[1]);
}
else if (mode === EventListenerModes.REMOVE) {
document.removeEventListener('click', clickOutsidetoCloseHandler[1]);
}
}
toggleDropdown(mode = ToggleModes.AUTO, EID) {
if (mode !== ToggleModes.AUTO) {
if (mode === ToggleModes.CLOSE) {
//e.classList.remove('dropdown__content_--show');
//document.removeEventListener('click', closeOnClickOutsideHandler);
this.renderer.removeClass(this.dropdownContentElem, this.DropdownOpenClass);
// console.log("Dropdown closed!", this.dropdownElem, this.dropdownContentElem, this.DropdownContentElemRef.classList.contains(this.DropdownOpenClass));
this.OutsideClickHandler(this, EventListenerModes.REMOVE, EID);
}
else if (mode === ToggleModes.OPEN) {
//e.classList.add('dropdown__content_--show');
//document.addEventListener('click', closeOnClickOutsideHandler);
this.renderer.addClass(this.dropdownContentElem, this.DropdownOpenClass);
// console.log("Dropdown Opened!", this.dropdownElem, this.dropdownContentElem, this.DropdownContentElemRef.classList.contains(this.DropdownOpenClass));
this.OutsideClickHandler(this, EventListenerModes.ADD);
}
else {
console.warn("----- Dropdown Toggle Failed -----");
console.error('Error: DropdownDirective.toggleDropdown() was called with unrecognized mode.');
console.info(`Current Mode Passed:${mode}`, '\nAllowed Modes:', {
[ToggleModes.AUTO]: 'Automatically determines dropdown state and toggles the state. [DEFAULT (if not passed)]',
[ToggleModes.OPEN]: 'Sets Dropdown state to OPEN [--force].',
[ToggleModes.CLOSE]: 'Sets Dropdown state to CLOSE [--force].'
});
console.warn("----- ----- -----");
}
}
else {
// console.log("----- Dropdown Toggle -----");
this.dropdownOpen = this.dropdownContentElem.classList.contains(this.DropdownOpenClass);
// console.log("Dropdown open:", this.dropdownOpen);
if (this.dropdownOpen) {
// console.log("Closing Dropdown!");
this.toggleDropdown(ToggleModes.CLOSE);
}
else {
// console.log("Opening Dropdown!");
this.toggleDropdown(ToggleModes.OPEN);
}
}
this.dropdownOpen = this.dropdownContentElem.classList.contains(this.DropdownOpenClass);
}
isNode(o) {
return (typeof Node === "object" ? o instanceof Node :
o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string");
}
//Returns true if it is a DOM element
isElement(o) {
return (typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string");
}
}
DropdownDirective.decorators = [
{ type: Directive, args: [{
selector: '[commonDropdown]'
},] }
];
DropdownDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 },
{ type: PointerMapService }
];
DropdownDirective.propDecorators = {
DropdownContentElemRef: [{ type: Input }],
DropdownOriginSide: [{ type: Input }],
DropdownClass: [{ type: Input }],
DropdownContentClass: [{ type: Input }],
DropdownOpenClass: [{ type: Input }],
DropdownLeftOriginClass: [{ type: Input }],
DropdownRightOriginClass: [{ type: Input }],
onDropdownClick: [{ type: HostListener, args: ['click',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkta2l0L2NvbW1vbi9kaXJlY3RpdmVzL2Ryb3Bkb3duLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFHVixTQUFTLEVBQ1QsWUFBWSxFQUVaLEtBQUssRUFFTixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUlqRixJQUFLLFdBSUo7QUFKRCxXQUFLLFdBQVc7SUFDWiw0QkFBWSxDQUFBO0lBQ1osNEJBQVksQ0FBQTtJQUNaLDhCQUFjLENBQUE7QUFDbEIsQ0FBQyxFQUpJLFdBQVcsS0FBWCxXQUFXLFFBSWY7QUFFRCxJQUFLLGtCQUdKO0FBSEQsV0FBSyxrQkFBa0I7SUFDbkIsaUNBQVcsQ0FBQTtJQUNYLHVDQUFnQixDQUFBO0FBQ3BCLENBQUMsRUFISSxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBR3RCO0FBRUQsSUFBSyxXQUdKO0FBSEQsV0FBSyxXQUFXO0lBQ1osNEJBQVksQ0FBQTtJQUNaLDhCQUFjLENBQUE7QUFDbEIsQ0FBQyxFQUhJLFdBQVcsS0FBWCxXQUFXLFFBR2Y7QUFLRCxNQUFNLE9BQU8saUJBQWlCO0lBZ0IxQixZQUFvQixlQUEyQixFQUFVLFFBQW1CLEVBQVUsVUFBNkI7UUFBL0Ysb0JBQWUsR0FBZixlQUFlLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFibkgsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFckIsdUJBQWtCLEdBQVcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUM5QyxrQkFBYSxHQUFXLFVBQVUsQ0FBQztRQUNuQyx5QkFBb0IsR0FBVyxtQkFBbUIsQ0FBQztRQUNuRCxzQkFBaUIsR0FBVywwQkFB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QyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUcsUUFBUSxDQUNuRyxDQUFDO0lBQ04sQ0FBQzs7O1lBM0tKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsa0JBQWtCO2FBQy9COzs7WUFoQ0MsVUFBVTtZQUdWLFNBQVM7WUFPRixpQkFBaUI7OztxQ0EyQnJCLEtBQUs7aUNBQ0wsS0FBSzs0QkFDTCxLQUFLO21DQUNMLEtBQUs7Z0NBQ0wsS0FBSztzQ0FDTCxLQUFLO3VDQUNMLEtBQUs7OEJBK0NQLFlBQVksU0FBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIFJlbmRlcmVyMixcbiAgSG9zdExpc3RlbmVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUG9pbnRlck1hcFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vZGV2LW5pbmphL3NlcnZpY2VzL3BvaW50ZXItbWFwLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBvaW50ZXJNYXAgfSBmcm9tIFwiLi4vLi4vZGV2LW5pbmphL3BvaW50ZXJNYXAvcG9pbnRlck1hcFwiO1xuXG5cbmVudW0gVG9nZ2xlTW9kZXN7XG4gICAgQVVUTz0gJ2F1dG8nLFxuICAgIE9QRU49ICdvcGVuJyxcbiAgICBDTE9TRT0gJ2Nsb3NlJ1xufVxuXG5lbnVtIEV2ZW50TGlzdGVuZXJNb2Rlc3tcbiAgICBBREQ9ICAnYWRkJyxcbiAgICBSRU1PVkU9ICdyZW1vdmUnXG59XG5cbmVudW0gT3JpZ2luU2lkZXMge1xuICAgIExFRlQ9ICdsZWZ0JyxcbiAgICBSSUdIVD0gJ3JpZ2h0J1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tjb21tb25Ecm9wZG93bl0nXG59KVxuZXhwb3J0IGNsYXNzIERyb3Bkb3duRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIGRyb3Bkb3duRWxlbTogSFRNTEVsZW1lbnQ7XG4gICAgZHJvcGRvd25Db250ZW50RWxlbTogRWxlbWVudDtcbiAgICBkcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBEcm9wZG93bkNvbnRlbnRFbGVtUmVmOiBIVE1MRWxlbWVudDtcbiAgICBASW5wdXQoKSBEcm9wZG93bk9yaWdpblNpZGU6IHN0cmluZyA9IE9yaWdpblNpZGVzLkxFRlQ7XG4gICAgQElucHV0KCkgRHJvcGRvd25DbGFzczogc3RyaW5nID0gJ2Ryb3Bkb3duJztcbiAgICBASW5wdXQoKSBEcm9wZG93bkNvbnRlbnRDbGFzczogc3RyaW5nID0gJ2Ryb3Bkb3duX19jb250ZW50JztcbiAgICBASW5wdXQoKSBEcm9wZG93bk9wZW5DbGFzczogc3RyaW5nID0gJ2Ryb3Bkb3duX19jb250ZW50Xy0tc2hvdyc7XG4gICAgQElucHV0KCkgRHJvcGRvd25MZWZ0T3JpZ2luQ2xhc3M6IHN0cmluZyA9ICdkcm9wZG93bl9fY29udGVudC0tbGVmdCc7XG4gICAgQElucHV0KCkgRHJvcGRvd25SaWdodE9yaWdpbkNsYXNzOiBzdHJpbmc9ICdkcm9wZG93bl9fY29udGVudC0tcmlnaHQnXG5cbiAgICBkb21FdmVudExpc3RlbmVySGFuZGxlcnNNYXA6IFBvaW50ZXJNYXA7XG5cblxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkcm9wZG93bkVsZW1SZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBwb2ludGVyTWFwOiBQb2ludGVyTWFwU2VydmljZSkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duRWxlbSA9IHRoaXMuZHJvcGRvd25FbGVtUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgdGhpcy5kb21FdmVudExpc3RlbmVySGFuZGxlcnNNYXAgPSB0aGlzLnBvaW50ZXJNYXAuY3JlYXRlKHRydWUpO1xuXG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyb3Bkb3duRWxlbSwgdGhpcy5Ecm9wZG93bkNsYXNzKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLkRyb3Bkb3duQ29udGVudEVsZW1SZWYsIHRoaXMuRHJvcGRvd25Db250ZW50Q2xhc3MpO1xuXG4gICAgICAgIGlmKHRoaXMuRHJvcGRvd25PcmlnaW5TaWRlID09PSBPcmlnaW5TaWRlcy5SSUdIVCl7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuRHJvcGRvd25Db250ZW50RWxlbVJlZiwgdGhpcy5Ecm9wZG93blJpZ2h0T3JpZ2luQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5Ecm9wZG93bk9yaWdpblNpZGUgPT09IE9yaWdpblNpZGVzLkxFRlQpe1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyb3Bkb3duRWxlbSwgdGhpcy5Ecm9wZG93bkxlZnRPcmlnaW5DbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIi0tLS0tIERyb3Bkb3duIERpcmVjdGl2ZSBTZXR1cCBGYWlsZWQgLS0tLS1cIik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogRHJvcGRvd25EaXJlY3RpdmUuRHJvcGRvd25PcmlnaW5TaWRlIHdhcyBub3QgcmVjb2duaXNlZC4nKVxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICAgIGBDdXJyZW50IE9yaWdpblNpZGUgU2V0OiR7dGhpcy5Ecm9wZG93bk9yaWdpblNpZGV9YCxcbiAgICAgICAgICAgICAgICAnXFxuQWxsb3dlZCBPcmlnaW5TaWRlczonLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgW09yaWdpblNpZGVzLkxFRlRdOiAnV2lsbCBhZGQgdGhlIERyb3Bkb3duTGVmdE9yaWdpbkNsYXNzIHRvIERyb3Bkb3duQ29udGVudEVsZW1lbnQuIFtERUZBVUxUIChpZiBub3Qgc2V0KV0nLFxuICAgICAgICAgICAgICAgICAgICBbT3JpZ2luU2lkZXMuUklHSFRdOiAnV2lsbCBhZGQgdGhlIERyb3Bkb3duUmlnaHRPcmlnaW5DbGFzcyB0byBEcm9wZG93bkNvbnRlbnRFbGVtZW50LidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiLS0tLS0gLS0tLS0gLS0tLS1cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZHtcbiAgICAgICAgdGhpcy5kcm9wZG93bkNvbnRlbnRFbGVtPSB0aGlzLkRyb3Bkb3duQ29udGVudEVsZW1SZWY7XG4gICAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdGhpcy5kcm9wZG93bkNvbnRlbnRFbGVtLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1RoZSBFbGVtZW50cycsIHRoaXMuZHJvcGRvd25FbGVtLCB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgUG9pbnRlck1hcFNlcnZpY2UuY2xlYXIodGhpcy5kb21FdmVudExpc3RlbmVySGFuZGxlcnNNYXApO1xuICAgIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpIG9uRHJvcGRvd25DbGljayhldmVudDogRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJCaW5kZWQ6XCIsIHRoaXMuRHJvcGRvd25Db250ZW50RWxlbVJlZik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdkcm9wZG93biBjbGlja2VkIG9uJywgZXZlbnQsIHRoaXMuZHJvcGRvd25FbGVtLCB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0pO1xuICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRXZlbnRMaXN0ZW5lckhhbmRsZXJzOlwiLCB0aGlzLmRvbUV2ZW50TGlzdGVuZXJIYW5kbGVycyk7XG4gICAgfVxuXG4gICAgZ2V0Q29udGVudEVsZW0ocGFyZW50X2VsZW06IEhUTUxFbGVtZW50KTogRWxlbWVudHtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcmVudF9lbGVtLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGlmKHBhcmVudF9lbGVtLmNoaWxkcmVuW2ldLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRyb3Bkb3duQ29udGVudENsYXNzKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudF9lbGVtLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIE91dHNpZGVDbGlja0hhbmRsZXIodGhpc0FyZzp0aGlzLCBtb2RlPUV2ZW50TGlzdGVuZXJNb2Rlcy5BREQsIEVJRD86c3RyaW5nKXtcblxuICAgICAgICBsZXQgRXZlbnRJRDogc3RyaW5nO1xuICAgICAgICBsZXQgY2xpY2tPdXRzaWRldG9DbG9zZUhhbmRsZXI6IGFueTtcbiAgICAgICAgaWYgKEVJRCl7XG4gICAgICAgICAgRXZlbnRJRCA9IEVJRDtcbiAgICAgICAgICBjbGlja091dHNpZGV0b0Nsb3NlSGFuZGxlciA9IHRoaXMuZG9tRXZlbnRMaXN0ZW5lckhhbmRsZXJzTWFwLmdldFBvaW50ZXIoRUlEKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgIEV2ZW50SUQgPSB0aGlzLmRvbUV2ZW50TGlzdGVuZXJIYW5kbGVyc01hcC5jcmVhdGVFbXB0eVBvaW50ZXIoKTtcbiAgICAgICAgICBjbGlja091dHNpZGV0b0Nsb3NlSGFuZGxlciA9IHRoaXMuZG9tRXZlbnRMaXN0ZW5lckhhbmRsZXJzTWFwLnVzZUVtcHR5UG9pbnRlciggRXZlbnRJRCxcbiAgICAgICAgICAgIChldjogRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgICBpZighdGhpc0FyZy5kcm9wZG93bkVsZW0uY29udGFpbnMoZXYudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSAmJiAhdGhpc0FyZy5kcm9wZG93bkNvbnRlbnRFbGVtLmNvbnRhaW5zKGV2LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKEV2ZW50SUQsXCItLT5jbGlja2VkIG91dHNpZGU6XCIsIHRoaXMuZHJvcGRvd25FbGVtLCB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0sIGV2LnRhcmdldCwgdGhpc0FyZy5kcm9wZG93bkVsZW0uY29udGFpbnMoZXYudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSwgdGhpc0FyZy5kcm9wZG93bkNvbnRlbnRFbGVtLmNvbnRhaW5zKGV2LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIHRoaXNBcmcudG9nZ2xlRHJvcGRvd24oVG9nZ2xlTW9kZXMuQ0xPU0UsIEV2ZW50SUQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdPdXRzaWRlQ2xpY2tIYW5kbGVyIC0+JywgbW9kZSwgRXZlbnRJRCwgY2xpY2tPdXRzaWRldG9DbG9zZUhhbmRsZXIpO1xuXG4gICAgICAgIGlmKG1vZGUgPT09IEV2ZW50TGlzdGVuZXJNb2Rlcy5BREQpe1xuXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsaWNrT3V0c2lkZXRvQ2xvc2VIYW5kbGVyWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlID09PSBFdmVudExpc3RlbmVyTW9kZXMuUkVNT1ZFKXtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tPdXRzaWRldG9DbG9zZUhhbmRsZXJbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB0b2dnbGVEcm9wZG93bihtb2RlOnN0cmluZz1Ub2dnbGVNb2Rlcy5BVVRPLCBFSUQ/OnN0cmluZyl7XG4gICAgICAgIGlmKG1vZGUgIT09IFRvZ2dsZU1vZGVzLkFVVE8pe1xuICAgICAgICAgICAgaWYobW9kZSA9PT0gVG9nZ2xlTW9kZXMuQ0xPU0Upe1xuICAgICAgICAgICAgICAgIC8vZS5jbGFzc0xpc3QucmVtb3ZlKCdkcm9wZG93bl9fY29udGVudF8tLXNob3cnKTtcbiAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VPbkNsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kcm9wZG93bkNvbnRlbnRFbGVtLCB0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRyb3Bkb3duIGNsb3NlZCFcIiwgdGhpcy5kcm9wZG93bkVsZW0sIHRoaXMuZHJvcGRvd25Db250ZW50RWxlbSwgdGhpcy5Ecm9wZG93bkNvbnRlbnRFbGVtUmVmLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5PdXRzaWRlQ2xpY2tIYW5kbGVyKHRoaXMsIEV2ZW50TGlzdGVuZXJNb2Rlcy5SRU1PVkUsIEVJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKG1vZGUgPT09IFRvZ2dsZU1vZGVzLk9QRU4pe1xuICAgICAgICAgICAgICAgIC8vZS5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bl9fY29udGVudF8tLXNob3cnKTtcbiAgICAgICAgICAgICAgICAvL2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VPbkNsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kcm9wZG93bkNvbnRlbnRFbGVtLCB0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRyb3Bkb3duIE9wZW5lZCFcIiwgdGhpcy5kcm9wZG93bkVsZW0sIHRoaXMuZHJvcGRvd25Db250ZW50RWxlbSwgdGhpcy5Ecm9wZG93bkNvbnRlbnRFbGVtUmVmLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5PdXRzaWRlQ2xpY2tIYW5kbGVyKHRoaXMsIEV2ZW50TGlzdGVuZXJNb2Rlcy5BREQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCItLS0tLSBEcm9wZG93biBUb2dnbGUgRmFpbGVkIC0tLS0tXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBEcm9wZG93bkRpcmVjdGl2ZS50b2dnbGVEcm9wZG93bigpIHdhcyBjYWxsZWQgd2l0aCB1bnJlY29nbml6ZWQgbW9kZS4nKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYEN1cnJlbnQgTW9kZSBQYXNzZWQ6JHttb2RlfWAsXG4gICAgICAgICAgICAgICAgICAgICdcXG5BbGxvd2VkIE1vZGVzOicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtUb2dnbGVNb2Rlcy5BVVRPXTogJ0F1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lcyBkcm9wZG93biBzdGF0ZSBhbmQgdG9nZ2xlcyB0aGUgc3RhdGUuIFtERUZBVUxUIChpZiBub3QgcGFzc2VkKV0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1RvZ2dsZU1vZGVzLk9QRU5dOiAnU2V0cyBEcm9wZG93biBzdGF0ZSB0byBPUEVOIFstLWZvcmNlXS4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1RvZ2dsZU1vZGVzLkNMT1NFXTogJ1NldHMgRHJvcGRvd24gc3RhdGUgdG8gQ0xPU0UgWy0tZm9yY2VdLidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiLS0tLS0gLS0tLS0gLS0tLS1cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0gRHJvcGRvd24gVG9nZ2xlIC0tLS0tXCIpO1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuRHJvcGRvd25PcGVuQ2xhc3MpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJEcm9wZG93biBvcGVuOlwiLCB0aGlzLmRyb3Bkb3duT3Blbik7XG4gICAgICAgICAgICBpZih0aGlzLmRyb3Bkb3duT3Blbil7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDbG9zaW5nIERyb3Bkb3duIVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKFRvZ2dsZU1vZGVzLkNMT1NFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJPcGVuaW5nIERyb3Bkb3duIVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKFRvZ2dsZU1vZGVzLk9QRU4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuRHJvcGRvd25PcGVuQ2xhc3MpO1xuICAgIH1cblxuICAgIGlzTm9kZShvOiBhbnkpOiBib29sZWFue1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZW9mIE5vZGUgPT09IFwib2JqZWN0XCIgPyBvIGluc3RhbmNlb2YgTm9kZSA6XG4gICAgICAgICAgICAgICAgbyAmJiB0eXBlb2YgbyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygby5ub2RlVHlwZSA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2Ygby5ub2RlTmFtZT09PVwic3RyaW5nXCJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvL1JldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIERPTSBlbGVtZW50XG4gICAgaXNFbGVtZW50KG86IGFueSk6IGJvb2xlYW57XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwib2JqZWN0XCIgPyBvIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgOiAvL0RPTTJcbiAgICAgICAgICAgICAgICBvICYmIHR5cGVvZiBvID09PSBcIm9iamVjdFwiICYmIG8gIT09IG51bGwgJiYgby5ub2RlVHlwZSA9PT0gMSAmJiB0eXBlb2Ygby5ub2RlTmFtZT09PVwic3RyaW5nXCJcbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==