@handsontable/angular-wrapper
Version:
Best Data Grid for Angular with Spreadsheet Look and Feel.
180 lines • 23.6 kB
JavaScript
import Handsontable from 'handsontable';
import { createComponent, } from '@angular/core';
import { CustomEditorPlaceholderComponent } from './custom-editor-placeholder.component';
import { take } from 'rxjs/operators';
/**
* Adapter for BaseEditor from Handsontable.
*/
export class BaseEditorAdapter extends Handsontable.editors.BaseEditor {
/** Reference to the custom editor component. */
_componentRef;
/** Reference to the editor placeholder component. */
_editorPlaceHolderRef;
/** Flag indicating whether the placeholder is ready. */
_isPlaceholderReady = false;
/** Subscription for the finish edit event. */
_finishEditSubscription;
/** Subscription for the cancel edit event. */
_cancelEditSubscription;
/**
* Creates an instance of BaseEditorAdapter.
* @param instance The Handsontable instance.
*/
constructor(instance) {
super(instance);
this.hot.addHook('afterRowResize', this.onAfterRowResize.bind(this));
this.hot.addHook('afterColumnResize', this.onAfterColumnResize.bind(this));
this.hot.addHook('afterDestroy', this.onAfterDestroy.bind(this));
}
/**
* Prepares the editor for editing. Parameters are passed from Handsontable.
* @param row The row index.
* @param column The column index.
* @param prop The property name.
* @param TD The table cell element.
* @param originalValue The original value of the cell.
* @param cellProperties The cell properties.
*/
prepare(row, column, prop, TD, originalValue, cellProperties) {
if (!this.isOpened()) {
super.prepare(row, column, prop, TD, originalValue, cellProperties);
const columnMeta = this.hot.getColumnMeta(column);
if (!this._isPlaceholderReady) {
this.createEditorPlaceholder(columnMeta._environmentInjector);
this._isPlaceholderReady = true;
}
this._componentRef = columnMeta._editorComponentReference;
if (this._finishEditSubscription) {
this._finishEditSubscription.unsubscribe();
this._finishEditSubscription = undefined;
}
if (this._cancelEditSubscription) {
this._cancelEditSubscription.unsubscribe();
this._cancelEditSubscription = undefined;
}
this._finishEditSubscription = this._componentRef.instance.finishEdit
.pipe(take(1))
.subscribe(() => {
this.finishEditing();
});
this._cancelEditSubscription = this._componentRef.instance.cancelEdit
.pipe(take(1))
.subscribe(() => {
this.cancelChanges();
});
}
}
/**
* Closes the editor. This event is triggered by Handsontable.
*/
close() {
if (this.isOpened()) {
this.resetEditorState();
this._editorPlaceHolderRef.changeDetectorRef.detectChanges();
this._editorPlaceHolderRef.instance.detachEditor();
this._componentRef.instance.onClose();
}
}
/**
* Focuses the editor. This event is triggered by Handsontable.
*/
focus() {
this._componentRef.instance.onFocus();
}
/**
* Gets the value from the editor.
* @returns The value from the editor.
*/
getValue() {
return this._componentRef.instance?.getValue();
}
/**
* Opens the editor. This event is triggered by Handsontable.
* When opening, we set the shortcut context to 'editor'.
* This allows the built-in keyboard shortcuts to operate within the editor.
* @param event The event that triggered the opening of the editor.
* @remarks When entering edit mode using double-click, keyboard shortcuts do not work.
*/
open(event) {
this.hot.getShortcutManager().setActiveContextName('editor');
this.applyPropsToEditor();
this._componentRef.instance.onOpen(event);
}
/**
* Sets the value for the custom editor.
* @param newValue The value to set.
*/
setValue(newValue) {
this._componentRef.instance?.setValue(newValue);
this._componentRef.changeDetectorRef.detectChanges();
}
/**
* Applies properties to the custom editor and editor placeholder.
*/
applyPropsToEditor() {
const rect = this.getEditedCellRect();
if (!this.isInFullEditMode()) {
this._componentRef.instance.setValue(null);
}
this._componentRef.setInput('originalValue', this.originalValue);
this._componentRef.setInput('row', this.row);
this._componentRef.setInput('column', this.col);
this._componentRef.setInput('prop', this.prop);
this._componentRef.setInput('cellProperties', this.cellProperties);
this._editorPlaceHolderRef.setInput('top', rect.top);
this._editorPlaceHolderRef.setInput('left', rect.start);
this._editorPlaceHolderRef.setInput('height', rect.height);
this._editorPlaceHolderRef.setInput('width', rect.width);
this._editorPlaceHolderRef.setInput('isVisible', true);
this._editorPlaceHolderRef.setInput('componentRef', this._componentRef);
this._editorPlaceHolderRef.changeDetectorRef.detectChanges();
}
/**
* Creates the editor placeholder and append it to hot rootElement.
* @param injector The environment injector.
*/
createEditorPlaceholder(injector) {
this._editorPlaceHolderRef = createComponent(CustomEditorPlaceholderComponent, {
environmentInjector: injector,
});
this.hot.rootElement.appendChild(this._editorPlaceHolderRef.location.nativeElement);
}
/**
* Handles the after column resize event.
* Helps adjust the editor size to the column size and update its position.
*/
onAfterColumnResize() {
if (this.isOpened()) {
this.applyPropsToEditor();
}
}
/**
* Handles the after row resize event.
* Helps adjust the editor size to the column size and update its position.
*/
onAfterRowResize() {
if (this.isOpened()) {
this.applyPropsToEditor();
}
}
/**
* Handles the after destroy event.
*/
onAfterDestroy() {
this._editorPlaceHolderRef?.destroy();
}
/**
* Resets the editor placeholder state.
* We need to reset the editor placeholder state because we use it
* to store multiple references to the custom editor.
*/
resetEditorState() {
this._editorPlaceHolderRef.setInput('top', undefined);
this._editorPlaceHolderRef.setInput('left', undefined);
this._editorPlaceHolderRef.setInput('height', undefined);
this._editorPlaceHolderRef.setInput('width', undefined);
this._editorPlaceHolderRef.setInput('isVisible', false);
this._editorPlaceHolderRef.setInput('componentRef', undefined);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1lZGl0b3ItYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvbGliL2VkaXRvci9iYXNlLWVkaXRvci1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBRUwsZUFBZSxHQUVoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUl6RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVO0lBQ3BFLGdEQUFnRDtJQUN4QyxhQUFhLENBQTZDO0lBRWxFLHFEQUFxRDtJQUM3QyxxQkFBcUIsQ0FBaUQ7SUFFOUUsd0RBQXdEO0lBQ2hELG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUVwQyw4Q0FBOEM7SUFDdEMsdUJBQXVCLENBQWdCO0lBRS9DLDhDQUE4QztJQUN0Qyx1QkFBdUIsQ0FBZ0I7SUFFL0M7OztPQUdHO0lBQ0gsWUFBWSxRQUEyQjtRQUNyQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFB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QyxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIYW5kc29udGFibGUgZnJvbSAnaGFuZHNvbnRhYmxlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFJlZixcbiAgY3JlYXRlQ29tcG9uZW50LFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEN1c3RvbUVkaXRvclBsYWNlaG9sZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jdXN0b20tZWRpdG9yLXBsYWNlaG9sZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb2x1bW5TZXR0aW5nc0ludGVybmFsIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi1zZXR0aW5ncyc7XG5pbXBvcnQgeyBIb3RDZWxsRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9ob3QtY2VsbC1lZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBBZGFwdGVyIGZvciBCYXNlRWRpdG9yIGZyb20gSGFuZHNvbnRhYmxlLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZUVkaXRvckFkYXB0ZXIgZXh0ZW5kcyBIYW5kc29udGFibGUuZWRpdG9ycy5CYXNlRWRpdG9yIHtcbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgY3VzdG9tIGVkaXRvciBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2NvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxIb3RDZWxsRWRpdG9yQ29tcG9uZW50PGFueT4+O1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGVkaXRvciBwbGFjZWhvbGRlciBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2VkaXRvclBsYWNlSG9sZGVyUmVmOiBDb21wb25lbnRSZWY8Q3VzdG9tRWRpdG9yUGxhY2Vob2xkZXJDb21wb25lbnQ+O1xuXG4gIC8qKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGxhY2Vob2xkZXIgaXMgcmVhZHkuICovXG4gIHByaXZhdGUgX2lzUGxhY2Vob2xkZXJSZWFkeSA9IGZhbHNlO1xuXG4gIC8qKiBTdWJzY3JpcHRpb24gZm9yIHRoZSBmaW5pc2ggZWRpdCBldmVudC4gKi9cbiAgcHJpdmF0ZSBfZmluaXNoRWRpdFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAvKiogU3Vic2NyaXB0aW9uIGZvciB0aGUgY2FuY2VsIGVkaXQgZXZlbnQuICovXG4gIHByaXZhdGUgX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQmFzZUVkaXRvckFkYXB0ZXIuXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5zdGFuY2U6IEhhbmRzb250YWJsZS5Db3JlKSB7XG4gICAgc3VwZXIoaW5zdGFuY2UpO1xuXG4gICAgdGhpcy5ob3QuYWRkSG9vaygnYWZ0ZXJSb3dSZXNpemUnLCB0aGlzLm9uQWZ0ZXJSb3dSZXNpemUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5ob3QuYWRkSG9vaygnYWZ0ZXJDb2x1bW5SZXNpemUnLCB0aGlzLm9uQWZ0ZXJDb2x1bW5SZXNpemUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5ob3QuYWRkSG9vaygnYWZ0ZXJEZXN0cm95JywgdGhpcy5vbkFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyB0aGUgZWRpdG9yIGZvciBlZGl0aW5nLiBQYXJhbWV0ZXJzIGFyZSBwYXNzZWQgZnJvbSBIYW5kc29udGFibGUuXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGluZGV4LlxuICAgKiBAcGFyYW0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIFREIFRoZSB0YWJsZSBjZWxsIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBvcmlnaW5hbFZhbHVlIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgY2VsbC5cbiAgICogQHBhcmFtIGNlbGxQcm9wZXJ0aWVzIFRoZSBjZWxsIHByb3BlcnRpZXMuXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlKFxuICAgIHJvdzogbnVtYmVyLFxuICAgIGNvbHVtbjogbnVtYmVyLFxuICAgIHByb3A6IHN0cmluZyB8IG51bWJlcixcbiAgICBURDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsXG4gICAgb3JpZ2luYWxWYWx1ZTogYW55LFxuICAgIGNlbGxQcm9wZXJ0aWVzOiBIYW5kc29udGFibGUuQ2VsbFByb3BlcnRpZXNcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbmVkKCkpIHtcbiAgICAgIHN1cGVyLnByZXBhcmUocm93LCBjb2x1bW4sIHByb3AsIFRELCBvcmlnaW5hbFZhbHVlLCBjZWxsUHJvcGVydGllcyk7XG4gICAgICBjb25zdCBjb2x1bW5NZXRhOiBDb2x1bW5TZXR0aW5nc0ludGVybmFsID0gdGhpcy5ob3QuZ2V0Q29sdW1uTWV0YShcbiAgICAgICAgY29sdW1uXG4gICAgICApIGFzIENvbHVtblNldHRpbmdzSW50ZXJuYWw7XG5cbiAgICAgIGlmICghdGhpcy5faXNQbGFjZWhvbGRlclJlYWR5KSB7XG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdG9yUGxhY2Vob2xkZXIoY29sdW1uTWV0YS5fZW52aXJvbm1lbnRJbmplY3Rvcik7XG4gICAgICAgIHRoaXMuX2lzUGxhY2Vob2xkZXJSZWFkeSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IGNvbHVtbk1ldGEuX2VkaXRvckNvbXBvbmVudFJlZmVyZW5jZTtcblxuICAgICAgaWYgKHRoaXMuX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5fZmluaXNoRWRpdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9maW5pc2hFZGl0U3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY2FuY2VsRWRpdFN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLl9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24gPSB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UuZmluaXNoRWRpdFxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbmlzaEVkaXRpbmcoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24gPSB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UuY2FuY2VsRWRpdFxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbmNlbENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZWRpdG9yLiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBIYW5kc29udGFibGUuXG4gICAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICB0aGlzLnJlc2V0RWRpdG9yU3RhdGUoKTtcbiAgICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLmluc3RhbmNlLmRldGFjaEVkaXRvcigpO1xuICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLm9uQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyB0aGUgZWRpdG9yLiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBIYW5kc29udGFibGUuXG4gICAqL1xuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2Uub25Gb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGZyb20gdGhlIGVkaXRvci5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGZyb20gdGhlIGVkaXRvci5cbiAgICovXG4gIGdldFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZT8uZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgZWRpdG9yLiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBIYW5kc29udGFibGUuXG4gICAqIFdoZW4gb3BlbmluZywgd2Ugc2V0IHRoZSBzaG9ydGN1dCBjb250ZXh0IHRvICdlZGl0b3InLlxuICAgKiBUaGlzIGFsbG93cyB0aGUgYnVpbHQtaW4ga2V5Ym9hcmQgc2hvcnRjdXRzIHRvIG9wZXJhdGUgd2l0aGluIHRoZSBlZGl0b3IuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIG9wZW5pbmcgb2YgdGhlIGVkaXRvci5cbiAgICogQHJlbWFya3MgV2hlbiBlbnRlcmluZyBlZGl0IG1vZGUgdXNpbmcgZG91YmxlLWNsaWNrLCBrZXlib2FyZCBzaG9ydGN1dHMgZG8gbm90IHdvcmsuXG4gICAqL1xuICBvcGVuKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmhvdC5nZXRTaG9ydGN1dE1hbmFnZXIoKS5zZXRBY3RpdmVDb250ZXh0TmFtZSgnZWRpdG9yJyk7XG4gICAgdGhpcy5hcHBseVByb3BzVG9FZGl0b3IoKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2Uub25PcGVuKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGN1c3RvbSBlZGl0b3IuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKi9cbiAgc2V0VmFsdWUobmV3VmFsdWU/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2U/LnNldFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgcHJvcGVydGllcyB0byB0aGUgY3VzdG9tIGVkaXRvciBhbmQgZWRpdG9yIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVByb3BzVG9FZGl0b3IoKTogdm9pZCB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0RWRpdGVkQ2VsbFJlY3QoKTtcblxuICAgIGlmICghdGhpcy5pc0luRnVsbEVkaXRNb2RlKCkpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXRWYWx1ZShudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ29yaWdpbmFsVmFsdWUnLCB0aGlzLm9yaWdpbmFsVmFsdWUpO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgncm93JywgdGhpcy5yb3cpO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgnY29sdW1uJywgdGhpcy5jb2wpO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgncHJvcCcsIHRoaXMucHJvcCk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLnNldElucHV0KCdjZWxsUHJvcGVydGllcycsIHRoaXMuY2VsbFByb3BlcnRpZXMpO1xuXG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3RvcCcsIHJlY3QudG9wKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnbGVmdCcsIHJlY3Quc3RhcnQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2lzVmlzaWJsZScsIHRydWUpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdjb21wb25lbnRSZWYnLCB0aGlzLl9jb21wb25lbnRSZWYpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlZGl0b3IgcGxhY2Vob2xkZXIgYW5kIGFwcGVuZCBpdCB0byBob3Qgcm9vdEVsZW1lbnQuXG4gICAqIEBwYXJhbSBpbmplY3RvciBUaGUgZW52aXJvbm1lbnQgaW5qZWN0b3IuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVkaXRvclBsYWNlaG9sZGVyKGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYgPSBjcmVhdGVDb21wb25lbnQoXG4gICAgICBDdXN0b21FZGl0b3JQbGFjZWhvbGRlckNvbXBvbmVudCxcbiAgICAgIHtcbiAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogaW5qZWN0b3IgYXMgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5ob3Qucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoXG4gICAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBhZnRlciBjb2x1bW4gcmVzaXplIGV2ZW50LlxuICAgKiBIZWxwcyBhZGp1c3QgdGhlIGVkaXRvciBzaXplIHRvIHRoZSBjb2x1bW4gc2l6ZSBhbmQgdXBkYXRlIGl0cyBwb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgb25BZnRlckNvbHVtblJlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICB0aGlzLmFwcGx5UHJvcHNUb0VkaXRvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBhZnRlciByb3cgcmVzaXplIGV2ZW50LlxuICAgKiBIZWxwcyBhZGp1c3QgdGhlIGVkaXRvciBzaXplIHRvIHRoZSBjb2x1bW4gc2l6ZSBhbmQgdXBkYXRlIGl0cyBwb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgb25BZnRlclJvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICB0aGlzLmFwcGx5UHJvcHNUb0VkaXRvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBhZnRlciBkZXN0cm95IGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBvbkFmdGVyRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZj8uZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZWRpdG9yIHBsYWNlaG9sZGVyIHN0YXRlLlxuICAgKiBXZSBuZWVkIHRvIHJlc2V0IHRoZSBlZGl0b3IgcGxhY2Vob2xkZXIgc3RhdGUgYmVjYXVzZSB3ZSB1c2UgaXRcbiAgICogdG8gc3RvcmUgbXVsdGlwbGUgcmVmZXJlbmNlcyB0byB0aGUgY3VzdG9tIGVkaXRvci5cbiAgICovXG4gIHByaXZhdGUgcmVzZXRFZGl0b3JTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgndG9wJywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnbGVmdCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2hlaWdodCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3dpZHRoJywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnaXNWaXNpYmxlJywgZmFsc2UpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdjb21wb25lbnRSZWYnLCB1bmRlZmluZWQpO1xuICB9XG59XG4iXX0=