ng-devui
Version:
DevUI components based on Angular
245 lines • 32.3 kB
JavaScript
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=