@lokeshhh/devblitz-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/bin/run +3 -0
  2. package/dist/commands/init.d.ts +7 -0
  3. package/dist/commands/init.d.ts.map +1 -0
  4. package/dist/commands/init.js +152 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/commands/login.d.ts +7 -0
  7. package/dist/commands/login.d.ts.map +1 -0
  8. package/dist/commands/login.js +75 -0
  9. package/dist/commands/login.js.map +1 -0
  10. package/dist/commands/run.d.ts +7 -0
  11. package/dist/commands/run.d.ts.map +1 -0
  12. package/dist/commands/run.js +385 -0
  13. package/dist/commands/run.js.map +1 -0
  14. package/dist/commands/status.d.ts +7 -0
  15. package/dist/commands/status.d.ts.map +1 -0
  16. package/dist/commands/status.js +121 -0
  17. package/dist/commands/status.js.map +1 -0
  18. package/dist/components/Header.d.ts +9 -0
  19. package/dist/components/Header.d.ts.map +1 -0
  20. package/dist/components/Header.js +7 -0
  21. package/dist/components/Header.js.map +1 -0
  22. package/dist/components/HelpView.d.ts +7 -0
  23. package/dist/components/HelpView.d.ts.map +1 -0
  24. package/dist/components/HelpView.js +51 -0
  25. package/dist/components/HelpView.js.map +1 -0
  26. package/dist/components/ProgressBar.d.ts +9 -0
  27. package/dist/components/ProgressBar.d.ts.map +1 -0
  28. package/dist/components/ProgressBar.js +10 -0
  29. package/dist/components/ProgressBar.js.map +1 -0
  30. package/dist/components/Spinner.d.ts +12 -0
  31. package/dist/components/Spinner.d.ts.map +1 -0
  32. package/dist/components/Spinner.js +21 -0
  33. package/dist/components/Spinner.js.map +1 -0
  34. package/dist/components/StatusMessage.d.ts +8 -0
  35. package/dist/components/StatusMessage.d.ts.map +1 -0
  36. package/dist/components/StatusMessage.js +26 -0
  37. package/dist/components/StatusMessage.js.map +1 -0
  38. package/dist/components/Table.d.ts +15 -0
  39. package/dist/components/Table.d.ts.map +1 -0
  40. package/dist/components/Table.js +26 -0
  41. package/dist/components/Table.js.map +1 -0
  42. package/dist/components/TestResultLine.d.ts +9 -0
  43. package/dist/components/TestResultLine.d.ts.map +1 -0
  44. package/dist/components/TestResultLine.js +29 -0
  45. package/dist/components/TestResultLine.js.map +1 -0
  46. package/dist/components/index.d.ts +8 -0
  47. package/dist/components/index.d.ts.map +1 -0
  48. package/dist/components/index.js +8 -0
  49. package/dist/components/index.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +59 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/utils/api.d.ts +5 -0
  55. package/dist/utils/api.d.ts.map +1 -0
  56. package/dist/utils/api.js +60 -0
  57. package/dist/utils/api.js.map +1 -0
  58. package/dist/utils/auth.d.ts +24 -0
  59. package/dist/utils/auth.d.ts.map +1 -0
  60. package/dist/utils/auth.js +79 -0
  61. package/dist/utils/auth.js.map +1 -0
  62. package/dist/utils/helpers.d.ts +8 -0
  63. package/dist/utils/helpers.d.ts.map +1 -0
  64. package/dist/utils/helpers.js +36 -0
  65. package/dist/utils/helpers.js.map +1 -0
  66. package/dist/utils/theme.d.ts +27 -0
  67. package/dist/utils/theme.d.ts.map +1 -0
  68. package/dist/utils/theme.js +32 -0
  69. package/dist/utils/theme.js.map +1 -0
  70. package/package.json +57 -0
@@ -0,0 +1,385 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState, useEffect } from 'react';
3
+ import { Box, Text, useApp } from 'ink';
4
+ import { Spinner, StatusMessage, Header, TestResultLine, ProgressBar } from '../components/index.js';
5
+ import { isAuthenticated } from '../utils/auth.js';
6
+ import { apiRequest } from '../utils/api.js';
7
+ import { spacing, symbols } from '../utils/theme.js';
8
+ import { join, dirname, resolve } from 'path';
9
+ import { writeFileSync, mkdirSync, existsSync, readFileSync, unlinkSync } from 'fs';
10
+ import { execa } from 'execa';
11
+ import { createHash } from 'crypto';
12
+ import axios from 'axios';
13
+ import os from 'os';
14
+ import fsExtra from 'fs-extra';
15
+ import { fileURLToPath } from 'url';
16
+ function getGlobalContestDir(contestId) {
17
+ const homeDir = os.homedir();
18
+ return join(homeDir, '.devblitz', 'contests', contestId);
19
+ }
20
+ function getContestConfig(contestId) {
21
+ const configPath = join(os.homedir(), '.devblitz', 'config', `${contestId}.json`);
22
+ if (!existsSync(configPath)) {
23
+ return null;
24
+ }
25
+ return JSON.parse(readFileSync(configPath, 'utf-8'));
26
+ }
27
+ export const Run = ({ chapterUuid }) => {
28
+ const { exit } = useApp();
29
+ const [step, setStep] = useState('loading');
30
+ const [chapterName, setChapterName] = useState('');
31
+ const [testCases, setTestCases] = useState([]);
32
+ const [currentTestIndex, setCurrentTestIndex] = useState(0);
33
+ const [totalTests, setTotalTests] = useState(0);
34
+ const [results, setResults] = useState(null);
35
+ const [submissionResult, setSubmissionResult] = useState(null);
36
+ const [errorMessage, setErrorMessage] = useState('');
37
+ // Parse vitest JSON output
38
+ const parseVitestJsonOutput = (output) => {
39
+ console.log('parseVitestJsonOutput', output);
40
+ const result = {
41
+ passed: 0,
42
+ failed: 0,
43
+ total: 0,
44
+ testCases: [],
45
+ executionTime: 0,
46
+ };
47
+ try {
48
+ const lines = output.split('\n');
49
+ let data = null;
50
+ // Find JSON line with test results
51
+ for (const line of lines) {
52
+ const trimmed = line.trim();
53
+ if (trimmed.startsWith('{') && trimmed.includes('"numTotalTests"')) {
54
+ try {
55
+ data = JSON.parse(trimmed);
56
+ break;
57
+ }
58
+ catch (e) {
59
+ continue;
60
+ }
61
+ }
62
+ }
63
+ if (!data) {
64
+ for (const line of lines) {
65
+ const trimmed = line.trim();
66
+ if (trimmed.startsWith('{') && trimmed.includes('"testResults"')) {
67
+ try {
68
+ data = JSON.parse(trimmed);
69
+ break;
70
+ }
71
+ catch (e) {
72
+ continue;
73
+ }
74
+ }
75
+ }
76
+ }
77
+ if (!data) {
78
+ const jsonMatch = output.match(/\{[\s\S]*"numTotalTests"[\s\S]*\}/);
79
+ if (jsonMatch) {
80
+ try {
81
+ data = JSON.parse(jsonMatch[0]);
82
+ }
83
+ catch (e) {
84
+ // Continue to fallback
85
+ }
86
+ }
87
+ }
88
+ if (data) {
89
+ if (typeof data.numTotalTests === 'number' && data.numTotalTests > 0) {
90
+ result.total = data.numTotalTests;
91
+ result.passed = data.numPassedTests || 0;
92
+ result.failed = data.numFailedTests || 0;
93
+ }
94
+ if (data.testResults && Array.isArray(data.testResults)) {
95
+ let testNumber = 0;
96
+ data.testResults.forEach((file) => {
97
+ if (file.assertionResults && Array.isArray(file.assertionResults)) {
98
+ file.assertionResults.forEach((test) => {
99
+ testNumber++;
100
+ const testCase = {
101
+ testNumber,
102
+ name: test.title || test.fullName || `Test ${testNumber}`,
103
+ status: test.status === 'passed' ? 'passed' : 'failed',
104
+ duration: test.duration || 0,
105
+ };
106
+ if (testCase.status === 'failed') {
107
+ const errorMatch = test.failureMessages?.[0]?.match(/(\w+Error)/);
108
+ testCase.error = errorMatch ? errorMatch[1] : 'AssertionError';
109
+ }
110
+ result.testCases.push(testCase);
111
+ });
112
+ }
113
+ });
114
+ // Always derive passed/failed/total from parsed testCases so summary matches the list
115
+ if (result.testCases.length > 0) {
116
+ result.total = result.testCases.length;
117
+ result.passed = result.testCases.filter(tc => tc.status === 'passed').length;
118
+ result.failed = result.testCases.filter(tc => tc.status === 'failed').length;
119
+ }
120
+ result.executionTime = data.testResults.reduce((sum, file) => sum + (file.duration || 0), 0);
121
+ }
122
+ }
123
+ }
124
+ catch (err) {
125
+ // Fallback to text parsing
126
+ return parseVitestTextOutput(output);
127
+ }
128
+ return result;
129
+ };
130
+ const parseVitestTextOutput = (output) => {
131
+ const result = {
132
+ passed: 0,
133
+ failed: 0,
134
+ total: 0,
135
+ testCases: [],
136
+ executionTime: 0,
137
+ };
138
+ try {
139
+ const lines = output.split('\n');
140
+ let testNumber = 0;
141
+ for (const line of lines) {
142
+ const testMatch = line.match(/^[\s]*(✓|✗|PASS|FAIL)\s+(.+?)\s*(?:\((\d+)ms\))?$/);
143
+ if (testMatch) {
144
+ testNumber++;
145
+ const isPassed = testMatch[1] === '✓' || testMatch[1] === 'PASS';
146
+ const testName = testMatch[2]?.trim() || `Test ${testNumber}`;
147
+ const duration = testMatch[3] ? parseInt(testMatch[3]) : undefined;
148
+ const testCase = {
149
+ testNumber,
150
+ name: testName,
151
+ status: isPassed ? 'passed' : 'failed',
152
+ duration,
153
+ };
154
+ if (!isPassed) {
155
+ result.failed++;
156
+ testCase.error = 'AssertionError';
157
+ }
158
+ else {
159
+ result.passed++;
160
+ }
161
+ result.testCases.push(testCase);
162
+ }
163
+ const summaryMatch = line.match(/Tests\s+(\d+)\s+passed.*?(\d+)\s+failed/);
164
+ if (summaryMatch && summaryMatch[1] && summaryMatch[2]) {
165
+ result.passed = parseInt(summaryMatch[1]);
166
+ result.failed = parseInt(summaryMatch[2]);
167
+ result.total = result.passed + result.failed;
168
+ }
169
+ const timeMatch = line.match(/Time\s+(\d+)ms/);
170
+ if (timeMatch && timeMatch[1]) {
171
+ result.executionTime = parseInt(timeMatch[1]);
172
+ }
173
+ }
174
+ if (result.testCases.length === 0 && result.total > 0) {
175
+ for (let i = 1; i <= result.total; i++) {
176
+ result.testCases.push({
177
+ testNumber: i,
178
+ name: `Test ${i}`,
179
+ status: i <= result.passed ? 'passed' : 'failed',
180
+ });
181
+ }
182
+ }
183
+ }
184
+ catch (err) {
185
+ console.error('Error parsing test output:', err);
186
+ }
187
+ return result;
188
+ };
189
+ useEffect(() => {
190
+ const runTests = async () => {
191
+ if (!isAuthenticated()) {
192
+ setErrorMessage('Please login first: devblitz login');
193
+ setStep('error');
194
+ return;
195
+ }
196
+ let testFilePath = null;
197
+ try {
198
+ // Step 1: Fetch test file
199
+ setStep('fetching');
200
+ const testFileResponse = await apiRequest('get', `/api/contest/chapters/${chapterUuid}/test-file`);
201
+ if (!testFileResponse.success || !testFileResponse.data) {
202
+ throw new Error('Failed to fetch test file');
203
+ }
204
+ const { downloadUrl, hash: expectedHash, contestId, chapterName: name } = testFileResponse.data;
205
+ setChapterName(name);
206
+ const contestConfig = getContestConfig(contestId);
207
+ if (!contestConfig) {
208
+ throw new Error(`Contest ${contestId} not initialized. Run 'devblitz init ${contestId}' first`);
209
+ }
210
+ const contestDir = getGlobalContestDir(contestId);
211
+ if (!existsSync(contestDir)) {
212
+ throw new Error(`Contest directory not found. Run 'devblitz init ${contestId}' again`);
213
+ }
214
+ // Clean up any stale test files from previous runs
215
+ const testsDir = join(contestDir, 'tests');
216
+ if (existsSync(testsDir)) {
217
+ fsExtra.removeSync(testsDir);
218
+ }
219
+ const fileResponse = await axios.get(downloadUrl, { responseType: 'text' });
220
+ const testFileContent = fileResponse.data;
221
+ const actualHash = createHash('sha256').update(testFileContent).digest('hex');
222
+ if (actualHash !== expectedHash) {
223
+ throw new Error('Test file verification failed. Please try again.');
224
+ }
225
+ mkdirSync(testsDir, { recursive: true });
226
+ testFilePath = join(testsDir, `chapter-${chapterUuid}.test.ts`);
227
+ writeFileSync(testFilePath, testFileContent, 'utf-8');
228
+ // Handle testkit
229
+ const packageJsonPath = join(contestDir, 'package.json');
230
+ if (existsSync(packageJsonPath)) {
231
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
232
+ const hasTestkit = packageJson.dependencies?.['@lokeshhh/testkit'] ||
233
+ packageJson.devDependencies?.['@lokeshhh/testkit'];
234
+ if (!hasTestkit && testFileContent.includes('@lokeshhh/testkit')) {
235
+ let testkitSourceDir = null;
236
+ const envTestkitPath = process.env.DEVBLITZ_TESTKIT_PATH;
237
+ if (envTestkitPath && existsSync(envTestkitPath)) {
238
+ testkitSourceDir = envTestkitPath;
239
+ }
240
+ if (!testkitSourceDir) {
241
+ const currentFileUrl = import.meta.url;
242
+ const currentFilePath = fileURLToPath(currentFileUrl);
243
+ const cliCommandsDir = dirname(currentFilePath);
244
+ const cliSrcDir = dirname(cliCommandsDir);
245
+ const cliPackageDir = dirname(dirname(cliSrcDir));
246
+ const cliNodeModulesTestkit = join(cliPackageDir, 'node_modules', '@lokeshhh', 'testkit');
247
+ if (existsSync(cliNodeModulesTestkit)) {
248
+ testkitSourceDir = cliNodeModulesTestkit;
249
+ }
250
+ else {
251
+ const workspaceRoot = join(cliPackageDir, '..', '..');
252
+ const workspaceTestkit = join(workspaceRoot, 'apps', 'testkit');
253
+ if (existsSync(workspaceTestkit)) {
254
+ testkitSourceDir = workspaceTestkit;
255
+ }
256
+ }
257
+ }
258
+ if (!testkitSourceDir) {
259
+ let cwd = process.cwd();
260
+ const root = resolve('/');
261
+ while (cwd !== root) {
262
+ const testkitPath = join(cwd, 'apps', 'testkit');
263
+ if (existsSync(testkitPath)) {
264
+ testkitSourceDir = testkitPath;
265
+ break;
266
+ }
267
+ const parent = resolve(cwd, '..');
268
+ if (parent === cwd)
269
+ break;
270
+ cwd = parent;
271
+ }
272
+ }
273
+ if (testkitSourceDir && existsSync(testkitSourceDir)) {
274
+ const testkitDestDir = join(contestDir, 'node_modules', '@lokeshhh', 'testkit');
275
+ mkdirSync(testkitDestDir, { recursive: true });
276
+ const testkitPackageJson = JSON.parse(readFileSync(join(testkitSourceDir, 'package.json'), 'utf-8'));
277
+ const cleanPackageJson = { ...testkitPackageJson, devDependencies: {} };
278
+ writeFileSync(join(testkitDestDir, 'package.json'), JSON.stringify(cleanPackageJson, null, 2));
279
+ const distSource = join(testkitSourceDir, 'dist');
280
+ const distDest = join(testkitDestDir, 'dist');
281
+ if (existsSync(distSource)) {
282
+ fsExtra.copySync(distSource, distDest);
283
+ }
284
+ }
285
+ }
286
+ }
287
+ // Step 2: Run tests
288
+ setStep('running');
289
+ const testArgs = [
290
+ 'vitest',
291
+ 'run',
292
+ testFilePath,
293
+ '--reporter=json',
294
+ '--reporter=verbose',
295
+ '--no-coverage',
296
+ ];
297
+ let testOutput = '';
298
+ const startTime = Date.now();
299
+ try {
300
+ const result = await execa('npx', testArgs, {
301
+ cwd: contestDir,
302
+ timeout: 120000,
303
+ stdio: 'pipe',
304
+ reject: false,
305
+ });
306
+ testOutput = result.stdout + '\n' + result.stderr;
307
+ }
308
+ catch (err) {
309
+ testOutput = (err.stdout || '') + '\n' + (err.stderr || '');
310
+ }
311
+ const endTime = Date.now();
312
+ const parsedResults = parseVitestJsonOutput(testOutput);
313
+ if (!parsedResults.executionTime) {
314
+ parsedResults.executionTime = endTime - startTime;
315
+ }
316
+ setResults(parsedResults);
317
+ setTestCases(parsedResults.testCases);
318
+ setTotalTests(parsedResults.total);
319
+ // Step 3: Submit results
320
+ setStep('submitting');
321
+ try {
322
+ const submissionResponse = await apiRequest('post', `/api/contest/chapters/${chapterUuid}/submit`, {
323
+ passed: parsedResults.passed,
324
+ failed: parsedResults.failed,
325
+ total: parsedResults.total,
326
+ testCases: parsedResults.testCases,
327
+ executionTime: parsedResults.executionTime,
328
+ timestamp: new Date().toISOString(),
329
+ });
330
+ if (submissionResponse.success && submissionResponse.data) {
331
+ setSubmissionResult(submissionResponse.data);
332
+ }
333
+ }
334
+ catch (submitErr) {
335
+ // Continue even if submission fails
336
+ console.error('Failed to submit:', submitErr.message);
337
+ }
338
+ setStep('done');
339
+ }
340
+ catch (err) {
341
+ if (err.response?.status === 404) {
342
+ setErrorMessage('Chapter not found or you don\'t have access');
343
+ }
344
+ else if (err.response?.status === 403) {
345
+ setErrorMessage('You must join the contest first');
346
+ }
347
+ else {
348
+ setErrorMessage(err.message || 'Failed to run tests');
349
+ }
350
+ setStep('error');
351
+ }
352
+ finally {
353
+ // Clean up test file after run (success or failure)
354
+ if (testFilePath) {
355
+ try {
356
+ if (existsSync(testFilePath)) {
357
+ unlinkSync(testFilePath);
358
+ }
359
+ }
360
+ catch {
361
+ // Best-effort cleanup
362
+ }
363
+ }
364
+ }
365
+ };
366
+ runTests();
367
+ }, [chapterUuid]);
368
+ if (step === 'error') {
369
+ return (_jsx(Box, { flexDirection: "column", paddingTop: 1, children: _jsx(StatusMessage, { variant: "error", children: errorMessage }) }));
370
+ }
371
+ if (step === 'loading' || step === 'fetching') {
372
+ return (_jsx(Box, { flexDirection: "column", paddingTop: 1, children: _jsx(Spinner, { label: "Fetching test file..." }) }));
373
+ }
374
+ if (step === 'running') {
375
+ return (_jsxs(Box, { flexDirection: "column", paddingTop: 1, children: [_jsx(Header, { title: chapterName || 'Running tests' }), _jsx(Spinner, { label: "Running tests..." })] }));
376
+ }
377
+ if (step === 'submitting') {
378
+ return (_jsxs(Box, { flexDirection: "column", paddingTop: 1, children: [_jsx(Header, { title: chapterName || 'Tests', rightText: `${results?.passed || 0}/${results?.total || 0} passed` }), testCases.map((tc) => (_jsx(TestResultLine, { name: `test case ${tc.testNumber}`, status: tc.status, duration: tc.duration }, tc.testNumber))), _jsx(Box, { marginTop: 1, children: _jsx(Spinner, { label: "Submitting results..." }) })] }));
379
+ }
380
+ // Done state
381
+ const failedCount = results?.failed || 0;
382
+ return (_jsxs(Box, { flexDirection: "column", paddingTop: 1, children: [_jsx(Header, { title: chapterName || 'Tests', rightText: `${results?.passed || 0}/${results?.total || 0} passed` }), testCases.map((tc) => (_jsx(TestResultLine, { name: `test case ${tc.testNumber}`, status: tc.status, duration: tc.duration }, tc.testNumber))), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsxs(Text, { children: [spacing.indent, 'Tests'.padEnd(12)] }), _jsxs(Text, { children: [_jsxs(Text, { color: "green", children: [results?.passed || 0, " passed"] }), failedCount > 0 && (_jsxs(Text, { color: "red", children: [", ", failedCount, " failed"] }))] })] }), submissionResult && (_jsxs(Box, { children: [_jsxs(Text, { children: [spacing.indent, 'Rank'.padEnd(12)] }), _jsxs(Text, { children: ["#", submissionResult.rank, submissionResult.improvement?.rankDelta < 0 && (_jsxs(Text, { color: "green", children: [" (+", Math.abs(submissionResult.improvement.rankDelta), ")"] }))] })] }))] }), failedCount > 0 && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: [spacing.indent, failedCount, " test", failedCount > 1 ? 's' : '', " failed. Unlock details on web dashboard."] }) }))] }));
383
+ };
384
+ export default Run;
385
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,OAAO,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;IAClF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAwBD,MAAM,CAAC,MAAM,GAAG,GAAuB,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;IACzD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAU,SAAS,CAAC,CAAC;IACrD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAM,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAErD,2BAA2B;IAC3B,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAc,EAAE;QAC3D,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAe;YACzB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,CAAC;SACjB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,IAAI,GAAQ,IAAI,CAAC;YAErB,mCAAmC;YACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACnE,IAAI,CAAC;wBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC3B,MAAM;oBACR,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,SAAS;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;wBACjE,IAAI,CAAC;4BACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;4BAC3B,MAAM;wBACR,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,SAAS;wBACX,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACpE,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC;wBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,uBAAuB;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;oBACrE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;oBAClC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;oBACzC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;gBAC3C,CAAC;gBAED,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;oBACxD,IAAI,UAAU,GAAG,CAAC,CAAC;oBAEnB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;wBACrC,IAAI,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;4BAClE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;gCAC1C,UAAU,EAAE,CAAC;gCAEb,MAAM,QAAQ,GAAa;oCACzB,UAAU;oCACV,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,UAAU,EAAE;oCACzD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;oCACtD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;iCAC7B,CAAC;gCAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oCACjC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;oCAClE,QAAQ,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;gCACjE,CAAC;gCAED,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;4BAClC,CAAC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,sFAAsF;oBACtF,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAChC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;wBACvC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;wBAC7E,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;oBAC/E,CAAC;oBAED,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAC5C,CAAC,GAAW,EAAE,IAAS,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,EACtD,CAAC,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2BAA2B;YAC3B,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAc,EAAE;QAC3D,MAAM,MAAM,GAAe;YACzB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,CAAC;SACjB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,UAAU,GAAG,CAAC,CAAC;YAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBAElF,IAAI,SAAS,EAAE,CAAC;oBACd,UAAU,EAAE,CAAC;oBACb,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;oBACjE,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,QAAQ,UAAU,EAAE,CAAC;oBAC9D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAEnE,MAAM,QAAQ,GAAa;wBACzB,UAAU;wBACV,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;wBACtC,QAAQ;qBACT,CAAC;oBAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChB,QAAQ,CAAC,KAAK,GAAG,gBAAgB,CAAC;oBACpC,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,CAAC;oBAED,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAClC,CAAC;gBAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC3E,IAAI,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC/C,CAAC;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAC/C,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;wBACpB,UAAU,EAAE,CAAC;wBACb,IAAI,EAAE,QAAQ,CAAC,EAAE;wBACjB,MAAM,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;qBACjD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBACvB,eAAe,CAAC,oCAAoC,CAAC,CAAC;gBACtD,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,YAAY,GAAkB,IAAI,CAAC;YAEvC,IAAI,CAAC;gBACH,0BAA0B;gBAC1B,OAAO,CAAC,UAAU,CAAC,CAAC;gBAEpB,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAQtC,KAAK,EAAE,yBAAyB,WAAW,YAAY,CAAC,CAAC;gBAE5D,IAAI,CAAC,gBAAgB,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;oBACxD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAC/C,CAAC;gBAED,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC;gBAChG,cAAc,CAAC,IAAI,CAAC,CAAC;gBAErB,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBAClD,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,wCAAwC,SAAS,SAAS,CAAC,CAAC;gBAClG,CAAC;gBAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;gBAClD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,SAAS,SAAS,CAAC,CAAC;gBACzF,CAAC;gBAED,mDAAmD;gBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC/B,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5E,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC;gBAE1C,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC9E,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;oBAChC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBACtE,CAAC;gBAED,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEzC,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,WAAW,UAAU,CAAC,CAAC;gBAChE,aAAa,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;gBAEtD,iBAAiB;gBACjB,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;gBACzD,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;oBAChC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;oBACvE,MAAM,UAAU,GACd,WAAW,CAAC,YAAY,EAAE,CAAC,mBAAmB,CAAC;wBAC/C,WAAW,CAAC,eAAe,EAAE,CAAC,mBAAmB,CAAC,CAAC;oBAErD,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;wBACjE,IAAI,gBAAgB,GAAkB,IAAI,CAAC;wBAE3C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;wBACzD,IAAI,cAAc,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;4BACjD,gBAAgB,GAAG,cAAc,CAAC;wBACpC,CAAC;wBAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;4BACtB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;4BACvC,MAAM,eAAe,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;4BACtD,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;4BAChD,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;4BAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;4BAElD,MAAM,qBAAqB,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;4BAC1F,IAAI,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;gCACtC,gBAAgB,GAAG,qBAAqB,CAAC;4BAC3C,CAAC;iCAAM,CAAC;gCACN,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gCACtD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gCAChE,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;oCACjC,gBAAgB,GAAG,gBAAgB,CAAC;gCACtC,CAAC;4BACH,CAAC;wBACH,CAAC;wBAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;4BACtB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;4BACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;4BAC1B,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;gCACpB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gCACjD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oCAC5B,gBAAgB,GAAG,WAAW,CAAC;oCAC/B,MAAM;gCACR,CAAC;gCACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gCAClC,IAAI,MAAM,KAAK,GAAG;oCAAE,MAAM;gCAC1B,GAAG,GAAG,MAAM,CAAC;4BACf,CAAC;wBACH,CAAC;wBAED,IAAI,gBAAgB,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;4BACrD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;4BAChF,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;4BAE/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;4BACrG,MAAM,gBAAgB,GAAG,EAAE,GAAG,kBAAkB,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;4BACxE,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;4BAE/F,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;4BAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;4BAC9C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gCAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;4BACzC,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,oBAAoB;gBACpB,OAAO,CAAC,SAAS,CAAC,CAAC;gBAEnB,MAAM,QAAQ,GAAG;oBACf,QAAQ;oBACR,KAAK;oBACL,YAAY;oBACZ,iBAAiB;oBACjB,oBAAoB;oBACpB,eAAe;iBAChB,CAAC;gBAEF,IAAI,UAAU,GAAG,EAAE,CAAC;gBACpB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE7B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE;wBAC1C,GAAG,EAAE,UAAU;wBACf,OAAO,EAAE,MAAM;wBACf,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC;oBAEH,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;gBACpD,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,UAAU,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE3B,MAAM,aAAa,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;gBACxD,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;oBACjC,aAAa,CAAC,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;gBACpD,CAAC;gBAED,UAAU,CAAC,aAAa,CAAC,CAAC;gBAC1B,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBACtC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAEnC,yBAAyB;gBACzB,OAAO,CAAC,YAAY,CAAC,CAAC;gBAEtB,IAAI,CAAC;oBACH,MAAM,kBAAkB,GAAG,MAAM,UAAU,CAWxC,MAAM,EAAE,yBAAyB,WAAW,SAAS,EAAE;wBACxD,MAAM,EAAE,aAAa,CAAC,MAAM;wBAC5B,MAAM,EAAE,aAAa,CAAC,MAAM;wBAC5B,KAAK,EAAE,aAAa,CAAC,KAAK;wBAC1B,SAAS,EAAE,aAAa,CAAC,SAAS;wBAClC,aAAa,EAAE,aAAa,CAAC,aAAa;wBAC1C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACpC,CAAC,CAAC;oBAEH,IAAI,kBAAkB,CAAC,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,CAAC;wBAC1D,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBAAC,OAAO,SAAc,EAAE,CAAC;oBACxB,oCAAoC;oBACpC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBACxD,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;oBACjC,eAAe,CAAC,6CAA6C,CAAC,CAAC;gBACjE,CAAC;qBAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;oBACxC,eAAe,CAAC,iCAAiC,CAAC,CAAC;gBACrD,CAAC;qBAAM,CAAC;oBACN,eAAe,CAAC,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC;gBACxD,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;oBAAS,CAAC;gBACT,oDAAoD;gBACpD,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC;wBACH,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;4BAC7B,UAAU,CAAC,YAAY,CAAC,CAAC;wBAC3B,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,sBAAsB;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,EAAE,CAAC;IACb,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,YACvC,KAAC,aAAa,IAAC,OAAO,EAAC,OAAO,YAAE,YAAY,GAAiB,GACzD,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9C,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,YACvC,KAAC,OAAO,IAAC,KAAK,EAAC,uBAAuB,GAAG,GACrC,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aACvC,KAAC,MAAM,IAAC,KAAK,EAAE,WAAW,IAAI,eAAe,GAAI,EACjD,KAAC,OAAO,IAAC,KAAK,EAAC,kBAAkB,GAAG,IAChC,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aACvC,KAAC,MAAM,IAAC,KAAK,EAAE,WAAW,IAAI,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,OAAO,EAAE,KAAK,IAAI,CAAC,SAAS,GAAI,EAE5G,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CACrB,KAAC,cAAc,IAEb,IAAI,EAAE,aAAa,EAAE,CAAC,UAAU,EAAE,EAClC,MAAM,EAAE,EAAE,CAAC,MAAM,EACjB,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAHhB,EAAE,CAAC,UAAU,CAIlB,CACH,CAAC,EAEF,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,OAAO,IAAC,KAAK,EAAC,uBAAuB,GAAG,GACrC,IACF,CACP,CAAC;IACJ,CAAC;IAED,aAAa;IACb,MAAM,WAAW,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;IAEzC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aACvC,KAAC,MAAM,IAAC,KAAK,EAAE,WAAW,IAAI,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,OAAO,EAAE,KAAK,IAAI,CAAC,SAAS,GAAI,EAE5G,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CACrB,KAAC,cAAc,IAEb,IAAI,EAAE,aAAa,EAAE,CAAC,UAAU,EAAE,EAClC,MAAM,EAAE,EAAE,CAAC,MAAM,EACjB,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAHhB,EAAE,CAAC,UAAU,CAIlB,CACH,CAAC,EAGF,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,MAAC,GAAG,eACF,MAAC,IAAI,eAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAQ,EACjD,MAAC,IAAI,eACH,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAE,OAAO,EAAE,MAAM,IAAI,CAAC,eAAe,EACvD,WAAW,GAAG,CAAC,IAAI,CAClB,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,mBAAI,WAAW,eAAe,CAChD,IACI,IACH,EACL,gBAAgB,IAAI,CACnB,MAAC,GAAG,eACF,MAAC,IAAI,eAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAQ,EAChD,MAAC,IAAI,oBACD,gBAAgB,CAAC,IAAI,EACtB,gBAAgB,CAAC,WAAW,EAAE,SAAS,GAAG,CAAC,IAAI,CAC9C,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,oBAAK,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAClF,IACI,IACH,CACP,IACG,EAEL,WAAW,GAAG,CAAC,IAAI,CAClB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,mBACX,OAAO,CAAC,MAAM,EAAE,WAAW,WAAO,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,iDACxD,GACH,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,GAAG,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface StatusProps {
3
+ contestId: string;
4
+ }
5
+ export declare const Status: React.FC<StatusProps>;
6
+ export default Status;
7
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA0CnD,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAgJxC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,121 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState, useEffect } from 'react';
3
+ import { Box, Text, useApp } from 'ink';
4
+ import { Spinner, StatusMessage, Header, Table } from '../components/index.js';
5
+ import { isAuthenticated, getCurrentUser } from '../utils/auth.js';
6
+ import { apiRequest } from '../utils/api.js';
7
+ import { spacing } from '../utils/theme.js';
8
+ import { readFileSync, existsSync } from 'fs';
9
+ import { join } from 'path';
10
+ import os from 'os';
11
+ function getContestConfig(contestId) {
12
+ const configPath = join(os.homedir(), '.devblitz', 'config', `${contestId}.json`);
13
+ if (!existsSync(configPath)) {
14
+ return null;
15
+ }
16
+ return JSON.parse(readFileSync(configPath, 'utf-8'));
17
+ }
18
+ function formatTimeRemaining(ms) {
19
+ if (ms <= 0)
20
+ return 'Ended';
21
+ const days = Math.floor(ms / (1000 * 60 * 60 * 24));
22
+ const hours = Math.floor((ms % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
23
+ const minutes = Math.floor((ms % (1000 * 60 * 60)) / (1000 * 60));
24
+ if (days > 0)
25
+ return `${days}d ${hours}h`;
26
+ if (hours > 0)
27
+ return `${hours}h ${minutes}m`;
28
+ return `${minutes}m`;
29
+ }
30
+ function formatRelativeTime(dateStr) {
31
+ const date = new Date(dateStr);
32
+ const now = new Date();
33
+ const diffMs = now.getTime() - date.getTime();
34
+ const diffMins = Math.floor(diffMs / (1000 * 60));
35
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
36
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
37
+ if (diffMins < 1)
38
+ return 'just now';
39
+ if (diffMins < 60)
40
+ return `${diffMins}m ago`;
41
+ if (diffHours < 24)
42
+ return `${diffHours}h ago`;
43
+ return `${diffDays}d ago`;
44
+ }
45
+ export const Status = ({ contestId }) => {
46
+ const { exit } = useApp();
47
+ const [step, setStep] = useState('loading');
48
+ const [errorMessage, setErrorMessage] = useState('');
49
+ const [statusData, setStatusData] = useState(null);
50
+ useEffect(() => {
51
+ const fetchStatus = async () => {
52
+ // Check authentication
53
+ if (!isAuthenticated()) {
54
+ setErrorMessage('Please login first: devblitz login');
55
+ setStep('error');
56
+ setTimeout(() => exit(), 100);
57
+ return;
58
+ }
59
+ // Verify contest is initialized
60
+ const contestConfig = getContestConfig(contestId);
61
+ if (!contestConfig) {
62
+ setErrorMessage(`Contest ${contestId} not initialized. Run 'devblitz init ${contestId}' first`);
63
+ setStep('error');
64
+ setTimeout(() => exit(), 100);
65
+ return;
66
+ }
67
+ try {
68
+ const response = await apiRequest('get', `/api/contest/${contestId}/participant-status`);
69
+ if (response.success && response.data) {
70
+ setStatusData(response.data);
71
+ setStep('done');
72
+ }
73
+ else {
74
+ throw new Error('Failed to fetch status');
75
+ }
76
+ }
77
+ catch (err) {
78
+ setErrorMessage(err.message || 'Failed to fetch status');
79
+ setStep('error');
80
+ }
81
+ };
82
+ fetchStatus();
83
+ }, [contestId, exit]);
84
+ if (step === 'loading') {
85
+ return (_jsx(Box, { flexDirection: "column", paddingTop: 1, children: _jsx(Spinner, { label: "Loading status..." }) }));
86
+ }
87
+ if (step === 'error') {
88
+ return (_jsx(Box, { flexDirection: "column", paddingTop: 1, children: _jsx(StatusMessage, { variant: "error", children: errorMessage }) }));
89
+ }
90
+ const contest = statusData?.contest;
91
+ const participant = statusData?.participant;
92
+ const chapters = statusData?.chapters || [];
93
+ const recentSubmissions = statusData?.recentSubmissions || [];
94
+ // Format chapter data for table
95
+ const chapterTableData = chapters.map((ch) => {
96
+ const name = ch.name || `Chapter ${ch.order || '?'}`;
97
+ return {
98
+ name: name.length > 18 ? name.slice(0, 15) + '...' : name,
99
+ tests: `${ch.passedTests || 0}/${ch.totalTests || 0}`,
100
+ status: ch.status === 'completed' ? 'complete' : ch.status === 'in-progress' ? 'in progress' : 'locked',
101
+ };
102
+ });
103
+ // Format submission data for table
104
+ const submissionTableData = recentSubmissions.slice(0, 3).map((sub) => ({
105
+ chapter: sub.chapterName?.length > 18 ? sub.chapterName.slice(0, 15) + '...' : sub.chapterName,
106
+ score: `${sub.passed}/${sub.total}`,
107
+ time: formatRelativeTime(sub.submittedAt),
108
+ }));
109
+ const contestStatus = contest?.status?.toLowerCase() || 'unknown';
110
+ return (_jsxs(Box, { flexDirection: "column", paddingTop: 1, children: [_jsx(Header, { title: contest?.name || 'Contest', rightText: contestStatus }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [_jsxs(Text, { children: [spacing.indent, 'Rank'.padEnd(15)] }), _jsxs(Text, { children: ["#", participant?.rank || '-', " of ", participant?.totalParticipants || '-'] })] }), _jsxs(Box, { children: [_jsxs(Text, { children: [spacing.indent, 'Score'.padEnd(15)] }), _jsxs(Text, { children: [participant?.totalScore || 0, " pts"] })] }), _jsxs(Box, { children: [_jsxs(Text, { children: [spacing.indent, 'Progress'.padEnd(15)] }), _jsxs(Text, { children: [participant?.chaptersCompleted || 0, "/", participant?.totalChapters || 0, " chapters"] })] })] }), chapterTableData.length > 0 && (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsx(Table, { columns: [
111
+ { key: 'name', header: 'Chapter', width: 20 },
112
+ { key: 'tests', header: 'Tests', width: 10 },
113
+ { key: 'status', header: 'Status', width: 12 },
114
+ ], data: chapterTableData }) })), submissionTableData.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { children: spacing.indent }), _jsx(Text, { dimColor: true, children: "Recent submissions" })] }), _jsx(Table, { columns: [
115
+ { key: 'chapter', header: '', width: 20 },
116
+ { key: 'score', header: '', width: 10 },
117
+ { key: 'time', header: '', width: 12, align: 'right' },
118
+ ], data: submissionTableData, showHeader: false })] }))] }));
119
+ };
120
+ export default Status;
121
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;IAClF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAU;IACrC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAClE,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;IAC1C,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC;IAC9C,OAAO,GAAG,OAAO,GAAG,CAAC;AACvB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAE5D,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,QAAQ,GAAG,EAAE;QAAE,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC7C,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,GAAG,SAAS,OAAO,CAAC;IAC/C,OAAO,GAAG,QAAQ,OAAO,CAAC;AAC5B,CAAC;AAcD,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;IAC7D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAa,SAAS,CAAC,CAAC;IACxD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAM,IAAI,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;YAC7B,uBAAuB;YACvB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBACvB,eAAe,CAAC,oCAAoC,CAAC,CAAC;gBACtD,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,gCAAgC;YAChC,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,eAAe,CAAC,WAAW,SAAS,wCAAwC,SAAS,SAAS,CAAC,CAAC;gBAChG,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,KAAK,EACL,gBAAgB,SAAS,qBAAqB,CAC/C,CAAC;gBAEF,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACtC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC7B,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,eAAe,CAAC,GAAG,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC;gBACzD,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAEF,WAAW,EAAE,CAAC;IAChB,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAEtB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,YACvC,KAAC,OAAO,IAAC,KAAK,EAAC,mBAAmB,GAAG,GACjC,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,YACvC,KAAC,aAAa,IAAC,OAAO,EAAC,OAAO,YAAE,YAAY,GAAiB,GACzD,CACP,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,CAAC;IACpC,MAAM,WAAW,GAAG,UAAU,EAAE,WAAW,CAAC;IAC5C,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC;IAC5C,MAAM,iBAAiB,GAAG,UAAU,EAAE,iBAAiB,IAAI,EAAE,CAAC;IAE9D,gCAAgC;IAChC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;QACrD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI;YACzD,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,CAAC,EAAE;YACrD,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;SACxG,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW;QAC9F,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE;QACnC,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC;KAC1C,CAAC,CAAC,CAAC;IAEJ,MAAM,aAAa,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,SAAS,CAAC;IAElE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aAEvC,KAAC,MAAM,IACL,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,SAAS,EACjC,SAAS,EAAE,aAAa,GACxB,EAGF,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,eACF,MAAC,IAAI,eAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAQ,EAChD,MAAC,IAAI,oBAAG,WAAW,EAAE,IAAI,IAAI,GAAG,UAAM,WAAW,EAAE,iBAAiB,IAAI,GAAG,IAAQ,IAC/E,EACN,MAAC,GAAG,eACF,MAAC,IAAI,eAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAQ,EACjD,MAAC,IAAI,eAAE,WAAW,EAAE,UAAU,IAAI,CAAC,YAAY,IAC3C,EACN,MAAC,GAAG,eACF,MAAC,IAAI,eAAE,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAQ,EACpD,MAAC,IAAI,eAAE,WAAW,EAAE,iBAAiB,IAAI,CAAC,OAAG,WAAW,EAAE,aAAa,IAAI,CAAC,iBAAiB,IACzF,IACF,EAGL,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAC9B,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,YACzC,KAAC,KAAK,IACJ,OAAO,EAAE;wBACP,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;wBAC7C,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;wBAC5C,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;qBAC/C,EACD,IAAI,EAAE,gBAAgB,GACtB,GACE,CACP,EAGA,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,CACjC,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,eACF,KAAC,IAAI,cAAE,OAAO,CAAC,MAAM,GAAQ,EAC7B,KAAC,IAAI,IAAC,QAAQ,yCAA0B,IACpC,EACN,KAAC,KAAK,IACJ,OAAO,EAAE;4BACP,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;4BACzC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;4BACvC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;yBACvD,EACD,IAAI,EAAE,mBAAmB,EACzB,UAAU,EAAE,KAAK,GACjB,IACE,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ interface HeaderProps {
3
+ title: string;
4
+ subtitle?: string;
5
+ rightText?: string;
6
+ }
7
+ export declare const Header: React.FC<HeaderProps>;
8
+ export {};
9
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAcxC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Box, Text } from 'ink';
4
+ export const Header = ({ title, subtitle, rightText }) => {
5
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { bold: true, children: title }), rightText && _jsx(Text, { dimColor: true, children: rightText })] }), subtitle && (_jsx(Box, { children: _jsx(Text, { dimColor: true, children: subtitle }) }))] }));
6
+ };
7
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQhC,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9E,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,IAAC,cAAc,EAAC,eAAe,aACjC,KAAC,IAAI,IAAC,IAAI,kBAAE,KAAK,GAAQ,EACxB,SAAS,IAAI,KAAC,IAAI,IAAC,QAAQ,kBAAE,SAAS,GAAQ,IAC3C,EACL,QAAQ,IAAI,CACX,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,QAAQ,GAAQ,GAC5B,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface HelpViewProps {
3
+ command?: string;
4
+ }
5
+ export declare const HelpView: React.FC<HelpViewProps>;
6
+ export {};
7
+ //# sourceMappingURL=HelpView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpView.d.ts","sourceRoot":"","sources":["../../src/components/HelpView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAmD1B,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA+D5C,CAAC"}