skybridge 0.0.0-dev.fa642c4 → 0.0.0-dev.fb825da

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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/server/devtoolsStaticServer.d.ts +4 -0
  3. package/dist/src/server/devtoolsStaticServer.js +18 -13
  4. package/dist/src/server/devtoolsStaticServer.js.map +1 -1
  5. package/dist/src/server/index.d.ts +1 -1
  6. package/dist/src/server/server.d.ts +21 -9
  7. package/dist/src/server/server.js +51 -31
  8. package/dist/src/server/server.js.map +1 -1
  9. package/dist/src/server/templateHelper.d.ts +3 -0
  10. package/dist/src/server/templateHelper.js.map +1 -1
  11. package/dist/src/server/templates/development.hbs +2 -1
  12. package/dist/src/server/templates/production.hbs +1 -0
  13. package/dist/src/server/widgetsDevServer.js +0 -1
  14. package/dist/src/server/widgetsDevServer.js.map +1 -1
  15. package/dist/src/test/utils.d.ts +11 -0
  16. package/dist/src/test/utils.js +20 -0
  17. package/dist/src/test/utils.js.map +1 -1
  18. package/dist/src/test/widget.test.js +60 -9
  19. package/dist/src/test/widget.test.js.map +1 -1
  20. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.d.ts +13 -0
  21. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.js +33 -0
  22. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.js.map +1 -0
  23. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.d.ts +16 -0
  24. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.js +115 -0
  25. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.js.map +1 -0
  26. package/dist/src/web/bridges/apps-sdk-bridge.d.ts +10 -0
  27. package/dist/src/web/bridges/apps-sdk-bridge.js +46 -0
  28. package/dist/src/web/bridges/apps-sdk-bridge.js.map +1 -0
  29. package/dist/src/web/bridges/hooks/use-adaptor.d.ts +2 -0
  30. package/dist/src/web/bridges/hooks/use-adaptor.js +8 -0
  31. package/dist/src/web/bridges/hooks/use-adaptor.js.map +1 -0
  32. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.d.ts +2 -0
  33. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js +7 -0
  34. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js.map +1 -0
  35. package/dist/src/web/bridges/hooks/use-bridge.d.ts +2 -0
  36. package/dist/src/web/bridges/hooks/use-bridge.js +8 -0
  37. package/dist/src/web/bridges/hooks/use-bridge.js.map +1 -0
  38. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.d.ts +5 -0
  39. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js +7 -0
  40. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js.map +1 -0
  41. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js +41 -0
  42. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js.map +1 -0
  43. package/dist/src/web/bridges/index.d.ts +4 -0
  44. package/dist/src/web/bridges/index.js +5 -0
  45. package/dist/src/web/bridges/index.js.map +1 -0
  46. package/dist/src/web/bridges/mcp-app-bridge.d.ts +38 -0
  47. package/dist/src/web/bridges/mcp-app-bridge.js +162 -0
  48. package/dist/src/web/bridges/mcp-app-bridge.js.map +1 -0
  49. package/dist/src/web/bridges/types.d.ts +57 -0
  50. package/dist/src/web/bridges/types.js +2 -0
  51. package/dist/src/web/bridges/types.js.map +1 -0
  52. package/dist/src/web/data-llm.js +4 -2
  53. package/dist/src/web/data-llm.js.map +1 -1
  54. package/dist/src/web/generate-helpers.test-d.js +31 -2
  55. package/dist/src/web/generate-helpers.test-d.js.map +1 -1
  56. package/dist/src/web/hooks/index.d.ts +2 -3
  57. package/dist/src/web/hooks/index.js +2 -3
  58. package/dist/src/web/hooks/index.js.map +1 -1
  59. package/dist/src/web/hooks/test/utils.d.ts +10 -0
  60. package/dist/src/web/hooks/test/utils.js +40 -0
  61. package/dist/src/web/hooks/test/utils.js.map +1 -0
  62. package/dist/src/web/hooks/use-call-tool.js +12 -4
  63. package/dist/src/web/hooks/use-call-tool.js.map +1 -1
  64. package/dist/src/web/hooks/use-call-tool.test.js +26 -0
  65. package/dist/src/web/hooks/use-call-tool.test.js.map +1 -1
  66. package/dist/src/web/hooks/use-display-mode.d.ts +1 -1
  67. package/dist/src/web/hooks/use-display-mode.js +6 -3
  68. package/dist/src/web/hooks/use-display-mode.js.map +1 -1
  69. package/dist/src/web/hooks/use-display-mode.test.js +1 -0
  70. package/dist/src/web/hooks/use-display-mode.test.js.map +1 -1
  71. package/dist/src/web/hooks/use-layout.d.ts +22 -0
  72. package/dist/src/web/hooks/use-layout.js +23 -0
  73. package/dist/src/web/hooks/use-layout.js.map +1 -0
  74. package/dist/src/web/hooks/use-layout.test.js +95 -0
  75. package/dist/src/web/hooks/use-layout.test.js.map +1 -0
  76. package/dist/src/web/hooks/use-open-external.js +5 -3
  77. package/dist/src/web/hooks/use-open-external.js.map +1 -1
  78. package/dist/src/web/hooks/use-open-external.test.js +41 -15
  79. package/dist/src/web/hooks/use-open-external.test.js.map +1 -1
  80. package/dist/src/web/hooks/use-openai-global.d.ts +2 -1
  81. package/dist/src/web/hooks/use-openai-global.js +3 -22
  82. package/dist/src/web/hooks/use-openai-global.js.map +1 -1
  83. package/dist/src/web/hooks/use-request-modal.d.ts +6 -3
  84. package/dist/src/web/hooks/use-request-modal.js +6 -1
  85. package/dist/src/web/hooks/use-request-modal.js.map +1 -1
  86. package/dist/src/web/hooks/use-request-modal.test.js +35 -2
  87. package/dist/src/web/hooks/use-request-modal.test.js.map +1 -1
  88. package/dist/src/web/hooks/use-send-follow-up-message.js +3 -6
  89. package/dist/src/web/hooks/use-send-follow-up-message.js.map +1 -1
  90. package/dist/src/web/hooks/use-tool-info.d.ts +12 -1
  91. package/dist/src/web/hooks/use-tool-info.js +15 -9
  92. package/dist/src/web/hooks/use-tool-info.js.map +1 -1
  93. package/dist/src/web/hooks/use-tool-info.test-d.js +40 -4
  94. package/dist/src/web/hooks/use-tool-info.test-d.js.map +1 -1
  95. package/dist/src/web/hooks/use-tool-info.test.js +117 -46
  96. package/dist/src/web/hooks/use-tool-info.test.js.map +1 -1
  97. package/dist/src/web/hooks/use-user.d.ts +18 -0
  98. package/dist/src/web/hooks/use-user.js +19 -0
  99. package/dist/src/web/hooks/use-user.js.map +1 -0
  100. package/dist/src/web/hooks/use-user.test.js +93 -0
  101. package/dist/src/web/hooks/use-user.test.js.map +1 -0
  102. package/dist/src/web/hooks/use-widget-state.js +2 -2
  103. package/dist/src/web/hooks/use-widget-state.js.map +1 -1
  104. package/dist/src/web/hooks/use-widget-state.test.js +1 -0
  105. package/dist/src/web/hooks/use-widget-state.test.js.map +1 -1
  106. package/dist/src/web/index.d.ts +1 -0
  107. package/dist/src/web/index.js +1 -0
  108. package/dist/src/web/index.js.map +1 -1
  109. package/dist/src/web/plugin/plugin.js +10 -4
  110. package/dist/src/web/plugin/plugin.js.map +1 -1
  111. package/dist/src/web/plugin/transform-data-llm.js +6 -3
  112. package/dist/src/web/plugin/transform-data-llm.js.map +1 -1
  113. package/dist/src/web/proxy.js +5 -0
  114. package/dist/src/web/proxy.js.map +1 -1
  115. package/dist/src/web/types.d.ts +24 -8
  116. package/dist/src/web/types.js.map +1 -1
  117. package/package.json +30 -26
  118. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  119. package/dist/src/web/hooks/use-locale.js +0 -5
  120. package/dist/src/web/hooks/use-locale.js.map +0 -1
  121. package/dist/src/web/hooks/use-locale.test.js +0 -21
  122. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  123. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  124. package/dist/src/web/hooks/use-theme.js +0 -5
  125. package/dist/src/web/hooks/use-theme.js.map +0 -1
  126. package/dist/src/web/hooks/use-theme.test.js +0 -26
  127. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  128. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  129. package/dist/src/web/hooks/use-user-agent.js +0 -5
  130. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  131. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  132. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  133. /package/dist/src/web/{hooks/use-locale.test.d.ts → bridges/hooks/use-mcp-app-bridge.test.d.ts} +0 -0
  134. /package/dist/src/web/hooks/{use-theme.test.d.ts → use-layout.test.d.ts} +0 -0
  135. /package/dist/src/web/hooks/{use-user-agent.test.d.ts → use-user.test.d.ts} +0 -0
package/package.json CHANGED
@@ -1,7 +1,11 @@
1
1
  {
2
2
  "name": "skybridge",
3
- "version": "0.0.0-dev.fa642c4",
3
+ "version": "0.0.0-dev.fb825da",
4
4
  "description": "Skybridge is a framework for building ChatGPT apps",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/alpic-ai/skybridge.git"
8
+ },
5
9
  "type": "module",
6
10
  "files": [
7
11
  "dist"
@@ -16,15 +20,6 @@
16
20
  "default": "./dist/src/web/index.js"
17
21
  }
18
22
  },
19
- "scripts": {
20
- "build": "tsc && pnpm run build:templates",
21
- "build:templates": "cp -r src/server/templates dist/src/server/",
22
- "format": "biome check --write --error-on-warnings",
23
- "test": "pnpm run test:unit && pnpm run test:type && pnpm run test:format",
24
- "test:unit": "vitest run",
25
- "test:type": "tsc --noEmit",
26
- "test:format": "biome ci"
27
- },
28
23
  "keywords": [
29
24
  "chatgpt",
30
25
  "app",
@@ -41,30 +36,39 @@
41
36
  "dependencies": {
42
37
  "@babel/core": "^7.28.5",
43
38
  "cors": "^2.8.5",
44
- "express": "^5.1.0",
39
+ "dequal": "^2.0.3",
40
+ "express": "^5.2.1",
45
41
  "handlebars": "^4.7.8",
46
42
  "superjson": "^2.2.6",
47
- "vite": "^7.1.11",
43
+ "vite": "^7.3.0",
48
44
  "zustand": "^5.0.9"
49
45
  },
50
46
  "devDependencies": {
51
- "@biomejs/biome": "2.3.8",
52
- "@modelcontextprotocol/sdk": "^1.24.3",
47
+ "@modelcontextprotocol/ext-apps": "^0.2.2",
48
+ "@modelcontextprotocol/sdk": "^1.25.1",
53
49
  "@testing-library/dom": "^10.4.1",
54
- "@testing-library/react": "^16.3.0",
50
+ "@testing-library/react": "^16.3.1",
55
51
  "@total-typescript/tsconfig": "^1.0.4",
56
52
  "@types/babel__core": "^7.20.5",
57
53
  "@types/cors": "^2.8.19",
58
- "@types/express": "^5.0.3",
59
- "@types/jsdom": "^21.1.6",
60
- "@types/node": "^22.15.30",
61
- "@types/react": "^19.2.2",
62
- "@types/react-dom": "^19.2.2",
63
- "@vitest/ui": "^2.1.8",
64
- "jsdom": "^25.0.1",
54
+ "@types/express": "^5.0.6",
55
+ "@types/jsdom": "^27.0.0",
56
+ "@types/node": "^22.19.3",
57
+ "@types/react": "^19.2.7",
58
+ "@types/react-dom": "^19.2.3",
59
+ "@vitest/ui": "^2.1.9",
60
+ "jsdom": "^27.4.0",
65
61
  "typescript": "^5.9.3",
66
- "vitest": "^2.1.8",
67
- "zod": "^4.1.13"
62
+ "vitest": "^2.1.9",
63
+ "zod": "^4.3.5"
68
64
  },
69
- "packageManager": "pnpm@10.17.1"
70
- }
65
+ "scripts": {
66
+ "build": "tsc && pnpm run build:templates",
67
+ "build:templates": "cp -r src/server/templates dist/src/server/",
68
+ "format": "biome check --write --error-on-warnings",
69
+ "test": "pnpm run test:unit && pnpm run test:type && pnpm run test:format",
70
+ "test:unit": "vitest run",
71
+ "test:type": "tsc --noEmit",
72
+ "test:format": "biome ci"
73
+ }
74
+ }
@@ -1 +0,0 @@
1
- export declare function useLocale(): string;
@@ -1,5 +0,0 @@
1
- import { useOpenAiGlobal } from "./use-openai-global.js";
2
- export function useLocale() {
3
- return useOpenAiGlobal("locale");
4
- }
5
- //# sourceMappingURL=use-locale.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-locale.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-locale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,SAAS;IACvB,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
@@ -1,21 +0,0 @@
1
- import { renderHook } from "@testing-library/react";
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import { useLocale } from "./use-locale.js";
4
- describe("useLocale", () => {
5
- let OpenaiMock;
6
- beforeEach(() => {
7
- OpenaiMock = {
8
- locale: "en-US",
9
- };
10
- vi.stubGlobal("openai", OpenaiMock);
11
- });
12
- afterEach(() => {
13
- vi.unstubAllGlobals();
14
- vi.resetAllMocks();
15
- });
16
- it("should return the current locale from window.openai.locale", () => {
17
- const { result } = renderHook(() => useLocale());
18
- expect(result.current).toBe("en-US");
19
- });
20
- });
21
- //# sourceMappingURL=use-locale.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-locale.test.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-locale.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,UAEH,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG;YACX,MAAM,EAAE,OAAO;SAChB,CAAC;QACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export declare function useTheme(): import("../types.js").Theme;
@@ -1,5 +0,0 @@
1
- import { useOpenAiGlobal } from "./use-openai-global.js";
2
- export function useTheme() {
3
- return useOpenAiGlobal("theme");
4
- }
5
- //# sourceMappingURL=use-theme.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-theme.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,QAAQ;IACtB,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC"}
@@ -1,26 +0,0 @@
1
- import { renderHook } from "@testing-library/react";
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import { useTheme } from "./use-theme.js";
4
- describe("useTheme", () => {
5
- let OpenaiMock;
6
- beforeEach(() => {
7
- OpenaiMock = {
8
- theme: "light",
9
- };
10
- vi.stubGlobal("openai", OpenaiMock);
11
- });
12
- afterEach(() => {
13
- vi.unstubAllGlobals();
14
- vi.resetAllMocks();
15
- });
16
- it("should return the current theme from window.openai.theme", () => {
17
- const { result } = renderHook(() => useTheme());
18
- expect(result.current).toBe("light");
19
- });
20
- it("should return dark theme when set to dark", () => {
21
- OpenaiMock.theme = "dark";
22
- const { result } = renderHook(() => useTheme());
23
- expect(result.current).toBe("dark");
24
- });
25
- });
26
- //# sourceMappingURL=use-theme.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-theme.test.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-theme.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,UAEH,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG;YACX,KAAK,EAAE,OAAO;SACf,CAAC;QACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC;QAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export declare function useUserAgent(): import("../types.js").UserAgent;
@@ -1,5 +0,0 @@
1
- import { useOpenAiGlobal } from "./use-openai-global.js";
2
- export function useUserAgent() {
3
- return useOpenAiGlobal("userAgent");
4
- }
5
- //# sourceMappingURL=use-user-agent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-user-agent.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-user-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,YAAY;IAC1B,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC"}
@@ -1,31 +0,0 @@
1
- import { renderHook } from "@testing-library/react";
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import { useUserAgent } from "./use-user-agent.js";
4
- describe("useUserAgent", () => {
5
- let OpenaiMock;
6
- beforeEach(() => {
7
- OpenaiMock = {
8
- userAgent: {
9
- device: { type: "mobile" },
10
- capabilities: { hover: false, touch: true },
11
- },
12
- };
13
- vi.stubGlobal("openai", OpenaiMock);
14
- });
15
- afterEach(() => {
16
- vi.unstubAllGlobals();
17
- vi.resetAllMocks();
18
- });
19
- it("should return the current user agent from window.openai.userAgent", () => {
20
- OpenaiMock.userAgent = {
21
- device: { type: "mobile" },
22
- capabilities: { hover: false, touch: true },
23
- };
24
- const { result } = renderHook(() => useUserAgent());
25
- expect(result.current).toEqual({
26
- device: { type: "mobile" },
27
- capabilities: { hover: false, touch: true },
28
- });
29
- });
30
- });
31
- //# sourceMappingURL=use-user-agent.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-user-agent.test.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-user-agent.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,UAEH,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG;YACX,SAAS,EAAE;gBACT,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;aAC5C;SACF,CAAC;QACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,UAAU,CAAC,SAAS,GAAG;YACrB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;SAC5C,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;QAEpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}