@kardoe/quickback 0.5.16 → 0.6.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,11 @@
1
+ /**
2
+ * Cursor command - manage Cursor IDE rules installation
3
+ *
4
+ * Usage:
5
+ * quickback cursor install # Install to .cursor/rules/quickback.mdc
6
+ * quickback cursor update # Update to latest version
7
+ * quickback cursor remove # Remove installed rules
8
+ * quickback cursor status # Check installation status
9
+ */
10
+ export declare function cursor(args: string[]): Promise<void>;
11
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/commands/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgJH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B1D"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Cursor command - manage Cursor IDE rules installation
3
+ *
4
+ * Usage:
5
+ * quickback cursor install # Install to .cursor/rules/quickback.mdc
6
+ * quickback cursor update # Update to latest version
7
+ * quickback cursor remove # Remove installed rules
8
+ * quickback cursor status # Check installation status
9
+ */
10
+ import { copyFileSync, mkdirSync, existsSync, rmSync } from "fs";
11
+ import { join, dirname } from "path";
12
+ import { fileURLToPath } from "url";
13
+ import pc from "picocolors";
14
+ import prompts from "prompts";
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ // Paths
18
+ const CURSOR_BUNDLE = join(__dirname, "..", "cursor");
19
+ const RULES_DIR = join(process.cwd(), ".cursor", "rules");
20
+ const RULES_FILE = join(RULES_DIR, "quickback.mdc");
21
+ function checkBundledRules() {
22
+ const mdcFile = join(CURSOR_BUNDLE, "quickback.mdc");
23
+ if (!existsSync(mdcFile)) {
24
+ console.log(pc.red("\nCursor rules not found in CLI bundle."));
25
+ console.log(pc.dim("This may indicate an incomplete CLI installation."));
26
+ console.log(pc.dim("Try reinstalling: npm install -g @kardoe/quickback\n"));
27
+ return false;
28
+ }
29
+ return true;
30
+ }
31
+ function installRules() {
32
+ mkdirSync(RULES_DIR, { recursive: true });
33
+ const src = join(CURSOR_BUNDLE, "quickback.mdc");
34
+ copyFileSync(src, RULES_FILE);
35
+ console.log(pc.green(` ✓ quickback.mdc → ${RULES_DIR}`));
36
+ console.log("");
37
+ console.log(pc.green("✓ Quickback rules installed for Cursor IDE"));
38
+ console.log("");
39
+ console.log(pc.bold("The rules will automatically activate in Cursor for quickback/**/*.ts files."));
40
+ console.log(pc.dim("Consider committing .cursor/rules/ to your repository.\n"));
41
+ }
42
+ async function install(args) {
43
+ if (!checkBundledRules()) {
44
+ process.exit(1);
45
+ }
46
+ // Check for existing installation
47
+ if (existsSync(RULES_FILE)) {
48
+ const response = await prompts({
49
+ type: "confirm",
50
+ name: "overwrite",
51
+ message: "Cursor rules already installed. Overwrite?",
52
+ initial: true,
53
+ });
54
+ if (!response.overwrite) {
55
+ console.log(pc.dim("\nInstallation cancelled.\n"));
56
+ return;
57
+ }
58
+ }
59
+ console.log("");
60
+ console.log(pc.bold("Installing Quickback rules for Cursor IDE"));
61
+ console.log("");
62
+ installRules();
63
+ }
64
+ async function update(args) {
65
+ if (!checkBundledRules()) {
66
+ process.exit(1);
67
+ }
68
+ if (!existsSync(RULES_FILE)) {
69
+ console.log(pc.yellow("\nNo existing installation found."));
70
+ console.log(pc.dim("Run 'quickback cursor install' to install.\n"));
71
+ return;
72
+ }
73
+ console.log("");
74
+ console.log(pc.bold("Updating Quickback Cursor rules"));
75
+ console.log("");
76
+ installRules();
77
+ }
78
+ async function remove(args) {
79
+ if (!existsSync(RULES_FILE)) {
80
+ console.log(pc.yellow("\nNo installation found to remove.\n"));
81
+ return;
82
+ }
83
+ console.log("");
84
+ console.log(pc.bold("Remove Quickback Cursor rules"));
85
+ console.log("");
86
+ rmSync(RULES_FILE, { force: true });
87
+ console.log(pc.yellow(` ✓ Removed ${RULES_FILE}`));
88
+ console.log("");
89
+ console.log(pc.green("✓ Quickback Cursor rules removed.\n"));
90
+ }
91
+ async function status() {
92
+ console.log("");
93
+ console.log(pc.bold("Quickback Cursor IDE Rules"));
94
+ console.log("");
95
+ if (existsSync(RULES_FILE)) {
96
+ console.log(` ${pc.green("●")} Installed`);
97
+ console.log(pc.dim(` ${RULES_FILE}`));
98
+ }
99
+ else {
100
+ console.log(` ${pc.dim("○")} Not installed`);
101
+ }
102
+ console.log("");
103
+ if (!existsSync(RULES_FILE)) {
104
+ console.log(pc.dim("Run 'quickback cursor install' to install the rules.\n"));
105
+ }
106
+ }
107
+ function printHelp() {
108
+ console.log(`
109
+ ${pc.bold("Quickback Cursor IDE Rules")}
110
+
111
+ ${pc.bold("USAGE")}
112
+ quickback cursor <command>
113
+
114
+ ${pc.bold("COMMANDS")}
115
+ ${pc.cyan("install")} Install Cursor rules to .cursor/rules/
116
+ ${pc.cyan("update")} Update to the latest version
117
+ ${pc.cyan("remove")} Remove the installed rules
118
+ ${pc.cyan("status")} Check installation status
119
+
120
+ ${pc.bold("EXAMPLES")}
121
+ ${pc.gray("# Install rules")}
122
+ quickback cursor install
123
+
124
+ ${pc.gray("# Check status")}
125
+ quickback cursor status
126
+ `);
127
+ }
128
+ export async function cursor(args) {
129
+ const subcommand = args[0];
130
+ const subArgs = args.slice(1);
131
+ switch (subcommand) {
132
+ case "install":
133
+ await install(subArgs);
134
+ break;
135
+ case "update":
136
+ await update(subArgs);
137
+ break;
138
+ case "remove":
139
+ case "uninstall":
140
+ await remove(subArgs);
141
+ break;
142
+ case "status":
143
+ await status();
144
+ break;
145
+ case "--help":
146
+ case "-h":
147
+ case undefined:
148
+ printHelp();
149
+ break;
150
+ default:
151
+ console.log(pc.red(`\nUnknown subcommand: ${subcommand}`));
152
+ printHelp();
153
+ process.exit(1);
154
+ }
155
+ }
156
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/commands/cursor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DxD"}
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DxD"}
@@ -45,14 +45,15 @@ export async function docs(args) {
45
45
  console.log(pc.dim("Full docs: https://quickback.dev/docs\n"));
46
46
  return;
47
47
  }
48
- // Show specific topic
49
- const doc = DOCS[topic];
50
- if (!doc) {
48
+ // Show specific topic — try exact match first, then fuzzy suffix match
49
+ const resolved = resolveTopic(topic);
50
+ if (!resolved) {
51
51
  console.log(pc.red(`\nUnknown topic: ${topic}`));
52
52
  console.log(pc.dim(`\nAvailable topics: ${TOPIC_LIST.join(", ")}`));
53
53
  console.log(pc.dim(`Run 'quickback docs' to see all topics\n`));
54
54
  process.exit(1);
55
55
  }
56
+ const doc = DOCS[resolved];
56
57
  console.log("");
57
58
  console.log(renderMarkdown(doc.content));
58
59
  console.log("");
@@ -60,6 +61,29 @@ export async function docs(args) {
60
61
  console.log(pc.dim(`Full documentation: https://quickback.dev/docs/${topic}`));
61
62
  console.log("");
62
63
  }
64
+ /**
65
+ * Resolve a topic name — exact match, then fuzzy suffix match.
66
+ * Returns the resolved full topic key, or null if not found.
67
+ * If multiple matches, prints disambiguation help and exits.
68
+ */
69
+ function resolveTopic(input) {
70
+ // Exact match
71
+ if (DOCS[input])
72
+ return input;
73
+ // Suffix match: find topics ending with /{input} or equal to {input}
74
+ const matches = TOPIC_LIST.filter((t) => t === input || t.endsWith(`/${input}`));
75
+ if (matches.length === 1)
76
+ return matches[0];
77
+ if (matches.length > 1) {
78
+ console.log(pc.yellow(`\nAmbiguous topic "${input}". Did you mean:\n`));
79
+ for (const m of matches) {
80
+ console.log(` ${pc.cyan(m)}`);
81
+ }
82
+ console.log(pc.dim(`\nUse the full path, e.g.: quickback docs ${matches[0]}\n`));
83
+ process.exit(1);
84
+ }
85
+ return null;
86
+ }
63
87
  function printTopic(topic, fallbackDesc) {
64
88
  const doc = DOCS[topic];
65
89
  const title = doc?.title || fallbackDesc;
@@ -1 +1 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MCP Server command — starts a stdio-based MCP server
3
+ *
4
+ * Exposes Quickback documentation and project context to any MCP-compatible AI tool
5
+ * (Claude Desktop, Cursor, VS Code Copilot, Windsurf, etc.)
6
+ *
7
+ * Usage:
8
+ * quickback mcp # Start stdio MCP server
9
+ *
10
+ * Configuration (claude_desktop_config.json or .cursor/mcp.json):
11
+ * {
12
+ * "mcpServers": {
13
+ * "quickback": {
14
+ * "command": "npx",
15
+ * "args": ["@kardoe/quickback", "mcp"]
16
+ * }
17
+ * }
18
+ * }
19
+ */
20
+ export declare function mcp(): Promise<void>;
21
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAqYzC"}
@@ -0,0 +1,330 @@
1
+ /**
2
+ * MCP Server command — starts a stdio-based MCP server
3
+ *
4
+ * Exposes Quickback documentation and project context to any MCP-compatible AI tool
5
+ * (Claude Desktop, Cursor, VS Code Copilot, Windsurf, etc.)
6
+ *
7
+ * Usage:
8
+ * quickback mcp # Start stdio MCP server
9
+ *
10
+ * Configuration (claude_desktop_config.json or .cursor/mcp.json):
11
+ * {
12
+ * "mcpServers": {
13
+ * "quickback": {
14
+ * "command": "npx",
15
+ * "args": ["@kardoe/quickback", "mcp"]
16
+ * }
17
+ * }
18
+ * }
19
+ */
20
+ import { DOCS, TOPIC_LIST } from "../docs/content.js";
21
+ import { promises as fs } from "fs";
22
+ import { join } from "path";
23
+ export async function mcp() {
24
+ const { McpServer } = await import("@modelcontextprotocol/sdk/server/mcp.js");
25
+ const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
26
+ const { z } = await import("zod");
27
+ const server = new McpServer({
28
+ name: "quickback",
29
+ version: "1.0.0",
30
+ });
31
+ // --- Documentation Resources ---
32
+ // Each doc topic is available as a readable resource
33
+ for (const topic of TOPIC_LIST) {
34
+ const doc = DOCS[topic];
35
+ if (!doc)
36
+ continue;
37
+ server.resource(topic, `quickback://docs/${topic}`, { description: doc.title, mimeType: "text/markdown" }, async () => ({
38
+ contents: [
39
+ {
40
+ uri: `quickback://docs/${topic}`,
41
+ text: `# ${doc.title}\n\n${doc.content}`,
42
+ mimeType: "text/markdown",
43
+ },
44
+ ],
45
+ }));
46
+ }
47
+ // --- Documentation Tools ---
48
+ server.tool("list_topics", "List all available Quickback documentation topics", {}, async () => {
49
+ const grouped = {};
50
+ for (const topic of TOPIC_LIST) {
51
+ const section = topic.split("/")[0];
52
+ if (!grouped[section])
53
+ grouped[section] = [];
54
+ grouped[section].push(topic);
55
+ }
56
+ let output = "# Quickback Documentation Topics\n\n";
57
+ for (const [section, topics] of Object.entries(grouped)) {
58
+ output += `## ${section}\n`;
59
+ for (const t of topics) {
60
+ const doc = DOCS[t];
61
+ output += `- **${t}** — ${doc?.title || t}\n`;
62
+ }
63
+ output += "\n";
64
+ }
65
+ return { content: [{ type: "text", text: output }] };
66
+ });
67
+ server.tool("get_doc", "Get a specific Quickback documentation topic by key. Supports fuzzy suffix matching (e.g., 'firewall' matches 'compiler/definitions/firewall').", { topic: z.string().describe("Topic key or short name (e.g., 'firewall', 'compiler/definitions/firewall')") }, async ({ topic }) => {
68
+ // Exact match first
69
+ let resolved = DOCS[topic] ? topic : null;
70
+ // Fuzzy suffix match
71
+ if (!resolved) {
72
+ const matches = TOPIC_LIST.filter((t) => t === topic || t.endsWith(`/${topic}`));
73
+ if (matches.length === 1) {
74
+ resolved = matches[0];
75
+ }
76
+ else if (matches.length > 1) {
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: `Ambiguous topic "${topic}". Did you mean one of:\n${matches.map((m) => `- ${m}`).join("\n")}`,
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ }
87
+ if (!resolved || !DOCS[resolved]) {
88
+ return {
89
+ content: [
90
+ {
91
+ type: "text",
92
+ text: `Topic "${topic}" not found. Use list_topics to see all available topics.`,
93
+ },
94
+ ],
95
+ };
96
+ }
97
+ const doc = DOCS[resolved];
98
+ return {
99
+ content: [
100
+ {
101
+ type: "text",
102
+ text: `# ${doc.title}\n\n${doc.content}`,
103
+ },
104
+ ],
105
+ };
106
+ });
107
+ server.tool("search_docs", "Search Quickback documentation content by keyword. Returns matching topics with relevant excerpts.", { query: z.string().describe("Search query (case-insensitive)") }, async ({ query }) => {
108
+ const lower = query.toLowerCase();
109
+ const results = [];
110
+ for (const topic of TOPIC_LIST) {
111
+ const doc = DOCS[topic];
112
+ if (!doc)
113
+ continue;
114
+ const content = doc.content.toLowerCase();
115
+ const title = doc.title.toLowerCase();
116
+ if (content.includes(lower) || title.includes(lower)) {
117
+ // Extract excerpt around first match
118
+ const idx = content.indexOf(lower);
119
+ const start = Math.max(0, idx - 100);
120
+ const end = Math.min(content.length, idx + lower.length + 100);
121
+ const excerpt = (start > 0 ? "..." : "") +
122
+ doc.content.substring(start, end).replace(/\n/g, " ") +
123
+ (end < content.length ? "..." : "");
124
+ results.push({ topic, title: doc.title, excerpt });
125
+ }
126
+ }
127
+ if (results.length === 0) {
128
+ return {
129
+ content: [
130
+ {
131
+ type: "text",
132
+ text: `No results found for "${query}".`,
133
+ },
134
+ ],
135
+ };
136
+ }
137
+ let output = `# Search results for "${query}" (${results.length} matches)\n\n`;
138
+ for (const r of results.slice(0, 20)) {
139
+ output += `## ${r.topic}\n**${r.title}**\n${r.excerpt}\n\n`;
140
+ }
141
+ if (results.length > 20) {
142
+ output += `\n*...and ${results.length - 20} more results*\n`;
143
+ }
144
+ return { content: [{ type: "text", text: output }] };
145
+ });
146
+ // --- Project-Aware Tools ---
147
+ server.tool("read_config", "Read the current project's quickback.config.ts file. Returns the raw TypeScript source.", {}, async () => {
148
+ const configPath = await findProjectFile([
149
+ "quickback/quickback.config.ts",
150
+ "quickback.config.ts",
151
+ ]);
152
+ if (!configPath) {
153
+ return {
154
+ content: [
155
+ {
156
+ type: "text",
157
+ text: "No quickback.config.ts found. Not in a Quickback project directory.",
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ const source = await fs.readFile(configPath, "utf-8");
163
+ return {
164
+ content: [
165
+ {
166
+ type: "text",
167
+ text: `# quickback.config.ts\n\n\`\`\`typescript\n${source}\n\`\`\``,
168
+ },
169
+ ],
170
+ };
171
+ });
172
+ server.tool("list_features", "List all features defined in the current Quickback project. Shows feature directories and their table definition files.", {}, async () => {
173
+ const featuresDir = await findProjectDir([
174
+ "quickback/features",
175
+ "features",
176
+ ]);
177
+ if (!featuresDir) {
178
+ return {
179
+ content: [
180
+ {
181
+ type: "text",
182
+ text: "No features directory found. Not in a Quickback project directory.",
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ const entries = await fs.readdir(featuresDir, { withFileTypes: true });
188
+ const features = [];
189
+ for (const entry of entries) {
190
+ if (!entry.isDirectory())
191
+ continue;
192
+ const featureDir = join(featuresDir, entry.name);
193
+ const files = await fs.readdir(featureDir);
194
+ features.push({
195
+ name: entry.name,
196
+ files: files.filter((f) => f.endsWith(".ts")),
197
+ });
198
+ }
199
+ if (features.length === 0) {
200
+ return {
201
+ content: [
202
+ {
203
+ type: "text",
204
+ text: "Features directory exists but contains no feature definitions.",
205
+ },
206
+ ],
207
+ };
208
+ }
209
+ let output = `# Project Features (${features.length})\n\n`;
210
+ for (const f of features) {
211
+ output += `## ${f.name}/\n`;
212
+ for (const file of f.files) {
213
+ output += `- ${file}\n`;
214
+ }
215
+ output += "\n";
216
+ }
217
+ return { content: [{ type: "text", text: output }] };
218
+ });
219
+ server.tool("read_feature", "Read the source code of a specific feature. Returns all .ts files in the feature directory.", {
220
+ feature: z.string().describe("Feature name (directory name under quickback/features/)"),
221
+ }, async ({ feature }) => {
222
+ const featuresDir = await findProjectDir([
223
+ "quickback/features",
224
+ "features",
225
+ ]);
226
+ if (!featuresDir) {
227
+ return {
228
+ content: [
229
+ {
230
+ type: "text",
231
+ text: "No features directory found. Not in a Quickback project directory.",
232
+ },
233
+ ],
234
+ };
235
+ }
236
+ const featureDir = join(featuresDir, feature);
237
+ try {
238
+ await fs.access(featureDir);
239
+ }
240
+ catch {
241
+ return {
242
+ content: [
243
+ {
244
+ type: "text",
245
+ text: `Feature "${feature}" not found. Use list_features to see available features.`,
246
+ },
247
+ ],
248
+ };
249
+ }
250
+ const files = (await fs.readdir(featureDir)).filter((f) => f.endsWith(".ts"));
251
+ let output = `# Feature: ${feature}\n\n`;
252
+ for (const file of files) {
253
+ const source = await fs.readFile(join(featureDir, file), "utf-8");
254
+ output += `## ${file}\n\n\`\`\`typescript\n${source}\n\`\`\`\n\n`;
255
+ }
256
+ // Check for handlers/ subdirectory
257
+ const handlersDir = join(featureDir, "handlers");
258
+ try {
259
+ const handlerFiles = (await fs.readdir(handlersDir)).filter((f) => f.endsWith(".ts"));
260
+ for (const file of handlerFiles) {
261
+ const source = await fs.readFile(join(handlersDir, file), "utf-8");
262
+ output += `## handlers/${file}\n\n\`\`\`typescript\n${source}\n\`\`\`\n\n`;
263
+ }
264
+ }
265
+ catch {
266
+ // No handlers directory
267
+ }
268
+ return { content: [{ type: "text", text: output }] };
269
+ });
270
+ server.tool("read_schema_registry", "Read the project's compiled schema-registry.json. Contains full metadata about all tables, columns, security rules, views, and actions.", {}, async () => {
271
+ const registryPath = await findProjectFile([
272
+ "src/schema-registry.json",
273
+ "dist/schema-registry.json",
274
+ "schema-registry.json",
275
+ ]);
276
+ if (!registryPath) {
277
+ return {
278
+ content: [
279
+ {
280
+ type: "text",
281
+ text: "No schema-registry.json found. Run 'quickback compile' to generate it.",
282
+ },
283
+ ],
284
+ };
285
+ }
286
+ const content = await fs.readFile(registryPath, "utf-8");
287
+ return {
288
+ content: [
289
+ {
290
+ type: "text",
291
+ text: `# Schema Registry\n\n\`\`\`json\n${content}\n\`\`\``,
292
+ },
293
+ ],
294
+ };
295
+ });
296
+ // --- Helpers ---
297
+ async function findProjectFile(candidates) {
298
+ const cwd = process.cwd();
299
+ for (const candidate of candidates) {
300
+ const full = join(cwd, candidate);
301
+ try {
302
+ await fs.access(full);
303
+ return full;
304
+ }
305
+ catch {
306
+ // Not found, try next
307
+ }
308
+ }
309
+ return null;
310
+ }
311
+ async function findProjectDir(candidates) {
312
+ const cwd = process.cwd();
313
+ for (const candidate of candidates) {
314
+ const full = join(cwd, candidate);
315
+ try {
316
+ const stat = await fs.stat(full);
317
+ if (stat.isDirectory())
318
+ return full;
319
+ }
320
+ catch {
321
+ // Not found, try next
322
+ }
323
+ }
324
+ return null;
325
+ }
326
+ // --- Start Server ---
327
+ const transport = new StdioServerTransport();
328
+ await server.connect(transport);
329
+ }
330
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}