@ronas-it/nx-generators 0.15.0-alpha.0 → 0.15.0-alpha.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.
Files changed (25) hide show
  1. package/README.md +24 -2
  2. package/package.json +1 -1
  3. package/src/shared/dependencies.d.ts +1 -0
  4. package/src/shared/dependencies.js +1 -0
  5. package/src/shared/dependencies.js.map +1 -1
  6. package/src/shared/generators/navigation-utils/{next-app-lib-files/shared/utils/navigation → filtering-search-params-lib-files/shared/utils/filtering-search-params}/src/lib/hooks/use-filtering-search-params.ts.template +28 -7
  7. package/src/shared/generators/navigation-utils/filtering-search-params-lib-files/shared/utils/filtering-search-params/src/lib/index.ts.template +2 -0
  8. package/src/shared/generators/navigation-utils/generator.js +5 -18
  9. package/src/shared/generators/navigation-utils/generator.js.map +1 -1
  10. package/src/shared/generators/navigation-utils/navigation-lib-files/shared/utils/navigation/src/index.ts.template +1 -0
  11. package/src/shared/generators/navigation-utils/utils/index.d.ts +1 -0
  12. package/src/shared/generators/navigation-utils/utils/index.js +5 -0
  13. package/src/shared/generators/navigation-utils/utils/index.js.map +1 -0
  14. package/src/shared/generators/navigation-utils/utils/setup-lib.d.ts +2 -0
  15. package/src/shared/generators/navigation-utils/utils/setup-lib.js +17 -0
  16. package/src/shared/generators/navigation-utils/utils/setup-lib.js.map +1 -0
  17. /package/src/shared/generators/navigation-utils/{common-lib-files/shared/utils/navigation → filtering-search-params-lib-files/shared/utils/filtering-search-params}/src/index.ts.template +0 -0
  18. /package/src/shared/generators/navigation-utils/{next-app-lib-files/shared/utils/navigation → filtering-search-params-lib-files/shared/utils/filtering-search-params}/src/lib/hooks/index.ts.template +0 -0
  19. /package/src/shared/generators/navigation-utils/{next-app-lib-files/shared/utils/navigation → filtering-search-params-lib-files/shared/utils/filtering-search-params}/src/lib/types/filtering-search-params.ts.template +0 -0
  20. /package/src/shared/generators/navigation-utils/{next-app-lib-files/shared/utils/navigation → filtering-search-params-lib-files/shared/utils/filtering-search-params}/src/lib/types/index.ts.template +0 -0
  21. /package/src/shared/generators/navigation-utils/{common-lib-files → navigation-lib-files}/shared/utils/navigation/src/lib/config.ts.template +0 -0
  22. /package/src/shared/generators/navigation-utils/{common-lib-files → navigation-lib-files}/shared/utils/navigation/src/lib/index.ts.template +0 -0
  23. /package/src/shared/generators/navigation-utils/{common-lib-files → navigation-lib-files}/shared/utils/navigation/src/lib/utils/get-link-builder.ts.template +0 -0
  24. /package/src/shared/generators/navigation-utils/{common-lib-files → navigation-lib-files}/shared/utils/navigation/src/lib/utils/get-resource-path.ts.template +0 -0
  25. /package/src/shared/generators/navigation-utils/{common-lib-files → navigation-lib-files}/shared/utils/navigation/src/lib/utils/index.ts.template +0 -0
package/README.md CHANGED
@@ -1,6 +1,28 @@
1
1
  # Nx Generators
2
2
 
3
- Nx generators for Ronas IT projects.
3
+ This package provides a set of [Nx](https://nx.dev/getting-started/intro) generators that help maintain a consistent project structure, enforce best practices, and automate common development tasks. It is designed to streamline and standardize the development workflow for monorepos with React Native and/or Next.js apps.
4
+
5
+ ## Features
6
+
7
+ - **Automated setup**: Quick setup of new projects with pre-configured [best practices](#best-practices)
8
+ - **Cross-platform support**: Generators for both web (Next.js) and mobile (RN Expo) applications
9
+ - **Code quality tools**: Built-in configuration for ESLint, Prettier, and TypeScript pre-commit checks
10
+ - **Library management**: Tools for creating, moving, renaming, and managing libraries with pre-defined boundaries
11
+ - **Component generation**: Automated creation of components, form interaction, and other utility tools
12
+ - **Data access setup**: State management and API interaction setup using [Redux Toolkit](https://redux-toolkit.js.org/) and [RTKQ Entity API](https://github.com/RonasIT/rtkq-entity-api)
13
+ - **Internationalization**: Built-in support for i18n in both Next.js and RN Expo applications
14
+
15
+ See full list of generators [below](#generators-overview).
16
+
17
+ ## Best Practices
18
+
19
+ The generators enforce several best practices according to [Nx concepts](https://nx.dev/concepts/decisions):
20
+
21
+ - Scalable [monorepo organization](https://nx.dev/concepts/decisions/why-monorepos)
22
+ - Consistent [project structure](https://nx.dev/concepts/decisions/folder-structure)
23
+ - Clear [libraries hierarchy](https://nx.dev/concepts/decisions/project-dependency-rules)
24
+ - Proper [module boundaries](https://nx.dev/features/enforce-module-boundaries)
25
+ - Streamlined [dependency management](https://nx.dev/concepts/decisions/dependency-management)
4
26
 
5
27
  ## Usage
6
28
 
@@ -120,7 +142,7 @@ npx nx g next-app my-app web
120
142
 
121
143
  ### 5. `react-lib`
122
144
 
123
- Generates a library according to [Nx notation](https://nx.dev/concepts/more-concepts/applications-and-libraries).
145
+ Generates a library according to [Nx notation](https://nx.dev/concepts/decisions/project-dependency-rules).
124
146
 
125
147
  #### Options
126
148
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ronas-it/nx-generators",
3
- "version": "0.15.0-alpha.0",
3
+ "version": "0.15.0-alpha.1",
4
4
  "description": "Nx generators for Ronas IT projects",
5
5
  "license": "MIT",
6
6
  "author": "Ronas IT",
@@ -19,6 +19,7 @@ export declare const dependencies: {
19
19
  'next-app': {
20
20
  'next-intl': string;
21
21
  'lodash-es': string;
22
+ 'class-transformer': string;
22
23
  };
23
24
  'api-client': {
24
25
  '@ronas-it/axios-api-client': string;
@@ -24,6 +24,7 @@ exports.dependencies = {
24
24
  'next-app': {
25
25
  'next-intl': '^3.26.3',
26
26
  'lodash-es': '^4.17.21',
27
+ 'class-transformer': '^0.5.1',
27
28
  },
28
29
  'api-client': {
29
30
  '@ronas-it/axios-api-client': '^0.1.0',
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../../plugin/src/shared/dependencies.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG;IAC1B,UAAU,EAAE;QACV,uCAAuC,EAAE,QAAQ;QACjD,mBAAmB,EAAE,QAAQ;QAC7B,gBAAgB,EAAE,SAAS;QAC3B,iBAAiB,EAAE,QAAQ;QAC3B,aAAa,EAAE,SAAS;QACxB,gCAAgC,EAAE,SAAS;QAC3C,sBAAsB,EAAE,QAAQ;QAChC,cAAc,EAAE,QAAQ;QACxB,iBAAiB,EAAE,QAAQ;QAC3B,cAAc,EAAE,UAAU;QAC1B,eAAe,EAAE,QAAQ;QACzB,WAAW,EAAE,UAAU;KACxB;IACD,eAAe,EAAE;QACf,sCAAsC;QACtC,yEAAyE;QACzE,8BAA8B,EAAE,QAAQ;KACzC;IACD,UAAU,EAAE;QACV,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,UAAU;KACxB;IACD,YAAY,EAAE;QACZ,4BAA4B,EAAE,QAAQ;KACvC;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,QAAQ;KAChB;IACD,WAAW,EAAE;QACX,kCAAkC,EAAE,SAAS;KAC9C;IACD,KAAK,EAAE;QACL,2BAA2B,EAAE,QAAQ;QACrC,aAAa,EAAE,QAAQ;KACxB;IACD,WAAW,EAAE;QACX,iBAAiB,EAAE,QAAQ;QAC3B,uBAAuB,EAAE,QAAQ;KAClC;IACD,IAAI,EAAE;QACJ,qBAAqB,EAAE,QAAQ;QAC/B,iBAAiB,EAAE,SAAS;QAC5B,GAAG,EAAE,QAAQ;KACd;IACD,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,sBAAsB,EAAE,QAAQ;SACjC;QACD,IAAI,EAAE;YACJ,gBAAgB,EAAE,SAAS;SAC5B;KACF;CACF,CAAC;AAEW,QAAA,eAAe,GAAG;IAC7B,aAAa,EAAE;QACb,gBAAgB,EAAE,QAAQ;QAC1B,kBAAkB,EAAE,QAAQ;QAC5B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,wBAAwB,EAAE,QAAQ;QAClC,mCAAmC,EAAE,QAAQ;QAC7C,sBAAsB,EAAE,SAAS;QACjC,wBAAwB,EAAE,QAAQ;QAClC,qBAAqB,EAAE,SAAS;QAChC,2BAA2B,EAAE,QAAQ;QACrC,8BAA8B,EAAE,QAAQ;QACxC,KAAK,EAAE,QAAQ;QACf,0BAA0B,EAAE,SAAS;QACrC,kCAAkC,EAAE,SAAS;QAC7C,2BAA2B,EAAE,SAAS;QACtC,WAAW,EAAE,QAAQ;KACtB;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE,UAAU;KAC/B;IACD,eAAe,EAAE;QACf,WAAW,EAAE,QAAQ;KACtB;IACD,UAAU,EAAE;QACV,wDAAwD;QACxD,oBAAoB,EAAE,SAAS;QAC/B,kBAAkB,EAAE,UAAU;KAC/B;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,SAAS;KACpB;IACD,IAAI,EAAE;QACJ,cAAc,EAAE,OAAO;KACxB;CACF,CAAC"}
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../../plugin/src/shared/dependencies.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG;IAC1B,UAAU,EAAE;QACV,uCAAuC,EAAE,QAAQ;QACjD,mBAAmB,EAAE,QAAQ;QAC7B,gBAAgB,EAAE,SAAS;QAC3B,iBAAiB,EAAE,QAAQ;QAC3B,aAAa,EAAE,SAAS;QACxB,gCAAgC,EAAE,SAAS;QAC3C,sBAAsB,EAAE,QAAQ;QAChC,cAAc,EAAE,QAAQ;QACxB,iBAAiB,EAAE,QAAQ;QAC3B,cAAc,EAAE,UAAU;QAC1B,eAAe,EAAE,QAAQ;QACzB,WAAW,EAAE,UAAU;KACxB;IACD,eAAe,EAAE;QACf,sCAAsC;QACtC,yEAAyE;QACzE,8BAA8B,EAAE,QAAQ;KACzC;IACD,UAAU,EAAE;QACV,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,UAAU;QACvB,mBAAmB,EAAE,QAAQ;KAC9B;IACD,YAAY,EAAE;QACZ,4BAA4B,EAAE,QAAQ;KACvC;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,QAAQ;KAChB;IACD,WAAW,EAAE;QACX,kCAAkC,EAAE,SAAS;KAC9C;IACD,KAAK,EAAE;QACL,2BAA2B,EAAE,QAAQ;QACrC,aAAa,EAAE,QAAQ;KACxB;IACD,WAAW,EAAE;QACX,iBAAiB,EAAE,QAAQ;QAC3B,uBAAuB,EAAE,QAAQ;KAClC;IACD,IAAI,EAAE;QACJ,qBAAqB,EAAE,QAAQ;QAC/B,iBAAiB,EAAE,SAAS;QAC5B,GAAG,EAAE,QAAQ;KACd;IACD,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,sBAAsB,EAAE,QAAQ;SACjC;QACD,IAAI,EAAE;YACJ,gBAAgB,EAAE,SAAS;SAC5B;KACF;CACF,CAAC;AAEW,QAAA,eAAe,GAAG;IAC7B,aAAa,EAAE;QACb,gBAAgB,EAAE,QAAQ;QAC1B,kBAAkB,EAAE,QAAQ;QAC5B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,wBAAwB,EAAE,QAAQ;QAClC,mCAAmC,EAAE,QAAQ;QAC7C,sBAAsB,EAAE,SAAS;QACjC,wBAAwB,EAAE,QAAQ;QAClC,qBAAqB,EAAE,SAAS;QAChC,2BAA2B,EAAE,QAAQ;QACrC,8BAA8B,EAAE,QAAQ;QACxC,KAAK,EAAE,QAAQ;QACf,0BAA0B,EAAE,SAAS;QACrC,kCAAkC,EAAE,SAAS;QAC7C,2BAA2B,EAAE,SAAS;QACtC,WAAW,EAAE,QAAQ;KACtB;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE,UAAU;KAC/B;IACD,eAAe,EAAE;QACf,WAAW,EAAE,QAAQ;KACtB;IACD,UAAU,EAAE;QACV,wDAAwD;QACxD,oBAAoB,EAAE,SAAS;QAC/B,kBAAkB,EAAE,UAAU;KAC/B;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,SAAS;KACpB;IACD,IAAI,EAAE;QACJ,cAAc,EAAE,OAAO;KACxB;CACF,CAAC"}
@@ -8,7 +8,7 @@ interface FilteringSearchParamsConfig<TParams> {
8
8
  }
9
9
 
10
10
  export const useFilteringSearchParams = <TParams extends FilteringSearchParams>({
11
- searchParamsConstructor
11
+ searchParamsConstructor,
12
12
  }: FilteringSearchParamsConfig<TParams>): typeof result => {
13
13
  const initialParams = useRef<TParams | null>(null);
14
14
  const searchParams = useSearchParams();
@@ -18,16 +18,30 @@ export const useFilteringSearchParams = <TParams extends FilteringSearchParams>(
18
18
  const getSearchParams = useCallback((): TParams => {
19
19
  const initialParams = {} as Record<string, any>;
20
20
  searchParams.forEach((value, key) => {
21
+ let parsedValue: any;
22
+
21
23
  try {
22
- initialParams[key] = JSON.parse(value);
24
+ parsedValue = JSON.parse(value);
23
25
  } catch {
24
- initialParams[key] = value;
26
+ parsedValue = value;
27
+ }
28
+
29
+ if (key in initialParams) {
30
+ if (Array.isArray(initialParams[key])) {
31
+ if (!initialParams[key].includes(parsedValue)) {
32
+ initialParams[key].push(parsedValue);
33
+ }
34
+ } else {
35
+ initialParams[key] = [...new Set([initialParams[key], parsedValue])];
36
+ }
37
+ } else {
38
+ initialParams[key] = parsedValue;
25
39
  }
26
40
  });
27
41
 
28
42
  return plainToInstance(searchParamsConstructor, initialParams, {
29
43
  excludeExtraneousValues: true,
30
- exposeUnsetFields: false
44
+ exposeUnsetFields: false,
31
45
  });
32
46
  }, [searchParams]);
33
47
 
@@ -39,8 +53,15 @@ export const useFilteringSearchParams = <TParams extends FilteringSearchParams>(
39
53
  Object.keys(plainParams).forEach((field) => {
40
54
  const value = plainParams[field];
41
55
 
42
- if (value !== null && value !== undefined && !(Array.isArray(value) && value.length === 0)) {
43
- newSearchParams.set(field, JSON.stringify(value));
56
+ if (value !== null && value !== undefined) {
57
+ if (Array.isArray(value)) {
58
+ const uniqueValues = new Set(value);
59
+ uniqueValues.forEach((item) => {
60
+ newSearchParams.append(field, JSON.stringify(item));
61
+ });
62
+ } else {
63
+ newSearchParams.set(field, JSON.stringify(value));
64
+ }
44
65
  }
45
66
  });
46
67
 
@@ -54,7 +75,7 @@ export const useFilteringSearchParams = <TParams extends FilteringSearchParams>(
54
75
 
55
76
  const result = {
56
77
  initialSearchParams: initialParams.current,
57
- setSearchParams
78
+ setSearchParams,
58
79
  };
59
80
 
60
81
  return result;
@@ -2,27 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runNavigationUtilsGenerator = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const child_process_1 = require("child_process");
6
- const path = require("path");
7
- const devkit_1 = require("@nx/devkit");
8
5
  const enums_1 = require("../../enums");
9
- const utils_1 = require("../../utils");
6
+ const utils_1 = require("./utils");
10
7
  function runNavigationUtilsGenerator(tree, options) {
11
8
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
12
- const libRoot = `libs/${options.appDirectory}`;
13
- // Generate shared libs
14
- (0, child_process_1.execSync)(`npx nx g react-lib --app=${options.appDirectory} --scope=shared --type=utils --name=navigation`, {
15
- stdio: 'inherit',
16
- });
17
- // Remove unnecessary files and files that will be replaced
18
- const libPath = `${libRoot}/shared/utils/navigation/src`;
19
- tree.delete(`${libPath}/index.ts`);
20
- // Add lib files
21
- (0, devkit_1.generateFiles)(tree, path.join(__dirname, '/common-lib-files'), libRoot, {});
22
- if (options.baseGeneratorType === enums_1.BaseGeneratorType.NEXT_APP) {
23
- (0, devkit_1.generateFiles)(tree, path.join(__dirname, '/next-app-lib-files'), libRoot, {});
24
- const newIndexContent = `export * from './hooks';\nexport * from './types';`;
25
- (0, utils_1.appendFileContent)(`${libPath}/lib/index.ts`, newIndexContent, tree);
9
+ const { appDirectory, baseGeneratorType } = options;
10
+ (0, utils_1.setupLib)(tree, appDirectory, 'navigation');
11
+ if (baseGeneratorType === enums_1.BaseGeneratorType.NEXT_APP) {
12
+ (0, utils_1.setupLib)(tree, appDirectory, 'filtering-search-params');
26
13
  }
27
14
  });
28
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../plugin/src/shared/generators/navigation-utils/generator.ts"],"names":[],"mappings":";;;;AAAA,iDAAyC;AACzC,6BAA6B;AAC7B,uCAAiD;AACjD,uCAAgD;AAChD,uCAAgD;AAGhD,SAAsB,2BAA2B,CAAC,IAAU,EAAE,OAAuC;;QACnG,MAAM,OAAO,GAAG,QAAQ,OAAO,CAAC,YAAY,EAAE,CAAC;QAE/C,uBAAuB;QACvB,IAAA,wBAAQ,EAAC,4BAA4B,OAAO,CAAC,YAAY,gDAAgD,EAAE;YACzG,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,2DAA2D;QAC3D,MAAM,OAAO,GAAG,GAAG,OAAO,8BAA8B,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,WAAW,CAAC,CAAC;QAEnC,gBAAgB;QAChB,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAE5E,IAAI,OAAO,CAAC,iBAAiB,KAAK,yBAAiB,CAAC,QAAQ,EAAE,CAAC;YAC7D,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAE9E,MAAM,eAAe,GAAG,oDAAoD,CAAC;YAC7E,IAAA,yBAAiB,EAAC,GAAG,OAAO,eAAe,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CAAA;AArBD,kEAqBC;AAED,kBAAe,2BAA2B,CAAC"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../plugin/src/shared/generators/navigation-utils/generator.ts"],"names":[],"mappings":";;;;AACA,uCAAgD;AAEhD,mCAAmC;AAEnC,SAAsB,2BAA2B,CAAC,IAAU,EAAE,OAAuC;;QACnG,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;QAEpD,IAAA,gBAAQ,EAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAE3C,IAAI,iBAAiB,KAAK,yBAAiB,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAA,gBAAQ,EAAC,IAAI,EAAE,YAAY,EAAE,yBAAyB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CAAA;AARD,kEAQC;AAED,kBAAe,2BAA2B,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './setup-lib';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./setup-lib"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../plugin/src/shared/generators/navigation-utils/utils/index.ts"],"names":[],"mappings":";;;AAAA,sDAA4B"}
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export declare function setupLib(tree: Tree, appDirectory: string, libName: string): void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupLib = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const path = require("path");
6
+ const devkit_1 = require("@nx/devkit");
7
+ function setupLib(tree, appDirectory, libName) {
8
+ (0, child_process_1.execSync)(`npx nx g react-lib --app=${appDirectory} --scope=shared --type=utils --name=${libName}`, {
9
+ stdio: 'inherit',
10
+ });
11
+ const libRoot = `libs/${appDirectory}`;
12
+ const libPath = `${libRoot}/shared/utils/${libName}/src`;
13
+ tree.delete(`${libPath}/index.ts`);
14
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, `../${libName}-lib-files`), libRoot, {});
15
+ }
16
+ exports.setupLib = setupLib;
17
+ //# sourceMappingURL=setup-lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-lib.js","sourceRoot":"","sources":["../../../../../../../plugin/src/shared/generators/navigation-utils/utils/setup-lib.ts"],"names":[],"mappings":";;;AAAA,iDAAyC;AACzC,6BAA6B;AAC7B,uCAAiD;AAEjD,SAAgB,QAAQ,CAAC,IAAU,EAAE,YAAoB,EAAE,OAAe;IACxE,IAAA,wBAAQ,EAAC,4BAA4B,YAAY,uCAAuC,OAAO,EAAE,EAAE;QACjG,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,YAAY,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,OAAO,iBAAiB,OAAO,MAAM,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,WAAW,CAAC,CAAC;IAEnC,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AACpF,CAAC;AAVD,4BAUC"}