@elizaos/plugin-bluesky 2.0.0-alpha.6 → 2.0.0-beta.1
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 +203 -0
- package/dist/browser/index.browser.js +18 -16
- package/dist/browser/index.browser.js.map +3 -3
- package/dist/cjs/index.node.cjs +959 -151
- package/dist/cjs/index.node.js.map +14 -12
- package/dist/node/index.node.js +937 -142
- package/dist/node/index.node.js.map +14 -12
- package/package.json +18 -12
package/README.md
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# @elizaos/plugin-bluesky
|
|
2
|
+
|
|
3
|
+
BlueSky plugin for elizaOS - A comprehensive AT Protocol client for social interactions on BlueSky.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This plugin provides BlueSky integration for elizaOS agents, enabling:
|
|
8
|
+
|
|
9
|
+
- **Posting**: Create, delete, like, and repost posts
|
|
10
|
+
- **Direct Messaging**: Send and receive direct messages
|
|
11
|
+
- **Notifications**: Monitor and respond to mentions, follows, likes, and reposts
|
|
12
|
+
- **Profile Management**: Access user profiles and timelines
|
|
13
|
+
- **Automated Posting**: Schedule and automate post creation
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
### TypeScript/JavaScript
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @elizaos/plugin-bluesky
|
|
21
|
+
# or
|
|
22
|
+
bun add @elizaos/plugin-bluesky
|
|
23
|
+
```
|
|
24
|
+
## Configuration
|
|
25
|
+
|
|
26
|
+
### Environment Variables
|
|
27
|
+
|
|
28
|
+
Required:
|
|
29
|
+
|
|
30
|
+
- `BLUESKY_HANDLE`: Your BlueSky handle (e.g., `user.bsky.social`)
|
|
31
|
+
- `BLUESKY_PASSWORD`: Your app password (generate at https://bsky.app/settings/app-passwords)
|
|
32
|
+
|
|
33
|
+
Optional:
|
|
34
|
+
| Variable | Description | Default |
|
|
35
|
+
|----------|-------------|---------|
|
|
36
|
+
| `BLUESKY_SERVICE` | BlueSky service URL | `https://bsky.social` |
|
|
37
|
+
| `BLUESKY_DRY_RUN` | Simulate operations without executing | `false` |
|
|
38
|
+
| `BLUESKY_POLL_INTERVAL` | Notification polling interval (seconds) | `60` |
|
|
39
|
+
| `BLUESKY_ENABLE_POSTING` | Enable automated posting | `true` |
|
|
40
|
+
| `BLUESKY_ENABLE_DMS` | Enable direct messaging | `true` |
|
|
41
|
+
| `BLUESKY_POST_INTERVAL_MIN` | Minimum post interval (seconds) | `1800` |
|
|
42
|
+
| `BLUESKY_POST_INTERVAL_MAX` | Maximum post interval (seconds) | `3600` |
|
|
43
|
+
| `BLUESKY_ENABLE_ACTION_PROCESSING` | Enable action processing | `true` |
|
|
44
|
+
| `BLUESKY_ACTION_INTERVAL` | Action processing interval (seconds) | `120` |
|
|
45
|
+
| `BLUESKY_POST_IMMEDIATELY` | Post immediately on startup | `false` |
|
|
46
|
+
| `BLUESKY_MAX_ACTIONS_PROCESSING` | Max actions per batch | `5` |
|
|
47
|
+
|
|
48
|
+
## Quick Start
|
|
49
|
+
|
|
50
|
+
### TypeScript
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { blueSkyPlugin } from "@elizaos/plugin-bluesky";
|
|
54
|
+
|
|
55
|
+
// Add to your elizaOS agent
|
|
56
|
+
const agent = createAgent({
|
|
57
|
+
plugins: [blueSkyPlugin],
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Or use the client directly
|
|
61
|
+
import { BlueSkyClient, validateBlueSkyConfig } from "@elizaos/plugin-bluesky";
|
|
62
|
+
|
|
63
|
+
const client = new BlueSkyClient({
|
|
64
|
+
service: "https://bsky.social",
|
|
65
|
+
handle: "your-handle.bsky.social",
|
|
66
|
+
password: "your-app-password",
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await client.authenticate();
|
|
70
|
+
const post = await client.sendPost({ content: { text: "Hello BlueSky!" } });
|
|
71
|
+
```
|
|
72
|
+
## Features
|
|
73
|
+
|
|
74
|
+
### Posting
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// Create a post
|
|
78
|
+
const post = await client.sendPost({
|
|
79
|
+
content: { text: "Hello BlueSky!" },
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Reply to a post
|
|
83
|
+
const reply = await client.sendPost({
|
|
84
|
+
content: { text: "This is a reply!" },
|
|
85
|
+
replyTo: { uri: post.uri, cid: post.cid },
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Like a post
|
|
89
|
+
await client.likePost(post.uri, post.cid);
|
|
90
|
+
|
|
91
|
+
// Repost
|
|
92
|
+
await client.repost(post.uri, post.cid);
|
|
93
|
+
|
|
94
|
+
// Delete a post
|
|
95
|
+
await client.deletePost(post.uri);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Direct Messages
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Get conversations
|
|
102
|
+
const { conversations } = await client.getConversations();
|
|
103
|
+
|
|
104
|
+
// Get messages from a conversation
|
|
105
|
+
const { messages } = await client.getMessages(convoId);
|
|
106
|
+
|
|
107
|
+
// Send a message
|
|
108
|
+
const message = await client.sendMessage({
|
|
109
|
+
convoId: "conversation-id",
|
|
110
|
+
message: { text: "Hello!" },
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Notifications
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// Get notifications
|
|
118
|
+
const { notifications } = await client.getNotifications(50);
|
|
119
|
+
|
|
120
|
+
// Mark as read
|
|
121
|
+
await client.updateSeenNotifications();
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Timeline
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
// Get timeline
|
|
128
|
+
const timeline = await client.getTimeline({ limit: 50 });
|
|
129
|
+
|
|
130
|
+
for (const item of timeline.feed) {
|
|
131
|
+
console.log(`@${item.post.author.handle}: ${item.post.record.text}`);
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Profiles
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// Get a profile
|
|
139
|
+
const profile = await client.getProfile("user.bsky.social");
|
|
140
|
+
console.log(`${profile.displayName} - ${profile.followersCount} followers`);
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Events
|
|
144
|
+
|
|
145
|
+
The plugin emits the following events for elizaOS integration:
|
|
146
|
+
|
|
147
|
+
| Event | Description |
|
|
148
|
+
| -------------------------- | ------------------------------- |
|
|
149
|
+
| `bluesky.mention_received` | Agent was mentioned in a post |
|
|
150
|
+
| `bluesky.follow_received` | Agent received a new follower |
|
|
151
|
+
| `bluesky.like_received` | Agent's post was liked |
|
|
152
|
+
| `bluesky.repost_received` | Agent's post was reposted |
|
|
153
|
+
| `bluesky.quote_received` | Agent's post was quoted |
|
|
154
|
+
| `bluesky.should_respond` | Trigger for response generation |
|
|
155
|
+
| `bluesky.create_post` | Trigger for automated posting |
|
|
156
|
+
|
|
157
|
+
## Development
|
|
158
|
+
|
|
159
|
+
### TypeScript
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
cd typescript
|
|
163
|
+
bun install
|
|
164
|
+
bun run build
|
|
165
|
+
npx vitest
|
|
166
|
+
```
|
|
167
|
+
## Architecture
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
plugin-bluesky/
|
|
171
|
+
├── typescript/ # TypeScript implementation
|
|
172
|
+
│ ├── index.ts # Main plugin export
|
|
173
|
+
│ ├── client.ts # BlueSky API client
|
|
174
|
+
│ ├── types/ # Type definitions
|
|
175
|
+
│ ├── services/ # Service implementations
|
|
176
|
+
│ ├── managers/ # Agent manager
|
|
177
|
+
│ └── utils/ # Configuration utilities
|
|
178
|
+
├── python/ # Python implementation
|
|
179
|
+
│ ├── elizaos_plugin_bluesky/
|
|
180
|
+
│ │ ├── __init__.py # Package exports
|
|
181
|
+
│ │ ├── client.py # BlueSky API client
|
|
182
|
+
│ │ ├── config.py # Configuration
|
|
183
|
+
│ │ ├── types.py # Type definitions
|
|
184
|
+
│ │ └── errors.py # Error types
|
|
185
|
+
│ └── tests/ # Test suite
|
|
186
|
+
├── rust/ # Rust implementation
|
|
187
|
+
│ ├── src/
|
|
188
|
+
│ │ ├── lib.rs # Library root
|
|
189
|
+
│ │ ├── client.rs # BlueSky API client
|
|
190
|
+
│ │ ├── config.rs # Configuration
|
|
191
|
+
│ │ ├── types.rs # Type definitions
|
|
192
|
+
│ │ └── error.rs # Error types
|
|
193
|
+
│ └── tests/ # Integration tests
|
|
194
|
+
└── package.json # Root package configuration
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## License
|
|
198
|
+
|
|
199
|
+
MIT License - see [LICENSE](./LICENSE) for details.
|
|
200
|
+
|
|
201
|
+
## Contributing
|
|
202
|
+
|
|
203
|
+
Contributions are welcome! Please ensure your changes maintain feature parity across all three language implementations.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// types/index.ts
|
|
2
|
-
import
|
|
2
|
+
import * as zod from "zod";
|
|
3
|
+
var z2 = zod.z ?? zod;
|
|
3
4
|
var BLUESKY_SERVICE_URL = "https://bsky.social";
|
|
4
5
|
var BLUESKY_MAX_POST_LENGTH = 300;
|
|
5
6
|
var BLUESKY_POLL_INTERVAL = 60;
|
|
@@ -24,20 +25,20 @@ var CACHE_SIZE = {
|
|
|
24
25
|
NOTIFICATIONS: 1000,
|
|
25
26
|
CONVERSATIONS: 100
|
|
26
27
|
};
|
|
27
|
-
var BlueSkyConfigSchema =
|
|
28
|
-
handle:
|
|
29
|
-
password:
|
|
30
|
-
service:
|
|
31
|
-
dryRun:
|
|
32
|
-
pollInterval:
|
|
33
|
-
enablePost:
|
|
34
|
-
postIntervalMin:
|
|
35
|
-
postIntervalMax:
|
|
36
|
-
enableActionProcessing:
|
|
37
|
-
actionInterval:
|
|
38
|
-
postImmediately:
|
|
39
|
-
maxActionsProcessing:
|
|
40
|
-
enableDMs:
|
|
28
|
+
var BlueSkyConfigSchema = z2.object({
|
|
29
|
+
handle: z2.string().regex(AT_PROTOCOL_HANDLE_REGEX, "Invalid handle format"),
|
|
30
|
+
password: z2.string().min(1),
|
|
31
|
+
service: z2.string().url().default(BLUESKY_SERVICE_URL),
|
|
32
|
+
dryRun: z2.boolean().default(false),
|
|
33
|
+
pollInterval: z2.number().positive().default(BLUESKY_POLL_INTERVAL),
|
|
34
|
+
enablePost: z2.boolean().default(true),
|
|
35
|
+
postIntervalMin: z2.number().positive().default(BLUESKY_POST_INTERVAL_MIN),
|
|
36
|
+
postIntervalMax: z2.number().positive().default(BLUESKY_POST_INTERVAL_MAX),
|
|
37
|
+
enableActionProcessing: z2.boolean().default(true),
|
|
38
|
+
actionInterval: z2.number().positive().default(BLUESKY_ACTION_INTERVAL),
|
|
39
|
+
postImmediately: z2.boolean().default(false),
|
|
40
|
+
maxActionsProcessing: z2.number().positive().default(BLUESKY_MAX_ACTIONS),
|
|
41
|
+
enableDMs: z2.boolean().default(true)
|
|
41
42
|
});
|
|
42
43
|
|
|
43
44
|
class BlueSkyError extends Error {
|
|
@@ -55,6 +56,7 @@ export {
|
|
|
55
56
|
CACHE_SIZE,
|
|
56
57
|
BlueSkyError,
|
|
57
58
|
BlueSkyConfigSchema,
|
|
59
|
+
BlueSkyConfig,
|
|
58
60
|
BLUESKY_SERVICE_URL,
|
|
59
61
|
BLUESKY_SERVICE_NAME,
|
|
60
62
|
BLUESKY_POST_INTERVAL_MIN,
|
|
@@ -67,4 +69,4 @@ export {
|
|
|
67
69
|
AT_PROTOCOL_HANDLE_REGEX
|
|
68
70
|
};
|
|
69
71
|
|
|
70
|
-
//# debugId=
|
|
72
|
+
//# debugId=028253F8E0BBFEA764756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../types/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport
|
|
5
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport * as zod from \"zod\";\n\nconst z = zod.z ?? zod;\n\nexport const BLUESKY_SERVICE_URL = \"https://bsky.social\";\nexport const BLUESKY_MAX_POST_LENGTH = 300;\nexport const BLUESKY_POLL_INTERVAL = 60;\nexport const BLUESKY_POST_INTERVAL_MIN = 1800;\nexport const BLUESKY_POST_INTERVAL_MAX = 3600;\nexport const BLUESKY_ACTION_INTERVAL = 120;\nexport const BLUESKY_MAX_ACTIONS = 5;\nexport const BLUESKY_CHAT_SERVICE_DID = \"did:web:api.bsky.chat\";\nexport const BLUESKY_SERVICE_NAME = \"bluesky\";\n\nexport const AT_PROTOCOL_HANDLE_REGEX =\n\t/^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;\n\nexport const CACHE_TTL = {\n\tPROFILE: 3600000,\n\tTIMELINE: 300000,\n\tPOST: 1800000,\n\tNOTIFICATIONS: 300000,\n\tCONVERSATIONS: 300000,\n} as const;\n\nexport const CACHE_SIZE = {\n\tPROFILE: 1000,\n\tTIMELINE: 500,\n\tPOST: 10000,\n\tNOTIFICATIONS: 1000,\n\tCONVERSATIONS: 100,\n} as const;\n\nexport const BlueSkyConfigSchema = z.object({\n\thandle: z.string().regex(AT_PROTOCOL_HANDLE_REGEX, \"Invalid handle format\"),\n\tpassword: z.string().min(1),\n\tservice: z.string().url().default(BLUESKY_SERVICE_URL),\n\tdryRun: z.boolean().default(false),\n\tpollInterval: z.number().positive().default(BLUESKY_POLL_INTERVAL),\n\tenablePost: z.boolean().default(true),\n\tpostIntervalMin: z.number().positive().default(BLUESKY_POST_INTERVAL_MIN),\n\tpostIntervalMax: z.number().positive().default(BLUESKY_POST_INTERVAL_MAX),\n\tenableActionProcessing: z.boolean().default(true),\n\tactionInterval: z.number().positive().default(BLUESKY_ACTION_INTERVAL),\n\tpostImmediately: z.boolean().default(false),\n\tmaxActionsProcessing: z.number().positive().default(BLUESKY_MAX_ACTIONS),\n\tenableDMs: z.boolean().default(true),\n});\n\nexport type BlueSkyConfig = zod.infer<typeof BlueSkyConfigSchema>;\n\nexport interface BlueSkyProfile {\n\tdid: string;\n\thandle: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tavatar?: string;\n\tbanner?: string;\n\tfollowersCount?: number;\n\tfollowsCount?: number;\n\tpostsCount?: number;\n\tindexedAt?: string;\n\tcreatedAt?: string;\n}\n\nexport interface PostFacet {\n\tindex: { byteStart: number; byteEnd: number };\n\tfeatures: Array<{\n\t\t$type?: string;\n\t\t[key: string]: string | number | boolean | object | null | undefined;\n\t}>;\n}\n\nexport interface PostEmbed {\n\t$type: string;\n\t[key: string]: string | number | boolean | object | null | undefined;\n}\n\nexport interface PostRecord {\n\t$type: string;\n\ttext: string;\n\tfacets?: PostFacet[];\n\tembed?: PostEmbed;\n\tcreatedAt: string;\n}\n\nexport interface BlueSkyPost {\n\turi: string;\n\tcid: string;\n\tauthor: BlueSkyProfile;\n\trecord: PostRecord;\n\tembed?: PostEmbed;\n\treplyCount?: number;\n\trepostCount?: number;\n\tlikeCount?: number;\n\tquoteCount?: number;\n\tindexedAt: string;\n}\n\nexport interface TimelineRequest {\n\talgorithm?: string;\n\tlimit?: number;\n\tcursor?: string;\n}\n\nexport interface TimelineFeedItem {\n\tpost: BlueSkyPost;\n\treply?: {\n\t\troot: BlueSkyPost;\n\t\tparent: BlueSkyPost;\n\t};\n\treason?: Record<\n\t\tstring,\n\t\tstring | number | boolean | object | null | undefined\n\t>;\n}\n\nexport interface TimelineResponse {\n\tcursor?: string;\n\tfeed: TimelineFeedItem[];\n}\n\nexport interface CreatePostRequest {\n\tcontent: {\n\t\ttext: string;\n\t\tfacets?: PostFacet[];\n\t\tembed?: PostEmbed;\n\t};\n\treplyTo?: { uri: string; cid: string };\n}\n\nexport type NotificationReason =\n\t| \"mention\"\n\t| \"reply\"\n\t| \"follow\"\n\t| \"like\"\n\t| \"repost\"\n\t| \"quote\";\n\nexport interface BlueSkyNotification {\n\turi: string;\n\tcid: string;\n\tauthor: BlueSkyProfile;\n\treason: NotificationReason;\n\treasonSubject?: string;\n\trecord: Record<string, string | number | boolean | object | null | undefined>;\n\tisRead: boolean;\n\tindexedAt: string;\n}\n\nexport interface BlueSkyMessage {\n\tid: string;\n\trev: string;\n\ttext?: string;\n\tembed?: PostEmbed;\n\tsender: { did: string };\n\tsentAt: string;\n}\n\nexport interface BlueSkyConversation {\n\tid: string;\n\trev: string;\n\tmembers: Array<{\n\t\tdid: string;\n\t\thandle?: string;\n\t\tdisplayName?: string;\n\t\tavatar?: string;\n\t}>;\n\tlastMessage?: BlueSkyMessage;\n\tunreadCount: number;\n\tmuted: boolean;\n}\n\nexport interface SendMessageRequest {\n\tconvoId: string;\n\tmessage: { text?: string; embed?: PostEmbed };\n}\n\nexport interface BlueSkySession {\n\tdid: string;\n\thandle: string;\n\temail?: string;\n\taccessJwt: string;\n\trefreshJwt: string;\n}\n\nexport class BlueSkyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly status?: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"BlueSkyError\";\n\t}\n}\n\nexport interface ATProtocolPostRecord {\n\t$type: string;\n\ttext: string;\n\tfacets?: PostFacet[];\n\tembed?: PostEmbed;\n\tcreatedAt: string;\n\t[k: string]:\n\t\t| string\n\t\t| PostFacet[]\n\t\t| PostEmbed\n\t\t| number\n\t\t| boolean\n\t\t| null\n\t\t| undefined;\n}\n\nexport interface ATProtocolProfileViewExtended {\n\tdid: string;\n\thandle: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tavatar?: string;\n\tbanner?: string;\n\tfollowersCount?: number;\n\tfollowsCount?: number;\n\tpostsCount?: number;\n\tindexedAt?: string;\n\tcreatedAt?: string;\n\t[k: string]: string | number | undefined;\n}\n\nexport interface BlueSkyEventPayload {\n\truntime: IAgentRuntime;\n\tsource: \"bluesky\";\n\taccountId?: string;\n}\n\nexport interface BlueSkyNotificationEventPayload extends BlueSkyEventPayload {\n\tnotification: BlueSkyNotification;\n}\n\nexport interface BlueSkyCreatePostEventPayload extends BlueSkyEventPayload {\n\tautomated: boolean;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AACA;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AACA;AAEA,IAAM,KAAQ,SAAK;AAEZ,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAC9B,IAAM,4BAA4B;AAClC,IAAM,4BAA4B;AAClC,IAAM,0BAA0B;AAChC,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAE7B,IAAM,2BACZ;AAEM,IAAM,YAAY;AAAA,EACxB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,IAAM,aAAa;AAAA,EACzB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,IAAM,sBAAsB,GAAE,OAAO;AAAA,EAC3C,QAAQ,GAAE,OAAO,EAAE,MAAM,0BAA0B,uBAAuB;AAAA,EAC1E,UAAU,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,SAAS,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,mBAAmB;AAAA,EACrD,QAAQ,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACjC,cAAc,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,qBAAqB;AAAA,EACjE,YAAY,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACpC,iBAAiB,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,yBAAyB;AAAA,EACxE,iBAAiB,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,yBAAyB;AAAA,EACxE,wBAAwB,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAChD,gBAAgB,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,uBAAuB;AAAA,EACrE,iBAAiB,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC1C,sBAAsB,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,mBAAmB;AAAA,EACvE,WAAW,GAAE,QAAQ,EAAE,QAAQ,IAAI;AACpC,CAAC;AAAA;AA2IM,MAAM,qBAAqB,MAAM;AAAA,EAGtB;AAAA,EACA;AAAA,EAHjB,WAAW,CACV,SACgB,MACA,QACf;AAAA,IACD,MAAM,OAAO;AAAA,IAHG;AAAA,IACA;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEd;",
|
|
8
|
+
"debugId": "028253F8E0BBFEA764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|