claude-code-sync 0.1.2 → 0.1.4

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.
Files changed (3) hide show
  1. package/README.md +70 -1
  2. package/dist/cli.js +275 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -36,23 +36,84 @@ Enter when prompted:
36
36
 
37
37
  ### 3. Add to Claude Code
38
38
 
39
- Add the plugin to your Claude Code configuration. Sessions will sync automatically.
39
+ **Option A: Use the setup command (recommended)**
40
+
41
+ ```bash
42
+ claude-code-sync setup
43
+ ```
44
+
45
+ This automatically configures the hooks in `~/.claude/settings.json`.
46
+
47
+ **Option B: One-liner (copy and paste)**
48
+
49
+ ```bash
50
+ mkdir -p ~/.claude && cat > ~/.claude/settings.json << 'EOF'
51
+ {
52
+ "hooks": {
53
+ "SessionStart": [{ "hooks": [{ "type": "command", "command": "claude-code-sync hook SessionStart" }] }],
54
+ "SessionEnd": [{ "hooks": [{ "type": "command", "command": "claude-code-sync hook SessionEnd" }] }],
55
+ "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "claude-code-sync hook UserPromptSubmit" }] }],
56
+ "PostToolUse": [{ "matcher": "*", "hooks": [{ "type": "command", "command": "claude-code-sync hook PostToolUse" }] }],
57
+ "Stop": [{ "matcher": "*", "hooks": [{ "type": "command", "command": "claude-code-sync hook Stop" }] }]
58
+ }
59
+ }
60
+ EOF
61
+ ```
62
+
63
+ ### 4. Verify Setup
64
+
65
+ ```bash
66
+ claude-code-sync verify
67
+ ```
68
+
69
+ You should see:
70
+
71
+ ```
72
+ OpenSync Setup Verification
73
+
74
+ Credentials: OK
75
+ Convex URL: https://your-project.convex.cloud
76
+ API Key: osk_****...****
77
+
78
+ Claude Code Config: OK
79
+ Config file: ~/.claude/settings.json
80
+ Hooks registered: claude-code-sync
81
+
82
+ Ready! Start Claude Code and sessions will sync automatically.
83
+ ```
84
+
85
+ Sessions will now sync automatically when you use Claude Code.
40
86
 
41
87
  ## CLI Commands
42
88
 
43
89
  | Command | Description |
44
90
  |---------|-------------|
45
91
  | `claude-code-sync login` | Configure Convex URL and API Key |
92
+ | `claude-code-sync setup` | Add hooks to Claude Code settings |
93
+ | `claude-code-sync verify` | Verify credentials and Claude Code config |
46
94
  | `claude-code-sync logout` | Clear stored credentials |
47
95
  | `claude-code-sync status` | Show connection status |
48
96
  | `claude-code-sync config` | Show current configuration |
49
97
  | `claude-code-sync config --json` | Show config as JSON |
50
98
  | `claude-code-sync set <key> <value>` | Update a config value |
99
+ | `claude-code-sync hook <event>` | Handle Claude Code hook events (internal) |
51
100
  | `claude-code-sync --version` | Show version number |
52
101
  | `claude-code-sync --help` | Show help |
53
102
 
54
103
  See [full command reference](docs/commands.md) for detailed usage, troubleshooting, and examples.
55
104
 
105
+ ## Hook Events
106
+
107
+ The plugin captures these Claude Code events:
108
+
109
+ | Event | Description |
110
+ |-------|-------------|
111
+ | `SessionStart` | Fires when a coding session begins |
112
+ | `SessionEnd` | Fires when a session terminates |
113
+ | `UserPromptSubmit` | Fires when you submit a prompt |
114
+ | `PostToolUse` | Fires after each tool execution |
115
+ | `Stop` | Fires when Claude finishes responding |
116
+
56
117
  ### Configuration Options
57
118
 
58
119
  | Option | Type | Default | Description |
@@ -117,6 +178,13 @@ claude-code-sync login
117
178
 
118
179
  See [troubleshooting guide](docs/commands.md#troubleshooting) for more solutions.
119
180
 
181
+ ### Need Help?
182
+
183
+ If you run into issues or have questions:
184
+
185
+ - **Report a bug or request a feature:** [GitHub Issues](https://github.com/waynesutton/claude-code-sync/issues)
186
+ - Check existing issues for solutions to common problems
187
+
120
188
  ## Requirements
121
189
 
122
190
  - Node.js 18 or later
@@ -126,6 +194,7 @@ See [troubleshooting guide](docs/commands.md#troubleshooting) for more solutions
126
194
  ## Links
127
195
 
128
196
  - [claude-code-sync Repository](https://github.com/waynesutton/claude-code-sync)
197
+ - [Issues and Support](https://github.com/waynesutton/claude-code-sync/issues)
129
198
  - [OpenSync Backend](https://github.com/waynesutton/opensync)
130
199
  - [OpenSync Dashboard](https://opensyncsessions.netlify.app)
131
200
  - [npm Package](https://www.npmjs.com/package/claude-code-sync)
package/dist/cli.js CHANGED
@@ -235,6 +235,280 @@ program
235
235
  (0, index_1.saveConfig)(config);
236
236
  console.log(`Set ${key} = ${boolValue}`);
237
237
  });
238
+ // ============================================================================
239
+ // Setup Command (configures Claude Code hooks)
240
+ // ============================================================================
241
+ // Claude Code hooks configuration
242
+ const CLAUDE_HOOKS_CONFIG = {
243
+ hooks: {
244
+ SessionStart: [
245
+ {
246
+ hooks: [
247
+ {
248
+ type: "command",
249
+ command: "claude-code-sync hook SessionStart",
250
+ },
251
+ ],
252
+ },
253
+ ],
254
+ SessionEnd: [
255
+ {
256
+ hooks: [
257
+ {
258
+ type: "command",
259
+ command: "claude-code-sync hook SessionEnd",
260
+ },
261
+ ],
262
+ },
263
+ ],
264
+ UserPromptSubmit: [
265
+ {
266
+ hooks: [
267
+ {
268
+ type: "command",
269
+ command: "claude-code-sync hook UserPromptSubmit",
270
+ },
271
+ ],
272
+ },
273
+ ],
274
+ PostToolUse: [
275
+ {
276
+ matcher: "*",
277
+ hooks: [
278
+ {
279
+ type: "command",
280
+ command: "claude-code-sync hook PostToolUse",
281
+ },
282
+ ],
283
+ },
284
+ ],
285
+ Stop: [
286
+ {
287
+ matcher: "*",
288
+ hooks: [
289
+ {
290
+ type: "command",
291
+ command: "claude-code-sync hook Stop",
292
+ },
293
+ ],
294
+ },
295
+ ],
296
+ },
297
+ };
298
+ program
299
+ .command("setup")
300
+ .description("Add hooks to Claude Code settings (configures ~/.claude/settings.json)")
301
+ .option("--force", "Overwrite existing hooks configuration")
302
+ .action(async (options) => {
303
+ const claudeDir = path.join(process.env.HOME || "~", ".claude");
304
+ const settingsPath = path.join(claudeDir, "settings.json");
305
+ console.log("\n Claude Code Sync - Setup\n");
306
+ // Check if plugin credentials are configured
307
+ const config = (0, index_1.loadConfig)();
308
+ if (!config) {
309
+ console.log("Warning: Plugin not configured yet.");
310
+ console.log(" Run 'claude-code-sync login' first to set up credentials.\n");
311
+ }
312
+ // Create .claude directory if needed
313
+ if (!fs.existsSync(claudeDir)) {
314
+ fs.mkdirSync(claudeDir, { recursive: true });
315
+ console.log("Created ~/.claude directory");
316
+ }
317
+ // Check for existing settings
318
+ let existingSettings = {};
319
+ let hasExistingHooks = false;
320
+ if (fs.existsSync(settingsPath)) {
321
+ try {
322
+ const content = fs.readFileSync(settingsPath, "utf-8");
323
+ existingSettings = JSON.parse(content);
324
+ hasExistingHooks = !!existingSettings.hooks;
325
+ console.log("Found existing settings.json");
326
+ }
327
+ catch {
328
+ console.log("Warning: Could not parse existing settings.json, will create new one");
329
+ }
330
+ }
331
+ // Handle existing hooks
332
+ if (hasExistingHooks && !options.force) {
333
+ console.log("\nExisting hooks configuration found.");
334
+ console.log(" Use --force to overwrite, or manually merge the hooks.\n");
335
+ console.log("To manually add, include these hooks in your settings.json:");
336
+ console.log(JSON.stringify(CLAUDE_HOOKS_CONFIG, null, 2));
337
+ process.exit(1);
338
+ }
339
+ // Merge settings
340
+ const newSettings = {
341
+ ...existingSettings,
342
+ ...CLAUDE_HOOKS_CONFIG,
343
+ };
344
+ // Write settings
345
+ try {
346
+ fs.writeFileSync(settingsPath, JSON.stringify(newSettings, null, 2));
347
+ console.log("\nClaude Code hooks configured!");
348
+ console.log(` Settings file: ${settingsPath}`);
349
+ console.log("\nSetup complete. Sessions will sync automatically.\n");
350
+ }
351
+ catch (error) {
352
+ console.error("Error writing settings:", error);
353
+ process.exit(1);
354
+ }
355
+ });
356
+ program
357
+ .command("verify")
358
+ .description("Verify credentials and Claude Code configuration")
359
+ .action(async () => {
360
+ console.log("\n OpenSync Setup Verification\n");
361
+ // Check credentials
362
+ const config = (0, index_1.loadConfig)();
363
+ if (config) {
364
+ console.log("Credentials: OK");
365
+ console.log(` Convex URL: ${config.convexUrl}`);
366
+ console.log(` API Key: ${maskApiKey(config.apiKey)}`);
367
+ }
368
+ else {
369
+ console.log("Credentials: NOT CONFIGURED");
370
+ console.log(" Run 'claude-code-sync login' to set up");
371
+ }
372
+ // Check Claude Code config
373
+ const settingsPath = path.join(process.env.HOME || "~", ".claude", "settings.json");
374
+ let hooksConfigured = false;
375
+ if (fs.existsSync(settingsPath)) {
376
+ try {
377
+ const content = fs.readFileSync(settingsPath, "utf-8");
378
+ const settings = JSON.parse(content);
379
+ hooksConfigured = !!settings.hooks?.SessionStart;
380
+ }
381
+ catch {
382
+ // Ignore parse errors
383
+ }
384
+ }
385
+ console.log("");
386
+ if (hooksConfigured) {
387
+ console.log("Claude Code Config: OK");
388
+ console.log(` Config file: ${settingsPath}`);
389
+ console.log(" Hooks registered: claude-code-sync");
390
+ }
391
+ else {
392
+ console.log("Claude Code Config: NOT CONFIGURED");
393
+ console.log(" Run 'claude-code-sync setup' to configure hooks");
394
+ }
395
+ // Test connection if credentials exist
396
+ if (config) {
397
+ console.log("\nTesting connection...");
398
+ const client = new index_1.SyncClient(config);
399
+ const connected = await client.testConnection();
400
+ if (connected) {
401
+ console.log("Connection: OK\n");
402
+ }
403
+ else {
404
+ console.log("Connection: FAILED\n");
405
+ process.exit(1);
406
+ }
407
+ }
408
+ if (config && hooksConfigured) {
409
+ console.log("Ready! Start Claude Code and sessions will sync automatically.\n");
410
+ }
411
+ else {
412
+ console.log("");
413
+ process.exit(1);
414
+ }
415
+ });
416
+ // ============================================================================
417
+ // Hook Command (for Claude Code integration)
418
+ // ============================================================================
419
+ program
420
+ .command("hook <event>")
421
+ .description("Handle Claude Code hook events (reads stdin)")
422
+ .action(async (event) => {
423
+ const config = (0, index_1.loadConfig)();
424
+ if (!config) {
425
+ // Exit silently if not configured (don't block Claude Code)
426
+ process.exit(0);
427
+ }
428
+ if (config.autoSync === false) {
429
+ process.exit(0);
430
+ }
431
+ // Read JSON input from stdin
432
+ let input = "";
433
+ for await (const chunk of process.stdin) {
434
+ input += chunk;
435
+ }
436
+ if (!input.trim()) {
437
+ process.exit(0);
438
+ }
439
+ try {
440
+ const data = JSON.parse(input);
441
+ const client = new index_1.SyncClient(config);
442
+ switch (event) {
443
+ case "SessionStart": {
444
+ const session = {
445
+ sessionId: data.session_id,
446
+ source: "claude-code",
447
+ cwd: data.cwd,
448
+ permissionMode: data.permission_mode,
449
+ startType: data.source === "startup" ? "new" : data.source,
450
+ startedAt: new Date().toISOString(),
451
+ projectPath: data.cwd,
452
+ projectName: data.cwd ? data.cwd.split("/").pop() : undefined,
453
+ };
454
+ await client.syncSession(session);
455
+ break;
456
+ }
457
+ case "SessionEnd": {
458
+ const session = {
459
+ sessionId: data.session_id,
460
+ source: "claude-code",
461
+ endReason: data.reason,
462
+ endedAt: new Date().toISOString(),
463
+ };
464
+ await client.syncSession(session);
465
+ break;
466
+ }
467
+ case "UserPromptSubmit": {
468
+ const message = {
469
+ sessionId: data.session_id,
470
+ messageId: `${data.session_id}-${Date.now()}`,
471
+ source: "claude-code",
472
+ role: "user",
473
+ content: data.prompt,
474
+ timestamp: new Date().toISOString(),
475
+ };
476
+ await client.syncMessage(message);
477
+ break;
478
+ }
479
+ case "PostToolUse": {
480
+ if (!config.syncToolCalls)
481
+ break;
482
+ const message = {
483
+ sessionId: data.session_id,
484
+ messageId: `${data.session_id}-tool-${Date.now()}`,
485
+ source: "claude-code",
486
+ role: "assistant",
487
+ toolName: data.tool_name,
488
+ toolArgs: data.tool_input,
489
+ toolResult: data.tool_result?.output || data.tool_result?.error,
490
+ timestamp: new Date().toISOString(),
491
+ };
492
+ await client.syncMessage(message);
493
+ break;
494
+ }
495
+ case "Stop": {
496
+ // Stop event indicates Claude finished responding
497
+ // We could track this but for now just acknowledge
498
+ break;
499
+ }
500
+ default:
501
+ // Unknown event, ignore
502
+ break;
503
+ }
504
+ process.exit(0);
505
+ }
506
+ catch (error) {
507
+ // Log to stderr but don't block Claude Code
508
+ console.error(`[claude-code-sync] Error: ${error}`);
509
+ process.exit(0);
510
+ }
511
+ });
238
512
  // Parse and run
239
513
  program.parse();
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlDQUFvQztBQUNwQyxtREFBcUM7QUFDckMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixtQ0FNaUI7QUFFakIsaUNBQWlDO0FBQ2pDLFNBQVMsVUFBVTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQkFBTyxFQUFFLENBQUM7QUFFOUIsT0FBTztLQUNKLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztLQUN4QixXQUFXLENBQUMsaURBQWlELENBQUM7S0FDOUQsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFFekIsK0VBQStFO0FBQy9FLG1CQUFtQjtBQUNuQiwrRUFBK0U7QUFFL0UsU0FBUyxNQUFNLENBQUMsUUFBZ0I7SUFDOUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUNsQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0tBQ3ZCLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUs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QUFDO0lBRXZFLDBCQUEwQjtJQUMxQixJQUFJLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO1NBQU0sSUFBSSxHQUFHLEtBQUssZUFBZSxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDbkMsQ0FBQztTQUFNLElBQUksR0FBRyxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFBLGtCQUFVLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsTUFBTSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQyxDQUFDO0FBRUwsZ0JBQWdCO0FBQ2hCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuLyoqXG4gKiBDbGF1ZGUgQ29kZSBTeW5jIENMSVxuICpcbiAqIENvbW1hbmRzOlxuICogICBsb2dpbiAgIC0gQ29uZmlndXJlIENvbnZleCBVUkwgYW5kIEFQSSBLZXlcbiAqICAgbG9nb3V0ICAtIENsZWFyIHN0b3JlZCBjcmVkZW50aWFsc1xuICogICBzdGF0dXMgIC0gU2hvdyBjb25uZWN0aW9uIHN0YXR1c1xuICogICBjb25maWcgIC0gU2hvdyBjdXJyZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSBcInJlYWRsaW5lXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7XG4gIGxvYWRDb25maWcsXG4gIHNhdmVDb25maWcsXG4gIGNsZWFyQ29uZmlnLFxuICBTeW5jQ2xpZW50LFxuICBDb25maWcsXG59IGZyb20gXCIuL2luZGV4XCI7XG5cbi8vIFJlYWQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBrZ1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwicGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBrZ1BhdGgsIFwidXRmLThcIikpO1xuICAgIHJldHVybiBwa2cudmVyc2lvbiB8fCBcIjAuMC4wXCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcIjAuMC4wXCI7XG4gIH1cbn1cblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoXCJjbGF1ZGUtY29kZS1zeW5jXCIpXG4gIC5kZXNjcmlwdGlvbihcIlN5bmMgQ2xhdWRlIENvZGUgc2Vzc2lvbnMgdG8gT3BlblN5bmMgZGFzaGJvYXJkXCIpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhlbHBlciBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcHJvbXB0KHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24ocXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFza0FwaUtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChrZXkubGVuZ3RoIDw9IDgpIHJldHVybiBcIioqKipcIjtcbiAgcmV0dXJuIGtleS5zdWJzdHJpbmcoMCwgNCkgKyBcIioqKipcIiArIGtleS5zdWJzdHJpbmcoa2V5Lmxlbmd0aCAtIDQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21tYW5kc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwibG9naW5cIilcbiAgLmRlc2NyaXB0aW9uKFwiQ29uZmlndXJlIENvbnZleCBVUkwgYW5kIEFQSSBLZXlcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJcXG4gIENsYXVkZSBDb2RlIFN5bmMgLSBMb2dpblxcblwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkdldCB5b3VyIEFQSSBrZXkgZnJvbSB5b3VyIE9wZW5TeW5jIGRhc2hib2FyZDpcIik7XG4gICAgY29uc29sZS5sb2coXCIgIDEuIEdvIHRvIFNldHRpbmdzXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiICAyLiBDbGljayAnR2VuZXJhdGUgQVBJIEtleSdcIik7XG4gICAgY29uc29sZS5sb2coXCIgIDMuIENvcHkgdGhlIGtleSAoc3RhcnRzIHdpdGggb3NrXylcXG5cIik7XG5cbiAgICBjb25zdCBjb252ZXhVcmwgPSBhd2FpdCBwcm9tcHQoXCJDb252ZXggVVJMIChlLmcuLCBodHRwczovL3lvdXItcHJvamVjdC5jb252ZXguY2xvdWQpOiBcIik7XG5cbiAgICBpZiAoIWNvbnZleFVybCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBDb252ZXggVVJMIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmICghY29udmV4VXJsLmluY2x1ZGVzKFwiY29udmV4LmNsb3VkXCIpICYmICFjb252ZXhVcmwuaW5jbHVkZXMoXCJjb252ZXguc2l0ZVwiKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBJbnZhbGlkIENvbnZleCBVUkwuIE11c3QgY29udGFpbiBjb252ZXguY2xvdWQgb3IgY29udmV4LnNpdGVcIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpS2V5ID0gYXdhaXQgcHJvbXB0KFwiQVBJIEtleSAob3NrXy4uLik6IFwiKTtcblxuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IEFQSSBLZXkgaXMgcmVxdWlyZWRcIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKCFhcGlLZXkuc3RhcnRzV2l0aChcIm9za19cIikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogSW52YWxpZCBBUEkgS2V5LiBNdXN0IHN0YXJ0IHdpdGggb3NrX1wiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IENvbmZpZyA9IHtcbiAgICAgIGNvbnZleFVybCxcbiAgICAgIGFwaUtleSxcbiAgICAgIGF1dG9TeW5jOiB0cnVlLFxuICAgICAgc3luY1Rvb2xDYWxsczogdHJ1ZSxcbiAgICAgIHN5bmNUaGlua2luZzogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIFRlc3QgY29ubmVjdGlvblxuICAgIGNvbnNvbGUubG9nKFwiXFxuVGVzdGluZyBjb25uZWN0aW9uLi4uXCIpO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTeW5jQ2xpZW50KGNvbmZpZyk7XG4gICAgY29uc3QgY29ubmVjdGVkID0gYXdhaXQgY2xpZW50LnRlc3RDb25uZWN0aW9uKCk7XG5cbiAgICBpZiAoIWNvbm5lY3RlZCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBDb3VsZCBub3QgY29ubmVjdCB0byBDb252ZXggYmFja2VuZFwiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCIgICBDaGVjayB5b3VyIFVSTCBhbmQgdHJ5IGFnYWluXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFNhdmUgY29uZmlnXG4gICAgc2F2ZUNvbmZpZyhjb25maWcpO1xuICAgIGNvbnNvbGUubG9nKFwiXFxuQ29uZmlndXJhdGlvbiBzYXZlZCFcIik7XG4gICAgY29uc29sZS5sb2coYCAgIFVSTDogJHtjb252ZXhVcmx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgIEtleTogJHttYXNrQXBpS2V5KGFwaUtleSl9YCk7XG4gICAgY29uc29sZS5sb2coXCJcXG5BZGQgdGhlIHBsdWdpbiB0byB5b3VyIENsYXVkZSBDb2RlIGNvbmZpZyB0byBzdGFydCBzeW5jaW5nLlxcblwiKTtcbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJsb2dvdXRcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ2xlYXIgc3RvcmVkIGNyZWRlbnRpYWxzXCIpXG4gIC5hY3Rpb24oKCkgPT4ge1xuICAgIGNsZWFyQ29uZmlnKCk7XG4gICAgY29uc29sZS5sb2coXCJDcmVkZW50aWFscyBjbGVhcmVkXCIpO1xuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInN0YXR1c1wiKVxuICAuZGVzY3JpcHRpb24oXCJTaG93IGNvbm5lY3Rpb24gc3RhdHVzXCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICAgIGNvbnNvbGUubG9nKFwiXFxuICBDbGF1ZGUgQ29kZSBTeW5jIC0gU3RhdHVzXFxuXCIpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiTm90IGNvbmZpZ3VyZWRcIik7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgdG8gc2V0IHVwXFxuXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFwiQ29uZmlndXJhdGlvbjpcIik7XG4gICAgY29uc29sZS5sb2coYCAgQ29udmV4IFVSTDogJHtjb25maWcuY29udmV4VXJsfWApO1xuICAgIGNvbnNvbGUubG9nKGAgIEFQSSBLZXk6ICAgICR7bWFza0FwaUtleShjb25maWcuYXBpS2V5KX1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBBdXRvIFN5bmM6ICAke2NvbmZpZy5hdXRvU3luYyAhPT0gZmFsc2UgPyBcImVuYWJsZWRcIiA6IFwiZGlzYWJsZWRcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBUb29sIENhbGxzOiAke2NvbmZpZy5zeW5jVG9vbENhbGxzICE9PSBmYWxzZSA/IFwiZW5hYmxlZFwiIDogXCJkaXNhYmxlZFwifWApO1xuICAgIGNvbnNvbGUubG9nKGAgIFRoaW5raW5nOiAgICR7Y29uZmlnLnN5bmNUaGlua2luZyA/IFwiZW5hYmxlZFwiIDogXCJkaXNhYmxlZFwifWApO1xuXG4gICAgY29uc29sZS5sb2coXCJcXG5UZXN0aW5nIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcbiAgICBjb25zdCBjb25uZWN0ZWQgPSBhd2FpdCBjbGllbnQudGVzdENvbm5lY3Rpb24oKTtcblxuICAgIGlmIChjb25uZWN0ZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29ubmVjdGVkIHRvIENvbnZleCBiYWNrZW5kXFxuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBDb3VsZCBub3QgY29ubmVjdCB0byBDb252ZXggYmFja2VuZFxcblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwiY29uZmlnXCIpXG4gIC5kZXNjcmlwdGlvbihcIlNob3cgY3VycmVudCBjb25maWd1cmF0aW9uXCIpXG4gIC5vcHRpb24oXCItLWpzb25cIiwgXCJPdXRwdXQgYXMgSlNPTlwiKVxuICAuYWN0aW9uKChvcHRpb25zOiB7IGpzb24/OiBib29sZWFuIH0pID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGNvbmZpZ3VyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm90IGNvbmZpZ3VyZWQuIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgdG8gc2V0IHVwLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uZmlndXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbnZleFVybDogY29uZmlnLmNvbnZleFVybCxcbiAgICAgICAgICAgIGFwaUtleTogbWFza0FwaUtleShjb25maWcuYXBpS2V5KSxcbiAgICAgICAgICAgIGF1dG9TeW5jOiBjb25maWcuYXV0b1N5bmMgIT09IGZhbHNlLFxuICAgICAgICAgICAgc3luY1Rvb2xDYWxsczogY29uZmlnLnN5bmNUb29sQ2FsbHMgIT09IGZhbHNlLFxuICAgICAgICAgICAgc3luY1RoaW5raW5nOiBjb25maWcuc3luY1RoaW5raW5nID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuICBDdXJyZW50IENvbmZpZ3VyYXRpb25cXG5cIik7XG4gICAgICBjb25zb2xlLmxvZyhgQ29udmV4IFVSTDogICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBBUEkgS2V5OiAgICAgJHttYXNrQXBpS2V5KGNvbmZpZy5hcGlLZXkpfWApO1xuICAgICAgY29uc29sZS5sb2coYEF1dG8gU3luYzogICAke2NvbmZpZy5hdXRvU3luYyAhPT0gZmFsc2V9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgVG9vbCBDYWxsczogICR7Y29uZmlnLnN5bmNUb29sQ2FsbHMgIT09IGZhbHNlfWApO1xuICAgICAgY29uc29sZS5sb2coYFRoaW5raW5nOiAgICAke2NvbmZpZy5zeW5jVGhpbmtpbmcgPT09IHRydWV9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuQ29uZmlnIGZpbGU6IH4vLmNvbmZpZy9jbGF1ZGUtY29kZS1zeW5jL2NvbmZpZy5qc29uXFxuYCk7XG4gICAgfVxuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInNldCA8a2V5PiA8dmFsdWU+XCIpXG4gIC5kZXNjcmlwdGlvbihcIlNldCBhIGNvbmZpZ3VyYXRpb24gdmFsdWVcIilcbiAgLmFjdGlvbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihcIk5vdCBjb25maWd1cmVkLiBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIGZpcnN0LlwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEtleXMgPSBbXCJhdXRvU3luY1wiLCBcInN5bmNUb29sQ2FsbHNcIiwgXCJzeW5jVGhpbmtpbmdcIl07XG4gICAgaWYgKCF2YWxpZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBrZXkuIFZhbGlkIGtleXM6ICR7dmFsaWRLZXlzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBib29sVmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUgPT09IFwiMVwiIHx8IHZhbHVlID09PSBcInllc1wiO1xuICAgIFxuICAgIC8vIFR5cGUtc2FmZSBjb25maWcgdXBkYXRlXG4gICAgaWYgKGtleSA9PT0gXCJhdXRvU3luY1wiKSB7XG4gICAgICBjb25maWcuYXV0b1N5bmMgPSBib29sVmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3luY1Rvb2xDYWxsc1wiKSB7XG4gICAgICBjb25maWcuc3luY1Rvb2xDYWxscyA9IGJvb2xWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzeW5jVGhpbmtpbmdcIikge1xuICAgICAgY29uZmlnLnN5bmNUaGlua2luZyA9IGJvb2xWYWx1ZTtcbiAgICB9XG5cbiAgICBzYXZlQ29uZmlnKGNvbmZpZyk7XG4gICAgY29uc29sZS5sb2coYFNldCAke2tleX0gPSAke2Jvb2xWYWx1ZX1gKTtcbiAgfSk7XG5cbi8vIFBhcnNlIGFuZCBydW5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
514
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlDQUFvQztBQUNwQyxtREFBcUM7QUFDckMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixtQ0FNaUI7QUFFakIsaUNBQWlDO0FBQ2pDLFNBQVMsVUFBVTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQkFBTyxFQUFFLENBQUM7QUFFOUIsT0FBTztLQUNKLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztLQUN4QixXQUFXLENBQUMsaURBQWlELENBQUM7S0FDOUQsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFFekIsK0VBQStFO0FBQy9FLG1CQUFtQjtBQUNuQiwrRUFBK0U7QUFFL0UsU0FBUyxNQUFNLENBQUMsUUFBZ0I7SUFDOUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUNsQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0tBQ3ZCLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUs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QUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSztvQkFDL0QsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2lCQUNwQyxDQUFDO2dCQUNGLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtZQUNSLENBQUM7WUFFRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osa0RBQWtEO2dCQUNsRCxtREFBbUQ7Z0JBQ25ELE1BQU07WUFDUixDQUFDO1lBRUQ7Z0JBQ0Usd0JBQXdCO2dCQUN4QixNQUFNO1FBQ1YsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZiw0Q0FBNEM7UUFDNUMsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVMLGdCQUFnQjtBQUNoQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qKlxuICogQ2xhdWRlIENvZGUgU3luYyBDTElcbiAqXG4gKiBDb21tYW5kczpcbiAqICAgbG9naW4gICAtIENvbmZpZ3VyZSBDb252ZXggVVJMIGFuZCBBUEkgS2V5XG4gKiAgIGxvZ291dCAgLSBDbGVhciBzdG9yZWQgY3JlZGVudGlhbHNcbiAqICAgc3RhdHVzICAtIFNob3cgY29ubmVjdGlvbiBzdGF0dXNcbiAqICAgY29uZmlnICAtIFNob3cgY3VycmVudCBjb25maWd1cmF0aW9uXG4gKi9cblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJyZWFkbGluZVwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICBsb2FkQ29uZmlnLFxuICBzYXZlQ29uZmlnLFxuICBjbGVhckNvbmZpZyxcbiAgU3luY0NsaWVudCxcbiAgQ29uZmlnLFxufSBmcm9tIFwiLi9pbmRleFwiO1xuXG4vLyBSZWFkIHZlcnNpb24gZnJvbSBwYWNrYWdlLmpzb25cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwa2dQYXRoLCBcInV0Zi04XCIpKTtcbiAgICByZXR1cm4gcGtnLnZlcnNpb24gfHwgXCIwLjAuMFwiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCIwLjAuMFwiO1xuICB9XG59XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKFwiY2xhdWRlLWNvZGUtc3luY1wiKVxuICAuZGVzY3JpcHRpb24oXCJTeW5jIENsYXVkZSBDb2RlIHNlc3Npb25zIHRvIE9wZW5TeW5jIGRhc2hib2FyZFwiKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIZWxwZXIgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKHF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hc2tBcGlLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoa2V5Lmxlbmd0aCA8PSA4KSByZXR1cm4gXCIqKioqXCI7XG4gIHJldHVybiBrZXkuc3Vic3RyaW5nKDAsIDQpICsgXCIqKioqXCIgKyBrZXkuc3Vic3RyaW5nKGtleS5sZW5ndGggLSA0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tbWFuZHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxucHJvZ3JhbVxuICAuY29tbWFuZChcImxvZ2luXCIpXG4gIC5kZXNjcmlwdGlvbihcIkNvbmZpZ3VyZSBDb252ZXggVVJMIGFuZCBBUEkgS2V5XCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiXFxuICBDbGF1ZGUgQ29kZSBTeW5jIC0gTG9naW5cXG5cIik7XG4gICAgY29uc29sZS5sb2coXCJHZXQgeW91ciBBUEkga2V5IGZyb20geW91ciBPcGVuU3luYyBkYXNoYm9hcmQ6XCIpO1xuICAgIGNvbnNvbGUubG9nKFwiICAxLiBHbyB0byBTZXR0aW5nc1wiKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgMi4gQ2xpY2sgJ0dlbmVyYXRlIEFQSSBLZXknXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiICAzLiBDb3B5IHRoZSBrZXkgKHN0YXJ0cyB3aXRoIG9za18pXFxuXCIpO1xuXG4gICAgY29uc3QgY29udmV4VXJsID0gYXdhaXQgcHJvbXB0KFwiQ29udmV4IFVSTCAoZS5nLiwgaHR0cHM6Ly95b3VyLXByb2plY3QuY29udmV4LmNsb3VkKTogXCIpO1xuXG4gICAgaWYgKCFjb252ZXhVcmwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogQ29udmV4IFVSTCBpcyByZXF1aXJlZFwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbnZleFVybC5pbmNsdWRlcyhcImNvbnZleC5jbG91ZFwiKSAmJiAhY29udmV4VXJsLmluY2x1ZGVzKFwiY29udmV4LnNpdGVcIikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogSW52YWxpZCBDb252ZXggVVJMLiBNdXN0IGNvbnRhaW4gY29udmV4LmNsb3VkIG9yIGNvbnZleC5zaXRlXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaUtleSA9IGF3YWl0IHByb21wdChcIkFQSSBLZXkgKG9za18uLi4pOiBcIik7XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBBUEkgS2V5IGlzIHJlcXVpcmVkXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmICghYXBpS2V5LnN0YXJ0c1dpdGgoXCJvc2tfXCIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IEludmFsaWQgQVBJIEtleS4gTXVzdCBzdGFydCB3aXRoIG9za19cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBDb25maWcgPSB7XG4gICAgICBjb252ZXhVcmwsXG4gICAgICBhcGlLZXksXG4gICAgICBhdXRvU3luYzogdHJ1ZSxcbiAgICAgIHN5bmNUb29sQ2FsbHM6IHRydWUsXG4gICAgICBzeW5jVGhpbmtpbmc6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBUZXN0IGNvbm5lY3Rpb25cbiAgICBjb25zb2xlLmxvZyhcIlxcblRlc3RpbmcgY29ubmVjdGlvbi4uLlwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuXG4gICAgaWYgKCFjb25uZWN0ZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogQ291bGQgbm90IGNvbm5lY3QgdG8gQ29udmV4IGJhY2tlbmRcIik7XG4gICAgICBjb25zb2xlLmVycm9yKFwiICAgQ2hlY2sgeW91ciBVUkwgYW5kIHRyeSBhZ2FpblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIGNvbmZpZ1xuICAgIHNhdmVDb25maWcoY29uZmlnKTtcbiAgICBjb25zb2xlLmxvZyhcIlxcbkNvbmZpZ3VyYXRpb24gc2F2ZWQhXCIpO1xuICAgIGNvbnNvbGUubG9nKGAgICBVUkw6ICR7Y29udmV4VXJsfWApO1xuICAgIGNvbnNvbGUubG9nKGAgICBLZXk6ICR7bWFza0FwaUtleShhcGlLZXkpfWApO1xuICAgIGNvbnNvbGUubG9nKFwiXFxuQWRkIHRoZSBwbHVnaW4gdG8geW91ciBDbGF1ZGUgQ29kZSBjb25maWcgdG8gc3RhcnQgc3luY2luZy5cXG5cIik7XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gIC5kZXNjcmlwdGlvbihcIkNsZWFyIHN0b3JlZCBjcmVkZW50aWFsc1wiKVxuICAuYWN0aW9uKCgpID0+IHtcbiAgICBjbGVhckNvbmZpZygpO1xuICAgIGNvbnNvbGUubG9nKFwiQ3JlZGVudGlhbHMgY2xlYXJlZFwiKTtcbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJzdGF0dXNcIilcbiAgLmRlc2NyaXB0aW9uKFwiU2hvdyBjb25uZWN0aW9uIHN0YXR1c1wiKVxuICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcbiAgQ2xhdWRlIENvZGUgU3luYyAtIFN0YXR1c1xcblwiKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vdCBjb25maWd1cmVkXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cFxcblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcIkNvbmZpZ3VyYXRpb246XCIpO1xuICAgIGNvbnNvbGUubG9nKGAgIENvbnZleCBVUkw6ICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBBUEkgS2V5OiAgICAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG4gICAgY29uc29sZS5sb2coYCAgQXV0byBTeW5jOiAgJHtjb25maWcuYXV0b1N5bmMgIT09IGZhbHNlID8gXCJlbmFibGVkXCIgOiBcImRpc2FibGVkXCJ9YCk7XG4gICAgY29uc29sZS5sb2coYCAgVG9vbCBDYWxsczogJHtjb25maWcuc3luY1Rvb2xDYWxscyAhPT0gZmFsc2UgPyBcImVuYWJsZWRcIiA6IFwiZGlzYWJsZWRcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBUaGlua2luZzogICAke2NvbmZpZy5zeW5jVGhpbmtpbmcgPyBcImVuYWJsZWRcIiA6IFwiZGlzYWJsZWRcIn1gKTtcblxuICAgIGNvbnNvbGUubG9nKFwiXFxuVGVzdGluZyBjb25uZWN0aW9uLi4uXCIpO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTeW5jQ2xpZW50KGNvbmZpZyk7XG4gICAgY29uc3QgY29ubmVjdGVkID0gYXdhaXQgY2xpZW50LnRlc3RDb25uZWN0aW9uKCk7XG5cbiAgICBpZiAoY29ubmVjdGVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNvbm5lY3RlZCB0byBDb252ZXggYmFja2VuZFxcblwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJFcnJvcjogQ291bGQgbm90IGNvbm5lY3QgdG8gQ29udmV4IGJhY2tlbmRcXG5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcImNvbmZpZ1wiKVxuICAuZGVzY3JpcHRpb24oXCJTaG93IGN1cnJlbnQgY29uZmlndXJhdGlvblwiKVxuICAub3B0aW9uKFwiLS1qc29uXCIsIFwiT3V0cHV0IGFzIEpTT05cIilcbiAgLmFjdGlvbigob3B0aW9uczogeyBqc29uPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBjb25maWd1cmVkOiBmYWxzZSB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk5vdCBjb25maWd1cmVkLiBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cC5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyZWQ6IHRydWUsXG4gICAgICAgICAgICBjb252ZXhVcmw6IGNvbmZpZy5jb252ZXhVcmwsXG4gICAgICAgICAgICBhcGlLZXk6IG1hc2tBcGlLZXkoY29uZmlnLmFwaUtleSksXG4gICAgICAgICAgICBhdXRvU3luYzogY29uZmlnLmF1dG9TeW5jICE9PSBmYWxzZSxcbiAgICAgICAgICAgIHN5bmNUb29sQ2FsbHM6IGNvbmZpZy5zeW5jVG9vbENhbGxzICE9PSBmYWxzZSxcbiAgICAgICAgICAgIHN5bmNUaGlua2luZzogY29uZmlnLnN5bmNUaGlua2luZyA9PT0gdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcbiAgQ3VycmVudCBDb25maWd1cmF0aW9uXFxuXCIpO1xuICAgICAgY29uc29sZS5sb2coYENvbnZleCBVUkw6ICAke2NvbmZpZy5jb252ZXhVcmx9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgQVBJIEtleTogICAgICR7bWFza0FwaUtleShjb25maWcuYXBpS2V5KX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBBdXRvIFN5bmM6ICAgJHtjb25maWcuYXV0b1N5bmMgIT09IGZhbHNlfWApO1xuICAgICAgY29uc29sZS5sb2coYFRvb2wgQ2FsbHM6ICAke2NvbmZpZy5zeW5jVG9vbENhbGxzICE9PSBmYWxzZX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBUaGlua2luZzogICAgJHtjb25maWcuc3luY1RoaW5raW5nID09PSB0cnVlfWApO1xuICAgICAgY29uc29sZS5sb2coYFxcbkNvbmZpZyBmaWxlOiB+Ly5jb25maWcvY2xhdWRlLWNvZGUtc3luYy9jb25maWcuanNvblxcbmApO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJzZXQgPGtleT4gPHZhbHVlPlwiKVxuICAuZGVzY3JpcHRpb24oXCJTZXQgYSBjb25maWd1cmF0aW9uIHZhbHVlXCIpXG4gIC5hY3Rpb24oKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb3QgY29uZmlndXJlZC4gUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyBmaXJzdC5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRLZXlzID0gW1wiYXV0b1N5bmNcIiwgXCJzeW5jVG9vbENhbGxzXCIsIFwic3luY1RoaW5raW5nXCJdO1xuICAgIGlmICghdmFsaWRLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQga2V5LiBWYWxpZCBrZXlzOiAke3ZhbGlkS2V5cy5qb2luKFwiLCBcIil9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9vbFZhbHVlID0gdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSBcIjFcIiB8fCB2YWx1ZSA9PT0gXCJ5ZXNcIjtcbiAgICBcbiAgICAvLyBUeXBlLXNhZmUgY29uZmlnIHVwZGF0ZVxuICAgIGlmIChrZXkgPT09IFwiYXV0b1N5bmNcIikge1xuICAgICAgY29uZmlnLmF1dG9TeW5jID0gYm9vbFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN5bmNUb29sQ2FsbHNcIikge1xuICAgICAgY29uZmlnLnN5bmNUb29sQ2FsbHMgPSBib29sVmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3luY1RoaW5raW5nXCIpIHtcbiAgICAgIGNvbmZpZy5zeW5jVGhpbmtpbmcgPSBib29sVmFsdWU7XG4gICAgfVxuXG4gICAgc2F2ZUNvbmZpZyhjb25maWcpO1xuICAgIGNvbnNvbGUubG9nKGBTZXQgJHtrZXl9ID0gJHtib29sVmFsdWV9YCk7XG4gIH0pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZXR1cCBDb21tYW5kIChjb25maWd1cmVzIENsYXVkZSBDb2RlIGhvb2tzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDbGF1ZGUgQ29kZSBob29rcyBjb25maWd1cmF0aW9uXG5jb25zdCBDTEFVREVfSE9PS1NfQ09ORklHID0ge1xuICBob29rczoge1xuICAgIFNlc3Npb25TdGFydDogW1xuICAgICAge1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgY29tbWFuZDogXCJjbGF1ZGUtY29kZS1zeW5jIGhvb2sgU2Vzc2lvblN0YXJ0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBTZXNzaW9uRW5kOiBbXG4gICAgICB7XG4gICAgICAgIGhvb2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJjb21tYW5kXCIsXG4gICAgICAgICAgICBjb21tYW5kOiBcImNsYXVkZS1jb2RlLXN5bmMgaG9vayBTZXNzaW9uRW5kXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBVc2VyUHJvbXB0U3VibWl0OiBbXG4gICAgICB7XG4gICAgICAgIGhvb2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJjb21tYW5kXCIsXG4gICAgICAgICAgICBjb21tYW5kOiBcImNsYXVkZS1jb2RlLXN5bmMgaG9vayBVc2VyUHJvbXB0U3VibWl0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBQb3N0VG9vbFVzZTogW1xuICAgICAge1xuICAgICAgICBtYXRjaGVyOiBcIipcIixcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImNvbW1hbmRcIixcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiY2xhdWRlLWNvZGUtc3luYyBob29rIFBvc3RUb29sVXNlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBTdG9wOiBbXG4gICAgICB7XG4gICAgICAgIG1hdGNoZXI6IFwiKlwiLFxuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgY29tbWFuZDogXCJjbGF1ZGUtY29kZS1zeW5jIGhvb2sgU3RvcFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwic2V0dXBcIilcbiAgLmRlc2NyaXB0aW9uKFwiQWRkIGhvb2tzIHRvIENsYXVkZSBDb2RlIHNldHRpbmdzIChjb25maWd1cmVzIH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uKVwiKVxuICAub3B0aW9uKFwiLS1mb3JjZVwiLCBcIk92ZXJ3cml0ZSBleGlzdGluZyBob29rcyBjb25maWd1cmF0aW9uXCIpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHsgZm9yY2U/OiBib29sZWFuIH0pID0+IHtcbiAgICBjb25zdCBjbGF1ZGVEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuSE9NRSB8fCBcIn5cIiwgXCIuY2xhdWRlXCIpO1xuICAgIGNvbnN0IHNldHRpbmdzUGF0aCA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2V0dGluZ3MuanNvblwiKTtcblxuICAgIGNvbnNvbGUubG9nKFwiXFxuICBDbGF1ZGUgQ29kZSBTeW5jIC0gU2V0dXBcXG5cIik7XG5cbiAgICAvLyBDaGVjayBpZiBwbHVnaW4gY3JlZGVudGlhbHMgYXJlIGNvbmZpZ3VyZWRcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiV2FybmluZzogUGx1Z2luIG5vdCBjb25maWd1cmVkIHlldC5cIik7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgZmlyc3QgdG8gc2V0IHVwIGNyZWRlbnRpYWxzLlxcblwiKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgLmNsYXVkZSBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGNsYXVkZURpcikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhjbGF1ZGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgY29uc29sZS5sb2coXCJDcmVhdGVkIH4vLmNsYXVkZSBkaXJlY3RvcnlcIik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHNldHRpbmdzXG4gICAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgbGV0IGhhc0V4aXN0aW5nSG9va3MgPSBmYWxzZTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNldHRpbmdzUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgICBleGlzdGluZ1NldHRpbmdzID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgaGFzRXhpc3RpbmdIb29rcyA9ICEhZXhpc3RpbmdTZXR0aW5ncy5ob29rcztcbiAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCBleGlzdGluZyBzZXR0aW5ncy5qc29uXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiV2FybmluZzogQ291bGQgbm90IHBhcnNlIGV4aXN0aW5nIHNldHRpbmdzLmpzb24sIHdpbGwgY3JlYXRlIG5ldyBvbmVcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGV4aXN0aW5nIGhvb2tzXG4gICAgaWYgKGhhc0V4aXN0aW5nSG9va3MgJiYgIW9wdGlvbnMuZm9yY2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuRXhpc3RpbmcgaG9va3MgY29uZmlndXJhdGlvbiBmb3VuZC5cIik7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIFVzZSAtLWZvcmNlIHRvIG92ZXJ3cml0ZSwgb3IgbWFudWFsbHkgbWVyZ2UgdGhlIGhvb2tzLlxcblwiKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiVG8gbWFudWFsbHkgYWRkLCBpbmNsdWRlIHRoZXNlIGhvb2tzIGluIHlvdXIgc2V0dGluZ3MuanNvbjpcIik7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShDTEFVREVfSE9PS1NfQ09ORklHLCBudWxsLCAyKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc2V0dGluZ3NcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLmV4aXN0aW5nU2V0dGluZ3MsXG4gICAgICAuLi5DTEFVREVfSE9PS1NfQ09ORklHLFxuICAgIH07XG5cbiAgICAvLyBXcml0ZSBzZXR0aW5nc1xuICAgIHRyeSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHNldHRpbmdzUGF0aCwgSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIG51bGwsIDIpKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuQ2xhdWRlIENvZGUgaG9va3MgY29uZmlndXJlZCFcIik7XG4gICAgICBjb25zb2xlLmxvZyhgICAgU2V0dGluZ3MgZmlsZTogJHtzZXR0aW5nc1BhdGh9YCk7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcblNldHVwIGNvbXBsZXRlLiBTZXNzaW9ucyB3aWxsIHN5bmMgYXV0b21hdGljYWxseS5cXG5cIik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB3cml0aW5nIHNldHRpbmdzOlwiLCBlcnJvcik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInZlcmlmeVwiKVxuICAuZGVzY3JpcHRpb24oXCJWZXJpZnkgY3JlZGVudGlhbHMgYW5kIENsYXVkZSBDb2RlIGNvbmZpZ3VyYXRpb25cIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJcXG4gIE9wZW5TeW5jIFNldHVwIFZlcmlmaWNhdGlvblxcblwiKTtcblxuICAgIC8vIENoZWNrIGNyZWRlbnRpYWxzXG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ3JlZGVudGlhbHM6IE9LXCIpO1xuICAgICAgY29uc29sZS5sb2coYCAgIENvbnZleCBVUkw6ICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBBUEkgS2V5OiAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ3JlZGVudGlhbHM6IE5PVCBDT05GSUdVUkVEXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cFwiKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBDbGF1ZGUgQ29kZSBjb25maWdcbiAgICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuSE9NRSB8fCBcIn5cIiwgXCIuY2xhdWRlXCIsIFwic2V0dGluZ3MuanNvblwiKTtcbiAgICBsZXQgaG9va3NDb25maWd1cmVkID0gZmFsc2U7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICBob29rc0NvbmZpZ3VyZWQgPSAhIXNldHRpbmdzLmhvb2tzPy5TZXNzaW9uU3RhcnQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWdub3JlIHBhcnNlIGVycm9yc1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFwiXCIpO1xuICAgIGlmIChob29rc0NvbmZpZ3VyZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ2xhdWRlIENvZGUgQ29uZmlnOiBPS1wiKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBDb25maWcgZmlsZTogJHtzZXR0aW5nc1BhdGh9YCk7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIEhvb2tzIHJlZ2lzdGVyZWQ6IGNsYXVkZS1jb2RlLXN5bmNcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ2xhdWRlIENvZGUgQ29uZmlnOiBOT1QgQ09ORklHVVJFRFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiICAgUnVuICdjbGF1ZGUtY29kZS1zeW5jIHNldHVwJyB0byBjb25maWd1cmUgaG9va3NcIik7XG4gICAgfVxuXG4gICAgLy8gVGVzdCBjb25uZWN0aW9uIGlmIGNyZWRlbnRpYWxzIGV4aXN0XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgY29uc29sZS5sb2coXCJcXG5UZXN0aW5nIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgICAgY29uc3QgY29ubmVjdGVkID0gYXdhaXQgY2xpZW50LnRlc3RDb25uZWN0aW9uKCk7XG4gICAgICBpZiAoY29ubmVjdGVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ29ubmVjdGlvbjogT0tcXG5cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNvbm5lY3Rpb246IEZBSUxFRFxcblwiKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcgJiYgaG9va3NDb25maWd1cmVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlJlYWR5ISBTdGFydCBDbGF1ZGUgQ29kZSBhbmQgc2Vzc2lvbnMgd2lsbCBzeW5jIGF1dG9tYXRpY2FsbHkuXFxuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIb29rIENvbW1hbmQgKGZvciBDbGF1ZGUgQ29kZSBpbnRlZ3JhdGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxucHJvZ3JhbVxuICAuY29tbWFuZChcImhvb2sgPGV2ZW50PlwiKVxuICAuZGVzY3JpcHRpb24oXCJIYW5kbGUgQ2xhdWRlIENvZGUgaG9vayBldmVudHMgKHJlYWRzIHN0ZGluKVwiKVxuICAuYWN0aW9uKGFzeW5jIChldmVudDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIC8vIEV4aXQgc2lsZW50bHkgaWYgbm90IGNvbmZpZ3VyZWQgKGRvbid0IGJsb2NrIENsYXVkZSBDb2RlKVxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuYXV0b1N5bmMgPT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgLy8gUmVhZCBKU09OIGlucHV0IGZyb20gc3RkaW5cbiAgICBsZXQgaW5wdXQgPSBcIlwiO1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcHJvY2Vzcy5zdGRpbikge1xuICAgICAgaW5wdXQgKz0gY2h1bms7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC50cmltKCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQpO1xuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcblxuICAgICAgc3dpdGNoIChldmVudCkge1xuICAgICAgICBjYXNlIFwiU2Vzc2lvblN0YXJ0XCI6IHtcbiAgICAgICAgICBjb25zdCBzZXNzaW9uID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIGN3ZDogZGF0YS5jd2QsXG4gICAgICAgICAgICBwZXJtaXNzaW9uTW9kZTogZGF0YS5wZXJtaXNzaW9uX21vZGUsXG4gICAgICAgICAgICBzdGFydFR5cGU6IGRhdGEuc291cmNlID09PSBcInN0YXJ0dXBcIiA/IFwibmV3XCIgOiBkYXRhLnNvdXJjZSxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgcHJvamVjdFBhdGg6IGRhdGEuY3dkLFxuICAgICAgICAgICAgcHJvamVjdE5hbWU6IGRhdGEuY3dkID8gZGF0YS5jd2Quc3BsaXQoXCIvXCIpLnBvcCgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcIlNlc3Npb25FbmRcIjoge1xuICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZW5kUmVhc29uOiBkYXRhLnJlYXNvbixcbiAgICAgICAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJVc2VyUHJvbXB0U3VibWl0XCI6IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IGAke2RhdGEuc2Vzc2lvbl9pZH0tJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHJvbGU6IFwidXNlclwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgY29udGVudDogZGF0YS5wcm9tcHQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJQb3N0VG9vbFVzZVwiOiB7XG4gICAgICAgICAgaWYgKCFjb25maWcuc3luY1Rvb2xDYWxscykgYnJlYWs7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogZGF0YS5zZXNzaW9uX2lkLFxuICAgICAgICAgICAgbWVzc2FnZUlkOiBgJHtkYXRhLnNlc3Npb25faWR9LXRvb2wtJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIgYXMgY29uc3QsXG4gICAgICAgICAgICB0b29sTmFtZTogZGF0YS50b29sX25hbWUsXG4gICAgICAgICAgICB0b29sQXJnczogZGF0YS50b29sX2lucHV0LFxuICAgICAgICAgICAgdG9vbFJlc3VsdDogZGF0YS50b29sX3Jlc3VsdD8ub3V0cHV0IHx8IGRhdGEudG9vbF9yZXN1bHQ/LmVycm9yLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBjbGllbnQuc3luY01lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwiU3RvcFwiOiB7XG4gICAgICAgICAgLy8gU3RvcCBldmVudCBpbmRpY2F0ZXMgQ2xhdWRlIGZpbmlzaGVkIHJlc3BvbmRpbmdcbiAgICAgICAgICAvLyBXZSBjb3VsZCB0cmFjayB0aGlzIGJ1dCBmb3Igbm93IGp1c3QgYWNrbm93bGVkZ2VcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gVW5rbm93biBldmVudCwgaWdub3JlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIHRvIHN0ZGVyciBidXQgZG9uJ3QgYmxvY2sgQ2xhdWRlIENvZGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtjbGF1ZGUtY29kZS1zeW5jXSBFcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBQYXJzZSBhbmQgcnVuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-sync",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Sync your Claude Code sessions to OpenSync dashboard. Track coding sessions, analyze tool usage, and monitor token consumption across projects.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",