vzcode 2.2.0 → 2.3.0

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 (220) hide show
  1. package/dist/assets/{buildWorker-Dsx6rOdK.js → buildWorker-wLkQ0yz1.js} +64 -64
  2. package/dist/assets/{index-BM8tDh6M.css → index-BoFeK4GL.css} +1 -1
  3. package/dist/assets/{index-CpxqGhXj.js → index-DuUjtrt6.js} +150 -150
  4. package/dist/assets/{worker-BeBZGG1n.js → worker-DHxSPM7N.js} +78 -78
  5. package/dist/cli.js +113 -0
  6. package/dist/index.html +2 -2
  7. package/{src/ot.ts → dist/ot.js} +2 -14
  8. package/{src/randomId.ts → dist/randomId.js} +5 -6
  9. package/dist/runCode.js +20 -0
  10. package/dist/server/aiChatHandler/aiEditing.js +89 -0
  11. package/dist/server/aiChatHandler/chatOperations.js +360 -0
  12. package/dist/server/aiChatHandler/errorHandling.js +49 -0
  13. package/dist/server/aiChatHandler/index.js +112 -0
  14. package/dist/server/aiChatHandler/llmStreaming.js +284 -0
  15. package/dist/server/aiChatHandler/validation.js +19 -0
  16. package/dist/server/computeInitialDocument.js +146 -0
  17. package/{src/server/config.ts → dist/server/config.js} +4 -7
  18. package/{src/server/featureFlags.ts → dist/server/featureFlags.js} +0 -3
  19. package/dist/server/generateAIResponse.js +129 -0
  20. package/dist/server/handleAIAssist.js +39 -0
  21. package/dist/server/handleAICopilot.js +81 -0
  22. package/dist/server/index.js +297 -0
  23. package/dist/server/livekit.js +17 -0
  24. package/dist/server/prettier.js +90 -0
  25. package/{src/server/setupEnv.ts → dist/server/setupEnv.js} +1 -2
  26. package/dist/submitOperation.js +14 -0
  27. package/dist/types.js +1 -0
  28. package/dist/utils/fileDiff.js +66 -0
  29. package/package.json +22 -22
  30. package/src/client/AIAssist/AIAssistCodeMirrorKeyMap.ts +0 -42
  31. package/src/client/AIAssist/AIAssistWidget/index.tsx +0 -135
  32. package/src/client/AIAssist/AIAssistWidget/style.scss +0 -47
  33. package/src/client/AIAssist/Spinner.jsx +0 -76
  34. package/src/client/AIAssist/formatFile.ts +0 -27
  35. package/src/client/AIAssist/generateFilesContext.ts +0 -25
  36. package/src/client/AIAssist/index.ts +0 -2
  37. package/src/client/AIAssist/startAIAssist.ts +0 -95
  38. package/src/client/App/index.tsx +0 -153
  39. package/src/client/App/style.scss +0 -82
  40. package/src/client/App/usePending.ts +0 -51
  41. package/src/client/App/useShareDB.ts +0 -161
  42. package/src/client/CodeEditor/Copilot/index.ts +0 -74
  43. package/src/client/CodeEditor/InteractiveWidgets/boolToggler.ts +0 -12
  44. package/src/client/CodeEditor/InteractiveWidgets/colorPicker.ts +0 -68
  45. package/src/client/CodeEditor/InteractiveWidgets/colorsInTextPlugin.ts +0 -174
  46. package/src/client/CodeEditor/InteractiveWidgets/highlightWidgets.ts +0 -79
  47. package/src/client/CodeEditor/InteractiveWidgets/index.ts +0 -44
  48. package/src/client/CodeEditor/InteractiveWidgets/markdownCheckboxToggler.ts +0 -12
  49. package/src/client/CodeEditor/InteractiveWidgets/numberDragger.ts +0 -20
  50. package/src/client/CodeEditor/InteractiveWidgets/rotateWidget.ts +0 -143
  51. package/src/client/CodeEditor/InteractiveWidgets/urlClicker.test.ts +0 -48
  52. package/src/client/CodeEditor/InteractiveWidgets/urlClicker.ts +0 -12
  53. package/src/client/CodeEditor/InteractiveWidgets/vec2Slider.ts +0 -25
  54. package/src/client/CodeEditor/basicSetup.ts +0 -73
  55. package/src/client/CodeEditor/getOrCreateEditor.tsx +0 -615
  56. package/src/client/CodeEditor/index.tsx +0 -202
  57. package/src/client/CodeEditor/json1PresenceBroadcast.ts +0 -41
  58. package/src/client/CodeEditor/json1PresenceDisplay.ts +0 -350
  59. package/src/client/CodeEditor/rainbowBrackets.ts +0 -122
  60. package/src/client/CodeEditor/style.scss +0 -156
  61. package/src/client/CodeEditor/typescriptExtension/worker.ts +0 -32
  62. package/src/client/CodeErrorOverlay/index.tsx +0 -77
  63. package/src/client/CodeErrorOverlay/style.scss +0 -33
  64. package/src/client/Fonts/fonts.ts +0 -8
  65. package/src/client/Icons/AdjustmentSVG.tsx +0 -19
  66. package/src/client/Icons/BugSVG.tsx +0 -20
  67. package/src/client/Icons/CloseSVG.tsx +0 -19
  68. package/src/client/Icons/CssSVG.tsx +0 -16
  69. package/src/client/Icons/DirectoryArrowSVG.tsx +0 -19
  70. package/src/client/Icons/EditSVG.tsx +0 -19
  71. package/src/client/Icons/FileSVG.tsx +0 -19
  72. package/src/client/Icons/FolderSVG.tsx +0 -20
  73. package/src/client/Icons/GearSVG.tsx +0 -16
  74. package/src/client/Icons/HtmlSVG.tsx +0 -16
  75. package/src/client/Icons/JavaScriptSVG.tsx +0 -16
  76. package/src/client/Icons/JsonSVG.tsx +0 -16
  77. package/src/client/Icons/MarkdownSVG.tsx +0 -16
  78. package/src/client/Icons/MicOffSVG.tsx +0 -35
  79. package/src/client/Icons/MicSVG.tsx +0 -25
  80. package/src/client/Icons/NewSVG.tsx +0 -19
  81. package/src/client/Icons/PinSVG.tsx +0 -14
  82. package/src/client/Icons/PlaySVG.tsx +0 -16
  83. package/src/client/Icons/QuestionMarkSVG.tsx +0 -18
  84. package/src/client/Icons/ReactSVG.tsx +0 -16
  85. package/src/client/Icons/SearchSVG.tsx +0 -20
  86. package/src/client/Icons/SparklesSVG.tsx +0 -23
  87. package/src/client/Icons/SplitEditorSVG.tsx +0 -34
  88. package/src/client/Icons/StopSVG.tsx +0 -15
  89. package/src/client/Icons/SvelteSVG.tsx +0 -16
  90. package/src/client/Icons/TrashSVG.tsx +0 -19
  91. package/src/client/Icons/TypeScriptSVG.tsx +0 -16
  92. package/src/client/Icons/index.tsx +0 -26
  93. package/src/client/ImageViewer/index.tsx +0 -91
  94. package/src/client/ImageViewer/style.scss +0 -41
  95. package/src/client/PresenceNotifications/PresenceNotifications.test.ts +0 -134
  96. package/src/client/PresenceNotifications/index.tsx +0 -158
  97. package/src/client/PresenceNotifications/style.scss +0 -17
  98. package/src/client/RunCodeWidget/index.tsx +0 -117
  99. package/src/client/RunCodeWidget/style.scss +0 -24
  100. package/src/client/SplitPaneResizeContext.tsx +0 -159
  101. package/src/client/TabList/Tab.tsx +0 -73
  102. package/src/client/TabList/index.tsx +0 -35
  103. package/src/client/TabList/style.scss +0 -51
  104. package/src/client/VZCodeContext/index.tsx +0 -29
  105. package/src/client/VZCodeContext/types.ts +0 -249
  106. package/src/client/VZCodeContext/useVZCodeState.ts +0 -584
  107. package/src/client/VZKeyboardShortcutsDoc.tsx +0 -148
  108. package/src/client/VZLeft.tsx +0 -28
  109. package/src/client/VZMiddle.tsx +0 -172
  110. package/src/client/VZResizer/index.tsx +0 -128
  111. package/src/client/VZResizer/styles.scss +0 -33
  112. package/src/client/VZRight.tsx +0 -113
  113. package/src/client/VZSettings.tsx +0 -275
  114. package/src/client/VZSidebar/AIChat/ChatInput.tsx +0 -239
  115. package/src/client/VZSidebar/AIChat/DiffView.scss +0 -136
  116. package/src/client/VZSidebar/AIChat/DiffView.tsx +0 -176
  117. package/src/client/VZSidebar/AIChat/Message.tsx +0 -143
  118. package/src/client/VZSidebar/AIChat/MessageList.tsx +0 -205
  119. package/src/client/VZSidebar/AIChat/StreamingMessage.tsx +0 -35
  120. package/src/client/VZSidebar/AIChat/ThinkingScratchpad.tsx +0 -156
  121. package/src/client/VZSidebar/AIChat/TypingIndicator.tsx +0 -19
  122. package/src/client/VZSidebar/AIChat/index.tsx +0 -273
  123. package/src/client/VZSidebar/AIChat/styles.scss +0 -627
  124. package/src/client/VZSidebar/AIChat/useSpeechRecognition.ts +0 -117
  125. package/src/client/VZSidebar/CreateDirModal.tsx +0 -111
  126. package/src/client/VZSidebar/CreateFileModal.tsx +0 -111
  127. package/src/client/VZSidebar/DeleteConfirmationModal.tsx +0 -76
  128. package/src/client/VZSidebar/DirectoryListing.tsx +0 -89
  129. package/src/client/VZSidebar/EmptyState.tsx +0 -11
  130. package/src/client/VZSidebar/FileListing.tsx +0 -91
  131. package/src/client/VZSidebar/FileTypeIcon.tsx +0 -49
  132. package/src/client/VZSidebar/Item.tsx +0 -237
  133. package/src/client/VZSidebar/Listing.tsx +0 -47
  134. package/src/client/VZSidebar/Search.tsx +0 -527
  135. package/src/client/VZSidebar/VisualEditor.tsx +0 -282
  136. package/src/client/VZSidebar/VoiceChatModal.tsx +0 -121
  137. package/src/client/VZSidebar/aiCopyPaste.ts +0 -199
  138. package/src/client/VZSidebar/index.tsx +0 -728
  139. package/src/client/VZSidebar/styles.scss +0 -612
  140. package/src/client/VZSidebar/useDragAndDrop.tsx +0 -408
  141. package/src/client/bootstrap.ts +0 -26
  142. package/src/client/buildWorker.ts +0 -3
  143. package/src/client/featureFlags.ts +0 -8
  144. package/src/client/generateRequestId.ts +0 -6
  145. package/src/client/getFileTree.ts +0 -53
  146. package/src/client/index.ts +0 -19
  147. package/src/client/main.jsx +0 -10
  148. package/src/client/presenceColor.ts +0 -8
  149. package/src/client/shouldTriggerRun.ts +0 -31
  150. package/src/client/sortFileTree.ts +0 -21
  151. package/src/client/tabsSearchParameters.test.ts +0 -79
  152. package/src/client/tabsSearchParameters.ts +0 -137
  153. package/src/client/themes/index.ts +0 -7
  154. package/src/client/themes/themes.ts +0 -77
  155. package/src/client/themes/uiwImports.ts +0 -32
  156. package/src/client/themes/useDynamicTheme.ts +0 -29
  157. package/src/client/themes/vizhubTheme/colors.ts +0 -80
  158. package/src/client/themes/vizhubTheme/index.ts +0 -193
  159. package/src/client/useActions.ts +0 -288
  160. package/src/client/useESLint/index.ts +0 -72
  161. package/src/client/useESLint/worker.ts +0 -113
  162. package/src/client/useEditorCache.ts +0 -35
  163. package/src/client/useFileCRUD.ts +0 -228
  164. package/src/client/useKeyboardShortcuts.ts +0 -451
  165. package/src/client/useOpenDirectories.ts +0 -99
  166. package/src/client/usePresenceAutoFollow.ts +0 -85
  167. package/src/client/usePrettier/index.ts +0 -178
  168. package/src/client/usePrettier/worker.ts +0 -109
  169. package/src/client/useRunCode.tsx +0 -15
  170. package/src/client/useRuntimeError.ts +0 -32
  171. package/src/client/useSubmitOperation.ts +0 -15
  172. package/src/client/useURLSync.ts +0 -137
  173. package/src/client/usernameLocalStorage.ts +0 -43
  174. package/src/client/utils/fileExtension.ts +0 -10
  175. package/src/client/utils/isImageFile.ts +0 -12
  176. package/src/client/vzReducer/aiChatReducer.ts +0 -44
  177. package/src/client/vzReducer/closeTabReducer.test.ts +0 -205
  178. package/src/client/vzReducer/closeTabsReducer.ts +0 -96
  179. package/src/client/vzReducer/createInitialState.ts +0 -38
  180. package/src/client/vzReducer/editorNoLongerWantsFocusReducer.ts +0 -9
  181. package/src/client/vzReducer/findPane.ts +0 -19
  182. package/src/client/vzReducer/index.ts +0 -250
  183. package/src/client/vzReducer/openTabReducer.test.ts +0 -127
  184. package/src/client/vzReducer/openTabReducer.ts +0 -74
  185. package/src/client/vzReducer/searchReducer.test.ts +0 -292
  186. package/src/client/vzReducer/searchReducer.ts +0 -181
  187. package/src/client/vzReducer/setActiveFileIdReducer.ts +0 -28
  188. package/src/client/vzReducer/setActiveFileLeftRightReducer.ts +0 -76
  189. package/src/client/vzReducer/setIsDocOpenReducer.ts +0 -9
  190. package/src/client/vzReducer/setIsSettingsOpenReducer.ts +0 -9
  191. package/src/client/vzReducer/setThemeReducer.ts +0 -9
  192. package/src/client/vzReducer/setUsernameReducer.ts +0 -9
  193. package/src/client/vzReducer/splitCurrentPaneReducer.ts +0 -66
  194. package/src/client/vzReducer/toggleAutoFollowReducer.ts +0 -12
  195. package/src/client/vzReducer/updatePane.ts +0 -40
  196. package/src/client/vzReducer/updatePresenceIndicatorReducer.ts +0 -30
  197. package/src/client/vzReducer/visualEditorReducer.ts +0 -9
  198. package/src/reactRouterExports.ts +0 -15
  199. package/src/runCode.ts +0 -27
  200. package/src/server/aiChatHandler/aiEditing.ts +0 -152
  201. package/src/server/aiChatHandler/chatOperations.ts +0 -510
  202. package/src/server/aiChatHandler/errorHandling.ts +0 -66
  203. package/src/server/aiChatHandler/index.ts +0 -200
  204. package/src/server/aiChatHandler/llmStreaming.ts +0 -419
  205. package/src/server/aiChatHandler/undoHandler.ts +0 -97
  206. package/src/server/aiChatHandler/validation.ts +0 -24
  207. package/src/server/computeInitialDocument.ts +0 -220
  208. package/src/server/generateAIResponse.ts +0 -188
  209. package/src/server/handleAIAssist.ts +0 -53
  210. package/src/server/handleAIChatUndo.ts +0 -2
  211. package/src/server/handleAICopilot.ts +0 -97
  212. package/src/server/index.ts +0 -388
  213. package/src/server/livekit.ts +0 -24
  214. package/src/server/prettier.ts +0 -115
  215. package/src/submitOperation.ts +0 -25
  216. package/src/types.ts +0 -205
  217. package/src/utils/fileDiff.ts +0 -117
  218. package/src/vite-env.d.ts +0 -10
  219. /package/{src/server/handleAIChatMessage.ts → dist/server/handleAIChatMessage.js} +0 -0
  220. /package/{src/server/isDirectory.ts → dist/server/isDirectory.js} +0 -0
@@ -1,40 +0,0 @@
1
- import { Pane, PaneId, TabState } from '../../types';
2
- import { VizFileId } from '@vizhub/viz-types';
3
-
4
- // Immutable update pattern for updating a pane's tab list.
5
- export const updatePane = ({
6
- pane,
7
- activePaneId,
8
- newTabList,
9
- newActiveFileId,
10
- }: {
11
- pane: Pane;
12
- activePaneId: PaneId;
13
- newTabList?: Array<TabState>;
14
- newActiveFileId?: VizFileId | null;
15
- }): Pane =>
16
- pane.type === 'splitPane'
17
- ? {
18
- ...pane,
19
- children: pane.children.map((child) =>
20
- updatePane({
21
- pane: child,
22
- activePaneId,
23
- newTabList,
24
- newActiveFileId,
25
- }),
26
- ),
27
- }
28
- : pane.id === activePaneId
29
- ? {
30
- ...pane,
31
- tabList:
32
- newTabList !== undefined
33
- ? newTabList
34
- : pane.tabList,
35
- activeFileId:
36
- newActiveFileId !== undefined
37
- ? newActiveFileId
38
- : pane.activeFileId,
39
- }
40
- : pane;
@@ -1,30 +0,0 @@
1
- import { VZAction, VZState } from '.';
2
-
3
- export const updatePresenceIndicatorReducer = (
4
- state: VZState,
5
- action: VZAction,
6
- ): VZState => {
7
- if (action.type === 'update_presence_indicator') {
8
- // True if there's already an entry for this user.
9
- const needsUpdate =
10
- state.sidebarPresenceIndicators.find(
11
- (d) =>
12
- d.username === action.presenceIndicator.username,
13
- );
14
-
15
- return {
16
- ...state,
17
- sidebarPresenceIndicators: needsUpdate
18
- ? state.sidebarPresenceIndicators.map((d) =>
19
- d.username === action.presenceIndicator.username
20
- ? action.presenceIndicator
21
- : d,
22
- )
23
- : [
24
- ...state.sidebarPresenceIndicators,
25
- action.presenceIndicator,
26
- ],
27
- };
28
- }
29
- return state;
30
- };
@@ -1,9 +0,0 @@
1
- import { VZAction, VZState } from '.';
2
-
3
- export const setIsVisualEditorOpenReducer = (
4
- state: VZState,
5
- action: VZAction,
6
- ): VZState =>
7
- action.type === 'set_is_visual_editor_open'
8
- ? { ...state, isVisualEditorOpen: action.value }
9
- : state;
@@ -1,15 +0,0 @@
1
- // The React Router exports have been a pain to deal with.
2
- // After upgrading Node and React Router, there were random errors.
3
- // And we want to migrate soon from `react-router-dom` to `react-router`,
4
- // so the exports are centralized here.
5
- import * as reactRouterDOM from 'react-router-dom';
6
-
7
- export const {
8
- useSearchParams,
9
-
10
- // This actually is the only thing that works.
11
- // It looks crazy, but it works.
12
- // - reactRouterDOM.default works for Vite SSR build
13
- // - reactRouterDOM works for Vite frontend build
14
- // @ts-ignore
15
- } = reactRouterDOM.default || reactRouterDOM;
package/src/runCode.ts DELETED
@@ -1,27 +0,0 @@
1
- import { generateRunId } from '@vizhub/viz-utils';
2
- import { SubmitOperation } from './types';
3
- import { VizContent } from '@vizhub/viz-types';
4
-
5
- /**
6
- * Creates a runCode function that triggers code execution by changing the `runId` in the content.
7
- * This works for both client-side (with submitOperation) and server-side (with ShareDB document).
8
- */
9
- export const createRunCodeFunction =
10
- (submitOperation: SubmitOperation) => () => {
11
- submitOperation((content: VizContent) => ({
12
- ...content,
13
- runId: generateRunId(),
14
- }));
15
- };
16
-
17
- /**
18
- * Creates a runCodeRef object compatible with React refs.
19
- * This is useful for maintaining compatibility with existing code that expects a ref.
20
- */
21
- export const createRunCodeRef = (
22
- submitOperation: SubmitOperation,
23
- ) => {
24
- return {
25
- current: createRunCodeFunction(submitOperation),
26
- };
27
- };
@@ -1,152 +0,0 @@
1
- import {
2
- assembleFullPrompt,
3
- prepareFilesForPrompt,
4
- } from 'editcodewithai';
5
- import { formatMarkdownFiles } from 'llm-code-format';
6
- import {
7
- createFilesSnapshot,
8
- generateFilesUnifiedDiff,
9
- } from '../../utils/fileDiff.js';
10
- import { formatFiles } from '../prettier.js';
11
- import { createSubmitOperation } from '../../submitOperation.js';
12
- import { VizContent } from '@vizhub/viz-types';
13
-
14
- // Dev flag for waiting 1 second before starting the LLM function.
15
- // Useful for debugging and testing purposes, e.g. checking the typing indicator.
16
- const delayStart = false;
17
-
18
- /**
19
- * Performs AI chat without editing - just generates a response
20
- */
21
- export const performAIChat = async ({
22
- prompt,
23
- shareDBDoc,
24
- llmFunction,
25
- }) => {
26
- const preparedFiles = prepareFilesForPrompt(
27
- shareDBDoc.data.files,
28
- );
29
- const filesContext = formatMarkdownFiles(preparedFiles);
30
-
31
- // 2. Assemble the final prompt for Q&A mode
32
- const fullPrompt = assembleFullPrompt({
33
- filesContext,
34
- prompt,
35
- editFormat: 'whole',
36
- });
37
-
38
- if (delayStart) {
39
- await new Promise((resolve) =>
40
- setTimeout(resolve, 1000),
41
- );
42
- }
43
-
44
- // Call the LLM function which will handle streaming but won't edit files
45
- const result = await llmFunction(fullPrompt);
46
-
47
- return {
48
- content: result.content,
49
- generationId: result.generationId,
50
- diffData: {}, // No file changes in ask mode
51
- };
52
- };
53
-
54
- /**
55
- * Performs AI editing operations using streaming with incremental OT operations
56
- */
57
- export const performAIEditing = async ({
58
- prompt,
59
- shareDBDoc,
60
- llmFunction,
61
- runCode,
62
- }) => {
63
- // 1. Capture the current state of files before editing
64
- const beforeFiles = createFilesSnapshot(
65
- shareDBDoc.data.files,
66
- );
67
-
68
- const preparedFiles = prepareFilesForPrompt(
69
- shareDBDoc.data.files,
70
- );
71
- const filesContext = formatMarkdownFiles(preparedFiles);
72
-
73
- // 2. Assemble the final prompt
74
- const fullPrompt = assembleFullPrompt({
75
- filesContext,
76
- prompt,
77
- editFormat: 'whole',
78
- });
79
-
80
- if (delayStart) {
81
- await new Promise((resolve) =>
82
- setTimeout(resolve, 1000),
83
- );
84
- }
85
-
86
- // Call the LLM function which will handle streaming and incremental file updates
87
- const result = await llmFunction(fullPrompt);
88
-
89
- // 3. Run Prettier on changed files before running code
90
- const afterLLMFiles = createFilesSnapshot(
91
- shareDBDoc.data.files,
92
- );
93
-
94
- // Find files that were changed by the AI
95
- const changedFileIds = Object.keys(afterLLMFiles).filter(
96
- (fileId) =>
97
- beforeFiles[fileId]?.text !==
98
- afterLLMFiles[fileId]?.text,
99
- );
100
-
101
- if (changedFileIds.length > 0) {
102
- // Format the changed files
103
- const formattedFiles = await formatFiles(
104
- shareDBDoc.data.files,
105
- changedFileIds,
106
- );
107
-
108
- // Apply formatted versions to shareDBDoc if formatting succeeded
109
- if (Object.keys(formattedFiles).length > 0) {
110
- const submitOperation =
111
- createSubmitOperation(shareDBDoc);
112
- submitOperation((document: VizContent) => {
113
- const updatedFiles = { ...document.files };
114
-
115
- // Apply each formatted file
116
- Object.entries(formattedFiles).forEach(
117
- ([fileId, formattedText]) => {
118
- if (updatedFiles[fileId]) {
119
- updatedFiles[fileId] = {
120
- ...updatedFiles[fileId],
121
- text: formattedText,
122
- };
123
- }
124
- },
125
- );
126
-
127
- return {
128
- ...document,
129
- files: updatedFiles,
130
- };
131
- });
132
- }
133
- }
134
-
135
- runCode();
136
-
137
- // 4. Capture the state of files after editing and formatting, then generate diff
138
- const afterFiles = createFilesSnapshot(
139
- shareDBDoc.data.files,
140
- );
141
- const diffData = generateFilesUnifiedDiff(
142
- beforeFiles,
143
- afterFiles,
144
- );
145
-
146
- return {
147
- content: result.content,
148
- generationId: result.generationId,
149
- diffData,
150
- beforeFiles, // Store the snapshot for undo functionality
151
- };
152
- };