UNPKG

ngy-tutorial

Version:
291 lines 29.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild, ElementRef, Inject } from '@angular/core'; import { trigger, transition, animate, keyframes, style, query } from '@angular/animations'; import { PromptComponent } from '../prompt/prompt.component'; import { DOCUMENT } from '@angular/common'; import { NgyTutorialService } from '../ngy-tutorial.service'; var NgyTutorialComponent = /** @class */ (function () { function NgyTutorialComponent(svc, document) { var _this = this; this.svc = svc; this.document = document; this.enabled = false; this.steps = []; this.currentStep = 0; this.svc.toShow.subscribe(function (stps) { _this.steps = stps; _this.currentStep = 0; if (_this.steps.length) { _this.enabled = true; setTimeout(function () { _this.setupUIForStep(); }); } else { _this.enabled = false; } }); this.svc.currentStep.subscribe(function (step) { _this.currentStep = step; if (_this.currentStep >= _this.steps.length || _this.currentStep < 0) { _this.svc.hideTutorial(); } if (_this.enabled) { setTimeout(function () { _this.setupUIForStep(); }); } }); } /** * @return {?} */ NgyTutorialComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @private * @return {?} */ NgyTutorialComponent.prototype.setupUIForStep = /** * @private * @return {?} */ function () { /** @type {?} */ var step = this.steps[this.currentStep]; if (step) { this.resetCovers(); this.prompt.ngOnInit(); if (!step.options.relatedElement) { this.coverAll(); } else { /** @type {?} */ var elem = this.document.body.querySelector("#" + step.options.relatedElement); if (elem) { this.coverShowElement(elem); this.prompt.setPromptForElement(elem, step.options.placement); if (step.options.disableInteraction) { this.coverElement(elem); } } else { this.coverAll(); } } } }; /** * @private * @param {?} element * @return {?} */ NgyTutorialComponent.prototype.coverElement = /** * @private * @param {?} element * @return {?} */ function (element) { /** @type {?} */ var positionInfo = element.getBoundingClientRect(); /** @type {?} */ var margin = 10; this.setPosition(this.elementCover.nativeElement, positionInfo.left - margin, positionInfo.top - margin, positionInfo.width + 2 * margin, positionInfo.height + 2 * margin); }; /** * @private * @return {?} */ NgyTutorialComponent.prototype.coverAll = /** * @private * @return {?} */ function () { if (this.topCover) { this.topCover.nativeElement.style.left = '0'; this.topCover.nativeElement.style.top = '0'; this.topCover.nativeElement.style.height = '100vh'; this.prompt.setPromptForElement(); } }; /** * @private * @param {?} element * @return {?} */ NgyTutorialComponent.prototype.coverShowElement = /** * @private * @param {?} element * @return {?} */ function (element) { /** @type {?} */ var positionInfo = element.getBoundingClientRect(); /** @type {?} */ var margin = 10; /** @type {?} */ var viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); /** @type {?} */ var viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); this.setPosition(this.topCover.nativeElement, 0, 0, viewW, positionInfo.top - margin); this.setPosition(this.leftCover.nativeElement, 0, positionInfo.top - margin, positionInfo.left - margin, positionInfo.height + 2 * margin); this.setPosition(this.rightCover.nativeElement, positionInfo.left + positionInfo.width + margin, positionInfo.top - margin, viewW - positionInfo.left - positionInfo.width - margin, positionInfo.height + 2 * margin); this.setPosition(this.bottomCover.nativeElement, 0, positionInfo.top + positionInfo.height + margin, viewW, viewH - positionInfo.top - positionInfo.height - margin); }; /** * @private * @param {?} element * @param {?} left * @param {?} top * @param {?} width * @param {?} height * @return {?} */ NgyTutorialComponent.prototype.setPosition = /** * @private * @param {?} element * @param {?} left * @param {?} top * @param {?} width * @param {?} height * @return {?} */ function (element, left, top, width, height) { element.style.left = left + "px"; element.style.top = top + "px"; element.style.width = width + "px"; element.style.height = height + "px"; }; /** * @private * @return {?} */ NgyTutorialComponent.prototype.resetCovers = /** * @private * @return {?} */ function () { if (this.topCover) { this.topCover.nativeElement.style.removeProperty('height'); this.topCover.nativeElement.style.removeProperty('width'); this.topCover.nativeElement.style.removeProperty('top'); this.topCover.nativeElement.style.removeProperty('left'); } if (this.leftCover) { this.leftCover.nativeElement.style.removeProperty('height'); this.leftCover.nativeElement.style.removeProperty('width'); this.leftCover.nativeElement.style.removeProperty('top'); this.leftCover.nativeElement.style.removeProperty('left'); } if (this.rightCover) { this.rightCover.nativeElement.style.removeProperty('height'); this.rightCover.nativeElement.style.removeProperty('width'); this.rightCover.nativeElement.style.removeProperty('top'); this.rightCover.nativeElement.style.removeProperty('left'); } if (this.bottomCover) { this.bottomCover.nativeElement.style.removeProperty('height'); this.bottomCover.nativeElement.style.removeProperty('width'); this.bottomCover.nativeElement.style.removeProperty('top'); this.bottomCover.nativeElement.style.removeProperty('left'); } if (this.elementCover) { this.elementCover.nativeElement.style.removeProperty('height'); this.elementCover.nativeElement.style.removeProperty('width'); this.elementCover.nativeElement.style.removeProperty('top'); this.elementCover.nativeElement.style.removeProperty('left'); } }; NgyTutorialComponent.decorators = [ { type: Component, args: [{ selector: 'lib-ngy-tutorial', template: "<lib-ngy-tutorial-prompt *ngIf=\"enabled\" @fadeAnimation [step]=\"steps[currentStep]\" [stepNumber]=\"currentStep\" [totalSteps]=\"steps.length\" #prompt></lib-ngy-tutorial-prompt>\n<div class=\"window-cover full-width\" #topCover *ngIf=\"enabled\" @fadeAnimation>\n</div>\n<div class=\"window-cover\" #leftCover *ngIf=\"enabled\" @fadeAnimation>\n</div>\n<div class=\"window-cover\" #rightCover *ngIf=\"enabled\" @fadeAnimation>\n</div>\n<div class=\"window-cover full-width\" #bottomCover *ngIf=\"enabled\" @fadeAnimation>\n</div>\n<div class=\"element-cover\" #elementCover>\n\n</div>", styles: [":host{position:fixed;left:0;top:0;width:0;height:0}.window-cover{position:fixed;background:rgba(0,0,0,.8);z-index:998}.window-cover.full-width{width:100vw}.element-cover{position:fixed;z-index:998}lib-ngy-tutorial-prompt{top:0;left:0;position:fixed;z-index:999}"], animations: [ trigger('fadeAnimation', [ transition('void => *', [ query(':self', animate('0.3s ease-in-out', keyframes([ style({ opacity: 0 }), style({ opacity: 1 }), ])), { optional: true }), ]), transition('* => void', [ query(':self', animate('0.3s ease-in-out', keyframes([ style({ opacity: 1 }), style({ opacity: 0 }), ])), { optional: true }), ]), ]), ] },] }, ]; NgyTutorialComponent.ctorParameters = function () { return [ { type: NgyTutorialService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; }; NgyTutorialComponent.propDecorators = { topCover: [{ type: ViewChild, args: ['topCover',] }], leftCover: [{ type: ViewChild, args: ['leftCover',] }], rightCover: [{ type: ViewChild, args: ['rightCover',] }], bottomCover: [{ type: ViewChild, args: ['bottomCover',] }], elementCover: [{ type: ViewChild, args: ['elementCover',] }], prompt: [{ type: ViewChild, args: ['prompt',] }] }; return NgyTutorialComponent; }()); export { NgyTutorialComponent }; if (false) { /** @type {?} */ NgyTutorialComponent.prototype.enabled; /** @type {?} */ NgyTutorialComponent.prototype.steps; /** @type {?} */ NgyTutorialComponent.prototype.currentStep; /** * @type {?} * @private */ NgyTutorialComponent.prototype.topCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.leftCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.rightCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.bottomCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.elementCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.prompt; /** * @type {?} * @private */ NgyTutorialComponent.prototype.svc; /** * @type {?} * @private */ NgyTutorialComponent.prototype.document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHV0b3JpYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd5LXR1dG9yaWFsLyIsInNvdXJjZXMiOlsibGliL3R1dG9yaWFsL3R1dG9yaWFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTdEO0lBNkNFLDhCQUNVLEdBQXVCLEVBQ0wsUUFBYTtRQUZ6QyxpQkEyQkM7UUExQlMsUUFBRyxHQUFILEdBQUcsQ0FBb0I7UUFDTCxhQUFRLEdBQVIsUUFBUSxDQUFLO1FBWHpDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsVUFBSyxHQUFvQixFQUFFLENBQUM7UUFDNUIsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFXZCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQzVCLEtBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLEtBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksS0FBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JCLEtBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixVQUFVLENBQUM7b0JBQ1QsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QixDQUFDLENBQUMsQ0FB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a0I7Z0RBaUR0QixNQUFNLFNBQUMsUUFBUTs7OzJCQVJqQixTQUFTLFNBQUMsVUFBVTs0QkFDcEIsU0FBUyxTQUFDLFdBQVc7NkJBQ3JCLFNBQVMsU0FBQyxZQUFZOzhCQUN0QixTQUFTLFNBQUMsYUFBYTsrQkFDdkIsU0FBUyxTQUFDLGNBQWM7eUJBQ3hCLFNBQVMsU0FBQyxRQUFROztJQTBJckIsMkJBQUM7Q0FBQSxBQXRMRCxJQXNMQztTQXBKWSxvQkFBb0I7OztJQUUvQix1Q0FBZ0I7O0lBQ2hCLHFDQUE0Qjs7SUFDNUIsMkNBQWdCOzs7OztJQUNoQix3Q0FBb0Q7Ozs7O0lBQ3BELHlDQUFzRDs7Ozs7SUFDdEQsMENBQXdEOzs7OztJQUN4RCwyQ0FBMEQ7Ozs7O0lBQzFELDRDQUE0RDs7Ozs7SUFDNUQsc0NBQXFEOzs7OztJQUVuRCxtQ0FBK0I7Ozs7O0lBQy9CLHdDQUF1QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdHJpZ2dlciwgdHJhbnNpdGlvbiwgYW5pbWF0ZSwga2V5ZnJhbWVzLCBzdHlsZSwgcXVlcnkgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IElUdXRvcmlhbFN0ZXAgfSBmcm9tICcuLi9hcGkvaS10dXRvcmlhbC1zdGVwJztcbmltcG9ydCB7IFByb21wdENvbXBvbmVudCB9IGZyb20gJy4uL3Byb21wdC9wcm9tcHQuY29tcG9uZW50JztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFN0ZXBQcm9tcHRQbGFjZW1lbnQgfSBmcm9tICcuLi9hcGkvaS1vcHRpb25zJztcbmltcG9ydCB7IE5neVR1dG9yaWFsU2VydmljZSB9IGZyb20gJy4uL25neS10dXRvcmlhbC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW5neS10dXRvcmlhbCcsXG4gIHRlbXBsYXRlOiBgPGxpYi1uZ3ktdHV0b3JpYWwtcHJvbXB0ICpuZ0lmPVwiZW5hYmxlZFwiIEBmYWRlQW5pbWF0aW9uIFtzdGVwXT1cInN0ZXBzW2N1cnJlbnRTdGVwXVwiIFtzdGVwTnVtYmVyXT1cImN1cnJlbnRTdGVwXCIgW3RvdGFsU3RlcHNdPVwic3RlcHMubGVuZ3RoXCIgI3Byb21wdD48L2xpYi1uZ3ktdHV0b3JpYWwtcHJvbXB0PlxuPGRpdiBjbGFzcz1cIndpbmRvdy1jb3ZlciBmdWxsLXdpZHRoXCIgI3RvcENvdmVyICpuZ0lmPVwiZW5hYmxlZFwiIEBmYWRlQW5pbWF0aW9uPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwid2luZG93LWNvdmVyXCIgI2xlZnRDb3ZlciAqbmdJZj1cImVuYWJsZWRcIiBAZmFkZUFuaW1hdGlvbj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cIndpbmRvdy1jb3ZlclwiICNyaWdodENvdmVyICpuZ0lmPVwiZW5hYmxlZFwiIEBmYWRlQW5pbWF0aW9uPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwid2luZG93LWNvdmVyIGZ1bGwtd2lkdGhcIiAjYm90dG9tQ292ZXIgKm5nSWY9XCJlbmFibGVkXCIgQGZhZGVBbmltYXRpb24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJlbGVtZW50LWNvdmVyXCIgI2VsZW1lbnRDb3Zlcj5cblxuPC9kaXY+YCxcbiAgc3R5bGVzOiBbYDpob3N0e3Bvc2l0aW9uOmZpeGVkO2xlZnQ6MDt0b3A6MDt3aWR0aDowO2hlaWdodDowfS53aW5kb3ctY292ZXJ7cG9zaXRpb246Zml4ZWQ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC44KTt6LWluZGV4Ojk5OH0ud2luZG93LWNvdmVyLmZ1bGwtd2lkdGh7d2lkdGg6MTAwdnd9LmVsZW1lbnQtY292ZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDo5OTh9bGliLW5neS10dXRvcmlhbC1wcm9tcHR7dG9wOjA7bGVmdDowO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6OTk5fWBdLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignZmFkZUFuaW1hdGlvbicsIFtcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcbiAgICAgICAgcXVlcnkoJzpzZWxmJyxcbiAgICAgICAgICBhbmltYXRlKCcwLjNzIGVhc2UtaW4tb3V0Jywga2V5ZnJhbWVzKFtcbiAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMCB9KSxcbiAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMSB9KSxcbiAgICAgICAgICBdKSksIHsgb3B0aW9uYWw6IHRydWUgfSksXG4gICAgICBdKSxcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIFtcbiAgICAgICAgcXVlcnkoJzpzZWxmJyxcbiAgICAgICAgICBhbmltYXRlKCcwLjNzIGVhc2UtaW4tb3V0Jywga2V5ZnJhbWVzKFtcbiAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMSB9KSxcbiAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMCB9KSxcbiAgICAgICAgICBdKSksIHsgb3B0aW9uYWw6IHRydWUgfSksXG4gICAgICBdKSxcbiAgICBdKSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3lUdXRvcmlhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgZW5hYmxlZCA9IGZhbHNlO1xuICBzdGVwczogSVR1dG9yaWFsU3RlcFtdID0gW107XG4gIGN1cnJlbnRTdGVwID0gMDtcbiAgQFZpZXdDaGlsZCgndG9wQ292ZXInKSBwcml2YXRlIHRvcENvdmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdsZWZ0Q292ZXInKSBwcml2YXRlIGxlZnRDb3ZlcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncmlnaHRDb3ZlcicpIHByaXZhdGUgcmlnaHRDb3ZlcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnYm90dG9tQ292ZXInKSBwcml2YXRlIGJvdHRvbUNvdmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdlbGVtZW50Q292ZXInKSBwcml2YXRlIGVsZW1lbnRDb3ZlcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncHJvbXB0JykgcHJpdmF0ZSBwcm9tcHQ6IFByb21wdENvbXBvbmVudDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdmM6IE5neVR1dG9yaWFsU2VydmljZSxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXG4gICkge1xuICAgIHRoaXMuc3ZjLnRvU2hvdy5zdWJzY3JpYmUoc3RwcyA9PiB7XG4gICAgICB0aGlzLnN0ZXBzID0gc3RwcztcbiAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSAwO1xuICAgICAgaWYgKHRoaXMuc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dXBVSUZvclN0ZXAoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnN2Yy5jdXJyZW50U3RlcC5zdWJzY3JpYmUoc3RlcCA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGVwID0gc3RlcDtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID49IHRoaXMuc3RlcHMubGVuZ3RoIHx8IHRoaXMuY3VycmVudFN0ZXAgPCAwKSB7XG4gICAgICAgIHRoaXMuc3ZjLmhpZGVUdXRvcmlhbCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5hYmxlZCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldHVwVUlGb3JTdGVwKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBVSUZvclN0ZXAoKSB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcF07XG4gICAgaWYgKHN0ZXApIHtcbiAgICAgIHRoaXMucmVzZXRDb3ZlcnMoKTtcbiAgICAgIHRoaXMucHJvbXB0Lm5nT25Jbml0KCk7XG4gICAgICBpZiAoIXN0ZXAub3B0aW9ucy5yZWxhdGVkRWxlbWVudCkge1xuICAgICAgICB0aGlzLmNvdmVyQWxsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3IoYCMke3N0ZXAub3B0aW9ucy5yZWxhdGVkRWxlbWVudH1gKTtcbiAgICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgICB0aGlzLmNvdmVyU2hvd0VsZW1lbnQoZWxlbSk7XG4gICAgICAgICAgdGhpcy5wcm9tcHQuc2V0UHJvbXB0Rm9yRWxlbWVudChlbGVtLCBzdGVwLm9wdGlvbnMucGxhY2VtZW50KTtcbiAgICAgICAgICBpZiAoc3RlcC5vcHRpb25zLmRpc2FibGVJbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb3ZlckVsZW1lbnQoZWxlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY292ZXJBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGNvdmVyRWxlbWVudChlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgY29uc3QgcG9zaXRpb25JbmZvID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtYXJnaW4gPSAxMDtcbiAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuZWxlbWVudENvdmVyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBwb3NpdGlvbkluZm8ubGVmdCAtIG1hcmdpbixcbiAgICAgIHBvc2l0aW9uSW5mby50b3AgLSBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8ud2lkdGggKyAyICogbWFyZ2luLFxuICAgICAgcG9zaXRpb25JbmZvLmhlaWdodCArIDIgKiBtYXJnaW4pO1xuICB9XG4gIHByaXZhdGUgY292ZXJBbGwoKSB7XG4gICAgaWYgKHRoaXMudG9wQ292ZXIpIHtcbiAgICAgIHRoaXMudG9wQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgIHRoaXMudG9wQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwdmgnO1xuICAgICAgdGhpcy5wcm9tcHQuc2V0UHJvbXB0Rm9yRWxlbWVudCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNvdmVyU2hvd0VsZW1lbnQoZWxlbWVudDogRWxlbWVudCkge1xuICAgIGNvbnN0IHBvc2l0aW9uSW5mbyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbWFyZ2luID0gMTA7XG4gICAgY29uc3Qgdmlld1cgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICAgIGNvbnN0IHZpZXdIID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB2aWV3VyxcbiAgICAgIHBvc2l0aW9uSW5mby50b3AgLSBtYXJnaW4pO1xuICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5sZWZ0Q292ZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIDAsXG4gICAgICBwb3NpdGlvbkluZm8udG9wIC0gbWFyZ2luLFxuICAgICAgcG9zaXRpb25JbmZvLmxlZnQgLSBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8uaGVpZ2h0ICsgMiAqIG1hcmdpbik7XG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLnJpZ2h0Q292ZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIHBvc2l0aW9uSW5mby5sZWZ0ICsgcG9zaXRpb25JbmZvLndpZHRoICsgbWFyZ2luLFxuICAgICAgcG9zaXRpb25JbmZvLnRvcCAtIG1hcmdpbixcbiAgICAgIHZpZXdXIC0gcG9zaXRpb25JbmZvLmxlZnQgLSBwb3NpdGlvbkluZm8ud2lkdGggLSBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8uaGVpZ2h0ICsgMiAqIG1hcmdpbik7XG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLmJvdHRvbUNvdmVyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAwLFxuICAgICAgcG9zaXRpb25JbmZvLnRvcCArIHBvc2l0aW9uSW5mby5oZWlnaHQgKyBtYXJnaW4sXG4gICAgICB2aWV3VyxcbiAgICAgIHZpZXdIIC0gcG9zaXRpb25JbmZvLnRvcCAtIHBvc2l0aW9uSW5mby5oZWlnaHQgLSBtYXJnaW4pO1xuXG4gIH1cblxuICBwcml2YXRlIHNldFBvc2l0aW9uKGVsZW1lbnQ6IGFueSwgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gIH1cbiAgcHJpdmF0ZSByZXNldENvdmVycygpIHtcbiAgICBpZiAodGhpcy50b3BDb3Zlcikge1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdoZWlnaHQnKTtcbiAgICAgIHRoaXMudG9wQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIHRoaXMudG9wQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndG9wJyk7XG4gICAgICB0aGlzLnRvcENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGVmdENvdmVyKSB7XG4gICAgICB0aGlzLmxlZnRDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdoZWlnaHQnKTtcbiAgICAgIHRoaXMubGVmdENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3dpZHRoJyk7XG4gICAgICB0aGlzLmxlZnRDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIHRoaXMubGVmdENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmlnaHRDb3Zlcikge1xuICAgICAgdGhpcy5yaWdodENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy5yaWdodENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3dpZHRoJyk7XG4gICAgICB0aGlzLnJpZ2h0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndG9wJyk7XG4gICAgICB0aGlzLnJpZ2h0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ib3R0b21Db3Zlcikge1xuICAgICAgdGhpcy5ib3R0b21Db3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdoZWlnaHQnKTtcbiAgICAgIHRoaXMuYm90dG9tQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIHRoaXMuYm90dG9tQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndG9wJyk7XG4gICAgICB0aGlzLmJvdHRvbUNvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZWxlbWVudENvdmVyKSB7XG4gICAgICB0aGlzLmVsZW1lbnRDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdoZWlnaHQnKTtcbiAgICAgIHRoaXMuZWxlbWVudENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3dpZHRoJyk7XG4gICAgICB0aGlzLmVsZW1lbnRDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIHRoaXMuZWxlbWVudENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTtcbiAgICB9XG4gIH1cbn1cblxuIl19