npm-cli-gh-issue-preparator 1.29.1 → 1.30.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ # [1.30.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.29.1...v1.30.0) (2026-05-05)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **core:** distinguish null branchName from non-OPEN PR; skip single PR with null branch; add test ([6081073](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/6081073e1228d021df1de723d5da44ed379203e1))
7
+
8
+
9
+ ### Features
10
+
11
+ * **core:** always pass --branch to wrapper; skip non-OPEN and ambiguous PR cases ([a7f95b5](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/a7f95b513bdea5ef01a2139828f8a2a428da8dd5))
12
+
13
+ # [Unreleased]
14
+
15
+ ### Features
16
+
17
+ * **core:** always pass --branch to wrapper; skip non-OPEN PRs and ambiguous multi-PR issues; derive i<number> branch for issues with no related open PR
18
+
1
19
  ## [1.29.1](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.29.0...v1.29.1) (2026-05-05)
2
20
 
3
21
 
@@ -90,25 +90,42 @@ class StartPreparationUseCase {
90
90
  continue;
91
91
  }
92
92
  const isPrUrl = issue.url.includes('/pull/');
93
- let existingPRBranchName = null;
93
+ let branchName;
94
94
  if (isPrUrl) {
95
95
  const pr = await this.issueRepository.getOpenPullRequest(issue.url);
96
- existingPRBranchName = pr?.branchName ?? null;
96
+ if (pr === null) {
97
+ console.warn(`Skipping non-OPEN PR ${issue.url}: wrapper requires an open PR.`);
98
+ continue;
99
+ }
100
+ if (pr.branchName === null) {
101
+ console.warn(`Skipping PR ${issue.url}: head branch is unavailable.`);
102
+ continue;
103
+ }
104
+ branchName = pr.branchName;
97
105
  }
98
106
  else {
99
107
  const relatedPRs = await this.issueRepository.findRelatedOpenPRs(issue.url);
100
- existingPRBranchName =
101
- relatedPRs.length === 1 ? relatedPRs[0].branchName : null;
108
+ if (relatedPRs.length > 1) {
109
+ console.warn(`Skipping issue ${issue.url}: ${relatedPRs.length} related open PRs found (ambiguous).`);
110
+ continue;
111
+ }
112
+ else if (relatedPRs.length === 1) {
113
+ if (relatedPRs[0].branchName === null) {
114
+ console.warn(`Skipping issue ${issue.url}: related open PR has unavailable head branch.`);
115
+ continue;
116
+ }
117
+ branchName = relatedPRs[0].branchName;
118
+ }
119
+ else {
120
+ branchName = `i${issue.number}`;
121
+ }
102
122
  }
103
123
  issue.status = params.preparationStatus;
104
124
  await this.issueRepository.update(issue, project);
105
125
  const logFilePathArg = params.logFilePath
106
126
  ? `--logFilePath ${params.logFilePath}`
107
127
  : null;
108
- const branchArg = existingPRBranchName !== null
109
- ? ` --branch ${existingPRBranchName}`
110
- : '';
111
- const command = `aw ${issue.url} ${agent} ${model} ${project.url}${logFilePathArg !== null ? ` ${logFilePathArg}` : ''}${branchArg}`;
128
+ const command = `aw ${issue.url} ${agent} ${model} ${project.url}${logFilePathArg !== null ? ` ${logFilePathArg}` : ''} --branch ${branchName}`;
112
129
  await this.localCommandRunner.runCommand(command);
113
130
  updatedCurrentPreparationIssueCount++;
114
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StartPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StartPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "npm-cli-gh-issue-preparator",
3
- "version": "1.29.1",
3
+ "version": "1.30.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -194,7 +194,7 @@ describe('StartPreparationUseCase', () => {
194
194
  expect(mockIssueRepository.update.mock.calls[0][1]).toBe(mockProject);
195
195
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
196
196
  expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
197
- `aw url1 impl claude-opus ${mockProject.url}`,
197
+ `aw url1 impl claude-opus ${mockProject.url} --branch i1`,
198
198
  );
199
199
  });
200
200
  it('should pass --branch to aw command when issue has an existing linked PR', async () => {
@@ -294,7 +294,7 @@ describe('StartPreparationUseCase', () => {
294
294
  'https://github.com/user/repo/pull/354',
295
295
  );
296
296
  });
297
- it('should not pass --branch when PR URL returns null from getOpenPullRequest', async () => {
297
+ it('should skip and not call wrapper when PR URL returns null from getOpenPullRequest', async () => {
298
298
  const awaitingIssues: Issue[] = [
299
299
  createMockIssue({
300
300
  url: 'https://github.com/user/repo/pull/999',
@@ -309,11 +309,56 @@ describe('StartPreparationUseCase', () => {
309
309
  );
310
310
  mockIssueRepository.getAllOpened.mockResolvedValueOnce(awaitingIssues);
311
311
  mockIssueRepository.getOpenPullRequest.mockResolvedValue(null);
312
- mockLocalCommandRunner.runCommand.mockResolvedValue({
313
- stdout: '',
314
- stderr: '',
315
- exitCode: 0,
312
+ const consoleWarnSpy = jest
313
+ .spyOn(console, 'warn')
314
+ .mockImplementation(() => {});
315
+ await useCase.run({
316
+ projectUrl: 'https://github.com/user/repo',
317
+ awaitingWorkspaceStatus: 'Awaiting Workspace',
318
+ preparationStatus: 'Preparation',
319
+ defaultAgentName: 'agent1',
320
+ defaultLlmModelName: 'claude-opus',
321
+ defaultLlmAgentName: null,
322
+ logFilePath: null,
323
+ maximumPreparingIssuesCount: null,
324
+ utilizationPercentageThreshold: 90,
325
+ allowedIssueAuthors: null,
316
326
  });
327
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
328
+ expect(mockIssueRepository.update.mock.calls).toHaveLength(0);
329
+ expect(mockIssueRepository.findRelatedOpenPRs).not.toHaveBeenCalled();
330
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
331
+ 'Skipping non-OPEN PR https://github.com/user/repo/pull/999: wrapper requires an open PR.',
332
+ );
333
+ consoleWarnSpy.mockRestore();
334
+ });
335
+ it('should skip and not call wrapper when PR URL has open PR with null branchName', async () => {
336
+ const awaitingIssues: Issue[] = [
337
+ createMockIssue({
338
+ url: 'https://github.com/user/repo/pull/999',
339
+ title: 'PR 999',
340
+ labels: ['category:impl'],
341
+ status: 'Awaiting Workspace',
342
+ }),
343
+ ];
344
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
345
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(
346
+ createMockStoryObjectMap(awaitingIssues),
347
+ );
348
+ mockIssueRepository.getAllOpened.mockResolvedValueOnce(awaitingIssues);
349
+ mockIssueRepository.getOpenPullRequest.mockResolvedValue({
350
+ url: 'https://github.com/user/repo/pull/999',
351
+ branchName: null,
352
+ isConflicted: false,
353
+ isPassedAllCiJob: false,
354
+ isCiStateSuccess: false,
355
+ isResolvedAllReviewComments: false,
356
+ isBranchOutOfDate: false,
357
+ missingRequiredCheckNames: [],
358
+ });
359
+ const consoleWarnSpy = jest
360
+ .spyOn(console, 'warn')
361
+ .mockImplementation(() => {});
317
362
  await useCase.run({
318
363
  projectUrl: 'https://github.com/user/repo',
319
364
  awaitingWorkspaceStatus: 'Awaiting Workspace',
@@ -326,13 +371,14 @@ describe('StartPreparationUseCase', () => {
326
371
  utilizationPercentageThreshold: 90,
327
372
  allowedIssueAuthors: null,
328
373
  });
329
- expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
330
- expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
331
- `aw https://github.com/user/repo/pull/999 impl claude-opus ${mockProject.url}`,
374
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
375
+ expect(mockIssueRepository.update.mock.calls).toHaveLength(0);
376
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
377
+ 'Skipping PR https://github.com/user/repo/pull/999: head branch is unavailable.',
332
378
  );
333
- expect(mockIssueRepository.findRelatedOpenPRs).not.toHaveBeenCalled();
379
+ consoleWarnSpy.mockRestore();
334
380
  });
335
- it('should not pass --branch when issue has multiple linked PRs', async () => {
381
+ it('should skip and not call wrapper when issue has multiple related open PRs', async () => {
336
382
  const awaitingIssues: Issue[] = [
337
383
  createMockIssue({
338
384
  url: 'url1',
@@ -367,11 +413,58 @@ describe('StartPreparationUseCase', () => {
367
413
  );
368
414
  mockIssueRepository.getAllOpened.mockResolvedValueOnce(awaitingIssues);
369
415
  mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([pr1, pr2]);
370
- mockLocalCommandRunner.runCommand.mockResolvedValue({
371
- stdout: '',
372
- stderr: '',
373
- exitCode: 0,
416
+ const consoleWarnSpy = jest
417
+ .spyOn(console, 'warn')
418
+ .mockImplementation(() => {});
419
+ await useCase.run({
420
+ projectUrl: 'https://github.com/user/repo',
421
+ awaitingWorkspaceStatus: 'Awaiting Workspace',
422
+ preparationStatus: 'Preparation',
423
+ defaultAgentName: 'agent1',
424
+ defaultLlmModelName: 'claude-opus',
425
+ defaultLlmAgentName: null,
426
+ logFilePath: null,
427
+ maximumPreparingIssuesCount: null,
428
+ utilizationPercentageThreshold: 90,
429
+ allowedIssueAuthors: null,
374
430
  });
431
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
432
+ expect(mockIssueRepository.update.mock.calls).toHaveLength(0);
433
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
434
+ 'Skipping issue url1: 2 related open PRs found (ambiguous).',
435
+ );
436
+ consoleWarnSpy.mockRestore();
437
+ });
438
+ it('should skip and not call wrapper when issue has one related open PR with null branchName', async () => {
439
+ const awaitingIssues: Issue[] = [
440
+ createMockIssue({
441
+ url: 'url1',
442
+ title: 'Issue 1',
443
+ labels: ['category:impl'],
444
+ status: 'Awaiting Workspace',
445
+ }),
446
+ ];
447
+ const prWithNullBranch: RelatedPullRequest = {
448
+ url: 'https://github.com/user/repo/pull/42',
449
+ branchName: null,
450
+ isConflicted: false,
451
+ isPassedAllCiJob: false,
452
+ isCiStateSuccess: false,
453
+ isResolvedAllReviewComments: false,
454
+ isBranchOutOfDate: false,
455
+ missingRequiredCheckNames: [],
456
+ };
457
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
458
+ mockIssueRepository.getStoryObjectMap.mockResolvedValue(
459
+ createMockStoryObjectMap(awaitingIssues),
460
+ );
461
+ mockIssueRepository.getAllOpened.mockResolvedValueOnce(awaitingIssues);
462
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
463
+ prWithNullBranch,
464
+ ]);
465
+ const consoleWarnSpy = jest
466
+ .spyOn(console, 'warn')
467
+ .mockImplementation(() => {});
375
468
  await useCase.run({
376
469
  projectUrl: 'https://github.com/user/repo',
377
470
  awaitingWorkspaceStatus: 'Awaiting Workspace',
@@ -384,10 +477,12 @@ describe('StartPreparationUseCase', () => {
384
477
  utilizationPercentageThreshold: 90,
385
478
  allowedIssueAuthors: null,
386
479
  });
387
- expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
388
- expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
389
- `aw url1 impl claude-opus ${mockProject.url}`,
480
+ expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
481
+ expect(mockIssueRepository.update.mock.calls).toHaveLength(0);
482
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
483
+ 'Skipping issue url1: related open PR has unavailable head branch.',
390
484
  );
485
+ consoleWarnSpy.mockRestore();
391
486
  });
392
487
  it('should assign workspace to awaiting issues', async () => {
393
488
  const awaitingIssues: Issue[] = [
@@ -520,7 +615,7 @@ describe('StartPreparationUseCase', () => {
520
615
  });
521
616
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
522
617
  expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
523
- `aw url1 impl claude-opus ${mockProject.url} --logFilePath /path/to/log.txt`,
618
+ `aw url1 impl claude-opus ${mockProject.url} --logFilePath /path/to/log.txt --branch i1`,
524
619
  );
525
620
  });
526
621
  it('should not append logFilePath to aw command when not provided', async () => {
@@ -556,7 +651,7 @@ describe('StartPreparationUseCase', () => {
556
651
  });
557
652
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
558
653
  expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
559
- `aw url1 impl claude-opus ${mockProject.url}`,
654
+ `aw url1 impl claude-opus ${mockProject.url} --branch i1`,
560
655
  );
561
656
  });
562
657
  it('should use llm-agent label over category label and defaultLlmAgentName', async () => {
@@ -592,7 +687,7 @@ describe('StartPreparationUseCase', () => {
592
687
  });
593
688
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
594
689
  expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
595
- `aw url1 research claude-sonnet-4-6 ${mockProject.url}`,
690
+ `aw url1 research claude-sonnet-4-6 ${mockProject.url} --branch i1`,
596
691
  );
597
692
  });
598
693
  it('should use category label over defaultLlmAgentName when no llm-agent label', async () => {
@@ -628,7 +723,7 @@ describe('StartPreparationUseCase', () => {
628
723
  });
629
724
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
630
725
  expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
631
- `aw url1 impl claude-sonnet-4-6 ${mockProject.url}`,
726
+ `aw url1 impl claude-sonnet-4-6 ${mockProject.url} --branch i1`,
632
727
  );
633
728
  });
634
729
  it('should use defaultLlmAgentName over defaultAgentName when no label', async () => {
@@ -664,7 +759,7 @@ describe('StartPreparationUseCase', () => {
664
759
  });
665
760
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
666
761
  expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
667
- `aw url1 default-llm-agent claude-sonnet-4-6 ${mockProject.url}`,
762
+ `aw url1 default-llm-agent claude-sonnet-4-6 ${mockProject.url} --branch i1`,
668
763
  );
669
764
  });
670
765
  it('should use llm-model label over defaultLlmModelName', async () => {
@@ -700,7 +795,7 @@ describe('StartPreparationUseCase', () => {
700
795
  });
701
796
  expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
702
797
  expect(mockLocalCommandRunner.runCommand.mock.calls[0][0]).toBe(
703
- `aw url1 impl claude-sonnet ${mockProject.url}`,
798
+ `aw url1 impl claude-sonnet ${mockProject.url} --branch i1`,
704
799
  );
705
800
  });
706
801
  it('should log error and skip issue when no llm-model label and no defaultLlmModelName', async () => {
@@ -172,16 +172,40 @@ export class StartPreparationUseCase {
172
172
  continue;
173
173
  }
174
174
  const isPrUrl = issue.url.includes('/pull/');
175
- let existingPRBranchName: string | null = null;
175
+ let branchName: string;
176
176
  if (isPrUrl) {
177
177
  const pr = await this.issueRepository.getOpenPullRequest(issue.url);
178
- existingPRBranchName = pr?.branchName ?? null;
178
+ if (pr === null) {
179
+ console.warn(
180
+ `Skipping non-OPEN PR ${issue.url}: wrapper requires an open PR.`,
181
+ );
182
+ continue;
183
+ }
184
+ if (pr.branchName === null) {
185
+ console.warn(`Skipping PR ${issue.url}: head branch is unavailable.`);
186
+ continue;
187
+ }
188
+ branchName = pr.branchName;
179
189
  } else {
180
190
  const relatedPRs = await this.issueRepository.findRelatedOpenPRs(
181
191
  issue.url,
182
192
  );
183
- existingPRBranchName =
184
- relatedPRs.length === 1 ? relatedPRs[0].branchName : null;
193
+ if (relatedPRs.length > 1) {
194
+ console.warn(
195
+ `Skipping issue ${issue.url}: ${relatedPRs.length} related open PRs found (ambiguous).`,
196
+ );
197
+ continue;
198
+ } else if (relatedPRs.length === 1) {
199
+ if (relatedPRs[0].branchName === null) {
200
+ console.warn(
201
+ `Skipping issue ${issue.url}: related open PR has unavailable head branch.`,
202
+ );
203
+ continue;
204
+ }
205
+ branchName = relatedPRs[0].branchName;
206
+ } else {
207
+ branchName = `i${issue.number}`;
208
+ }
185
209
  }
186
210
 
187
211
  issue.status = params.preparationStatus;
@@ -190,11 +214,7 @@ export class StartPreparationUseCase {
190
214
  const logFilePathArg = params.logFilePath
191
215
  ? `--logFilePath ${params.logFilePath}`
192
216
  : null;
193
- const branchArg =
194
- existingPRBranchName !== null
195
- ? ` --branch ${existingPRBranchName}`
196
- : '';
197
- const command = `aw ${issue.url} ${agent} ${model} ${project.url}${logFilePathArg !== null ? ` ${logFilePathArg}` : ''}${branchArg}`;
217
+ const command = `aw ${issue.url} ${agent} ${model} ${project.url}${logFilePathArg !== null ? ` ${logFilePathArg}` : ''} --branch ${branchName}`;
198
218
  await this.localCommandRunner.runCommand(command);
199
219
  updatedCurrentPreparationIssueCount++;
200
220
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAQhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAblB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,UAAU,GAAG,eAAe,CAC7B,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,cAAc,GACd,mBAAmB,GACnB,QAAQ,GACR,oBAAoB,GACpB,oBAAoB,CACvB,EACgB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,EACpD,kBAAkB,EAAE,kBAAkB;IAGzD,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,uBAAuB,EAAE,MAAM,CAAC;QAChC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,8BAA8B,EAAE,MAAM,CAAC;QACvC,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACtC,KAAG,OAAO,CAAC,IAAI,CAAC,CAsKf;CACH"}
1
+ {"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAQhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAblB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,UAAU,GAAG,eAAe,CAC7B,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,cAAc,GACd,mBAAmB,GACnB,QAAQ,GACR,oBAAoB,GACpB,oBAAoB,CACvB,EACgB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,EACpD,kBAAkB,EAAE,kBAAkB;IAGzD,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,uBAAuB,EAAE,MAAM,CAAC;QAChC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,8BAA8B,EAAE,MAAM,CAAC;QACvC,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACtC,KAAG,OAAO,CAAC,IAAI,CAAC,CA0Lf;CACH"}