UNPKG

@handsontable/angular-wrapper

Version:

Best Data Grid for Angular with Spreadsheet Look and Feel.

180 lines 23.6 kB
import Handsontable from 'handsontable/base'; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1lZGl0b3ItYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvbGliL2VkaXRvci9iYXNlLWVkaXRvci1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFFTCxlQUFlLEdBRWhCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBSXpGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVU7SUFDcEUsZ0RBQWdEO0lBQ3hDLGFBQWEsQ0FBNkM7SUFFbEUscURBQXFEO0lBQzdDLHFCQUFxQixDQUFpRDtJQUU5RSx3REFBd0Q7SUFDaEQsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBRXBDLDhDQUE4QztJQUN0Qyx1QkFBdUIsQ0FBZ0I7SUFFL0MsOENBQThDO0lBQ3RDLHVCQUF1QixDQUFnQjtJQUUvQzs7O09BR0c7SUFDSCxZQUFZLFFBQTJCO1FBQ3JDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVoQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJ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QUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEhhbmRzb250YWJsZSBmcm9tICdoYW5kc29udGFibGUvYmFzZSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIGNyZWF0ZUNvbXBvbmVudCxcbiAgRW52aXJvbm1lbnRJbmplY3Rvcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDdXN0b21FZGl0b3JQbGFjZWhvbGRlckNvbXBvbmVudCB9IGZyb20gJy4vY3VzdG9tLWVkaXRvci1wbGFjZWhvbGRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29sdW1uU2V0dGluZ3NJbnRlcm5hbCB9IGZyb20gJy4uL21vZGVscy9jb2x1bW4tc2V0dGluZ3MnO1xuaW1wb3J0IHsgSG90Q2VsbEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vaG90LWNlbGwtZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogQWRhcHRlciBmb3IgQmFzZUVkaXRvciBmcm9tIEhhbmRzb250YWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VFZGl0b3JBZGFwdGVyIGV4dGVuZHMgSGFuZHNvbnRhYmxlLmVkaXRvcnMuQmFzZUVkaXRvciB7XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGN1c3RvbSBlZGl0b3IgY29tcG9uZW50LiAqL1xuICBwcml2YXRlIF9jb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8SG90Q2VsbEVkaXRvckNvbXBvbmVudDxhbnk+PjtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBlZGl0b3IgcGxhY2Vob2xkZXIgY29tcG9uZW50LiAqL1xuICBwcml2YXRlIF9lZGl0b3JQbGFjZUhvbGRlclJlZjogQ29tcG9uZW50UmVmPEN1c3RvbUVkaXRvclBsYWNlaG9sZGVyQ29tcG9uZW50PjtcblxuICAvKiogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBsYWNlaG9sZGVyIGlzIHJlYWR5LiAqL1xuICBwcml2YXRlIF9pc1BsYWNlaG9sZGVyUmVhZHkgPSBmYWxzZTtcblxuICAvKiogU3Vic2NyaXB0aW9uIGZvciB0aGUgZmluaXNoIGVkaXQgZXZlbnQuICovXG4gIHByaXZhdGUgX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqIFN1YnNjcmlwdGlvbiBmb3IgdGhlIGNhbmNlbCBlZGl0IGV2ZW50LiAqL1xuICBwcml2YXRlIF9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJhc2VFZGl0b3JBZGFwdGVyLlxuICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEhhbmRzb250YWJsZSBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlOiBIYW5kc29udGFibGUuQ29yZSkge1xuICAgIHN1cGVyKGluc3RhbmNlKTtcblxuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyUm93UmVzaXplJywgdGhpcy5vbkFmdGVyUm93UmVzaXplLmJpbmQodGhpcykpO1xuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyQ29sdW1uUmVzaXplJywgdGhpcy5vbkFmdGVyQ29sdW1uUmVzaXplLmJpbmQodGhpcykpO1xuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyRGVzdHJveScsIHRoaXMub25BZnRlckRlc3Ryb3kuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgdGhlIGVkaXRvciBmb3IgZWRpdGluZy4gUGFyYW1ldGVycyBhcmUgcGFzc2VkIGZyb20gSGFuZHNvbnRhYmxlLlxuICAgKiBAcGFyYW0gcm93IFRoZSByb3cgaW5kZXguXG4gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBpbmRleC5cbiAgICogQHBhcmFtIHByb3AgVGhlIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSBURCBUaGUgdGFibGUgY2VsbCBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3JpZ2luYWxWYWx1ZSBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGNlbGwuXG4gICAqIEBwYXJhbSBjZWxsUHJvcGVydGllcyBUaGUgY2VsbCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZShcbiAgICByb3c6IG51bWJlcixcbiAgICBjb2x1bW46IG51bWJlcixcbiAgICBwcm9wOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgVEQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50LFxuICAgIG9yaWdpbmFsVmFsdWU6IGFueSxcbiAgICBjZWxsUHJvcGVydGllczogSGFuZHNvbnRhYmxlLkNlbGxQcm9wZXJ0aWVzXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICBzdXBlci5wcmVwYXJlKHJvdywgY29sdW1uLCBwcm9wLCBURCwgb3JpZ2luYWxWYWx1ZSwgY2VsbFByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgY29sdW1uTWV0YTogQ29sdW1uU2V0dGluZ3NJbnRlcm5hbCA9IHRoaXMuaG90LmdldENvbHVtbk1ldGEoXG4gICAgICAgIGNvbHVtblxuICAgICAgKSBhcyBDb2x1bW5TZXR0aW5nc0ludGVybmFsO1xuXG4gICAgICBpZiAoIXRoaXMuX2lzUGxhY2Vob2xkZXJSZWFkeSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvclBsYWNlaG9sZGVyKGNvbHVtbk1ldGEuX2Vudmlyb25tZW50SW5qZWN0b3IpO1xuICAgICAgICB0aGlzLl9pc1BsYWNlaG9sZGVyUmVhZHkgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSBjb2x1bW5NZXRhLl9lZGl0b3JDb21wb25lbnRSZWZlcmVuY2U7XG5cbiAgICAgIGlmICh0aGlzLl9maW5pc2hFZGl0U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fZmluaXNoRWRpdFN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5fY2FuY2VsRWRpdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9maW5pc2hFZGl0U3Vic2NyaXB0aW9uID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLmZpbmlzaEVkaXRcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maW5pc2hFZGl0aW5nKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLmNhbmNlbEVkaXRcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYW5jZWxDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5yZXNldEVkaXRvclN0YXRlKCk7XG4gICAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5pbnN0YW5jZS5kZXRhY2hFZGl0b3IoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZS5vbkNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLm9uRm9jdXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IuXG4gICAqL1xuICBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2U/LmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKiBXaGVuIG9wZW5pbmcsIHdlIHNldCB0aGUgc2hvcnRjdXQgY29udGV4dCB0byAnZWRpdG9yJy5cbiAgICogVGhpcyBhbGxvd3MgdGhlIGJ1aWx0LWluIGtleWJvYXJkIHNob3J0Y3V0cyB0byBvcGVyYXRlIHdpdGhpbiB0aGUgZWRpdG9yLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBvcGVuaW5nIG9mIHRoZSBlZGl0b3IuXG4gICAqIEByZW1hcmtzIFdoZW4gZW50ZXJpbmcgZWRpdCBtb2RlIHVzaW5nIGRvdWJsZS1jbGljaywga2V5Ym9hcmQgc2hvcnRjdXRzIGRvIG5vdCB3b3JrLlxuICAgKi9cbiAgb3BlbihldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ob3QuZ2V0U2hvcnRjdXRNYW5hZ2VyKCkuc2V0QWN0aXZlQ29udGV4dE5hbWUoJ2VkaXRvcicpO1xuICAgIHRoaXMuYXBwbHlQcm9wc1RvRWRpdG9yKCk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLm9uT3BlbihldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBjdXN0b20gZWRpdG9yLlxuICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHNldFZhbHVlKG5ld1ZhbHVlPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlPy5zZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHByb3BlcnRpZXMgdG8gdGhlIGN1c3RvbSBlZGl0b3IgYW5kIGVkaXRvciBwbGFjZWhvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlQcm9wc1RvRWRpdG9yKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldEVkaXRlZENlbGxSZWN0KCk7XG5cbiAgICBpZiAoIXRoaXMuaXNJbkZ1bGxFZGl0TW9kZSgpKSB7XG4gICAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29tcG9uZW50UmVmLnNldElucHV0KCdvcmlnaW5hbFZhbHVlJywgdGhpcy5vcmlnaW5hbFZhbHVlKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3JvdycsIHRoaXMucm93KTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2NvbHVtbicsIHRoaXMuY29sKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3Byb3AnLCB0aGlzLnByb3ApO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgnY2VsbFByb3BlcnRpZXMnLCB0aGlzLmNlbGxQcm9wZXJ0aWVzKTtcblxuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd0b3AnLCByZWN0LnRvcCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2xlZnQnLCByZWN0LnN0YXJ0KTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnaGVpZ2h0JywgcmVjdC5oZWlnaHQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdpc1Zpc2libGUnLCB0cnVlKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnY29tcG9uZW50UmVmJywgdGhpcy5fY29tcG9uZW50UmVmKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZWRpdG9yIHBsYWNlaG9sZGVyIGFuZCBhcHBlbmQgaXQgdG8gaG90IHJvb3RFbGVtZW50LlxuICAgKiBAcGFyYW0gaW5qZWN0b3IgVGhlIGVudmlyb25tZW50IGluamVjdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFZGl0b3JQbGFjZWhvbGRlcihpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3Rvcik6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmID0gY3JlYXRlQ29tcG9uZW50KFxuICAgICAgQ3VzdG9tRWRpdG9yUGxhY2Vob2xkZXJDb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGluamVjdG9yIGFzIEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuaG90LnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKFxuICAgICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgY29sdW1uIHJlc2l6ZSBldmVudC5cbiAgICogSGVscHMgYWRqdXN0IHRoZSBlZGl0b3Igc2l6ZSB0byB0aGUgY29sdW1uIHNpemUgYW5kIHVwZGF0ZSBpdHMgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJDb2x1bW5SZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5hcHBseVByb3BzVG9FZGl0b3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgcm93IHJlc2l6ZSBldmVudC5cbiAgICogSGVscHMgYWRqdXN0IHRoZSBlZGl0b3Igc2l6ZSB0byB0aGUgY29sdW1uIHNpemUgYW5kIHVwZGF0ZSBpdHMgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJSb3dSZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5hcHBseVByb3BzVG9FZGl0b3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgZGVzdHJveSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgb25BZnRlckRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWY/LmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVkaXRvciBwbGFjZWhvbGRlciBzdGF0ZS5cbiAgICogV2UgbmVlZCB0byByZXNldCB0aGUgZWRpdG9yIHBsYWNlaG9sZGVyIHN0YXRlIGJlY2F1c2Ugd2UgdXNlIGl0XG4gICAqIHRvIHN0b3JlIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gdGhlIGN1c3RvbSBlZGl0b3IuXG4gICAqL1xuICBwcml2YXRlIHJlc2V0RWRpdG9yU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3RvcCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2xlZnQnLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdoZWlnaHQnLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd3aWR0aCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2lzVmlzaWJsZScsIGZhbHNlKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnY29tcG9uZW50UmVmJywgdW5kZWZpbmVkKTtcbiAgfVxufVxuIl19