@formspec/constraints 0.1.0-alpha.10 → 0.1.0-alpha.11

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.
@@ -1,133 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { loadConfigFromString, defineConstraints } from "../index.js";
3
- describe("loadConfigFromString", () => {
4
- it("parses YAML with constraints section", () => {
5
- const yaml = `
6
- constraints:
7
- fieldTypes:
8
- dynamicEnum: error
9
- dynamicSchema: error
10
- layout:
11
- group: error
12
- conditionals: warn
13
- `;
14
- const config = loadConfigFromString(yaml);
15
- expect(config.fieldTypes.dynamicEnum).toBe("error");
16
- expect(config.fieldTypes.dynamicSchema).toBe("error");
17
- expect(config.layout.group).toBe("error");
18
- expect(config.layout.conditionals).toBe("warn");
19
- });
20
- it("applies defaults for missing values", () => {
21
- const yaml = `
22
- constraints:
23
- fieldTypes:
24
- dynamicEnum: error
25
- `;
26
- const config = loadConfigFromString(yaml);
27
- expect(config.fieldTypes.dynamicEnum).toBe("error");
28
- expect(config.fieldTypes.text).toBe("off");
29
- expect(config.fieldTypes.number).toBe("off");
30
- expect(config.layout.group).toBe("off");
31
- });
32
- it("handles empty YAML", () => {
33
- const config = loadConfigFromString("");
34
- // Should return all defaults
35
- expect(config.fieldTypes.text).toBe("off");
36
- expect(config.layout.group).toBe("off");
37
- });
38
- it("handles YAML with only comments", () => {
39
- const yaml = `
40
- # This is a comment
41
- # Another comment
42
- `;
43
- const config = loadConfigFromString(yaml);
44
- expect(config.fieldTypes.text).toBe("off");
45
- });
46
- it("parses nested uiSchema constraints", () => {
47
- const yaml = `
48
- constraints:
49
- uiSchema:
50
- layouts:
51
- VerticalLayout: off
52
- HorizontalLayout: error
53
- Group: error
54
- rules:
55
- enabled: error
56
- `;
57
- const config = loadConfigFromString(yaml);
58
- expect(config.uiSchema.layouts.VerticalLayout).toBe("off");
59
- expect(config.uiSchema.layouts.HorizontalLayout).toBe("error");
60
- expect(config.uiSchema.layouts.Group).toBe("error");
61
- expect(config.uiSchema.rules.enabled).toBe("error");
62
- });
63
- it("parses fieldOptions constraints", () => {
64
- const yaml = `
65
- constraints:
66
- fieldOptions:
67
- minItems: error
68
- maxItems: error
69
- placeholder: warn
70
- `;
71
- const config = loadConfigFromString(yaml);
72
- expect(config.fieldOptions.minItems).toBe("error");
73
- expect(config.fieldOptions.maxItems).toBe("error");
74
- expect(config.fieldOptions.placeholder).toBe("warn");
75
- expect(config.fieldOptions.label).toBe("off");
76
- });
77
- it("parses maxNestingDepth as number", () => {
78
- const yaml = `
79
- constraints:
80
- layout:
81
- maxNestingDepth: 2
82
- `;
83
- const config = loadConfigFromString(yaml);
84
- expect(config.layout.maxNestingDepth).toBe(2);
85
- });
86
- it("throws on invalid YAML structure", () => {
87
- const yaml = `
88
- - this
89
- - is
90
- - an array
91
- `;
92
- expect(() => loadConfigFromString(yaml)).toThrow();
93
- });
94
- });
95
- describe("defineConstraints", () => {
96
- it("creates config from object literal", () => {
97
- const config = defineConstraints({
98
- fieldTypes: {
99
- dynamicEnum: "error",
100
- array: "warn",
101
- },
102
- layout: {
103
- group: "error",
104
- maxNestingDepth: 1,
105
- },
106
- });
107
- expect(config.fieldTypes.dynamicEnum).toBe("error");
108
- expect(config.fieldTypes.array).toBe("warn");
109
- expect(config.fieldTypes.text).toBe("off"); // default
110
- expect(config.layout.group).toBe("error");
111
- expect(config.layout.maxNestingDepth).toBe(1);
112
- });
113
- it("handles empty config", () => {
114
- const config = defineConstraints({});
115
- // All defaults
116
- expect(config.fieldTypes.text).toBe("off");
117
- expect(config.layout.group).toBe("off");
118
- expect(config.uiSchema.layouts.VerticalLayout).toBe("off");
119
- });
120
- it("handles partial nested config", () => {
121
- const config = defineConstraints({
122
- uiSchema: {
123
- rules: {
124
- enabled: "error",
125
- },
126
- },
127
- });
128
- expect(config.uiSchema.rules.enabled).toBe("error");
129
- expect(config.uiSchema.rules.effects.SHOW).toBe("off"); // default
130
- expect(config.uiSchema.layouts.VerticalLayout).toBe("off"); // default
131
- });
132
- });
133
- //# sourceMappingURL=loader.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../src/__tests__/loader.test.ts"],"names":[],"mappings":"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"}
@@ -1,404 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { field, group, when, is, formspec } from "@formspec/dsl";
3
- import { validateFormSpecElements, validateFormSpec, validateFieldTypes, validateLayout, validateFieldOptions, extractFieldOptions, defineConstraints, isFieldTypeAllowed, getFieldTypeSeverity, isFieldOptionAllowed, getFieldOptionSeverity, isLayoutTypeAllowed, isNestingDepthAllowed, } from "../index.js";
4
- describe("validateFieldTypes", () => {
5
- it("returns no issues when field type is allowed", () => {
6
- const issues = validateFieldTypes({ fieldType: "text", fieldName: "name" }, { text: "off" });
7
- expect(issues).toHaveLength(0);
8
- });
9
- it("returns error when field type is disallowed", () => {
10
- const issues = validateFieldTypes({ fieldType: "dynamic_enum", fieldName: "country" }, { dynamicEnum: "error" });
11
- expect(issues).toHaveLength(1);
12
- expect(issues[0]).toMatchObject({
13
- code: "DISALLOWED_FIELD_TYPE",
14
- severity: "error",
15
- fieldName: "country",
16
- fieldType: "dynamic_enum",
17
- });
18
- });
19
- it("returns warning when field type has warn severity", () => {
20
- const issues = validateFieldTypes({ fieldType: "array", fieldName: "items" }, { array: "warn" });
21
- expect(issues).toHaveLength(1);
22
- expect(issues[0]?.severity).toBe("warning");
23
- });
24
- it("includes path in issue when provided", () => {
25
- const issues = validateFieldTypes({ fieldType: "object", fieldName: "address", path: "user/address" }, { object: "error" });
26
- expect(issues[0]?.path).toBe("user/address");
27
- });
28
- });
29
- describe("validateLayout", () => {
30
- it("returns no issues when group is allowed", () => {
31
- const issues = validateLayout({ layoutType: "group", label: "Contact", depth: 0 }, { group: "off" });
32
- expect(issues).toHaveLength(0);
33
- });
34
- it("returns error when group is disallowed", () => {
35
- const issues = validateLayout({ layoutType: "group", label: "Contact", depth: 0 }, { group: "error" });
36
- expect(issues).toHaveLength(1);
37
- expect(issues[0]).toMatchObject({
38
- code: "DISALLOWED_GROUP",
39
- severity: "error",
40
- });
41
- expect(issues[0]?.message).toContain("Contact");
42
- });
43
- it("returns error when conditional is disallowed", () => {
44
- const issues = validateLayout({ layoutType: "conditional", depth: 0 }, { conditionals: "error" });
45
- expect(issues).toHaveLength(1);
46
- expect(issues[0]).toMatchObject({
47
- code: "DISALLOWED_CONDITIONAL",
48
- severity: "error",
49
- });
50
- });
51
- it("returns error when nesting depth exceeded", () => {
52
- const issues = validateLayout({ layoutType: "group", depth: 3 }, { maxNestingDepth: 2 });
53
- expect(issues).toHaveLength(1);
54
- expect(issues[0]).toMatchObject({
55
- code: "EXCEEDED_NESTING_DEPTH",
56
- severity: "error",
57
- });
58
- });
59
- it("allows nesting at exact max depth", () => {
60
- const issues = validateLayout({ layoutType: "group", depth: 2 }, { maxNestingDepth: 2 });
61
- // Should only have group issue if group is disallowed, not depth issue
62
- const depthIssues = issues.filter((i) => i.code === "EXCEEDED_NESTING_DEPTH");
63
- expect(depthIssues).toHaveLength(0);
64
- });
65
- });
66
- describe("validateFieldOptions", () => {
67
- it("returns no issues when options are allowed", () => {
68
- const issues = validateFieldOptions({ fieldName: "age", presentOptions: ["minValue", "maxValue"] }, { minValue: "off", maxValue: "off" });
69
- expect(issues).toHaveLength(0);
70
- });
71
- it("returns error when option is disallowed", () => {
72
- const issues = validateFieldOptions({ fieldName: "notes", presentOptions: ["placeholder"] }, { placeholder: "error" });
73
- expect(issues).toHaveLength(1);
74
- expect(issues[0]).toMatchObject({
75
- code: "DISALLOWED_FIELD_OPTION",
76
- severity: "error",
77
- fieldName: "notes",
78
- });
79
- });
80
- it("returns multiple issues for multiple disallowed options", () => {
81
- const issues = validateFieldOptions({ fieldName: "items", presentOptions: ["minItems", "maxItems"] }, { minItems: "error", maxItems: "error" });
82
- expect(issues).toHaveLength(2);
83
- });
84
- });
85
- describe("extractFieldOptions", () => {
86
- it("extracts present options from field object", () => {
87
- const options = extractFieldOptions({
88
- name: "age",
89
- label: "Age",
90
- minValue: 0,
91
- maxValue: 120,
92
- });
93
- expect(options).toContain("label");
94
- expect(options).toContain("minValue");
95
- expect(options).toContain("maxValue");
96
- expect(options).not.toContain("placeholder");
97
- });
98
- it("returns empty array for field with no options", () => {
99
- const options = extractFieldOptions({ name: "test" });
100
- expect(options).toHaveLength(0);
101
- });
102
- });
103
- describe("validateFormSpecElements", () => {
104
- it("validates a simple form with no constraints", () => {
105
- const form = formspec(field.text("name", { label: "Name" }), field.number("age", { label: "Age" }));
106
- const result = validateFormSpecElements(form.elements);
107
- expect(result.valid).toBe(true);
108
- expect(result.issues).toHaveLength(0);
109
- });
110
- it("validates field types against constraints", () => {
111
- const form = formspec(field.text("name"), field.dynamicEnum("country", "countries"));
112
- const result = validateFormSpecElements(form.elements, {
113
- constraints: {
114
- fieldTypes: { dynamicEnum: "error" },
115
- },
116
- });
117
- expect(result.valid).toBe(false);
118
- expect(result.issues).toHaveLength(1);
119
- expect(result.issues[0]).toMatchObject({
120
- code: "DISALLOWED_FIELD_TYPE",
121
- fieldType: "dynamic_enum",
122
- });
123
- });
124
- it("validates groups against constraints", () => {
125
- const form = formspec(group("Contact", field.text("name"), field.text("email")));
126
- const result = validateFormSpecElements(form.elements, {
127
- constraints: {
128
- layout: { group: "error" },
129
- },
130
- });
131
- expect(result.valid).toBe(false);
132
- expect(result.issues.some((i) => i.code === "DISALLOWED_GROUP")).toBe(true);
133
- });
134
- it("validates conditionals against constraints", () => {
135
- const form = formspec(field.enum("type", ["personal", "business"]), when(is("type", "business"), field.text("company")));
136
- const result = validateFormSpecElements(form.elements, {
137
- constraints: {
138
- layout: { conditionals: "error" },
139
- },
140
- });
141
- expect(result.valid).toBe(false);
142
- expect(result.issues.some((i) => i.code === "DISALLOWED_CONDITIONAL")).toBe(true);
143
- });
144
- it("validates nested object fields", () => {
145
- const form = formspec(field.object("address", field.text("street"), field.object("country", field.text("code"), field.text("name"))));
146
- const result = validateFormSpecElements(form.elements, {
147
- constraints: {
148
- layout: { maxNestingDepth: 1 },
149
- },
150
- });
151
- expect(result.valid).toBe(false);
152
- expect(result.issues.some((i) => i.code === "EXCEEDED_NESTING_DEPTH")).toBe(true);
153
- });
154
- it("validates field options", () => {
155
- const form = formspec(field.number("quantity", { min: 1, max: 100 }));
156
- const result = validateFormSpecElements(form.elements, {
157
- constraints: {
158
- fieldOptions: { minValue: "error", maxValue: "error" },
159
- },
160
- });
161
- expect(result.valid).toBe(false);
162
- expect(result.issues).toHaveLength(2);
163
- expect(result.issues.every((i) => i.code === "DISALLOWED_FIELD_OPTION")).toBe(true);
164
- });
165
- it("passes with warnings but valid=true", () => {
166
- const form = formspec(field.dynamicEnum("country", "countries"));
167
- const result = validateFormSpecElements(form.elements, {
168
- constraints: {
169
- fieldTypes: { dynamicEnum: "warn" },
170
- },
171
- });
172
- expect(result.valid).toBe(true);
173
- expect(result.issues).toHaveLength(1);
174
- expect(result.issues[0]?.severity).toBe("warning");
175
- });
176
- it("validates array items recursively", () => {
177
- const form = formspec(field.array("items", field.text("description"), field.dynamicEnum("category", "categories")));
178
- const result = validateFormSpecElements(form.elements, {
179
- constraints: {
180
- fieldTypes: { dynamicEnum: "error" },
181
- },
182
- });
183
- expect(result.valid).toBe(false);
184
- expect(result.issues.some((i) => i.fieldType === "dynamic_enum")).toBe(true);
185
- });
186
- });
187
- describe("defineConstraints", () => {
188
- it("merges partial config with defaults", () => {
189
- const config = defineConstraints({
190
- fieldTypes: { dynamicEnum: "error" },
191
- });
192
- expect(config.fieldTypes.dynamicEnum).toBe("error");
193
- expect(config.fieldTypes.text).toBe("off");
194
- expect(config.layout.group).toBe("off");
195
- });
196
- it("preserves all provided values", () => {
197
- const config = defineConstraints({
198
- fieldTypes: {
199
- text: "warn",
200
- number: "error",
201
- },
202
- layout: {
203
- group: "error",
204
- maxNestingDepth: 2,
205
- },
206
- });
207
- expect(config.fieldTypes.text).toBe("warn");
208
- expect(config.fieldTypes.number).toBe("error");
209
- expect(config.layout.group).toBe("error");
210
- expect(config.layout.maxNestingDepth).toBe(2);
211
- });
212
- });
213
- describe("validateFormSpec", () => {
214
- it("validates a FormSpec object directly", () => {
215
- const form = formspec(field.text("name"), field.dynamicEnum("country", "countries"));
216
- const result = validateFormSpec(form, {
217
- constraints: {
218
- fieldTypes: { dynamicEnum: "error" },
219
- },
220
- });
221
- expect(result.valid).toBe(false);
222
- expect(result.issues).toHaveLength(1);
223
- });
224
- });
225
- describe("isFieldTypeAllowed", () => {
226
- it("returns true when field type severity is off", () => {
227
- expect(isFieldTypeAllowed("text", { text: "off" })).toBe(true);
228
- });
229
- it("returns true when field type is not in constraints", () => {
230
- expect(isFieldTypeAllowed("text", {})).toBe(true);
231
- });
232
- it("returns false when field type severity is error", () => {
233
- expect(isFieldTypeAllowed("dynamic_enum", { dynamicEnum: "error" })).toBe(false);
234
- });
235
- it("returns false when field type severity is warn", () => {
236
- expect(isFieldTypeAllowed("array", { array: "warn" })).toBe(false);
237
- });
238
- it("handles unknown field types gracefully", () => {
239
- // Unknown field types should not cause errors
240
- expect(isFieldTypeAllowed("unknown_type", { text: "error" })).toBe(true);
241
- });
242
- });
243
- describe("getFieldTypeSeverity", () => {
244
- it("returns severity when field type is constrained", () => {
245
- expect(getFieldTypeSeverity("dynamic_enum", { dynamicEnum: "error" })).toBe("error");
246
- });
247
- it("returns off when field type is not constrained", () => {
248
- expect(getFieldTypeSeverity("text", {})).toBe("off");
249
- });
250
- it("returns warn when field type has warn severity", () => {
251
- expect(getFieldTypeSeverity("array", { array: "warn" })).toBe("warn");
252
- });
253
- it("returns off for unknown field types", () => {
254
- expect(getFieldTypeSeverity("unknown_type", { text: "error" })).toBe("off");
255
- });
256
- });
257
- describe("isFieldOptionAllowed", () => {
258
- it("returns true when option severity is off", () => {
259
- expect(isFieldOptionAllowed("label", { label: "off" })).toBe(true);
260
- });
261
- it("returns true when option is not in constraints", () => {
262
- expect(isFieldOptionAllowed("placeholder", {})).toBe(true);
263
- });
264
- it("returns false when option severity is error", () => {
265
- expect(isFieldOptionAllowed("minValue", { minValue: "error" })).toBe(false);
266
- });
267
- it("returns false when option severity is warn", () => {
268
- expect(isFieldOptionAllowed("maxItems", { maxItems: "warn" })).toBe(false);
269
- });
270
- });
271
- describe("getFieldOptionSeverity", () => {
272
- it("returns severity when option is constrained", () => {
273
- expect(getFieldOptionSeverity("placeholder", { placeholder: "error" })).toBe("error");
274
- });
275
- it("returns off when option is not constrained", () => {
276
- expect(getFieldOptionSeverity("label", {})).toBe("off");
277
- });
278
- it("returns warn when option has warn severity", () => {
279
- expect(getFieldOptionSeverity("required", { required: "warn" })).toBe("warn");
280
- });
281
- });
282
- describe("isLayoutTypeAllowed", () => {
283
- it("returns true when group is allowed", () => {
284
- expect(isLayoutTypeAllowed("group", { group: "off" })).toBe(true);
285
- });
286
- it("returns true when layout type is not in constraints", () => {
287
- expect(isLayoutTypeAllowed("group", {})).toBe(true);
288
- expect(isLayoutTypeAllowed("conditional", {})).toBe(true);
289
- });
290
- it("returns false when group is disallowed", () => {
291
- expect(isLayoutTypeAllowed("group", { group: "error" })).toBe(false);
292
- });
293
- it("returns false when conditional is disallowed", () => {
294
- expect(isLayoutTypeAllowed("conditional", { conditionals: "error" })).toBe(false);
295
- });
296
- it("returns false when layout type has warn severity", () => {
297
- expect(isLayoutTypeAllowed("group", { group: "warn" })).toBe(false);
298
- });
299
- });
300
- describe("isNestingDepthAllowed", () => {
301
- it("returns true when depth is within limit", () => {
302
- expect(isNestingDepthAllowed(2, { maxNestingDepth: 5 })).toBe(true);
303
- });
304
- it("returns true when depth equals max", () => {
305
- expect(isNestingDepthAllowed(3, { maxNestingDepth: 3 })).toBe(true);
306
- });
307
- it("returns false when depth exceeds max", () => {
308
- expect(isNestingDepthAllowed(4, { maxNestingDepth: 3 })).toBe(false);
309
- });
310
- it("returns true when maxNestingDepth is not set", () => {
311
- expect(isNestingDepthAllowed(10, {})).toBe(true);
312
- });
313
- it("returns true when maxNestingDepth is Infinity", () => {
314
- expect(isNestingDepthAllowed(100, { maxNestingDepth: Infinity })).toBe(true);
315
- });
316
- it("handles depth of 0", () => {
317
- expect(isNestingDepthAllowed(0, { maxNestingDepth: 0 })).toBe(true);
318
- expect(isNestingDepthAllowed(0, { maxNestingDepth: 5 })).toBe(true);
319
- });
320
- });
321
- describe("extractFieldOptions", () => {
322
- it("maps NumberField min/max to minValue/maxValue constraints", () => {
323
- // NumberField in core uses min/max, but constraints use minValue/maxValue
324
- const options = extractFieldOptions({
325
- name: "quantity",
326
- min: 1,
327
- max: 100,
328
- });
329
- expect(options).toContain("minValue");
330
- expect(options).toContain("maxValue");
331
- });
332
- it("extracts all known options", () => {
333
- const options = extractFieldOptions({
334
- name: "test",
335
- label: "Test",
336
- placeholder: "Enter value",
337
- required: true,
338
- min: 0,
339
- max: 100,
340
- minItems: 1,
341
- maxItems: 10,
342
- });
343
- expect(options).toEqual(expect.arrayContaining([
344
- "label",
345
- "placeholder",
346
- "required",
347
- "minValue",
348
- "maxValue",
349
- "minItems",
350
- "maxItems",
351
- ]));
352
- });
353
- it("ignores unknown properties", () => {
354
- const options = extractFieldOptions({
355
- name: "test",
356
- unknownOption: "value",
357
- anotherUnknown: 123,
358
- });
359
- expect(options).toHaveLength(0);
360
- });
361
- });
362
- describe("validateFieldTypes - negative cases", () => {
363
- it("ignores unknown field types", () => {
364
- const issues = validateFieldTypes({ fieldType: "custom_unknown_type", fieldName: "test" }, { text: "error" });
365
- expect(issues).toHaveLength(0);
366
- });
367
- });
368
- describe("validateLayout - warning severity", () => {
369
- it("returns warning when group has warn severity", () => {
370
- const issues = validateLayout({ layoutType: "group", label: "Test", depth: 0 }, { group: "warn" });
371
- expect(issues).toHaveLength(1);
372
- expect(issues[0]?.severity).toBe("warning");
373
- });
374
- it("returns warning when conditional has warn severity", () => {
375
- const issues = validateLayout({ layoutType: "conditional", depth: 0 }, { conditionals: "warn" });
376
- expect(issues).toHaveLength(1);
377
- expect(issues[0]?.severity).toBe("warning");
378
- });
379
- });
380
- describe("validateFieldOptions - warning severity", () => {
381
- it("returns warning when option has warn severity", () => {
382
- const issues = validateFieldOptions({ fieldName: "test", presentOptions: ["placeholder"] }, { placeholder: "warn" });
383
- expect(issues).toHaveLength(1);
384
- expect(issues[0]?.severity).toBe("warning");
385
- });
386
- });
387
- describe("validateFormSpecElements - edge cases", () => {
388
- it("handles empty elements array", () => {
389
- const result = validateFormSpecElements([]);
390
- expect(result.valid).toBe(true);
391
- expect(result.issues).toHaveLength(0);
392
- });
393
- it("handles deeply nested objects", () => {
394
- const form = formspec(field.object("level1", field.object("level2", field.object("level3", field.text("deepField")))));
395
- const result = validateFormSpecElements(form.elements, {
396
- constraints: {
397
- layout: { maxNestingDepth: 2 },
398
- },
399
- });
400
- expect(result.valid).toBe(false);
401
- expect(result.issues.some((i) => i.code === "EXCEEDED_NESTING_DEPTH")).toBe(true);
402
- });
403
- });
404
- //# sourceMappingURL=validators.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validators.test.js","sourceRoot":"","sources":["../../src/__tests__/validators.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,kBAAkB,CAC/B,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,EACnD,EAAE,WAAW,EAAE,OAAO,EAAE,CACzB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9B,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAC1C,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,kBAAkB,CAC/B,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,EACnE,EAAE,MAAM,EAAE,OAAO,EAAE,CACpB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,cAAc,CAC3B,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EACnD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,cAAc,CAC3B,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EACnD,EAAE,KAAK,EAAE,OAAO,EAAE,CACnB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9B,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,cAAc,CAC3B,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EACvC,EAAE,YAAY,EAAE,OAAO,EAAE,CAC1B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9B,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9B,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;QACzF,uEAAuE;QACvE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAC;QAC9E,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,oBAAoB,CACjC,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAC9D,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CACrC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,oBAAoB,CACjC,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,aAAa,CAAC,EAAE,EACvD,EAAE,WAAW,EAAE,OAAO,EAAE,CACzB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9B,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAAG,oBAAoB,CACjC,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAChE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CACzC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,QAAQ,CACnB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EACrC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CACtC,CAAC;QAEF,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrD,WAAW,EAAE;gBACX,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;aACrC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YACrC,IAAI,EAAE,uBAAuB;YAC7B,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEjF,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrD,WAAW,EAAE;gBACX,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;aAC3B;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,QAAQ,CACnB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,CAAU,CAAC,EACrD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACpD,CAAC;QAEF,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrD,WAAW,EAAE;gBACX,MAAM,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE;aAClC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,QAAQ,CACnB,KAAK,CAAC,MAAM,CACV,SAAS,EACT,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAChE,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrD,WAAW,EAAE;gBACX,MAAM,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE;aAC/B;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrD,WAAW,EAAE;gBACX,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;aACvD;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrD,WAAW,EAAE;gBACX,UAAU,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;aACpC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,QAAQ,CACnB,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAC7F,CAAC;QAEF,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrD,WAAW,EAAE;gBACX,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;aACrC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC/B,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;SACrC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC/B,UAAU,EAAE;gBACV,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,OAAO;aAChB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,OAAO;gBACd,eAAe,EAAE,CAAC;aACnB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE;YACpC,WAAW,EAAE;gBACX,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;aACrC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,8CAA8C;QAC9C,MAAM,CAAC,kBAAkB,CAAC,cAAwB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,oBAAoB,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,oBAAoB,CAAC,cAAwB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,sBAAsB,CAAC,aAAa,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,0EAA0E;QAC1E,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,GAAG;SACT,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,GAAG;YACR,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CACrB,MAAM,CAAC,eAAe,CAAC;YACrB,OAAO;YACP,aAAa;YACb,UAAU;YACV,UAAU;YACV,UAAU;YACV,UAAU;YACV,UAAU;SACX,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,IAAI,EAAE,MAAM;YACZ,aAAa,EAAE,OAAO;YACtB,cAAc,EAAE,GAAG;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,kBAAkB,CAC/B,EAAE,SAAS,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,EAAE,EACvD,EAAE,IAAI,EAAE,OAAO,EAAE,CAClB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,cAAc,CAC3B,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAChD,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,cAAc,CAC3B,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EACvC,EAAE,YAAY,EAAE,MAAM,EAAE,CACzB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,oBAAoB,CACjC,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,aAAa,CAAC,EAAE,EACtD,EAAE,WAAW,EAAE,MAAM,EAAE,CACxB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,QAAQ,CACnB,KAAK,CAAC,MAAM,CACV,QAAQ,EACR,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CACxE,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrD,WAAW,EAAE;gBACX,MAAM,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE;aAC/B;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}