skybridge 0.0.0-dev.8b34636 → 0.0.0-dev.8b906d4
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.
- package/dist/cli/header.d.ts +4 -0
- package/dist/cli/header.js +6 -0
- package/dist/cli/header.js.map +1 -0
- package/dist/cli/run-command.d.ts +2 -0
- package/dist/cli/run-command.js +43 -0
- package/dist/cli/run-command.js.map +1 -0
- package/dist/cli/use-execute-steps.d.ts +10 -0
- package/dist/cli/use-execute-steps.js +31 -0
- package/dist/cli/use-execute-steps.js.map +1 -0
- package/dist/commands/build.d.ts +9 -0
- package/dist/commands/build.js +44 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.js +8 -18
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/start.d.ts +7 -0
- package/dist/commands/start.js +33 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/server/server.d.ts +0 -4
- package/dist/server/server.js +1 -0
- package/dist/server/server.js.map +1 -1
- package/dist/web/bridges/adaptors/apps-sdk-adaptor.d.ts +2 -1
- package/dist/web/bridges/adaptors/apps-sdk-adaptor.js +6 -0
- package/dist/web/bridges/adaptors/apps-sdk-adaptor.js.map +1 -1
- package/dist/web/bridges/adaptors/mcp-app-adaptor.d.ts +4 -1
- package/dist/web/bridges/adaptors/mcp-app-adaptor.js +25 -0
- package/dist/web/bridges/adaptors/mcp-app-adaptor.js.map +1 -1
- package/dist/web/bridges/hooks/get-adaptor.d.ts +2 -0
- package/dist/web/bridges/hooks/{use-adaptor.js → get-adaptor.js} +2 -2
- package/dist/web/bridges/hooks/{use-adaptor.js.map → get-adaptor.js.map} +1 -1
- package/dist/web/bridges/hooks/use-bridge.js +2 -2
- package/dist/web/bridges/hooks/use-mcp-app-bridge.test.js +1 -6
- package/dist/web/bridges/hooks/use-mcp-app-bridge.test.js.map +1 -1
- package/dist/web/bridges/index.d.ts +1 -1
- package/dist/web/bridges/index.js +1 -1
- package/dist/web/bridges/mcp-app-bridge.js +1 -1
- package/dist/web/bridges/mcp-app-bridge.js.map +1 -1
- package/dist/web/bridges/types.d.ts +4 -0
- package/dist/web/create-store.js +6 -7
- package/dist/web/create-store.js.map +1 -1
- package/dist/web/create-store.test.js +105 -52
- package/dist/web/create-store.test.js.map +1 -1
- package/dist/web/data-llm.js +5 -3
- package/dist/web/data-llm.js.map +1 -1
- package/dist/web/data-llm.test.js +129 -65
- package/dist/web/data-llm.test.js.map +1 -1
- package/dist/web/helpers/state.js +13 -8
- package/dist/web/helpers/state.js.map +1 -1
- package/dist/web/hooks/test/utils.d.ts +8 -2
- package/dist/web/hooks/test/utils.js +33 -13
- package/dist/web/hooks/test/utils.js.map +1 -1
- package/dist/web/hooks/use-call-tool.js +2 -2
- package/dist/web/hooks/use-display-mode.js +2 -2
- package/dist/web/hooks/use-open-external.js +2 -2
- package/dist/web/hooks/use-send-follow-up-message.js +2 -2
- package/dist/web/hooks/use-widget-state.js +10 -10
- package/dist/web/hooks/use-widget-state.js.map +1 -1
- package/package.json +8 -8
- package/dist/cli/use-version.d.ts +0 -1
- package/dist/cli/use-version.js +0 -33
- package/dist/cli/use-version.js.map +0 -1
- package/dist/web/bridges/hooks/use-adaptor.d.ts +0 -2
|
@@ -1,21 +1,41 @@
|
|
|
1
1
|
import { fireEvent } from "@testing-library/react";
|
|
2
2
|
import { act } from "react";
|
|
3
3
|
import { vi } from "vitest";
|
|
4
|
+
export class MockResizeObserver {
|
|
5
|
+
observe() { }
|
|
6
|
+
unobserve() { }
|
|
7
|
+
disconnect() { }
|
|
8
|
+
}
|
|
4
9
|
const DEFAULT_CONTEXT = {};
|
|
5
10
|
export const getMcpAppHostPostMessageMock = (initialContext = DEFAULT_CONTEXT) => vi.fn((message) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
switch (message.method) {
|
|
12
|
+
case "ui/initialize": {
|
|
13
|
+
const result = {
|
|
14
|
+
protocolVersion: "2025-06-18",
|
|
15
|
+
hostInfo: { name: "test-host", version: "1.0.0" },
|
|
16
|
+
hostCapabilities: {},
|
|
17
|
+
hostContext: initialContext,
|
|
18
|
+
};
|
|
19
|
+
act(() => fireEvent(window, new MessageEvent("message", {
|
|
20
|
+
data: {
|
|
21
|
+
jsonrpc: "2.0",
|
|
22
|
+
id: message.id,
|
|
23
|
+
result,
|
|
24
|
+
},
|
|
25
|
+
})));
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
case "ui/update-model-context": {
|
|
29
|
+
act(() => fireEvent(window, new MessageEvent("message", {
|
|
30
|
+
data: {
|
|
31
|
+
jsonrpc: "2.0",
|
|
32
|
+
id: message.id,
|
|
33
|
+
result: {},
|
|
34
|
+
},
|
|
35
|
+
})));
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
19
39
|
});
|
|
20
40
|
export const fireToolInputNotification = (args) => {
|
|
21
41
|
fireEvent(window, new MessageEvent("message", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/web/hooks/test/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/web/hooks/test/utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,MAAM,OAAO,kBAAkB;IAC7B,OAAO,KAAU,CAAC;IAClB,SAAS,KAAU,CAAC;IACpB,UAAU,KAAU,CAAC;CACtB;AAED,MAAM,eAAe,GAAqB,EAAE,CAAC;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,iBAAmC,eAAe,EAClD,EAAE,CACF,EAAE,CAAC,EAAE,CAAC,CAAC,OAAuC,EAAE,EAAE;IAChD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,MAAM,GAA0B;gBACpC,eAAe,EAAE,YAAY;gBAC7B,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;gBACjD,gBAAgB,EAAE,EAAE;gBACpB,WAAW,EAAE,cAAc;aAC5B,CAAC;YACF,GAAG,CAAC,GAAG,EAAE,CACP,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CAIb,SAAS,EAAE;gBACZ,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM;iBACP;aACF,CAAC,CACH,CACF,CAAC;YACF,MAAM;QACR,CAAC;QACD,KAAK,yBAAyB,CAAC,CAAC,CAAC;YAC/B,GAAG,CAAC,GAAG,EAAE,CACP,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;gBACE,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM,EAAE,EAAE;iBACX;aACF,CACF,CACF,CACF,CAAC;YACF,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAA6B,EAAE,EAAE;IACzE,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;QACE,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,6BAA6B;YACrC,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI;aAChB;SACF;KACF,CACF,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAI1C,EAAE,EAAE;IACH,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;QACE,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,8BAA8B;YACtC,MAAM;SACP;KACF,CACF,CACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useRef, useState } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { getAdaptor } from "../bridges/hooks/get-adaptor.js";
|
|
3
3
|
export const useCallTool = (name) => {
|
|
4
4
|
const [{ status, data, error }, setCallToolState] = useState({ status: "idle", data: undefined, error: undefined });
|
|
5
5
|
const callIdRef = useRef(0);
|
|
6
|
-
const adaptor =
|
|
6
|
+
const adaptor = getAdaptor();
|
|
7
7
|
const execute = async (toolArgs) => {
|
|
8
8
|
const callId = ++callIdRef.current;
|
|
9
9
|
setCallToolState({ status: "pending", data: undefined, error: undefined });
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { getAdaptor } from "../bridges/hooks/get-adaptor.js";
|
|
3
3
|
import { useBridge } from "../bridges/index.js";
|
|
4
4
|
export function useDisplayMode() {
|
|
5
5
|
const displayMode = useBridge("displayMode");
|
|
6
|
-
const adaptor =
|
|
6
|
+
const adaptor = getAdaptor();
|
|
7
7
|
const setDisplayMode = useCallback((mode) => adaptor.requestDisplayMode(mode), [adaptor]);
|
|
8
8
|
return [displayMode, setDisplayMode];
|
|
9
9
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { getAdaptor } from "../bridges/index.js";
|
|
3
3
|
export function useOpenExternal() {
|
|
4
|
-
const adaptor =
|
|
4
|
+
const adaptor = getAdaptor();
|
|
5
5
|
const openExternal = useCallback((href) => adaptor.openExternal(href), [adaptor]);
|
|
6
6
|
return openExternal;
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { getAdaptor } from "../bridges/index.js";
|
|
3
3
|
export function useSendFollowUpMessage() {
|
|
4
|
-
const adaptor =
|
|
4
|
+
const adaptor = getAdaptor();
|
|
5
5
|
const sendFollowUpMessage = useCallback((prompt) => adaptor.sendFollowUpMessage(prompt), [adaptor]);
|
|
6
6
|
return sendFollowUpMessage;
|
|
7
7
|
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { getAdaptor, useBridge } from "../bridges/index.js";
|
|
3
3
|
import { filterWidgetContext, injectWidgetContext } from "../helpers/state.js";
|
|
4
4
|
export function useWidgetState(defaultState) {
|
|
5
|
-
const
|
|
5
|
+
const adaptor = getAdaptor();
|
|
6
|
+
const widgetStateFromBridge = useBridge("widgetState");
|
|
6
7
|
const [widgetState, _setWidgetState] = useState(() => {
|
|
7
|
-
if (
|
|
8
|
-
return filterWidgetContext(
|
|
8
|
+
if (widgetStateFromBridge !== null) {
|
|
9
|
+
return filterWidgetContext(widgetStateFromBridge);
|
|
9
10
|
}
|
|
10
11
|
return typeof defaultState === "function"
|
|
11
12
|
? defaultState()
|
|
12
13
|
: (defaultState ?? null);
|
|
13
14
|
});
|
|
14
15
|
useEffect(() => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
_setWidgetState(filterWidgetContext(widgetStateFromWindow));
|
|
16
|
+
if (widgetStateFromBridge !== null) {
|
|
17
|
+
_setWidgetState(filterWidgetContext(widgetStateFromBridge));
|
|
18
18
|
}
|
|
19
|
-
}, [
|
|
19
|
+
}, [widgetStateFromBridge]);
|
|
20
20
|
const setWidgetState = useCallback((state) => {
|
|
21
21
|
_setWidgetState((prevState) => {
|
|
22
22
|
const newState = typeof state === "function" ? state(prevState) : state;
|
|
23
23
|
const stateToSet = injectWidgetContext(newState);
|
|
24
24
|
if (stateToSet !== null) {
|
|
25
|
-
|
|
25
|
+
adaptor.setWidgetState(stateToSet);
|
|
26
26
|
}
|
|
27
27
|
return filterWidgetContext(stateToSet);
|
|
28
28
|
});
|
|
29
|
-
}, []);
|
|
29
|
+
}, [adaptor]);
|
|
30
30
|
return [widgetState, setWidgetState];
|
|
31
31
|
}
|
|
32
32
|
//# sourceMappingURL=use-widget-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-widget-state.js","sourceRoot":"","sources":["../../../src/web/hooks/use-widget-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use-widget-state.js","sourceRoot":"","sources":["../../../src/web/hooks/use-widget-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAS/E,MAAM,UAAU,cAAc,CAC5B,YAA0C;IAE1C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,qBAAqB,GAAG,SAAS,CAAC,aAAa,CAAa,CAAC;IAEnE,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE;QAC7D,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACnC,OAAO,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,OAAO,YAAY,KAAK,UAAU;YACvC,CAAC,CAAC,YAAY,EAAE;YAChB,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACnC,eAAe,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAE5B,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,KAA+B,EAAE,EAAE;QAClC,eAAe,CAAC,CAAC,SAAS,EAAE,EAAE;YAC5B,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACxE,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAEjD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACrC,CAAC;YAED,OAAO,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,CAAC,WAAW,EAAE,cAAc,CAAU,CAAC;AAChD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skybridge",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
3
|
+
"version": "0.0.0-dev.8b906d4",
|
|
4
4
|
"description": "Skybridge is a framework for building ChatGPT apps",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"ink": "^6.6.0",
|
|
45
45
|
"superjson": "^2.2.6",
|
|
46
46
|
"vite": "^7.3.1",
|
|
47
|
-
"zustand": "^5.0.
|
|
47
|
+
"zustand": "^5.0.9"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@modelcontextprotocol/ext-apps": "^0.
|
|
50
|
+
"@modelcontextprotocol/ext-apps": "^0.4.0",
|
|
51
51
|
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
52
52
|
"@testing-library/dom": "^10.4.1",
|
|
53
53
|
"@testing-library/react": "^16.3.1",
|
|
@@ -56,15 +56,15 @@
|
|
|
56
56
|
"@types/cors": "^2.8.19",
|
|
57
57
|
"@types/express": "^5.0.6",
|
|
58
58
|
"@types/jsdom": "^27.0.0",
|
|
59
|
-
"@types/node": "^24.10.
|
|
60
|
-
"@types/react": "^19.2.
|
|
59
|
+
"@types/node": "^24.10.4",
|
|
60
|
+
"@types/react": "^19.2.7",
|
|
61
61
|
"@types/react-dom": "^19.2.3",
|
|
62
|
-
"@vitest/ui": "^4.0.
|
|
62
|
+
"@vitest/ui": "^4.0.16",
|
|
63
63
|
"jsdom": "^27.4.0",
|
|
64
|
-
"shx": "^0.4
|
|
64
|
+
"shx": "^0.3.4",
|
|
65
65
|
"ts-node": "^10.9.2",
|
|
66
66
|
"typescript": "^5.9.3",
|
|
67
|
-
"vitest": "^4.0.
|
|
67
|
+
"vitest": "^4.0.16",
|
|
68
68
|
"zod": "^4.3.5"
|
|
69
69
|
},
|
|
70
70
|
"bin": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const useVersion: () => string | undefined;
|
package/dist/cli/use-version.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { useEffect, useState } from "react";
|
|
5
|
-
function findPackageJson(startDir) {
|
|
6
|
-
let currentDir = startDir;
|
|
7
|
-
const root = path.parse(currentDir).root;
|
|
8
|
-
while (currentDir !== root) {
|
|
9
|
-
const packageJsonPath = path.join(currentDir, "package.json");
|
|
10
|
-
if (existsSync(packageJsonPath)) {
|
|
11
|
-
return packageJsonPath;
|
|
12
|
-
}
|
|
13
|
-
currentDir = path.dirname(currentDir);
|
|
14
|
-
}
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
function getPackageVersion() {
|
|
18
|
-
const currentFileDir = path.dirname(fileURLToPath(import.meta.url));
|
|
19
|
-
const packageJsonPath = findPackageJson(currentFileDir);
|
|
20
|
-
if (!packageJsonPath) {
|
|
21
|
-
return "";
|
|
22
|
-
}
|
|
23
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
24
|
-
return packageJson.version || "";
|
|
25
|
-
}
|
|
26
|
-
export const useVersion = () => {
|
|
27
|
-
const [version, setVersion] = useState();
|
|
28
|
-
useEffect(() => {
|
|
29
|
-
setVersion(getPackageVersion());
|
|
30
|
-
}, []);
|
|
31
|
-
return version;
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=use-version.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-version.js","sourceRoot":"","sources":["../../src/cli/use-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,UAAU,GAAG,QAAQ,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IAEzC,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,eAAe,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAExD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,OAAO,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAU,CAAC;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAClC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|