@gaia-harness/lint 0.0.0-stage → 3.0.4

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +514 -2
  3. package/dist/configs/base.d.ts +3 -0
  4. package/dist/configs/base.d.ts.map +1 -0
  5. package/dist/configs/better-tailwind.d.ts +17 -0
  6. package/dist/configs/better-tailwind.d.ts.map +1 -0
  7. package/dist/configs/guardrails.d.ts +3 -0
  8. package/dist/configs/guardrails.d.ts.map +1 -0
  9. package/dist/configs/i18n.d.ts +17 -0
  10. package/dist/configs/i18n.d.ts.map +1 -0
  11. package/dist/configs/ignores.d.ts +25 -0
  12. package/dist/configs/ignores.d.ts.map +1 -0
  13. package/dist/configs/playwright.d.ts +10 -0
  14. package/dist/configs/playwright.d.ts.map +1 -0
  15. package/dist/configs/prettier.d.ts +11 -0
  16. package/dist/configs/prettier.d.ts.map +1 -0
  17. package/dist/configs/react-router.d.ts +37 -0
  18. package/dist/configs/react-router.d.ts.map +1 -0
  19. package/dist/configs/react.d.ts +23 -0
  20. package/dist/configs/react.d.ts.map +1 -0
  21. package/dist/configs/restricted-imports.d.ts +29 -0
  22. package/dist/configs/restricted-imports.d.ts.map +1 -0
  23. package/dist/configs/shadcn.d.ts +59 -0
  24. package/dist/configs/shadcn.d.ts.map +1 -0
  25. package/dist/configs/storybook.d.ts +9 -0
  26. package/dist/configs/storybook.d.ts.map +1 -0
  27. package/dist/configs/style-hygiene.d.ts +3 -0
  28. package/dist/configs/style-hygiene.d.ts.map +1 -0
  29. package/dist/configs/testing.d.ts +10 -0
  30. package/dist/configs/testing.d.ts.map +1 -0
  31. package/dist/configs/zod.d.ts +16 -0
  32. package/dist/configs/zod.d.ts.map +1 -0
  33. package/dist/index.d.ts +62 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +1938 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/plugins/cn-conditional.d.ts +4 -0
  38. package/dist/plugins/cn-conditional.d.ts.map +1 -0
  39. package/dist/plugins/no-enum.d.ts +4 -0
  40. package/dist/plugins/no-enum.d.ts.map +1 -0
  41. package/dist/plugins/no-imperative-query-fetch.d.ts +4 -0
  42. package/dist/plugins/no-imperative-query-fetch.d.ts.map +1 -0
  43. package/dist/plugins/no-jsx-iife.d.ts +4 -0
  44. package/dist/plugins/no-jsx-iife.d.ts.map +1 -0
  45. package/dist/plugins/no-null-render.d.ts +4 -0
  46. package/dist/plugins/no-null-render.d.ts.map +1 -0
  47. package/dist/plugins/no-switch.d.ts +4 -0
  48. package/dist/plugins/no-switch.d.ts.map +1 -0
  49. package/dist/plugins/no-zod-enum.d.ts +4 -0
  50. package/dist/plugins/no-zod-enum.d.ts.map +1 -0
  51. package/dist/prettier.d.ts +4 -0
  52. package/dist/prettier.d.ts.map +1 -0
  53. package/dist/prettier.js +15 -0
  54. package/dist/prettier.js.map +1 -0
  55. package/dist/stylelint.d.ts +4 -0
  56. package/dist/stylelint.d.ts.map +1 -0
  57. package/dist/stylelint.js +36 -0
  58. package/dist/stylelint.js.map +1 -0
  59. package/package.json +116 -3
@@ -0,0 +1,37 @@
1
+ import type { Linter } from 'eslint';
2
+ /**
3
+ * React Router flat-config block. Optional, and required only for projects
4
+ * running React Router in framework mode.
5
+ *
6
+ * Its route block is SUBTRACTIVE: it relaxes a rule the rest of the bundle
7
+ * turns on, rather than adding rules the way `storybook` and `playwright` do. That
8
+ * is why it ships separately instead of living inside `react`. Its glob,
9
+ * `**\/routes/**\/*.tsx`, is not unique to React Router (TanStack Router uses
10
+ * a `routes/` directory too), so folding it into `react` would silently
11
+ * weaken lint for every file-based router that isn't React Router.
12
+ *
13
+ * Spread it after `react`:
14
+ *
15
+ * ...lint.react,
16
+ * ...lint.reactRouter,
17
+ *
18
+ * `no-empty-pattern` is off because a React Router route module destructures
19
+ * nothing from its typed props (`({}: Route.ComponentProps)`), which the rule
20
+ * reads as an empty pattern. TanStack Router names its component
21
+ * (`createFileRoute(...)({component: Named})`) and never produces that shape,
22
+ * so a TanStack project wants the rule left on.
23
+ *
24
+ * It also carries one ADDITIVE rule, `no-imperative-query-fetch`, on every
25
+ * TypeScript file under the source dir. It bans `ensureQueryData`,
26
+ * `fetchQuery`, `prefetchQuery` and their infinite variants, so a route has
27
+ * one fetch idiom: `queryClient.query` awaited in a clientLoader, read with
28
+ * `useSuspenseQuery`. That idiom is React Router's, which is why the rule
29
+ * lives here. It reports on any member call by name, so it needs no TanStack
30
+ * Query install to fire.
31
+ *
32
+ * Route modules, and `root.tsx` (the root route), may also export React
33
+ * Router's route-module names (`loader`, `action`, `meta`, ...) beside their
34
+ * component without tripping `react-refresh/only-export-components`.
35
+ */
36
+ export declare const buildReactRouter: (sourceDir: string) => Linter.Config[];
37
+ //# sourceMappingURL=react-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-router.d.ts","sourceRoot":"","sources":["../../src/configs/react-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AA0BnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,KAAG,MAAM,CAAC,MAAM,EA2BjE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Linter } from 'eslint';
2
+ /**
3
+ * React flat-config block.
4
+ *
5
+ * Ports `reactConfig` + `reactCustomConfig` from GAIA's `eslint.config.mjs`.
6
+ * Pulls React, React Hooks, and JSX A11y plugins plus Airbnb's recommended
7
+ * React config, then layers GAIA's project-wide React rule overrides.
8
+ *
9
+ * Router-specific relaxations live in the optional `reactRouter` block, not
10
+ * here, so a project on a different file-based router keeps its full rule set.
11
+ */
12
+ /**
13
+ * Options for `react-refresh/only-export-components`, shared with the route
14
+ * block in `reactRouter`, which repeats them because flat config replaces a
15
+ * rule's options wholesale. Vite's React plugin keeps state across a hot
16
+ * update for constant and compound-component exports, so both are allowed.
17
+ */
18
+ export declare const ONLY_EXPORT_COMPONENTS_OPTIONS: {
19
+ readonly allowCompoundComponents: true;
20
+ readonly allowConstantExport: true;
21
+ };
22
+ export declare const react: Linter.Config[];
23
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/configs/react.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAS,MAAM,EAAC,MAAM,QAAQ,CAAC;AAE3C;;;;;;;;;GASG;AACH;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B;;;CAGjC,CAAC;AAEX,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EA+GhC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shared `no-restricted-imports` path bans.
3
+ *
4
+ * Referenced by BOTH the global base config and the testing config. ESLint
5
+ * flat config replaces a rule's options WHOLESALE across config objects (it
6
+ * does not merge them), so a later block that re-declares
7
+ * `no-restricted-imports` — testing.ts scopes one to test/story files — would
8
+ * otherwise DROP these bans on the files it matches. Both call sites spread
9
+ * this same const so the ban holds everywhere and stays DRY.
10
+ *
11
+ * Uses `paths` (exact specifier match), not `patterns` (glob match): only the
12
+ * bare `@conform-to/zod` specifier is banned, while the distinct
13
+ * `@conform-to/zod/v4` specifier stays allowed. A `patterns` entry keyed on
14
+ * `@conform-to/zod` would wrongly also catch the `/v4` subpath.
15
+ *
16
+ * The `react` entry bans only the `FC` and `FunctionComponent` names
17
+ * (`importNames`); every other `react` import stays allowed. The core rule
18
+ * reports type-only specifiers, so `import type {FC}` is caught too.
19
+ */
20
+ export declare const RESTRICTED_IMPORT_PATHS: ({
21
+ importNames: string[];
22
+ message: string;
23
+ name: string;
24
+ } | {
25
+ message: string;
26
+ name: string;
27
+ importNames?: undefined;
28
+ })[];
29
+ //# sourceMappingURL=restricted-imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restricted-imports.d.ts","sourceRoot":"","sources":["../../src/configs/restricted-imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;IAYnC,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { Linter } from 'eslint';
2
+ export type GaiaLintShadcnOptions = {
3
+ /**
4
+ * Fallback: globs where `shadcn/no-restyle` is off outside the vendored ui
5
+ * folder (GAIA-owned components that restyle on purpose). The fallback block
6
+ * always ignores `${sourceDir}/components/ui/**`, so it can never reach the
7
+ * GAIA-authored `ui/tests/**` files.
8
+ *
9
+ * @default []
10
+ */
11
+ restyleOffFiles?: string[];
12
+ /**
13
+ * Import alias of the vendored ui folder. Written to the root-level
14
+ * `settings.shadcn.ui`, never to a rule option, so a later Oxlint config
15
+ * reads it unchanged.
16
+ *
17
+ * @default '~/components/ui'
18
+ */
19
+ ui?: string;
20
+ /**
21
+ * Globs of the vendored files (shadcn registry output kept byte-identical
22
+ * to `shadcn add`). Never matches `ui/tests/**`.
23
+ *
24
+ * @default [`${sourceDir}/components/ui/*.tsx`, ...the registry helpers
25
+ * shadcn writes outside the ui folder (`VENDORED_HELPER_FILES`)]
26
+ */
27
+ uiFiles?: string[];
28
+ };
29
+ /**
30
+ * `@shadcn/lint` flat-config factory (opt-in).
31
+ *
32
+ * Makes role tokens the only color vocabulary for GAIA components and exempts
33
+ * the vendored shadcn ui files from house style. Returns these blocks:
34
+ *
35
+ * - `shadcn/settings`: no `files`; registers the plugin and sets
36
+ * `settings.shadcn.ui` at root level.
37
+ * - `shadcn/rules`: source files; `no-raw-colors`, `require-static-classes`,
38
+ * `no-inline-styles` error, `no-restyle` error with `{allow: ['layout']}`,
39
+ * `no-arbitrary-values` and `no-unknown-classes` off (better-tailwindcss's
40
+ * `no-unknown-classes` stays the only unknown-class rule), and
41
+ * `better-tailwindcss/no-restricted-classes` banning arbitrary colors.
42
+ * - `shadcn/vendored-ui`: `uiFiles` only; `prettier/prettier` and the house
43
+ * style rules (plus the maintainer-sanctioned correctness-class rules the
44
+ * shadcn source trips) off. `shadcn/no-raw-colors`,
45
+ * `react-hooks/rules-of-hooks`, `react-hooks/exhaustive-deps` and every
46
+ * other correctness rule stay on.
47
+ * - `shadcn/restyle-fallback`: only when `restyleOffFiles` is non-empty.
48
+ *
49
+ * ORDERING: the vendored-ui block names rules from plugins the other GAIA
50
+ * blocks register (prettier, prefer-arrow-functions, perfectionist, unicorn,
51
+ * better-tailwindcss, ...), so spread the full GAIA composition before it, and
52
+ * spread `shadcn()` LAST, after `...lint.prettier`, so its `prettier/prettier:
53
+ * off` wins on vendored files.
54
+ *
55
+ * @example
56
+ * ...lint.shadcn({ui: '~/components/ui'})
57
+ */
58
+ export declare const buildShadcn: (sourceDir: string, opts?: GaiaLintShadcnOptions) => Linter.Config[];
59
+ //# sourceMappingURL=shadcn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadcn.d.ts","sourceRoot":"","sources":["../../src/configs/shadcn.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAS,MAAM,EAAC,MAAM,QAAQ,CAAC;AAG3C,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;OAMG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAoLF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,MAAM,EACjB,OAAO,qBAAqB,KAC3B,MAAM,CAAC,MAAM,EA4Df,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Linter } from 'eslint';
2
+ /**
3
+ * Storybook flat-config block.
4
+ *
5
+ * Ports `storybookConfig` from GAIA's `eslint.config.mjs` — applies the
6
+ * official `flat/recommended` config from `eslint-plugin-storybook`.
7
+ */
8
+ export declare const storybook: Linter.Config[];
9
+ //# sourceMappingURL=storybook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storybook.d.ts","sourceRoot":"","sources":["../../src/configs/storybook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAEpC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Linter } from 'eslint';
2
+ export declare const buildStyleHygiene: (sourceDir: string) => Linter.Config[];
3
+ //# sourceMappingURL=style-hygiene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-hygiene.d.ts","sourceRoot":"","sources":["../../src/configs/style-hygiene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAmTnC,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,KAAG,MAAM,CAAC,MAAM,EAMlE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Linter } from 'eslint';
2
+ /**
3
+ * Testing flat-config block.
4
+ *
5
+ * Ports `testHarnessConfig` + `testingLibraryConfig` from GAIA's
6
+ * `eslint.config.mjs`. Wires up Vitest and jest-dom recommended rules
7
+ * across test/story/test-harness files.
8
+ */
9
+ export declare const testing: Linter.Config[];
10
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/configs/testing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAEnC;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAmIlC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Linter } from 'eslint';
2
+ /**
3
+ * Zod flat-config block (opt-in), for Zod 4 projects.
4
+ *
5
+ * `eslint-plugin-zod`'s recommended set: conflicting or duplicate checks,
6
+ * `.optional()` with `.default()`, a `throw` inside `.refine()`, a refine
7
+ * without an error message (users see a generic "Invalid input"),
8
+ * `z.nativeEnum`, `z.any()`, and the Zod 3 forms Zod 4 deprecates.
9
+ *
10
+ * `consistent-import` is off: it wants `import * as z from 'zod'` by default,
11
+ * and even in `named` mode it reports a named `ZodError` import. The
12
+ * stylistic set is not included; it pushes toward enums, which `no-zod-enum`
13
+ * in `guardrails` bans.
14
+ */
15
+ export declare const zod: Linter.Config[];
16
+ //# sourceMappingURL=zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/configs/zod.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAS,MAAM,EAAC,MAAM,QAAQ,CAAC;AAE3C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,GAAG,EAAE,MAAM,CAAC,MAAM,EAU9B,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { Linter } from 'eslint';
2
+ import { type GaiaLintBetterTailwindOptions } from './configs/better-tailwind.js';
3
+ import { type GaiaLintIgnoresOptions } from './configs/ignores.js';
4
+ import { type GaiaLintShadcnOptions } from './configs/shadcn.js';
5
+ export type { GaiaLintBetterTailwindOptions, GaiaLintIgnoresOptions, GaiaLintShadcnOptions, };
6
+ export type GaiaLintOptions = {
7
+ /**
8
+ * Application source directory (relative to project root). Used to scope
9
+ * file-path-based rules — filename conventions, hook-folder scoping,
10
+ * `no-relative-import-paths` root, etc.
11
+ *
12
+ * @default 'app'
13
+ */
14
+ sourceDir?: string;
15
+ };
16
+ /**
17
+ * Dual-shape `ignores` accessor. Spread it directly for the default
18
+ * configuration (`...lint.ignores`) or call it to override
19
+ * (`...lint.ignores({extra: ['coverage/**']})`).
20
+ */
21
+ export type GaiaLintIgnores = ((opts?: GaiaLintIgnoresOptions) => Linter.Config[]) & Iterable<Linter.Config>;
22
+ export type GaiaLintBundle = {
23
+ base: Linter.Config[];
24
+ betterTailwind: (opts: GaiaLintBetterTailwindOptions) => Linter.Config[];
25
+ guardrails: Linter.Config[];
26
+ /**
27
+ * Opt-in `i18next/no-literal-string` (JSX text only) for projects that
28
+ * translate their UI. Drop it when the project drops i18n.
29
+ */
30
+ i18n: Linter.Config[];
31
+ ignores: GaiaLintIgnores;
32
+ playwright: Linter.Config[];
33
+ prettier: Linter.Config[];
34
+ react: Linter.Config[];
35
+ reactRouter: Linter.Config[];
36
+ /**
37
+ * Opt-in `@shadcn/lint` token rules plus the vendored-ui exemption. Assumes
38
+ * the full GAIA composition is spread before it and must be the LAST entry,
39
+ * after `...lint.prettier`.
40
+ */
41
+ shadcn: (opts?: GaiaLintShadcnOptions) => Linter.Config[];
42
+ storybook: Linter.Config[];
43
+ styleHygiene: Linter.Config[];
44
+ testing: Linter.Config[];
45
+ /** Opt-in `eslint-plugin-zod` recommended rules, for Zod 4 projects. */
46
+ zod: Linter.Config[];
47
+ };
48
+ /**
49
+ * GAIA lint configuration factory.
50
+ *
51
+ * Call once at the top of your `eslint.config.mjs` to bind a `sourceDir`,
52
+ * then spread the returned configs into `defineConfig`. Defaults to GAIA's
53
+ * `'app'` layout; pass `{sourceDir: 'src'}` (or any other value) for
54
+ * projects that store source elsewhere.
55
+ *
56
+ * @example
57
+ * const lint = gaiaLint(); // GAIA / app/
58
+ * const lint = gaiaLint({sourceDir: 'src'}); // src/
59
+ */
60
+ declare const gaiaLint: (opts?: GaiaLintOptions) => GaiaLintBundle;
61
+ export default gaiaLint;
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAU,KAAK,sBAAsB,EAAC,MAAM,sBAAsB,CAAC;AAK1E,OAAO,EAAc,KAAK,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAM5E,YAAY,EACV,6BAA6B,EAC7B,sBAAsB,EACtB,qBAAqB,GACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAC7B,IAAI,CAAC,EAAE,sBAAsB,KAC1B,MAAM,CAAC,MAAM,EAAE,CAAC,GACnB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE1B,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,CAAC,IAAI,EAAE,6BAA6B,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;IACzE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC7B;;;;OAIG;IACH,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,qBAAqB,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACzB,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CACtB,CAAC;AAWF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,QAAQ,GAAI,OAAO,eAAe,KAAG,cAkB1C,CAAC;AAEF,eAAe,QAAQ,CAAC"}