@kerebron/extension-lsp 0.4.27 → 0.4.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/esm/DiagnosticPlugin.d.ts +32 -0
  2. package/esm/DiagnosticPlugin.d.ts.map +1 -0
  3. package/esm/DiagnosticPlugin.js +117 -0
  4. package/esm/DiagnosticPlugin.js.map +1 -0
  5. package/esm/ExtensionLsp.d.ts +25 -0
  6. package/esm/ExtensionLsp.d.ts.map +1 -0
  7. package/esm/ExtensionLsp.js +88 -0
  8. package/esm/ExtensionLsp.js.map +1 -0
  9. package/esm/LSPClient.d.ts +56 -0
  10. package/esm/LSPClient.d.ts.map +1 -0
  11. package/esm/LSPClient.js +362 -0
  12. package/esm/LSPClient.js.map +1 -0
  13. package/esm/LspWebSocketTransport.d.ts +19 -0
  14. package/esm/LspWebSocketTransport.d.ts.map +1 -0
  15. package/esm/LspWebSocketTransport.js +103 -0
  16. package/esm/LspWebSocketTransport.js.map +1 -0
  17. package/esm/computeIncrementalChanges.d.ts +8 -0
  18. package/esm/computeIncrementalChanges.d.ts.map +1 -0
  19. package/esm/computeIncrementalChanges.js +83 -0
  20. package/esm/computeIncrementalChanges.js.map +1 -0
  21. package/esm/createLspAutocomplete.d.ts +23 -0
  22. package/esm/createLspAutocomplete.d.ts.map +1 -0
  23. package/esm/createLspAutocomplete.js +69 -0
  24. package/esm/createLspAutocomplete.js.map +1 -0
  25. package/esm/mod.d.ts +4 -0
  26. package/esm/mod.d.ts.map +1 -0
  27. package/esm/mod.js +4 -0
  28. package/esm/mod.js.map +1 -0
  29. package/esm/package.json +3 -0
  30. package/esm/types.d.ts +19 -0
  31. package/esm/types.d.ts.map +1 -0
  32. package/esm/types.js +2 -0
  33. package/esm/types.js.map +1 -0
  34. package/esm/workspace.d.ts +62 -0
  35. package/esm/workspace.d.ts.map +1 -0
  36. package/esm/workspace.js +118 -0
  37. package/esm/workspace.js.map +1 -0
  38. package/package.json +8 -5
  39. package/src/DiagnosticPlugin.ts +196 -0
  40. package/src/ExtensionLsp.ts +118 -0
  41. package/src/LSPClient.ts +485 -0
  42. package/src/LspWebSocketTransport.ts +114 -0
  43. package/src/computeIncrementalChanges.ts +101 -0
  44. package/src/createLspAutocomplete.ts +95 -0
  45. package/src/mod.ts +3 -0
  46. package/src/types.ts +14 -0
  47. package/src/workspace.ts +192 -0
@@ -0,0 +1,32 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ import { ExtensionLsp } from './ExtensionLsp.js';
3
+ import { PositionMapper } from '@kerebron/extension-markdown/PositionMapper';
4
+ interface LspRange {
5
+ line: number;
6
+ character: number;
7
+ }
8
+ interface DiagnosticsItem {
9
+ severity: number;
10
+ range: {
11
+ start: LspRange;
12
+ end: LspRange;
13
+ };
14
+ message: string;
15
+ source: string;
16
+ code: string;
17
+ data: any;
18
+ }
19
+ interface DiagnosticPluginState {
20
+ diagnostics: DiagnosticsItem[];
21
+ mapper?: PositionMapper;
22
+ }
23
+ interface DiagnosticConfig {
24
+ }
25
+ export declare class DiagnosticPlugin extends Plugin<DiagnosticPluginState> {
26
+ diagListener: ((event: Event) => void) | undefined;
27
+ listenerDisconnect: ((event: Event) => void) | undefined;
28
+ listenerChange: ((event: Event) => void) | undefined;
29
+ constructor(config: DiagnosticConfig, extension: ExtensionLsp);
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=DiagnosticPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticPlugin.d.ts","sourceRoot":"","sources":["../src/DiagnosticPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA0B,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAE7E,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QACL,KAAK,EAAE,QAAQ,CAAC;QAChB,GAAG,EAAE,QAAQ,CAAC;KACf,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;CACX;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,UAAU,gBAAgB;CACzB;AAID,qBAAa,gBAAiB,SAAQ,MAAM,CAAC,qBAAqB,CAAC;IACjE,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACnD,kBAAkB,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACzD,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;gBAEzC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY;CA8J9D"}
@@ -0,0 +1,117 @@
1
+ import { Plugin, PluginKey } from 'prosemirror-state';
2
+ import { Decoration, DecorationSet } from 'prosemirror-view';
3
+ const DiagnosticPluginKey = new PluginKey('lsp-diagnostic');
4
+ export class DiagnosticPlugin extends Plugin {
5
+ diagListener;
6
+ listenerDisconnect;
7
+ listenerChange;
8
+ constructor(config, extension) {
9
+ super({
10
+ key: DiagnosticPluginKey,
11
+ view(view) {
12
+ return {
13
+ destroy: () => {
14
+ const client = extension.getClient(extension.mainLang);
15
+ if (this.listener && client) {
16
+ client.removeEventListener('textDocument/publishDiagnostics', this.listener);
17
+ }
18
+ if (this.listenerDisconnect && client) {
19
+ client.removeEventListener('close', this.listenerDisconnect);
20
+ }
21
+ if (this.changeListener) {
22
+ extension.getEditor().removeEventListener('change', this.changeListener);
23
+ }
24
+ },
25
+ };
26
+ },
27
+ state: {
28
+ init() {
29
+ return {
30
+ diagnostics: [],
31
+ };
32
+ },
33
+ apply(tr, prev, oldState, newState) {
34
+ const next = { ...prev };
35
+ const meta = tr.getMeta(DiagnosticPluginKey);
36
+ if (meta?.diagnostics) {
37
+ next.diagnostics = meta.diagnostics;
38
+ }
39
+ if (meta?.mapper) {
40
+ next.mapper = meta.mapper;
41
+ }
42
+ return next;
43
+ },
44
+ },
45
+ props: {
46
+ decorations(state) {
47
+ const decorations = [];
48
+ const pluginState = this.getState(state);
49
+ if (pluginState) {
50
+ const { diagnostics, mapper } = pluginState;
51
+ if (mapper) {
52
+ for (const diag of diagnostics) {
53
+ const from = mapper.fromLineChar(diag.range.start.line, diag.range.start.character);
54
+ const end = mapper.fromLineChar(diag.range.end.line, diag.range.end.character);
55
+ if (from > -1 && end > -1) {
56
+ const decoration = Decoration.inline(from, end, { class: 'kb-lsp__error', title: diag.message });
57
+ decorations.push(decoration);
58
+ }
59
+ }
60
+ }
61
+ }
62
+ return DecorationSet.create(state.doc, decorations);
63
+ },
64
+ },
65
+ });
66
+ let lastDiag = 0;
67
+ const editor = extension.getEditor();
68
+ const uri = editor.config.uri;
69
+ if (uri) {
70
+ const client = extension.getClient(extension.mainLang);
71
+ this.diagListener = (event) => {
72
+ const detail = event.detail;
73
+ if (detail.params.uri !== uri) {
74
+ return;
75
+ }
76
+ event.preventDefault();
77
+ lastDiag = +Date();
78
+ if (client) {
79
+ const file = client.workspace.getFile(uri);
80
+ if (file) {
81
+ const { mapper } = file;
82
+ const tr = editor.view.state.tr.setMeta(DiagnosticPluginKey, {
83
+ diagnostics: detail.params.diagnostics,
84
+ mapper,
85
+ });
86
+ editor.view.dispatch(tr);
87
+ }
88
+ }
89
+ };
90
+ if (client) {
91
+ client.addEventListener('textDocument/publishDiagnostics', this.diagListener);
92
+ }
93
+ this.listenerDisconnect = (event) => {
94
+ const tr = editor.view.state.tr.setMeta(DiagnosticPluginKey, {
95
+ diagnostics: [],
96
+ mapper: undefined,
97
+ });
98
+ editor.view.dispatch(tr);
99
+ };
100
+ if (client) {
101
+ client.addEventListener('close', this.listenerDisconnect);
102
+ }
103
+ this.listenerChange = (event) => {
104
+ if (lastDiag === 0 && +Date() - lastDiag > 10_1000) {
105
+ return;
106
+ }
107
+ const tr = editor.view.state.tr.setMeta(DiagnosticPluginKey, {
108
+ diagnostics: [],
109
+ mapper: undefined,
110
+ });
111
+ editor.view.dispatch(tr);
112
+ };
113
+ // extension.getEditor().addEventListener('changed', this.listenerChange);
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=DiagnosticPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticPlugin.js","sourceRoot":"","sources":["../src/DiagnosticPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ import { Extension } from '@kerebron/editor';
3
+ import { type ExtensionMarkdown } from '@kerebron/extension-markdown';
4
+ import { type ExtensionAutocomplete } from '@kerebron/extension-autocomplete';
5
+ import { LSPClient, Transport } from './LSPClient.js';
6
+ import { LspSource } from './workspace.js';
7
+ export type LspTransportGetter = (lang: string) => Transport | undefined;
8
+ export interface LspConfig {
9
+ getLspTransport: LspTransportGetter;
10
+ }
11
+ export declare class ExtensionLsp extends Extension {
12
+ protected config: LspConfig;
13
+ name: string;
14
+ clients: Record<string, LSPClient>;
15
+ uri: string | undefined;
16
+ extensionMarkdown: ExtensionMarkdown;
17
+ extensionAutocomplete: ExtensionAutocomplete;
18
+ mainLang: string;
19
+ source: LspSource;
20
+ constructor(config: LspConfig);
21
+ getProseMirrorPlugins(): Plugin[];
22
+ created(): void;
23
+ getClient(lang: string): LSPClient | undefined;
24
+ }
25
+ //# sourceMappingURL=ExtensionLsp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionLsp.d.ts","sourceRoot":"","sources":["../src/ExtensionLsp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAItD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,kBAAkB,CAAC;CACrC;AAED,qBAAa,YAAa,SAAQ,SAAS;cASV,MAAM,EAAE,SAAS;IARhD,IAAI,SAAS;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAM;IACxC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,iBAAiB,EAAG,iBAAiB,CAAC;IACtC,qBAAqB,EAAG,qBAAqB,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAc;IAC9B,MAAM,EAAG,SAAS,CAAC;gBAEY,MAAM,EAAE,SAAS;IAIvC,qBAAqB,IAAI,MAAM,EAAE;IAWjC,OAAO;IA+DhB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;CAW/C"}
@@ -0,0 +1,88 @@
1
+ import { Extension } from '@kerebron/editor';
2
+ import { PositionMapper } from '@kerebron/extension-markdown/PositionMapper';
3
+ import { LSPClient } from './LSPClient.js';
4
+ import { AutocompletePlugin } from '@kerebron/extension-autocomplete/AutocompletePlugin';
5
+ import { DiagnosticPlugin } from './DiagnosticPlugin.js';
6
+ import { createLspAutocomplete } from './createLspAutocomplete.js';
7
+ export class ExtensionLsp extends Extension {
8
+ config;
9
+ name = 'lsp';
10
+ clients = {};
11
+ uri;
12
+ extensionMarkdown;
13
+ extensionAutocomplete;
14
+ mainLang = 'markdown';
15
+ source;
16
+ constructor(config) {
17
+ super(config);
18
+ this.config = config;
19
+ }
20
+ getProseMirrorPlugins() {
21
+ const plugins = [];
22
+ const { autocompleteConfig } = createLspAutocomplete(this);
23
+ plugins.push(new AutocompletePlugin(autocompleteConfig, this.editor));
24
+ plugins.push(new DiagnosticPlugin({}, this));
25
+ return plugins;
26
+ }
27
+ created() {
28
+ this.mainLang = this.editor.config.languageID || 'markdown';
29
+ this.source = {
30
+ ui: this.editor.ui,
31
+ getMappedContent: async () => {
32
+ const editor = this.editor;
33
+ const result = await this.extensionMarkdown.toMarkdown(editor.state.doc);
34
+ const mapper = new PositionMapper(editor, result.rawTextMap);
35
+ return {
36
+ ...result,
37
+ mapper,
38
+ };
39
+ },
40
+ };
41
+ const extensionMarkdown = this.editor
42
+ .getExtension('markdown');
43
+ if (!extensionMarkdown) {
44
+ throw new Error('No markdown extension');
45
+ }
46
+ this.extensionMarkdown = extensionMarkdown;
47
+ this.editor.addEventListener('doc:loaded', async () => {
48
+ const languageID = this.mainLang;
49
+ this.uri = this.editor.config.uri;
50
+ if (this.uri) {
51
+ const client = this.getClient(this.mainLang);
52
+ if (client) {
53
+ client.connect(this.uri, this.source);
54
+ await client.restart();
55
+ client.workspace.openFile(this.uri, languageID, this.source);
56
+ }
57
+ }
58
+ });
59
+ this.editor.addEventListener('changed', () => {
60
+ if (this.editor.config.uri) {
61
+ const client = this.getClient(this.mainLang);
62
+ if (client) {
63
+ client.workspace.changedFile(this.editor.config.uri);
64
+ }
65
+ }
66
+ });
67
+ this.editor.addEventListener('beforeDestroy', () => {
68
+ if (this.uri) {
69
+ const client = this.getClient(this.mainLang);
70
+ if (client) {
71
+ client.disconnect(this.uri);
72
+ }
73
+ }
74
+ });
75
+ }
76
+ getClient(lang) {
77
+ if (!this.clients[lang]) {
78
+ const transport = this.config.getLspTransport(lang);
79
+ if (!transport) {
80
+ console.warn(`No lsp transport for ${lang}`);
81
+ return undefined;
82
+ }
83
+ this.clients[lang] = new LSPClient(transport, { rootUri: 'file:///' });
84
+ }
85
+ return this.clients[lang];
86
+ }
87
+ }
88
+ //# sourceMappingURL=ExtensionLsp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionLsp.js","sourceRoot":"","sources":["../src/ExtensionLsp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type * as lsp from 'vscode-languageserver-protocol';
2
+ import { TextDocumentSyncKind } from 'vscode-languageserver-protocol';
3
+ import { LspSource, Workspace, WorkspaceFile } from './workspace.js';
4
+ export type Transport = {
5
+ connect(): void;
6
+ disconnect(): void;
7
+ send(message: string): void;
8
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
9
+ removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
10
+ isConnected(): boolean;
11
+ isInitialized(): boolean;
12
+ };
13
+ export type LSPClientConfig = {
14
+ rootUri?: string;
15
+ workspace?: (client: LSPClient) => Workspace;
16
+ timeout?: number;
17
+ sanitizeHTML?: (html: string) => string;
18
+ unhandledNotification?: (client: LSPClient, method: string, params: any) => void;
19
+ };
20
+ export declare class LSPError extends Error {
21
+ isTimeout: boolean;
22
+ readonly isLSP = true;
23
+ static createTimeout(): LSPError;
24
+ }
25
+ export declare class LSPClient extends EventTarget {
26
+ private readonly transport;
27
+ readonly config: LSPClientConfig;
28
+ sources: Record<string, LspSource>;
29
+ workspace: Workspace;
30
+ private nextReqID;
31
+ private requests;
32
+ serverCapabilities: lsp.ServerCapabilities | null;
33
+ supportSync: TextDocumentSyncKind;
34
+ private readonly timeout;
35
+ private initializing;
36
+ private readonly receiveListener;
37
+ active: boolean;
38
+ constructor(transport: Transport, config?: LSPClientConfig);
39
+ startInitializing(): void;
40
+ stopInitializing(): void;
41
+ restart(): Promise<void>;
42
+ onInitialized(): void;
43
+ connect(uri: string, source: LspSource): void;
44
+ disconnect(uri: string): void;
45
+ didOpen(file: WorkspaceFile): Promise<boolean>;
46
+ didClose(uri: string): void;
47
+ private receiveMessage;
48
+ request<Params, Result>(method: string, params: Params): Promise<Result>;
49
+ private requestInner;
50
+ notification<Params>(method: string, params: Params): Promise<boolean>;
51
+ cancelRequest(params: any): void;
52
+ hasCapability(name: keyof lsp.ServerCapabilities): boolean | null;
53
+ sync(): void;
54
+ private timeoutRequest;
55
+ }
56
+ //# sourceMappingURL=LSPClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LSPClient.d.ts","sourceRoot":"","sources":["../src/LSPClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAEL,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAEL,SAAS,EACT,SAAS,EACT,aAAa,EACd,MAAM,gBAAgB,CAAC;AA0BxB,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,IAAI,IAAI,CAAC;IACnB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;IACR,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,GAAG,IAAI,EACnD,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,GACvC,IAAI,CAAC;IACR,WAAW,IAAI,OAAO,CAAC;IACvB,aAAa,IAAI,OAAO,CAAC;CAC1B,CAAC;AAiEF,MAAM,MAAM,eAAe,GAAG;IAE5B,OAAO,CAAC,EAAE,MAAM,CAAC;IAMjB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,CAAC;IAG7C,OAAO,CAAC,EAAE,MAAM,CAAC;IAOjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAGxC,qBAAqB,CAAC,EAAE,CACtB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,KACR,IAAI,CAAC;CACX,CAAC;AAEF,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAS,UAAS;IAClB,QAAQ,CAAC,KAAK,QAAQ;IAEtB,MAAM,CAAC,aAAa;CAKrB;AAED,qBAAa,SAAU,SAAQ,WAAW;IAiBtC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,QAAQ,CAAC,MAAM,EAAE,eAAe;IAjBlC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAM;IAExC,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAsB;IAEtC,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAQ;IAClD,WAAW,EAAE,oBAAoB,CAA6B;IAErE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,YAAY,CAA6C;IAEjE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,MAAM,EAAE,OAAO,CAAS;gBAGL,SAAS,EAAE,SAAS,EAC5B,MAAM,GAAE,eAAoB;IAuCvC,iBAAiB;IAoCjB,gBAAgB;IAOV,OAAO;IASb,aAAa;IAQb,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;IAWtC,UAAU,CAAC,GAAG,EAAE,MAAM;IAahB,OAAO,CAAC,IAAI,EAAE,aAAa;IAmBjC,QAAQ,CAAC,GAAG,EAAE,MAAM;IASpB,OAAO,CAAC,cAAc;IA+ChB,OAAO,CAAC,MAAM,EAAE,MAAM,EAC1B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IAalB,OAAO,CAAC,YAAY;IA8Cd,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB5E,aAAa,CAAC,MAAM,EAAE,GAAG;IAOzB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,kBAAkB;IAIhD,IAAI;IAIJ,OAAO,CAAC,cAAc;CAcvB"}