UNPKG

@ngstack/code-editor

Version:

Code editor component for Angular applications.

218 lines 25.5 kB
import { Component, ChangeDetectionStrategy, ViewEncapsulation, ViewChild, Input, Output, EventEmitter, HostListener, inject } from '@angular/core'; import { CodeEditorService } from '../services/code-editor.service'; import { TypescriptDefaultsService } from '../services/typescript-defaults.service'; import { JavascriptDefaultsService } from '../services/javascript-defaults.service'; import { JsonDefaultsService } from '../services/json-defaults.service'; import * as i0 from "@angular/core"; export class CodeEditorComponent { constructor() { // private _value = ''; this.defaultOptions = { lineNumbers: 'on', contextmenu: false, minimap: { enabled: false } }; // @Input() // set value(v: string) { // if (v !== this._value) { // this._value = v; // this.setEditorValue(v); // this.valueChanged.emit(v); // } // } // get value(): string { // return this._value; // } /** * Editor theme. Defaults to `vs`. * * Allowed values: `vs`, `vs-dark` or `hc-black`. * @memberof CodeEditorComponent */ this.theme = 'vs'; /** * Editor options. * * See https://microsoft.github.io/monaco-editor/docs.html#interfaces/editor.IStandaloneEditorConstructionOptions.html for more details. * * @memberof CodeEditorComponent */ this.options = {}; /** * Toggle readonly state of the editor. * * @memberof CodeEditorComponent */ this.readOnly = false; /** * An event emitted when the text content of the model have changed. */ this.valueChanged = new EventEmitter(); /** * An event emitted when the code model value is changed. */ this.codeModelChanged = new EventEmitter(); /** * An event emitted when the contents of the underlying editor model have changed. */ this.modelContentChanged = new EventEmitter(); /** * Raised when editor finished loading all its components. */ this.loaded = new EventEmitter(); this.editorService = inject(CodeEditorService); this.typescriptDefaults = inject(TypescriptDefaultsService); this.javascriptDefaults = inject(JavascriptDefaultsService); this.jsonDefaults = inject(JsonDefaultsService); } /** * The instance of the editor. */ get editor() { return this._editor; } set editor(value) { this._editor = value; } ngOnDestroy() { if (this.editor) { this.editor.dispose(); this.editor = null; } if (this._model) { this._model.dispose(); this._model = null; } } ngOnChanges(changes) { if (changes.codeModel && !changes.codeModel.firstChange) { this.updateModel(changes.codeModel.currentValue); } if (changes.readOnly && !changes.readOnly.firstChange) { if (this.editor) { this.editor.updateOptions({ readOnly: changes.readOnly.currentValue }); } } if (changes.theme && !changes.theme.firstChange) { this.editorService.setTheme(changes.theme.currentValue); } } onResize() { if (this.editor) { this.editor.layout(); } } async ngAfterViewInit() { this.setupEditor(); this.loaded.emit(this); } setupEditor() { const domElement = this.editorContent.nativeElement; const settings = { value: '', language: 'text', uri: `code-${Date.now()}`, ...this.codeModel }; this._model = this.editorService.createModel(settings.value, settings.language, settings.uri); const options = Object.assign({}, this.defaultOptions, this.options, { readOnly: this.readOnly, theme: this.theme, model: this._model }); this.editor = this.editorService.createEditor(domElement, options); this._model.onDidChangeContent((e) => { this.modelContentChanged.emit(e); const newValue = this._model.getValue(); if (this.codeModel) { this.codeModel.value = newValue; } this.valueChanged.emit(newValue); }); this.setupDependencies(this.codeModel); this.codeModelChanged.emit({ sender: this, value: this.codeModel }); } runEditorAction(id, args) { this.editor.getAction(id)?.run(args); } formatDocument() { this.runEditorAction('editor.action.formatDocument'); } setupDependencies(model) { if (!model) { return; } const { language } = model; if (language) { const lang = language.toLowerCase(); switch (lang) { case 'typescript': if (model.dependencies) { this.editorService.loadTypings(model.dependencies); } break; case 'javascript': if (model.dependencies) { this.editorService.loadTypings(model.dependencies); } break; case 'json': if (model.schemas) { this.jsonDefaults.addSchemas(model.uri, model.schemas); } break; default: break; } } } setEditorValue(value) { // Fix for value change while dispose in process. setTimeout(() => { if (this._model) { this._model.setValue(value); } }); } updateModel(model) { if (model) { this.setEditorValue(model.value); this.editorService.setModelLanguage(this._model, model.language); this.setupDependencies(model); this.codeModelChanged.emit({ sender: this, value: model }); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: CodeEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: CodeEditorComponent, selector: "ngs-code-editor", inputs: { codeModel: "codeModel", theme: "theme", options: "options", readOnly: "readOnly" }, outputs: { valueChanged: "valueChanged", codeModelChanged: "codeModelChanged", modelContentChanged: "modelContentChanged", loaded: "loaded" }, host: { listeners: { "window:resize": "onResize()" }, classAttribute: "ngs-code-editor" }, viewQueries: [{ propertyName: "editorContent", first: true, predicate: ["editor"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"editor\" #editor class=\"monaco-editor editor\"></div>\n", styles: [".editor{width:100%;height:inherit;min-height:200px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: CodeEditorComponent, decorators: [{ type: Component, args: [{ selector: 'ngs-code-editor', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'ngs-code-editor' }, template: "<div id=\"editor\" #editor class=\"monaco-editor editor\"></div>\n", styles: [".editor{width:100%;height:inherit;min-height:200px}\n"] }] }], propDecorators: { editorContent: [{ type: ViewChild, args: ['editor', { static: true }] }], codeModel: [{ type: Input }], theme: [{ type: Input }], options: [{ type: Input }], readOnly: [{ type: Input }], valueChanged: [{ type: Output }], codeModelChanged: [{ type: Output }], modelContentChanged: [{ type: Output }], loaded: [{ type: Output }], onResize: [{ type: HostListener, args: ['window:resize'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29kZS1lZGl0b3Ivc3JjL2xpYi9jb2RlLWVkaXRvci9jb2RlLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2RlLWVkaXRvci9zcmMvbGliL2NvZGUtZWRpdG9yL2NvZGUtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUlqQixTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBRVosWUFBWSxFQUNaLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNwRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFtQnhFLE1BQU0sT0FBTyxtQkFBbUI7SUFWaEM7UUFlRSx1QkFBdUI7UUFFZixtQkFBYyxHQUFnRDtZQUNwRSxXQUFXLEVBQUUsSUFBSTtZQUNqQixXQUFXLEVBQUUsS0FBSztZQUNsQixPQUFPLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLEtBQUs7YUFDZjtTQUNGLENBQUM7UUFtQkYsV0FBVztRQUNYLHlCQUF5QjtRQUN6Qiw2QkFBNkI7UUFDN0IsdUJBQXVCO1FBQ3ZCLDhCQUE4QjtRQUM5QixpQ0FBaUM7UUFDakMsTUFBTTtRQUNOLElBQUk7UUFFSix3QkFBd0I7UUFDeEIsd0JBQXdCO1FBQ3hCLElBQUk7UUFFSjs7Ozs7V0FLRztRQUVILFVBQUssR0FBRyxJQUFJLENB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TTtnQkFPUCxtQkFBbUI7c0JBRGxCLE1BQU07Z0JBT1AsTUFBTTtzQkFETCxNQUFNO2dCQXVDUCxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29kZUVkaXRvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb2RlLWVkaXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFR5cGVzY3JpcHREZWZhdWx0c1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90eXBlc2NyaXB0LWRlZmF1bHRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSmF2YXNjcmlwdERlZmF1bHRzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2phdmFzY3JpcHQtZGVmYXVsdHMuc2VydmljZSc7XG5pbXBvcnQgeyBKc29uRGVmYXVsdHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvanNvbi1kZWZhdWx0cy5zZXJ2aWNlJztcbmltcG9ydCB7IENvZGVNb2RlbCB9IGZyb20gJy4uL21vZGVscy9jb2RlLm1vZGVsJztcbmltcG9ydCB7IGVkaXRvciB9IGZyb20gJ21vbmFjby1lZGl0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVNb2RlbENoYW5nZWRFdmVudCB7XG4gIHNlbmRlcjogQ29kZUVkaXRvckNvbXBvbmVudDtcbiAgdmFsdWU6IENvZGVNb2RlbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbmdzLWNvZGUtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvZGUtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29kZS1lZGl0b3IuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGhvc3Q6IHsgY2xhc3M6ICduZ3MtY29kZS1lZGl0b3InIH1cbn0pXG5leHBvcnQgY2xhc3MgQ29kZUVkaXRvckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIHByaXZhdGUgX2VkaXRvcjogZWRpdG9yLklDb2RlRWRpdG9yO1xuICBwcml2YXRlIF9tb2RlbDogZWRpdG9yLklUZXh0TW9kZWw7XG4gIC8vIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0T3B0aW9uczogZWRpdG9yLklTdGFuZGFsb25lRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgICBsaW5lTnVtYmVyczogJ29uJyxcbiAgICBjb250ZXh0bWVudTogZmFsc2UsXG4gICAgbWluaW1hcDoge1xuICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSBvZiB0aGUgZWRpdG9yLlxuICAgKi9cbiAgZ2V0IGVkaXRvcigpOiBlZGl0b3IuSUNvZGVFZGl0b3Ige1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0IGVkaXRvcih2YWx1ZTogZWRpdG9yLklDb2RlRWRpdG9yKSB7XG4gICAgdGhpcy5fZWRpdG9yID0gdmFsdWU7XG4gIH1cblxuICBAVmlld0NoaWxkKCdlZGl0b3InLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBlZGl0b3JDb250ZW50OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBASW5wdXQoKVxuICBjb2RlTW9kZWw6IENvZGVNb2RlbDtcblxuICAvLyBASW5wdXQoKVxuICAvLyBzZXQgdmFsdWUodjogc3RyaW5nKSB7XG4gIC8vICAgaWYgKHYgIT09IHRoaXMuX3ZhbHVlKSB7XG4gIC8vICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gIC8vICAgICB0aGlzLnNldEVkaXRvclZhbHVlKHYpO1xuICAvLyAgICAgdGhpcy52YWx1ZUNoYW5nZWQuZW1pdCh2KTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgLy8gICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIC8vIH1cblxuICAvKipcbiAgICogRWRpdG9yIHRoZW1lLiBEZWZhdWx0cyB0byBgdnNgLlxuICAgKlxuICAgKiBBbGxvd2VkIHZhbHVlczogYHZzYCwgYHZzLWRhcmtgIG9yIGBoYy1ibGFja2AuXG4gICAqIEBtZW1iZXJvZiBDb2RlRWRpdG9yQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0aGVtZSA9ICd2cyc7XG5cbiAgLyoqXG4gICAqIEVkaXRvciBvcHRpb25zLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL21vbmFjby1lZGl0b3IvZG9jcy5odG1sI2ludGVyZmFjZXMvZWRpdG9yLklTdGFuZGFsb25lRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucy5odG1sIGZvciBtb3JlIGRldGFpbHMuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBDb2RlRWRpdG9yQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcHRpb25zOiBlZGl0b3IuSVN0YW5kYWxvbmVFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge307XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSByZWFkb25seSBzdGF0ZSBvZiB0aGUgZWRpdG9yLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgQ29kZUVkaXRvckNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcmVhZE9ubHkgPSBmYWxzZTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIG1vZGVsIGhhdmUgY2hhbmdlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICB2YWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBjb2RlIG1vZGVsIHZhbHVlIGlzIGNoYW5nZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgY29kZU1vZGVsQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29kZU1vZGVsQ2hhbmdlZEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCBlbWl0dGVkIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmRlcmx5aW5nIGVkaXRvciBtb2RlbCBoYXZlIGNoYW5nZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgbW9kZWxDb250ZW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8ZWRpdG9yLklNb2RlbENvbnRlbnRDaGFuZ2VkRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGVkaXRvciBmaW5pc2hlZCBsb2FkaW5nIGFsbCBpdHMgY29tcG9uZW50cy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBsb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvZGVFZGl0b3JDb21wb25lbnQ+KCk7XG5cbiAgcHJvdGVjdGVkIGVkaXRvclNlcnZpY2UgPSBpbmplY3QoQ29kZUVkaXRvclNlcnZpY2UpO1xuICBwcm90ZWN0ZWQgdHlwZXNjcmlwdERlZmF1bHRzID0gaW5qZWN0KFR5cGVzY3JpcHREZWZhdWx0c1NlcnZpY2UpO1xuICBwcm90ZWN0ZWQgamF2YXNjcmlwdERlZmF1bHRzID0gaW5qZWN0KEphdmFzY3JpcHREZWZhdWx0c1NlcnZpY2UpO1xuICBwcm90ZWN0ZWQganNvbkRlZmF1bHRzID0gaW5qZWN0KEpzb25EZWZhdWx0c1NlcnZpY2UpO1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgdGhpcy5lZGl0b3IuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5lZGl0b3IgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tb2RlbCkge1xuICAgICAgdGhpcy5fbW9kZWwuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fbW9kZWwgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5jb2RlTW9kZWwgJiYgIWNoYW5nZXMuY29kZU1vZGVsLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1vZGVsKGNoYW5nZXMuY29kZU1vZGVsLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMucmVhZE9ubHkgJiYgIWNoYW5nZXMucmVhZE9ubHkuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgICB0aGlzLmVkaXRvci51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgICByZWFkT25seTogY2hhbmdlcy5yZWFkT25seS5jdXJyZW50VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMudGhlbWUgJiYgIWNoYW5nZXMudGhlbWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRUaGVtZShjaGFuZ2VzLnRoZW1lLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uUmVzaXplKCkge1xuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgdGhpcy5lZGl0b3IubGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2V0dXBFZGl0b3IoKTtcbiAgICB0aGlzLmxvYWRlZC5lbWl0KHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEVkaXRvcigpIHtcbiAgICBjb25zdCBkb21FbGVtZW50ID0gdGhpcy5lZGl0b3JDb250ZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICB2YWx1ZTogJycsXG4gICAgICBsYW5ndWFnZTogJ3RleHQnLFxuICAgICAgdXJpOiBgY29kZS0ke0RhdGUubm93KCl9YCxcbiAgICAgIC4uLnRoaXMuY29kZU1vZGVsXG4gICAgfTtcblxuICAgIHRoaXMuX21vZGVsID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmNyZWF0ZU1vZGVsKFxuICAgICAgc2V0dGluZ3MudmFsdWUsXG4gICAgICBzZXR0aW5ncy5sYW5ndWFnZSxcbiAgICAgIHNldHRpbmdzLnVyaVxuICAgICk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kZWZhdWx0T3B0aW9ucywgdGhpcy5vcHRpb25zLCB7XG4gICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSxcbiAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgICAgbW9kZWw6IHRoaXMuX21vZGVsXG4gICAgfSk7XG5cbiAgICB0aGlzLmVkaXRvciA9IHRoaXMuZWRpdG9yU2VydmljZS5jcmVhdGVFZGl0b3IoZG9tRWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLl9tb2RlbC5vbkRpZENoYW5nZUNvbnRlbnQoKGU6IGVkaXRvci5JTW9kZWxDb250ZW50Q2hhbmdlZEV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm1vZGVsQ29udGVudENoYW5nZWQuZW1pdChlKTtcblxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLl9tb2RlbC5nZXRWYWx1ZSgpO1xuICAgICAgaWYgKHRoaXMuY29kZU1vZGVsKSB7XG4gICAgICAgIHRoaXMuY29kZU1vZGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlZC5lbWl0KG5ld1ZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0dXBEZXBlbmRlbmNpZXModGhpcy5jb2RlTW9kZWwpO1xuICAgIHRoaXMuY29kZU1vZGVsQ2hhbmdlZC5lbWl0KHsgc2VuZGVyOiB0aGlzLCB2YWx1ZTogdGhpcy5jb2RlTW9kZWwgfSk7XG4gIH1cblxuICBydW5FZGl0b3JBY3Rpb24oaWQ6IHN0cmluZywgYXJncz86IHVua25vd24pIHtcbiAgICB0aGlzLmVkaXRvci5nZXRBY3Rpb24oaWQpPy5ydW4oYXJncyk7XG4gIH1cblxuICBmb3JtYXREb2N1bWVudCgpIHtcbiAgICB0aGlzLnJ1bkVkaXRvckFjdGlvbignZWRpdG9yLmFjdGlvbi5mb3JtYXREb2N1bWVudCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cERlcGVuZGVuY2llcyhtb2RlbDogQ29kZU1vZGVsKSB7XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbGFuZ3VhZ2UgfSA9IG1vZGVsO1xuXG4gICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBsYW5nID0gbGFuZ3VhZ2UudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChsYW5nKSB7XG4gICAgICAgIGNhc2UgJ3R5cGVzY3JpcHQnOlxuICAgICAgICAgIGlmIChtb2RlbC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5sb2FkVHlwaW5ncyhtb2RlbC5kZXBlbmRlbmNpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnamF2YXNjcmlwdCc6XG4gICAgICAgICAgaWYgKG1vZGVsLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmxvYWRUeXBpbmdzKG1vZGVsLmRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgICBpZiAobW9kZWwuc2NoZW1hcykge1xuICAgICAgICAgICAgdGhpcy5qc29uRGVmYXVsdHMuYWRkU2NoZW1hcyhtb2RlbC51cmksIG1vZGVsLnNjaGVtYXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVkaXRvclZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBGaXggZm9yIHZhbHVlIGNoYW5nZSB3aGlsZSBkaXNwb3NlIGluIHByb2Nlc3MuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fbW9kZWwpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb2RlbChtb2RlbDogQ29kZU1vZGVsKSB7XG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICB0aGlzLnNldEVkaXRvclZhbHVlKG1vZGVsLnZhbHVlKTtcbiAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRNb2RlbExhbmd1YWdlKHRoaXMuX21vZGVsLCBtb2RlbC5sYW5ndWFnZSk7XG4gICAgICB0aGlzLnNldHVwRGVwZW5kZW5jaWVzKG1vZGVsKTtcbiAgICAgIHRoaXMuY29kZU1vZGVsQ2hhbmdlZC5lbWl0KHsgc2VuZGVyOiB0aGlzLCB2YWx1ZTogbW9kZWwgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGlkPVwiZWRpdG9yXCIgI2VkaXRvciBjbGFzcz1cIm1vbmFjby1lZGl0b3IgZWRpdG9yXCI+PC9kaXY+XG4iXX0=