UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

213 lines 28.7 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Directive, ElementRef, EventEmitter, HostListener, Input, Output, } from "@angular/core"; import _isNil from "lodash/isNil"; import throttle from "lodash/throttle"; import { DragAndDropService } from "./drag-and-drop.service"; import { scrollConstants } from "./dragdrop.constants"; import * as i0 from "@angular/core"; import * as i1 from "./drag-and-drop.service"; /** * Directive that provides behavior of droppable zone for an element * * __Usage:__ * * Bind this directive to an element that will be a zone for dropping elements there. * * `<div nuiDroppable>Some content</div>` * * Make sure that this zone has some content, because droppable directive doesn't set any height * to the element. This won't work: * * `<div nuiDroppable></div>` * * To subscribe to an event `dragOver, dragEnter, dragLeave, dropSuccess` just transmit an attribute * * `<div nuiDroppable (dropSuccess)="onDropObject($event)"></div>` * * And `onDropObject` method will look like that: * * `public onDropObject(dropEvent: INuiDropEvent) { * * const extractedData = dropEvent.payload; //some data that you passed to draggable directive * * const actualEvent = dropEvent.event; // an HTML 5 event (native) * * };` * If you want to validate if data can be dropped you can set validator. * By default if you don't specify it all drags will be accepted. * * `<div nuiDroppable [validator]="validator"></div>` * * Validator is an object that should implement IDropValidator interface. * * `interface IDropValidator { * isValidDropTarget(payload: any, isExternal?: boolean): boolean; * };` * Payload is an dragged payload, and isExternal will be set to true if source of drag is NOT nui-draggable (it can be some other document, excel file etc.) * * You can also specify css classes that will be set: * * `dragOverClass` - will set this class when drag is over and validator returns true or there is no validator * * `invalidDragOverClass` - will set this class when drag is over and validator returns false * * `dropIndicatorClass` - will set this class when you start dragging something that can be dropped on this nui-droppable */ /** * <example-url>./../examples/index.html#/dragdrop</example-url> */ /** @ignore */ export class DroppableDirective { onDragEnter(event) { const payload = this.dragAndDropService.getDragPayload(event); if (this.validateDrop(payload) && this.dragElements.length === 0) { this.elRef.nativeElement.classList.remove(this.dropIndicatorClass); this.elRef.nativeElement.classList.add(this.dragOverClass); this.dragEnter.emit(event); } else if (this.dragElements.length === 0 && this.invalidDragOverClass) { this.elRef.nativeElement.classList.add(this.invalidDragOverClass); } this.dragElements.push(event.target); event.preventDefault(); } onDragOver(event) { const payload = this.dragAndDropService.getDragPayload(event); if (this.validateDrop(payload)) { this.dragThrottle(event); } event.preventDefault(); } onDragLeave(event) { const payload = this.dragAndDropService.getDragPayload(event); this.dragElements = this.dragElements.filter((el) => el !== event.target); if (this.validateDrop(payload) && this.dragElements.length === 0) { this.elRef.nativeElement.classList.remove(this.dragOverClass); if (!payload?.isExternal) { // dropIndicatorClass shouldn't be added if dragged item comes from outside of the browser - there is no easy way to remove it later. this.elRef.nativeElement.classList.add(this.dropIndicatorClass); } this.dragLeave.emit(event); } else if (this.dragElements.length === 0 && this.invalidDragOverClass) { this.elRef.nativeElement.classList.remove(this.invalidDragOverClass); } } onDrop(event) { const payload = this.dragAndDropService.getDragPayload(event); event.preventDefault(); if (this.validateDrop(payload)) { this.dragElements = []; if ((typeof DragEvent !== "undefined" && event instanceof DragEvent) || event.dataTransfer) { this.dropSuccess.emit({ event, payload: payload.data }); } this.elRef.nativeElement.classList.remove(this.dragOverClass); } else if (!_isNil(this.invalidDragOverClass)) { this.elRef.nativeElement.classList.remove(this.invalidDragOverClass); } this.dragAndDropService.resetPayload(); event.stopPropagation(); return false; } constructor(elRef, dragAndDropService) { this.elRef = elRef; this.dragAndDropService = dragAndDropService; this.dragOverClass = "nui-drag--over"; this.dragOver = new EventEmitter(); this.dragEnter = new EventEmitter(); this.dragLeave = new EventEmitter(); this.dropSuccess = new EventEmitter(); this.dragElements = []; this.dragThrottle = throttle((dragEvent) => { this.dragOver.emit(dragEvent); }, scrollConstants.checkIntervalInMs, { trailing: false }); } ngOnInit() { this.onDragStateChangedSubscription = this.dragAndDropService.onDragStateChanged.subscribe((item) => { if (!_isNil(this.dropIndicatorClass) && this.validateDrop({ data: item.payload, isExternal: false, })) { if (item.isInProgress) { this.elRef.nativeElement.classList.add(this.dropIndicatorClass); } else { this.elRef.nativeElement.classList.remove(this.dropIndicatorClass); } } }); } validateDrop(payload) { if (!this.dropValidator) { return true; // if there is no drop validator specified drop is always valid } return this.dropValidator.isValidDropTarget(payload.data, payload.isExternal); } ngOnDestroy() { if (!_isNil(this.onDragStateChangedSubscription)) { this.onDragStateChangedSubscription.unsubscribe(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DroppableDirective, deps: [{ token: i0.ElementRef }, { token: i1.DragAndDropService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: DroppableDirective, selector: "[nuiDroppable]", inputs: { dragOverClass: "dragOverClass", invalidDragOverClass: "invalidDragOverClass", dropIndicatorClass: "dropIndicatorClass", dropValidator: "dropValidator" }, outputs: { dragOver: "dragOver", dragEnter: "dragEnter", dragLeave: "dragLeave", dropSuccess: "dropSuccess" }, host: { listeners: { "dragenter": "onDragEnter($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DroppableDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiDroppable]", }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DragAndDropService }], propDecorators: { dragOverClass: [{ type: Input }], invalidDragOverClass: [{ type: Input }], dropIndicatorClass: [{ type: Input }], dropValidator: [{ type: Input }], dragOver: [{ type: Output }], dragEnter: [{ type: Output }], dragLeave: [{ type: Output }], dropSuccess: [{ type: Output }], onDragEnter: [{ type: HostListener, args: ["dragenter", ["$event"]] }], onDragOver: [{ type: HostListener, args: ["dragover", ["$event"]] }], onDragLeave: [{ type: HostListener, args: ["dragleave", ["$event"]] }], onDrop: [{ type: HostListener, args: ["drop", ["$event"]] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcHBhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vZGlyZWN0aXZlcy9kcmFnZHJvcC9kcm9wcGFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFDO0FBQ2xDLE9BQU8sUUFBUSxNQUFNLGlCQUFpQixDQUFDO0FBR3ZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBU3ZEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOENHO0FBQ0g7O0dBRUc7QUFFSCxjQUFjO0FBSWQsTUFBTSxPQUFPLGtCQUFrQjtJQXdCM0IsV0FBVyxDQUFDLEtBQWlCO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZ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QXJCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBZVAsV0FBVztzQkFEVixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFrQnJDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXBDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBd0JyQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC9pc05pbFwiO1xuaW1wb3J0IHRocm90dGxlIGZyb20gXCJsb2Rhc2gvdGhyb3R0bGVcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IERyYWdBbmREcm9wU2VydmljZSB9IGZyb20gXCIuL2RyYWctYW5kLWRyb3Auc2VydmljZVwiO1xuaW1wb3J0IHsgc2Nyb2xsQ29uc3RhbnRzIH0gZnJvbSBcIi4vZHJhZ2Ryb3AuY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICAgIElEcmFnRXZlbnQsXG4gICAgSURyYWdQYXlsb2FkLFxuICAgIElEcmFnU3RhdGUsXG4gICAgSURyb3BFdmVudCxcbiAgICBJRHJvcFZhbGlkYXRvcixcbn0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB0aGF0IHByb3ZpZGVzIGJlaGF2aW9yIG9mIGRyb3BwYWJsZSB6b25lIGZvciBhbiBlbGVtZW50XG4gKlxuICogIF9fVXNhZ2U6X19cbiAqXG4gKiBCaW5kIHRoaXMgZGlyZWN0aXZlIHRvIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGEgem9uZSBmb3IgZHJvcHBpbmcgZWxlbWVudHMgdGhlcmUuXG4gKlxuICogICAgICAgIGA8ZGl2IG51aURyb3BwYWJsZT5Tb21lIGNvbnRlbnQ8L2Rpdj5gXG4gKlxuICogTWFrZSBzdXJlIHRoYXQgdGhpcyB6b25lIGhhcyBzb21lIGNvbnRlbnQsIGJlY2F1c2UgZHJvcHBhYmxlIGRpcmVjdGl2ZSBkb2Vzbid0IHNldCBhbnkgaGVpZ2h0XG4gKiB0byB0aGUgZWxlbWVudC4gVGhpcyB3b24ndCB3b3JrOlxuICpcbiAqICAgICAgICBgPGRpdiBudWlEcm9wcGFibGU+PC9kaXY+YFxuICpcbiAqIFRvIHN1YnNjcmliZSB0byBhbiBldmVudCBgZHJhZ092ZXIsIGRyYWdFbnRlciwgZHJhZ0xlYXZlLCBkcm9wU3VjY2Vzc2AganVzdCB0cmFuc21pdCBhbiBhdHRyaWJ1dGVcbiAqXG4gKiAgICAgICAgIGA8ZGl2IG51aURyb3BwYWJsZSAoZHJvcFN1Y2Nlc3MpPVwib25Ecm9wT2JqZWN0KCRldmVudClcIj48L2Rpdj5gXG4gKlxuICogQW5kIGBvbkRyb3BPYmplY3RgIG1ldGhvZCB3aWxsIGxvb2sgbGlrZSB0aGF0OlxuICpcbiAqICAgICAgICAgYHB1YmxpYyBvbkRyb3BPYmplY3QoZHJvcEV2ZW50OiBJTnVpRHJvcEV2ZW50KSB7XG4gKlxuICogICAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZERhdGEgPSBkcm9wRXZlbnQucGF5bG9hZDsgLy9zb21lIGRhdGEgdGhhdCB5b3UgcGFzc2VkIHRvIGRyYWdnYWJsZSBkaXJlY3RpdmVcbiAqXG4gKiAgICAgICAgICAgICAgY29uc3QgYWN0dWFsRXZlbnQgPSBkcm9wRXZlbnQuZXZlbnQ7IC8vIGFuIEhUTUwgNSBldmVudCAobmF0aXZlKVxuICpcbiAqICAgICAgICAgIH07YFxuICogSWYgeW91IHdhbnQgdG8gdmFsaWRhdGUgaWYgZGF0YSBjYW4gYmUgZHJvcHBlZCB5b3UgY2FuIHNldCB2YWxpZGF0b3IuXG4gKiBCeSBkZWZhdWx0IGlmIHlvdSBkb24ndCBzcGVjaWZ5IGl0IGFsbCBkcmFncyB3aWxsIGJlIGFjY2VwdGVkLlxuICpcbiAqICAgICAgICAgIGA8ZGl2IG51aURyb3BwYWJsZSBbdmFsaWRhdG9yXT1cInZhbGlkYXRvclwiPjwvZGl2PmBcbiAqXG4gKiBWYWxpZGF0b3IgaXMgYW4gb2JqZWN0IHRoYXQgc2hvdWxkIGltcGxlbWVudCBJRHJvcFZhbGlkYXRvciBpbnRlcmZhY2UuXG4gKlxuICogICAgICAgICAgYGludGVyZmFjZSBJRHJvcFZhbGlkYXRvciB7XG4gKiAgICAgICAgICAgICAgaXNWYWxpZERyb3BUYXJnZXQocGF5bG9hZDogYW55LCBpc0V4dGVybmFsPzogYm9vbGVhbik6IGJvb2xlYW47XG4gKiAgICAgICAgICB9O2BcbiAqIFBheWxvYWQgaXMgYW4gZHJhZ2dlZCBwYXlsb2FkLCBhbmQgaXNFeHRlcm5hbCB3aWxsIGJlIHNldCB0byB0cnVlIGlmIHNvdXJjZSBvZiBkcmFnIGlzIE5PVCBudWktZHJhZ2dhYmxlIChpdCBjYW4gYmUgc29tZSBvdGhlciBkb2N1bWVudCwgZXhjZWwgZmlsZSBldGMuKVxuICpcbiAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGNzcyBjbGFzc2VzIHRoYXQgd2lsbCBiZSBzZXQ6XG4gKlxuICogYGRyYWdPdmVyQ2xhc3NgIC0gd2lsbCBzZXQgdGhpcyBjbGFzcyB3aGVuIGRyYWcgaXMgb3ZlciBhbmQgdmFsaWRhdG9yIHJldHVybnMgdHJ1ZSBvciB0aGVyZSBpcyBubyB2YWxpZGF0b3JcbiAqXG4gKiBgaW52YWxpZERyYWdPdmVyQ2xhc3NgIC0gd2lsbCBzZXQgdGhpcyBjbGFzcyB3aGVuIGRyYWcgaXMgb3ZlciBhbmQgdmFsaWRhdG9yIHJldHVybnMgZmFsc2VcbiAqXG4gKiBgZHJvcEluZGljYXRvckNsYXNzYCAtIHdpbGwgc2V0IHRoaXMgY2xhc3Mgd2hlbiB5b3Ugc3RhcnQgZHJhZ2dpbmcgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGRyb3BwZWQgb24gdGhpcyBudWktZHJvcHBhYmxlXG4gKi9cbi8qKlxuICogPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvZHJhZ2Ryb3A8L2V4YW1wbGUtdXJsPlxuICovXG5cbi8qKiBAaWdub3JlICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbbnVpRHJvcHBhYmxlXVwiLFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wcGFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCkgZHJhZ092ZXJDbGFzcyA9IFwibnVpLWRyYWctLW92ZXJcIjtcbiAgICBASW5wdXQoKSBpbnZhbGlkRHJhZ092ZXJDbGFzczogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRyb3BJbmRpY2F0b3JDbGFzczogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRyb3BWYWxpZGF0b3I6IElEcm9wVmFsaWRhdG9yO1xuXG4gICAgQE91dHB1dCgpIGRyYWdPdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIGRyYWdFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICAgIEBPdXRwdXQoKSBkcmFnTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcbiAgICBAT3V0cHV0KCkgZHJvcFN1Y2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPElEcm9wRXZlbnQ+KCk7XG5cbiAgICBwcml2YXRlIGRyYWdFbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG5cbiAgICBwcml2YXRlIG9uRHJhZ1N0YXRlQ2hhbmdlZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHJpdmF0ZSBkcmFnVGhyb3R0bGUgPSB0aHJvdHRsZShcbiAgICAgICAgKGRyYWdFdmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyYWdPdmVyLmVtaXQoZHJhZ0V2ZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2Nyb2xsQ29uc3RhbnRzLmNoZWNrSW50ZXJ2YWxJbk1zLFxuICAgICAgICB7IHRyYWlsaW5nOiBmYWxzZSB9XG4gICAgKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoXCJkcmFnZW50ZXJcIiwgW1wiJGV2ZW50XCJdKVxuICAgIG9uRHJhZ0VudGVyKGV2ZW50OiBJRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmRyYWdBbmREcm9wU2VydmljZS5nZXREcmFnUGF5bG9hZChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRHJvcChwYXlsb2FkKSAmJiB0aGlzLmRyYWdFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZHJvcEluZGljYXRvckNsYXNzKTtcbiAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZHJhZ092ZXJDbGFzcyk7XG4gICAgICAgICAgICB0aGlzLmRyYWdFbnRlci5lbWl0KGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5pbnZhbGlkRHJhZ092ZXJDbGFzc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuaW52YWxpZERyYWdPdmVyQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhZ0VsZW1lbnRzLnB1c2goPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyYWdvdmVyXCIsIFtcIiRldmVudFwiXSlcbiAgICBvbkRyYWdPdmVyKGV2ZW50OiBJRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmRyYWdBbmREcm9wU2VydmljZS5nZXREcmFnUGF5bG9hZChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRHJvcChwYXlsb2FkKSkge1xuICAgICAgICAgICAgdGhpcy5kcmFnVGhyb3R0bGUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyYWdsZWF2ZVwiLCBbXCIkZXZlbnRcIl0pXG4gICAgb25EcmFnTGVhdmUoZXZlbnQ6IElEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZHJhZ0FuZERyb3BTZXJ2aWNlLmdldERyYWdQYXlsb2FkKGV2ZW50KTtcbiAgICAgICAgdGhpcy5kcmFnRWxlbWVudHMgPSB0aGlzLmRyYWdFbGVtZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAoZWwpID0+IGVsICE9PSBldmVudC50YXJnZXRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVEcm9wKHBheWxvYWQpICYmIHRoaXMuZHJhZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5kcmFnT3ZlckNsYXNzKTtcbiAgICAgICAgICAgIGlmICghcGF5bG9hZD8uaXNFeHRlcm5hbCkge1xuICAgICAgICAgICAgICAgIC8vIGRyb3BJbmRpY2F0b3JDbGFzcyBzaG91bGRuJ3QgYmUgYWRkZWQgaWYgZHJhZ2dlZCBpdGVtIGNvbWVzIGZyb20gb3V0c2lkZSBvZiB0aGUgYnJvd3NlciAtIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIHJlbW92ZSBpdCBsYXRlci5cbiAgICAgICAgICAgICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmRyb3BJbmRpY2F0b3JDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyYWdMZWF2ZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5pbnZhbGlkRHJhZ092ZXJDbGFzc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERyYWdPdmVyQ2xhc3NcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiZHJvcFwiLCBbXCIkZXZlbnRcIl0pXG4gICAgb25Ecm9wKGV2ZW50OiBJRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmRyYWdBbmREcm9wU2VydmljZS5nZXREcmFnUGF5bG9hZChldmVudCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRHJvcChwYXlsb2FkKSkge1xuICAgICAgICAgICAgdGhpcy5kcmFnRWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAodHlwZW9mIERyYWdFdmVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICBldmVudCBpbnN0YW5jZW9mIERyYWdFdmVudCkgfHxcbiAgICAgICAgICAgICAgICAoPGFueT5ldmVudCkuZGF0YVRyYW5zZmVyXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3BTdWNjZXNzLmVtaXQoeyBldmVudCwgcGF5bG9hZDogcGF5bG9hZC5kYXRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5kcmFnT3ZlckNsYXNzKTtcbiAgICAgICAgfSBlbHNlIGlmICghX2lzTmlsKHRoaXMuaW52YWxpZERyYWdPdmVyQ2xhc3MpKSB7XG4gICAgICAgICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREcmFnT3ZlckNsYXNzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhZ0FuZERyb3BTZXJ2aWNlLnJlc2V0UGF5bG9hZCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGRyYWdBbmREcm9wU2VydmljZTogRHJhZ0FuZERyb3BTZXJ2aWNlXG4gICAgKSB7fVxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkRyYWdTdGF0ZUNoYW5nZWRTdWJzY3JpcHRpb24gPVxuICAgICAgICAgICAgdGhpcy5kcmFnQW5kRHJvcFNlcnZpY2Uub25EcmFnU3RhdGVDaGFuZ2VkLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAoaXRlbTogSURyYWdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAhX2lzTmlsKHRoaXMuZHJvcEluZGljYXRvckNsYXNzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZURyb3Aoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW0ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcEluZGljYXRvckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcEluZGljYXRvckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZURyb3AocGF5bG9hZDogSURyYWdQYXlsb2FkKSB7XG4gICAgICAgIGlmICghdGhpcy5kcm9wVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gaWYgdGhlcmUgaXMgbm8gZHJvcCB2YWxpZGF0b3Igc3BlY2lmaWVkIGRyb3AgaXMgYWx3YXlzIHZhbGlkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcFZhbGlkYXRvci5pc1ZhbGlkRHJvcFRhcmdldChcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YSxcbiAgICAgICAgICAgIHBheWxvYWQuaXNFeHRlcm5hbFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFfaXNOaWwodGhpcy5vbkRyYWdTdGF0ZUNoYW5nZWRTdWJzY3JpcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLm9uRHJhZ1N0YXRlQ2hhbmdlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19