UNPKG

ng-devui

Version:

DevUI components based on Angular

245 lines 32.3 kB
import { DOCUMENT } from '@angular/common'; import { ComponentFactoryResolver, Directive, ElementRef, HostListener, Inject, Injector, Input, TemplateRef, ViewContainerRef } from '@angular/core'; import { OverlayContainerRef } from 'ng-devui/overlay-container'; import { of } from 'rxjs'; import { ReadTipComponent } from './read-tip.component'; import * as i0 from "@angular/core"; import * as i1 from "ng-devui/overlay-container"; export class ReadTipDirective { set prevTarget(target) { if (target !== this._prevTarget) { this._prevTarget = target; this.hide(); } } onMouseOver(event) { this.findElementIndex(event.target, this.readTipOptions?.rules, 'hover').subscribe((elementInfo) => { if (elementInfo?.shouldTrigger) { this.hide(); if (!this.readTipComponentRef) { const target = new ElementRef(event.target); setTimeout(() => { this.show(target, elementInfo.rule); }, elementInfo.rule?.mouseenterTime); } if (this.readTipComponentRef) { setTimeout(() => { if (this.readTipComponentRef) { this.readTipComponentRef.instance.updatePosition(); } }, elementInfo.rule?.mouseenterTime); } } }); } onMouseOut(event) { this.findElementIndex(event.target, this.readTipOptions?.rules, 'hover').subscribe((elementInfo) => { if (elementInfo?.shouldTrigger) { setTimeout(() => { this.hide(); }, elementInfo.rule?.mouseleaveTime); } }); } onClick(event) { this.findElementIndex(event.target, this.readTipOptions?.rules, 'click').subscribe((elementInfo) => { this.prevTarget = event.target; if (elementInfo?.shouldTrigger) { if (!this.readTipComponentRef) { const target = new ElementRef(event.target); this.show(target, elementInfo.rule); } if (this.readTipComponentRef) { setTimeout(() => { if (this.readTipComponentRef) { this.readTipComponentRef.instance.updatePosition(); } }); } } }); } constructor(el, componentFactoryResolver, overlayContainerRef, inject, viewContainerRef, doc) { this.el = el; this.componentFactoryResolver = componentFactoryResolver; this.overlayContainerRef = overlayContainerRef; this.inject = inject; this.viewContainerRef = viewContainerRef; this.doc = doc; this.defaultOptions = { trigger: 'hover', showAnimate: false, mouseenterTime: 100, mouseleaveTime: 100, position: 'top', overlayClassName: '', appendToBody: true, rules: { selector: null }, }; this.onDocumentClick = (event) => { event.stopPropagation(); if (!this.el.nativeElement.contains(event.target) && !(this.readTipComponentRef && this.readTipComponentRef.instance.elementRef.nativeElement.contains(event.target))) { this.hide(); } }; this.document = this.doc; } ngOnInit() { } ngOnDestroy() { this.destroy(); } show(target, rule) { this.hide(); if (!this.readTipComponentRef) { this.createReadTip(target, rule); } if (rule.showAnimate) { this.readTipComponentRef.instance.show(); } if (rule.trigger === 'click') { this.document.addEventListener('click', this.onDocumentClick); } } createReadTip(target, rule) { if (rule.appendToBody) { this.readTipComponentRef = this.overlayContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(ReadTipComponent)); } else { this.readTipComponentRef = this.viewContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(ReadTipComponent), this.viewContainerRef.length, this.inject); } if (this.contentTemplate) { Object.assign(this.readTipComponentRef.instance, { content: this.contentTemplate, triggerElementRef: target, appendToBody: rule.appendToBody, position: rule.position, overlayClassName: rule.overlayClassName, }); } else { if (rule.dataFn) { rule.dataFn({ element: target.nativeElement, rule }).subscribe((data) => { if (data.template) { Object.assign(this.readTipComponentRef.instance, { content: data.template, customData: data.customData, triggerElementRef: target, appendToBody: rule.appendToBody, position: rule.position, overlayClassName: rule.overlayClassName, }); } else { Object.assign(this.readTipComponentRef.instance, { content: data.content, title: data.title, triggerElementRef: target, appendToBody: rule.appendToBody, position: rule.position, overlayClassName: rule.overlayClassName, }); } }); } else { Object.assign(this.readTipComponentRef.instance, { content: rule.content, title: rule.title, triggerElementRef: target, appendToBody: rule.appendToBody, position: rule.position, overlayClassName: rule.overlayClassName, }); } } } hide() { if (this.readTipComponentRef) { if (!this.readTipOptions.showAnimate) { this.destroy(); return; } this.readTipComponentRef.instance.hide(); this.readTipComponentRef.instance.onHidden = () => { this.destroy(); }; } } destroy() { if (this.readTipComponentRef) { this.readTipComponentRef.destroy(); this.readTipComponentRef = null; } if (this.readTipOptions.trigger === 'click') { this.document.removeEventListener('click', this.onDocumentClick); } } findElementIndex(element, rules, trigger) { const keysCanInherit = ['trigger', 'showAnimate', 'mouseenterTime', 'mouseleaveTime', 'position', 'overlayClassName', 'appendToBody']; if (rules instanceof Array) { let elementIndex = -1; for (let i = 0; i < rules.length; i++) { if (this.isCorrectElement(rules[i].selector, element)) { elementIndex = i; break; } } keysCanInherit.forEach((key) => { if (rules[elementIndex]) { rules[elementIndex][key] = rules[elementIndex][key] || this.readTipOptions[key] || this.defaultOptions[key]; } }); return of({ shouldTrigger: rules[elementIndex]?.trigger === trigger && this.isCorrectElement(rules[elementIndex]?.selector, element), rule: rules[elementIndex], }); } else { keysCanInherit.forEach((key) => { if (rules) { rules[key] = rules[key] || this.readTipOptions[key] || this.defaultOptions[key]; } }); return of({ shouldTrigger: rules?.trigger === trigger && this.isCorrectElement(rules?.selector, element), rule: rules, }); } } isCorrectElement(selector, element) { const elementsArray = this.el.nativeElement.querySelectorAll(selector); for (let i = 0; i < elementsArray.length; i++) { if (elementsArray[i] === element) { return true; } } return false; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReadTipDirective, deps: [{ token: i0.ElementRef }, { token: i0.ComponentFactoryResolver }, { token: i1.OverlayContainerRef }, { token: i0.Injector }, { token: i0.ViewContainerRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: ReadTipDirective, selector: "[dReadTip]", inputs: { readTipOptions: "readTipOptions", contentTemplate: "contentTemplate" }, host: { listeners: { "mouseover": "onMouseOver($event)", "mouseout": "onMouseOut($event)", "click": "onClick($event)" } }, exportAs: ["dReadTip"], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReadTipDirective, decorators: [{ type: Directive, args: [{ selector: '[dReadTip]', exportAs: 'dReadTip', }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ComponentFactoryResolver }, { type: i1.OverlayContainerRef }, { type: i0.Injector }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { readTipOptions: [{ type: Input }], contentTemplate: [{ type: Input }], onMouseOver: [{ type: HostListener, args: ['mouseover', ['$event']] }], onMouseOut: [{ type: HostListener, args: ['mouseout', ['$event']] }], onClick: [{ type: HostListener, args: ['click', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC10aXAuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvcmVhZC10aXAvcmVhZC10aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsd0JBQXdCLEVBRXhCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUdMLFdBQVcsRUFDWCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBT3hELE1BQU0sT0FBTyxnQkFBZ0I7SUFpQjNCLElBQUksVUFBVSxDQUFDLE1BQU07UUFDbkIsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzFCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBT0QsV0FBVyxDQUFDLEtBQWlCO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ2pHLElBQUksV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUM5QixNQUFNLE1BQU0s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IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE92ZXJsYXlDb250YWluZXJSZWYgfSBmcm9tICduZy1kZXZ1aS9vdmVybGF5LWNvbnRhaW5lcic7XG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUmVhZFRpcENvbXBvbmVudCB9IGZyb20gJy4vcmVhZC10aXAuY29tcG9uZW50JztcbmltcG9ydCB7IFJlYWRUaXBPcHRpb25zLCBSZWFkVGlwUnVsZSB9IGZyb20gJy4vcmVhZC10aXAudHlwZXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZFJlYWRUaXBdJyxcbiAgZXhwb3J0QXM6ICdkUmVhZFRpcCcsXG59KVxuZXhwb3J0IGNsYXNzIFJlYWRUaXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHJlYWRUaXBDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxSZWFkVGlwQ29tcG9uZW50PjtcblxuICBfcHJldlRhcmdldDtcbiAgZG9jdW1lbnQ6IERvY3VtZW50O1xuXG4gIGRlZmF1bHRPcHRpb25zOiBSZWFkVGlwT3B0aW9ucyA9IHtcbiAgICB0cmlnZ2VyOiAnaG92ZXInLFxuICAgIHNob3dBbmltYXRlOiBmYWxzZSxcbiAgICBtb3VzZWVudGVyVGltZTogMTAwLFxuICAgIG1vdXNlbGVhdmVUaW1lOiAxMDAsXG4gICAgcG9zaXRpb246ICd0b3AnLFxuICAgIG92ZXJsYXlDbGFzc05hbWU6ICcnLFxuICAgIGFwcGVuZFRvQm9keTogdHJ1ZSxcbiAgICBydWxlczogeyBzZWxlY3RvcjogbnVsbCB9LFxuICB9O1xuXG4gIHNldCBwcmV2VGFyZ2V0KHRhcmdldCkge1xuICAgIGlmICh0YXJnZXQgIT09IHRoaXMuX3ByZXZUYXJnZXQpIHtcbiAgICAgIHRoaXMuX3ByZXZUYXJnZXQgPSB0YXJnZXQ7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSByZWFkVGlwT3B0aW9uczogUmVhZFRpcE9wdGlvbnM7XG5cbiAgQElucHV0KCkgY29udGVudFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlb3ZlcicsIFsnJGV2ZW50J10pXG4gIG9uTW91c2VPdmVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5maW5kRWxlbWVudEluZGV4KGV2ZW50LnRhcmdldCwgdGhpcy5yZWFkVGlwT3B0aW9ucz8ucnVsZXMsICdob3ZlcicpLnN1YnNjcmliZSgoZWxlbWVudEluZm8pID0+IHtcbiAgICAgIGlmIChlbGVtZW50SW5mbz8uc2hvdWxkVHJpZ2dlcikge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBuZXcgRWxlbWVudFJlZihldmVudC50YXJnZXQpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93KHRhcmdldCwgZWxlbWVudEluZm8ucnVsZSk7XG4gICAgICAgICAgfSwgZWxlbWVudEluZm8ucnVsZT8ubW91c2VlbnRlclRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZWFkVGlwQ29tcG9uZW50UmVmLmluc3RhbmNlLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZWxlbWVudEluZm8ucnVsZT8ubW91c2VlbnRlclRpbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZW91dCcsIFsnJGV2ZW50J10pXG4gIG9uTW91c2VPdXQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmZpbmRFbGVtZW50SW5kZXgoZXZlbnQudGFyZ2V0LCB0aGlzLnJlYWRUaXBPcHRpb25zPy5ydWxlcywgJ2hvdmVyJykuc3Vic2NyaWJlKChlbGVtZW50SW5mbykgPT4ge1xuICAgICAgaWYgKGVsZW1lbnRJbmZvPy5zaG91bGRUcmlnZ2VyKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9LCBlbGVtZW50SW5mby5ydWxlPy5tb3VzZWxlYXZlVGltZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmZpbmRFbGVtZW50SW5kZXgoZXZlbnQudGFyZ2V0LCB0aGlzLnJlYWRUaXBPcHRpb25zPy5ydWxlcywgJ2NsaWNrJykuc3Vic2NyaWJlKChlbGVtZW50SW5mbykgPT4ge1xuICAgICAgdGhpcy5wcmV2VGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKGVsZW1lbnRJbmZvPy5zaG91bGRUcmlnZ2VyKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkVGlwQ29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbmV3IEVsZW1lbnRSZWYoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgICB0aGlzLnNob3codGFyZ2V0LCBlbGVtZW50SW5mby5ydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWFkVGlwQ29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkVGlwQ29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVhZFRpcENvbXBvbmVudFJlZi5pbnN0YW5jZS51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBvdmVybGF5Q29udGFpbmVyUmVmOiBPdmVybGF5Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgaW5qZWN0OiBJbmplY3RvcixcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueVxuICApIHtcbiAgICB0aGlzLmRvY3VtZW50ID0gdGhpcy5kb2M7XG4gIH1cblxuICBuZ09uSW5pdCgpIHt9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBzaG93KHRhcmdldCwgcnVsZT86IFJlYWRUaXBSdWxlKSB7XG4gICAgdGhpcy5oaWRlKCk7XG4gICAgaWYgKCF0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMuY3JlYXRlUmVhZFRpcCh0YXJnZXQsIHJ1bGUpO1xuICAgIH1cblxuICAgIGlmIChydWxlLnNob3dBbmltYXRlKSB7XG4gICAgICB0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYuaW5zdGFuY2Uuc2hvdygpO1xuICAgIH1cbiAgICBpZiAocnVsZS50cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVJlYWRUaXAodGFyZ2V0LCBydWxlPzogUmVhZFRpcFJ1bGUpIHtcbiAgICBpZiAocnVsZS5hcHBlbmRUb0JvZHkpIHtcbiAgICAgIHRoaXMucmVhZFRpcENvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheUNvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXG4gICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFJlYWRUaXBDb21wb25lbnQpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShSZWFkVGlwQ29tcG9uZW50KSxcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxcbiAgICAgICAgdGhpcy5pbmplY3RcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudFRlbXBsYXRlKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMucmVhZFRpcENvbXBvbmVudFJlZi5pbnN0YW5jZSwge1xuICAgICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnRUZW1wbGF0ZSxcbiAgICAgICAgdHJpZ2dlckVsZW1lbnRSZWY6IHRhcmdldCxcbiAgICAgICAgYXBwZW5kVG9Cb2R5OiBydWxlLmFwcGVuZFRvQm9keSxcbiAgICAgICAgcG9zaXRpb246IHJ1bGUucG9zaXRpb24sXG4gICAgICAgIG92ZXJsYXlDbGFzc05hbWU6IHJ1bGUub3ZlcmxheUNsYXNzTmFtZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocnVsZS5kYXRhRm4pIHtcbiAgICAgICAgcnVsZS5kYXRhRm4oeyBlbGVtZW50OiB0YXJnZXQubmF0aXZlRWxlbWVudCwgcnVsZSB9KS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYuaW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgY29udGVudDogZGF0YS50ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgY3VzdG9tRGF0YTogZGF0YS5jdXN0b21EYXRhLFxuICAgICAgICAgICAgICB0cmlnZ2VyRWxlbWVudFJlZjogdGFyZ2V0LFxuICAgICAgICAgICAgICBhcHBlbmRUb0JvZHk6IHJ1bGUuYXBwZW5kVG9Cb2R5LFxuICAgICAgICAgICAgICBwb3NpdGlvbjogcnVsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgb3ZlcmxheUNsYXNzTmFtZTogcnVsZS5vdmVybGF5Q2xhc3NOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5yZWFkVGlwQ29tcG9uZW50UmVmLmluc3RhbmNlLCB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXG4gICAgICAgICAgICAgIHRyaWdnZXJFbGVtZW50UmVmOiB0YXJnZXQsXG4gICAgICAgICAgICAgIGFwcGVuZFRvQm9keTogcnVsZS5hcHBlbmRUb0JvZHksXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBydWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICBvdmVybGF5Q2xhc3NOYW1lOiBydWxlLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYuaW5zdGFuY2UsIHtcbiAgICAgICAgICBjb250ZW50OiBydWxlLmNvbnRlbnQsXG4gICAgICAgICAgdGl0bGU6IHJ1bGUudGl0bGUsXG4gICAgICAgICAgdHJpZ2dlckVsZW1lbnRSZWY6IHRhcmdldCxcbiAgICAgICAgICBhcHBlbmRUb0JvZHk6IHJ1bGUuYXBwZW5kVG9Cb2R5LFxuICAgICAgICAgIHBvc2l0aW9uOiBydWxlLnBvc2l0aW9uLFxuICAgICAgICAgIG92ZXJsYXlDbGFzc05hbWU6IHJ1bGUub3ZlcmxheUNsYXNzTmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5yZWFkVGlwQ29tcG9uZW50UmVmKSB7XG4gICAgICBpZiAoIXRoaXMucmVhZFRpcE9wdGlvbnMuc2hvd0FuaW1hdGUpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZWFkVGlwQ29tcG9uZW50UmVmLmluc3RhbmNlLmhpZGUoKTtcbiAgICAgIHRoaXMucmVhZFRpcENvbXBvbmVudFJlZi5pbnN0YW5jZS5vbkhpZGRlbiA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucmVhZFRpcENvbXBvbmVudFJlZikge1xuICAgICAgdGhpcy5yZWFkVGlwQ29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMucmVhZFRpcENvbXBvbmVudFJlZiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlYWRUaXBPcHRpb25zLnRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uRG9jdW1lbnRDbGljayk7XG4gICAgfVxuICB9XG5cbiAgb25Eb2N1bWVudENsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuZWwubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAhKHRoaXMucmVhZFRpcENvbXBvbmVudFJlZiAmJiB0aGlzLnJlYWRUaXBDb21wb25lbnRSZWYuaW5zdGFuY2UuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG4gIH07XG5cbiAgZmluZEVsZW1lbnRJbmRleChlbGVtZW50LCBydWxlcywgdHJpZ2dlcikge1xuICAgIGNvbnN0IGtleXNDYW5Jbmhlcml0ID0gWyd0cmlnZ2VyJywgJ3Nob3dBbmltYXRlJywgJ21vdXNlZW50ZXJUaW1lJywgJ21vdXNlbGVhdmVUaW1lJywgJ3Bvc2l0aW9uJywgJ292ZXJsYXlDbGFzc05hbWUnLCAnYXBwZW5kVG9Cb2R5J107XG4gICAgaWYgKHJ1bGVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGxldCBlbGVtZW50SW5kZXggPSAtMTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5pc0NvcnJlY3RFbGVtZW50KHJ1bGVzW2ldLnNlbGVjdG9yLCBlbGVtZW50KSkge1xuICAgICAgICAgIGVsZW1lbnRJbmRleCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAga2V5c0NhbkluaGVyaXQuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChydWxlc1tlbGVtZW50SW5kZXhdKSB7XG4gICAgICAgICAgcnVsZXNbZWxlbWVudEluZGV4XVtrZXldID0gcnVsZXNbZWxlbWVudEluZGV4XVtrZXldIHx8IHRoaXMucmVhZFRpcE9wdGlvbnNba2V5XSB8fCB0aGlzLmRlZmF1bHRPcHRpb25zW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgc2hvdWxkVHJpZ2dlcjogcnVsZXNbZWxlbWVudEluZGV4XT8udHJpZ2dlciA9PT0gdHJpZ2dlciAmJiB0aGlzLmlzQ29ycmVjdEVsZW1lbnQocnVsZXNbZWxlbWVudEluZGV4XT8uc2VsZWN0b3IsIGVsZW1lbnQpLFxuICAgICAgICBydWxlOiBydWxlc1tlbGVtZW50SW5kZXhdLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXNDYW5Jbmhlcml0LmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICBydWxlc1trZXldID0gcnVsZXNba2V5XSB8fCB0aGlzLnJlYWRUaXBPcHRpb25zW2tleV0gfHwgdGhpcy5kZWZhdWx0T3B0aW9uc1trZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvZih7XG4gICAgICAgIHNob3VsZFRyaWdnZXI6IHJ1bGVzPy50cmlnZ2VyID09PSB0cmlnZ2VyICYmIHRoaXMuaXNDb3JyZWN0RWxlbWVudChydWxlcz8uc2VsZWN0b3IsIGVsZW1lbnQpLFxuICAgICAgICBydWxlOiBydWxlcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29ycmVjdEVsZW1lbnQoc2VsZWN0b3I6IHN0cmluZywgZWxlbWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnRzQXJyYXkgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZWxlbWVudHNBcnJheVtpXSA9PT0gZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=