UNPKG

ng-devui

Version:

DevUI components based on Angular

503 lines 76.1 kB
import { DOCUMENT } from '@angular/common'; import { Directive, ElementRef, EventEmitter, HostBinding, Inject, Input, NgZone, Optional, Output, Renderer2, Self } from '@angular/core'; import { fromEvent, Subject, Subscription } from 'rxjs'; import { DragDropService } from '../services/drag-drop.service'; import { Utils } from '../shared/utils'; import { PreserveNextEventEmitter } from './../shared/preserve-next-event-emitter'; import { DragPreviewDirective } from './drag-preview.directive'; import * as i0 from "@angular/core"; import * as i1 from "../services/drag-drop.service"; import * as i2 from "./drag-preview.directive"; /** * Makes an element draggable by adding the draggable html attribute */ export class DraggableDirective { get disabled() { return this._disabled; } set disabled(value) { this._disabled = value; this.draggable = !this._disabled; } constructor(el, renderer, dragDropService, ngZone, dragPreviewDirective, doc) { this.el = el; this.renderer = renderer; this.dragDropService = dragDropService; this.ngZone = ngZone; this.dragPreviewDirective = dragPreviewDirective; this.doc = doc; this.draggable = true; /** * Currently not used */ this.dragEffect = 'move'; /** * Defines compatible drag drop pairs. Values must match both in draggable and droppable.dropScope. */ this.dragScope = 'default'; this.dragHandleClass = 'drag-handle'; /** * Event fired when Drag is started */ this.dragStartEvent = new EventEmitter(); /** * @deprecated * Event fired while the element is being dragged * 为了性能优化,该函数废弃,请用(drag)自行监听, 如果不需要angular脏检测则最好用runOutsideAngular的addEventListener监听以获得好的性能 */ this.dragEvent = new PreserveNextEventEmitter(); /** * Event fired when dragged ends */ this.dragEndEvent = new EventEmitter(); this.dropEndEvent = new PreserveNextEventEmitter(); this.enableDragFollow = false; // 默认false使用浏览器H5API拖拽, 否则使用原dom定位偏移 this.dragItemParentName = ''; // 当前拖拽元素的类名或元素名称(类名需要加.),主要用于子节点的截取操作 this.dragItemChildrenName = ''; // 当前拖拽元素的子节点类名或元素名称(类名需要加.) this.dragsSub = new Subscription(); this.destroyDragEndSub = new Subscription(); this.dragElShowHideEvent = new Subject(); this.beforeDragStartEvent = new Subject(); this.insertOriginPlaceholder = (directShow = true, updateService = true) => { if (this.delayRemoveOriginPlaceholderTimer) { clearTimeout(this.delayRemoveOriginPlaceholderTimer); this.delayRemoveOriginPlaceholderTimer = undefined; } const node = this.document.createElement(this.originPlaceholder.tag || 'div'); const rect = this.el.nativeElement.getBoundingClientRect(); if (directShow) { node.style.display = 'block'; } else { node.style.display = 'none'; } node.style.width = rect.width + 'px'; node.style.height = rect.height + 'px'; node.classList.add('drag-origin-placeholder'); if (this.originPlaceholder.text) { node.innerText = this.originPlaceholder.text; } if (this.originPlaceholder.style) { Utils.addElStyles(node, this.originPlaceholder.style); } if (updateService) { this.dragDropService.dragOriginPlaceholder = node; this.dragDropService.dragOriginPlaceholderNextSibling = this.el.nativeElement.nextSibling; } else { node.classList.add('side-drag-origin-placeholder'); const originCloneNode = this.el.nativeElement.cloneNode(true); originCloneNode.style.margin = 0; originCloneNode.style.pointerEvents = 'none'; originCloneNode.style.opacity = '0.3'; node.appendChild(originCloneNode); } this.dragOriginPlaceholder = node; this.dragOriginPlaceholderNextSibling = this.el.nativeElement.nextSibling; this.el.nativeElement.parentElement.insertBefore(node, this.el.nativeElement.nextSibling); }; this.removeOriginPlaceholder = (updateService = true) => { if (this.dragOriginPlaceholder) { this.dragOriginPlaceholder.parentElement.removeChild(this.dragOriginPlaceholder); } if (updateService) { this.dragDropService.dragOriginPlaceholder = undefined; this.dragDropService.dragOriginPlaceholderNextSibling = undefined; } this.dragOriginPlaceholder = undefined; this.dragOriginPlaceholderNextSibling = undefined; }; this.delayRemoveOriginPlaceholder = (updateService = true) => { const timeout = this.originPlaceholder.removeDelay; const delayOriginPlaceholder = this.dragOriginPlaceholder; const dragOriginPlaceholderNextSibling = this.findNextSibling(this.dragOriginPlaceholderNextSibling); // 需要临时移动位置,保证被ngFor刷新之后位置是正确的 // ngFor刷新的原理是有变化的部分都刷新,夹在变化部分中间的内容将被刷到变化部分之后的位置,所以需要恢复位置 // setTimeout是等ngFor的View刷新, 后续需要订阅sortContainer的view的更新才需要重新恢复位置 if (delayOriginPlaceholder.parentElement.contains(dragOriginPlaceholderNextSibling)) { delayOriginPlaceholder.parentElement.insertBefore(delayOriginPlaceholder, dragOriginPlaceholderNextSibling); } setTimeout(() => { if (delayOriginPlaceholder.parentElement.contains(dragOriginPlaceholderNextSibling)) { delayOriginPlaceholder.parentElement.insertBefore(delayOriginPlaceholder, dragOriginPlaceholderNextSibling); } delayOriginPlaceholder.classList.add('delay-deletion'); this.delayRemoveOriginPlaceholderTimer = setTimeout(() => { delayOriginPlaceholder.parentElement.removeChild(delayOriginPlaceholder); if (this.document.body.contains(this.el.nativeElement)) { this.el.nativeElement.style.display = ''; this.dragDropService.dragElShowHideEvent.next(false); } }, timeout); if (updateService) { this.dragDropService.dragOriginPlaceholder = undefined; this.dragDropService.dragOriginPlaceholderNextSibling = undefined; } this.dragOriginPlaceholder = undefined; this.dragOriginPlaceholderNextSibling = undefined; }); }; this.document = this.doc; } ngOnInit() { this.ngZone.runOutsideAngular(() => { this.dragsSub.add(fromEvent(this.el.nativeElement, 'mouseover').subscribe(event => this.mouseover(event))); this.dragsSub.add(fromEvent(this.el.nativeElement, 'dragstart').subscribe(event => this.dragStart(event))); this.dragsSub.add(fromEvent(this.el.nativeElement, 'dragend').subscribe(event => this.dragEnd(event))); }); } dropSubscription() { const dragDropSub = this.dragDropService.newSubscription(); dragDropSub.add(this.dragDropService.dropEvent.subscribe((event) => { this.mouseOverElement = undefined; this.renderer.removeClass(this.el.nativeElement, this.dragOverClass); this.dropEndEvent.emit(event); // 兼容虚拟滚动后被销毁 if (this.isDestroyed) { if (this.dropEndEvent.schedulerFns && this.dropEndEvent.schedulerFns.size > 0) { this.dropEndEvent.forceCallback(event, true); } } if (this.dragDropService.dragOriginPlaceholder) { if (this.originPlaceholder && this.originPlaceholder.removeDelay > 0 && !this.dragDropService.dropOnOrigin) { // 非drop到自己的情况 this.delayRemoveOriginPlaceholder(); } else { this.removeOriginPlaceholder(); } this.dragDropService.draggedElIdentity = undefined; } this.dragDropService.subscription.unsubscribe(); })); dragDropSub.add(this.dragDropService.dragElShowHideEvent.subscribe(this.dragElShowHideEvent)); } ngAfterViewInit() { this.applyDragHandleClass(); if (this.dragIdentity) { if (this.dragDropService.draggedEl && this.dragIdentity === this.dragDropService.draggedElIdentity) { if (this.originPlaceholder && this.originPlaceholder.show !== false) { this.insertOriginPlaceholder(); } this.dragDropService.draggedEl = this.el.nativeElement; this.el.nativeElement.style.display = 'none'; // recovery don't need to emit event } } } ngOnDestroy() { // 兼容虚拟滚动后被销毁 this.isDestroyed = true; if (this.dragDropService.draggedEl === this.el.nativeElement) { this.destroyDragEndSub = new Subscription(); this.destroyDragEndSub.add(fromEvent(this.el.nativeElement, 'dragend').subscribe(event => { this.dragEnd(event); if (this.dropEndEvent.schedulerFns && this.dropEndEvent.schedulerFns.size > 0) { this.dropEndEvent.forceCallback(event, true); } this.destroyDragEndSub.unsubscribe(); this.destroyDragEndSub = undefined; })); if (this.originPlaceholder && this.originPlaceholder.show !== false && this.dragDropService.dragOriginPlaceholder && this.dragDropService.draggedElIdentity) { // 如果有originPlaceholder 则销毁 this.removeOriginPlaceholder(); } } this.dragsSub.unsubscribe(); } dragStart(e) { if (this.allowDrag(e)) { this.renderer.addClass(this.el.nativeElement, this.dragOverClass); this.dragDropService.dragData = this.dragData; this.dragDropService.scope = this.dragScope; this.dragDropService.draggedEl = this.el.nativeElement; this.dragDropService.draggedElIdentity = this.dragIdentity; this.dragDropService.dragFollow = this.enableDragFollow; this.dragDropService.dragFollowOptions = this.dragFollowOptions; this.dragDropService.dragItemParentName = this.dragItemParentName; this.dragDropService.dragItemChildrenName = this.dragItemChildrenName; this.beforeDragStartEvent.next(true); if (this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate) { this.dragDropService.dragFollow = true; this.dragDropService.dragPreviewDirective = this.dragPreviewDirective; } if (this.batchDraggable) { if (this.batchDraggable.dragData) { // 有dragData证明被加入到了group里 if (this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 1) { this.dragDropService.batchDragging = true; this.dragDropService.batchDragStyle = this.batchDraggable.batchDragStyle; } } else if (this.batchDraggable.batchDragLastOneAutoActiveEventKeys) { const batchActiveAble = this.batchDraggable.batchDragLastOneAutoActiveEventKeys .map(key => e[key]) .some(eventKey => eventKey === true); if (batchActiveAble) { if (this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 0) { this.batchDraggable.active(); if (!this.batchDraggable.dragData) { // 如果用户没做任何处理把项目加到组里则加到组里 this.batchDraggable.addToBatchGroup(); } if (this.dragDropService.batchDragData.some(dragData => dragData.draggable === this)) { this.dragDropService.batchDragging = true; this.dragDropService.batchDragStyle = this.batchDraggable.batchDragStyle; } } } } } const targetOffset = this.el.nativeElement.getBoundingClientRect(); if (this.dragDropService.dragFollow) { const mousePositionXY = this.mousePosition(e); // 用于出现transform的场景position:fixed相对位置变更 const transformOffset = this.checkAndGetViewPointChange(this.el.nativeElement); this.dragDropService.dragOffset = { left: targetOffset.left, top: targetOffset.top, offsetLeft: mousePositionXY.x - targetOffset.left + transformOffset.offsetX, offsetTop: mousePositionXY.y - targetOffset.top + transformOffset.offsetY, width: targetOffset.width, height: targetOffset.height }; this.dragDropService.enableDraggedCloneNodeFollowMouse(); } else { this.dragDropService.dragOffset = { left: targetOffset.left, top: targetOffset.top, offsetLeft: null, offsetTop: null, width: targetOffset.width, height: targetOffset.height }; } if (this.originPlaceholder && this.originPlaceholder.show !== false) { this.insertOriginPlaceholder(false); } if (this.dragDropService.batchDragging && this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 1) { this.dragDropService.batchDragData.map(dragData => dragData.draggable) .filter(draggable => draggable && draggable !== this) .forEach((draggable) => { if (draggable.originPlaceholder && draggable.originPlaceholder.show !== false) { draggable.insertOriginPlaceholder(true, false); draggable.el.nativeElement.style.display = 'none'; } else { setTimeout(() => { draggable.el.nativeElement.style.display = 'none'; }); } }); } // Firefox requires setData() to be called otherwise the drag does not work. if (e.dataTransfer !== null) { e.dataTransfer.setData('text', ''); } e.dataTransfer.effectAllowed = this.dragEffect; this.dropSubscription(); if (this.dragDropService.dragFollow) { if (typeof DataTransfer.prototype.setDragImage === 'function') { e.dataTransfer.setDragImage(this.dragDropService.dragEmptyImage, 0, 0); } else { e.srcElement.style.display = 'none'; this.dragDropService.dragElShowHideEvent.next(false); } } e.stopPropagation(); this.dragStartEvent.emit(e); this.dragDropService.dragStartEvent.next(e); } else { e.preventDefault(); } } dragEnd(e) { this.renderer.removeClass(this.el.nativeElement, this.dragOverClass); this.dragDropService.dragEndEvent.next(e); this.mouseOverElement = undefined; if (this.dragDropService.draggedEl) { // 当dom被清除的的时候不会触发dragend,所以清理工作部分交给了drop,但是内部排序的时候dom不会被清理,dragend防止和drop重复操作清理动作 if (this.dragDropService.dragFollow) { this.dragDropService.disableDraggedCloneNodeFollowMouse(); } if (this.dragDropService.dragOriginPlaceholder) { this.removeOriginPlaceholder(); } if (this.dragDropService.batchDragging && this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 1) { this.dragDropService.batchDragData.map(dragData => dragData.draggable) .filter(draggable => draggable && draggable !== this) .forEach((draggable) => { if (draggable.originPlaceholder && draggable.originPlaceholder.show !== false) { draggable.el.nativeElement.style.display = ''; draggable.removeOriginPlaceholder(); } else { draggable.el.nativeElement.style.display = ''; } }); } if (this.batchDraggable && !this.batchDraggable.batchDragActive) { this.batchDraggable.removeFromBatchGroup(); this.dragDropService.batchDragging = false; this.dragDropService.batchDragStyle = undefined; } if (this.dragDropService.subscription) { this.dragDropService.subscription.unsubscribe(); } this.dragDropService.dragData = undefined; this.dragDropService.scope = undefined; this.dragDropService.draggedEl = undefined; this.dragDropService.dragFollow = undefined; this.dragDropService.dragFollowOptions = undefined; this.dragDropService.dragOffset = undefined; this.dragDropService.draggedElIdentity = undefined; this.dragDropService.dragPreviewDirective = undefined; } e.stopPropagation(); e.preventDefault(); this.dragEndEvent.emit(e); } mouseover(e) { this.mouseOverElement = e.target; } allowDrag(e) { if (!this.draggable) { return false; } if (this.batchDraggable && !this.batchDraggable.allowAddToBatchGroup()) { // 批量拖拽判断group是否相同 return false; } if (this.dragHandle) { if (e && e.fromTouch) { return true; } // from touchstart dispatch event if (!this.mouseOverElement) { return false; } return Utils.matches(this.mouseOverElement, this.dragHandle); } else { return true; } } applyDragHandleClass() { const dragElement = this.getDragHandleElement(); if (!dragElement) { return; } if (this.draggable) { Utils.addClass(dragElement, this.dragHandleClass); } else { Utils.removeClass(this.el, this.dragHandleClass); } } getDragHandleElement() { let dragElement = this.el; if (this.dragHandle) { dragElement = this.el.nativeElement.querySelector(this.dragHandle); } return dragElement; } mousePosition(event) { return { x: event.clientX, y: event.clientY }; } findNextSibling(currentNextSibling) { if (!this.dragDropService.batchDragData) { return currentNextSibling; } else { if (this.dragDropService.batchDragData .map(dragData => dragData.draggable && dragData.draggable.el.nativeElement) .indexOf(currentNextSibling) > -1) { currentNextSibling = currentNextSibling.nextSibling; } return currentNextSibling; } } checkAndGetViewPointChange(element) { if (!element.parentNode) { return null; } // 模拟一个元素测预测位置和最终位置是否符合,如果不符合则是有transform等造成的偏移 const elementPosition = element.getBoundingClientRect(); const testEl = this.document.createElement('div'); Utils.addElStyles(testEl, { opacity: '0', position: 'fixed', top: elementPosition.top + 'px', left: elementPosition.left + 'px', width: '1px', height: '1px', zIndex: '-999999', }); element.parentNode.appendChild(testEl); const testElPosition = testEl.getBoundingClientRect(); element.parentNode.removeChild(testEl); return { offsetX: testElPosition.left - elementPosition.left, offsetY: testElPosition.top - elementPosition.top }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DraggableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DragDropService }, { token: i0.NgZone }, { token: i2.DragPreviewDirective, optional: true, self: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DraggableDirective, selector: "[dDraggable]", inputs: { dragData: "dragData", dragHandle: "dragHandle", dragEffect: "dragEffect", dragScope: "dragScope", dragHandleClass: "dragHandleClass", dragOverClass: "dragOverClass", disabled: "disabled", enableDragFollow: "enableDragFollow", dragFollowOptions: "dragFollowOptions", originPlaceholder: "originPlaceholder", dragIdentity: "dragIdentity", dragItemParentName: "dragItemParentName", dragItemChildrenName: "dragItemChildrenName" }, outputs: { dragStartEvent: "dragStartEvent", dragEvent: "dragEvent", dragEndEvent: "dragEndEvent", dropEndEvent: "dropEndEvent" }, host: { properties: { "draggable": "this.draggable", "attr.data-drag-handle-selector": "this.dragHandle" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DraggableDirective, decorators: [{ type: Directive, args: [{ selector: '[dDraggable]' }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DragDropService }, { type: i0.NgZone }, { type: i2.DragPreviewDirective, decorators: [{ type: Optional }, { type: Self }] }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { draggable: [{ type: HostBinding, args: ['draggable'] }], dragData: [{ type: Input }], dragHandle: [{ type: HostBinding, args: ['attr.data-drag-handle-selector'] }, { type: Input }], dragEffect: [{ type: Input }], dragScope: [{ type: Input }], dragHandleClass: [{ type: Input }], dragOverClass: [{ type: Input }], dragStartEvent: [{ type: Output }], dragEvent: [{ type: Output }], dragEndEvent: [{ type: Output }], dropEndEvent: [{ type: Output }], disabled: [{ type: Input }], enableDragFollow: [{ type: Input }], dragFollowOptions: [{ type: Input }], originPlaceholder: [{ type: Input }], dragIdentity: [{ type: Input }], dragItemParentName: [{ type: Input }], dragItemChildrenName: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldnVpL2RyYWdkcm9wL2RpcmVjdGl2ZXMvZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNVLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUNsRCxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFDekYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7QUFLaEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBbUQ3QixJQUNXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLFFBQVEsQ0FBQyxLQUFjO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ25DLENBQUM7SUE4QkQsWUFBbUIsRUFBYyxFQUFVLFFBQW1CLEVBQVUsZUFBZ0MsRUFBVSxNQUFjLEVBQ3pGLG9CQUEwQyxFQUE0QixHQUFRO1FBRGxHLE9BQUUsR0FBRixFQUFFLENBQVk7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QkFEbEIsV0FBVzt1QkFBQyxnQ0FBZ0M7O3NCQUM1QyxLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUlHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0ksY0FBYztzQkFBdkIsTUFBTTtnQkFPRyxTQUFTO3NCQUFsQixNQUFNO2dCQUtHLFlBQVk7c0JBQXJCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFSSxRQUFRO3NCQURsQixLQUFLO2dCQVdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQU9HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZywgSW5qZWN0LCBJbnB1dCwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgUmVuZGVyZXIyLCBTZWxmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERyYWdEcm9wU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2RyYWctZHJvcC5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vc2hhcmVkL3V0aWxzJztcbmltcG9ydCB7IFByZXNlcnZlTmV4dEV2ZW50RW1pdHRlciB9IGZyb20gJy4vLi4vc2hhcmVkL3ByZXNlcnZlLW5leHQtZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgeyBEcmFnUHJldmlld0RpcmVjdGl2ZSB9IGZyb20gJy4vZHJhZy1wcmV2aWV3LmRpcmVjdGl2ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkRHJhZ2dhYmxlXSdcbn0pXG4vKipcbiAqIE1ha2VzIGFuIGVsZW1lbnQgZHJhZ2dhYmxlIGJ5IGFkZGluZyB0aGUgZHJhZ2dhYmxlIGh0bWwgYXR0cmlidXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmFnZ2FibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBIb3N0QmluZGluZygnZHJhZ2dhYmxlJykgZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIGRyb3BwYWJsZSBkaXJlY3RpdmUgb24gaXRzIGBkcm9wRXZlbnQoKWAgZXZlbnQuXG4gICAqL1xuICBASW5wdXQoKSBkcmFnRGF0YTtcblxuICAvKipcbiAgICogVGhlIHNlbGVjdG9yIHRoYXQgZGVmaW5lcyB0aGUgZHJhZyBIYW5kbGUuIElmIGRlZmluZWQgZHJhZyB3aWxsIG9ubHkgYmUgYWxsb3dlZCBpZiBkcmFnZ2VkIGZyb20gdGhlIHNlbGVjdG9yIGVsZW1lbnQuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1kcmFnLWhhbmRsZS1zZWxlY3RvcicpIC8vIGhvc3QtYmluZGluZyBhdHRyaWJ1dGUgZm9yIGNvbW11bmljYXRlIHdpdGggdG91Y2ggc3VwcG9ydCBqc1xuICBASW5wdXQoKSBkcmFnSGFuZGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnRseSBub3QgdXNlZFxuICAgKi9cbiAgQElucHV0KCkgZHJhZ0VmZmVjdCA9ICdtb3ZlJztcblxuICAvKipcbiAgICogRGVmaW5lcyBjb21wYXRpYmxlIGRyYWcgZHJvcCBwYWlycy4gVmFsdWVzIG11c3QgbWF0Y2ggYm90aCBpbiBkcmFnZ2FibGUgYW5kIGRyb3BwYWJsZS5kcm9wU2NvcGUuXG4gICAqL1xuICBASW5wdXQoKSBkcmFnU2NvcGU6IHN0cmluZyB8IEFycmF5PHN0cmluZz4gPSAnZGVmYXVsdCc7XG5cbiAgQElucHV0KCkgZHJhZ0hhbmRsZUNsYXNzID0gJ2RyYWctaGFuZGxlJztcbiAgLyoqXG4gICAqIENTUyBjbGFzcyBhcHBsaWVkIG9uIHRoZSBkcmFnZ2FibGUgdGhhdCBpcyBhcHBsaWVkIHdoZW4gdGhlIGl0ZW0gaXMgYmVpbmcgZHJhZ2dlZC5cbiAgICovXG4gIEBJbnB1dCgpIGRyYWdPdmVyQ2xhc3M6IHN0cmluZztcblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBEcmFnIGlzIHN0YXJ0ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBkcmFnU3RhcnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogRXZlbnQgZmlyZWQgd2hpbGUgdGhlIGVsZW1lbnQgaXMgYmVpb