ng-devui
Version:
DevUI components based on Angular
111 lines • 24.4 kB
JavaScript
import { Component, ComponentFactoryResolver, Input } from '@angular/core';
import { I18nService } from 'ng-devui/i18n';
import { OverlayContainerRef } from 'ng-devui/overlay-container';
import { UserGuideCoreService } from './user-guide-core.service';
import { UserGuideUIComponent } from './user-guide-ui.component';
import * as i0 from "@angular/core";
import * as i1 from "ng-devui/overlay-container";
import * as i2 from "./user-guide-core.service";
import * as i3 from "ng-devui/i18n";
import * as i4 from "@angular/common";
import * as i5 from "ng-devui/dropdown";
export class UserGuideComponent {
constructor(componentFactoryResolver, overlayContainerRef, userGuideCoreService, i18n) {
this.componentFactoryResolver = componentFactoryResolver;
this.overlayContainerRef = overlayContainerRef;
this.userGuideCoreService = userGuideCoreService;
this.i18n = i18n;
this.userGuideEntrancePosition = { bottom: '30px', left: '30px' };
this.showUserGuideEntrance = true;
}
ngOnInit() {
this.firstOpenShow = localStorage.getItem('devui-user-guide-first-open-show') || 'true';
this.i18nCommonText = this.i18n.getI18nText().userGuide;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nCommonText = data.userGuide;
});
}
ngAfterViewInit() {
setTimeout(() => {
for (let i = 0; i < this.steps.length; i++) {
if (this.steps[i]?.defaultStart === true && this.firstOpenShow === 'true') {
this.start(i);
try {
localStorage.setItem('devui-user-guide-first-open-show', 'false');
}
catch (error) {
console.error(error);
}
break;
}
}
}, 0);
}
ngOnDestroy() {
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
}
start(index) {
this.userGuideCoreService.setSteps(this.steps[index].detail);
if (this.steps[index].onExit) {
this.userGuideCoreService.setExitFunction(this.steps[index].onExit);
}
this.userGuideCoreService.isFinished.subscribe((item) => {
this.steps[index].isFinished = item;
if (item === true) {
if (this.modalRef) {
this.modalRef.hostView.destroy();
}
}
});
this.userGuideCoreService.start();
this.createGuide(index);
this.userGuideCoreService.next();
this.currentTutorial = index;
try {
localStorage.setItem('devui-user-guide-last-tutorial', index.toString());
}
catch (error) {
console.error(error);
}
}
goStep(index) {
let realStep = index;
for (let i = 0; i < index; i++) {
if (this.steps[this.currentTutorial].detail[i].type === 'interactable'
&& this.steps[this.currentTutorial].detail[i].eventType === 'clickable') {
realStep = i;
break;
}
}
this.userGuideCoreService.goStep(realStep);
}
createGuide(index) {
this.modalRef = this.overlayContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(UserGuideUIComponent));
this.modalRef.instance.showDots = this.steps[index]?.showDots;
this.modalRef.instance.maxContentWidth = this.steps[index]?.maxContentWidth ? this.steps[index]?.maxContentWidth : 320;
this.modalRef.instance.isCover = this.steps[index]?.isCover === undefined ? true : this.steps[index]?.isCover;
this.modalRef.instance.extraConfig = this.steps[index]?.extraConfig;
this.modalRef.instance.close = () => {
if (this.modalRef) {
this.modalRef.hostView.destroy();
}
};
const panel = document.querySelector('.user-guide-panel');
panel.style.visibility = 'hidden';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserGuideComponent, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.OverlayContainerRef }, { token: i2.UserGuideCoreService }, { token: i3.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserGuideComponent, selector: "d-user-guide", inputs: { steps: "steps", userGuideEntrancePosition: "userGuideEntrancePosition", showUserGuideEntrance: "showUserGuideEntrance" }, ngImport: i0, template: "<div class=\"user-guide-wapper\" dDropDown appendToBody>\n <div\n dDropDownToggle\n class=\"user-guide\"\n [style.bottom]=\"userGuideEntrancePosition.bottom\"\n [style.left]=\"userGuideEntrancePosition.left\"\n [class.user-guide-hidden]=\"showUserGuideEntrance === false\"\n >\n <div class=\"user-guide-text\">{{ i18nCommonText.guide }}</div>\n </div>\n <div dDropDownMenu class=\"user-guide-window\">\n <ul>\n <li *ngFor=\"let step of steps; let i = index\" role=\"menuitem\" class=\"devui-dropdown-item\" (click)=\"start(i)\">\n <div class=\"step\">\n <div class=\"left-item\">\n <div class=\"title\">{{ step.title }}</div>\n <div class=\"desc\">{{ step.desc }}</div>\n </div>\n <div class=\"right-item\">\n <i *ngIf=\"step.isFinished\" class=\"icon icon-right-o\" style=\"color: rgb(61, 204, 166); font-size: 16px\"></i>\n </div>\n </div>\n </li>\n </ul>\n </div>\n</div>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.user-guide{width:60px;height:60px;border-radius:50%;color:var(--devui-light-text, #ffffff);background-color:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16));position:fixed;z-index:calc(var(--devui-z-index-full-page-overlay, 1080) - 1)}.user-guide-hidden{visibility:hidden}.user-guide-text{line-height:60px;text-align:center;font-weight:700}.user-guide:hover{cursor:pointer;box-shadow:var(--devui-shadow-length-hover, 0 8px 24px 0) var(--devui-hover-shadow, rgba(0, 0, 0, .16))}.user-guide-window{width:200px}.user-guide-window li{padding:8px 12px 8px 20px;cursor:pointer}.user-guide-window li .step{display:flex;justify-content:space-between;align-items:center}.user-guide-window li .title{font-size:var(--devui-font-size, 12px);font-weight:700}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DropDownDirective, selector: "[dDropDown]", inputs: ["isOpen", "disabled", "showAnimation", "trigger", "closeScope", "closeOnMouseLeaveMenu", "autofocusToggleElement"], outputs: ["toggleEvent"], exportAs: ["d-dropdown"] }, { kind: "directive", type: i5.DropDownMenuDirective, selector: "[dDropDownMenu]", exportAs: ["d-dropdown-menu"] }, { kind: "directive", type: i5.DropDownToggleDirective, selector: "[dDropDownToggle]", inputs: ["toggleOnFocus", "autoFocus"], exportAs: ["d-dropdown-toggle"] }, { kind: "component", type: i5.DropDownAppendToBodyComponent, selector: "[dDropDown][appendToBody]", inputs: ["alignOrigin", "appendToBodyDirections", "appendToBodyScrollStrategy"], exportAs: ["d-dropdown-append-to-body"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserGuideComponent, decorators: [{
type: Component,
args: [{ selector: 'd-user-guide', template: "<div class=\"user-guide-wapper\" dDropDown appendToBody>\n <div\n dDropDownToggle\n class=\"user-guide\"\n [style.bottom]=\"userGuideEntrancePosition.bottom\"\n [style.left]=\"userGuideEntrancePosition.left\"\n [class.user-guide-hidden]=\"showUserGuideEntrance === false\"\n >\n <div class=\"user-guide-text\">{{ i18nCommonText.guide }}</div>\n </div>\n <div dDropDownMenu class=\"user-guide-window\">\n <ul>\n <li *ngFor=\"let step of steps; let i = index\" role=\"menuitem\" class=\"devui-dropdown-item\" (click)=\"start(i)\">\n <div class=\"step\">\n <div class=\"left-item\">\n <div class=\"title\">{{ step.title }}</div>\n <div class=\"desc\">{{ step.desc }}</div>\n </div>\n <div class=\"right-item\">\n <i *ngIf=\"step.isFinished\" class=\"icon icon-right-o\" style=\"color: rgb(61, 204, 166); font-size: 16px\"></i>\n </div>\n </div>\n </li>\n </ul>\n </div>\n</div>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.user-guide{width:60px;height:60px;border-radius:50%;color:var(--devui-light-text, #ffffff);background-color:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16));position:fixed;z-index:calc(var(--devui-z-index-full-page-overlay, 1080) - 1)}.user-guide-hidden{visibility:hidden}.user-guide-text{line-height:60px;text-align:center;font-weight:700}.user-guide:hover{cursor:pointer;box-shadow:var(--devui-shadow-length-hover, 0 8px 24px 0) var(--devui-hover-shadow, rgba(0, 0, 0, .16))}.user-guide-window{width:200px}.user-guide-window li{padding:8px 12px 8px 20px;cursor:pointer}.user-guide-window li .step{display:flex;justify-content:space-between;align-items:center}.user-guide-window li .title{font-size:var(--devui-font-size, 12px);font-weight:700}\n"] }]
}], ctorParameters: () => [{ type: i0.ComponentFactoryResolver }, { type: i1.OverlayContainerRef }, { type: i2.UserGuideCoreService }, { type: i3.I18nService }], propDecorators: { steps: [{
type: Input
}], userGuideEntrancePosition: [{
type: Input
}], showUserGuideEntrance: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ndWlkZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS91c2VyLWd1aWRlL3VzZXItZ3VpZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvdXNlci1ndWlkZS91c2VyLWd1aWRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDVSxTQUFTLEVBQ3hCLHdCQUF3QixFQUV4QixLQUFLLEVBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7QUFPakUsTUFBTSxPQUFPLGtCQUFrQjtJQVc3QixZQUFvQix3QkFBa0QsRUFDbEQsbUJBQXdDLEVBQ3hDLG9CQUEwQyxFQUMxQyxJQUFpQjtRQUhqQiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBWjVCLDhCQUF5QixHQUFHLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUM7UUFDM0QsMEJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBV0csQ0FBQztJQUMxQyxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLElBQUksTUFBTSxDQUFDO1FBRXhGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FB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QUMsRUFBRSxPQUFPLENBQUM7UUFDN0csSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUU7WUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFnQixDQUFDO1FBQ3pFLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztJQUNwQyxDQUFDOytHQXZHVSxrQkFBa0I7bUdBQWxCLGtCQUFrQix3TENuQi9CLHcrQkEwQkE7OzRGRFBhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxjQUFjOzRMQUtmLEtBQUs7c0JBQWIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbXBvbmVudFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcbmltcG9ydCB7IE92ZXJsYXlDb250YWluZXJSZWYgfSBmcm9tICduZy1kZXZ1aS9vdmVybGF5LWNvbnRhaW5lcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVzZXJHdWlkZUNvcmVTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLWd1aWRlLWNvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyR3VpZGVVSUNvbXBvbmVudCB9IGZyb20gJy4vdXNlci1ndWlkZS11aS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkLXVzZXItZ3VpZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1ndWlkZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItZ3VpZGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBVc2VyR3VpZGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHN0ZXBzO1xuICBASW5wdXQoKSB1c2VyR3VpZGVFbnRyYW5jZVBvc2l0aW9uID0ge2JvdHRvbTogJzMwcHgnLCBsZWZ0OiAnMzBweCd9O1xuICBASW5wdXQoKSBzaG93VXNlckd1aWRlRW50cmFuY2UgPSB0cnVlO1xuICBmaXJzdE9wZW5TaG93OiBzdHJpbmc7XG4gIGkxOG5Db21tb25UZXh0OiBJMThuSW50ZXJmYWNlWyd1c2VyR3VpZGUnXTtcbiAgaTE4blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGN1cnJlbnRUdXRvcmlhbDogbnVtYmVyO1xuXG4gIG1vZGFsUmVmOiBDb21wb25lbnRSZWY8VXNlckd1aWRlVUlDb21wb25lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgb3ZlcmxheUNvbnRhaW5lclJlZjogT3ZlcmxheUNvbnRhaW5lclJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB1c2VyR3VpZGVDb3JlU2VydmljZTogVXNlckd1aWRlQ29yZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UpIHsgfVxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZpcnN0T3BlblNob3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGV2dWktdXNlci1ndWlkZS1maXJzdC1vcGVuLXNob3cnKSB8fCAndHJ1ZSc7XG5cbiAgICB0aGlzLmkxOG5Db21tb25UZXh0ID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkudXNlckd1aWRlO1xuICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbiA9IHRoaXMuaTE4bi5sYW5nQ2hhbmdlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmkxOG5Db21tb25UZXh0ID0gZGF0YS51c2VyR3VpZGU7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuc3RlcHNbaV0/LmRlZmF1bHRTdGFydCA9PT0gdHJ1ZSAmJiB0aGlzLmZpcnN0T3BlblNob3cgPT09ICd0cnVlJykge1xuICAgICAgICAgIHRoaXMuc3RhcnQoaSk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RldnVpLXVzZXItZ3VpZGUtZmlyc3Qtb3Blbi1zaG93JywgJ2ZhbHNlJyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5pMThuU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmkxOG5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBzdGFydChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy51c2VyR3VpZGVDb3JlU2VydmljZS5zZXRTdGVwcyh0aGlzLnN0ZXBzW2luZGV4XS5kZXRhaWwpO1xuICAgIGlmICh0aGlzLnN0ZXBzW2luZGV4XS5vbkV4aXQpIHtcbiAgICAgIHRoaXMudXNlckd1aWRlQ29yZVNlcnZpY2Uuc2V0RXhpdEZ1bmN0aW9uKHRoaXMuc3RlcHNbaW5kZXhdLm9uRXhpdCk7XG4gICAgfVxuICAgIHRoaXMudXNlckd1aWRlQ29yZVNlcnZpY2UuaXNGaW5pc2hlZC5zdWJzY3JpYmUoKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMuc3RlcHNbaW5kZXhdLmlzRmluaXNoZWQgPSBpdGVtO1xuICAgICAgaWYgKGl0ZW0gPT09IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgICAgICB0aGlzLm1vZGFsUmVmLmhvc3RWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudXNlckd1aWRlQ29yZVNlcnZpY2Uuc3RhcnQoKTtcbiAgICB0aGlzLmNyZWF0ZUd1aWRlKGluZGV4KTtcblxuICAgIHRoaXMudXNlckd1aWRlQ29yZVNlcnZpY2UubmV4dCgpO1xuXG4gICAgdGhpcy5jdXJyZW50VHV0b3JpYWwgPSBpbmRleDtcblxuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZGV2dWktdXNlci1ndWlkZS1sYXN0LXR1dG9yaWFsJywgaW5kZXgudG9TdHJpbmcoKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGdvU3RlcChpbmRleDogbnVtYmVyKSB7XG4gICAgbGV0IHJlYWxTdGVwID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDAgOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50VHV0b3JpYWxdLmRldGFpbFtpXS50eXBlID09PSAnaW50ZXJhY3RhYmxlJ1xuICAgICAgICAmJiB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFR1dG9yaWFsXS5kZXRhaWxbaV0uZXZlbnRUeXBlID09PSAnY2xpY2thYmxlJykge1xuICAgICAgICByZWFsU3RlcCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVzZXJHdWlkZUNvcmVTZXJ2aWNlLmdvU3RlcChyZWFsU3RlcCk7XG4gIH1cblxuICBjcmVhdGVHdWlkZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMub3ZlcmxheUNvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXG4gICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShVc2VyR3VpZGVVSUNvbXBvbmVudClcbiAgICApO1xuICAgIHRoaXMubW9kYWxSZWYuaW5zdGFuY2Uuc2hvd0RvdHMgPSB0aGlzLnN0ZXBzW2luZGV4XT8uc2hvd0RvdHM7XG4gICAgdGhpcy5tb2RhbFJlZi5pbnN0YW5jZS5tYXhDb250ZW50V2lkdGggPSB0aGlzLnN0ZXBzW2luZGV4XT8ubWF4Q29udGVudFdpZHRoID8gdGhpcy5zdGVwc1tpbmRleF0/Lm1heENvbnRlbnRXaWR0aCA6IDMyMDtcbiAgICB0aGlzLm1vZGFsUmVmLmluc3RhbmNlLmlzQ292ZXIgPSB0aGlzLnN0ZXBzW2luZGV4XT8uaXNDb3ZlciA9PT0gdW5kZWZpbmVkID8gdHJ1ZTogdGhpcy5zdGVwc1tpbmRleF0/LmlzQ292ZXI7XG4gICAgdGhpcy5tb2RhbFJlZi5pbnN0YW5jZS5leHRyYUNvbmZpZyA9IHRoaXMuc3RlcHNbaW5kZXhdPy5leHRyYUNvbmZpZztcbiAgICB0aGlzLm1vZGFsUmVmLmluc3RhbmNlLmNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZi5ob3N0Vmlldy5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnVzZXItZ3VpZGUtcGFuZWwnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBwYW5lbC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInVzZXItZ3VpZGUtd2FwcGVyXCIgZERyb3BEb3duIGFwcGVuZFRvQm9keT5cbiAgPGRpdlxuICAgIGREcm9wRG93blRvZ2dsZVxuICAgIGNsYXNzPVwidXNlci1ndWlkZVwiXG4gICAgW3N0eWxlLmJvdHRvbV09XCJ1c2VyR3VpZGVFbnRyYW5jZVBvc2l0aW9uLmJvdHRvbVwiXG4gICAgW3N0eWxlLmxlZnRdPVwidXNlckd1aWRlRW50cmFuY2VQb3NpdGlvbi5sZWZ0XCJcbiAgICBbY2xhc3MudXNlci1ndWlkZS1oaWRkZW5dPVwic2hvd1VzZXJHdWlkZUVudHJhbmNlID09PSBmYWxzZVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1ndWlkZS10ZXh0XCI+e3sgaTE4bkNvbW1vblRleHQuZ3VpZGUgfX08L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgZERyb3BEb3duTWVudSBjbGFzcz1cInVzZXItZ3VpZGUtd2luZG93XCI+XG4gICAgPHVsPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgcm9sZT1cIm1lbnVpdGVtXCIgY2xhc3M9XCJkZXZ1aS1kcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInN0YXJ0KGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtaXRlbVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgc3RlcC50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NcIj57eyBzdGVwLmRlc2MgfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtaXRlbVwiPlxuICAgICAgICAgICAgPGkgKm5nSWY9XCJzdGVwLmlzRmluaXNoZWRcIiBjbGFzcz1cImljb24gaWNvbi1yaWdodC1vXCIgc3R5bGU9XCJjb2xvcjogcmdiKDYxLCAyMDQsIDE2Nik7IGZvbnQtc2l6ZTogMTZweFwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=