@wooters/crabcallr 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAK1D,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAuChF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjD"}
package/dist/config.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Configuration handling for CrabCallr plugin
3
+ */
4
+ /**
5
+ * Default configuration values
6
+ */
7
+ export const DEFAULT_CONFIG = {
8
+ serviceUrl: 'wss://ws.crabcallr.com/plugin',
9
+ autoConnect: true,
10
+ reconnectInterval: 5000,
11
+ maxReconnectAttempts: 10,
12
+ };
13
+ /**
14
+ * Validates and normalizes plugin configuration
15
+ */
16
+ export function validateConfig(config) {
17
+ if (!config.apiKey) {
18
+ throw new Error('CrabCallr API key is required. Get one at https://app.crabcallr.com');
19
+ }
20
+ if (!config.apiKey.startsWith('cc_')) {
21
+ throw new Error('Invalid CrabCallr API key format. Keys should start with "cc_"');
22
+ }
23
+ const serviceUrl = config.serviceUrl ?? DEFAULT_CONFIG.serviceUrl;
24
+ // Validate WebSocket URL
25
+ if (!serviceUrl.startsWith('ws://') && !serviceUrl.startsWith('wss://')) {
26
+ throw new Error('Invalid service URL. Must be a WebSocket URL (ws:// or wss://)');
27
+ }
28
+ const reconnectInterval = config.reconnectInterval ?? DEFAULT_CONFIG.reconnectInterval;
29
+ if (reconnectInterval < 1000) {
30
+ throw new Error('Reconnect interval must be at least 1000ms');
31
+ }
32
+ const maxReconnectAttempts = config.maxReconnectAttempts ?? DEFAULT_CONFIG.maxReconnectAttempts;
33
+ if (maxReconnectAttempts < 0) {
34
+ throw new Error('Max reconnect attempts cannot be negative');
35
+ }
36
+ return {
37
+ apiKey: config.apiKey,
38
+ serviceUrl,
39
+ autoConnect: config.autoConnect ?? DEFAULT_CONFIG.autoConnect,
40
+ reconnectInterval,
41
+ maxReconnectAttempts,
42
+ };
43
+ }
44
+ /**
45
+ * Masks an API key for logging (shows first 3 and last 4 chars)
46
+ */
47
+ export function maskApiKey(apiKey) {
48
+ if (apiKey.length <= 10) {
49
+ return '***';
50
+ }
51
+ return `${apiKey.slice(0, 6)}...${apiKey.slice(-4)}`;
52
+ }
53
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoC;IAC7D,UAAU,EAAE,+BAA+B;IAC3C,WAAW,EAAE,IAAI;IACjB,iBAAiB,EAAE,IAAI;IACvB,oBAAoB,EAAE,EAAE;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAgC;IAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,cAAc,CAAC,UAAU,CAAC;IAElE,yBAAyB;IACzB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,cAAc,CAAC,iBAAiB,CAAC;IACvF,IAAI,iBAAiB,GAAG,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,IAAI,cAAc,CAAC,oBAAoB,CAAC;IAChG,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU;QACV,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,cAAc,CAAC,WAAW;QAC7D,iBAAiB;QACjB,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * CrabCallr Plugin for OpenClaw
3
+ *
4
+ * Voice calling via phone or browser through the CrabCallr service.
5
+ */
6
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
7
+ declare const plugin: {
8
+ id: string;
9
+ name: string;
10
+ description: string;
11
+ version: string;
12
+ configSchema: {
13
+ safeParse?: (value: unknown) => {
14
+ success: boolean;
15
+ data?: unknown;
16
+ error?: {
17
+ issues?: Array<{
18
+ path: Array<string | number>;
19
+ message: string;
20
+ }>;
21
+ };
22
+ };
23
+ parse?: (value: unknown) => unknown;
24
+ validate?: (value: unknown) => {
25
+ ok: true;
26
+ value?: unknown;
27
+ } | {
28
+ ok: false;
29
+ errors: string[];
30
+ };
31
+ uiHints?: Record<string, {
32
+ label?: string;
33
+ help?: string;
34
+ advanced?: boolean;
35
+ sensitive?: boolean;
36
+ placeholder?: string;
37
+ }>;
38
+ jsonSchema?: Record<string, unknown>;
39
+ };
40
+ register(api: OpenClawPluginApi): void;
41
+ };
42
+ export default plugin;
43
+ export type { CrabCallrConfig, ConnectionStatus } from "./types.js";
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAgC,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAW3F,QAAA,MAAM,MAAM;;;;;;;;gBA2Dwl4O,CAAC;iBAAoB,CAAC;sBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;kBArD3n4O,iBAAiB;CAiDhC,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,55 @@
1
+ /**
2
+ * CrabCallr Plugin for OpenClaw
3
+ *
4
+ * Voice calling via phone or browser through the CrabCallr service.
5
+ */
6
+ import { Type } from "@sinclair/typebox";
7
+ import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
8
+ import { crabcallrPlugin, getCrabCallrStatus, sendCrabCallrResponse, } from "./channel.js";
9
+ import { setCrabCallrRuntime } from "./runtime.js";
10
+ const PLUGIN_VERSION = "0.1.0";
11
+ const plugin = {
12
+ id: "crabcallr",
13
+ name: "CrabCallr",
14
+ description: "CrabCallr voice channel plugin",
15
+ version: PLUGIN_VERSION,
16
+ configSchema: emptyPluginConfigSchema(),
17
+ register(api) {
18
+ setCrabCallrRuntime(api.runtime);
19
+ api.registerChannel({ plugin: crabcallrPlugin });
20
+ api.registerTool({
21
+ name: "crabcallr_status",
22
+ label: "CrabCallr Status",
23
+ description: "Get the current status of the CrabCallr voice connection.",
24
+ parameters: Type.Object({}),
25
+ async execute(_toolCallId, _params) {
26
+ const status = getCrabCallrStatus();
27
+ return {
28
+ content: [{ type: "text", text: JSON.stringify(status, null, 2) }],
29
+ details: status,
30
+ };
31
+ },
32
+ });
33
+ api.registerGatewayMethod("crabcallr.status", ({ respond, params }) => {
34
+ const accountId = typeof params?.accountId === "string" ? params.accountId : undefined;
35
+ respond(true, getCrabCallrStatus(accountId));
36
+ });
37
+ api.registerGatewayMethod("crabcallr.speak", ({ respond, params }) => {
38
+ const requestId = typeof params?.requestId === "string" ? params.requestId.trim() : "";
39
+ const text = typeof params?.text === "string" ? params.text.trim() : "";
40
+ const accountId = typeof params?.accountId === "string" ? params.accountId : undefined;
41
+ if (!requestId || !text) {
42
+ respond(false, { error: "Missing requestId or text parameter" });
43
+ return;
44
+ }
45
+ const result = sendCrabCallrResponse({ accountId, requestId, text });
46
+ if (!result.ok) {
47
+ respond(false, { error: result.error });
48
+ return;
49
+ }
50
+ respond(true, { ok: true, requestId });
51
+ });
52
+ },
53
+ };
54
+ export default plugin;
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PluginRuntime } from "openclaw/plugin-sdk";
2
+ export declare function setCrabCallrRuntime(next: PluginRuntime): void;
3
+ export declare function getCrabCallrRuntime(): PluginRuntime;
4
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,QAEtD;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAKnD"}
@@ -0,0 +1,11 @@
1
+ let runtime = null;
2
+ export function setCrabCallrRuntime(next) {
3
+ runtime = next;
4
+ }
5
+ export function getCrabCallrRuntime() {
6
+ if (!runtime) {
7
+ throw new Error("CrabCallr runtime not initialized");
8
+ }
9
+ return runtime;
10
+ }
11
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAEA,IAAI,OAAO,GAAyB,IAAI,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,IAAmB;IACrD,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * CrabCallr Plugin Types
3
+ *
4
+ * Channel config and WebSocket message types for the CrabCallr voice plugin.
5
+ */
6
+ export type CrabCallrAccountConfig = {
7
+ name?: string;
8
+ enabled?: boolean;
9
+ apiKey?: string;
10
+ serviceUrl?: string;
11
+ autoConnect?: boolean;
12
+ reconnectInterval?: number;
13
+ maxReconnectAttempts?: number;
14
+ };
15
+ export type CrabCallrChannelConfig = CrabCallrAccountConfig & {
16
+ accounts?: Record<string, CrabCallrAccountConfig>;
17
+ };
18
+ export type CrabCallrConfig = {
19
+ apiKey: string;
20
+ serviceUrl: string;
21
+ autoConnect: boolean;
22
+ reconnectInterval: number;
23
+ maxReconnectAttempts: number;
24
+ };
25
+ export type CrabCallrLogger = {
26
+ debug?: (message: string) => void;
27
+ info: (message: string) => void;
28
+ warn: (message: string) => void;
29
+ error: (message: string) => void;
30
+ };
31
+ export type ConnectionStatus = "disconnected" | "connecting" | "connected" | "reconnecting" | "error";
32
+ export type CallSource = "browser" | "phone";
33
+ export declare enum MessageType {
34
+ AUTH = "auth",
35
+ AUTH_RESULT = "auth_result",
36
+ REQUEST = "request",
37
+ RESPONSE = "response",
38
+ PING = "ping",
39
+ PONG = "pong",
40
+ ERROR = "error",
41
+ CALL_START = "call_start",
42
+ CALL_END = "call_end",
43
+ CALL_END_REQUEST = "call_end_request"
44
+ }
45
+ export interface BaseMessage {
46
+ type: MessageType;
47
+ }
48
+ export interface AuthMessage {
49
+ type: MessageType.AUTH;
50
+ apiKey: string;
51
+ }
52
+ export interface AuthResultMessage {
53
+ type: MessageType.AUTH_RESULT;
54
+ success: boolean;
55
+ userId?: string;
56
+ error?: string;
57
+ }
58
+ export interface RequestMessage {
59
+ type: MessageType.REQUEST;
60
+ requestId: string;
61
+ text: string;
62
+ callId: string;
63
+ }
64
+ export interface ResponseMessage {
65
+ type: MessageType.RESPONSE;
66
+ requestId: string;
67
+ text: string;
68
+ }
69
+ export interface PingMessage {
70
+ type: MessageType.PING;
71
+ }
72
+ export interface PongMessage {
73
+ type: MessageType.PONG;
74
+ }
75
+ export interface ErrorMessage {
76
+ type: MessageType.ERROR;
77
+ code: string;
78
+ message: string;
79
+ }
80
+ export interface CallStartMessage {
81
+ type: MessageType.CALL_START;
82
+ callId: string;
83
+ source: CallSource;
84
+ }
85
+ export interface CallEndMessage {
86
+ type: MessageType.CALL_END;
87
+ callId: string;
88
+ durationSeconds: number;
89
+ source: CallSource;
90
+ startedAt: number;
91
+ }
92
+ export interface CallEndRequestMessage {
93
+ type: MessageType.CALL_END_REQUEST;
94
+ userId: string;
95
+ callId: string;
96
+ }
97
+ export type InboundWsMessage = AuthResultMessage | RequestMessage | CallStartMessage | CallEndMessage | PingMessage | PongMessage | ErrorMessage;
98
+ export type OutboundWsMessage = AuthMessage | ResponseMessage | CallEndRequestMessage | PingMessage | PongMessage;
99
+ export interface CrabCallrEvents {
100
+ connected: () => void;
101
+ disconnected: (reason: string) => void;
102
+ error: (error: Error) => void;
103
+ request: (requestId: string, text: string, callId: string) => void;
104
+ callStart: (callId: string, source: CallSource) => void;
105
+ callEnd: (callId: string, durationSeconds: number, source: CallSource, startedAt: number) => void;
106
+ }
107
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * CrabCallr Plugin Types
3
+ *
4
+ * Channel config and WebSocket message types for the CrabCallr voice plugin.
5
+ */
6
+ export var MessageType;
7
+ (function (MessageType) {
8
+ MessageType["AUTH"] = "auth";
9
+ MessageType["AUTH_RESULT"] = "auth_result";
10
+ MessageType["REQUEST"] = "request";
11
+ MessageType["RESPONSE"] = "response";
12
+ MessageType["PING"] = "ping";
13
+ MessageType["PONG"] = "pong";
14
+ MessageType["ERROR"] = "error";
15
+ MessageType["CALL_START"] = "call_start";
16
+ MessageType["CALL_END"] = "call_end";
17
+ MessageType["CALL_END_REQUEST"] = "call_end_request";
18
+ })(MessageType || (MessageType = {}));
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgDH,MAAM,CAAN,IAAY,WAWX;AAXD,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,0CAA2B,CAAA;IAC3B,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;IACrB,4BAAa,CAAA;IACb,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,wCAAyB,CAAA;IACzB,oCAAqB,CAAA;IACrB,oDAAqC,CAAA;AACvC,CAAC,EAXW,WAAW,KAAX,WAAW,QAWtB"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * WebSocket connection manager for CrabCallr service
3
+ */
4
+ import { EventEmitter } from 'events';
5
+ import type { CrabCallrConfig, CrabCallrEvents, CrabCallrLogger, ConnectionStatus } from './types.js';
6
+ /**
7
+ * Type-safe event emitter for CrabCallr events
8
+ */
9
+ export interface CrabCallrWebSocket {
10
+ on<K extends keyof CrabCallrEvents>(event: K, listener: CrabCallrEvents[K]): this;
11
+ off<K extends keyof CrabCallrEvents>(event: K, listener: CrabCallrEvents[K]): this;
12
+ emit<K extends keyof CrabCallrEvents>(event: K, ...args: Parameters<CrabCallrEvents[K]>): boolean;
13
+ }
14
+ /**
15
+ * Manages WebSocket connection to CrabCallr service
16
+ */
17
+ export declare class CrabCallrWebSocket extends EventEmitter {
18
+ private config;
19
+ private ws;
20
+ private status;
21
+ private reconnectAttempts;
22
+ private reconnectTimer;
23
+ private pingTimer;
24
+ private pingTimeout;
25
+ private authenticated;
26
+ private userId;
27
+ private logger;
28
+ constructor(config: CrabCallrConfig, logger: CrabCallrLogger);
29
+ /**
30
+ * Get current connection status
31
+ */
32
+ getStatus(): ConnectionStatus;
33
+ /**
34
+ * Check if connected and authenticated
35
+ */
36
+ isConnected(): boolean;
37
+ /**
38
+ * Get authenticated user ID
39
+ */
40
+ getUserId(): string | null;
41
+ getReconnectAttempts(): number;
42
+ /**
43
+ * Connect to the CrabCallr service
44
+ */
45
+ connect(): void;
46
+ /**
47
+ * Disconnect from the service
48
+ */
49
+ disconnect(): void;
50
+ /**
51
+ * Send a response for a request
52
+ */
53
+ sendResponse(requestId: string, text: string): void;
54
+ /**
55
+ * Request to end a call
56
+ */
57
+ sendCallEndRequest(callId: string): void;
58
+ private setStatus;
59
+ private handleOpen;
60
+ private handleMessage;
61
+ private processMessage;
62
+ private handleAuthResult;
63
+ private handleRequest;
64
+ private handlePing;
65
+ private handlePong;
66
+ private handleCallStart;
67
+ private handleCallEnd;
68
+ private handleErrorMessage;
69
+ private handleClose;
70
+ private handleError;
71
+ private send;
72
+ private scheduleReconnect;
73
+ private startPingTimer;
74
+ private clearPingTimers;
75
+ private clearTimers;
76
+ }
77
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,eAAe,EAIf,gBAAgB,EAOjB,MAAM,YAAY,CAAC;AAYpB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClF,GAAG,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACnF,IAAI,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CACnG;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe;IAM5D;;OAEG;IACH,SAAS,IAAI,gBAAgB;IAI7B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,OAAO,IAAI,IAAI;IA6Bf;;OAEG;IACH,UAAU,IAAI,IAAI;IAmBlB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAenD;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAexC,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,IAAI;IAmBZ,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,WAAW;CAOpB"}