UNPKG

ngx-modalview

Version:

Simple way to implement modal in Angular (16+) projects.

149 lines 18.9 kB
import { Directive, Input, Output, EventEmitter } from '@angular/core'; import { Subject, fromEvent } from 'rxjs'; import { filter, switchMap, map, takeUntil } from 'rxjs/operators'; import * as i0 from "@angular/core"; class DraggableDirective { host; zone; renderer; dragHandle; dragTarget; dragEnabled = false; set dialogDragOffset(offset) { this.reset(offset); } dragged = new EventEmitter(); /** Element to be dragged */ target; /** Drag handle */ handle; delta = { x: 0, y: 0 }; offset = { x: 0, y: 0 }; enabled = true; destroy$ = new Subject(); constructor(host, zone, renderer) { this.host = host; this.zone = zone; this.renderer = renderer; } ngAfterViewInit() { if (!this.enabled) { return; } this.init(); } ngOnChanges() { if (!this.enabled && this.dragEnabled && this.dragTarget) { this.enabled = true; /** determine if the component has been init by the handle variable */ if (this.handle) { this.renderer.setStyle(this.handle, 'cursor', 'move'); } else if (this.enabled) { this.init(); } } if (!this.dragEnabled) { this.enabled = false; if (this.handle) { this.renderer.setStyle(this.handle, 'cursor', ''); } } } ngOnDestroy() { this.destroy$.next(); } reset(offset) { const defaultValues = { x: 0, y: 0 }; this.offset = { ...defaultValues, ...offset }; this.delta = { ...defaultValues }; this.translate(); } setupEvents() { this.zone.runOutsideAngular(() => { const mousedown$ = fromEvent(this.handle, 'mousedown'); const mousemove$ = fromEvent(document, 'mousemove'); const mouseup$ = fromEvent(document, 'mouseup'); const mousedrag$ = mousedown$.pipe(filter(() => this.enabled), map(event => ({ startX: event.clientX, startY: event.clientY })), switchMap(({ startX, startY }) => mousemove$.pipe(map(event => { event.preventDefault(); this.delta = { x: event.clientX - startX, y: event.clientY - startY }; }), takeUntil(mouseup$))), takeUntil(this.destroy$)); mousedrag$.subscribe(() => { if (this.delta.x === 0 && this.delta.y === 0) { return; } this.translate(); }); mouseup$ .pipe(filter(() => this.enabled), /** Only emit change if the element has moved */ filter(() => this.delta.x !== 0 || this.delta.y !== 0), takeUntil(this.destroy$)) .subscribe(() => { this.offset.x += this.delta.x; this.offset.y += this.delta.y; this.dragged.emit(this.offset); this.delta = { x: 0, y: 0 }; }); }); } translate() { if (this.target) { this.zone.runOutsideAngular(() => { requestAnimationFrame(() => { const transform = `translate(${this.offset.x + this.delta.x}px, ${this.offset.y + this.delta.y}px)`; this.renderer.setStyle(this.target, 'transform', transform); }); }); } } /** * Init the directive */ init() { if (!this.dragTarget) { throw new Error('You need to specify the drag target'); } this.handle = this.dragHandle instanceof Element ? this.dragHandle : typeof this.dragHandle === 'string' && this.dragHandle ? document.querySelector(this.dragHandle) : this.host.nativeElement; /** add the move cursor */ if (this.handle && this.enabled) { this.renderer.addClass(this.handle, 'handle'); } this.target = this.dragTarget instanceof HTMLElement ? this.dragTarget : document.querySelector(this.dragTarget); this.setupEvents(); this.translate(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: DraggableDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.3", type: DraggableDirective, selector: "[dialogDraggable]", inputs: { dragHandle: "dragHandle", dragTarget: "dragTarget", dragEnabled: "dragEnabled", dialogDragOffset: "dialogDragOffset" }, outputs: { dragged: "dragged" }, usesOnChanges: true, ngImport: i0 }); } export { DraggableDirective }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: DraggableDirective, decorators: [{ type: Directive, args: [{ selector: '[dialogDraggable]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }]; }, propDecorators: { dragHandle: [{ type: Input }], dragTarget: [{ type: Input }], dragEnabled: [{ type: Input }], dialogDragOffset: [{ type: Input }], dragged: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1vZGFsLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmd4LW1vZGFsL25neC1tb2RhbC1kcmFnZ2FibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQTRCLEtBQUssRUFBRSxNQUFNLEVBQXNCLFlBQVksRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQVluRSxNQUdhLGtCQUFrQjtJQW1CVDtJQUEwQjtJQUFzQjtJQWxCM0QsVUFBVSxDQUFvQjtJQUM5QixVQUFVLENBQW1CO0lBQzdCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDN0IsSUFBYSxnQkFBZ0IsQ0FBQyxNQUFrQjtRQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFUyxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7SUFFckQsNEJBQTRCO0lBQ3BCLE1BQU0sQ0FBYztJQUM1QixrQkFBa0I7SUFDVixNQUFNLENBQVU7SUFDaEIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDdkIsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXZDLFlBQW9CLElBQWdCLEVBQVUsSUFBWSxFQUFVLFFBQW1CO1FBQW5FLFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztJQUFJLENBQUM7SUFFckYsZUFBZTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDeEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsc0VBQXNFO1lBQ3RFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN2RDtpQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNiO1NBQ0Y7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDbkQ7U0FDRjtJQUNILENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFtQjtRQUN2QixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLGFBQWEsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQWEsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNuRSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQWEsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBYSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFNUQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FDaEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFDMUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWixNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3JCLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTzthQUN0QixDQUFDLENBQUMsRUFDSCxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQy9CLFVBQVUsQ0FBQyxJQUFJLENBQ2IsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNWLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRztvQkFDWCxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNO29CQUN6QixDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNO2lCQUMxQixDQUFDO1lBQ0osQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUNwQixDQUNGLEVBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekIsQ0FBQztZQUVGLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzVDLE9BQU87aUJBQ1I7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1lBRUgsUUFBUTtpQkFDTCxJQUFJLENBQ0gsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDMUIsZ0RBQWdEO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ3RELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCO2lCQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDL0IscUJBQXFCLENBQUMsR0FBRyxFQUFFO29CQUN6QixNQUFNLFNBQVMsR0FBRyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ3BHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxJQUFJO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsSUFBSSxDQUFDLE1BQU07WUFDVCxJQUFJLENBQUMsVUFBVSxZQUFZLE9BQU87Z0JBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDakIsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVU7b0JBQ3RELENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFvQixDQUFDO29CQUNuRCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFaEMsMEJBQTBCO1FBQzFCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDL0M7UUFFRCxJQUFJLENBQUMsTUFBTTtZQUNULElBQUksQ0FBQyxVQUFVLFlBQVksV0FBVztnQkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUNqQixDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBb0IsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQzt1R0FySlUsa0JBQWtCOzJGQUFsQixrQkFBa0I7O1NBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUg5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzhJQUVVLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFJSSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIElucHV0LCBPdXRwdXQsIEVsZW1lbnRSZWYsIE5nWm9uZSwgRXZlbnRFbWl0dGVyLCBSZW5kZXJlcjIsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCBzd2l0Y2hNYXAsIG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEcmFnZ2VkRXZlbnQge1xyXG4gIHg6IG51bWJlcjtcclxuICB5OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRHJhZ09mZnNldCB7XHJcbiAgeD86IG51bWJlcjtcclxuICB5PzogbnVtYmVyO1xyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkaWFsb2dEcmFnZ2FibGVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJhZ2dhYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGRyYWdIYW5kbGU/OiBzdHJpbmcgfCBFbGVtZW50O1xyXG4gIEBJbnB1dCgpIGRyYWdUYXJnZXQ6IHN0cmluZyB8IEVsZW1lbnQ7XHJcbiAgQElucHV0KCkgZHJhZ0VuYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZXQgZGlhbG9nRHJhZ09mZnNldChvZmZzZXQ6IERyYWdPZmZzZXQpIHtcclxuICAgIHRoaXMucmVzZXQob2Zmc2V0KTtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSBkcmFnZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnZ2VkRXZlbnQ+KCk7XHJcblxyXG4gIC8qKiBFbGVtZW50IHRvIGJlIGRyYWdnZWQgKi9cclxuICBwcml2YXRlIHRhcmdldDogSFRNTEVsZW1lbnQ7XHJcbiAgLyoqIERyYWcgaGFuZGxlICovXHJcbiAgcHJpdmF0ZSBoYW5kbGU6IEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBkZWx0YSA9IHsgeDogMCwgeTogMCB9O1xyXG4gIHByaXZhdGUgb2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XHJcbiAgcHJpdmF0ZSBlbmFibGVkID0gdHJ1ZTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBob3N0OiBFbGVtZW50UmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGlmICghdGhpcy5lbmFibGVkICYmIHRoaXMuZHJhZ0VuYWJsZWQgJiYgdGhpcy5kcmFnVGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgIC8qKiBkZXRlcm1pbmUgaWYgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBpbml0IGJ5IHRoZSBoYW5kbGUgdmFyaWFibGUgKi9cclxuICAgICAgaWYgKHRoaXMuaGFuZGxlKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmhhbmRsZSwgJ2N1cnNvcicsICdtb3ZlJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZHJhZ0VuYWJsZWQpIHtcclxuICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmhhbmRsZSkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5oYW5kbGUsICdjdXJzb3InLCAnJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXQob2Zmc2V0PzogRHJhZ09mZnNldCkge1xyXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IHsgeDogMCwgeTogMCB9O1xyXG4gICAgdGhpcy5vZmZzZXQgPSB7IC4uLmRlZmF1bHRWYWx1ZXMsIC4uLm9mZnNldCB9O1xyXG4gICAgdGhpcy5kZWx0YSA9IHsgLi4uZGVmYXVsdFZhbHVlcyB9O1xyXG4gICAgdGhpcy50cmFuc2xhdGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBFdmVudHMoKSB7XHJcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb3VzZWRvd24kID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuaGFuZGxlLCAnbW91c2Vkb3duJyk7XHJcbiAgICAgIGNvbnN0IG1vdXNlbW92ZSQgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZW1vdmUnKTtcclxuICAgICAgY29uc3QgbW91c2V1cCQgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZXVwJyk7XHJcblxyXG4gICAgICBjb25zdCBtb3VzZWRyYWckID0gbW91c2Vkb3duJC5waXBlKFxyXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxyXG4gICAgICAgIG1hcChldmVudCA9PiAoe1xyXG4gICAgICAgICAgc3RhcnRYOiBldmVudC5jbGllbnRYLFxyXG4gICAgICAgICAgc3RhcnRZOiBldmVudC5jbGllbnRZXHJcbiAgICAgICAgfSkpLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoeyBzdGFydFgsIHN0YXJ0WSB9KSA9PlxyXG4gICAgICAgICAgbW91c2Vtb3ZlJC5waXBlKFxyXG4gICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZWx0YSA9IHtcclxuICAgICAgICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSBzdGFydFgsXHJcbiAgICAgICAgICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gc3RhcnRZXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHRha2VVbnRpbChtb3VzZXVwJClcclxuICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgbW91c2VkcmFnJC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRlbHRhLnggPT09IDAgJiYgdGhpcy5kZWx0YS55ID09PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZSgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vdXNldXAkXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcclxuICAgICAgICAgIC8qKiBPbmx5IGVtaXQgY2hhbmdlIGlmIHRoZSBlbGVtZW50IGhhcyBtb3ZlZCAqL1xyXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZGVsdGEueCAhPT0gMCB8fCB0aGlzLmRlbHRhLnkgIT09IDApLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vZmZzZXQueCArPSB0aGlzLmRlbHRhLng7XHJcbiAgICAgICAgICB0aGlzLm9mZnNldC55ICs9IHRoaXMuZGVsdGEueTtcclxuICAgICAgICAgIHRoaXMuZHJhZ2dlZC5lbWl0KHRoaXMub2Zmc2V0KTtcclxuICAgICAgICAgIHRoaXMuZGVsdGEgPSB7IHg6IDAsIHk6IDAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGUoKSB7XHJcbiAgICBpZiAodGhpcy50YXJnZXQpIHtcclxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3RoaXMub2Zmc2V0LnggKyB0aGlzLmRlbHRhLnh9cHgsICR7dGhpcy5vZmZzZXQueSArIHRoaXMuZGVsdGEueX1weClgO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhcmdldCwgJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdCB0aGUgZGlyZWN0aXZlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0KCkge1xyXG4gICAgaWYgKCF0aGlzLmRyYWdUYXJnZXQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBkcmFnIHRhcmdldCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlID1cclxuICAgICAgdGhpcy5kcmFnSGFuZGxlIGluc3RhbmNlb2YgRWxlbWVudFxyXG4gICAgICAgID8gdGhpcy5kcmFnSGFuZGxlXHJcbiAgICAgICAgOiB0eXBlb2YgdGhpcy5kcmFnSGFuZGxlID09PSAnc3RyaW5nJyAmJiB0aGlzLmRyYWdIYW5kbGVcclxuICAgICAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRyYWdIYW5kbGUgYXMgc3RyaW5nKVxyXG4gICAgICAgICAgOiB0aGlzLmhvc3QubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvKiogYWRkIHRoZSBtb3ZlIGN1cnNvciAqL1xyXG4gICAgaWYgKHRoaXMuaGFuZGxlICYmIHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaGFuZGxlLCAnaGFuZGxlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50YXJnZXQgPVxyXG4gICAgICB0aGlzLmRyYWdUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxyXG4gICAgICAgID8gdGhpcy5kcmFnVGFyZ2V0XHJcbiAgICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZHJhZ1RhcmdldCBhcyBzdHJpbmcpO1xyXG5cclxuICAgIHRoaXMuc2V0dXBFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLnRyYW5zbGF0ZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=