UNPKG

ngx-guided-tour

Version:

Guided tour for your Angular6+ applications.

420 lines 37.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { debounceTime } from 'rxjs/operators'; import { ErrorHandler, Inject, Injectable } from '@angular/core'; import { Subject, fromEvent } from 'rxjs'; import { Orientation } from './guided-tour.constants'; import { cloneDeep } from 'lodash'; import { DOCUMENT } from "@angular/common"; import { WindowRefService } from "./windowref.service"; var GuidedTourService = /** @class */ (function () { function GuidedTourService(errorHandler, windowRef, dom) { var _this = this; this.errorHandler = errorHandler; this.windowRef = windowRef; this.dom = dom; this._guidedTourCurrentStepSubject = new Subject(); this._guidedTourOrbShowingSubject = new Subject(); this._currentTourStepIndex = 0; this._currentTour = null; this._onFirstStep = true; this._onLastStep = true; this._onResizeMessage = false; this.guidedTourCurrentStepStream = this._guidedTourCurrentStepSubject.asObservable(); this.guidedTourOrbShowingStream = this._guidedTourOrbShowingSubject.asObservable(); fromEvent(this.windowRef.nativeWindow, 'resize').pipe(debounceTime(200)).subscribe((/** * @return {?} */ function () { if (_this._currentTour && _this._currentTourStepIndex > -1) { if (_this._currentTour.minimumScreenSize && _this._currentTour.minimumScreenSize >= _this.windowRef.nativeWindow.innerWidth) { _this._onResizeMessage = true; /** @type {?} */ var dialog = _this._currentTour.resizeDialog || { title: 'Please resize', content: 'You have resized the tour to a size that is too small to continue. Please resize the browser to a larger size to continue the tour or close the tour.' }; _this._guidedTourCurrentStepSubject.next(dialog); } else { _this._onResizeMessage = false; _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } } })); } /** * @return {?} */ GuidedTourService.prototype.nextStep = /** * @return {?} */ function () { var _this = this; if (this._currentTour.steps[this._currentTourStepIndex].closeAction) { this._currentTour.steps[this._currentTourStepIndex].closeAction(); } if (this._currentTour.steps[this._currentTourStepIndex + 1]) { this._currentTourStepIndex++; this._setFirstAndLast(); if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); // Usually an action is opening something so we need to give it time to render. setTimeout((/** * @return {?} */ function () { if (_this._checkSelectorValidity()) { _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } else { _this.nextStep(); } })); } else { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } } } else { if (this._currentTour.completeCallback) { this._currentTour.completeCallback(); } this.resetTour(); } }; /** * @return {?} */ GuidedTourService.prototype.backStep = /** * @return {?} */ function () { var _this = this; if (this._currentTour.steps[this._currentTourStepIndex].closeAction) { this._currentTour.steps[this._currentTourStepIndex].closeAction(); } if (this._currentTour.steps[this._currentTourStepIndex - 1]) { this._currentTourStepIndex--; this._setFirstAndLast(); if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); setTimeout((/** * @return {?} */ function () { if (_this._checkSelectorValidity()) { _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } else { _this.backStep(); } })); } else { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.backStep(); } } } else { this.resetTour(); } }; /** * @return {?} */ GuidedTourService.prototype.skipTour = /** * @return {?} */ function () { if (this._currentTour.skipCallback) { this._currentTour.skipCallback(this._currentTourStepIndex); } this.resetTour(); }; /** * @return {?} */ GuidedTourService.prototype.resetTour = /** * @return {?} */ function () { this.dom.body.classList.remove('tour-open'); this._currentTour = null; this._currentTourStepIndex = 0; this._guidedTourCurrentStepSubject.next(null); }; /** * @param {?} tour * @return {?} */ GuidedTourService.prototype.startTour = /** * @param {?} tour * @return {?} */ function (tour) { this._currentTour = cloneDeep(tour); this._currentTour.steps = this._currentTour.steps.filter((/** * @param {?} step * @return {?} */ function (step) { return !step.skipStep; })); this._currentTourStepIndex = 0; this._setFirstAndLast(); this._guidedTourOrbShowingSubject.next(this._currentTour.useOrb); if (this._currentTour.steps.length > 0 && (!this._currentTour.minimumScreenSize || (this.windowRef.nativeWindow.innerWidth >= this._currentTour.minimumScreenSize))) { if (!this._currentTour.useOrb) { this.dom.body.classList.add('tour-open'); } if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); } if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } } }; /** * @return {?} */ GuidedTourService.prototype.activateOrb = /** * @return {?} */ function () { this._guidedTourOrbShowingSubject.next(false); this.dom.body.classList.add('tour-open'); }; /** * @private * @return {?} */ GuidedTourService.prototype._setFirstAndLast = /** * @private * @return {?} */ function () { this._onLastStep = (this._currentTour.steps.length - 1) === this._currentTourStepIndex; this._onFirstStep = this._currentTourStepIndex === 0; }; /** * @private * @return {?} */ GuidedTourService.prototype._checkSelectorValidity = /** * @private * @return {?} */ function () { if (this._currentTour.steps[this._currentTourStepIndex].selector) { /** @type {?} */ var selectedElement = this.dom.querySelector(this._currentTour.steps[this._currentTourStepIndex].selector); if (!selectedElement) { this.errorHandler.handleError( // If error handler is configured this should not block the browser. new Error("Error finding selector " + this._currentTour.steps[this._currentTourStepIndex].selector + " on step " + (this._currentTourStepIndex + 1) + " during guided tour: " + this._currentTour.tourId)); return false; } } return true; }; Object.defineProperty(GuidedTourService.prototype, "onLastStep", { get: /** * @return {?} */ function () { return this._onLastStep; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "onFirstStep", { get: /** * @return {?} */ function () { return this._onFirstStep; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "onResizeMessage", { get: /** * @return {?} */ function () { return this._onResizeMessage; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "currentTourStepDisplay", { get: /** * @return {?} */ function () { return this._currentTourStepIndex + 1; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "currentTourStepCount", { get: /** * @return {?} */ function () { return this._currentTour && this._currentTour.steps ? this._currentTour.steps.length : 0; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "preventBackdropFromAdvancing", { get: /** * @return {?} */ function () { return this._currentTour && this._currentTour.preventBackdropFromAdvancing; }, enumerable: true, configurable: true }); /** * @private * @param {?} index * @return {?} */ GuidedTourService.prototype.getPreparedTourStep = /** * @private * @param {?} index * @return {?} */ function (index) { return this.setTourOrientation(this._currentTour.steps[index]); }; /** * @private * @param {?} step * @return {?} */ GuidedTourService.prototype.setTourOrientation = /** * @private * @param {?} step * @return {?} */ function (step) { var _this = this; /** @type {?} */ var convertedStep = cloneDeep(step); if (convertedStep.orientation && !(typeof convertedStep.orientation === 'string') && ((/** @type {?} */ (convertedStep.orientation))).length) { ((/** @type {?} */ (convertedStep.orientation))).sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { if (!b.maximumSize) { return 1; } if (!a.maximumSize) { return -1; } return b.maximumSize - a.maximumSize; })); /** @type {?} */ var currentOrientation_1 = Orientation.Top; ((/** @type {?} */ (convertedStep.orientation))).forEach((/** * @param {?} orientationConfig * @return {?} */ function (orientationConfig) { if (!orientationConfig.maximumSize || _this.windowRef.nativeWindow.innerWidth <= orientationConfig.maximumSize) { currentOrientation_1 = orientationConfig.orientationDirection; } })); convertedStep.orientation = currentOrientation_1; } return convertedStep; }; GuidedTourService.decorators = [ { type: Injectable } ]; /** @nocollapse */ GuidedTourService.ctorParameters = function () { return [ { type: ErrorHandler }, { type: WindowRefService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; }; return GuidedTourService; }()); export { GuidedTourService }; if (false) { /** @type {?} */ GuidedTourService.prototype.guidedTourCurrentStepStream; /** @type {?} */ GuidedTourService.prototype.guidedTourOrbShowingStream; /** * @type {?} * @private */ GuidedTourService.prototype._guidedTourCurrentStepSubject; /** * @type {?} * @private */ GuidedTourService.prototype._guidedTourOrbShowingSubject; /** * @type {?} * @private */ GuidedTourService.prototype._currentTourStepIndex; /** * @type {?} * @private */ GuidedTourService.prototype._currentTour; /** * @type {?} * @private */ GuidedTourService.prototype._onFirstStep; /** * @type {?} * @private */ GuidedTourService.prototype._onLastStep; /** * @type {?} * @private */ GuidedTourService.prototype._onResizeMessage; /** @type {?} */ GuidedTourService.prototype.errorHandler; /** * @type {?} * @private */ GuidedTourService.prototype.windowRef; /** * @type {?} * @private */ GuidedTourService.prototype.dom; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGVkLXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1ndWlkZWQtdG91ci8iLCJzb3VyY2VzIjpbImxpYi9ndWlkZWQtdG91ci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBYyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBd0IsV0FBVyxFQUE0QixNQUFNLHlCQUF5QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZEO0lBYUksMkJBQ1csWUFBMEIsRUFDekIsU0FBMkIsRUFDVCxHQUFHO1FBSGpDLGlCQXdCQztRQXZCVSxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUNULFFBQUcsR0FBSCxHQUFHLENBQUE7UUFYekIsa0NBQTZCLEdBQUcsSUFBSSxPQUFPLEVBQVksQ0FBQztRQUN4RCxpQ0FBNEIsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ3RELDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUMxQixpQkFBWSxHQUFlLElBQUksQ0FBQztRQUNoQyxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFPN0IsSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyRixJ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LEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUN6QyxDQUFDLEVBQUMsQ0FBQzs7Z0JBRUMsb0JBQWtCLEdBQWdCLFdBQVcsQ0FBQyxHQUFHO1lBQ3JELENBQUMsbUJBQUEsYUFBYSxDQUFDLFdBQVcsRUFBOEIsQ0FBQyxDQUFDLE9BQU87Ozs7WUFDN0QsVUFBQyxpQkFBMkM7Z0JBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLElBQUksS0FBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxJQUFJLGlCQUFpQixDQUFDLFdBQVcsRUFBRTtvQkFDM0csb0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLENBQUM7aUJBQy9EO1lBQ0wsQ0FBQyxFQUNKLENBQUM7WUFFRixhQUFhLENBQUMsV0FBVyxHQUFHLG9CQUFrQixDQUFDO1NBQ2xEO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDekIsQ0FBQzs7Z0JBM05KLFVBQVU7Ozs7Z0JBUEYsWUFBWTtnQkFLWixnQkFBZ0I7Z0RBa0JoQixNQUFNLFNBQUMsUUFBUTs7SUE0TXhCLHdCQUFDO0NBQUEsQUE1TkQsSUE0TkM7U0EzTlksaUJBQWlCOzs7SUFDMUIsd0RBQXlEOztJQUN6RCx1REFBdUQ7Ozs7O0lBRXZELDBEQUFnRTs7Ozs7SUFDaEUseURBQThEOzs7OztJQUM5RCxrREFBa0M7Ozs7O0lBQ2xDLHlDQUF3Qzs7Ozs7SUFDeEMseUNBQTRCOzs7OztJQUM1Qix3Q0FBMkI7Ozs7O0lBQzNCLDZDQUFpQzs7SUFHN0IseUNBQWlDOzs7OztJQUNqQyxzQ0FBbUM7Ozs7O0lBQ25DLGdDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciwgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEd1aWRlZFRvdXIsIFRvdXJTdGVwLCBPcmllbnRhdGlvbiwgT3JpZW50YXRpb25Db25maWd1cmF0aW9uIH0gZnJvbSAnLi9ndWlkZWQtdG91ci5jb25zdGFudHMnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgV2luZG93UmVmU2VydmljZSB9IGZyb20gXCIuL3dpbmRvd3JlZi5zZXJ2aWNlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHdWlkZWRUb3VyU2VydmljZSB7XG4gICAgcHVibGljIGd1aWRlZFRvdXJDdXJyZW50U3RlcFN0cmVhbTogT2JzZXJ2YWJsZTxUb3VyU3RlcD47XG4gICAgcHVibGljIGd1aWRlZFRvdXJPcmJTaG93aW5nU3RyZWFtOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgcHJpdmF0ZSBfZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdCA9IG5ldyBTdWJqZWN0PFRvdXJTdGVwPigpO1xuICAgIHByaXZhdGUgX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBfY3VycmVudFRvdXJTdGVwSW5kZXggPSAwO1xuICAgIHByaXZhdGUgX2N1cnJlbnRUb3VyOiBHdWlkZWRUb3VyID0gbnVsbDtcbiAgICBwcml2YXRlIF9vbkZpcnN0U3RlcCA9IHRydWU7XG4gICAgcHJpdmF0ZSBfb25MYXN0U3RlcCA9IHRydWU7XG4gICAgcHJpdmF0ZSBfb25SZXNpemVNZXNzYWdlID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyLFxuICAgICAgICBwcml2YXRlIHdpbmRvd1JlZjogV2luZG93UmVmU2VydmljZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb21cbiAgICApIHtcbiAgICAgICAgdGhpcy5ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdHJlYW0gPSB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLmd1aWRlZFRvdXJPcmJTaG93aW5nU3RyZWFtID0gdGhpcy5fZ3VpZGVkVG91ck9yYlNob3dpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3csICdyZXNpemUnKS5waXBlKGRlYm91bmNlVGltZSgyMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyICYmIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemUgJiYgdGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemUgPj0gdGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXNpemVNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nID0gdGhpcy5fY3VycmVudFRvdXIucmVzaXplRGlhbG9nIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUGxlYXNlIHJlc2l6ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAnWW91IGhhdmUgcmVzaXplZCB0aGUgdG91ciB0byBhIHNpemUgdGhhdCBpcyB0b28gc21hbGwgdG8gY29udGludWUuIFBsZWFzZSByZXNpemUgdGhlIGJyb3dzZXIgdG8gYSBsYXJnZXIgc2l6ZSB0byBjb250aW51ZSB0aGUgdG91ciBvciBjbG9zZSB0aGUgdG91ci4nXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KGRpYWxvZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXNpemVNZXNzYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0U3RlcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5jbG9zZUFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmNsb3NlQWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ICsgMV0pIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4Kys7XG4gICAgICAgICAgICB0aGlzLl9zZXRGaXJzdEFuZExhc3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbigpO1xuICAgICAgICAgICAgICAgIC8vIFVzdWFsbHkgYW4gYWN0aW9uIGlzIG9wZW5pbmcgc29tZXRoaW5nIHNvIHdlIG5lZWQgdG8gZ2l2ZSBpdCB0aW1lIHRvIHJlbmRlci5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLmNvbXBsZXRlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5jb21wbGV0ZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc2V0VG91cigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGJhY2tTdGVwKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmNsb3NlQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uY2xvc2VBY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggLSAxXSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgtLTtcbiAgICAgICAgICAgIHRoaXMuX3NldEZpcnN0QW5kTGFzdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrU3RlcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUb3VyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2tpcFRvdXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5za2lwQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnNraXBDYWxsYmFjayh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldFRvdXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRUb3VyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvbS5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3RvdXItb3BlbicpO1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91ciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydFRvdXIodG91cjogR3VpZGVkVG91cik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91ciA9IGNsb25lRGVlcCh0b3VyKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHMgPSB0aGlzLl9jdXJyZW50VG91ci5zdGVwcy5maWx0ZXIoc3RlcCA9PiAhc3RlcC5za2lwU3RlcCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRMYXN0KCk7XG4gICAgICAgIHRoaXMuX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdC5uZXh0KHRoaXMuX2N1cnJlbnRUb3VyLnVzZU9yYik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICYmICghdGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemVcbiAgICAgICAgICAgICAgICB8fCAodGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LmlubmVyV2lkdGggPj0gdGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemUpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY3VycmVudFRvdXIudXNlT3JiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uYm9keS5jbGFzc0xpc3QuYWRkKCd0b3VyLW9wZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVPcmIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5kb20uYm9keS5jbGFzc0xpc3QuYWRkKCd0b3VyLW9wZW4nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRGaXJzdEFuZExhc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uTGFzdFN0ZXAgPSAodGhpcy5fY3VycmVudFRvdXIuc3RlcHMubGVuZ3RoIC0gMSkgPT09IHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4O1xuICAgICAgICB0aGlzLl9vbkZpcnN0U3RlcCA9IHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID09PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5kb20ucXVlcnlTZWxlY3Rvcih0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uc2VsZWN0b3IpO1xuICAgICAgICAgICAgaWYgKCFzZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZXJyb3IgaGFuZGxlciBpcyBjb25maWd1cmVkIHRoaXMgc2hvdWxkIG5vdCBibG9jayB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKGBFcnJvciBmaW5kaW5nIHNlbGVjdG9yICR7dGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLnNlbGVjdG9yfSBvbiBzdGVwICR7dGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggKyAxfSBkdXJpbmcgZ3VpZGVkIHRvdXI6ICR7dGhpcy5fY3VycmVudFRvdXIudG91cklkfWApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvbkxhc3RTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25MYXN0U3RlcDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9uRmlyc3RTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25GaXJzdFN0ZXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvblJlc2l6ZU1lc3NhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vblJlc2l6ZU1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VG91clN0ZXBEaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCArIDE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VG91clN0ZXBDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRvdXIgJiYgdGhpcy5fY3VycmVudFRvdXIuc3RlcHMgPyB0aGlzLl9jdXJyZW50VG91ci5zdGVwcy5sZW5ndGggOiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcHJldmVudEJhY2tkcm9wRnJvbUFkdmFuY2luZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUb3VyICYmIHRoaXMuX2N1cnJlbnRUb3VyLnByZXZlbnRCYWNrZHJvcEZyb21BZHZhbmNpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmVwYXJlZFRvdXJTdGVwKGluZGV4OiBudW1iZXIpOiBUb3VyU3RlcCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFRvdXJPcmllbnRhdGlvbih0aGlzLl9jdXJyZW50VG91ci5zdGVwc1tpbmRleF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VG91ck9yaWVudGF0aW9uKHN0ZXA6IFRvdXJTdGVwKTogVG91clN0ZXAge1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRTdGVwID0gY2xvbmVEZWVwKHN0ZXApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uXG4gICAgICAgICAgICAmJiAhKHR5cGVvZiBjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICYmIChjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uIGFzIE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbltdKS5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAoY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiBhcyBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb25bXSkuc29ydCgoYTogT3JpZW50YXRpb25Db25maWd1cmF0aW9uLCBiOiBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWIubWF4aW11bVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYS5tYXhpbXVtU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiLm1heGltdW1TaXplIC0gYS5tYXhpbXVtU2l6ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgY3VycmVudE9yaWVudGF0aW9uOiBPcmllbnRhdGlvbiA9IE9yaWVudGF0aW9uLlRvcDtcbiAgICAgICAgICAgIChjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uIGFzIE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbltdKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChvcmllbnRhdGlvbkNvbmZpZzogT3JpZW50YXRpb25Db25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JpZW50YXRpb25Db25maWcubWF4aW11bVNpemUgfHwgdGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LmlubmVyV2lkdGggPD0gb3JpZW50YXRpb25Db25maWcubWF4aW11bVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uQ29uZmlnLm9yaWVudGF0aW9uRGlyZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiA9IGN1cnJlbnRPcmllbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVkU3RlcDtcbiAgICB9XG59XG4iXX0=