bugproof 0.1.2 → 0.2.2

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 (69) hide show
  1. package/CHANGELOG.md +61 -5
  2. package/README.md +175 -4
  3. package/dist/capture/env-snapshot.d.ts +53 -0
  4. package/dist/capture/env-snapshot.d.ts.map +1 -0
  5. package/dist/capture/env-snapshot.js +122 -0
  6. package/dist/capture/env-snapshot.js.map +1 -0
  7. package/dist/capture/language-support.d.ts +55 -0
  8. package/dist/capture/language-support.d.ts.map +1 -0
  9. package/dist/capture/language-support.js +505 -0
  10. package/dist/capture/language-support.js.map +1 -0
  11. package/dist/capture/packager.d.ts +9 -0
  12. package/dist/capture/packager.d.ts.map +1 -1
  13. package/dist/capture/packager.js +23 -2
  14. package/dist/capture/packager.js.map +1 -1
  15. package/dist/capture/source-strategy.d.ts +52 -0
  16. package/dist/capture/source-strategy.d.ts.map +1 -0
  17. package/dist/capture/source-strategy.js +227 -0
  18. package/dist/capture/source-strategy.js.map +1 -0
  19. package/dist/cli.js +373 -12
  20. package/dist/cli.js.map +1 -1
  21. package/dist/config/loader.d.ts +44 -0
  22. package/dist/config/loader.d.ts.map +1 -0
  23. package/dist/config/loader.js +87 -0
  24. package/dist/config/loader.js.map +1 -0
  25. package/dist/replay/engine.d.ts +9 -0
  26. package/dist/replay/engine.d.ts.map +1 -1
  27. package/dist/replay/engine.js +29 -3
  28. package/dist/replay/engine.js.map +1 -1
  29. package/dist/replay/hints.d.ts +18 -0
  30. package/dist/replay/hints.d.ts.map +1 -0
  31. package/dist/replay/hints.js +138 -0
  32. package/dist/replay/hints.js.map +1 -0
  33. package/dist/replay/sandbox.js +41 -14
  34. package/dist/replay/sandbox.js.map +1 -1
  35. package/dist/replay/verdict.d.ts.map +1 -1
  36. package/dist/replay/verdict.js +41 -5
  37. package/dist/replay/verdict.js.map +1 -1
  38. package/dist/sandbox/bugbox.d.ts.map +1 -1
  39. package/dist/sandbox/bugbox.js +40 -6
  40. package/dist/sandbox/bugbox.js.map +1 -1
  41. package/dist/sandbox/container.d.ts +81 -0
  42. package/dist/sandbox/container.d.ts.map +1 -0
  43. package/dist/sandbox/container.js +343 -0
  44. package/dist/sandbox/container.js.map +1 -0
  45. package/dist/sandbox/cross-platform.d.ts +59 -0
  46. package/dist/sandbox/cross-platform.d.ts.map +1 -0
  47. package/dist/sandbox/cross-platform.js +330 -0
  48. package/dist/sandbox/cross-platform.js.map +1 -0
  49. package/dist/sandbox/network.d.ts.map +1 -1
  50. package/dist/sandbox/network.js +31 -2
  51. package/dist/sandbox/network.js.map +1 -1
  52. package/dist/share/gist.d.ts +21 -0
  53. package/dist/share/gist.d.ts.map +1 -0
  54. package/dist/share/gist.js +158 -0
  55. package/dist/share/gist.js.map +1 -0
  56. package/dist/utils/archive.d.ts +1 -0
  57. package/dist/utils/archive.d.ts.map +1 -1
  58. package/dist/utils/archive.js +42 -1
  59. package/dist/utils/archive.js.map +1 -1
  60. package/dist/utils/artifact-validation.d.ts +7 -0
  61. package/dist/utils/artifact-validation.d.ts.map +1 -0
  62. package/dist/utils/artifact-validation.js +212 -0
  63. package/dist/utils/artifact-validation.js.map +1 -0
  64. package/dist/utils/dependencies.d.ts +18 -0
  65. package/dist/utils/dependencies.d.ts.map +1 -0
  66. package/dist/utils/dependencies.js +218 -0
  67. package/dist/utils/dependencies.js.map +1 -0
  68. package/package.json +3 -2
  69. package/scripts/postinstall.cjs +38 -5
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Smart Source Strategy
3
+ *
4
+ * Two-tier approach for including source code in a .bug artifact:
5
+ *
6
+ * Tier 1 (Git available):
7
+ * - git-full: Clean working tree → record commit only (zero files shipped)
8
+ * - git-patch: Dirty working tree → record commit + diff patch (tiny)
9
+ * - git-files: Force mode → ship all tracked files
10
+ *
11
+ * Tier 2 (No Git):
12
+ * - full-copy: Ship the entire codebase (excluding heavy dirs like node_modules)
13
+ * up to a configurable size limit (default 50MB).
14
+ * If size exceeds the limit → error out, recommend installing git.
15
+ *
16
+ * Why not stacktrace extraction? Because the file that appears in the error
17
+ * is often NOT the file that was changed to cause the bug. Transitive imports,
18
+ * config files, and build artifacts make guessing unreliable. Ship everything
19
+ * or use git — no middle ground that loses reproducibility.
20
+ */
21
+ export type SourceStrategy = 'git-full' | 'git-patch' | 'git-files' | 'full-copy' | 'exceeded';
22
+ export interface SourceStrategyResult {
23
+ strategy: SourceStrategy;
24
+ /** Git commit hash (if available) */
25
+ commit?: string;
26
+ /** Git diff patch content (if dirty) */
27
+ patch?: string;
28
+ /** List of relative file paths to include in artifact */
29
+ filesToInclude: string[];
30
+ /** Total size in bytes of files to include */
31
+ totalSize: number;
32
+ /** Human-readable explanation */
33
+ reason: string;
34
+ /** If true, capture should abort — codebase too large without git */
35
+ shouldAbort: boolean;
36
+ }
37
+ export interface SourceStrategyOptions {
38
+ workingDir: string;
39
+ /** Force include all git files even when commit is available */
40
+ forceIncludeFiles?: boolean;
41
+ /** Max total codebase size to ship without git (bytes). Default 100MB. */
42
+ maxCodebaseSize?: number;
43
+ /** Max individual file size (bytes). Default 2MB. */
44
+ maxFileSize?: number;
45
+ /** Additional exclude patterns */
46
+ excludePatterns?: string[];
47
+ }
48
+ /**
49
+ * Determines the optimal source inclusion strategy.
50
+ */
51
+ export declare function determineSourceStrategy(options: SourceStrategyOptions): SourceStrategyResult;
52
+ //# sourceMappingURL=source-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-strategy.d.ts","sourceRoot":"","sources":["../../src/capture/source-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AA2BD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,oBAAoB,CAgB5F"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Smart Source Strategy
3
+ *
4
+ * Two-tier approach for including source code in a .bug artifact:
5
+ *
6
+ * Tier 1 (Git available):
7
+ * - git-full: Clean working tree → record commit only (zero files shipped)
8
+ * - git-patch: Dirty working tree → record commit + diff patch (tiny)
9
+ * - git-files: Force mode → ship all tracked files
10
+ *
11
+ * Tier 2 (No Git):
12
+ * - full-copy: Ship the entire codebase (excluding heavy dirs like node_modules)
13
+ * up to a configurable size limit (default 50MB).
14
+ * If size exceeds the limit → error out, recommend installing git.
15
+ *
16
+ * Why not stacktrace extraction? Because the file that appears in the error
17
+ * is often NOT the file that was changed to cause the bug. Transitive imports,
18
+ * config files, and build artifacts make guessing unreliable. Ship everything
19
+ * or use git — no middle ground that loses reproducibility.
20
+ */
21
+ import * as fs from 'fs';
22
+ import * as path from 'path';
23
+ import { spawnSync } from 'child_process';
24
+ /** Default max codebase size without git: 100MB */
25
+ const DEFAULT_MAX_CODEBASE_SIZE = 100 * 1024 * 1024;
26
+ /** Default max individual file size: 2MB */
27
+ const DEFAULT_MAX_FILE_SIZE = 2 * 1024 * 1024;
28
+ /** Directories always excluded from full-copy (heavy, regeneratable) */
29
+ const ALWAYS_EXCLUDE_DIRS = [
30
+ 'node_modules', '.git', 'dist', 'build', 'out', 'target',
31
+ '__pycache__', '.venv', 'venv', 'env', '.env',
32
+ 'vendor', '.gradle', '.idea', '.vs', '.vscode',
33
+ 'coverage', '.nyc_output', '.next', '.nuxt',
34
+ 'tmp', 'temp', '.cache', '.parcel-cache',
35
+ 'bin', 'obj', 'packages', '.dart_tool',
36
+ ];
37
+ /** File extensions to skip (binary/compiled) */
38
+ const SKIP_EXTENSIONS = new Set([
39
+ '.exe', '.dll', '.so', '.dylib', '.o', '.obj', '.class',
40
+ '.jar', '.war', '.zip', '.tar', '.gz', '.7z', '.rar',
41
+ '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.svg',
42
+ '.mp3', '.mp4', '.avi', '.mov', '.woff', '.woff2', '.ttf',
43
+ '.eot', '.pdf', '.psd', '.ai', '.sketch',
44
+ '.pyc', '.pyo', '.wasm', '.node',
45
+ ]);
46
+ /**
47
+ * Determines the optimal source inclusion strategy.
48
+ */
49
+ export function determineSourceStrategy(options) {
50
+ // Check if we're in a git repo
51
+ const gitCheck = spawnSync('git', ['rev-parse', '--is-inside-work-tree'], {
52
+ cwd: options.workingDir,
53
+ encoding: 'utf-8',
54
+ timeout: 5000,
55
+ });
56
+ const isGitRepo = gitCheck.status === 0 && gitCheck.stdout.trim() === 'true';
57
+ if (isGitRepo) {
58
+ return determineGitStrategy(options.workingDir, options.forceIncludeFiles);
59
+ }
60
+ // No git — ship the full codebase with size limit
61
+ return determineFullCopyStrategy(options);
62
+ }
63
+ /**
64
+ * Determines the git-based strategy.
65
+ */
66
+ function determineGitStrategy(workingDir, forceIncludeFiles) {
67
+ // Get current commit
68
+ const commitResult = spawnSync('git', ['rev-parse', 'HEAD'], {
69
+ cwd: workingDir,
70
+ encoding: 'utf-8',
71
+ timeout: 5000,
72
+ });
73
+ const commit = commitResult.status === 0 ? commitResult.stdout.trim() : undefined;
74
+ // Check if working tree is dirty
75
+ const dirtyResult = spawnSync('git', ['status', '--porcelain'], {
76
+ cwd: workingDir,
77
+ encoding: 'utf-8',
78
+ timeout: 10000,
79
+ });
80
+ const isDirty = dirtyResult.status === 0 && dirtyResult.stdout.trim().length > 0;
81
+ if (forceIncludeFiles) {
82
+ return {
83
+ strategy: 'git-files',
84
+ commit,
85
+ filesToInclude: [],
86
+ totalSize: 0,
87
+ reason: 'Git repo detected. Including all tracked files (forced).',
88
+ shouldAbort: false,
89
+ };
90
+ }
91
+ if (!isDirty && commit) {
92
+ return {
93
+ strategy: 'git-full',
94
+ commit,
95
+ filesToInclude: [],
96
+ totalSize: 0,
97
+ reason: `Git repo clean at ${commit.slice(0, 8)}. No files shipped — replay uses git checkout.`,
98
+ shouldAbort: false,
99
+ };
100
+ }
101
+ if (isDirty && commit) {
102
+ // Dirty tree — generate a patch of uncommitted changes
103
+ const patchResult = spawnSync('git', ['diff', 'HEAD'], {
104
+ cwd: workingDir,
105
+ encoding: 'utf-8',
106
+ timeout: 30000,
107
+ maxBuffer: 10 * 1024 * 1024,
108
+ });
109
+ const stagedResult = spawnSync('git', ['diff', '--cached'], {
110
+ cwd: workingDir,
111
+ encoding: 'utf-8',
112
+ timeout: 30000,
113
+ maxBuffer: 10 * 1024 * 1024,
114
+ });
115
+ let patch = '';
116
+ if (patchResult.status === 0)
117
+ patch += patchResult.stdout;
118
+ if (stagedResult.status === 0 && stagedResult.stdout.trim()) {
119
+ patch += '\n' + stagedResult.stdout;
120
+ }
121
+ if (patch.trim()) {
122
+ return {
123
+ strategy: 'git-patch',
124
+ commit,
125
+ patch,
126
+ filesToInclude: [],
127
+ totalSize: Buffer.byteLength(patch),
128
+ reason: `Git repo dirty at ${commit.slice(0, 8)}. Shipping commit ref + diff patch (${(Buffer.byteLength(patch) / 1024).toFixed(1)} KB).`,
129
+ shouldAbort: false,
130
+ };
131
+ }
132
+ }
133
+ // Fallback: ship tracked files
134
+ return {
135
+ strategy: 'git-files',
136
+ commit,
137
+ filesToInclude: [],
138
+ totalSize: 0,
139
+ reason: 'Git repo detected. Including tracked files.',
140
+ shouldAbort: false,
141
+ };
142
+ }
143
+ /**
144
+ * Collects all project files (excluding heavy directories and binaries)
145
+ * and checks against the size limit.
146
+ */
147
+ function determineFullCopyStrategy(options) {
148
+ const maxCodebaseSize = options.maxCodebaseSize ?? DEFAULT_MAX_CODEBASE_SIZE;
149
+ const maxFileSize = options.maxFileSize ?? DEFAULT_MAX_FILE_SIZE;
150
+ const extraExcludes = new Set((options.excludePatterns || []).map(p => p.replace(/[/\\*]/g, '')));
151
+ const files = [];
152
+ let totalSize = 0;
153
+ let exceeded = false;
154
+ function walk(dir, relativeBase) {
155
+ if (exceeded)
156
+ return;
157
+ let entries;
158
+ try {
159
+ entries = fs.readdirSync(dir, { withFileTypes: true });
160
+ }
161
+ catch {
162
+ return;
163
+ }
164
+ for (const entry of entries) {
165
+ if (exceeded)
166
+ return;
167
+ // Skip symlinks (security)
168
+ if (entry.isSymbolicLink())
169
+ continue;
170
+ const name = entry.name;
171
+ const relPath = relativeBase ? `${relativeBase}/${name}` : name;
172
+ if (entry.isDirectory()) {
173
+ // Skip always-excluded directories
174
+ if (ALWAYS_EXCLUDE_DIRS.includes(name) || extraExcludes.has(name))
175
+ continue;
176
+ // Skip hidden directories (except common ones like .github)
177
+ if (name.startsWith('.') && name !== '.github')
178
+ continue;
179
+ walk(path.join(dir, name), relPath);
180
+ }
181
+ else if (entry.isFile()) {
182
+ // Skip binary extensions
183
+ const ext = path.extname(name).toLowerCase();
184
+ if (SKIP_EXTENSIONS.has(ext))
185
+ continue;
186
+ // Skip hidden files
187
+ if (name.startsWith('.') && name !== '.env.example')
188
+ continue;
189
+ try {
190
+ const stat = fs.statSync(path.join(dir, name));
191
+ // Skip files exceeding individual size limit
192
+ if (stat.size > maxFileSize)
193
+ continue;
194
+ totalSize += stat.size;
195
+ if (totalSize > maxCodebaseSize) {
196
+ exceeded = true;
197
+ return;
198
+ }
199
+ files.push(relPath);
200
+ }
201
+ catch {
202
+ // Skip unreadable files
203
+ }
204
+ }
205
+ }
206
+ }
207
+ walk(options.workingDir, '');
208
+ if (exceeded) {
209
+ const limitMB = (maxCodebaseSize / (1024 * 1024)).toFixed(0);
210
+ return {
211
+ strategy: 'exceeded',
212
+ filesToInclude: [],
213
+ totalSize,
214
+ reason: `Codebase exceeds ${limitMB}MB limit. Install git for efficient bug recording: git init && git add . && git commit -m "init"`,
215
+ shouldAbort: true,
216
+ };
217
+ }
218
+ const sizeMB = (totalSize / (1024 * 1024)).toFixed(1);
219
+ return {
220
+ strategy: 'full-copy',
221
+ filesToInclude: files,
222
+ totalSize,
223
+ reason: `No git repo. Shipping full codebase (${files.length} files, ${sizeMB} MB).`,
224
+ shouldAbort: false,
225
+ };
226
+ }
227
+ //# sourceMappingURL=source-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-strategy.js","sourceRoot":"","sources":["../../src/capture/source-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAgC1C,mDAAmD;AACnD,MAAM,yBAAyB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACpD,4CAA4C;AAC5C,MAAM,qBAAqB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,wEAAwE;AACxE,MAAM,mBAAmB,GAAG;IAC1B,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;IACxD,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAC7C,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;IAC9C,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO;IAC3C,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe;IACxC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY;CACvC,CAAC;AAEF,gDAAgD;AAChD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ;IACvD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IACpD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACvD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;IACzD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;IACxC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CACjC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAA8B;IACpE,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;QACxE,GAAG,EAAE,OAAO,CAAC,UAAU;QACvB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;IAE7E,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7E,CAAC;IAED,kDAAkD;IAClD,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,UAAkB,EAClB,iBAA2B;IAE3B,qBAAqB;IACrB,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE;QAC3D,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAElF,iCAAiC;IACjC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;QAC9D,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjF,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO;YACL,QAAQ,EAAE,WAAW;YACrB,MAAM;YACN,cAAc,EAAE,EAAE;YAClB,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,0DAA0D;YAClE,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;QACvB,OAAO;YACL,QAAQ,EAAE,UAAU;YACpB,MAAM;YACN,cAAc,EAAE,EAAE;YAClB,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,qBAAqB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,gDAAgD;YAC/F,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,uDAAuD;QACvD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;YACrD,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE;YAC1D,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QAEH,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC;QAC1D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5D,KAAK,IAAI,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;QACtC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO;gBACL,QAAQ,EAAE,WAAW;gBACrB,MAAM;gBACN,KAAK;gBACL,cAAc,EAAE,EAAE;gBAClB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;gBACnC,MAAM,EAAE,qBAAqB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,uCAAuC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBACzI,WAAW,EAAE,KAAK;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,MAAM;QACN,cAAc,EAAE,EAAE;QAClB,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,6CAA6C;QACrD,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAAC,OAA8B;IAC/D,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,yBAAyB,CAAC;IAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,qBAAqB,CAAC;IACjE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAElG,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,SAAS,IAAI,CAAC,GAAW,EAAE,YAAoB;QAC7C,IAAI,QAAQ;YAAE,OAAO;QAErB,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,QAAQ;gBAAE,OAAO;YAErB,2BAA2B;YAC3B,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,SAAS;YAErC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAEhE,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,mCAAmC;gBACnC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC5E,4DAA4D;gBAC5D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,SAAS;oBAAE,SAAS;gBACzD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,yBAAyB;gBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7C,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACvC,oBAAoB;gBACpB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,cAAc;oBAAE,SAAS;gBAE9D,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC/C,6CAA6C;oBAC7C,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW;wBAAE,SAAS;oBAEtC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;oBACvB,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC;wBAChC,QAAQ,GAAG,IAAI,CAAC;wBAChB,OAAO;oBACT,CAAC;oBAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE7B,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,CAAC,eAAe,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO;YACL,QAAQ,EAAE,UAAU;YACpB,cAAc,EAAE,EAAE;YAClB,SAAS;YACT,MAAM,EAAE,oBAAoB,OAAO,kGAAkG;YACrI,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,cAAc,EAAE,KAAK;QACrB,SAAS;QACT,MAAM,EAAE,wCAAwC,KAAK,CAAC,MAAM,WAAW,MAAM,OAAO;QACpF,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC"}