@graftsync/adapter-patch 0.0.0-stage → 0.1.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Brandon Roberts
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ import { type MechanismAdapter } from '@graftsync/core';
2
+ export declare const MECHANISM = "patch";
3
+ export declare function createPatchAdapter(): MechanismAdapter;
4
+ export declare const patchAdapter: MechanismAdapter;
5
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAYL,KAAK,gBAAgB,EAItB,MAAM,iBAAiB,CAAC;AASzB,eAAO,MAAM,SAAS,UAAU,CAAC;AAkFjC,wBAAgB,kBAAkB,IAAI,gBAAgB,CA+MrD;AAED,eAAO,MAAM,YAAY,kBAAuB,CAAC"}
@@ -0,0 +1,310 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { applyPatch, reversePatch } from 'diff';
5
+ import { distinctiveText, GraftError, rankFilesByContent, readInstalledFiles, renderPatch, scopeFileDiff, } from '@graftsync/core';
6
+ import { applyFilePatch, describeHunk, locateHunk, parsePatchFile, patchTarget } from './patchfile.js';
7
+ import { selectApplier } from './appliers.js';
8
+ import { applyToInstalledCopy, findInstalledCopies } from './installed.js';
9
+ /** The applier for this project (config `mechanisms.patch.applier`, else from the lockfile). */
10
+ const applierFor = (project) => selectApplier(project.root, project.config.mechanisms?.patch?.applier);
11
+ export const MECHANISM = 'patch';
12
+ async function loadPatch(graft, variant) {
13
+ if (!existsSync(variant.path))
14
+ throw new GraftError(`graft "${graft.id}": variant ${variant.module} not found`, 'variant/not-found');
15
+ if (!variant.path.endsWith('.patch') && !variant.path.endsWith('.diff')) {
16
+ throw new GraftError(`graft "${graft.id}": patch variants must be .patch or .diff files (got ${variant.module})`, 'variant/invalid');
17
+ }
18
+ let patches;
19
+ try {
20
+ patches = parsePatchFile(await readFile(variant.path, 'utf8'));
21
+ }
22
+ catch (err) {
23
+ throw new GraftError(`graft "${graft.id}": could not parse ${variant.module}: ${err.message}`, 'variant/invalid');
24
+ }
25
+ if (!patches.length || patches.every((p) => p.hunks.length === 0)) {
26
+ throw new GraftError(`graft "${graft.id}": ${variant.module} contains no hunks; a graft must never apply nothing`, 'variant/empty');
27
+ }
28
+ for (const p of patches) {
29
+ const t = patchTarget(p);
30
+ if (path.isAbsolute(t) || t.split('/').includes('..')) {
31
+ throw new GraftError(`graft "${graft.id}": ${variant.module} touches ${t}, outside the package`, 'variant/invalid');
32
+ }
33
+ }
34
+ return patches;
35
+ }
36
+ async function readIn(dir, file) {
37
+ const full = path.join(dir, file);
38
+ return existsSync(full) ? readFile(full, 'utf8') : undefined;
39
+ }
40
+ /** Anchors of a patch: every hunk must fit exactly; created files must not already exist. */
41
+ function hunkAnchors(patch, content) {
42
+ const file = patchTarget(patch);
43
+ if (patch.oldFile === null) {
44
+ return [
45
+ {
46
+ name: `${file}#create`,
47
+ file,
48
+ description: `creates ${file}`,
49
+ matched: content === undefined,
50
+ error: content === undefined ? undefined : 'file already exists upstream (the graft may have been upstreamed)',
51
+ },
52
+ ];
53
+ }
54
+ return patch.hunks.map((hunk, i) => {
55
+ const base = { name: `${file}#${i + 1}`, file, description: describeHunk(hunk) };
56
+ if (content === undefined)
57
+ return { ...base, matched: false, error: 'file missing' };
58
+ const m = locateHunk(content, hunk);
59
+ if (!m.occurrences)
60
+ return { ...base, matched: false, error: 'context or removed lines not found' };
61
+ return {
62
+ ...base,
63
+ matched: true,
64
+ location: { line: m.line, column: 1, start: 0, end: 0 },
65
+ error: m.offset ? `found ${m.offset > 0 ? '+' : ''}${m.offset} lines from the header position` : undefined,
66
+ };
67
+ });
68
+ }
69
+ /**
70
+ * Evidence that `dir` (pristine upstream) already contains every change of `patches`, or
71
+ * undefined if any file patch is not fully absorbed: modified files must take the reverse patch
72
+ * with no fuzz, created files must exist with identical content, deleted files must be gone.
73
+ */
74
+ async function upstreamedEvidence(dir, patches) {
75
+ const evidence = [];
76
+ for (const p of patches) {
77
+ if (p.oldFile === null) {
78
+ const content = await readIn(dir, p.newFile);
79
+ if (content === undefined || content !== applyPatch('', p.raw, { fuzzFactor: 0 }))
80
+ return undefined;
81
+ evidence.push(`${p.newFile} already exists with the content this graft creates`);
82
+ }
83
+ else if (p.newFile === null) {
84
+ if ((await readIn(dir, p.oldFile)) !== undefined)
85
+ return undefined;
86
+ evidence.push(`${p.oldFile}, which this graft deletes, is already gone`);
87
+ }
88
+ else {
89
+ const content = await readIn(dir, p.newFile);
90
+ if (content === undefined || !p.hunks.length || applyPatch(content, reversePatch(p.raw), { fuzzFactor: 0 }) === false)
91
+ return undefined;
92
+ evidence.push(`${p.newFile}: all ${p.hunks.length} hunk(s) already present (the reverse patch applies with no fuzz)`);
93
+ }
94
+ }
95
+ return evidence.length ? evidence : undefined;
96
+ }
97
+ export function createPatchAdapter() {
98
+ return {
99
+ name: MECHANISM,
100
+ variantExtension: '.patch',
101
+ // One patchedDependencies entry / one vendored tarball per package.
102
+ exclusivePerPackage: true,
103
+ async checkAnchors(ctx, version) {
104
+ const { project, graft } = ctx;
105
+ const pkg = graft.frontmatter.rootstock.package;
106
+ const report = { graft: graft.id, package: pkg, version, variant: null, anchors: [], errors: [], ok: false };
107
+ report.variant = project.selectVariant(graft, version);
108
+ if (!report.variant) {
109
+ report.errors.push(`no variant covers ${pkg}@${version}`);
110
+ return report;
111
+ }
112
+ let patches;
113
+ let dir;
114
+ try {
115
+ patches = await loadPatch(graft, report.variant);
116
+ dir = await project.upstream.resolve(pkg, version);
117
+ }
118
+ catch (err) {
119
+ report.errors.push(err.message);
120
+ return report;
121
+ }
122
+ for (const p of patches) {
123
+ const content = await readIn(dir, patchTarget(p));
124
+ report.anchors.push(...hunkAnchors(p, content));
125
+ // Hunks can each fit yet fail together (ordering); confirm the whole file applies.
126
+ if (content !== undefined && p.oldFile && hunkAnchors(p, content).every((a) => a.matched) && applyFilePatch(content, p) === false) {
127
+ report.errors.push(`${patchTarget(p)}: hunks match individually but the patch does not apply as a whole`);
128
+ }
129
+ }
130
+ // A variant that no longer fits may simply be upstream's own change now: detect absorption.
131
+ if (!report.anchors.every((a) => a.matched)) {
132
+ const evidence = await upstreamedEvidence(dir, patches);
133
+ if (evidence)
134
+ report.upstreamed = { evidence };
135
+ }
136
+ const installed = await project.upstream.installed(pkg);
137
+ if (installed?.version === version) {
138
+ report.errors.push(...(await applierFor(project).problems(project.root, pkg, version, report.variant.path, { upstream: project.upstream })));
139
+ // Whatever the configuration says, check what actually got installed: each patched file
140
+ // must equal pristine upstream + this variant. Catches patches dropped silently.
141
+ // Under Plug'n'Play the installed copy lives in a zip archive, read through the PnP runtime.
142
+ if (report.anchors.every((a) => a.matched) && installed.dir !== dir) {
143
+ const targets = patches.filter((p) => p.newFile).map((p) => p.newFile);
144
+ let actual;
145
+ try {
146
+ actual = await readInstalledFiles(installed, targets);
147
+ }
148
+ catch (err) {
149
+ (report.warnings ??= []).push(`cannot verify installed files of ${pkg}@${version}${installed.pnp ? " under Plug'n'Play" : ''} (${err.message}); the package-manager configuration was checked, the installed contents were not`);
150
+ }
151
+ for (const p of actual ? patches : []) {
152
+ if (!p.newFile)
153
+ continue;
154
+ const pristine = p.oldFile ? await readIn(dir, p.oldFile) : '';
155
+ const expected = pristine === undefined ? false : applyFilePatch(pristine, p);
156
+ if (expected !== false && actual[p.newFile] !== expected) {
157
+ report.errors.push(`installed ${pkg}@${version} ${p.newFile} is not patched with ${report.variant.module}; run \`graft apply\` (or reinstall)`);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ report.ok = report.errors.length === 0 && report.anchors.every((a) => a.matched);
163
+ return report;
164
+ },
165
+ async apply(ctx, options = {}) {
166
+ const { project, graft } = ctx;
167
+ const pkg = graft.frontmatter.rootstock.package;
168
+ const version = options.version ?? (await project.installedVersion(pkg));
169
+ const result = { graft: graft.id, version: version ?? '?', variant: null, files: [], errors: [], ok: false };
170
+ if (!version) {
171
+ result.errors.push(`${pkg} is not installed`);
172
+ return result;
173
+ }
174
+ result.variant = project.selectVariant(graft, version);
175
+ if (!result.variant) {
176
+ result.errors.push(`no variant covers ${pkg}@${version}`);
177
+ return result;
178
+ }
179
+ let patches;
180
+ let dir;
181
+ try {
182
+ patches = await loadPatch(graft, result.variant);
183
+ dir = await project.upstream.resolve(pkg, version);
184
+ }
185
+ catch (err) {
186
+ result.errors.push(err.message);
187
+ return result;
188
+ }
189
+ for (const p of patches) {
190
+ const file = patchTarget(p);
191
+ const content = await readIn(dir, file);
192
+ let output;
193
+ if (p.oldFile === null)
194
+ output = content === undefined ? applyFilePatch('', p) : false;
195
+ else
196
+ output = content === undefined ? false : applyFilePatch(content, p);
197
+ if (output === false) {
198
+ result.files.push({ file, changed: false, error: content === undefined && p.oldFile ? 'file missing' : 'patch does not apply' });
199
+ continue;
200
+ }
201
+ const entry = { file: p.newFile ?? file, changed: output !== content };
202
+ if (options.outDir && p.newFile) {
203
+ entry.outputPath = path.join(options.outDir, p.newFile);
204
+ await mkdir(path.dirname(entry.outputPath), { recursive: true });
205
+ await writeFile(entry.outputPath, output);
206
+ }
207
+ result.files.push(entry);
208
+ }
209
+ result.ok = result.errors.length === 0 && result.files.every((f) => f.changed && !f.error);
210
+ return result;
211
+ },
212
+ async scopeDiff(ctx, from, to) {
213
+ const { project, graft } = ctx;
214
+ const pkg = graft.frontmatter.rootstock.package;
215
+ const [fromDir, toDir] = await Promise.all([project.upstream.resolve(pkg, from), project.upstream.resolve(pkg, to)]);
216
+ const fromVariant = project.selectVariant(graft, from);
217
+ const patches = fromVariant ? await loadPatch(graft, fromVariant).catch(() => []) : [];
218
+ const touched = new Set([...(graft.frontmatter.targets ?? []), ...patches.map((p) => p.oldFile).filter((f) => !!f)]);
219
+ const files = [];
220
+ for (const file of touched) {
221
+ const [oldText, newText] = await Promise.all([readIn(fromDir, file), readIn(toDir, file)]);
222
+ const filePatch = patches.find((p) => p.oldFile === file);
223
+ const regions = (filePatch?.hunks ?? []).map((h, i) => ({
224
+ name: `${file}#${i + 1}`,
225
+ old: [h.oldStart, h.oldStart + Math.max(h.oldLines - 1, 0)],
226
+ }));
227
+ const scoped = scopeFileDiff({ file, oldText, newText, regions, window: 10 });
228
+ if (scoped.status === 'removed' && filePatch?.hunks.length) {
229
+ // Point at where the patched code went: files in `to` holding the hunks' old side.
230
+ const text = distinctiveText(filePatch.hunks.flatMap((h) => h.lines.filter((l) => l[0] === ' ' || l[0] === '-').map((l) => l.slice(1))));
231
+ const ext = path.extname(file);
232
+ const include = ext && !/^\.(c|m)?js$/.test(ext) ? new RegExp(`(\\.(c|m)?js|${ext.replace('.', '\\.')})$`) : undefined;
233
+ const candidates = await rankFilesByContent(toDir, { ...text, include });
234
+ if (candidates.length)
235
+ scoped.candidates = candidates;
236
+ }
237
+ files.push(scoped);
238
+ }
239
+ return { graft: graft.id, package: pkg, from, to, files, patch: renderPatch(files, { from: `${pkg}@${from}`, to: `${pkg}@${to}` }) };
240
+ },
241
+ async applyInstalled(ctx) {
242
+ const { project, graft } = ctx;
243
+ const pkg = graft.frontmatter.rootstock.package;
244
+ const report = { graft: graft.id, package: pkg, copies: [], errors: [], warnings: [] };
245
+ const primary = await project.upstream.installed(pkg);
246
+ if (!primary) {
247
+ report.warnings.push(`${pkg} is not installed; nothing to apply`);
248
+ return report;
249
+ }
250
+ if (primary.pnp) {
251
+ report.errors.push(`${pkg} is installed through yarn Plug'n'Play (${primary.dir}); Graft's built-in applier patches node_modules and cannot patch PnP's zip cache — use the "yarn" applier (default for yarn 2+) or "vendor"`);
252
+ return report;
253
+ }
254
+ const copies = await findInstalledCopies(project.root, pkg);
255
+ if (!copies.some((c) => c.dir === primary.dir))
256
+ copies.unshift({ dir: primary.dir, version: primary.version });
257
+ for (const copy of copies) {
258
+ const isPrimary = copy.dir === primary.dir;
259
+ const variant = project.selectVariant(graft, copy.version);
260
+ const base = { dir: copy.dir, version: copy.version, primary: isPrimary, files: [] };
261
+ if (!variant) {
262
+ const reason = `no variant of graft "${graft.id}" covers ${pkg}@${copy.version}`;
263
+ report.copies.push({ ...base, action: isPrimary ? 'failed' : 'skipped', reason });
264
+ (isPrimary ? report.errors : report.warnings).push(isPrimary ? reason : `${reason} (nested copy at ${copy.dir} left unmodified)`);
265
+ continue;
266
+ }
267
+ let patches;
268
+ try {
269
+ patches = await loadPatch(graft, variant);
270
+ }
271
+ catch (err) {
272
+ report.copies.push({ ...base, action: 'failed', variant: variant.module, reason: err.message });
273
+ report.errors.push(err.message);
274
+ continue;
275
+ }
276
+ const r = await applyToInstalledCopy(copy, patches);
277
+ report.copies.push({ ...base, ...r, variant: variant.module });
278
+ if (r.action === 'failed')
279
+ report.errors.push(`graft "${graft.id}": ${pkg}@${copy.version} at ${copy.dir}: ${r.reason}`);
280
+ }
281
+ return report;
282
+ },
283
+ async afterInstall(ctx) {
284
+ if (applierFor(ctx.project).name !== 'graft')
285
+ return; // the package manager applied it
286
+ const report = await this.applyInstalled(ctx);
287
+ if (report.errors.length)
288
+ throw new GraftError(report.errors.join('; '), 'apply/installed');
289
+ },
290
+ async beforeInstall(ctx, version) {
291
+ const variant = ctx.project.selectVariant(ctx.graft, version);
292
+ if (!variant)
293
+ throw new GraftError(`graft "${ctx.graft.id}": no variant covers ${version}`, 'variant/none');
294
+ const r = await applierFor(ctx.project).configure(ctx.project.root, ctx.graft.frontmatter.rootstock.package, version, variant.path, { upstream: ctx.project.upstream });
295
+ return r.install ? { install: r.install } : undefined;
296
+ },
297
+ async validateVariant(ctx, variant) {
298
+ await loadPatch(ctx.graft, variant);
299
+ },
300
+ variantTemplate({ package: pkg }) {
301
+ return `# Replace this file with the patch for ${pkg}.
302
+ # Create it with: pnpm patch ${pkg} (edit the printed directory)
303
+ # then: pnpm patch-commit <dir> --patches-dir <this graft>/variants
304
+ # and move/rename the generated file here.
305
+ `;
306
+ },
307
+ };
308
+ }
309
+ export const patchAdapter = createPatchAdapter();
310
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type UpstreamSource } from '@graftsync/core';
2
+ import { findPnpmWorkspaceRoot } from './pnpm.js';
3
+ export type ApplierName = 'pnpm' | 'npm' | 'bun' | 'yarn' | 'graft' | 'patch-package' | 'vendor';
4
+ export interface ApplierContext {
5
+ /** Pristine upstream contents, for appliers that build the patched package themselves. */
6
+ upstream?: UpstreamSource;
7
+ }
8
+ export interface PatchApplier {
9
+ name: ApplierName;
10
+ /** Problems that would make the package manager apply something other than `variantPath`, or fail silently. */
11
+ problems(root: string, pkg: string, version: string, variantPath: string, ctx?: ApplierContext): Promise<string[]>;
12
+ /**
13
+ * Wire the package manager to apply `variantPath` to `pkg@version` on the next install.
14
+ * `install: 'reinstall'` means a targeted `add pkg@version` would undo the wiring.
15
+ */
16
+ configure(root: string, pkg: string, version: string, variantPath: string, ctx?: ApplierContext): Promise<{
17
+ files: string[];
18
+ install?: 'reinstall';
19
+ }>;
20
+ }
21
+ /** Pick the applier: explicit config wins, then the project's package manager. */
22
+ export declare function selectApplier(root: string, configured?: string): PatchApplier;
23
+ /** Nearest directory at or above `from` with a package.json (the install root). */
24
+ export declare function manifestRoot(from: string): string;
25
+ export declare const pnpmApplier: PatchApplier;
26
+ /** npm gained native `patchedDependencies` in v12. Earlier versions ignore the field silently. */
27
+ export declare const NPM_NATIVE_PATCH_MAJOR = 12;
28
+ /**
29
+ * Major version of npm for this project: the `packageManager` field ("npm@12.2.1") when the
30
+ * root declares one, otherwise the `npm` on PATH.
31
+ */
32
+ export declare function npmMajor(root: string): number | undefined;
33
+ /**
34
+ * npm 12+ native patches: root package.json `patchedDependencies[<pkg>]` (name-only key) →
35
+ * variant. npm applies patches during install (also with --ignore-scripts), records their hash
36
+ * in package-lock.json, and fails the install on a patch that does not apply or matches nothing.
37
+ */
38
+ export declare const npmApplier: PatchApplier;
39
+ export declare const bunApplier: PatchApplier;
40
+ /** yarn 2+ `patch:` descriptor applying `relPatch` (posix, relative to the project root) to `pkg@version` from npm. */
41
+ export declare function yarnPatchSpec(pkg: string, version: string, relPatch: string): string;
42
+ /**
43
+ * yarn 2+ native patches through the `patch:` protocol: a name-only root resolution
44
+ * `"<pkg>": "patch:<pkg>@npm%3A<version>#./<variant>"` makes every copy of `pkg` resolve to
45
+ * `pkg@version` with the variant applied, under Plug'n'Play and `nodeLinker: node-modules`
46
+ * alike. yarn applies the patch at fetch time (no install scripts), stores the patched
47
+ * package with its own checksum in yarn.lock, and fails the install on a hunk that does not
48
+ * apply. Like `vendor`, the resolution pins the version, so a bare reinstall follows.
49
+ */
50
+ export declare const yarnApplier: PatchApplier;
51
+ export declare const PATCH_PACKAGE_DIR = ".grafts/.patch-package";
52
+ /** patch-package's file name for pkg@version (`@scope/name` → `@scope+name`). */
53
+ export declare const patchPackageFileName: (pkg: string, version: string) => string;
54
+ /** Convert a package-relative variant into patch-package's format (paths under node_modules/<pkg>/). */
55
+ export declare function toPatchPackageFormat(variant: string, pkg: string): string;
56
+ export declare const patchPackageApplier: PatchApplier;
57
+ export declare const GRAFT_POSTINSTALL = "graft apply --installed";
58
+ export declare const graftApplier: PatchApplier;
59
+ export declare const vendorApplier: PatchApplier;
60
+ export { findPnpmWorkspaceRoot };
61
+ //# sourceMappingURL=appliers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliers.d.ts","sourceRoot":"","sources":["../src/appliers.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAsB,qBAAqB,EAAsB,MAAM,WAAW,CAAC;AAG1F,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEjG,MAAM,WAAW,cAAc;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,+GAA+G;IAC/G,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnH;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;CACvJ;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAQ7E;AAKD,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUjD;AAeD,eAAO,MAAM,WAAW,EAAE,YAOzB,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAIzC;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBzD;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,YAgCxB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,YA2BxB,CAAC;AAYF,uHAAuH;AACvH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpF;AAgBD;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAE,YAwCzB,CAAC;AAEF,eAAO,MAAM,iBAAiB,2BAA2B,CAAC;AAG1D,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,QAAS,MAAM,WAAW,MAAM,WAAgD,CAAC;AAElH,wGAAwG;AACxG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAazE;AAED,eAAO,MAAM,mBAAmB,EAAE,YAuDjC,CAAC;AAEF,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAK3D,eAAO,MAAM,YAAY,EAAE,YA8C1B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,YAO3B,CAAC;AAIF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}