@ng-dnd/core
Version:
Drag and Drop for Angular
170 lines • 20 kB
JavaScript
import { Directive, ElementRef, Input, NgZone } from '@angular/core';
import { invariant } from './internal/invariant';
import { Subscription } from 'rxjs';
import * as i0 from "@angular/core";
/** @ignore */
const explanation = 'You can only pass exactly one connection object to [dropTarget]. ' +
'There is only one of each source/target/preview allowed per DOM element.';
/** @ignore */
export class AbstractDndDirective {
/** @ignore */
constructor(elRef, ngZone) {
this.elRef = elRef;
this.ngZone = ngZone;
this.deferredRequest = new Subscription();
}
ngOnChanges() {
invariant(typeof this.connection === 'object' && !Array.isArray(this.connection), explanation);
this.ngZone.runOutsideAngular(() => {
// discard an unresolved connection request
// in the case where the previous one succeeded, deferredRequest is
// already closed.
this.deferredRequest.unsubscribe();
// replace it with a new one
if (this.connection) {
this.deferredRequest = this.callHooks(this.connection);
}
});
}
ngOnDestroy() {
this.deferredRequest.unsubscribe();
}
callHooks(_conn) {
return new Subscription();
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: AbstractDndDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: AbstractDndDirective, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: AbstractDndDirective, decorators: [{
type: Directive
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }] });
/**
* Allows you to connect a {@link DropTarget} to an element in a component template.
*/
export class DropTargetDirective extends AbstractDndDirective {
/** Reduce typo confusion by allowing non-plural version of dropTargetTypes */
set dropTargetType(t) {
this.dropTargetTypes = t;
}
ngOnChanges() {
this.connection = this.dropTarget;
if (this.connection && this.dropTargetTypes != null) {
this.connection.setTypes(this.dropTargetTypes);
}
super.ngOnChanges();
}
callHooks(conn) {
return conn.connectDropTarget(this.elRef.nativeElement);
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DropTargetDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: DropTargetDirective, isStandalone: true, selector: "[dropTarget]", inputs: { dropTarget: "dropTarget", dropTargetTypes: "dropTargetTypes", dropTargetType: "dropTargetType" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DropTargetDirective, decorators: [{
type: Directive,
args: [{
selector: '[dropTarget]',
standalone: true,
}]
}], propDecorators: { dropTarget: [{
type: Input,
args: ['dropTarget']
}], dropTargetTypes: [{
type: Input,
args: ['dropTargetTypes']
}], dropTargetType: [{
type: Input,
args: ['dropTargetType']
}] } });
/** Allows you to connect a {@link DragSource} to an element in a component template. */
export class DragSourceDirective extends AbstractDndDirective {
constructor() {
super(...arguments);
/**
* Do not render an HTML5 preview. Only applies when using the HTML5 backend.
* It does not use { captureDraggingState: true } for IE11 support; that is broken.
*/
this.noHTML5Preview = false;
}
ngOnChanges() {
this.connection = this.dragSource;
if (this.connection && this.dragSourceType != null) {
this.connection.setType(this.dragSourceType);
}
super.ngOnChanges();
}
callHooks(conn) {
const sub = new Subscription();
sub.add(conn.connectDragSource(this.elRef.nativeElement, this.dragSourceOptions));
if (this.noHTML5Preview) {
sub.add(conn.connectDragPreview(getEmptyImage()));
}
return sub;
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DragSourceDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: DragSourceDirective, isStandalone: true, selector: "[dragSource]", inputs: { dragSource: "dragSource", dragSourceType: "dragSourceType", dragSourceOptions: "dragSourceOptions", noHTML5Preview: "noHTML5Preview" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DragSourceDirective, decorators: [{
type: Directive,
args: [{
selector: '[dragSource]',
standalone: true,
}]
}], propDecorators: { dragSource: [{
type: Input,
args: ['dragSource']
}], dragSourceType: [{
type: Input,
args: ['dragSourceType']
}], dragSourceOptions: [{
type: Input,
args: ['dragSourceOptions']
}], noHTML5Preview: [{
type: Input,
args: ['noHTML5Preview']
}] } });
/**
* Allows you to specify which element a {@link DragSource} should screenshot
* as an HTML5 drag preview.
*
* Only relevant when using the HTML5 backend.
*/
export class DragPreviewDirective extends AbstractDndDirective {
ngOnChanges() {
this.connection = this.dragPreview;
super.ngOnChanges();
}
callHooks(conn) {
return conn.connectDragPreview(this.elRef.nativeElement, this.dragPreviewOptions);
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DragPreviewDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: DragPreviewDirective, isStandalone: true, selector: "[dragPreview]", inputs: { dragPreview: "dragPreview", dragPreviewOptions: "dragPreviewOptions" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DragPreviewDirective, decorators: [{
type: Directive,
args: [{
selector: '[dragPreview]',
standalone: true,
}]
}], propDecorators: { dragPreview: [{
type: Input,
args: ['dragPreview']
}], dragPreviewOptions: [{
type: Input,
args: ['dragPreviewOptions']
}] } });
// import { getEmptyImage } from 'react-dnd-html5-backend';
// we don't want to depend on the backend, so here that is, copied
/** @ignore */
let emptyImage;
/**
* Returns a 0x0 empty GIF for use as a drag preview.
* @ignore
*/
function getEmptyImage() {
if (!emptyImage) {
emptyImage = new Image();
emptyImage.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
}
return emptyImage;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRpcmVjdGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG5kLWRpcmVjdGl2ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFFM0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBS3BDLGNBQWM7QUFDZCxNQUFNLFdBQVcsR0FDZixtRUFBbUU7SUFDbkUsMEVBQTBFLENBQUM7QUFFN0UsY0FBYztBQUVkLE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsY0FBYztJQUNkLFlBQ1ksS0FBaUIsRUFDbkIsTUFBYztRQURaLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUxoQixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFNMUMsQ0FBQztJQUVKLFdBQVc7UUFDVCxTQUFTLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLDJDQUEyQztZQUMzQyxtRUFBbUU7WUFDbkUsa0JBQWtCO1lBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkMsNEJBQTRCO1lBQzVCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELENBQUM7UUFDSCxDQUFD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Z0I7O0FBb0J6Qjs7Ozs7R0FLRztBQUtILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxvQkFBb0I7SUFPNUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNuQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLFNBQVMsQ0FBQyxJQUFxQjtRQUN2QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNwRixDQUFDO2lJQWRVLG9CQUFvQjtxSEFBcEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQUpoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBSXVCLFdBQVc7c0JBQWhDLEtBQUs7dUJBQUMsYUFBYTtnQkFFUyxrQkFBa0I7c0JBQTlDLEtBQUs7dUJBQUMsb0JBQW9COztBQVk3QiwyREFBMkQ7QUFDM0Qsa0VBQWtFO0FBQ2xFLGNBQWM7QUFDZCxJQUFJLFVBQTRCLENBQUM7QUFDakM7OztHQUdHO0FBQ0gsU0FBUyxhQUFhO0lBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixVQUFVLENBQUMsR0FBRyxHQUFHLDRFQUE0RSxDQUFDO0lBQ2hHLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICcuL2ludGVybmFsL2ludmFyaWFudCc7XG5cbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRHJhZ1NvdXJjZSwgRHJvcFRhcmdldCB9IGZyb20gJy4vY29ubmVjdGlvbi10eXBlcyc7XG5pbXBvcnQgeyBEcmFnUHJldmlld09wdGlvbnMsIERyYWdTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi9jb25uZWN0b3JzJztcbmltcG9ydCB7IFR5cGVPclR5cGVBcnJheSB9IGZyb20gJy4vdHlwZS1pc2gnO1xuXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZXhwbGFuYXRpb24gPVxuICAnWW91IGNhbiBvbmx5IHBhc3MgZXhhY3RseSBvbmUgY29ubmVjdGlvbiBvYmplY3QgdG8gW2Ryb3BUYXJnZXRdLiAnICtcbiAgJ1RoZXJlIGlzIG9ubHkgb25lIG9mIGVhY2ggc291cmNlL3RhcmdldC9wcmV2aWV3IGFsbG93ZWQgcGVyIERPTSBlbGVtZW50Lic7XG5cbi8qKiBAaWdub3JlICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBBYnN0cmFjdERuZERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIGNvbm5lY3Rpb246IGFueTtcbiAgcHJpdmF0ZSBkZWZlcnJlZFJlcXVlc3QgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGludmFyaWFudCh0eXBlb2YgdGhpcy5jb25uZWN0aW9uID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh0aGlzLmNvbm5lY3Rpb24pLCBleHBsYW5hdGlvbik7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgLy8gZGlzY2FyZCBhbiB1bnJlc29sdmVkIGNvbm5lY3Rpb24gcmVxdWVzdFxuICAgICAgLy8gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHByZXZpb3VzIG9uZSBzdWNjZWVkZWQsIGRlZmVycmVkUmVxdWVzdCBpc1xuICAgICAgLy8gYWxyZWFkeSBjbG9zZWQuXG4gICAgICB0aGlzLmRlZmVycmVkUmVxdWVzdC51bnN1YnNjcmliZSgpO1xuICAgICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgbmV3IG9uZVxuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmRlZmVycmVkUmVxdWVzdCA9IHRoaXMuY2FsbEhvb2tzKHRoaXMuY29ubmVjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlZmVycmVkUmVxdWVzdC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbGxIb29rcyhfY29ubjogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgfVxufVxuXG4vKipcbiAqIEFsbG93cyB5b3UgdG8gY29ubmVjdCBhIHtAbGluayBEcm9wVGFyZ2V0fSB0byBhbiBlbGVtZW50IGluIGEgY29tcG9uZW50IHRlbXBsYXRlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZHJvcFRhcmdldF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wVGFyZ2V0RGlyZWN0aXZlIGV4dGVuZHMgQWJzdHJhY3REbmREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBwcm90ZWN0ZWQgY29ubmVjdGlvbjogRHJvcFRhcmdldCB8IHVuZGVmaW5lZDtcblxuICAvKiogV2hpY2ggdGFyZ2V0IHRvIGNvbm5lY3QgdGhlIERPTSB0byAqL1xuICBASW5wdXQoJ2Ryb3BUYXJnZXQnKSBkcm9wVGFyZ2V0ITogRHJvcFRhcmdldDtcbiAgLyoqXG4gICAqIFNob3J0Y3V0IGZvciBzZXR0aW5nIGEgdHlwZSBvbiB0aGUgY29ubmVjdGlvbi5cbiAgICogTGV0cyB5b3UgdXNlIEFuZ3VsYXIgYmluZGluZyB0byBkbyBpdC4gUnVucyB7QGxpbmsgRHJvcFRhcmdldCNzZXRUeXBlc30uXG4gICAqL1xuICBASW5wdXQoJ2Ryb3BUYXJnZXRUeXBlcycpIGRyb3BUYXJnZXRUeXBlcz86IFR5cGVPclR5cGVBcnJheTtcbiAgLyoqIFJlZHVjZSB0eXBvIGNvbmZ1c2lvbiBieSBhbGxvd2luZyBub24tcGx1cmFsIHZlcnNpb24gb2YgZHJvcFRhcmdldFR5cGVzICovXG4gIEBJbnB1dCgnZHJvcFRhcmdldFR5cGUnKSBzZXQgZHJvcFRhcmdldFR5cGUodDogVHlwZU9yVHlwZUFycmF5KSB7XG4gICAgdGhpcy5kcm9wVGFyZ2V0VHlwZXMgPSB0O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gdGhpcy5kcm9wVGFyZ2V0O1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb24gJiYgdGhpcy5kcm9wVGFyZ2V0VHlwZXMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uLnNldFR5cGVzKHRoaXMuZHJvcFRhcmdldFR5cGVzKTtcbiAgICB9XG4gICAgc3VwZXIubmdPbkNoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYWxsSG9va3MoY29ubjogRHJvcFRhcmdldCkge1xuICAgIHJldHVybiBjb25uLmNvbm5lY3REcm9wVGFyZ2V0KHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCk7XG4gIH1cbn1cblxuLyoqIEFsbG93cyB5b3UgdG8gY29ubmVjdCBhIHtAbGluayBEcmFnU291cmNlfSB0byBhbiBlbGVtZW50IGluIGEgY29tcG9uZW50IHRlbXBsYXRlLiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RyYWdTb3VyY2VdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRHJhZ1NvdXJjZURpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0RG5kRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgcHJvdGVjdGVkIGNvbm5lY3Rpb246IERyYWdTb3VyY2U8YW55PiB8IHVuZGVmaW5lZDtcblxuICAvKiogV2hpY2ggc291cmNlIHRvIGNvbm5lY3QgdGhlIERPTSB0byAqL1xuICBASW5wdXQoJ2RyYWdTb3VyY2UnKSBkcmFnU291cmNlITogRHJhZ1NvdXJjZTxhbnk+O1xuICAvKipcbiAgICogU2hvcnRjdXQgZm9yIHNldHRpbmcgYSB0eXBlIG9uIHRoZSBjb25uZWN0aW9uLlxuICAgKiBMZXRzIHlvdSB1c2UgQW5ndWxhciBiaW5kaW5nIHRvIGRvIGl0LiBSdW5zIHtAbGluayBEcmFnU291cmNlI3NldFR5cGV9LlxuICAgKi9cbiAgQElucHV0KCdkcmFnU291cmNlVHlwZScpIGRyYWdTb3VyY2VUeXBlPzogc3RyaW5nIHwgc3ltYm9sO1xuICAvKiogUGFzcyBhbiBvcHRpb25zIG9iamVjdCBhcyB5b3Ugd291bGQgdG8ge0BsaW5rIERyYWdTb3VyY2UjY29ubmVjdERyYWdTb3VyY2V9LiAqL1xuICBASW5wdXQoJ2RyYWdTb3VyY2VPcHRpb25zJykgZHJhZ1NvdXJjZU9wdGlvbnM/OiBEcmFnU291cmNlT3B0aW9ucztcbiAgLyoqXG4gICAqIERvIG5vdCByZW5kZXIgYW4gSFRNTDUgcHJldmlldy4gT25seSBhcHBsaWVzIHdoZW4gdXNpbmcgdGhlIEhUTUw1IGJhY2tlbmQuXG4gICAqIEl0IGRvZXMgbm90IHVzZSB7IGNhcHR1cmVEcmFnZ2luZ1N0YXRlOiB0cnVlIH0gZm9yIElFMTEgc3VwcG9ydDsgdGhhdCBpcyBicm9rZW4uXG4gICAqL1xuICBASW5wdXQoJ25vSFRNTDVQcmV2aWV3Jykgbm9IVE1MNVByZXZpZXcgPSBmYWxzZTtcblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSB0aGlzLmRyYWdTb3VyY2U7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbiAmJiB0aGlzLmRyYWdTb3VyY2VUeXBlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbi5zZXRUeXBlKHRoaXMuZHJhZ1NvdXJjZVR5cGUpO1xuICAgIH1cbiAgICBzdXBlci5uZ09uQ2hhbmdlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbGxIb29rcyhjb25uOiBEcmFnU291cmNlPGFueT4pIHtcbiAgICBjb25zdCBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgc3ViLmFkZChjb25uLmNvbm5lY3REcmFnU291cmNlKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kcmFnU291cmNlT3B0aW9ucykpO1xuICAgIGlmICh0aGlzLm5vSFRNTDVQcmV2aWV3KSB7XG4gICAgICBzdWIuYWRkKGNvbm4uY29ubmVjdERyYWdQcmV2aWV3KGdldEVtcHR5SW1hZ2UoKSkpO1xuICAgIH1cbiAgICByZXR1cm4gc3ViO1xuICB9XG59XG5cbi8qKlxuICogQWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoaWNoIGVsZW1lbnQgYSB7QGxpbmsgRHJhZ1NvdXJjZX0gc2hvdWxkIHNjcmVlbnNob3RcbiAqIGFzIGFuIEhUTUw1IGRyYWcgcHJldmlldy5cbiAqXG4gKiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgdGhlIEhUTUw1IGJhY2tlbmQuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkcmFnUHJldmlld10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEcmFnUHJldmlld0RpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0RG5kRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgcHJvdGVjdGVkIGNvbm5lY3Rpb246IERyYWdTb3VyY2U8YW55PiB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBkcmFnIHNvdXJjZSBmb3Igd2hpY2ggdGhpcyBlbGVtZW50IHdpbGwgYmUgdGhlIHByZXZpZXcuICovXG4gIEBJbnB1dCgnZHJhZ1ByZXZpZXcnKSBkcmFnUHJldmlldyE6IERyYWdTb3VyY2U8YW55PjtcbiAgLyoqIFBhc3MgYW4gb3B0aW9ucyBvYmplY3QgYXMgeW91IHdvdWxkIHRvIHtAbGluayBEcmFnU291cmNlI2Nvbm5lY3REcmFnUHJldmlld30uICovXG4gIEBJbnB1dCgnZHJhZ1ByZXZpZXdPcHRpb25zJykgZHJhZ1ByZXZpZXdPcHRpb25zPzogRHJhZ1ByZXZpZXdPcHRpb25zO1xuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMuY29ubmVjdGlvbiA9IHRoaXMuZHJhZ1ByZXZpZXc7XG4gICAgc3VwZXIubmdPbkNoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYWxsSG9va3MoY29ubjogRHJhZ1NvdXJjZTxhbnk+KSB7XG4gICAgcmV0dXJuIGNvbm4uY29ubmVjdERyYWdQcmV2aWV3KHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kcmFnUHJldmlld09wdGlvbnMpO1xuICB9XG59XG5cbi8vIGltcG9ydCB7IGdldEVtcHR5SW1hZ2UgfSBmcm9tICdyZWFjdC1kbmQtaHRtbDUtYmFja2VuZCc7XG4vLyB3ZSBkb24ndCB3YW50IHRvIGRlcGVuZCBvbiB0aGUgYmFja2VuZCwgc28gaGVyZSB0aGF0IGlzLCBjb3BpZWRcbi8qKiBAaWdub3JlICovXG5sZXQgZW1wdHlJbWFnZTogSFRNTEltYWdlRWxlbWVudDtcbi8qKlxuICogUmV0dXJucyBhIDB4MCBlbXB0eSBHSUYgZm9yIHVzZSBhcyBhIGRyYWcgcHJldmlldy5cbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gZ2V0RW1wdHlJbWFnZSgpIHtcbiAgaWYgKCFlbXB0eUltYWdlKSB7XG4gICAgZW1wdHlJbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgIGVtcHR5SW1hZ2Uuc3JjID0gJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09JztcbiAgfVxuICByZXR1cm4gZW1wdHlJbWFnZTtcbn1cbiJdfQ==