@cyanheads/imf-mcp-server 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.
Files changed (65) hide show
  1. package/AGENTS.md +377 -0
  2. package/CLAUDE.md +377 -0
  3. package/Dockerfile +105 -0
  4. package/LICENSE +201 -0
  5. package/README.md +290 -0
  6. package/changelog/0.1.x/0.1.1.md +33 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/config/server-config.d.ts +13 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +26 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +28 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/prompts/definitions/index.d.ts +7 -0
  17. package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
  18. package/dist/mcp-server/prompts/definitions/index.js +7 -0
  19. package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/imf-database.resource.d.ts +9 -0
  21. package/dist/mcp-server/resources/definitions/imf-database.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/imf-database.resource.js +61 -0
  23. package/dist/mcp-server/resources/definitions/imf-database.resource.js.map +1 -0
  24. package/dist/mcp-server/resources/definitions/index.d.ts +9 -0
  25. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  26. package/dist/mcp-server/resources/definitions/index.js +8 -0
  27. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.d.ts +26 -0
  29. package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.js +96 -0
  31. package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.d.ts +24 -0
  33. package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.js +96 -0
  35. package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/imf-get-database.tool.d.ts +39 -0
  37. package/dist/mcp-server/tools/definitions/imf-get-database.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/imf-get-database.tool.js +155 -0
  39. package/dist/mcp-server/tools/definitions/imf-get-database.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/imf-list-databases.tool.d.ts +19 -0
  41. package/dist/mcp-server/tools/definitions/imf-list-databases.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/imf-list-databases.tool.js +88 -0
  43. package/dist/mcp-server/tools/definitions/imf-list-databases.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.d.ts +57 -0
  45. package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.js +277 -0
  47. package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/index.d.ts +136 -0
  49. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/index.js +22 -0
  51. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  52. package/dist/services/canvas/canvas-accessor.d.ts +11 -0
  53. package/dist/services/canvas/canvas-accessor.d.ts.map +1 -0
  54. package/dist/services/canvas/canvas-accessor.js +13 -0
  55. package/dist/services/canvas/canvas-accessor.js.map +1 -0
  56. package/dist/services/imf-sdmx/imf-sdmx-service.d.ts +38 -0
  57. package/dist/services/imf-sdmx/imf-sdmx-service.d.ts.map +1 -0
  58. package/dist/services/imf-sdmx/imf-sdmx-service.js +415 -0
  59. package/dist/services/imf-sdmx/imf-sdmx-service.js.map +1 -0
  60. package/dist/services/imf-sdmx/types.d.ts +157 -0
  61. package/dist/services/imf-sdmx/types.d.ts.map +1 -0
  62. package/dist/services/imf-sdmx/types.js +6 -0
  63. package/dist/services/imf-sdmx/types.js.map +1 -0
  64. package/package.json +106 -0
  65. package/server.json +99 -0
@@ -0,0 +1,136 @@
1
+ /**
2
+ * @fileoverview Barrel export for all IMF MCP tool definitions.
3
+ * @module mcp-server/tools/definitions/index
4
+ */
5
+ export { imfDataframeDescribe } from './imf-dataframe-describe.tool.js';
6
+ export { imfDataframeQuery } from './imf-dataframe-query.tool.js';
7
+ export { imfGetDatabase } from './imf-get-database.tool.js';
8
+ export { imfListDatabases } from './imf-list-databases.tool.js';
9
+ export { imfQueryDataset } from './imf-query-dataset.tool.js';
10
+ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
11
+ canvas_id: import("zod").ZodString;
12
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
13
+ canvas_id: import("zod").ZodString;
14
+ tables: import("zod").ZodArray<import("zod").ZodObject<{
15
+ name: import("zod").ZodString;
16
+ row_count: import("zod").ZodNumber;
17
+ columns: import("zod").ZodArray<import("zod").ZodObject<{
18
+ name: import("zod").ZodString;
19
+ type: import("zod").ZodString;
20
+ }, import("zod/v4/core").$strip>>;
21
+ }, import("zod/v4/core").$strip>>;
22
+ table_count: import("zod").ZodNumber;
23
+ }, import("zod/v4/core").$strip>, readonly [{
24
+ readonly reason: "canvas_not_found";
25
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
26
+ readonly when: "canvas_id does not match any registered DataCanvas table (expired, wrong session, or canvas disabled)";
27
+ readonly recovery: "Re-run imf_query_dataset to obtain a fresh canvas_id; ensure CANVAS_PROVIDER_TYPE=duckdb is set.";
28
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
29
+ canvas_id: import("zod").ZodString;
30
+ sql: import("zod").ZodString;
31
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
32
+ rows: import("zod").ZodArray<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
33
+ row_count: import("zod").ZodNumber;
34
+ }, import("zod/v4/core").$strip>, readonly [{
35
+ readonly reason: "canvas_not_found";
36
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
37
+ readonly when: "canvas_id does not match any registered DataCanvas table (expired, wrong session, or canvas disabled)";
38
+ readonly recovery: "Re-run imf_query_dataset to obtain a fresh canvas_id; ensure CANVAS_PROVIDER_TYPE=duckdb is set.";
39
+ }, {
40
+ readonly reason: "invalid_sql";
41
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
42
+ readonly when: "sql does not start with SELECT — DML and DDL statements are not permitted";
43
+ readonly recovery: "Rewrite the statement as a SELECT query referencing tables from imf_dataframe_describe.";
44
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
45
+ dataflow_id: import("zod").ZodString;
46
+ agency_id: import("zod").ZodOptional<import("zod").ZodString>;
47
+ version: import("zod").ZodOptional<import("zod").ZodString>;
48
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
49
+ dataflow_id: import("zod").ZodString;
50
+ agency_id: import("zod").ZodString;
51
+ version: import("zod").ZodString;
52
+ name: import("zod").ZodString;
53
+ description: import("zod").ZodOptional<import("zod").ZodString>;
54
+ key_format: import("zod").ZodString;
55
+ dimensions: import("zod").ZodArray<import("zod").ZodObject<{
56
+ id: import("zod").ZodString;
57
+ name: import("zod").ZodString;
58
+ position: import("zod").ZodNumber;
59
+ codelist: import("zod").ZodArray<import("zod").ZodObject<{
60
+ id: import("zod").ZodString;
61
+ name: import("zod").ZodString;
62
+ }, import("zod/v4/core").$strip>>;
63
+ codelist_truncated: import("zod").ZodBoolean;
64
+ }, import("zod/v4/core").$strip>>;
65
+ }, import("zod/v4/core").$strip>, readonly [{
66
+ readonly reason: "dataflow_not_found";
67
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
68
+ readonly when: "dataflow_id does not match any known dataflow on api.imf.org";
69
+ readonly recovery: "Call imf_list_databases to browse available dataflow IDs.";
70
+ }, {
71
+ readonly reason: "structure_unavailable";
72
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
73
+ readonly when: "api.imf.org returns non-200 on the DSD endpoint";
74
+ readonly recovery: "Retry after a short wait; the IMF SDMX 3.0 portal is occasionally slow.";
75
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
76
+ filter: import("zod").ZodOptional<import("zod").ZodString>;
77
+ include_vintages: import("zod").ZodDefault<import("zod").ZodBoolean>;
78
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
79
+ dataflows: import("zod").ZodArray<import("zod").ZodObject<{
80
+ id: import("zod").ZodString;
81
+ agency_id: import("zod").ZodString;
82
+ version: import("zod").ZodString;
83
+ name: import("zod").ZodString;
84
+ description: import("zod").ZodOptional<import("zod").ZodString>;
85
+ }, import("zod/v4/core").$strip>>;
86
+ total_count: import("zod").ZodNumber;
87
+ }, import("zod/v4/core").$strip>, undefined, undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
88
+ dataflow_id: import("zod").ZodString;
89
+ agency_id: import("zod").ZodOptional<import("zod").ZodString>;
90
+ version: import("zod").ZodOptional<import("zod").ZodString>;
91
+ key: import("zod").ZodString;
92
+ start_period: import("zod").ZodOptional<import("zod").ZodString>;
93
+ end_period: import("zod").ZodOptional<import("zod").ZodString>;
94
+ canvas_id: import("zod").ZodOptional<import("zod").ZodString>;
95
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
96
+ dataflow_id: import("zod").ZodString;
97
+ key: import("zod").ZodString;
98
+ start_period: import("zod").ZodOptional<import("zod").ZodString>;
99
+ end_period: import("zod").ZodOptional<import("zod").ZodString>;
100
+ observations: import("zod").ZodArray<import("zod").ZodObject<{
101
+ series_key: import("zod").ZodString;
102
+ time_period: import("zod").ZodString;
103
+ value: import("zod").ZodNullable<import("zod").ZodNumber>;
104
+ status: import("zod").ZodNullable<import("zod").ZodString>;
105
+ }, import("zod/v4/core").$strip>>;
106
+ series_attributes: import("zod").ZodObject<{
107
+ unit: import("zod").ZodNullable<import("zod").ZodString>;
108
+ scale: import("zod").ZodNullable<import("zod").ZodString>;
109
+ decimals: import("zod").ZodNullable<import("zod").ZodNumber>;
110
+ }, import("zod/v4/core").$strip>;
111
+ observation_count: import("zod").ZodNumber;
112
+ truncated: import("zod").ZodBoolean;
113
+ canvas_id: import("zod").ZodOptional<import("zod").ZodString>;
114
+ table_name: import("zod").ZodOptional<import("zod").ZodString>;
115
+ }, import("zod/v4/core").$strip>, readonly [{
116
+ readonly reason: "dataflow_not_found";
117
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
118
+ readonly when: "dataflow_id does not match any known dataflow on api.imf.org";
119
+ readonly recovery: "Call imf_list_databases to browse available dataflow IDs.";
120
+ }, {
121
+ readonly reason: "no_data";
122
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
123
+ readonly when: "Key is structurally valid but returns an empty dataset — typically an unknown dimension code or no data for the time range";
124
+ readonly recovery: "Verify dimension codes with imf_get_database; check that start_period/end_period overlap available data.";
125
+ }, {
126
+ readonly reason: "key_dimension_mismatch";
127
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
128
+ readonly when: "Number of dot-separated segments in key does not match the dataflow's DSD dimension count";
129
+ readonly recovery: "Call imf_get_database to get the correct key_format for this dataflow, then reconstruct the key.";
130
+ }, {
131
+ readonly reason: "structure_unavailable";
132
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
133
+ readonly when: "api.imf.org returns non-200 on the data endpoint";
134
+ readonly recovery: "Retry after a short wait.";
135
+ }], undefined>)[];
136
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAQ9D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAM9B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Barrel export for all IMF MCP tool definitions.
3
+ * @module mcp-server/tools/definitions/index
4
+ */
5
+ export { imfDataframeDescribe } from './imf-dataframe-describe.tool.js';
6
+ export { imfDataframeQuery } from './imf-dataframe-query.tool.js';
7
+ export { imfGetDatabase } from './imf-get-database.tool.js';
8
+ export { imfListDatabases } from './imf-list-databases.tool.js';
9
+ export { imfQueryDataset } from './imf-query-dataset.tool.js';
10
+ import { imfDataframeDescribe } from './imf-dataframe-describe.tool.js';
11
+ import { imfDataframeQuery } from './imf-dataframe-query.tool.js';
12
+ import { imfGetDatabase } from './imf-get-database.tool.js';
13
+ import { imfListDatabases } from './imf-list-databases.tool.js';
14
+ import { imfQueryDataset } from './imf-query-dataset.tool.js';
15
+ export const allToolDefinitions = [
16
+ imfListDatabases,
17
+ imfGetDatabase,
18
+ imfQueryDataset,
19
+ imfDataframeDescribe,
20
+ imfDataframeQuery,
21
+ ];
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,oBAAoB;IACpB,iBAAiB;CAClB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview Module-level accessor for the DataCanvas instance.
3
+ * Wired in setup() from the createApp() entry point.
4
+ * @module services/canvas/canvas-accessor
5
+ */
6
+ import type { DataCanvas } from '@cyanheads/mcp-ts-core/canvas';
7
+ /** Store the DataCanvas instance from CoreServices. Call once in setup(). */
8
+ export declare const setCanvas: (c: DataCanvas | undefined) => void;
9
+ /** Returns the DataCanvas instance, or undefined when canvas is disabled. */
10
+ export declare const getCanvas: () => DataCanvas | undefined;
11
+ //# sourceMappingURL=canvas-accessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-accessor.d.ts","sourceRoot":"","sources":["../../../src/services/canvas/canvas-accessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAIhE,6EAA6E;AAC7E,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,GAAG,SAAS,KAAG,IAErD,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,SAAS,QAAO,UAAU,GAAG,SAAoB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview Module-level accessor for the DataCanvas instance.
3
+ * Wired in setup() from the createApp() entry point.
4
+ * @module services/canvas/canvas-accessor
5
+ */
6
+ let _canvas;
7
+ /** Store the DataCanvas instance from CoreServices. Call once in setup(). */
8
+ export const setCanvas = (c) => {
9
+ _canvas = c;
10
+ };
11
+ /** Returns the DataCanvas instance, or undefined when canvas is disabled. */
12
+ export const getCanvas = () => _canvas;
13
+ //# sourceMappingURL=canvas-accessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-accessor.js","sourceRoot":"","sources":["../../../src/services/canvas/canvas-accessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,IAAI,OAA+B,CAAC;AAEpC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAyB,EAAQ,EAAE;IAC3D,OAAO,GAAG,CAAC,CAAC;AACd,CAAC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAG,GAA2B,EAAE,CAAC,OAAO,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @fileoverview IMF SDMX 3.0 REST API service — fetches dataflows, data structures,
3
+ * and observations from api.imf.org. Implements caching via ctx.state and retry.
4
+ * @module services/imf-sdmx/imf-sdmx-service
5
+ */
6
+ import type { Context } from '@cyanheads/mcp-ts-core';
7
+ import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
8
+ import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
9
+ import type { Dataflow, DataflowStructure, DataQueryResult } from './types.js';
10
+ export declare class ImfSdmxService {
11
+ private readonly baseUrl;
12
+ private readonly timeoutMs;
13
+ constructor(_config: AppConfig, _storage: StorageService, baseUrl: string, timeoutMs: number);
14
+ /** Fetch all dataflows, with 1-hour caching. */
15
+ fetchDataflows(ctx: Context): Promise<Dataflow[]>;
16
+ /** Find a dataflow by id, optionally constraining by agencyId/version. */
17
+ findDataflow(dataflowId: string, agencyId: string | undefined, version: string | undefined, ctx: Context): Promise<Dataflow | undefined>;
18
+ /** Fetch DSD with all codelists for a dataflow, with 24-hour caching. */
19
+ fetchDataStructure(agencyId: string, dsdId: string, version: string, ctx: Context): Promise<DataflowStructure | undefined>;
20
+ /**
21
+ * Fetch a dataflow's structure, resolving the DSD reference from the dataflow
22
+ * list if not provided.
23
+ */
24
+ fetchDataflowStructure(dataflowId: string, agencyId: string | undefined, version: string | undefined, ctx: Context): Promise<DataflowStructure>;
25
+ /** Fallback: fetch structure using the dataflow endpoint path directly. */
26
+ private fetchDataflowStructureFallback;
27
+ /** Fetch observations for a dataflow key over a time range. No cache — always live. */
28
+ fetchData(agencyId: string, dataflowId: string, version: string, key: string, startPeriod?: string, endPeriod?: string, ctx?: Context, signal?: AbortSignal): Promise<DataQueryResult>;
29
+ private normalizeDataflows;
30
+ private normalizeDsd;
31
+ private decodeObservations;
32
+ private resolveAttrValue;
33
+ private resolveDecimalsValue;
34
+ private parseJson;
35
+ }
36
+ export declare function initImfSdmxService(config: AppConfig, storage: StorageService, baseUrl: string, timeoutMs: number): void;
37
+ export declare function getImfSdmxService(): ImfSdmxService;
38
+ //# sourceMappingURL=imf-sdmx-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imf-sdmx-service.d.ts","sourceRoot":"","sources":["../../../src/services/imf-sdmx/imf-sdmx-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,KAAK,EAEV,QAAQ,EACR,iBAAiB,EACjB,eAAe,EAMhB,MAAM,YAAY,CAAC;AAKpB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAS5F,gDAAgD;IAC1C,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAuCvD,0EAA0E;IACpE,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAchC,yEAAyE;IACnE,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAwCzC;;;OAGG;IACG,sBAAsB,CAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,iBAAiB,CAAC;IAiD7B,2EAA2E;YAC7D,8BAA8B;IA8C5C,uFAAuF;IACjF,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,eAAe,CAAC;IAyC3B,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,YAAY;IA6GpB,OAAO,CAAC,kBAAkB;IAyF1B,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,SAAS;CAUlB;AAQD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,IAAI,CAEN;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}