@made-by-moonlight/athene-plugin-scm-github 0.9.1
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/LICENSE +22 -0
- package/dist/graphql-batch.d.ts +229 -0
- package/dist/graphql-batch.d.ts.map +1 -0
- package/dist/graphql-batch.js +1007 -0
- package/dist/graphql-batch.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1169 -0
- package/dist/index.js.map +1 -0
- package/dist/lru-cache.d.ts +28 -0
- package/dist/lru-cache.d.ts.map +1 -0
- package/dist/lru-cache.js +80 -0
- package/dist/lru-cache.js.map +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Composio, Inc.
|
|
4
|
+
Copyright (c) 2026 slievr (Athene fork)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Batch PR Enrichment
|
|
3
|
+
*
|
|
4
|
+
* Efficiently fetches data for multiple PRs using GraphQL aliases.
|
|
5
|
+
* Reduces API calls from N×3 to 1 (or a few if batching needed).
|
|
6
|
+
*/
|
|
7
|
+
import { execFile } from "node:child_process";
|
|
8
|
+
import { type BatchObserver, type CIStatus, type PREnrichmentData, type PRInfo, type PRState, type ReviewDecision } from "@made-by-moonlight/athene-core";
|
|
9
|
+
import { LRUCache } from "./lru-cache.js";
|
|
10
|
+
declare let execFileAsync: typeof execFile.__promisify__;
|
|
11
|
+
/**
|
|
12
|
+
* Set execFileAsync for testing.
|
|
13
|
+
* Allows mocking the underlying execFile in unit tests.
|
|
14
|
+
*
|
|
15
|
+
* NOTE: This bypasses the gh tracer (execGhObserved). Tests that need to
|
|
16
|
+
* verify tracer behavior should mock execGhObserved directly or use
|
|
17
|
+
* setExecGhAsync instead.
|
|
18
|
+
*/
|
|
19
|
+
export declare function setExecFileAsync(fn: typeof execFileAsync): void;
|
|
20
|
+
/**
|
|
21
|
+
* Set execGhAsync for testing — preserves tracer in the call chain.
|
|
22
|
+
* Use this when testing code that should exercise the traced execution path.
|
|
23
|
+
*/
|
|
24
|
+
export declare function setExecGhAsync(fn: (args: string[], timeout: number, operation: string) => Promise<string>): void;
|
|
25
|
+
/**
|
|
26
|
+
* ETag cache for REST API endpoints.
|
|
27
|
+
* Used to avoid expensive GraphQL queries when nothing has changed.
|
|
28
|
+
*
|
|
29
|
+
* Keys:
|
|
30
|
+
* - PR list: "prList:{owner}/{repo}"
|
|
31
|
+
* - Commit status: "commit:{owner}/{repo}#{sha}"
|
|
32
|
+
*/
|
|
33
|
+
interface ETagCache {
|
|
34
|
+
prList: LRUCache<string, string>;
|
|
35
|
+
commitStatus: LRUCache<string, string>;
|
|
36
|
+
reviewComments: LRUCache<string, string>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Result of checking if PR data has changed via ETag guards.
|
|
40
|
+
*/
|
|
41
|
+
interface ETagGuardResult {
|
|
42
|
+
shouldRefresh: boolean;
|
|
43
|
+
details: string[];
|
|
44
|
+
/** Repos where Guard 1 returned 304 — no PR list changes, detectPR can be skipped. */
|
|
45
|
+
prListUnchangedRepos: Set<string>;
|
|
46
|
+
}
|
|
47
|
+
/** Result of enrichSessionsPRBatch including Guard 1 PR-discovery info. */
|
|
48
|
+
export interface BatchEnrichmentResult {
|
|
49
|
+
enrichment: Map<string, PREnrichmentData>;
|
|
50
|
+
/** Repos where Guard 1 returned 304 — safe to skip detectPR. */
|
|
51
|
+
prListUnchangedRepos: Set<string>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Clear all ETag cache entries.
|
|
55
|
+
* Useful for testing or when forcing a refresh.
|
|
56
|
+
*/
|
|
57
|
+
export declare function clearETagCache(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Get PR list ETag for a repository.
|
|
60
|
+
*/
|
|
61
|
+
export declare function getPRListETag(owner: string, repo: string): string | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Get commit status ETag for a specific commit.
|
|
64
|
+
*/
|
|
65
|
+
export declare function getCommitStatusETag(owner: string, repo: string, sha: string): string | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Set PR list ETag for a repository.
|
|
68
|
+
* Exported for testing.
|
|
69
|
+
*/
|
|
70
|
+
export declare function setPRListETag(owner: string, repo: string, etag: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Set commit status ETag for a specific commit.
|
|
73
|
+
* Exported for testing.
|
|
74
|
+
*/
|
|
75
|
+
export declare function setCommitStatusETag(owner: string, repo: string, sha: string, etag: string): void;
|
|
76
|
+
/**
|
|
77
|
+
* Update PR metadata cache with latest enrichment data.
|
|
78
|
+
* Called after successful GraphQL batch enrichment.
|
|
79
|
+
*/
|
|
80
|
+
declare function updatePRMetadataCache(prKey: string, enrichment: PREnrichmentData, headSha: string | null): void;
|
|
81
|
+
/**
|
|
82
|
+
* 2-Guard ETag Strategy: Check if PR enrichment cache needs refreshing.
|
|
83
|
+
*
|
|
84
|
+
* Before running expensive GraphQL batch queries, use two lightweight REST API
|
|
85
|
+
* ETag checks to detect if anything actually changed:
|
|
86
|
+
*
|
|
87
|
+
* Guard 1: PR List ETag Check (per repo)
|
|
88
|
+
* - Detects: New commits, PR title/body edits, labels changes, reviews, PR state changes
|
|
89
|
+
* - Misses: CI status changes
|
|
90
|
+
*
|
|
91
|
+
* Guard 2: Commit Status ETag Check (per PR with cached metadata)
|
|
92
|
+
* - Checks ALL PRs with cached metadata and head SHA
|
|
93
|
+
* - Detects: CI check starts, passes, fails, or external status updates
|
|
94
|
+
* - Critical for catching CI transitions (failing -> passing, passing -> failing, etc.)
|
|
95
|
+
*
|
|
96
|
+
* @param prs - PRs to check
|
|
97
|
+
* @returns true if GraphQL batch should run, false if nothing changed
|
|
98
|
+
*/
|
|
99
|
+
export declare function shouldRefreshPREnrichment(prs: PRInfo[], extraRepos?: string[], observer?: BatchObserver): Promise<ETagGuardResult>;
|
|
100
|
+
/**
|
|
101
|
+
* Get cached PR metadata for testing.
|
|
102
|
+
*/
|
|
103
|
+
export declare function getPRMetadataCache(): Map<string, {
|
|
104
|
+
headSha: string | null;
|
|
105
|
+
ciStatus: CIStatus;
|
|
106
|
+
}>;
|
|
107
|
+
/**
|
|
108
|
+
* Get cached PR enrichment data for testing.
|
|
109
|
+
*/
|
|
110
|
+
export declare function getPREnrichmentDataCache(): Map<string, PREnrichmentData>;
|
|
111
|
+
/**
|
|
112
|
+
* Set PR metadata for testing.
|
|
113
|
+
*/
|
|
114
|
+
export declare function setPRMetadata(key: string, metadata: {
|
|
115
|
+
headSha: string | null;
|
|
116
|
+
ciStatus: CIStatus;
|
|
117
|
+
}): void;
|
|
118
|
+
/**
|
|
119
|
+
* Clear PR metadata cache for testing.
|
|
120
|
+
*/
|
|
121
|
+
export declare function clearPRMetadataCache(): void;
|
|
122
|
+
/** Test-only: reset the once-per-process gh_unavailable guard. */
|
|
123
|
+
export declare function _resetGhUnavailableEmittedForTesting(): void;
|
|
124
|
+
/** Test-only: reset the once-per-PR batch extraction failure guard. */
|
|
125
|
+
export declare function _resetBatchEnrichPRFailedEmittedForTesting(): void;
|
|
126
|
+
/**
|
|
127
|
+
* Maximum number of PRs to query in a single GraphQL batch.
|
|
128
|
+
* GitHub has limits on query complexity and we stay well under this limit.
|
|
129
|
+
*/
|
|
130
|
+
export declare const MAX_BATCH_SIZE = 25;
|
|
131
|
+
/**
|
|
132
|
+
* Guard 1: PR List ETag Check (per repo)
|
|
133
|
+
*
|
|
134
|
+
* Detects if PR metadata has changed in a repository using REST ETag.
|
|
135
|
+
*
|
|
136
|
+
* - Endpoint: GET /repos/{owner}/{repo}/pulls?state=open&sort=updated&direction=desc
|
|
137
|
+
* - Detects: New commits, PR title/body edits, label changes, reviews, PR state changes
|
|
138
|
+
* - Misses: CI status changes (handled by Guard 2)
|
|
139
|
+
*
|
|
140
|
+
* @returns true if PR list has changed (200 OK), false if unchanged (304 Not Modified)
|
|
141
|
+
*/
|
|
142
|
+
declare function checkPRListETag(owner: string, repo: string, observer?: BatchObserver): Promise<boolean>;
|
|
143
|
+
/**
|
|
144
|
+
* Guard 2: Check-Runs ETag Check (per PR with cached head SHA)
|
|
145
|
+
*
|
|
146
|
+
* Detects if CI status has changed for a specific commit using REST ETag.
|
|
147
|
+
*
|
|
148
|
+
* - Endpoint: GET /repos/{owner}/{repo}/commits/{head_sha}/check-runs
|
|
149
|
+
* Uses the check-runs endpoint (not legacy /status) because the batch
|
|
150
|
+
* query reads `statusCheckRollup` which aggregates check-runs. Pure-Actions
|
|
151
|
+
* repos only update check-runs, not the legacy combined-status endpoint.
|
|
152
|
+
* - Detects: CI check starts, passes, fails, or external status updates
|
|
153
|
+
*
|
|
154
|
+
* @returns true if CI status has changed (200 OK), false if unchanged (304 Not Modified)
|
|
155
|
+
*/
|
|
156
|
+
declare function checkCommitStatusETag(owner: string, repo: string, sha: string, observer?: BatchObserver): Promise<boolean>;
|
|
157
|
+
/**
|
|
158
|
+
* Guard 3: Review Comments ETag Check (per PR)
|
|
159
|
+
*
|
|
160
|
+
* Detects if inline review comments have changed on a PR.
|
|
161
|
+
* Used to gate the getReviewThreads GraphQL call — if no new comments
|
|
162
|
+
* exist (304), the cached result is reused without a GraphQL call.
|
|
163
|
+
*
|
|
164
|
+
* - Endpoint: GET /repos/{owner}/{repo}/pulls/{number}/comments
|
|
165
|
+
* No per_page limit — the ETag covers the full resource. With per_page=1,
|
|
166
|
+
* the ETag only covers the first page, so new comments on page 2+ would
|
|
167
|
+
* never bust the validator. Typical PR comment counts are small (<100)
|
|
168
|
+
* so the unbounded list is fine.
|
|
169
|
+
* - Detects: New review comments, edited comments, deleted comments
|
|
170
|
+
* - Cost: 0 REST points on 304, 1 REST point on 200
|
|
171
|
+
*/
|
|
172
|
+
export declare function checkReviewCommentsETag(owner: string, repo: string, prNumber: number, observer?: BatchObserver): Promise<boolean>;
|
|
173
|
+
/**
|
|
174
|
+
* Generate a GraphQL batch query for multiple PRs using aliases.
|
|
175
|
+
*
|
|
176
|
+
* Each PR gets a unique alias (pr0, pr1, pr2...) and the query
|
|
177
|
+
* fetches the same fields for each PR.
|
|
178
|
+
*/
|
|
179
|
+
export declare function generateBatchQuery(prs: PRInfo[]): {
|
|
180
|
+
query: string;
|
|
181
|
+
variables: Record<string, unknown>;
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* Parse raw CI state from status check rollup.
|
|
185
|
+
*
|
|
186
|
+
* Uses only the top-level aggregate state to determine overall CI status.
|
|
187
|
+
* Individual check details are parsed separately via parseCheckContexts().
|
|
188
|
+
*/
|
|
189
|
+
declare function parseCIState(statusCheckRollup: unknown): CIStatus;
|
|
190
|
+
/**
|
|
191
|
+
* Parse review decision from GraphQL response.
|
|
192
|
+
*/
|
|
193
|
+
declare function parseReviewDecision(reviewDecision: unknown): ReviewDecision;
|
|
194
|
+
/**
|
|
195
|
+
* Parse PR state from GraphQL response.
|
|
196
|
+
*/
|
|
197
|
+
declare function parsePRState(state: unknown): PRState;
|
|
198
|
+
/**
|
|
199
|
+
* Extract enrichment data from a single PR result.
|
|
200
|
+
*
|
|
201
|
+
* Returns the enrichment data along with the head SHA for ETag caching.
|
|
202
|
+
*/
|
|
203
|
+
declare function extractPREnrichment(pullRequest: unknown): {
|
|
204
|
+
data: PREnrichmentData;
|
|
205
|
+
headSha: string | null;
|
|
206
|
+
} | null;
|
|
207
|
+
/**
|
|
208
|
+
* Main batch enrichment function with 2-Guard ETag Strategy.
|
|
209
|
+
*
|
|
210
|
+
* Before running expensive GraphQL batch queries, uses two lightweight REST API
|
|
211
|
+
* ETag checks to detect if anything actually changed:
|
|
212
|
+
*
|
|
213
|
+
* 1. Guard 1: PR List ETag Check (per repo)
|
|
214
|
+
* - Detects PR metadata changes (commits, reviews, labels, state)
|
|
215
|
+
* - Cost: 1 REST point if changed, 0 if unchanged (304)
|
|
216
|
+
*
|
|
217
|
+
* 2. Guard 2: Commit Status ETag Check (per PR with pending CI)
|
|
218
|
+
* - Detects CI status changes for PRs with pending CI
|
|
219
|
+
* - Cost: 1 REST point if changed, 0 if unchanged (304)
|
|
220
|
+
*
|
|
221
|
+
* If guards indicate no changes, skips GraphQL entirely (saves ~50 points per batch).
|
|
222
|
+
* If any guard detects a change, runs GraphQL batch queries.
|
|
223
|
+
*
|
|
224
|
+
* Returns a Map keyed by "${owner}/${repo}#${number}" for efficient lookup.
|
|
225
|
+
*/
|
|
226
|
+
export declare function enrichSessionsPRBatch(prs: PRInfo[], observer?: BatchObserver, repos?: string[]): Promise<BatchEnrichmentResult>;
|
|
227
|
+
export { parseCIState, parseReviewDecision, parsePRState, extractPREnrichment, checkPRListETag, checkCommitStatusETag, updatePRMetadataCache, };
|
|
228
|
+
export type { ETagCache, ETagGuardResult };
|
|
229
|
+
//# sourceMappingURL=graphql-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-batch.d.ts","sourceRoot":"","sources":["../src/graphql-batch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAGL,KAAK,aAAa,EAElB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,QAAA,IAAI,aAAa,+BAAsB,CAAC;AAIxC;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,aAAa,GAAG,IAAI,CAS/D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAC1E,IAAI,CAEN;AAWD;;;;;;;GAOG;AACH,UAAU,SAAS;IACjB,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAeD;;GAEG;AACH,UAAU,eAAe;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sFAAsF;IACtF,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1C,gEAAgE;IAChE,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAIrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhG;AAuBD;;;GAGG;AACH,iBAAS,qBAAqB,CAC5B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,IAAI,CAON;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,MAAM,EAAE,EACb,UAAU,GAAE,MAAM,EAAO,EACzB,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,eAAe,CAAC,CA4F1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,CAEhG;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAExE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GACvD,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AA6CD,kEAAkE;AAClE,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAED,uEAAuE;AACvE,wBAAgB,0CAA0C,IAAI,IAAI,CAEjE;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AAgCjC;;;;;;;;;;GAUG;AACH,iBAAe,eAAe,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,OAAO,CAAC,CAmDlB;AAED;;;;;;;;;;;;GAYG;AACH,iBAAe,qBAAqB,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,OAAO,CAAC,CAmDlB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,OAAO,CAAC,CA4ClB;AAmDD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAsCA;AAiKD;;;;;GAKG;AACH,iBAAS,YAAY,CAAC,iBAAiB,EAAE,OAAO,GAAG,QAAQ,CAoB1D;AAED;;GAEG;AACH,iBAAS,mBAAmB,CAAC,cAAc,EAAE,OAAO,GAAG,cAAc,CAMpE;AAED;;GAEG;AACH,iBAAS,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK7C;AAED;;;;GAIG;AACH,iBAAS,mBAAmB,CAC1B,WAAW,EAAE,OAAO,GACnB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAiG3D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EAAE,EACb,QAAQ,CAAC,EAAE,aAAa,EACxB,KAAK,GAAE,MAAM,EAAO,GACnB,OAAO,CAAC,qBAAqB,CAAC,CAmJhC;AAGD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EAErB,qBAAqB,GACtB,CAAC;AAGF,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC"}
|