claude-code-sync 0.1.1 → 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.
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
@@ -45,12 +45,25 @@ var __importStar = (this && this.__importStar) || (function () {
45
45
  Object.defineProperty(exports, "__esModule", { value: true });
46
46
  const commander_1 = require("commander");
47
47
  const readline = __importStar(require("readline"));
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
48
50
  const index_1 = require("./index");
51
+ // Read version from package.json
52
+ function getVersion() {
53
+ try {
54
+ const pkgPath = path.join(__dirname, "..", "package.json");
55
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
56
+ return pkg.version || "0.0.0";
57
+ }
58
+ catch {
59
+ return "0.0.0";
60
+ }
61
+ }
49
62
  const program = new commander_1.Command();
50
63
  program
51
64
  .name("claude-code-sync")
52
65
  .description("Sync Claude Code sessions to OpenSync dashboard")
53
- .version("0.1.1");
66
+ .version(getVersion());
54
67
  // ============================================================================
55
68
  // Helper Functions
56
69
  // ============================================================================
@@ -78,27 +91,27 @@ program
78
91
  .command("login")
79
92
  .description("Configure Convex URL and API Key")
80
93
  .action(async () => {
81
- console.log("\n🔐 Claude Code Sync - Login\n");
94
+ console.log("\n Claude Code Sync - Login\n");
82
95
  console.log("Get your API key from your OpenSync dashboard:");
83
96
  console.log(" 1. Go to Settings");
84
97
  console.log(" 2. Click 'Generate API Key'");
85
98
  console.log(" 3. Copy the key (starts with osk_)\n");
86
99
  const convexUrl = await prompt("Convex URL (e.g., https://your-project.convex.cloud): ");
87
100
  if (!convexUrl) {
88
- console.error(" Convex URL is required");
101
+ console.error("Error: Convex URL is required");
89
102
  process.exit(1);
90
103
  }
91
104
  if (!convexUrl.includes("convex.cloud") && !convexUrl.includes("convex.site")) {
92
- console.error(" Invalid Convex URL. Must contain convex.cloud or convex.site");
105
+ console.error("Error: Invalid Convex URL. Must contain convex.cloud or convex.site");
93
106
  process.exit(1);
94
107
  }
95
108
  const apiKey = await prompt("API Key (osk_...): ");
96
109
  if (!apiKey) {
97
- console.error(" API Key is required");
110
+ console.error("Error: API Key is required");
98
111
  process.exit(1);
99
112
  }
100
113
  if (!apiKey.startsWith("osk_")) {
101
- console.error(" Invalid API Key. Must start with osk_");
114
+ console.error("Error: Invalid API Key. Must start with osk_");
102
115
  process.exit(1);
103
116
  }
104
117
  const config = {
@@ -109,36 +122,36 @@ program
109
122
  syncThinking: false,
110
123
  };
111
124
  // Test connection
112
- console.log("\n⏳ Testing connection...");
125
+ console.log("\nTesting connection...");
113
126
  const client = new index_1.SyncClient(config);
114
127
  const connected = await client.testConnection();
115
128
  if (!connected) {
116
- console.error(" Could not connect to Convex backend");
129
+ console.error("Error: Could not connect to Convex backend");
117
130
  console.error(" Check your URL and try again");
118
131
  process.exit(1);
119
132
  }
120
133
  // Save config
121
134
  (0, index_1.saveConfig)(config);
122
- console.log("\n✅ Configuration saved!");
135
+ console.log("\nConfiguration saved!");
123
136
  console.log(` URL: ${convexUrl}`);
124
137
  console.log(` Key: ${maskApiKey(apiKey)}`);
125
- console.log("\n📦 Add the plugin to your Claude Code config to start syncing.\n");
138
+ console.log("\nAdd the plugin to your Claude Code config to start syncing.\n");
126
139
  });
127
140
  program
128
141
  .command("logout")
129
142
  .description("Clear stored credentials")
130
143
  .action(() => {
131
144
  (0, index_1.clearConfig)();
132
- console.log("Credentials cleared");
145
+ console.log("Credentials cleared");
133
146
  });
134
147
  program
135
148
  .command("status")
136
149
  .description("Show connection status")
137
150
  .action(async () => {
138
151
  const config = (0, index_1.loadConfig)();
139
- console.log("\n📊 Claude Code Sync - Status\n");
152
+ console.log("\n Claude Code Sync - Status\n");
140
153
  if (!config) {
141
- console.log("Not configured");
154
+ console.log("Not configured");
142
155
  console.log(" Run 'claude-code-sync login' to set up\n");
143
156
  process.exit(1);
144
157
  }
@@ -148,14 +161,14 @@ program
148
161
  console.log(` Auto Sync: ${config.autoSync !== false ? "enabled" : "disabled"}`);
149
162
  console.log(` Tool Calls: ${config.syncToolCalls !== false ? "enabled" : "disabled"}`);
150
163
  console.log(` Thinking: ${config.syncThinking ? "enabled" : "disabled"}`);
151
- console.log("\n⏳ Testing connection...");
164
+ console.log("\nTesting connection...");
152
165
  const client = new index_1.SyncClient(config);
153
166
  const connected = await client.testConnection();
154
167
  if (connected) {
155
- console.log("Connected to Convex backend\n");
168
+ console.log("Connected to Convex backend\n");
156
169
  }
157
170
  else {
158
- console.log(" Could not connect to Convex backend\n");
171
+ console.log("Error: Could not connect to Convex backend\n");
159
172
  process.exit(1);
160
173
  }
161
174
  });
@@ -185,7 +198,7 @@ program
185
198
  }, null, 2));
186
199
  }
187
200
  else {
188
- console.log("\n📋 Current Configuration\n");
201
+ console.log("\n Current Configuration\n");
189
202
  console.log(`Convex URL: ${config.convexUrl}`);
190
203
  console.log(`API Key: ${maskApiKey(config.apiKey)}`);
191
204
  console.log(`Auto Sync: ${config.autoSync !== false}`);
@@ -220,8 +233,282 @@ program
220
233
  config.syncThinking = boolValue;
221
234
  }
222
235
  (0, index_1.saveConfig)(config);
223
- console.log(`✅ Set ${key} = ${boolValue}`);
236
+ console.log(`Set ${key} = ${boolValue}`);
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
+ }
224
511
  });
225
512
  // Parse and run
226
513
  program.parse();
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlDQUFvQztBQUNwQyxtREFBcUM7QUFDckMsbUNBTWlCO0FBRWpCLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsa0JBQWtCLENBQUM7S0FDeEIsV0FBVyxDQUFDLGlEQUFpRCxDQUFDO0tBQzlELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVwQiwrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUUvRSxTQUFTLE1BQU0sQ0FBQyxRQUFnQjtJQUM5QixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ25DLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxTQUFT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RSxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDLENBQUM7QUFFTCxnQkFBZ0I7QUFDaEIsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG4vKipcbiAqIENsYXVkZSBDb2RlIFN5bmMgQ0xJXG4gKlxuICogQ29tbWFuZHM6XG4gKiAgIGxvZ2luICAgLSBDb25maWd1cmUgQ29udmV4IFVSTCBhbmQgQVBJIEtleVxuICogICBsb2dvdXQgIC0gQ2xlYXIgc3RvcmVkIGNyZWRlbnRpYWxzXG4gKiAgIHN0YXR1cyAgLSBTaG93IGNvbm5lY3Rpb24gc3RhdHVzXG4gKiAgIGNvbmZpZyAgLSBTaG93IGN1cnJlbnQgY29uZmlndXJhdGlvblxuICovXG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwicmVhZGxpbmVcIjtcbmltcG9ydCB7XG4gIGxvYWRDb25maWcsXG4gIHNhdmVDb25maWcsXG4gIGNsZWFyQ29uZmlnLFxuICBTeW5jQ2xpZW50LFxuICBDb25maWcsXG59IGZyb20gXCIuL2luZGV4XCI7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKFwiY2xhdWRlLWNvZGUtc3luY1wiKVxuICAuZGVzY3JpcHRpb24oXCJTeW5jIENsYXVkZSBDb2RlIHNlc3Npb25zIHRvIE9wZW5TeW5jIGRhc2hib2FyZFwiKVxuICAudmVyc2lvbihcIjAuMS4xXCIpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIZWxwZXIgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKHF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hc2tBcGlLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoa2V5Lmxlbmd0aCA8PSA4KSByZXR1cm4gXCIqKioqXCI7XG4gIHJldHVybiBrZXkuc3Vic3RyaW5nKDAsIDQpICsgXCIqKioqXCIgKyBrZXkuc3Vic3RyaW5nKGtleS5sZW5ndGggLSA0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tbWFuZHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxucHJvZ3JhbVxuICAuY29tbWFuZChcImxvZ2luXCIpXG4gIC5kZXNjcmlwdGlvbihcIkNvbmZpZ3VyZSBDb252ZXggVVJMIGFuZCBBUEkgS2V5XCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiXFxu8J+UkCBDbGF1ZGUgQ29kZSBTeW5jIC0gTG9naW5cXG5cIik7XG4gICAgY29uc29sZS5sb2coXCJHZXQgeW91ciBBUEkga2V5IGZyb20geW91ciBPcGVuU3luYyBkYXNoYm9hcmQ6XCIpO1xuICAgIGNvbnNvbGUubG9nKFwiICAxLiBHbyB0byBTZXR0aW5nc1wiKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgMi4gQ2xpY2sgJ0dlbmVyYXRlIEFQSSBLZXknXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiICAzLiBDb3B5IHRoZSBrZXkgKHN0YXJ0cyB3aXRoIG9za18pXFxuXCIpO1xuXG4gICAgY29uc3QgY29udmV4VXJsID0gYXdhaXQgcHJvbXB0KFwiQ29udmV4IFVSTCAoZS5nLiwgaHR0cHM6Ly95b3VyLXByb2plY3QuY29udmV4LmNsb3VkKTogXCIpO1xuXG4gICAgaWYgKCFjb252ZXhVcmwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCLinYwgQ29udmV4IFVSTCBpcyByZXF1aXJlZFwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbnZleFVybC5pbmNsdWRlcyhcImNvbnZleC5jbG91ZFwiKSAmJiAhY29udmV4VXJsLmluY2x1ZGVzKFwiY29udmV4LnNpdGVcIikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCLinYwgSW52YWxpZCBDb252ZXggVVJMLiBNdXN0IGNvbnRhaW4gY29udmV4LmNsb3VkIG9yIGNvbnZleC5zaXRlXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaUtleSA9IGF3YWl0IHByb21wdChcIkFQSSBLZXkgKG9za18uLi4pOiBcIik7XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIuKdjCBBUEkgS2V5IGlzIHJlcXVpcmVkXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmICghYXBpS2V5LnN0YXJ0c1dpdGgoXCJvc2tfXCIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwi4p2MIEludmFsaWQgQVBJIEtleS4gTXVzdCBzdGFydCB3aXRoIG9za19cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBDb25maWcgPSB7XG4gICAgICBjb252ZXhVcmwsXG4gICAgICBhcGlLZXksXG4gICAgICBhdXRvU3luYzogdHJ1ZSxcbiAgICAgIHN5bmNUb29sQ2FsbHM6IHRydWUsXG4gICAgICBzeW5jVGhpbmtpbmc6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBUZXN0IGNvbm5lY3Rpb25cbiAgICBjb25zb2xlLmxvZyhcIlxcbuKPsyBUZXN0aW5nIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcbiAgICBjb25zdCBjb25uZWN0ZWQgPSBhd2FpdCBjbGllbnQudGVzdENvbm5lY3Rpb24oKTtcblxuICAgIGlmICghY29ubmVjdGVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwi4p2MIENvdWxkIG5vdCBjb25uZWN0IHRvIENvbnZleCBiYWNrZW5kXCIpO1xuICAgICAgY29uc29sZS5lcnJvcihcIiAgIENoZWNrIHlvdXIgVVJMIGFuZCB0cnkgYWdhaW5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBjb25maWdcbiAgICBzYXZlQ29uZmlnKGNvbmZpZyk7XG4gICAgY29uc29sZS5sb2coXCJcXG7inIUgQ29uZmlndXJhdGlvbiBzYXZlZCFcIik7XG4gICAgY29uc29sZS5sb2coYCAgIFVSTDogJHtjb252ZXhVcmx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgIEtleTogJHttYXNrQXBpS2V5KGFwaUtleSl9YCk7XG4gICAgY29uc29sZS5sb2coXCJcXG7wn5OmIEFkZCB0aGUgcGx1Z2luIHRvIHlvdXIgQ2xhdWRlIENvZGUgY29uZmlnIHRvIHN0YXJ0IHN5bmNpbmcuXFxuXCIpO1xuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcImxvZ291dFwiKVxuICAuZGVzY3JpcHRpb24oXCJDbGVhciBzdG9yZWQgY3JlZGVudGlhbHNcIilcbiAgLmFjdGlvbigoKSA9PiB7XG4gICAgY2xlYXJDb25maWcoKTtcbiAgICBjb25zb2xlLmxvZyhcIuKchSBDcmVkZW50aWFscyBjbGVhcmVkXCIpO1xuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInN0YXR1c1wiKVxuICAuZGVzY3JpcHRpb24oXCJTaG93IGNvbm5lY3Rpb24gc3RhdHVzXCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICAgIGNvbnNvbGUubG9nKFwiXFxu8J+TiiBDbGF1ZGUgQ29kZSBTeW5jIC0gU3RhdHVzXFxuXCIpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwi4p2MIE5vdCBjb25maWd1cmVkXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cFxcblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcIkNvbmZpZ3VyYXRpb246XCIpO1xuICAgIGNvbnNvbGUubG9nKGAgIENvbnZleCBVUkw6ICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBBUEkgS2V5OiAgICAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG4gICAgY29uc29sZS5sb2coYCAgQXV0byBTeW5jOiAgJHtjb25maWcuYXV0b1N5bmMgIT09IGZhbHNlID8gXCJlbmFibGVkXCIgOiBcImRpc2FibGVkXCJ9YCk7XG4gICAgY29uc29sZS5sb2coYCAgVG9vbCBDYWxsczogJHtjb25maWcuc3luY1Rvb2xDYWxscyAhPT0gZmFsc2UgPyBcImVuYWJsZWRcIiA6IFwiZGlzYWJsZWRcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBUaGlua2luZzogICAke2NvbmZpZy5zeW5jVGhpbmtpbmcgPyBcImVuYWJsZWRcIiA6IFwiZGlzYWJsZWRcIn1gKTtcblxuICAgIGNvbnNvbGUubG9nKFwiXFxu4o+zIFRlc3RpbmcgY29ubmVjdGlvbi4uLlwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuXG4gICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgY29uc29sZS5sb2coXCLinIUgQ29ubmVjdGVkIHRvIENvbnZleCBiYWNrZW5kXFxuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIuKdjCBDb3VsZCBub3QgY29ubmVjdCB0byBDb252ZXggYmFja2VuZFxcblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwiY29uZmlnXCIpXG4gIC5kZXNjcmlwdGlvbihcIlNob3cgY3VycmVudCBjb25maWd1cmF0aW9uXCIpXG4gIC5vcHRpb24oXCItLWpzb25cIiwgXCJPdXRwdXQgYXMgSlNPTlwiKVxuICAuYWN0aW9uKChvcHRpb25zOiB7IGpzb24/OiBib29sZWFuIH0pID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGNvbmZpZ3VyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm90IGNvbmZpZ3VyZWQuIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgdG8gc2V0IHVwLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uZmlndXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbnZleFVybDogY29uZmlnLmNvbnZleFVybCxcbiAgICAgICAgICAgIGFwaUtleTogbWFza0FwaUtleShjb25maWcuYXBpS2V5KSxcbiAgICAgICAgICAgIGF1dG9TeW5jOiBjb25maWcuYXV0b1N5bmMgIT09IGZhbHNlLFxuICAgICAgICAgICAgc3luY1Rvb2xDYWxsczogY29uZmlnLnN5bmNUb29sQ2FsbHMgIT09IGZhbHNlLFxuICAgICAgICAgICAgc3luY1RoaW5raW5nOiBjb25maWcuc3luY1RoaW5raW5nID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxu8J+TiyBDdXJyZW50IENvbmZpZ3VyYXRpb25cXG5cIik7XG4gICAgICBjb25zb2xlLmxvZyhgQ29udmV4IFVSTDogICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBBUEkgS2V5OiAgICAgJHttYXNrQXBpS2V5KGNvbmZpZy5hcGlLZXkpfWApO1xuICAgICAgY29uc29sZS5sb2coYEF1dG8gU3luYzogICAke2NvbmZpZy5hdXRvU3luYyAhPT0gZmFsc2V9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgVG9vbCBDYWxsczogICR7Y29uZmlnLnN5bmNUb29sQ2FsbHMgIT09IGZhbHNlfWApO1xuICAgICAgY29uc29sZS5sb2coYFRoaW5raW5nOiAgICAke2NvbmZpZy5zeW5jVGhpbmtpbmcgPT09IHRydWV9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuQ29uZmlnIGZpbGU6IH4vLmNvbmZpZy9jbGF1ZGUtY29kZS1zeW5jL2NvbmZpZy5qc29uXFxuYCk7XG4gICAgfVxuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInNldCA8a2V5PiA8dmFsdWU+XCIpXG4gIC5kZXNjcmlwdGlvbihcIlNldCBhIGNvbmZpZ3VyYXRpb24gdmFsdWVcIilcbiAgLmFjdGlvbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihcIk5vdCBjb25maWd1cmVkLiBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIGZpcnN0LlwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEtleXMgPSBbXCJhdXRvU3luY1wiLCBcInN5bmNUb29sQ2FsbHNcIiwgXCJzeW5jVGhpbmtpbmdcIl07XG4gICAgaWYgKCF2YWxpZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBrZXkuIFZhbGlkIGtleXM6ICR7dmFsaWRLZXlzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBib29sVmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUgPT09IFwiMVwiIHx8IHZhbHVlID09PSBcInllc1wiO1xuICAgIFxuICAgIC8vIFR5cGUtc2FmZSBjb25maWcgdXBkYXRlXG4gICAgaWYgKGtleSA9PT0gXCJhdXRvU3luY1wiKSB7XG4gICAgICBjb25maWcuYXV0b1N5bmMgPSBib29sVmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3luY1Rvb2xDYWxsc1wiKSB7XG4gICAgICBjb25maWcuc3luY1Rvb2xDYWxscyA9IGJvb2xWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzeW5jVGhpbmtpbmdcIikge1xuICAgICAgY29uZmlnLnN5bmNUaGlua2luZyA9IGJvb2xWYWx1ZTtcbiAgICB9XG5cbiAgICBzYXZlQ29uZmlnKGNvbmZpZyk7XG4gICAgY29uc29sZS5sb2coYOKchSBTZXQgJHtrZXl9ID0gJHtib29sVmFsdWV9YCk7XG4gIH0pO1xuXG4vLyBQYXJzZSBhbmQgcnVuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
514
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlDQUFvQztBQUNwQyxtREFBcUM7QUFDckMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixtQ0FNaUI7QUFFakIsaUNBQWlDO0FBQ2pDLFNBQVMsVUFBVTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQkFBTyxFQUFFLENBQUM7QUFFOUIsT0FBTztLQUNKLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztLQUN4QixXQUFXLENBQUMsaURBQWlELENBQUM7S0FDOUQsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFFekIsK0VBQStFO0FBQy9FLG1CQUFtQjtBQUNuQiwrRUFBK0U7QUFFL0UsU0FBUyxNQUFNLENBQUMsUUFBZ0I7SUFDOUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUNsQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0tBQ3ZCLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUs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QUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSztvQkFDL0QsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2lCQUNwQyxDQUFDO2dCQUNGLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtZQUNSLENBQUM7WUFFRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osa0RBQWtEO2dCQUNsRCxtREFBbUQ7Z0JBQ25ELE1BQU07WUFDUixDQUFDO1lBRUQ7Z0JBQ0Usd0JBQXdCO2dCQUN4QixNQUFNO1FBQ1YsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZiw0Q0FBNEM7UUFDNUMsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVMLGdCQUFnQjtBQUNoQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qKlxuICogQ2xhdWRlIENvZGUgU3luYyBDTElcbiAqXG4gKiBDb21tYW5kczpcbiAqICAgbG9naW4gICAtIENvbmZpZ3VyZSBDb252ZXggVVJMIGFuZCBBUEkgS2V5XG4gKiAgIGxvZ291dCAgLSBDbGVhciBzdG9yZWQgY3JlZGVudGlhbHNcbiAqICAgc3RhdHVzICAtIFNob3cgY29ubmVjdGlvbiBzdGF0dXNcbiAqICAgY29uZmlnICAtIFNob3cgY3VycmVudCBjb25maWd1cmF0aW9uXG4gKi9cblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJyZWFkbGluZVwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICBsb2FkQ29uZmlnLFxuICBzYXZlQ29uZmlnLFxuICBjbGVhckNvbmZpZyxcbiAgU3luY0NsaWVudCxcbiAgQ29uZmlnLFxufSBmcm9tIFwiLi9pbmRleFwiO1xuXG4vLyBSZWFkIHZlcnNpb24gZnJvbSBwYWNrYWdlLmpzb25cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwa2dQYXRoLCBcInV0Zi04XCIpKTtcbiAgICByZXR1cm4gcGtnLnZlcnNpb24gfHwgXCIwLjAuMFwiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCIwLjAuMFwiO1xuICB9XG59XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKFwiY2xhdWRlLWNvZGUtc3luY1wiKVxuICAuZGVzY3JpcHRpb24oXCJTeW5jIENsYXVkZSBDb2RlIHNlc3Npb25zIHRvIE9wZW5TeW5jIGRhc2hib2FyZFwiKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIZWxwZXIgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKHF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hc2tBcGlLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoa2V5Lmxlbmd0aCA8PSA4KSByZXR1cm4gXCIqKioqXCI7XG4gIHJldHVybiBrZXkuc3Vic3RyaW5nKDAsIDQpICsgXCIqKioqXCIgKyBrZXkuc3Vic3RyaW5nKGtleS5sZW5ndGggLSA0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tbWFuZHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxucHJvZ3JhbVxuICAuY29tbWFuZChcImxvZ2luXCIpXG4gIC5kZXNjcmlwdGlvbihcIkNvbmZpZ3VyZSBDb252ZXggVVJMIGFuZCBBUEkgS2V5XCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiXFxuICBDbGF1ZGUgQ29kZSBTeW5jIC0gTG9naW5cXG5cIik7XG4gICAgY29uc29sZS5sb2coXCJHZXQgeW91ciBBUEkga2V5IGZyb20geW91ciBPcGVuU3luYyBkYXNoYm9hcmQ6XCIpO1xuICAgIGNvbnNvbGUubG9nKFwiICAxLiBHbyB0byBTZXR0aW5nc1wiKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgMi4gQ2xpY2sgJ0dlbmVyYXRlIEFQSSBLZXknXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiICAzLiBDb3B5IHRoZSBrZXkgKHN0YXJ0cyB3aXRoIG9za18pXFxuXCIpO1xuXG4gICAgY29uc3QgY29udmV4VXJsID0gYXdhaXQgcHJvbXB0KFwiQ29udmV4IFVSTCAoZS5nLiwgaHR0cHM6Ly95b3VyLXByb2plY3QuY29udmV4LmNsb3VkKTogXCIpO1xuXG4gICAgaWYgKCFjb252ZXhVcmwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogQ29udmV4IFVSTCBpcyByZXF1aXJlZFwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbnZleFVybC5pbmNsdWRlcyhcImNvbnZleC5jbG91ZFwiKSAmJiAhY29udmV4VXJsLmluY2x1ZGVzKFwiY29udmV4LnNpdGVcIikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogSW52YWxpZCBDb252ZXggVVJMLiBNdXN0IGNvbnRhaW4gY29udmV4LmNsb3VkIG9yIGNvbnZleC5zaXRlXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaUtleSA9IGF3YWl0IHByb21wdChcIkFQSSBLZXkgKG9za18uLi4pOiBcIik7XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBBUEkgS2V5IGlzIHJlcXVpcmVkXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmICghYXBpS2V5LnN0YXJ0c1dpdGgoXCJvc2tfXCIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IEludmFsaWQgQVBJIEtleS4gTXVzdCBzdGFydCB3aXRoIG9za19cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBDb25maWcgPSB7XG4gICAgICBjb252ZXhVcmwsXG4gICAgICBhcGlLZXksXG4gICAgICBhdXRvU3luYzogdHJ1ZSxcbiAgICAgIHN5bmNUb29sQ2FsbHM6IHRydWUsXG4gICAgICBzeW5jVGhpbmtpbmc6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBUZXN0IGNvbm5lY3Rpb25cbiAgICBjb25zb2xlLmxvZyhcIlxcblRlc3RpbmcgY29ubmVjdGlvbi4uLlwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuXG4gICAgaWYgKCFjb25uZWN0ZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogQ291bGQgbm90IGNvbm5lY3QgdG8gQ29udmV4IGJhY2tlbmRcIik7XG4gICAgICBjb25zb2xlLmVycm9yKFwiICAgQ2hlY2sgeW91ciBVUkwgYW5kIHRyeSBhZ2FpblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIGNvbmZpZ1xuICAgIHNhdmVDb25maWcoY29uZmlnKTtcbiAgICBjb25zb2xlLmxvZyhcIlxcbkNvbmZpZ3VyYXRpb24gc2F2ZWQhXCIpO1xuICAgIGNvbnNvbGUubG9nKGAgICBVUkw6ICR7Y29udmV4VXJsfWApO1xuICAgIGNvbnNvbGUubG9nKGAgICBLZXk6ICR7bWFza0FwaUtleShhcGlLZXkpfWApO1xuICAgIGNvbnNvbGUubG9nKFwiXFxuQWRkIHRoZSBwbHVnaW4gdG8geW91ciBDbGF1ZGUgQ29kZSBjb25maWcgdG8gc3RhcnQgc3luY2luZy5cXG5cIik7XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gIC5kZXNjcmlwdGlvbihcIkNsZWFyIHN0b3JlZCBjcmVkZW50aWFsc1wiKVxuICAuYWN0aW9uKCgpID0+IHtcbiAgICBjbGVhckNvbmZpZygpO1xuICAgIGNvbnNvbGUubG9nKFwiQ3JlZGVudGlhbHMgY2xlYXJlZFwiKTtcbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJzdGF0dXNcIilcbiAgLmRlc2NyaXB0aW9uKFwiU2hvdyBjb25uZWN0aW9uIHN0YXR1c1wiKVxuICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcbiAgQ2xhdWRlIENvZGUgU3luYyAtIFN0YXR1c1xcblwiKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vdCBjb25maWd1cmVkXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cFxcblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcIkNvbmZpZ3VyYXRpb246XCIpO1xuICAgIGNvbnNvbGUubG9nKGAgIENvbnZleCBVUkw6ICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBBUEkgS2V5OiAgICAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG4gICAgY29uc29sZS5sb2coYCAgQXV0byBTeW5jOiAgJHtjb25maWcuYXV0b1N5bmMgIT09IGZhbHNlID8gXCJlbmFibGVkXCIgOiBcImRpc2FibGVkXCJ9YCk7XG4gICAgY29uc29sZS5sb2coYCAgVG9vbCBDYWxsczogJHtjb25maWcuc3luY1Rvb2xDYWxscyAhPT0gZmFsc2UgPyBcImVuYWJsZWRcIiA6IFwiZGlzYWJsZWRcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBUaGlua2luZzogICAke2NvbmZpZy5zeW5jVGhpbmtpbmcgPyBcImVuYWJsZWRcIiA6IFwiZGlzYWJsZWRcIn1gKTtcblxuICAgIGNvbnNvbGUubG9nKFwiXFxuVGVzdGluZyBjb25uZWN0aW9uLi4uXCIpO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTeW5jQ2xpZW50KGNvbmZpZyk7XG4gICAgY29uc3QgY29ubmVjdGVkID0gYXdhaXQgY2xpZW50LnRlc3RDb25uZWN0aW9uKCk7XG5cbiAgICBpZiAoY29ubmVjdGVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNvbm5lY3RlZCB0byBDb252ZXggYmFja2VuZFxcblwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJFcnJvcjogQ291bGQgbm90IGNvbm5lY3QgdG8gQ29udmV4IGJhY2tlbmRcXG5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcImNvbmZpZ1wiKVxuICAuZGVzY3JpcHRpb24oXCJTaG93IGN1cnJlbnQgY29uZmlndXJhdGlvblwiKVxuICAub3B0aW9uKFwiLS1qc29uXCIsIFwiT3V0cHV0IGFzIEpTT05cIilcbiAgLmFjdGlvbigob3B0aW9uczogeyBqc29uPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBjb25maWd1cmVkOiBmYWxzZSB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk5vdCBjb25maWd1cmVkLiBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cC5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyZWQ6IHRydWUsXG4gICAgICAgICAgICBjb252ZXhVcmw6IGNvbmZpZy5jb252ZXhVcmwsXG4gICAgICAgICAgICBhcGlLZXk6IG1hc2tBcGlLZXkoY29uZmlnLmFwaUtleSksXG4gICAgICAgICAgICBhdXRvU3luYzogY29uZmlnLmF1dG9TeW5jICE9PSBmYWxzZSxcbiAgICAgICAgICAgIHN5bmNUb29sQ2FsbHM6IGNvbmZpZy5zeW5jVG9vbENhbGxzICE9PSBmYWxzZSxcbiAgICAgICAgICAgIHN5bmNUaGlua2luZzogY29uZmlnLnN5bmNUaGlua2luZyA9PT0gdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcbiAgQ3VycmVudCBDb25maWd1cmF0aW9uXFxuXCIpO1xuICAgICAgY29uc29sZS5sb2coYENvbnZleCBVUkw6ICAke2NvbmZpZy5jb252ZXhVcmx9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgQVBJIEtleTogICAgICR7bWFza0FwaUtleShjb25maWcuYXBpS2V5KX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBBdXRvIFN5bmM6ICAgJHtjb25maWcuYXV0b1N5bmMgIT09IGZhbHNlfWApO1xuICAgICAgY29uc29sZS5sb2coYFRvb2wgQ2FsbHM6ICAke2NvbmZpZy5zeW5jVG9vbENhbGxzICE9PSBmYWxzZX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBUaGlua2luZzogICAgJHtjb25maWcuc3luY1RoaW5raW5nID09PSB0cnVlfWApO1xuICAgICAgY29uc29sZS5sb2coYFxcbkNvbmZpZyBmaWxlOiB+Ly5jb25maWcvY2xhdWRlLWNvZGUtc3luYy9jb25maWcuanNvblxcbmApO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJzZXQgPGtleT4gPHZhbHVlPlwiKVxuICAuZGVzY3JpcHRpb24oXCJTZXQgYSBjb25maWd1cmF0aW9uIHZhbHVlXCIpXG4gIC5hY3Rpb24oKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb3QgY29uZmlndXJlZC4gUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyBmaXJzdC5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRLZXlzID0gW1wiYXV0b1N5bmNcIiwgXCJzeW5jVG9vbENhbGxzXCIsIFwic3luY1RoaW5raW5nXCJdO1xuICAgIGlmICghdmFsaWRLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQga2V5LiBWYWxpZCBrZXlzOiAke3ZhbGlkS2V5cy5qb2luKFwiLCBcIil9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9vbFZhbHVlID0gdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSBcIjFcIiB8fCB2YWx1ZSA9PT0gXCJ5ZXNcIjtcbiAgICBcbiAgICAvLyBUeXBlLXNhZmUgY29uZmlnIHVwZGF0ZVxuICAgIGlmIChrZXkgPT09IFwiYXV0b1N5bmNcIikge1xuICAgICAgY29uZmlnLmF1dG9TeW5jID0gYm9vbFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN5bmNUb29sQ2FsbHNcIikge1xuICAgICAgY29uZmlnLnN5bmNUb29sQ2FsbHMgPSBib29sVmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3luY1RoaW5raW5nXCIpIHtcbiAgICAgIGNvbmZpZy5zeW5jVGhpbmtpbmcgPSBib29sVmFsdWU7XG4gICAgfVxuXG4gICAgc2F2ZUNvbmZpZyhjb25maWcpO1xuICAgIGNvbnNvbGUubG9nKGBTZXQgJHtrZXl9ID0gJHtib29sVmFsdWV9YCk7XG4gIH0pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZXR1cCBDb21tYW5kIChjb25maWd1cmVzIENsYXVkZSBDb2RlIGhvb2tzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDbGF1ZGUgQ29kZSBob29rcyBjb25maWd1cmF0aW9uXG5jb25zdCBDTEFVREVfSE9PS1NfQ09ORklHID0ge1xuICBob29rczoge1xuICAgIFNlc3Npb25TdGFydDogW1xuICAgICAge1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgY29tbWFuZDogXCJjbGF1ZGUtY29kZS1zeW5jIGhvb2sgU2Vzc2lvblN0YXJ0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBTZXNzaW9uRW5kOiBbXG4gICAgICB7XG4gICAgICAgIGhvb2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJjb21tYW5kXCIsXG4gICAgICAgICAgICBjb21tYW5kOiBcImNsYXVkZS1jb2RlLXN5bmMgaG9vayBTZXNzaW9uRW5kXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBVc2VyUHJvbXB0U3VibWl0OiBbXG4gICAgICB7XG4gICAgICAgIGhvb2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJjb21tYW5kXCIsXG4gICAgICAgICAgICBjb21tYW5kOiBcImNsYXVkZS1jb2RlLXN5bmMgaG9vayBVc2VyUHJvbXB0U3VibWl0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBQb3N0VG9vbFVzZTogW1xuICAgICAge1xuICAgICAgICBtYXRjaGVyOiBcIipcIixcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImNvbW1hbmRcIixcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiY2xhdWRlLWNvZGUtc3luYyBob29rIFBvc3RUb29sVXNlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBTdG9wOiBbXG4gICAgICB7XG4gICAgICAgIG1hdGNoZXI6IFwiKlwiLFxuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgY29tbWFuZDogXCJjbGF1ZGUtY29kZS1zeW5jIGhvb2sgU3RvcFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwic2V0dXBcIilcbiAgLmRlc2NyaXB0aW9uKFwiQWRkIGhvb2tzIHRvIENsYXVkZSBDb2RlIHNldHRpbmdzIChjb25maWd1cmVzIH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uKVwiKVxuICAub3B0aW9uKFwiLS1mb3JjZVwiLCBcIk92ZXJ3cml0ZSBleGlzdGluZyBob29rcyBjb25maWd1cmF0aW9uXCIpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHsgZm9yY2U/OiBib29sZWFuIH0pID0+IHtcbiAgICBjb25zdCBjbGF1ZGVEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuSE9NRSB8fCBcIn5cIiwgXCIuY2xhdWRlXCIpO1xuICAgIGNvbnN0IHNldHRpbmdzUGF0aCA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2V0dGluZ3MuanNvblwiKTtcblxuICAgIGNvbnNvbGUubG9nKFwiXFxuICBDbGF1ZGUgQ29kZSBTeW5jIC0gU2V0dXBcXG5cIik7XG5cbiAgICAvLyBDaGVjayBpZiBwbHVnaW4gY3JlZGVudGlhbHMgYXJlIGNvbmZpZ3VyZWRcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiV2FybmluZzogUGx1Z2luIG5vdCBjb25maWd1cmVkIHlldC5cIik7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgZmlyc3QgdG8gc2V0IHVwIGNyZWRlbnRpYWxzLlxcblwiKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgLmNsYXVkZSBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGNsYXVkZURpcikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhjbGF1ZGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgY29uc29sZS5sb2coXCJDcmVhdGVkIH4vLmNsYXVkZSBkaXJlY3RvcnlcIik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHNldHRpbmdzXG4gICAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgbGV0IGhhc0V4aXN0aW5nSG9va3MgPSBmYWxzZTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNldHRpbmdzUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgICBleGlzdGluZ1NldHRpbmdzID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgaGFzRXhpc3RpbmdIb29rcyA9ICEhZXhpc3RpbmdTZXR0aW5ncy5ob29rcztcbiAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCBleGlzdGluZyBzZXR0aW5ncy5qc29uXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiV2FybmluZzogQ291bGQgbm90IHBhcnNlIGV4aXN0aW5nIHNldHRpbmdzLmpzb24sIHdpbGwgY3JlYXRlIG5ldyBvbmVcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGV4aXN0aW5nIGhvb2tzXG4gICAgaWYgKGhhc0V4aXN0aW5nSG9va3MgJiYgIW9wdGlvbnMuZm9yY2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuRXhpc3RpbmcgaG9va3MgY29uZmlndXJhdGlvbiBmb3VuZC5cIik7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIFVzZSAtLWZvcmNlIHRvIG92ZXJ3cml0ZSwgb3IgbWFudWFsbHkgbWVyZ2UgdGhlIGhvb2tzLlxcblwiKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiVG8gbWFudWFsbHkgYWRkLCBpbmNsdWRlIHRoZXNlIGhvb2tzIGluIHlvdXIgc2V0dGluZ3MuanNvbjpcIik7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShDTEFVREVfSE9PS1NfQ09ORklHLCBudWxsLCAyKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc2V0dGluZ3NcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLmV4aXN0aW5nU2V0dGluZ3MsXG4gICAgICAuLi5DTEFVREVfSE9PS1NfQ09ORklHLFxuICAgIH07XG5cbiAgICAvLyBXcml0ZSBzZXR0aW5nc1xuICAgIHRyeSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHNldHRpbmdzUGF0aCwgSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIG51bGwsIDIpKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuQ2xhdWRlIENvZGUgaG9va3MgY29uZmlndXJlZCFcIik7XG4gICAgICBjb25zb2xlLmxvZyhgICAgU2V0dGluZ3MgZmlsZTogJHtzZXR0aW5nc1BhdGh9YCk7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcblNldHVwIGNvbXBsZXRlLiBTZXNzaW9ucyB3aWxsIHN5bmMgYXV0b21hdGljYWxseS5cXG5cIik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB3cml0aW5nIHNldHRpbmdzOlwiLCBlcnJvcik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInZlcmlmeVwiKVxuICAuZGVzY3JpcHRpb24oXCJWZXJpZnkgY3JlZGVudGlhbHMgYW5kIENsYXVkZSBDb2RlIGNvbmZpZ3VyYXRpb25cIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJcXG4gIE9wZW5TeW5jIFNldHVwIFZlcmlmaWNhdGlvblxcblwiKTtcblxuICAgIC8vIENoZWNrIGNyZWRlbnRpYWxzXG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ3JlZGVudGlhbHM6IE9LXCIpO1xuICAgICAgY29uc29sZS5sb2coYCAgIENvbnZleCBVUkw6ICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBBUEkgS2V5OiAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ3JlZGVudGlhbHM6IE5PVCBDT05GSUdVUkVEXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cFwiKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBDbGF1ZGUgQ29kZSBjb25maWdcbiAgICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuSE9NRSB8fCBcIn5cIiwgXCIuY2xhdWRlXCIsIFwic2V0dGluZ3MuanNvblwiKTtcbiAgICBsZXQgaG9va3NDb25maWd1cmVkID0gZmFsc2U7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICBob29rc0NvbmZpZ3VyZWQgPSAhIXNldHRpbmdzLmhvb2tzPy5TZXNzaW9uU3RhcnQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWdub3JlIHBhcnNlIGVycm9yc1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFwiXCIpO1xuICAgIGlmIChob29rc0NvbmZpZ3VyZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ2xhdWRlIENvZGUgQ29uZmlnOiBPS1wiKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBDb25maWcgZmlsZTogJHtzZXR0aW5nc1BhdGh9YCk7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIEhvb2tzIHJlZ2lzdGVyZWQ6IGNsYXVkZS1jb2RlLXN5bmNcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ2xhdWRlIENvZGUgQ29uZmlnOiBOT1QgQ09ORklHVVJFRFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiICAgUnVuICdjbGF1ZGUtY29kZS1zeW5jIHNldHVwJyB0byBjb25maWd1cmUgaG9va3NcIik7XG4gICAgfVxuXG4gICAgLy8gVGVzdCBjb25uZWN0aW9uIGlmIGNyZWRlbnRpYWxzIGV4aXN0XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgY29uc29sZS5sb2coXCJcXG5UZXN0aW5nIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgICAgY29uc3QgY29ubmVjdGVkID0gYXdhaXQgY2xpZW50LnRlc3RDb25uZWN0aW9uKCk7XG4gICAgICBpZiAoY29ubmVjdGVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ29ubmVjdGlvbjogT0tcXG5cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNvbm5lY3Rpb246IEZBSUxFRFxcblwiKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcgJiYgaG9va3NDb25maWd1cmVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlJlYWR5ISBTdGFydCBDbGF1ZGUgQ29kZSBhbmQgc2Vzc2lvbnMgd2lsbCBzeW5jIGF1dG9tYXRpY2FsbHkuXFxuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIb29rIENvbW1hbmQgKGZvciBDbGF1ZGUgQ29kZSBpbnRlZ3JhdGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxucHJvZ3JhbVxuICAuY29tbWFuZChcImhvb2sgPGV2ZW50PlwiKVxuICAuZGVzY3JpcHRpb24oXCJIYW5kbGUgQ2xhdWRlIENvZGUgaG9vayBldmVudHMgKHJlYWRzIHN0ZGluKVwiKVxuICAuYWN0aW9uKGFzeW5jIChldmVudDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIC8vIEV4aXQgc2lsZW50bHkgaWYgbm90IGNvbmZpZ3VyZWQgKGRvbid0IGJsb2NrIENsYXVkZSBDb2RlKVxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuYXV0b1N5bmMgPT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgLy8gUmVhZCBKU09OIGlucHV0IGZyb20gc3RkaW5cbiAgICBsZXQgaW5wdXQgPSBcIlwiO1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcHJvY2Vzcy5zdGRpbikge1xuICAgICAgaW5wdXQgKz0gY2h1bms7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC50cmltKCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQpO1xuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcblxuICAgICAgc3dpdGNoIChldmVudCkge1xuICAgICAgICBjYXNlIFwiU2Vzc2lvblN0YXJ0XCI6IHtcbiAgICAgICAgICBjb25zdCBzZXNzaW9uID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIGN3ZDogZGF0YS5jd2QsXG4gICAgICAgICAgICBwZXJtaXNzaW9uTW9kZTogZGF0YS5wZXJtaXNzaW9uX21vZGUsXG4gICAgICAgICAgICBzdGFydFR5cGU6IGRhdGEuc291cmNlID09PSBcInN0YXJ0dXBcIiA/IFwibmV3XCIgOiBkYXRhLnNvdXJjZSxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgcHJvamVjdFBhdGg6IGRhdGEuY3dkLFxuICAgICAgICAgICAgcHJvamVjdE5hbWU6IGRhdGEuY3dkID8gZGF0YS5jd2Quc3BsaXQoXCIvXCIpLnBvcCgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcIlNlc3Npb25FbmRcIjoge1xuICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZW5kUmVhc29uOiBkYXRhLnJlYXNvbixcbiAgICAgICAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJVc2VyUHJvbXB0U3VibWl0XCI6IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IGAke2RhdGEuc2Vzc2lvbl9pZH0tJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHJvbGU6IFwidXNlclwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgY29udGVudDogZGF0YS5wcm9tcHQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJQb3N0VG9vbFVzZVwiOiB7XG4gICAgICAgICAgaWYgKCFjb25maWcuc3luY1Rvb2xDYWxscykgYnJlYWs7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogZGF0YS5zZXNzaW9uX2lkLFxuICAgICAgICAgICAgbWVzc2FnZUlkOiBgJHtkYXRhLnNlc3Npb25faWR9LXRvb2wtJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIgYXMgY29uc3QsXG4gICAgICAgICAgICB0b29sTmFtZTogZGF0YS50b29sX25hbWUsXG4gICAgICAgICAgICB0b29sQXJnczogZGF0YS50b29sX2lucHV0LFxuICAgICAgICAgICAgdG9vbFJlc3VsdDogZGF0YS50b29sX3Jlc3VsdD8ub3V0cHV0IHx8IGRhdGEudG9vbF9yZXN1bHQ/LmVycm9yLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBjbGllbnQuc3luY01lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwiU3RvcFwiOiB7XG4gICAgICAgICAgLy8gU3RvcCBldmVudCBpbmRpY2F0ZXMgQ2xhdWRlIGZpbmlzaGVkIHJlc3BvbmRpbmdcbiAgICAgICAgICAvLyBXZSBjb3VsZCB0cmFjayB0aGlzIGJ1dCBmb3Igbm93IGp1c3QgYWNrbm93bGVkZ2VcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gVW5rbm93biBldmVudCwgaWdub3JlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIHRvIHN0ZGVyciBidXQgZG9uJ3QgYmxvY2sgQ2xhdWRlIENvZGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtjbGF1ZGUtY29kZS1zeW5jXSBFcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBQYXJzZSBhbmQgcnVuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
package/dist/index.d.ts CHANGED
@@ -116,6 +116,7 @@ export declare function saveConfig(config: Config): void;
116
116
  export declare function clearConfig(): void;
117
117
  export declare class SyncClient {
118
118
  private config;
119
+ private siteUrl;
119
120
  private sessionCache;
120
121
  constructor(config: Config);
121
122
  private request;
package/dist/index.js CHANGED
@@ -113,12 +113,16 @@ function normalizeConvexUrl(url) {
113
113
  // ============================================================================
114
114
  class SyncClient {
115
115
  config;
116
+ siteUrl;
116
117
  sessionCache = new Map();
117
118
  constructor(config) {
118
119
  this.config = config;
120
+ // Normalize URL to .convex.site for HTTP endpoints
121
+ // Supports both .convex.cloud and .convex.site input URLs
122
+ this.siteUrl = config.convexUrl.replace(".convex.cloud", ".convex.site");
119
123
  }
120
124
  async request(endpoint, data) {
121
- const url = `${this.config.convexUrl}${endpoint}`;
125
+ const url = `${this.siteUrl}${endpoint}`;
122
126
  const response = await fetch(url, {
123
127
  method: "POST",
124
128
  headers: {
@@ -159,7 +163,7 @@ class SyncClient {
159
163
  }
160
164
  async testConnection() {
161
165
  try {
162
- const url = `${this.config.convexUrl}/health`;
166
+ const url = `${this.siteUrl}/health`;
163
167
  const response = await fetch(url);
164
168
  return response.ok;
165
169
  }
@@ -331,4 +335,4 @@ function createPlugin() {
331
335
  }
332
336
  // Default export for Claude Code plugin system
333
337
  exports.default = createPlugin;
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvSUgsZ0NBNEJDO0FBRUQsZ0NBVUM7QUFFRCxrQ0FRQztBQXdHRCxvQ0FxS0M7QUFqY0QsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qix1Q0FBeUI7QUF5SHpCLCtFQUErRTtBQUMvRSxnQkFBZ0I7QUFDaEIsK0VBQStFO0FBRS9FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzFFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBRXpELFNBQWdCLFVBQVU7SUFDeEIsb0NBQW9DO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUUvQyxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNyQixPQUFPO1lBQ0wsU0FBUyxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUNyQyxNQUFNLEVBQUUsTUFBTTtZQUNkLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixLQUFLLE9BQU87WUFDdkQsYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEtBQUssT0FBTztZQUM3RCxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsS0FBSyxNQUFNO1NBQzFELENBQUM7SUFDSixDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLElBQUksQ0FBQztRQUNILElBQUksRUFB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QUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFMUMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsS0FBSyxDQUFDLFlBQVksY0FBYyxLQUFLLENBQUMsYUFBYSxhQUFhLENBQ3ZHLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0Msa0JBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGF1ZGUgQ29kZSBTeW5jIFBsdWdpblxuICpcbiAqIFN5bmNzIENsYXVkZSBDb2RlIHNlc3Npb25zIHRvIE9wZW5TeW5jIGRhc2hib2FyZC5cbiAqIFVzZXMgQVBJIEtleSBhdXRoZW50aWNhdGlvbiAobm8gYnJvd3NlciBPQXV0aCByZXF1aXJlZCkuXG4gKlxuICogSW5zdGFsbDogbnBtIGluc3RhbGwgLWcgY2xhdWRlLWNvZGUtc3luY1xuICogQ29uZmlndXJlOiBjbGF1ZGUtY29kZS1zeW5jIGxvZ2luXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWcge1xuICBjb252ZXhVcmw6IHN0cmluZztcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIGF1dG9TeW5jPzogYm9vbGVhbjtcbiAgc3luY1Rvb2xDYWxscz86IGJvb2xlYW47XG4gIHN5bmNUaGlua2luZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkRhdGEge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc291cmNlOiBcImNsYXVkZS1jb2RlXCI7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwcm9qZWN0UGF0aD86IHN0cmluZztcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG4gIGN3ZD86IHN0cmluZztcbiAgZ2l0QnJhbmNoPzogc3RyaW5nO1xuICBnaXRSZXBvPzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgc3RhcnRUeXBlPzogXCJuZXdcIiB8IFwicmVzdW1lXCIgfCBcImNvbnRpbnVlXCI7XG4gIGVuZFJlYXNvbj86IFwidXNlcl9zdG9wXCIgfCBcIm1heF90dXJuc1wiIHwgXCJlcnJvclwiIHwgXCJjb21wbGV0ZWRcIjtcbiAgdGhpbmtpbmdFbmFibGVkPzogYm9vbGVhbjtcbiAgcGVybWlzc2lvbk1vZGU/OiBzdHJpbmc7XG4gIG1jcFNlcnZlcnM/OiBzdHJpbmdbXTtcbiAgbWVzc2FnZUNvdW50PzogbnVtYmVyO1xuICB0b29sQ2FsbENvdW50PzogbnVtYmVyO1xuICB0b2tlblVzYWdlPzoge1xuICAgIGlucHV0OiBudW1iZXI7XG4gICAgb3V0cHV0OiBudW1iZXI7XG4gIH07XG4gIGNvc3RFc3RpbWF0ZT86IG51bWJlcjtcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBlbmRlZEF0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VEYXRhIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIG1lc3NhZ2VJZDogc3RyaW5nO1xuICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIjtcbiAgcm9sZTogXCJ1c2VyXCIgfCBcImFzc2lzdGFudFwiIHwgXCJzeXN0ZW1cIjtcbiAgY29udGVudD86IHN0cmluZztcbiAgdGhpbmtpbmdDb250ZW50Pzogc3RyaW5nO1xuICB0b29sTmFtZT86IHN0cmluZztcbiAgdG9vbEFyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdG9vbFJlc3VsdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgdG9rZW5Db3VudD86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xVc2VEYXRhIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG4gIHRvb2xBcmdzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlc3VsdD86IHN0cmluZztcbiAgc3VjY2Vzcz86IGJvb2xlYW47XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIHRpbWVzdGFtcD86IHN0cmluZztcbn1cblxuLy8gQ2xhdWRlIENvZGUgSG9vayBUeXBlc1xuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVDb2RlSG9va3Mge1xuICBTZXNzaW9uU3RhcnQ/OiAoZGF0YTogU2Vzc2lvblN0YXJ0RXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBVc2VyUHJvbXB0U3VibWl0PzogKGRhdGE6IFVzZXJQcm9tcHRFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIFBvc3RUb29sVXNlPzogKGRhdGE6IFRvb2xVc2VFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIFN0b3A/OiAoZGF0YTogU3RvcEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgU2Vzc2lvbkVuZD86IChkYXRhOiBTZXNzaW9uRW5kRXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25TdGFydEV2ZW50IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGN3ZDogc3RyaW5nO1xuICBtb2RlbDogc3RyaW5nO1xuICBzdGFydFR5cGU6IFwibmV3XCIgfCBcInJlc3VtZVwiIHwgXCJjb250aW51ZVwiO1xuICB0aGlua2luZ0VuYWJsZWQ/OiBib29sZWFuO1xuICBwZXJtaXNzaW9uTW9kZT86IHN0cmluZztcbiAgbWNwU2VydmVycz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQcm9tcHRFdmVudCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBwcm9tcHQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbFVzZUV2ZW50IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXN1bHQ6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3BFdmVudCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICByZXNwb25zZTogc3RyaW5nO1xuICB0b2tlblVzYWdlOiB7XG4gICAgaW5wdXQ6IG51bWJlcjtcbiAgICBvdXRwdXQ6IG51bWJlcjtcbiAgfTtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25FbmRFdmVudCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBlbmRSZWFzb246IFwidXNlcl9zdG9wXCIgfCBcIm1heF90dXJuc1wiIHwgXCJlcnJvclwiIHwgXCJjb21wbGV0ZWRcIjtcbiAgbWVzc2FnZUNvdW50OiBudW1iZXI7XG4gIHRvb2xDYWxsQ291bnQ6IG51bWJlcjtcbiAgdG90YWxUb2tlblVzYWdlOiB7XG4gICAgaW5wdXQ6IG51bWJlcjtcbiAgICBvdXRwdXQ6IG51bWJlcjtcbiAgfTtcbiAgY29zdEVzdGltYXRlOiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgQ09ORklHX0RJUiA9IHBhdGguam9pbihvcy5ob21lZGlyKCksIFwiLmNvbmZpZ1wiLCBcImNsYXVkZS1jb2RlLXN5bmNcIik7XG5jb25zdCBDT05GSUdfRklMRSA9IHBhdGguam9pbihDT05GSUdfRElSLCBcImNvbmZpZy5qc29uXCIpO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZENvbmZpZygpOiBDb25maWcgfCBudWxsIHtcbiAgLy8gQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZpcnN0XG4gIGNvbnN0IGVudlVybCA9IHByb2Nlc3MuZW52LkNMQVVERV9TWU5DX0NPTlZFWF9VUkw7XG4gIGNvbnN0IGVudktleSA9IHByb2Nlc3MuZW52LkNMQVVERV9TWU5DX0FQSV9LRVk7XG5cbiAgaWYgKGVudlVybCAmJiBlbnZLZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udmV4VXJsOiBub3JtYWxpemVDb252ZXhVcmwoZW52VXJsKSxcbiAgICAgIGFwaUtleTogZW52S2V5LFxuICAgICAgYXV0b1N5bmM6IHByb2Nlc3MuZW52LkNMQVVERV9TWU5DX0FVVE9fU1lOQyAhPT0gXCJmYWxzZVwiLFxuICAgICAgc3luY1Rvb2xDYWxsczogcHJvY2Vzcy5lbnYuQ0xBVURFX1NZTkNfVE9PTF9DQUxMUyAhPT0gXCJmYWxzZVwiLFxuICAgICAgc3luY1RoaW5raW5nOiBwcm9jZXNzLmVudi5DTEFVREVfU1lOQ19USElOS0lORyA9PT0gXCJ0cnVlXCIsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byBjb25maWcgZmlsZVxuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKENPTkZJR19GSUxFKSkge1xuICAgICAgY29uc3QgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhDT05GSUdfRklMRSwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoZGF0YSkgYXMgQ29uZmlnO1xuICAgICAgY29uZmlnLmNvbnZleFVybCA9IG5vcm1hbGl6ZUNvbnZleFVybChjb25maWcuY29udmV4VXJsKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBsb2FkaW5nIGNvbmZpZzpcIiwgZXJyb3IpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlQ29uZmlnKGNvbmZpZzogQ29uZmlnKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKENPTkZJR19ESVIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoQ09ORklHX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICAgIGZzLndyaXRlRmlsZVN5bmMoQ09ORklHX0ZJTEUsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMikpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzYXZpbmcgY29uZmlnOlwiLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ29uZmlnKCk6IHZvaWQge1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKENPTkZJR19GSUxFKSkge1xuICAgICAgZnMudW5saW5rU3luYyhDT05GSUdfRklMRSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjbGVhcmluZyBjb25maWc6XCIsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb252ZXhVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBDb252ZXJ0IC5jb252ZXguY2xvdWQgdG8gLmNvbnZleC5zaXRlIGZvciBBUEkgY2FsbHNcbiAgcmV0dXJuIHVybC5yZXBsYWNlKFwiLmNvbnZleC5jbG91ZFwiLCBcIi5jb252ZXguc2l0ZVwiKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3luYyBDbGllbnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFN5bmNDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogQ29uZmlnO1xuICBwcml2YXRlIHNlc3Npb25DYWNoZTogTWFwPHN0cmluZywgUGFydGlhbDxTZXNzaW9uRGF0YT4+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlcXVlc3QoZW5kcG9pbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY29uZmlnLmNvbnZleFVybH0ke2VuZHBvaW50fWA7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke3RleHR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIGFzeW5jIHN5bmNTZXNzaW9uKHNlc3Npb246IFNlc3Npb25EYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChcIi9zeW5jL3Nlc3Npb25cIiwgc2Vzc2lvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc3luYyBzZXNzaW9uOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3luY01lc3NhZ2UobWVzc2FnZTogTWVzc2FnZURhdGEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KFwiL3N5bmMvbWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBzeW5jIG1lc3NhZ2U6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzeW5jQmF0Y2goXG4gICAgc2Vzc2lvbnM6IFNlc3Npb25EYXRhW10sXG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VEYXRhW11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChcIi9zeW5jL2JhdGNoXCIsIHsgc2Vzc2lvbnMsIG1lc3NhZ2VzIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHN5bmMgYmF0Y2g6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB0ZXN0Q29ubmVjdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5jb25maWcuY29udmV4VXJsfS9oZWFsdGhgO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLm9rO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlc3Npb24gc3RhdGUgbWFuYWdlbWVudFxuICBnZXRTZXNzaW9uU3RhdGUoc2Vzc2lvbklkOiBzdHJpbmcpOiBQYXJ0aWFsPFNlc3Npb25EYXRhPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbkNhY2hlLmdldChzZXNzaW9uSWQpIHx8IHt9O1xuICB9XG5cbiAgdXBkYXRlU2Vzc2lvblN0YXRlKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHVwZGF0ZXM6IFBhcnRpYWw8U2Vzc2lvbkRhdGE+XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNlc3Npb25DYWNoZS5nZXQoc2Vzc2lvbklkKSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbklkLCB7IC4uLmN1cnJlbnQsIC4uLnVwZGF0ZXMgfSk7XG4gIH1cblxuICBjbGVhclNlc3Npb25TdGF0ZShzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbkNhY2hlLmRlbGV0ZShzZXNzaW9uSWQpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBsdWdpbiBFeHBvcnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDbGF1ZGUgQ29kZSBQbHVnaW4gRW50cnkgUG9pbnRcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBDbGF1ZGUgQ29kZSB0byByZWdpc3RlciB0aGUgcGx1Z2luLlxuICogSXQgcmV0dXJucyBob29rIGhhbmRsZXJzIHRoYXQgZmlyZSBhdCBrZXkgcG9pbnRzIGluIHRoZSBzZXNzaW9uIGxpZmVjeWNsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBsdWdpbigpOiBDbGF1ZGVDb2RlSG9va3MgfCBudWxsIHtcbiAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gIGlmICghY29uZmlnKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBcIltjbGF1ZGUtY29kZS1zeW5jXSBOb3QgY29uZmlndXJlZC4gUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyB0byBzZXQgdXAuXCJcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5hdXRvU3luYyA9PT0gZmFsc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcIltjbGF1ZGUtY29kZS1zeW5jXSBBdXRvLXN5bmMgZGlzYWJsZWQgaW4gY29uZmlnLlwiKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBTeW5jQ2xpZW50KGNvbmZpZyk7XG4gIGxldCBtZXNzYWdlQ291bnRlciA9IDA7XG4gIGxldCB0b29sQ2FsbENvdW50ZXIgPSAwO1xuXG4gIGNvbnNvbGUubG9nKFwiW2NsYXVkZS1jb2RlLXN5bmNdIFBsdWdpbiBsb2FkZWQuIFNlc3Npb25zIHdpbGwgc3luYyB0byBPcGVuU3luYy5cIik7XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBzZXNzaW9uIHN0YXJ0c1xuICAgICAqL1xuICAgIFNlc3Npb25TdGFydDogYXN5bmMgKGV2ZW50OiBTZXNzaW9uU3RhcnRFdmVudCkgPT4ge1xuICAgICAgbWVzc2FnZUNvdW50ZXIgPSAwO1xuICAgICAgdG9vbENhbGxDb3VudGVyID0gMDtcblxuICAgICAgY29uc3Qgc2Vzc2lvbjogU2Vzc2lvbkRhdGEgPSB7XG4gICAgICAgIHNlc3Npb25JZDogZXZlbnQuc2Vzc2lvbklkLFxuICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgY3dkOiBldmVudC5jd2QsXG4gICAgICAgIG1vZGVsOiBldmVudC5tb2RlbCxcbiAgICAgICAgc3RhcnRUeXBlOiBldmVudC5zdGFydFR5cGUsXG4gICAgICAgIHRoaW5raW5nRW5hYmxlZDogZXZlbnQudGhpbmtpbmdFbmFibGVkLFxuICAgICAgICBwZXJtaXNzaW9uTW9kZTogZXZlbnQucGVybWlzc2lvbk1vZGUsXG4gICAgICAgIG1jcFNlcnZlcnM6IGV2ZW50Lm1jcFNlcnZlcnMsXG4gICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgLy8gRXh0cmFjdCBwcm9qZWN0IGluZm8gZnJvbSBjd2RcbiAgICAgIGlmIChldmVudC5jd2QpIHtcbiAgICAgICAgc2Vzc2lvbi5wcm9qZWN0UGF0aCA9IGV2ZW50LmN3ZDtcbiAgICAgICAgc2Vzc2lvbi5wcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUoZXZlbnQuY3dkKTtcblxuICAgICAgICAvLyBUcnkgdG8gZ2V0IGdpdCBpbmZvXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKGV2ZW50LmN3ZCwgXCIuZ2l0XCIpO1xuICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGdpdERpcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRGaWxlID0gcGF0aC5qb2luKGdpdERpciwgXCJIRUFEXCIpO1xuICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaGVhZEZpbGUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBmcy5yZWFkRmlsZVN5bmMoaGVhZEZpbGUsIFwidXRmLThcIikudHJpbSgpO1xuICAgICAgICAgICAgICBpZiAoaGVhZC5zdGFydHNXaXRoKFwicmVmOiByZWZzL2hlYWRzL1wiKSkge1xuICAgICAgICAgICAgICAgIHNlc3Npb24uZ2l0QnJhbmNoID0gaGVhZC5yZXBsYWNlKFwicmVmOiByZWZzL2hlYWRzL1wiLCBcIlwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIGdpdCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjbGllbnQudXBkYXRlU2Vzc2lvblN0YXRlKGV2ZW50LnNlc3Npb25JZCwgc2Vzc2lvbik7XG4gICAgICBhd2FpdCBjbGllbnQuc3luY1Nlc3Npb24oc2Vzc2lvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHVzZXIgc3VibWl0cyBhIHByb21wdFxuICAgICAqL1xuICAgIFVzZXJQcm9tcHRTdWJtaXQ6IGFzeW5jIChldmVudDogVXNlclByb21wdEV2ZW50KSA9PiB7XG4gICAgICBtZXNzYWdlQ291bnRlcisrO1xuXG4gICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgc2Vzc2lvbklkOiBldmVudC5zZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VJZDogYCR7ZXZlbnQuc2Vzc2lvbklkfS1tc2ctJHttZXNzYWdlQ291bnRlcn1gLFxuICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgcm9sZTogXCJ1c2VyXCIsXG4gICAgICAgIGNvbnRlbnQ6IGV2ZW50LnByb21wdCxcbiAgICAgICAgdGltZXN0YW1wOiBldmVudC50aW1lc3RhbXAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgY2xpZW50LnN5bmNNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgYWZ0ZXIgZWFjaCB0b29sIHVzZVxuICAgICAqL1xuICAgIFBvc3RUb29sVXNlOiBhc3luYyAoZXZlbnQ6IFRvb2xVc2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFjb25maWcuc3luY1Rvb2xDYWxscykgcmV0dXJuO1xuXG4gICAgICB0b29sQ2FsbENvdW50ZXIrKztcbiAgICAgIG1lc3NhZ2VDb3VudGVyKys7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VEYXRhID0ge1xuICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgbWVzc2FnZUlkOiBgJHtldmVudC5zZXNzaW9uSWR9LXRvb2wtJHt0b29sQ2FsbENvdW50ZXJ9YCxcbiAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgIHRvb2xOYW1lOiBldmVudC50b29sTmFtZSxcbiAgICAgICAgdG9vbEFyZ3M6IGV2ZW50LmFyZ3MsXG4gICAgICAgIHRvb2xSZXN1bHQ6IGV2ZW50LnJlc3VsdCxcbiAgICAgICAgZHVyYXRpb25NczogZXZlbnQuZHVyYXRpb25NcyxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBjbGllbnQuc3luY01lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIENsYXVkZSBzdG9wcyByZXNwb25kaW5nXG4gICAgICovXG4gICAgU3RvcDogYXN5bmMgKGV2ZW50OiBTdG9wRXZlbnQpID0+IHtcbiAgICAgIG1lc3NhZ2VDb3VudGVyKys7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VEYXRhID0ge1xuICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgbWVzc2FnZUlkOiBgJHtldmVudC5zZXNzaW9uSWR9LW1zZy0ke21lc3NhZ2VDb3VudGVyfWAsXG4gICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICBjb250ZW50OiBldmVudC5yZXNwb25zZSxcbiAgICAgICAgdG9rZW5Db3VudDogZXZlbnQudG9rZW5Vc2FnZS5pbnB1dCArIGV2ZW50LnRva2VuVXNhZ2Uub3V0cHV0LFxuICAgICAgICBkdXJhdGlvbk1zOiBldmVudC5kdXJhdGlvbk1zLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFVwZGF0ZSBzZXNzaW9uIHN0YXRlIHdpdGggdG9rZW4gdXNhZ2VcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGNsaWVudC5nZXRTZXNzaW9uU3RhdGUoZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUb2tlbnMgPSBjdXJyZW50U3RhdGUudG9rZW5Vc2FnZSB8fCB7IGlucHV0OiAwLCBvdXRwdXQ6IDAgfTtcbiAgICAgIGNsaWVudC51cGRhdGVTZXNzaW9uU3RhdGUoZXZlbnQuc2Vzc2lvbklkLCB7XG4gICAgICAgIHRva2VuVXNhZ2U6IHtcbiAgICAgICAgICBpbnB1dDogY3VycmVudFRva2Vucy5pbnB1dCArIGV2ZW50LnRva2VuVXNhZ2UuaW5wdXQsXG4gICAgICAgICAgb3V0cHV0OiBjdXJyZW50VG9rZW5zLm91dHB1dCArIGV2ZW50LnRva2VuVXNhZ2Uub3V0cHV0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gc2Vzc2lvbiBlbmRzXG4gICAgICovXG4gICAgU2Vzc2lvbkVuZDogYXN5bmMgKGV2ZW50OiBTZXNzaW9uRW5kRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGNsaWVudC5nZXRTZXNzaW9uU3RhdGUoZXZlbnQuc2Vzc2lvbklkKTtcblxuICAgICAgY29uc3Qgc2Vzc2lvbjogU2Vzc2lvbkRhdGEgPSB7XG4gICAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgICAgc2Vzc2lvbklkOiBldmVudC5zZXNzaW9uSWQsXG4gICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICBlbmRSZWFzb246IGV2ZW50LmVuZFJlYXNvbixcbiAgICAgICAgbWVzc2FnZUNvdW50OiBldmVudC5tZXNzYWdlQ291bnQsXG4gICAgICAgIHRvb2xDYWxsQ291bnQ6IGV2ZW50LnRvb2xDYWxsQ291bnQsXG4gICAgICAgIHRva2VuVXNhZ2U6IGV2ZW50LnRvdGFsVG9rZW5Vc2FnZSxcbiAgICAgICAgY29zdEVzdGltYXRlOiBldmVudC5jb3N0RXN0aW1hdGUsXG4gICAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGNsaWVudC5zeW5jU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgIGNsaWVudC5jbGVhclNlc3Npb25TdGF0ZShldmVudC5zZXNzaW9uSWQpO1xuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtjbGF1ZGUtY29kZS1zeW5jXSBTZXNzaW9uIHN5bmNlZDogJHtldmVudC5tZXNzYWdlQ291bnR9IG1lc3NhZ2VzLCAke2V2ZW50LnRvb2xDYWxsQ291bnR9IHRvb2wgY2FsbHNgXG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIERlZmF1bHQgZXhwb3J0IGZvciBDbGF1ZGUgQ29kZSBwbHVnaW4gc3lzdGVtXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVQbHVnaW47XG4iXX0=
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvSUgsZ0NBNEJDO0FBRUQsZ0NBVUM7QUFFRCxrQ0FRQztBQTRHRCxvQ0FxS0M7QUFyY0QsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qix1Q0FBeUI7QUF5SHpCLCtFQUErRTtBQUMvRSxnQkFBZ0I7QUFDaEIsK0VBQStFO0FBRS9FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzFFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBRXpELFNBQWdCLFVBQVU7SUFDeEIsb0NBQW9DO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUUvQyxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNyQixPQUFPO1lBQ0wsU0FBUyxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUNyQyxNQUFNLEVBQUUsTUFBTTtZQUNkLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixLQUFLLE9BQU87WUFDdkQsYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEtBQUssT0FBTztZQUM3RCxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsS0FBSyxNQUFNO1NBQzFELENBQUM7SUFDSixDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLElBQUksQ0FBQztRQUNILElBQUksRUFB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akMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUNoQyxPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDbEMsQ0FBQztZQUVGLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTFDLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsc0NBQXNDLEtBQUssQ0FBQyxZQUFZLGNBQWMsS0FBSyxDQUFDLGFBQWEsYUFBYSxDQUN2RyxDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLGtCQUFlLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhdWRlIENvZGUgU3luYyBQbHVnaW5cbiAqXG4gKiBTeW5jcyBDbGF1ZGUgQ29kZSBzZXNzaW9ucyB0byBPcGVuU3luYyBkYXNoYm9hcmQuXG4gKiBVc2VzIEFQSSBLZXkgYXV0aGVudGljYXRpb24gKG5vIGJyb3dzZXIgT0F1dGggcmVxdWlyZWQpLlxuICpcbiAqIEluc3RhbGw6IG5wbSBpbnN0YWxsIC1nIGNsYXVkZS1jb2RlLXN5bmNcbiAqIENvbmZpZ3VyZTogY2xhdWRlLWNvZGUtc3luYyBsb2dpblxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgY29udmV4VXJsOiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICBhdXRvU3luYz86IGJvb2xlYW47XG4gIHN5bmNUb29sQ2FsbHM/OiBib29sZWFuO1xuICBzeW5jVGhpbmtpbmc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25EYXRhIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiO1xuICB0aXRsZT86IHN0cmluZztcbiAgcHJvamVjdFBhdGg/OiBzdHJpbmc7XG4gIHByb2plY3ROYW1lPzogc3RyaW5nO1xuICBjd2Q/OiBzdHJpbmc7XG4gIGdpdEJyYW5jaD86IHN0cmluZztcbiAgZ2l0UmVwbz86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHN0YXJ0VHlwZT86IFwibmV3XCIgfCBcInJlc3VtZVwiIHwgXCJjb250aW51ZVwiO1xuICBlbmRSZWFzb24/OiBcInVzZXJfc3RvcFwiIHwgXCJtYXhfdHVybnNcIiB8IFwiZXJyb3JcIiB8IFwiY29tcGxldGVkXCI7XG4gIHRoaW5raW5nRW5hYmxlZD86IGJvb2xlYW47XG4gIHBlcm1pc3Npb25Nb2RlPzogc3RyaW5nO1xuICBtY3BTZXJ2ZXJzPzogc3RyaW5nW107XG4gIG1lc3NhZ2VDb3VudD86IG51bWJlcjtcbiAgdG9vbENhbGxDb3VudD86IG51bWJlcjtcbiAgdG9rZW5Vc2FnZT86IHtcbiAgICBpbnB1dDogbnVtYmVyO1xuICAgIG91dHB1dDogbnVtYmVyO1xuICB9O1xuICBjb3N0RXN0aW1hdGU/OiBudW1iZXI7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgZW5kZWRBdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGF0YSB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgc291cmNlOiBcImNsYXVkZS1jb2RlXCI7XG4gIHJvbGU6IFwidXNlclwiIHwgXCJhc3Npc3RhbnRcIiB8IFwic3lzdGVtXCI7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIHRoaW5raW5nQ29udGVudD86IHN0cmluZztcbiAgdG9vbE5hbWU/OiBzdHJpbmc7XG4gIHRvb2xBcmdzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRvb2xSZXN1bHQ/OiBzdHJpbmc7XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIHRva2VuQ291bnQ/OiBudW1iZXI7XG4gIHRpbWVzdGFtcD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb29sVXNlRGF0YSB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xuICB0b29sQXJncz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXN1bHQ/OiBzdHJpbmc7XG4gIHN1Y2Nlc3M/OiBib29sZWFuO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICB0aW1lc3RhbXA/OiBzdHJpbmc7XG59XG5cbi8vIENsYXVkZSBDb2RlIEhvb2sgVHlwZXNcbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlQ29kZUhvb2tzIHtcbiAgU2Vzc2lvblN0YXJ0PzogKGRhdGE6IFNlc3Npb25TdGFydEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgVXNlclByb21wdFN1Ym1pdD86IChkYXRhOiBVc2VyUHJvbXB0RXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBQb3N0VG9vbFVzZT86IChkYXRhOiBUb29sVXNlRXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBTdG9wPzogKGRhdGE6IFN0b3BFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIFNlc3Npb25FbmQ/OiAoZGF0YTogU2Vzc2lvbkVuZEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uU3RhcnRFdmVudCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBjd2Q6IHN0cmluZztcbiAgbW9kZWw6IHN0cmluZztcbiAgc3RhcnRUeXBlOiBcIm5ld1wiIHwgXCJyZXN1bWVcIiB8IFwiY29udGludWVcIjtcbiAgdGhpbmtpbmdFbmFibGVkPzogYm9vbGVhbjtcbiAgcGVybWlzc2lvbk1vZGU/OiBzdHJpbmc7XG4gIG1jcFNlcnZlcnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyUHJvbXB0RXZlbnQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgcHJvbXB0OiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xVc2VFdmVudCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xuICBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVzdWx0OiBzdHJpbmc7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9wRXZlbnQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgcmVzcG9uc2U6IHN0cmluZztcbiAgdG9rZW5Vc2FnZToge1xuICAgIGlucHV0OiBudW1iZXI7XG4gICAgb3V0cHV0OiBudW1iZXI7XG4gIH07XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uRW5kRXZlbnQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgZW5kUmVhc29uOiBcInVzZXJfc3RvcFwiIHwgXCJtYXhfdHVybnNcIiB8IFwiZXJyb3JcIiB8IFwiY29tcGxldGVkXCI7XG4gIG1lc3NhZ2VDb3VudDogbnVtYmVyO1xuICB0b29sQ2FsbENvdW50OiBudW1iZXI7XG4gIHRvdGFsVG9rZW5Vc2FnZToge1xuICAgIGlucHV0OiBudW1iZXI7XG4gICAgb3V0cHV0OiBudW1iZXI7XG4gIH07XG4gIGNvc3RFc3RpbWF0ZTogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb25maWd1cmF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IENPTkZJR19ESVIgPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCBcIi5jb25maWdcIiwgXCJjbGF1ZGUtY29kZS1zeW5jXCIpO1xuY29uc3QgQ09ORklHX0ZJTEUgPSBwYXRoLmpvaW4oQ09ORklHX0RJUiwgXCJjb25maWcuanNvblwiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb25maWcoKTogQ29uZmlnIHwgbnVsbCB7XG4gIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlcyBmaXJzdFxuICBjb25zdCBlbnZVcmwgPSBwcm9jZXNzLmVudi5DTEFVREVfU1lOQ19DT05WRVhfVVJMO1xuICBjb25zdCBlbnZLZXkgPSBwcm9jZXNzLmVudi5DTEFVREVfU1lOQ19BUElfS0VZO1xuXG4gIGlmIChlbnZVcmwgJiYgZW52S2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnZleFVybDogbm9ybWFsaXplQ29udmV4VXJsKGVudlVybCksXG4gICAgICBhcGlLZXk6IGVudktleSxcbiAgICAgIGF1dG9TeW5jOiBwcm9jZXNzLmVudi5DTEFVREVfU1lOQ19BVVRPX1NZTkMgIT09IFwiZmFsc2VcIixcbiAgICAgIHN5bmNUb29sQ2FsbHM6IHByb2Nlc3MuZW52LkNMQVVERV9TWU5DX1RPT0xfQ0FMTFMgIT09IFwiZmFsc2VcIixcbiAgICAgIHN5bmNUaGlua2luZzogcHJvY2Vzcy5lbnYuQ0xBVURFX1NZTkNfVEhJTktJTkcgPT09IFwidHJ1ZVwiLFxuICAgIH07XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gY29uZmlnIGZpbGVcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhDT05GSUdfRklMRSkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMoQ09ORklHX0ZJTEUsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKGRhdGEpIGFzIENvbmZpZztcbiAgICAgIGNvbmZpZy5jb252ZXhVcmwgPSBub3JtYWxpemVDb252ZXhVcmwoY29uZmlnLmNvbnZleFVybCk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbG9hZGluZyBjb25maWc6XCIsIGVycm9yKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUNvbmZpZyhjb25maWc6IENvbmZpZyk6IHZvaWQge1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhDT05GSUdfRElSKSkge1xuICAgICAgZnMubWtkaXJTeW5jKENPTkZJR19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBmcy53cml0ZUZpbGVTeW5jKENPTkZJR19GSUxFLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc2F2aW5nIGNvbmZpZzpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbmZpZygpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhDT05GSUdfRklMRSkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMoQ09ORklHX0ZJTEUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgY2xlYXJpbmcgY29uZmlnOlwiLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29udmV4VXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQ29udmVydCAuY29udmV4LmNsb3VkIHRvIC5jb252ZXguc2l0ZSBmb3IgQVBJIGNhbGxzXG4gIHJldHVybiB1cmwucmVwbGFjZShcIi5jb252ZXguY2xvdWRcIiwgXCIuY29udmV4LnNpdGVcIik7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFN5bmMgQ2xpZW50XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBTeW5jQ2xpZW50IHtcbiAgcHJpdmF0ZSBjb25maWc6IENvbmZpZztcbiAgcHJpdmF0ZSBzaXRlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgc2Vzc2lvbkNhY2hlOiBNYXA8c3RyaW5nLCBQYXJ0aWFsPFNlc3Npb25EYXRhPj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAvLyBOb3JtYWxpemUgVVJMIHRvIC5jb252ZXguc2l0ZSBmb3IgSFRUUCBlbmRwb2ludHNcbiAgICAvLyBTdXBwb3J0cyBib3RoIC5jb252ZXguY2xvdWQgYW5kIC5jb252ZXguc2l0ZSBpbnB1dCBVUkxzXG4gICAgdGhpcy5zaXRlVXJsID0gY29uZmlnLmNvbnZleFVybC5yZXBsYWNlKFwiLmNvbnZleC5jbG91ZFwiLCBcIi5jb252ZXguc2l0ZVwiKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdChlbmRwb2ludDogc3RyaW5nLCBkYXRhOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5zaXRlVXJsfSR7ZW5kcG9pbnR9YDtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmFwaUtleX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAtICR7dGV4dH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICB9XG5cbiAgYXN5bmMgc3luY1Nlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbkRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KFwiL3N5bmMvc2Vzc2lvblwiLCBzZXNzaW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBzeW5jIHNlc3Npb246XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzeW5jTWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoXCIvc3luYy9tZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHN5bmMgbWVzc2FnZTpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN5bmNCYXRjaChcbiAgICBzZXNzaW9uczogU2Vzc2lvbkRhdGFbXSxcbiAgICBtZXNzYWdlczogTWVzc2FnZURhdGFbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KFwiL3N5bmMvYmF0Y2hcIiwgeyBzZXNzaW9ucywgbWVzc2FnZXMgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc3luYyBiYXRjaDpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNpdGVVcmx9L2hlYWx0aGA7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2Uub2s7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2Vzc2lvbiBzdGF0ZSBtYW5hZ2VtZW50XG4gIGdldFNlc3Npb25TdGF0ZShzZXNzaW9uSWQ6IHN0cmluZyk6IFBhcnRpYWw8U2Vzc2lvbkRhdGE+IHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25JZCkgfHwge307XG4gIH1cblxuICB1cGRhdGVTZXNzaW9uU3RhdGUoXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxTZXNzaW9uRGF0YT5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2Vzc2lvbkNhY2hlLmdldChzZXNzaW9uSWQpIHx8IHt9O1xuICAgIHRoaXMuc2Vzc2lvbkNhY2hlLnNldChzZXNzaW9uSWQsIHsgLi4uY3VycmVudCwgLi4udXBkYXRlcyB9KTtcbiAgfVxuXG4gIGNsZWFyU2Vzc2lvblN0YXRlKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXNzaW9uQ2FjaGUuZGVsZXRlKHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGx1Z2luIEV4cG9ydFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENsYXVkZSBDb2RlIFBsdWdpbiBFbnRyeSBQb2ludFxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IENsYXVkZSBDb2RlIHRvIHJlZ2lzdGVyIHRoZSBwbHVnaW4uXG4gKiBJdCByZXR1cm5zIGhvb2sgaGFuZGxlcnMgdGhhdCBmaXJlIGF0IGtleSBwb2ludHMgaW4gdGhlIHNlc3Npb24gbGlmZWN5Y2xlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luKCk6IENsYXVkZUNvZGVIb29rcyB8IG51bGwge1xuICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgaWYgKCFjb25maWcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiW2NsYXVkZS1jb2RlLXN5bmNdIE5vdCBjb25maWd1cmVkLiBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cC5cIlxuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dG9TeW5jID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKFwiW2NsYXVkZS1jb2RlLXN5bmNdIEF1dG8tc3luYyBkaXNhYmxlZCBpbiBjb25maWcuXCIpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcbiAgbGV0IG1lc3NhZ2VDb3VudGVyID0gMDtcbiAgbGV0IHRvb2xDYWxsQ291bnRlciA9IDA7XG5cbiAgY29uc29sZS5sb2coXCJbY2xhdWRlLWNvZGUtc3luY10gUGx1Z2luIGxvYWRlZC4gU2Vzc2lvbnMgd2lsbCBzeW5jIHRvIE9wZW5TeW5jLlwiKTtcblxuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IHNlc3Npb24gc3RhcnRzXG4gICAgICovXG4gICAgU2Vzc2lvblN0YXJ0OiBhc3luYyAoZXZlbnQ6IFNlc3Npb25TdGFydEV2ZW50KSA9PiB7XG4gICAgICBtZXNzYWdlQ291bnRlciA9IDA7XG4gICAgICB0b29sQ2FsbENvdW50ZXIgPSAwO1xuXG4gICAgICBjb25zdCBzZXNzaW9uOiBTZXNzaW9uRGF0YSA9IHtcbiAgICAgICAgc2Vzc2lvbklkOiBldmVudC5zZXNzaW9uSWQsXG4gICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICBjd2Q6IGV2ZW50LmN3ZCxcbiAgICAgICAgbW9kZWw6IGV2ZW50Lm1vZGVsLFxuICAgICAgICBzdGFydFR5cGU6IGV2ZW50LnN0YXJ0VHlwZSxcbiAgICAgICAgdGhpbmtpbmdFbmFibGVkOiBldmVudC50aGlua2luZ0VuYWJsZWQsXG4gICAgICAgIHBlcm1pc3Npb25Nb2RlOiBldmVudC5wZXJtaXNzaW9uTW9kZSxcbiAgICAgICAgbWNwU2VydmVyczogZXZlbnQubWNwU2VydmVycyxcbiAgICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuXG4gICAgICAvLyBFeHRyYWN0IHByb2plY3QgaW5mbyBmcm9tIGN3ZFxuICAgICAgaWYgKGV2ZW50LmN3ZCkge1xuICAgICAgICBzZXNzaW9uLnByb2plY3RQYXRoID0gZXZlbnQuY3dkO1xuICAgICAgICBzZXNzaW9uLnByb2plY3ROYW1lID0gcGF0aC5iYXNlbmFtZShldmVudC5jd2QpO1xuXG4gICAgICAgIC8vIFRyeSB0byBnZXQgZ2l0IGluZm9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4oZXZlbnQuY3dkLCBcIi5naXRcIik7XG4gICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZ2l0RGlyKSkge1xuICAgICAgICAgICAgY29uc3QgaGVhZEZpbGUgPSBwYXRoLmpvaW4oZ2l0RGlyLCBcIkhFQURcIik7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhoZWFkRmlsZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgaGVhZCA9IGZzLnJlYWRGaWxlU3luYyhoZWFkRmlsZSwgXCJ1dGYtOFwiKS50cmltKCk7XG4gICAgICAgICAgICAgIGlmIChoZWFkLnN0YXJ0c1dpdGgoXCJyZWY6IHJlZnMvaGVhZHMvXCIpKSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5naXRCcmFuY2ggPSBoZWFkLnJlcGxhY2UoXCJyZWY6IHJlZnMvaGVhZHMvXCIsIFwiXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZ2l0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNsaWVudC51cGRhdGVTZXNzaW9uU3RhdGUoZXZlbnQuc2Vzc2lvbklkLCBzZXNzaW9uKTtcbiAgICAgIGF3YWl0IGNsaWVudC5zeW5jU2Vzc2lvbihzZXNzaW9uKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdXNlciBzdWJtaXRzIGEgcHJvbXB0XG4gICAgICovXG4gICAgVXNlclByb21wdFN1Ym1pdDogYXN5bmMgKGV2ZW50OiBVc2VyUHJvbXB0RXZlbnQpID0+IHtcbiAgICAgIG1lc3NhZ2VDb3VudGVyKys7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VEYXRhID0ge1xuICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgbWVzc2FnZUlkOiBgJHtldmVudC5zZXNzaW9uSWR9LW1zZy0ke21lc3NhZ2VDb3VudGVyfWAsXG4gICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgICAgY29udGVudDogZXZlbnQucHJvbXB0LFxuICAgICAgICB0aW1lc3RhbXA6IGV2ZW50LnRpbWVzdGFtcCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBjbGllbnQuc3luY01lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBhZnRlciBlYWNoIHRvb2wgdXNlXG4gICAgICovXG4gICAgUG9zdFRvb2xVc2U6IGFzeW5jIChldmVudDogVG9vbFVzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWNvbmZpZy5zeW5jVG9vbENhbGxzKSByZXR1cm47XG5cbiAgICAgIHRvb2xDYWxsQ291bnRlcisrO1xuICAgICAgbWVzc2FnZUNvdW50ZXIrKztcblxuICAgICAgY29uc3QgbWVzc2FnZTogTWVzc2FnZURhdGEgPSB7XG4gICAgICAgIHNlc3Npb25JZDogZXZlbnQuc2Vzc2lvbklkLFxuICAgICAgICBtZXNzYWdlSWQ6IGAke2V2ZW50LnNlc3Npb25JZH0tdG9vbC0ke3Rvb2xDYWxsQ291bnRlcn1gLFxuICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgdG9vbE5hbWU6IGV2ZW50LnRvb2xOYW1lLFxuICAgICAgICB0b29sQXJnczogZXZlbnQuYXJncyxcbiAgICAgICAgdG9vbFJlc3VsdDogZXZlbnQucmVzdWx0LFxuICAgICAgICBkdXJhdGlvbk1zOiBldmVudC5kdXJhdGlvbk1zLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gQ2xhdWRlIHN0b3BzIHJlc3BvbmRpbmdcbiAgICAgKi9cbiAgICBTdG9wOiBhc3luYyAoZXZlbnQ6IFN0b3BFdmVudCkgPT4ge1xuICAgICAgbWVzc2FnZUNvdW50ZXIrKztcblxuICAgICAgY29uc3QgbWVzc2FnZTogTWVzc2FnZURhdGEgPSB7XG4gICAgICAgIHNlc3Npb25JZDogZXZlbnQuc2Vzc2lvbklkLFxuICAgICAgICBtZXNzYWdlSWQ6IGAke2V2ZW50LnNlc3Npb25JZH0tbXNnLSR7bWVzc2FnZUNvdW50ZXJ9YCxcbiAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgIGNvbnRlbnQ6IGV2ZW50LnJlc3BvbnNlLFxuICAgICAgICB0b2tlbkNvdW50OiBldmVudC50b2tlblVzYWdlLmlucHV0ICsgZXZlbnQudG9rZW5Vc2FnZS5vdXRwdXQsXG4gICAgICAgIGR1cmF0aW9uTXM6IGV2ZW50LmR1cmF0aW9uTXMsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgLy8gVXBkYXRlIHNlc3Npb24gc3RhdGUgd2l0aCB0b2tlbiB1c2FnZVxuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gY2xpZW50LmdldFNlc3Npb25TdGF0ZShldmVudC5zZXNzaW9uSWQpO1xuICAgICAgY29uc3QgY3VycmVudFRva2VucyA9IGN1cnJlbnRTdGF0ZS50b2tlblVzYWdlIHx8IHsgaW5wdXQ6IDAsIG91dHB1dDogMCB9O1xuICAgICAgY2xpZW50LnVwZGF0ZVNlc3Npb25TdGF0ZShldmVudC5zZXNzaW9uSWQsIHtcbiAgICAgICAgdG9rZW5Vc2FnZToge1xuICAgICAgICAgIGlucHV0OiBjdXJyZW50VG9rZW5zLmlucHV0ICsgZXZlbnQudG9rZW5Vc2FnZS5pbnB1dCxcbiAgICAgICAgICBvdXRwdXQ6IGN1cnJlbnRUb2tlbnMub3V0cHV0ICsgZXZlbnQudG9rZW5Vc2FnZS5vdXRwdXQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgY2xpZW50LnN5bmNNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBzZXNzaW9uIGVuZHNcbiAgICAgKi9cbiAgICBTZXNzaW9uRW5kOiBhc3luYyAoZXZlbnQ6IFNlc3Npb25FbmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gY2xpZW50LmdldFNlc3Npb25TdGF0ZShldmVudC5zZXNzaW9uSWQpO1xuXG4gICAgICBjb25zdCBzZXNzaW9uOiBTZXNzaW9uRGF0YSA9IHtcbiAgICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgIGVuZFJlYXNvbjogZXZlbnQuZW5kUmVhc29uLFxuICAgICAgICBtZXNzYWdlQ291bnQ6IGV2ZW50Lm1lc3NhZ2VDb3VudCxcbiAgICAgICAgdG9vbENhbGxDb3VudDogZXZlbnQudG9vbENhbGxDb3VudCxcbiAgICAgICAgdG9rZW5Vc2FnZTogZXZlbnQudG90YWxUb2tlblVzYWdlLFxuICAgICAgICBjb3N0RXN0aW1hdGU6IGV2ZW50LmNvc3RFc3RpbWF0ZSxcbiAgICAgICAgZW5kZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgY2xpZW50LmNsZWFyU2Vzc2lvblN0YXRlKGV2ZW50LnNlc3Npb25JZCk7XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW2NsYXVkZS1jb2RlLXN5bmNdIFNlc3Npb24gc3luY2VkOiAke2V2ZW50Lm1lc3NhZ2VDb3VudH0gbWVzc2FnZXMsICR7ZXZlbnQudG9vbENhbGxDb3VudH0gdG9vbCBjYWxsc2BcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gRGVmYXVsdCBleHBvcnQgZm9yIENsYXVkZSBDb2RlIHBsdWdpbiBzeXN0ZW1cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVBsdWdpbjtcbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-sync",
3
- "version": "0.1.1",
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",
package/docs/commands.md DELETED
@@ -1,374 +0,0 @@
1
- # claude-code-sync Commands Reference
2
-
3
- **GitHub:** [github.com/waynesutton/claude-code-sync](https://github.com/waynesutton/claude-code-sync) | **npm:** [npmjs.com/package/claude-code-sync](https://www.npmjs.com/package/claude-code-sync)
4
-
5
- Complete reference for all claude-code-sync CLI commands, configuration options, and troubleshooting.
6
-
7
- ## Installation
8
-
9
- ### Install globally via npm
10
-
11
- ```bash
12
- npm install -g claude-code-sync
13
- ```
14
-
15
- ### Verify installation
16
-
17
- ```bash
18
- claude-code-sync --version
19
- ```
20
-
21
- ### Update to latest version
22
-
23
- ```bash
24
- npm update -g claude-code-sync
25
- ```
26
-
27
- ### Uninstall
28
-
29
- ```bash
30
- npm uninstall -g claude-code-sync
31
- ```
32
-
33
- ### Reinstall (clean)
34
-
35
- ```bash
36
- npm uninstall -g claude-code-sync && npm install -g claude-code-sync
37
- ```
38
-
39
- ## Commands
40
-
41
- ### login
42
-
43
- Configure your Convex URL and API Key.
44
-
45
- ```bash
46
- claude-code-sync login
47
- ```
48
-
49
- **Interactive prompts:**
50
- - Convex URL: Your deployment URL (e.g., `https://your-project.convex.cloud`)
51
- - API Key: Your API key from Settings (starts with `osk_`)
52
-
53
- **What it does:**
54
- 1. Validates the Convex URL format
55
- 2. Validates the API key format
56
- 3. Tests the connection to your backend
57
- 4. Saves credentials to `~/.config/claude-code-sync/config.json`
58
-
59
- ### logout
60
-
61
- Clear stored credentials.
62
-
63
- ```bash
64
- claude-code-sync logout
65
- ```
66
-
67
- Removes the config file at `~/.config/claude-code-sync/config.json`.
68
-
69
- ### status
70
-
71
- Show connection status and current configuration.
72
-
73
- ```bash
74
- claude-code-sync status
75
- ```
76
-
77
- **Output includes:**
78
- - Convex URL
79
- - API Key (masked)
80
- - Auto sync status
81
- - Tool calls sync status
82
- - Thinking sync status
83
- - Connection test result
84
-
85
- ### config
86
-
87
- Display current configuration.
88
-
89
- ```bash
90
- claude-code-sync config
91
- ```
92
-
93
- **Options:**
94
-
95
- | Flag | Description |
96
- |------|-------------|
97
- | `--json` | Output as JSON |
98
-
99
- **Examples:**
100
-
101
- ```bash
102
- # Human readable output
103
- claude-code-sync config
104
-
105
- # JSON output for scripting
106
- claude-code-sync config --json
107
- ```
108
-
109
- ### set
110
-
111
- Update a configuration value.
112
-
113
- ```bash
114
- claude-code-sync set <key> <value>
115
- ```
116
-
117
- **Available keys:**
118
-
119
- | Key | Type | Default | Description |
120
- |-----|------|---------|-------------|
121
- | `autoSync` | boolean | `true` | Automatically sync sessions |
122
- | `syncToolCalls` | boolean | `true` | Include tool call details |
123
- | `syncThinking` | boolean | `false` | Include thinking traces |
124
-
125
- **Valid values for booleans:** `true`, `false`, `1`, `0`, `yes`, `no`
126
-
127
- **Examples:**
128
-
129
- ```bash
130
- # Enable thinking sync
131
- claude-code-sync set syncThinking true
132
-
133
- # Disable tool call sync
134
- claude-code-sync set syncToolCalls false
135
-
136
- # Disable auto sync
137
- claude-code-sync set autoSync false
138
- ```
139
-
140
- ### help
141
-
142
- Display help information.
143
-
144
- ```bash
145
- claude-code-sync --help
146
- claude-code-sync help
147
- claude-code-sync help <command>
148
- ```
149
-
150
- **Examples:**
151
-
152
- ```bash
153
- # General help
154
- claude-code-sync --help
155
-
156
- # Help for specific command
157
- claude-code-sync help login
158
- claude-code-sync help set
159
- ```
160
-
161
- ### version
162
-
163
- Display version number.
164
-
165
- ```bash
166
- claude-code-sync --version
167
- claude-code-sync -V
168
- ```
169
-
170
- ## Environment Variables
171
-
172
- Environment variables override config file settings.
173
-
174
- | Variable | Description | Example |
175
- |----------|-------------|---------|
176
- | `CLAUDE_SYNC_CONVEX_URL` | Convex deployment URL | `https://your-project.convex.cloud` |
177
- | `CLAUDE_SYNC_API_KEY` | API key from Settings | `osk_abc123...` |
178
- | `CLAUDE_SYNC_AUTO_SYNC` | Enable/disable auto sync | `true` or `false` |
179
- | `CLAUDE_SYNC_TOOL_CALLS` | Sync tool call details | `true` or `false` |
180
- | `CLAUDE_SYNC_THINKING` | Sync thinking traces | `true` or `false` |
181
-
182
- **Example usage:**
183
-
184
- ```bash
185
- # Set in shell profile (.bashrc, .zshrc)
186
- export CLAUDE_SYNC_CONVEX_URL="https://your-project.convex.cloud"
187
- export CLAUDE_SYNC_API_KEY="osk_your_api_key"
188
-
189
- # Or inline for single session
190
- CLAUDE_SYNC_CONVEX_URL="https://..." CLAUDE_SYNC_API_KEY="osk_..." claude
191
- ```
192
-
193
- ## Configuration File
194
-
195
- Location: `~/.config/claude-code-sync/config.json`
196
-
197
- **Structure:**
198
-
199
- ```json
200
- {
201
- "convexUrl": "https://your-project.convex.cloud",
202
- "apiKey": "osk_your_api_key",
203
- "autoSync": true,
204
- "syncToolCalls": true,
205
- "syncThinking": false
206
- }
207
- ```
208
-
209
- **View config file:**
210
-
211
- ```bash
212
- cat ~/.config/claude-code-sync/config.json
213
- ```
214
-
215
- **Reset config:**
216
-
217
- ```bash
218
- rm ~/.config/claude-code-sync/config.json
219
- claude-code-sync login
220
- ```
221
-
222
- ## Troubleshooting
223
-
224
- ### Connection failed
225
-
226
- **Symptom:** "Could not connect to Convex backend"
227
-
228
- **Solutions:**
229
-
230
- 1. Verify URL format:
231
- ```bash
232
- # Correct format
233
- https://your-project.convex.cloud
234
-
235
- # Wrong formats
236
- your-project.convex.cloud # Missing https://
237
- https://your-project.convex.cloud/ # Trailing slash
238
- ```
239
-
240
- 2. Check if backend is deployed:
241
- ```bash
242
- curl https://your-project.convex.site/health
243
- ```
244
-
245
- 3. Verify API key:
246
- - Must start with `osk_`
247
- - Generate a new key in Settings if needed
248
-
249
- ### Invalid API Key
250
-
251
- **Symptom:** "Invalid API Key. Must start with osk_"
252
-
253
- **Solution:** Generate a new API key from your OpenSync dashboard Settings page.
254
-
255
- ### Plugin not loading
256
-
257
- **Symptom:** Sessions not syncing
258
-
259
- **Check configuration:**
260
-
261
- ```bash
262
- claude-code-sync status
263
- ```
264
-
265
- **Verify plugin is recognized:**
266
-
267
- ```bash
268
- # Check if globally installed
269
- npm list -g claude-code-sync
270
-
271
- # Check installation location
272
- which claude-code-sync
273
- ```
274
-
275
- ### Permission errors
276
-
277
- **Symptom:** EACCES or permission denied during install
278
-
279
- **Solutions:**
280
-
281
- ```bash
282
- # Fix npm permissions (recommended)
283
- mkdir -p ~/.npm-global
284
- npm config set prefix '~/.npm-global'
285
- echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
286
- source ~/.bashrc
287
-
288
- # Or use sudo (not recommended)
289
- sudo npm install -g claude-code-sync
290
- ```
291
-
292
- ### Cache issues
293
-
294
- **Symptom:** Stale data or unexpected behavior
295
-
296
- **Clear npm cache:**
297
-
298
- ```bash
299
- npm cache clean --force
300
- npm uninstall -g claude-code-sync
301
- npm install -g claude-code-sync
302
- ```
303
-
304
- ### Check Node.js version
305
-
306
- **Requirement:** Node.js 18 or later
307
-
308
- ```bash
309
- node --version
310
- ```
311
-
312
- If below v18:
313
-
314
- ```bash
315
- # Using nvm
316
- nvm install 18
317
- nvm use 18
318
-
319
- # Or upgrade Node.js directly
320
- ```
321
-
322
- ### Debug mode
323
-
324
- View verbose output:
325
-
326
- ```bash
327
- DEBUG=* claude-code-sync status
328
- ```
329
-
330
- ### View logs
331
-
332
- Check for errors in Claude Code output when starting a session.
333
-
334
- ### Reset everything
335
-
336
- Complete reset:
337
-
338
- ```bash
339
- # Remove plugin
340
- npm uninstall -g claude-code-sync
341
-
342
- # Remove config
343
- rm -rf ~/.config/claude-code-sync
344
-
345
- # Reinstall
346
- npm install -g claude-code-sync
347
-
348
- # Reconfigure
349
- claude-code-sync login
350
- ```
351
-
352
- ## Quick Reference
353
-
354
- | Task | Command |
355
- |------|---------|
356
- | Install | `npm install -g claude-code-sync` |
357
- | Setup | `claude-code-sync login` |
358
- | Check status | `claude-code-sync status` |
359
- | View config | `claude-code-sync config` |
360
- | View config (JSON) | `claude-code-sync config --json` |
361
- | Enable thinking sync | `claude-code-sync set syncThinking true` |
362
- | Disable tool sync | `claude-code-sync set syncToolCalls false` |
363
- | Clear credentials | `claude-code-sync logout` |
364
- | Check version | `claude-code-sync --version` |
365
- | Update | `npm update -g claude-code-sync` |
366
- | Uninstall | `npm uninstall -g claude-code-sync` |
367
- | Full reset | `npm uninstall -g claude-code-sync && rm -rf ~/.config/claude-code-sync && npm install -g claude-code-sync` |
368
-
369
- ## Links
370
-
371
- - [npm Package](https://www.npmjs.com/package/claude-code-sync)
372
- - [GitHub Repository](https://github.com/waynesutton/claude-code-sync)
373
- - [OpenSync Backend](https://github.com/waynesutton/opensync)
374
- - [OpenSync Dashboard](https://opensyncsessions.netlify.app)