@modelcontextprotocol/sdk 1.9.0 → 1.10.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.
- package/README.md +284 -28
- package/dist/cjs/client/index.d.ts.map +1 -1
- package/dist/cjs/client/index.js +5 -0
- package/dist/cjs/client/index.js.map +1 -1
- package/dist/cjs/client/streamableHttp.d.ts +124 -0
- package/dist/cjs/client/streamableHttp.d.ts.map +1 -0
- package/dist/cjs/client/streamableHttp.js +353 -0
- package/dist/cjs/client/streamableHttp.js.map +1 -0
- package/dist/cjs/examples/client/simpleStreamableHttp.d.ts +2 -0
- package/dist/cjs/examples/client/simpleStreamableHttp.d.ts.map +1 -0
- package/dist/cjs/examples/client/simpleStreamableHttp.js +448 -0
- package/dist/cjs/examples/client/simpleStreamableHttp.js.map +1 -0
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.d.ts +2 -0
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.d.ts.map +1 -0
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.js +168 -0
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.js.map +1 -0
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.d.ts +2 -0
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.d.ts.map +1 -0
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.js +139 -0
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.js.map +1 -0
- package/dist/cjs/examples/server/simpleSseServer.d.ts +2 -0
- package/dist/cjs/examples/server/simpleSseServer.d.ts.map +1 -0
- package/dist/cjs/examples/server/simpleSseServer.js +148 -0
- package/dist/cjs/examples/server/simpleSseServer.js.map +1 -0
- package/dist/cjs/examples/server/simpleStreamableHttp.d.ts +2 -0
- package/dist/cjs/examples/server/simpleStreamableHttp.d.ts.map +1 -0
- package/dist/cjs/examples/server/simpleStreamableHttp.js +250 -0
- package/dist/cjs/examples/server/simpleStreamableHttp.js.map +1 -0
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.d.ts +2 -0
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.d.ts.map +1 -0
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.js +229 -0
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.js.map +1 -0
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.d.ts +2 -0
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.d.ts.map +1 -0
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.js +112 -0
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.js.map +1 -0
- package/dist/cjs/examples/shared/inMemoryEventStore.d.ts +31 -0
- package/dist/cjs/examples/shared/inMemoryEventStore.d.ts.map +1 -0
- package/dist/cjs/examples/shared/inMemoryEventStore.js +69 -0
- package/dist/cjs/examples/shared/inMemoryEventStore.js.map +1 -0
- package/dist/cjs/inMemory.d.ts +13 -3
- package/dist/cjs/inMemory.d.ts.map +1 -1
- package/dist/cjs/inMemory.js +9 -7
- package/dist/cjs/inMemory.js.map +1 -1
- package/dist/cjs/server/auth/types.d.ts +5 -0
- package/dist/cjs/server/auth/types.d.ts.map +1 -1
- package/dist/cjs/server/mcp.d.ts +100 -19
- package/dist/cjs/server/mcp.d.ts.map +1 -1
- package/dist/cjs/server/mcp.js +154 -12
- package/dist/cjs/server/mcp.js.map +1 -1
- package/dist/cjs/server/sse.d.ts +10 -3
- package/dist/cjs/server/sse.d.ts.map +1 -1
- package/dist/cjs/server/sse.js +13 -4
- package/dist/cjs/server/sse.js.map +1 -1
- package/dist/cjs/server/streamableHttp.d.ts +146 -0
- package/dist/cjs/server/streamableHttp.d.ts.map +1 -0
- package/dist/cjs/server/streamableHttp.js +538 -0
- package/dist/cjs/server/streamableHttp.js.map +1 -0
- package/dist/cjs/shared/protocol.d.ts +31 -5
- package/dist/cjs/shared/protocol.d.ts.map +1 -1
- package/dist/cjs/shared/protocol.js +23 -15
- package/dist/cjs/shared/protocol.js.map +1 -1
- package/dist/cjs/shared/transport.d.ts +32 -3
- package/dist/cjs/shared/transport.d.ts.map +1 -1
- package/dist/cjs/types.d.ts +6 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/types.js +14 -2
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +5 -0
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/client/streamableHttp.d.ts +124 -0
- package/dist/esm/client/streamableHttp.d.ts.map +1 -0
- package/dist/esm/client/streamableHttp.js +348 -0
- package/dist/esm/client/streamableHttp.js.map +1 -0
- package/dist/esm/examples/client/simpleStreamableHttp.d.ts +2 -0
- package/dist/esm/examples/client/simpleStreamableHttp.d.ts.map +1 -0
- package/dist/esm/examples/client/simpleStreamableHttp.js +446 -0
- package/dist/esm/examples/client/simpleStreamableHttp.js.map +1 -0
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.d.ts +2 -0
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.d.ts.map +1 -0
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.js +166 -0
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.js.map +1 -0
- package/dist/esm/examples/server/jsonResponseStreamableHttp.d.ts +2 -0
- package/dist/esm/examples/server/jsonResponseStreamableHttp.d.ts.map +1 -0
- package/dist/esm/examples/server/jsonResponseStreamableHttp.js +134 -0
- package/dist/esm/examples/server/jsonResponseStreamableHttp.js.map +1 -0
- package/dist/esm/examples/server/simpleSseServer.d.ts +2 -0
- package/dist/esm/examples/server/simpleSseServer.d.ts.map +1 -0
- package/dist/esm/examples/server/simpleSseServer.js +143 -0
- package/dist/esm/examples/server/simpleSseServer.js.map +1 -0
- package/dist/esm/examples/server/simpleStreamableHttp.d.ts +2 -0
- package/dist/esm/examples/server/simpleStreamableHttp.d.ts.map +1 -0
- package/dist/esm/examples/server/simpleStreamableHttp.js +245 -0
- package/dist/esm/examples/server/simpleStreamableHttp.js.map +1 -0
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.d.ts +2 -0
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.d.ts.map +1 -0
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.js +224 -0
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.js.map +1 -0
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.d.ts +2 -0
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.d.ts.map +1 -0
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.js +107 -0
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.js.map +1 -0
- package/dist/esm/examples/shared/inMemoryEventStore.d.ts +31 -0
- package/dist/esm/examples/shared/inMemoryEventStore.d.ts.map +1 -0
- package/dist/esm/examples/shared/inMemoryEventStore.js +65 -0
- package/dist/esm/examples/shared/inMemoryEventStore.js.map +1 -0
- package/dist/esm/inMemory.d.ts +13 -3
- package/dist/esm/inMemory.d.ts.map +1 -1
- package/dist/esm/inMemory.js +9 -7
- package/dist/esm/inMemory.js.map +1 -1
- package/dist/esm/server/auth/types.d.ts +5 -0
- package/dist/esm/server/auth/types.d.ts.map +1 -1
- package/dist/esm/server/mcp.d.ts +100 -19
- package/dist/esm/server/mcp.d.ts.map +1 -1
- package/dist/esm/server/mcp.js +154 -12
- package/dist/esm/server/mcp.js.map +1 -1
- package/dist/esm/server/sse.d.ts +10 -3
- package/dist/esm/server/sse.d.ts.map +1 -1
- package/dist/esm/server/sse.js +13 -4
- package/dist/esm/server/sse.js.map +1 -1
- package/dist/esm/server/streamableHttp.d.ts +146 -0
- package/dist/esm/server/streamableHttp.d.ts.map +1 -0
- package/dist/esm/server/streamableHttp.js +531 -0
- package/dist/esm/server/streamableHttp.js.map +1 -0
- package/dist/esm/shared/protocol.d.ts +31 -5
- package/dist/esm/shared/protocol.d.ts.map +1 -1
- package/dist/esm/shared/protocol.js +24 -16
- package/dist/esm/shared/protocol.js.map +1 -1
- package/dist/esm/shared/transport.d.ts +32 -3
- package/dist/esm/shared/transport.d.ts.map +1 -1
- package/dist/esm/types.d.ts +6 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +6 -0
- package/dist/esm/types.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/server/sse.js
CHANGED
|
@@ -8,6 +8,7 @@ const node_crypto_1 = require("node:crypto");
|
|
|
8
8
|
const types_js_1 = require("../types.js");
|
|
9
9
|
const raw_body_1 = __importDefault(require("raw-body"));
|
|
10
10
|
const content_type_1 = __importDefault(require("content-type"));
|
|
11
|
+
const url_1 = require("url");
|
|
11
12
|
const MAXIMUM_MESSAGE_SIZE = "4mb";
|
|
12
13
|
/**
|
|
13
14
|
* Server transport for SSE: this will send messages over an SSE connection and receive messages from HTTP POST requests.
|
|
@@ -38,7 +39,14 @@ class SSEServerTransport {
|
|
|
38
39
|
Connection: "keep-alive",
|
|
39
40
|
});
|
|
40
41
|
// Send the endpoint event
|
|
41
|
-
|
|
42
|
+
// Use a dummy base URL because this._endpoint is relative.
|
|
43
|
+
// This allows using URL/URLSearchParams for robust parameter handling.
|
|
44
|
+
const dummyBase = 'http://localhost'; // Any valid base works
|
|
45
|
+
const endpointUrl = new url_1.URL(this._endpoint, dummyBase);
|
|
46
|
+
endpointUrl.searchParams.set('sessionId', this._sessionId);
|
|
47
|
+
// Reconstruct the relative URL string (pathname + search + hash)
|
|
48
|
+
const relativeUrlWithSession = endpointUrl.pathname + endpointUrl.search + endpointUrl.hash;
|
|
49
|
+
this.res.write(`event: endpoint\ndata: ${relativeUrlWithSession}\n\n`);
|
|
42
50
|
this._sseResponse = this.res;
|
|
43
51
|
this.res.on("close", () => {
|
|
44
52
|
var _a;
|
|
@@ -58,6 +66,7 @@ class SSEServerTransport {
|
|
|
58
66
|
res.writeHead(500).end(message);
|
|
59
67
|
throw new Error(message);
|
|
60
68
|
}
|
|
69
|
+
const authInfo = req.auth;
|
|
61
70
|
let body;
|
|
62
71
|
try {
|
|
63
72
|
const ct = content_type_1.default.parse((_a = req.headers["content-type"]) !== null && _a !== void 0 ? _a : "");
|
|
@@ -75,7 +84,7 @@ class SSEServerTransport {
|
|
|
75
84
|
return;
|
|
76
85
|
}
|
|
77
86
|
try {
|
|
78
|
-
await this.handleMessage(typeof body === 'string' ? JSON.parse(body) : body);
|
|
87
|
+
await this.handleMessage(typeof body === 'string' ? JSON.parse(body) : body, { authInfo });
|
|
79
88
|
}
|
|
80
89
|
catch (_d) {
|
|
81
90
|
res.writeHead(400).end(`Invalid message: ${body}`);
|
|
@@ -86,7 +95,7 @@ class SSEServerTransport {
|
|
|
86
95
|
/**
|
|
87
96
|
* Handle a client message, regardless of how it arrived. This can be used to inform the server of messages that arrive via a means different than HTTP POST.
|
|
88
97
|
*/
|
|
89
|
-
async handleMessage(message) {
|
|
98
|
+
async handleMessage(message, extra) {
|
|
90
99
|
var _a, _b;
|
|
91
100
|
let parsedMessage;
|
|
92
101
|
try {
|
|
@@ -96,7 +105,7 @@ class SSEServerTransport {
|
|
|
96
105
|
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
|
|
97
106
|
throw error;
|
|
98
107
|
}
|
|
99
|
-
(_b = this.onmessage) === null || _b === void 0 ? void 0 : _b.call(this, parsedMessage);
|
|
108
|
+
(_b = this.onmessage) === null || _b === void 0 ? void 0 : _b.call(this, parsedMessage, extra);
|
|
100
109
|
}
|
|
101
110
|
async close() {
|
|
102
111
|
var _a, _b;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/server/sse.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAyC;AAGzC,0CAAmE;AACnE,wDAAkC;AAClC,gEAAuC;AAEvC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAEnC;;;;GAIG;AACH,MAAa,kBAAkB;IAQ7B;;OAEG;IACH,YACU,SAAiB,EACjB,GAAmB;QADnB,cAAS,GAAT,SAAS,CAAQ;QACjB,QAAG,GAAH,GAAG,CAAgB;QAE3B,IAAI,CAAC,UAAU,GAAG,IAAA,wBAAU,GAAE,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACtB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,wBAAwB;YACzC,UAAU,EAAE,YAAY;SACzB,CAAC,CAAC;QAEH,0BAA0B;QAC1B,
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/server/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import { Transport } from "../shared/transport.js";
|
|
3
|
+
import { JSONRPCMessage, RequestId } from "../types.js";
|
|
4
|
+
export type StreamId = string;
|
|
5
|
+
export type EventId = string;
|
|
6
|
+
/**
|
|
7
|
+
* Interface for resumability support via event storage
|
|
8
|
+
*/
|
|
9
|
+
export interface EventStore {
|
|
10
|
+
/**
|
|
11
|
+
* Stores an event for later retrieval
|
|
12
|
+
* @param streamId ID of the stream the event belongs to
|
|
13
|
+
* @param message The JSON-RPC message to store
|
|
14
|
+
* @returns The generated event ID for the stored event
|
|
15
|
+
*/
|
|
16
|
+
storeEvent(streamId: StreamId, message: JSONRPCMessage): Promise<EventId>;
|
|
17
|
+
replayEventsAfter(lastEventId: EventId, { send }: {
|
|
18
|
+
send: (eventId: EventId, message: JSONRPCMessage) => Promise<void>;
|
|
19
|
+
}): Promise<StreamId>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Configuration options for StreamableHTTPServerTransport
|
|
23
|
+
*/
|
|
24
|
+
export interface StreamableHTTPServerTransportOptions {
|
|
25
|
+
/**
|
|
26
|
+
* Function that generates a session ID for the transport.
|
|
27
|
+
* The session ID SHOULD be globally unique and cryptographically secure (e.g., a securely generated UUID, a JWT, or a cryptographic hash)
|
|
28
|
+
*
|
|
29
|
+
* Return undefined to disable session management.
|
|
30
|
+
*/
|
|
31
|
+
sessionIdGenerator: (() => string) | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* A callback for session initialization events
|
|
34
|
+
* This is called when the server initializes a new session.
|
|
35
|
+
* Useful in cases when you need to register multiple mcp sessions
|
|
36
|
+
* and need to keep track of them.
|
|
37
|
+
* @param sessionId The generated session ID
|
|
38
|
+
*/
|
|
39
|
+
onsessioninitialized?: (sessionId: string) => void;
|
|
40
|
+
/**
|
|
41
|
+
* If true, the server will return JSON responses instead of starting an SSE stream.
|
|
42
|
+
* This can be useful for simple request/response scenarios without streaming.
|
|
43
|
+
* Default is false (SSE streams are preferred).
|
|
44
|
+
*/
|
|
45
|
+
enableJsonResponse?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Event store for resumability support
|
|
48
|
+
* If provided, resumability will be enabled, allowing clients to reconnect and resume messages
|
|
49
|
+
*/
|
|
50
|
+
eventStore?: EventStore;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Server transport for Streamable HTTP: this implements the MCP Streamable HTTP transport specification.
|
|
54
|
+
* It supports both SSE streaming and direct HTTP responses.
|
|
55
|
+
*
|
|
56
|
+
* Usage example:
|
|
57
|
+
*
|
|
58
|
+
* ```typescript
|
|
59
|
+
* // Stateful mode - server sets the session ID
|
|
60
|
+
* const statefulTransport = new StreamableHTTPServerTransport({
|
|
61
|
+
* sessionId: randomUUID(),
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* // Stateless mode - explicitly set session ID to undefined
|
|
65
|
+
* const statelessTransport = new StreamableHTTPServerTransport({
|
|
66
|
+
* sessionId: undefined,
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* // Using with pre-parsed request body
|
|
70
|
+
* app.post('/mcp', (req, res) => {
|
|
71
|
+
* transport.handleRequest(req, res, req.body);
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* In stateful mode:
|
|
76
|
+
* - Session ID is generated and included in response headers
|
|
77
|
+
* - Session ID is always included in initialization responses
|
|
78
|
+
* - Requests with invalid session IDs are rejected with 404 Not Found
|
|
79
|
+
* - Non-initialization requests without a session ID are rejected with 400 Bad Request
|
|
80
|
+
* - State is maintained in-memory (connections, message history)
|
|
81
|
+
*
|
|
82
|
+
* In stateless mode:
|
|
83
|
+
* - Session ID is only included in initialization responses
|
|
84
|
+
* - No session validation is performed
|
|
85
|
+
*/
|
|
86
|
+
export declare class StreamableHTTPServerTransport implements Transport {
|
|
87
|
+
private sessionIdGenerator;
|
|
88
|
+
private _started;
|
|
89
|
+
private _streamMapping;
|
|
90
|
+
private _requestToStreamMapping;
|
|
91
|
+
private _requestResponseMap;
|
|
92
|
+
private _initialized;
|
|
93
|
+
private _enableJsonResponse;
|
|
94
|
+
private _standaloneSseStreamId;
|
|
95
|
+
private _eventStore?;
|
|
96
|
+
private _onsessioninitialized?;
|
|
97
|
+
sessionId?: string | undefined;
|
|
98
|
+
onclose?: () => void;
|
|
99
|
+
onerror?: (error: Error) => void;
|
|
100
|
+
onmessage?: (message: JSONRPCMessage) => void;
|
|
101
|
+
constructor(options: StreamableHTTPServerTransportOptions);
|
|
102
|
+
/**
|
|
103
|
+
* Starts the transport. This is required by the Transport interface but is a no-op
|
|
104
|
+
* for the Streamable HTTP transport as connections are managed per-request.
|
|
105
|
+
*/
|
|
106
|
+
start(): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Handles an incoming HTTP request, whether GET or POST
|
|
109
|
+
*/
|
|
110
|
+
handleRequest(req: IncomingMessage, res: ServerResponse, parsedBody?: unknown): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Handles GET requests for SSE stream
|
|
113
|
+
*/
|
|
114
|
+
private handleGetRequest;
|
|
115
|
+
/**
|
|
116
|
+
* Replays events that would have been sent after the specified event ID
|
|
117
|
+
* Only used when resumability is enabled
|
|
118
|
+
*/
|
|
119
|
+
private replayEvents;
|
|
120
|
+
/**
|
|
121
|
+
* Writes an event to the SSE stream with proper formatting
|
|
122
|
+
*/
|
|
123
|
+
private writeSSEEvent;
|
|
124
|
+
/**
|
|
125
|
+
* Handles unsupported requests (PUT, PATCH, etc.)
|
|
126
|
+
*/
|
|
127
|
+
private handleUnsupportedRequest;
|
|
128
|
+
/**
|
|
129
|
+
* Handles POST requests containing JSON-RPC messages
|
|
130
|
+
*/
|
|
131
|
+
private handlePostRequest;
|
|
132
|
+
/**
|
|
133
|
+
* Handles DELETE requests to terminate sessions
|
|
134
|
+
*/
|
|
135
|
+
private handleDeleteRequest;
|
|
136
|
+
/**
|
|
137
|
+
* Validates session ID for non-initialization requests
|
|
138
|
+
* Returns true if the session is valid, false otherwise
|
|
139
|
+
*/
|
|
140
|
+
private validateSession;
|
|
141
|
+
close(): Promise<void>;
|
|
142
|
+
send(message: JSONRPCMessage, options?: {
|
|
143
|
+
relatedRequestId?: RequestId;
|
|
144
|
+
}): Promise<void>;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=streamableHttp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamableHttp.d.ts","sourceRoot":"","sources":["../../../src/server/streamableHttp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAA4E,cAAc,EAAwB,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxJ,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1E,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE;QAChD,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KACnE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oCAAoC;IACnD;;;;;OAKG;IACH,kBAAkB,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;IAE/C;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnD;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBAAa,6BAA8B,YAAW,SAAS;IAE7D,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,uBAAuB,CAAqC;IACpE,OAAO,CAAC,mBAAmB,CAA6C;IACxE,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,qBAAqB,CAAC,CAA8B;IAE5D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,OAAO,EAAE,oCAAoC;IAOzD;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnG;;OAEG;YACW,gBAAgB;IAqE9B;;;OAGG;YACW,YAAY;IA8B1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;YACW,wBAAwB;IAatC;;OAEG;YACW,iBAAiB;IAiK/B;;OAEG;YACW,mBAAmB;IAQjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IA2DjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAgG/F"}
|