UNPKG

@zodiac-ui/editor

Version:

A rich text editor for Angular based on `@atlaskit/editor-core`.

118 lines 17.3 kB
import { EventEmitter, Inject, Injectable, Optional } from "@angular/core"; import { EditorView } from "prosemirror-view"; import { EditorState, Selection } from "prosemirror-state"; import { Node } from "prosemirror-model"; import { findChangedNodesFromTransaction, validateNodes } from "./utils/nodes"; import { EventDispatcher } from "./interfaces/editor-config"; import { createPMPlugins } from "./utils/create-plugins"; import { createSchema } from "./utils/create-schema"; import { createDispatch } from "./utils/create-dispatch"; import { createConfig } from "./utils/create-config"; import { EDITOR_PLUGIN, STATE_HANDLER } from "./constants"; import { ReplaySubject } from "rxjs"; export const defaultState = { content: [], type: "doc", }; export class EditorService { constructor(plugins, handlers) { this.eventDispatcher = new EventDispatcher(); this.viewChange = new EventEmitter(); this.stateChange = new ReplaySubject(1); this.plugins = plugins; this.handlers = handlers; } runTool(tool) { tool.run(this.state, this.view.dispatch, this.view); } updateState(state) { if (this.view) { this.createEditorState(state); this.view.updateState(this.state); } } createEditorState(state) { this.config = createConfig(this.plugins, {}); const schema = createSchema(this.config); const dispatch = createDispatch(this.eventDispatcher); const doc = Node.fromJSON(schema, state ? state.doc : defaultState); const selection = state ? Selection.fromJSON(doc, state.selection) : undefined; // const errorReporter = createErrorReporter(errorReporterHandler); const plugins = createPMPlugins({ schema, dispatch, editorConfig: this.config, eventDispatcher: this.eventDispatcher, }); // let doc; // if (options.replaceDoc) { // doc = // this.contentTransformer && typeof defaultValue === 'string' // ? this.contentTransformer.parse(defaultValue) // : processRawValue(schema, defaultValue); // } // let selection: Selection | undefined; // if (doc) { // // ED-4759: Don't set selection at end for full-page editor - should be at start // selection = // options.props.editorProps.appearance === 'full-page' // ? Selection.atStart(doc) // : Selection.atEnd(doc); // } // // Workaround for ED-3507: When media node is the last element, scrollIntoView throws an error // const patchedSelection = selection // ? Selection.findFrom(selection.$head, -1, true) || undefined // : undefined; this.state = EditorState.create({ schema, plugins, doc, selection }); } createEditorView(node) { // Creates the editor-view from this.editorState. If an editor has been mounted // previously, this will contain the previous state of the editor. this.view = new EditorView({ mount: node }, { state: this.state, dispatchTransaction: (transaction) => { if (!this.view) { return; } const nodes = findChangedNodesFromTransaction(transaction); if (validateNodes(nodes)) { // go ahead and update the state now we know the transaction is good const editorState = this.view.state.apply(transaction); this.view.updateState(editorState); if (transaction.docChanged) { this.viewChange.emit(this); } this.state = editorState; this.stateChange.next(this); } // else { // const documents = { // new: getDocStructure(transaction.doc), // prev: getDocStructure(transaction.docs[0]), // }; // } }, }); this.viewChange.emit(this); this.stateChange.next(this); if (this.handlers) { this.stateChange.subscribe((editor) => { this.handlers.forEach(handler => handler(editor)); }); } } } EditorService.decorators = [ { type: Injectable } ]; /** @nocollapse */ EditorService.ctorParameters = () => [ { type: Array, decorators: [{ type: Inject, args: [EDITOR_PLUGIN,] }] }, { type: Array, decorators: [{ type: Optional }, { type: Inject, args: [STATE_HANDLER,] }] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2VkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFlLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFHMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVwQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDeEIsT0FBTyxFQUFFLEVBQUU7SUFDWCxJQUFJLEVBQUUsS0FBSztDQUNkLENBQUE7QUFHRCxNQUFNLE9BQU8sYUFBYTtJQVd0QixZQUFtQyxPQUF1QixFQUFxQyxRQUFnQjtRQUMzRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFD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QVcsQ0FBQyxDQUFDO29CQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFO3dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDOUI7b0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7b0JBRXpCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUM5QjtnQkFDRCxTQUFTO2dCQUNULDBCQUEwQjtnQkFDMUIsaURBQWlEO2dCQUNqRCxzREFBc0Q7Z0JBQ3RELFNBQVM7Z0JBQ1QsSUFBSTtZQUNSLENBQUM7U0FHSixDQUNKLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUzQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQ3JELENBQUMsQ0FBQyxDQUFBO1NBQ0w7SUFDTCxDQUFDOzs7WUF0SEosVUFBVTs7Ozt3Q0FZTSxNQUFNLFNBQUMsYUFBYTt3Q0FBNEIsUUFBUSxZQUFJLE1BQU0sU0FBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxyXG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCJcclxuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gXCJwcm9zZW1pcnJvci12aWV3XCJcclxuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFRyYW5zYWN0aW9uLCBTZWxlY3Rpb24gfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIlxyXG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcInByb3NlbWlycm9yLW1vZGVsXCJcclxuaW1wb3J0IHsgZmluZENoYW5nZWROb2Rlc0Zyb21UcmFuc2FjdGlvbiwgdmFsaWRhdGVOb2RlcyB9IGZyb20gXCIuL3V0aWxzL25vZGVzXCJcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9lZGl0b3ItY29uZmlnXCJcclxuaW1wb3J0IHsgY3JlYXRlUE1QbHVnaW5zIH0gZnJvbSBcIi4vdXRpbHMvY3JlYXRlLXBsdWdpbnNcIlxyXG5pbXBvcnQgeyBjcmVhdGVTY2hlbWEgfSBmcm9tIFwiLi91dGlscy9jcmVhdGUtc2NoZW1hXCJcclxuaW1wb3J0IHsgY3JlYXRlRGlzcGF0Y2ggfSBmcm9tIFwiLi91dGlscy9jcmVhdGUtZGlzcGF0Y2hcIlxyXG5pbXBvcnQgeyBjcmVhdGVDb25maWcgfSBmcm9tIFwiLi91dGlscy9jcmVhdGUtY29uZmlnXCJcclxuaW1wb3J0IHsgRURJVE9SX1BMVUdJTiwgU1RBVEVfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiXHJcbmltcG9ydCB7IEVkaXRvclBsdWdpbiB9IGZyb20gXCIuL2ludGVyZmFjZXMvZWRpdG9yLXBsdWdpblwiXHJcbmltcG9ydCB7IEVkaXRvclRvb2wgfSBmcm9tIFwiLi9lZGl0b3ItdG9vbGJhci9pbnRlcmZhY2VzXCJcclxuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gXCJyeGpzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0U3RhdGUgPSB7XHJcbiAgICBjb250ZW50OiBbXSxcclxuICAgIHR5cGU6IFwiZG9jXCIsXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEVkaXRvclNlcnZpY2UgaW1wbGVtZW50cyBFZGl0b3Ige1xyXG4gICAgcHVibGljIHN0YXRlOiBFZGl0b3JTdGF0ZVxyXG4gICAgcHVibGljIHZpZXc6IEVkaXRvclZpZXdcclxuICAgIHByaXZhdGUgY29uZmlnXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50RGlzcGF0Y2hlclxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5zXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzPzogYW55W11cclxuXHJcbiAgICBwdWJsaWMgdmlld0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT5cclxuICAgIHB1YmxpYyBzdGF0ZUNoYW5nZTogUmVwbGF5U3ViamVjdDxhbnk+XHJcblxyXG4gICAgY29uc3RydWN0b3IoQEluamVjdChFRElUT1JfUExVR0lOKSBwbHVnaW5zOiBFZGl0b3JQbHVnaW5bXSwgQE9wdGlvbmFsKCkgQEluamVjdChTVEFURV9IQU5ETEVSKSBoYW5kbGVycz86IGFueVtdKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7XHJcbiAgICAgICAgdGhpcy52aWV3Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpXHJcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZSA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXHJcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gcGx1Z2luc1xyXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVyc1xyXG4gICAgfVxyXG5cclxuICAgIHJ1blRvb2wodG9vbDogRWRpdG9yVG9vbCkge1xyXG4gICAgICAgIHRvb2wucnVuKHRoaXMuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCwgdGhpcy52aWV3KVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0YXRlKHN0YXRlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlldykge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvclN0YXRlKHN0YXRlKVxyXG4gICAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUodGhpcy5zdGF0ZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRWRpdG9yU3RhdGUoc3RhdGUpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNyZWF0ZUNvbmZpZyh0aGlzLnBsdWdpbnMsIHt9KVxyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGNyZWF0ZVNjaGVtYSh0aGlzLmNvbmZpZylcclxuICAgICAgICBjb25zdCBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKHRoaXMuZXZlbnREaXNwYXRjaGVyKTtcclxuICAgICAgICBjb25zdCBkb2MgPSBOb2RlLmZyb21KU09OKHNjaGVtYSwgc3RhdGUgPyBzdGF0ZS5kb2MgOiBkZWZhdWx0U3RhdGUpXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc3RhdGUgPyBTZWxlY3Rpb24uZnJvbUpTT04oZG9jLCBzdGF0ZS5zZWxlY3Rpb24pIDogdW5kZWZpbmVkXHJcbiAgICAgICAgLy8gY29uc3QgZXJyb3JSZXBvcnRlciA9IGNyZWF0ZUVycm9yUmVwb3J0ZXIoZXJyb3JSZXBvcnRlckhhbmRsZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBwbHVnaW5zID0gY3JlYXRlUE1QbHVnaW5zKHtcclxuICAgICAgICAgICAgc2NoZW1hLFxyXG4gICAgICAgICAgICBkaXNwYXRjaCxcclxuICAgICAgICAgICAgZWRpdG9yQ29uZmlnOiB0aGlzLmNvbmZpZyxcclxuICAgICAgICAgICAgZXZlbnREaXNwYXRjaGVyOiB0aGlzLmV2ZW50RGlzcGF0Y2hlcixcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyBsZXQgZG9jO1xyXG4gICAgICAgIC8vIGlmIChvcHRpb25zLnJlcGxhY2VEb2MpIHtcclxuICAgICAgICAvLyAgICAgZG9jID1cclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29udGVudFRyYW5zZm9ybWVyICYmIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRUcmFuc2Zvcm1lci5wYXJzZShkZWZhdWx0VmFsdWUpXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgOiBwcm9jZXNzUmF3VmFsdWUoc2NoZW1hLCBkZWZhdWx0VmFsdWUpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBsZXQgc2VsZWN0aW9uOiBTZWxlY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gaWYgKGRvYykge1xyXG4gICAgICAgIC8vICAgICAvLyBFRC00NzU5OiBEb24ndCBzZXQgc2VsZWN0aW9uIGF0IGVuZCBmb3IgZnVsbC1wYWdlIGVkaXRvciAtIHNob3VsZCBiZSBhdCBzdGFydFxyXG4gICAgICAgIC8vICAgICBzZWxlY3Rpb24gPVxyXG4gICAgICAgIC8vICAgICAgICAgb3B0aW9ucy5wcm9wcy5lZGl0b3JQcm9wcy5hcHBlYXJhbmNlID09PSAnZnVsbC1wYWdlJ1xyXG4gICAgICAgIC8vICAgICAgICAgICAgID8gU2VsZWN0aW9uLmF0U3RhcnQoZG9jKVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIDogU2VsZWN0aW9uLmF0RW5kKGRvYyk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIC8vIFdvcmthcm91bmQgZm9yIEVELTM1MDc6IFdoZW4gbWVkaWEgbm9kZSBpcyB0aGUgbGFzdCBlbGVtZW50LCBzY3JvbGxJbnRvVmlldyB0aHJvd3MgYW4gZXJyb3JcclxuICAgICAgICAvLyBjb25zdCBwYXRjaGVkU2VsZWN0aW9uID0gc2VsZWN0aW9uXHJcbiAgICAgICAgLy8gICAgID8gU2VsZWN0aW9uLmZpbmRGcm9tKHNlbGVjdGlvbi4kaGVhZCwgLTEsIHRydWUpIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgIC8vICAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEVkaXRvclN0YXRlLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgIHNjaGVtYSxcclxuICAgICAgICAgICAgcGx1Z2lucyxcclxuICAgICAgICAgICAgZG9jLFxyXG4gICAgICAgICAgICBzZWxlY3Rpb25cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVkaXRvclZpZXcobm9kZSkge1xyXG4gICAgICAgIC8vIENyZWF0ZXMgdGhlIGVkaXRvci12aWV3IGZyb20gdGhpcy5lZGl0b3JTdGF0ZS4gSWYgYW4gZWRpdG9yIGhhcyBiZWVuIG1vdW50ZWRcclxuICAgICAgICAvLyBwcmV2aW91c2x5LCB0aGlzIHdpbGwgY29udGFpbiB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIGVkaXRvci5cclxuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgRWRpdG9yVmlldyhcclxuICAgICAgICAgICAgeyBtb3VudDogbm9kZSB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIGRpc3BhdGNoVHJhbnNhY3Rpb246ICh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmlldykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlczogTm9kZVtdID0gZmluZENoYW5nZWROb2Rlc0Zyb21UcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlTm9kZXMobm9kZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGFoZWFkIGFuZCB1cGRhdGUgdGhlIHN0YXRlIG5vdyB3ZSBrbm93IHRoZSB0cmFuc2FjdGlvbiBpcyBnb29kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvclN0YXRlID0gdGhpcy52aWV3LnN0YXRlLmFwcGx5KHRyYW5zYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKGVkaXRvclN0YXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmRvY0NoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBlZGl0b3JTdGF0ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UubmV4dCh0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29uc3QgZG9jdW1lbnRzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbmV3OiBnZXREb2NTdHJ1Y3R1cmUodHJhbnNhY3Rpb24uZG9jKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHByZXY6IGdldERvY1N0cnVjdHVyZSh0cmFuc2FjdGlvbi5kb2NzWzBdKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZXMgdGhlIGNvbnRlbnRFZGl0YWJsZSBhdHRyaWJ1dGUgb2YgdGhlIGVkaXRvciBpZiB0aGUgZWRpdG9yIGlzIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAvLyBlZGl0YWJsZTogc3RhdGUgPT4gIXRoaXMucHJvcHMuZWRpdG9yUHJvcHMuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQodGhpcylcclxuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlLm5leHQodGhpcylcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5zdWJzY3JpYmUoKGVkaXRvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4gaGFuZGxlcihlZGl0b3IpKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=