UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

202 lines (201 loc) 19.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, HostListener, ElementRef } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { PhloxAppService } from '../service/PhloxAppService.service'; import { AbstractWizardPane } from './AbstractWizardPane'; const /** @type {?} */ TYPE_NAME = "phx-scroll-pagination-wizard-pane"; const /** @type {?} */ INDEX_Y_0 = "INDEX_Y_0"; const /** @type {?} */ UP = "UP"; const /** @type {?} */ DOWN = "DOWN"; export class ScrollPaginationWizardPane extends AbstractWizardPane { /** * @param {?} appSvc * @param {?} sanitizer * @param {?} elementRef */ constructor(appSvc, sanitizer, elementRef) { super(appSvc, elementRef); this.sanitizer = sanitizer; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); } /** * @param {?} event * @return {?} */ onmousewheel(event) { clearTimeout(this.delayMouseWheelTimer); this.delayMouseWheelTimer = null; this.delayMouseWheelTimer = setTimeout(() => { event = window.event || event; let /** @type {?} */ delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail))); if (delta > -1) { // mouseWheel up if (this.currentStep !== 0) { this.currentStep -= 1; if (this.currentStep === 0) { this.setSafeStyleIndexY(INDEX_Y_0); } else { this.setSafeStyleIndexY(UP); } } } else { // mouseWheel down if (this.getModel().steps.length > 0) { let /** @type {?} */ stepsIndex = this.getModel().steps.length - 1; if (this.currentStep < stepsIndex) { this.currentStep += 1; this.setSafeStyleIndexY(DOWN); } } } event.preventDefault(); }, 250); } /** * @param {?} mouseWheel * @return {?} */ setSafeStyleIndexY(mouseWheel) { let /** @type {?} */ y; let /** @type {?} */ index = this.currentStep; if (mouseWheel === DOWN || mouseWheel === UP) { // set Style translate3d = (0, -(index * 100), 0); y = -(index * 100); } else if (mouseWheel === INDEX_Y_0) { // set Style translate3d = (0, 0, 0); y = 0; } else { // default set Style translate3d = (0, 0, 0); y = 0; } this.safeStyle = this.sanitizer.bypassSecurityTrustStyle("translate3d( 0, " + y + "%, 0 )"); } /** * @return {?} */ getSafeStyle() { return this.safeStyle; } /** * @param {?} index * @return {?} */ showStepContent(index) { let /** @type {?} */ y; if (index !== 0) { // set Style translate3d = (0, -(index * 100), 0); y = -(index * 100); } else if (index === 0) { // set Style translate3d = (0, 0, 0); y = 0; } else { // default set Style translate3d = (0, 0, 0); y = 0; } this.safeStyle = this.sanitizer.bypassSecurityTrustStyle("translate3d( 0, " + y + "%, 0 )"); } /** * @param {?} index * @return {?} */ getStepInstance(index) { } } ScrollPaginationWizardPane.TYPE_NAME = TYPE_NAME; ScrollPaginationWizardPane.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: 'phx-scroll-pagination-wizard-pane', template: `<div class="phx-scroll-pagination-wizard-pane"> <div class="left" [style.padding-top]="getHeaderHeight() + 'pt'" [style.padding-bottom]="getFooterHeight() + 'pt'"> <div class="header" [style.height]="getHeaderHeight() + 'pt'"> <ng-template [ngIf]="getModel() !== null && getModel().header !== null"> <ng-template [ngIf]="getModel().header.type === null"> <div *ngIf="getModel().header.imageURL !== null && getModel().header.imageURL !== ''" class="header-image"> <img src="{{getModel().header.imageURL}}"> </div> <div class="header-label">{{getModel().header.label}}</div> </ng-template> <ng-template [ngIf]="getModel().header.type !== null"> <phx-component-wrapper [type]="getModel().header.type" [data]="getModel().header.model"></phx-component-wrapper> </ng-template> </ng-template> </div> <div class="body"> <ng-template [ngIf]="getModel() !== null && getModel().steps !== null"> <div *ngFor="let item of getModel().steps; let i = index;" class="step" [class.active]="isStepSelected(i)"> <ng-template [ngIf]="item.type === null"> <div (click)="stepSelected(i)"> {{item.label}} </div> </ng-template> <ng-template [ngIf]="item.type !== null"> <phx-component-wrapper [type]="item.type" [data]="item.model" (click)="stepSelected(i)"></phx-component-wrapper> </ng-template> </div> </ng-template> </div> <div class="footer" [style.height]="getFooterHeight() + 'pt'"> <ng-template [ngIf]="getModel() !== null && getModel().footer !== null"> <ng-template [ngIf]="getModel().footer.type === null"> {{getModel().footer.label}} </ng-template> <ng-template [ngIf]="getModel().footer.type !== null"> <phx-component-wrapper [type]="getModel().footer.type" [data]="getModel().footer.model"></phx-component-wrapper> </ng-template> </ng-template> </div> </div> <div class="right"> <div class="scrollpage" [style.transform]="getSafeStyle()"> <div *ngFor="let item of getModel().steps; let i = index;" style="height: 100%;"> <phx-component-wrapper [class.active]="isStepSelected(i)" [type]="item.componentType" [data]="getData()" [model]="item.componentModel" [dataParent]="this" [handler]="getStepsComponentHandler()"> </phx-component-wrapper> </div> </div> </div> </div> `, },] }, ]; /** @nocollapse */ ScrollPaginationWizardPane.ctorParameters = () => [ { type: PhloxAppService, }, { type: DomSanitizer, }, { type: ElementRef, }, ]; ScrollPaginationWizardPane.propDecorators = { "onmousewheel": [{ type: HostListener, args: ['mousewheel', ['$event'],] },], }; function ScrollPaginationWizardPane_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ScrollPaginationWizardPane.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ScrollPaginationWizardPane.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ScrollPaginationWizardPane.propDecorators; /** @type {?} */ ScrollPaginationWizardPane.TYPE_NAME; /** @type {?} */ ScrollPaginationWizardPane.prototype.delayMouseWheelTimer; /** @type {?} */ ScrollPaginationWizardPane.prototype.sanitizer; /** @type {?} */ ScrollPaginationWizardPane.prototype.safeStyle; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsUGFnaW5hdGlvbldpemFyZFBhbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L1Njcm9sbFBhZ2luYXRpb25XaXphcmRQYW5lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFLMUQsdUJBQU0sU0FBUyxHQUFXLG1DQUFtQyxDQUFDO0FBRTlELHVCQUFNLFNBQVMsR0FBVyxXQUFXLENBQUM7QUFDdEMsdUJBQU0sRUFBRSxHQUFRLElBQUksQ0FBQztBQUNyQix1QkFBTSxJQUFJLEdBQVEsTUFBTSxDQUFDO0FBeUR6QixNQUFNLGlDQUFrQyxTQUFRLGtCQUFrQjs7Ozs7O0lBUWhFLFlBQVksTUFBdUIsRUFBRSxTQUF1QixFQUFFLFVBQXNCO1FBQ2xGLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7S0FDNUI7Ozs7SUFFTSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDOzs7Ozs7SUFJWixZQUFZLENBQUMsS0FBVTtRQUM1QixZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUVqQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUUxQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFB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RyxRQUFRLENBQUMsQ0FBQzs7Ozs7O0lBR3ZGLGVBQWUsQ0FBQyxLQUFhOzt1Q0FyRk8sU0FBUzs7WUF6RHJELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxtQ0FBbUM7Z0JBQzdDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBZ0RYO2FBQ0E7Ozs7WUFqRVEsZUFBZTtZQURmLFlBQVk7WUFEcUIsVUFBVTs7OzZCQXVGakQsWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4vSUhhc01vZGVsJztcclxuaW1wb3J0IHsgQWJzdHJhY3RXaXphcmRQYW5lIH0gZnJvbSAnLi9BYnN0cmFjdFdpemFyZFBhbmUnO1xyXG5pbXBvcnQgeyBJQ2hhbmdlYWJsZSB9IGZyb20gJy4vSUNoYW5nZWFibGUnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1zY3JvbGwtcGFnaW5hdGlvbi13aXphcmQtcGFuZVwiO1xyXG5cclxuY29uc3QgSU5ERVhfWV8wOiBzdHJpbmcgPSBcIklOREVYX1lfMFwiO1xyXG5jb25zdCBVUDogYW55ID0gXCJVUFwiO1xyXG5jb25zdCBET1dOOiBhbnkgPSBcIkRPV05cIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6ICdwaHgtc2Nyb2xsLXBhZ2luYXRpb24td2l6YXJkLXBhbmUnLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1zY3JvbGwtcGFnaW5hdGlvbi13aXphcmQtcGFuZVwiPlxyXG5cdDxkaXYgY2xhc3M9XCJsZWZ0XCIgW3N0eWxlLnBhZGRpbmctdG9wXT1cImdldEhlYWRlckhlaWdodCgpICsgJ3B0J1wiIFtzdHlsZS5wYWRkaW5nLWJvdHRvbV09XCJnZXRGb290ZXJIZWlnaHQoKSArICdwdCdcIj5cclxuXHRcdDxkaXYgY2xhc3M9XCJoZWFkZXJcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEhlYWRlckhlaWdodCgpICsgJ3B0J1wiPlxyXG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmhlYWRlciAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlID09PSBudWxsXCI+XHJcblx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiZ2V0TW9kZWwoKS5oZWFkZXIuaW1hZ2VVUkwgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5oZWFkZXIuaW1hZ2VVUkwgIT09ICcnXCIgY2xhc3M9XCJoZWFkZXItaW1hZ2VcIj5cclxuXHRcdFx0XHRcdFx0PGltZyBzcmM9XCJ7e2dldE1vZGVsKCkuaGVhZGVyLmltYWdlVVJMfX1cIj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRlci1sYWJlbFwiPnt7Z2V0TW9kZWwoKS5oZWFkZXIubGFiZWx9fTwvZGl2PlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuaGVhZGVyLnR5cGUgIT09IG51bGxcIj5cclxuXHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW3R5cGVdPVwiZ2V0TW9kZWwoKS5oZWFkZXIudHlwZVwiIFtkYXRhXT1cImdldE1vZGVsKCkuaGVhZGVyLm1vZGVsXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiBjbGFzcz1cImJvZHlcIj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5zdGVwcyAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TW9kZWwoKS5zdGVwczsgbGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cInN0ZXBcIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RlcFNlbGVjdGVkKGkpXCI+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbS50eXBlID09PSBudWxsXCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgKGNsaWNrKT1cInN0ZXBTZWxlY3RlZChpKVwiPiB7e2l0ZW0ubGFiZWx9fSA8L2Rpdj5cclxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbS50eXBlICE9PSBudWxsXCI+XHJcblx0XHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW3R5cGVdPVwiaXRlbS50eXBlXCIgW2RhdGFdPVwiaXRlbS5tb2RlbFwiIChjbGljayk9XCJzdGVwU2VsZWN0ZWQoaSlcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cclxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgY2xhc3M9XCJmb290ZXJcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEZvb3RlckhlaWdodCgpICsgJ3B0J1wiPlxyXG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmZvb3RlciAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmZvb3Rlci50eXBlID09PSBudWxsXCI+XHJcblx0XHRcdFx0XHR7e2dldE1vZGVsKCkuZm9vdGVyLmxhYmVsfX1cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmZvb3Rlci50eXBlICE9PSBudWxsXCI+XHJcblx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGVcIiBbZGF0YV09XCJnZXRNb2RlbCgpLmZvb3Rlci5tb2RlbFwiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHQ8ZGl2IGNsYXNzPVwicmlnaHRcIj5cclxuXHRcdDxkaXYgY2xhc3M9XCJzY3JvbGxwYWdlXCIgW3N0eWxlLnRyYW5zZm9ybV09XCJnZXRTYWZlU3R5bGUoKVwiPlxyXG5cdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldE1vZGVsKCkuc3RlcHM7IGxldCBpID0gaW5kZXg7XCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCI+XHJcblx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbY2xhc3MuYWN0aXZlXT1cImlzU3RlcFNlbGVjdGVkKGkpXCIgW3R5cGVdPVwiaXRlbS5jb21wb25lbnRUeXBlXCJcclxuXHRcdFx0XHRcdFtkYXRhXT1cImdldERhdGEoKVwiIFttb2RlbF09XCJpdGVtLmNvbXBvbmVudE1vZGVsXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiIFtoYW5kbGVyXT1cImdldFN0ZXBzQ29tcG9uZW50SGFuZGxlcigpXCI+XHJcblx0XHRcdFx0PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcbjwvZGl2PlxyXG5gLFxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTY3JvbGxQYWdpbmF0aW9uV2l6YXJkUGFuZSBleHRlbmRzIEFic3RyYWN0V2l6YXJkUGFuZSBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsLCBJQ2hhbmdlYWJsZSB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XHJcblxyXG4gIHByaXZhdGUgZGVsYXlNb3VzZVdoZWVsVGltZXI6IGFueTtcclxuICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyO1xyXG4gIHByaXZhdGUgc2FmZVN0eWxlOiBTYWZlU3R5bGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGFwcFN2YzogUGhsb3hBcHBTZXJ2aWNlLCBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoYXBwU3ZjLCBlbGVtZW50UmVmKTtcclxuICAgIHRoaXMuc2FuaXRpemVyID0gc2FuaXRpemVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBvbm1vdXNld2hlZWwoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIpO1xyXG5cclxuICAgIHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIGV2ZW50ID0gd2luZG93LmV2ZW50IHx8IGV2ZW50O1xyXG5cclxuICAgICAgbGV0IGRlbHRhOiBudW1iZXIgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgKGV2ZW50LndoZWVsRGVsdGEgfHwgLWV2ZW50LmRldGFpbCkpKTtcclxuXHJcbiAgICAgIGlmIChkZWx0YSA+IC0xKSB7IC8vIG1vdXNlV2hlZWwgdXBcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlcCAhPT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U3RlcCAtPSAxO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2FmZVN0eWxlSW5kZXhZKElOREVYX1lfMCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNhZmVTdHlsZUluZGV4WShVUCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgeyAgIC8vIG1vdXNlV2hlZWwgZG93blxyXG4gICAgICAgIGlmICh0aGlzLmdldE1vZGVsKCkuc3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IHN0ZXBzSW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0TW9kZWwoKS5zdGVwcy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwIDwgc3RlcHNJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwICs9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2FmZVN0eWxlSW5kZXhZKERPV04pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0sIDI1MCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2FmZVN0eWxlSW5kZXhZKG1vdXNlV2hlZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHk6IGFueTtcclxuICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudFN0ZXA7XHJcblxyXG4gICAgaWYgKG1vdXNlV2hlZWwgPT09IERPV04gfHwgbW91c2VXaGVlbCA9PT0gVVApIHsgLy8gc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAtKGluZGV4ICogMTAwKSwgMCk7XHJcbiAgICAgIHkgPSAtKGluZGV4ICogMTAwKTtcclxuICAgIH0gZWxzZSBpZiAobW91c2VXaGVlbCA9PT0gSU5ERVhfWV8wKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgMCwgMCk7XHJcbiAgICAgIHkgPSAwO1xyXG4gICAgfSBlbHNlIHsgLy8gZGVmYXVsdCAgc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAwLCAwKTtcclxuICAgICAgeSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zYWZlU3R5bGUgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXCJ0cmFuc2xhdGUzZCggMCwgXCIgKyB5ICsgXCIlLCAwIClcIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2FmZVN0eWxlKCk6IFNhZmVTdHlsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5zYWZlU3R5bGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1N0ZXBDb250ZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB5OiBhbnk7XHJcblxyXG4gICAgaWYgKGluZGV4ICE9PSAwKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgLShpbmRleCAqIDEwMCksIDApO1xyXG4gICAgICB5ID0gLShpbmRleCAqIDEwMCk7XHJcbiAgICB9IGVsc2UgaWYgKGluZGV4ID09PSAwKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgMCwgMCk7XHJcbiAgICAgIHkgPSAwO1xyXG4gICAgfSBlbHNlIHsgLy8gZGVmYXVsdCAgc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAwLCAwKTtcclxuICAgICAgeSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zYWZlU3R5bGUgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXCJ0cmFuc2xhdGUzZCggMCwgXCIgKyB5ICsgXCIlLCAwIClcIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U3RlcEluc3RhbmNlKGluZGV4OiBudW1iZXIpOiBhbnkgeyB9XHJcbn1cclxuIl19