@elle96/ng-json-schema-manager 0.1.2 → 0.1.3
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elle96-ng-json-schema-manager.mjs","sources":["../../../projects/ng-json-schema-form/src/lib/json-schema-form.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-resolver.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-validation.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-node.component.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-form.component.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-form.module.ts","../../../projects/ng-json-schema-form/src/elle96-ng-json-schema-manager.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormArray,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { JsonSchema } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaFormService {\r\n buildControl(schema: JsonSchema, value?: unknown, required = false): AbstractControl {\r\n const effectiveSchema = this.applyCombinators(schema);\r\n const resolvedType = this.resolveType(effectiveSchema);\r\n\r\n if (resolvedType === 'object') {\r\n const group: Record<string, AbstractControl> = {};\r\n const properties = effectiveSchema.properties ?? {};\r\n const requiredFields = new Set(effectiveSchema.required ?? []);\r\n const valueObject = this.isRecord(value) ? value : {};\r\n\r\n for (const [key, propertySchema] of Object.entries(properties)) {\r\n const childValue = valueObject[key];\r\n group[key] = this.buildControl(propertySchema, childValue, requiredFields.has(key));\r\n }\r\n\r\n // Include dynamic keys from value (patternProperties/additionalProperties).\r\n for (const key of Object.keys(valueObject)) {\r\n if (group[key]) {\r\n continue;\r\n }\r\n const dynamicSchema = this.resolveDynamicSchema(effectiveSchema, key);\r\n group[key] = this.buildControl(dynamicSchema ?? {}, valueObject[key], false);\r\n }\r\n\r\n const control = new FormGroup(group, {\r\n validators: this.buildValidators(effectiveSchema, required),\r\n });\r\n if (effectiveSchema.readOnly) {\r\n control.disable({ emitEvent: false });\r\n }\r\n return control;\r\n }\r\n\r\n if (resolvedType === 'array') {\r\n const controls: AbstractControl[] = [];\r\n const initialItems = Array.isArray(value) ? value : [];\r\n const minItems = effectiveSchema.minItems ?? 0;\r\n const prefixItems = effectiveSchema.prefixItems ?? [];\r\n const tupleLength = Math.max(prefixItems.length, minItems, initialItems.length);\r\n\r\n for (let i = 0; i < tupleLength; i += 1) {\r\n const itemSchema = (prefixItems[i] ?? effectiveSchema.items) as JsonSchema | boolean | undefined;\r\n if (itemSchema === false) {\r\n continue;\r\n }\r\n const itemValue = initialItems[i];\r\n controls.push(this.buildControl((itemSchema as JsonSchema) ?? {}, itemValue, false));\r\n }\r\n\r\n const control = new FormArray(controls, {\r\n validators: this.buildValidators(effectiveSchema, required),\r\n });\r\n if (effectiveSchema.readOnly) {\r\n control.disable({ emitEvent: false });\r\n }\r\n return control;\r\n }\r\n\r\n const initialValue = this.resolveInitialValue(effectiveSchema, value);\r\n const control = new FormControl(initialValue, {\r\n validators: this.buildValidators(effectiveSchema, required, resolvedType),\r\n nonNullable: false,\r\n });\r\n\r\n if (effectiveSchema.readOnly || effectiveSchema.const !== undefined) {\r\n control.disable({ emitEvent: false });\r\n }\r\n\r\n return control;\r\n }\r\n\r\n resolveType(schema: JsonSchema): JsonSchema['type'] | 'enum' {\r\n if (schema.enum) {\r\n return 'enum';\r\n }\r\n\r\n if (schema.oneOf?.length) {\r\n return this.resolveType(schema.oneOf[0]);\r\n }\r\n if (schema.anyOf?.length) {\r\n return this.resolveType(schema.anyOf[0]);\r\n }\r\n if (schema.allOf?.length) {\r\n return this.resolveType(schema.allOf[0]);\r\n }\r\n\r\n if (schema.type) {\r\n if (Array.isArray(schema.type)) {\r\n const preferred = schema.type.find((item) => item !== 'null');\r\n return preferred ?? schema.type[0];\r\n }\r\n\r\n return schema.type;\r\n }\r\n\r\n if (schema.properties || schema.patternProperties || schema.additionalProperties) {\r\n return 'object';\r\n }\r\n\r\n if (schema.items || schema.prefixItems) {\r\n return 'array';\r\n }\r\n\r\n return 'string';\r\n }\r\n\r\n private applyCombinators(schema: JsonSchema): JsonSchema {\r\n let effective = schema;\r\n if (schema.allOf?.length) {\r\n effective = this.mergeSchemas([schema, ...schema.allOf]);\r\n }\r\n if (schema.oneOf?.length) {\r\n effective = schema.oneOf[0];\r\n }\r\n if (schema.anyOf?.length) {\r\n effective = schema.anyOf[0];\r\n }\r\n return effective;\r\n }\r\n\r\n resolveDynamicSchema(schema: JsonSchema, key: string): JsonSchema | undefined {\r\n const patternSchemas = schema.patternProperties ?? {};\r\n for (const [pattern, patternSchema] of Object.entries(patternSchemas)) {\r\n try {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n return patternSchema;\r\n }\r\n } catch {\r\n // ignore invalid regex\r\n }\r\n }\r\n\r\n if (schema.additionalProperties === true || schema.additionalProperties === undefined) {\r\n return {};\r\n }\r\n\r\n if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\r\n return schema.additionalProperties;\r\n }\r\n\r\n if (schema.unevaluatedProperties && typeof schema.unevaluatedProperties === 'object') {\r\n return schema.unevaluatedProperties;\r\n }\r\n if (schema.unevaluatedProperties === true) {\r\n return {};\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private resolveInitialValue(schema: JsonSchema, value?: unknown): unknown {\r\n if (value !== undefined) {\r\n return value;\r\n }\r\n\r\n if (schema.const !== undefined) {\r\n return schema.const;\r\n }\r\n\r\n if (schema.default !== undefined) {\r\n return schema.default;\r\n }\r\n\r\n if (schema.enum && schema.enum.length > 0) {\r\n return schema.enum[0];\r\n }\r\n\r\n if (schema.type === 'boolean') {\r\n return false;\r\n }\r\n\r\n if (schema.type === 'array') {\r\n return [];\r\n }\r\n\r\n if (schema.type === 'object') {\r\n return {};\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private buildValidators(\r\n schema: JsonSchema,\r\n required: boolean,\r\n resolvedType?: JsonSchema['type'] | 'enum'\r\n ): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (required) {\r\n validators.push(Validators.required);\r\n }\r\n\r\n if (schema.minLength !== undefined) {\r\n validators.push(Validators.minLength(schema.minLength));\r\n }\r\n\r\n if (schema.maxLength !== undefined) {\r\n validators.push(Validators.maxLength(schema.maxLength));\r\n }\r\n\r\n if (schema.minimum !== undefined) {\r\n validators.push(Validators.min(schema.minimum));\r\n }\r\n\r\n if (schema.maximum !== undefined) {\r\n validators.push(Validators.max(schema.maximum));\r\n }\r\n\r\n if (schema.exclusiveMinimum !== undefined) {\r\n validators.push((control) =>\r\n control.value === null || control.value === undefined || control.value === ''\r\n ? null\r\n : Number(control.value) > schema.exclusiveMinimum!\r\n ? null\r\n : { exclusiveMinimum: true }\r\n );\r\n }\r\n\r\n if (schema.exclusiveMaximum !== undefined) {\r\n validators.push((control) =>\r\n control.value === null || control.value === undefined || control.value === ''\r\n ? null\r\n : Number(control.value) < schema.exclusiveMaximum!\r\n ? null\r\n : { exclusiveMaximum: true }\r\n );\r\n }\r\n\r\n if (schema.multipleOf !== undefined) {\r\n validators.push((control) => {\r\n if (control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n const numericValue = Number(control.value);\r\n return numericValue % schema.multipleOf! === 0 ? null : { multipleOf: true };\r\n });\r\n }\r\n\r\n if (schema.pattern) {\r\n validators.push(Validators.pattern(schema.pattern));\r\n }\r\n\r\n if (schema.format === 'email') {\r\n validators.push(Validators.email);\r\n }\r\n\r\n if (schema.minItems !== undefined) {\r\n validators.push((control) =>\r\n Array.isArray(control.value) && control.value.length < schema.minItems!\r\n ? { minItems: true }\r\n : null\r\n );\r\n }\r\n\r\n if (schema.maxItems !== undefined) {\r\n validators.push((control) =>\r\n Array.isArray(control.value) && control.value.length > schema.maxItems!\r\n ? { maxItems: true }\r\n : null\r\n );\r\n }\r\n\r\n if (schema.uniqueItems) {\r\n validators.push((control) => {\r\n if (!Array.isArray(control.value)) {\r\n return null;\r\n }\r\n const unique = new Set(control.value.map((item) => JSON.stringify(item)));\r\n return unique.size === control.value.length ? null : { uniqueItems: true };\r\n });\r\n }\r\n\r\n if (schema.minProperties !== undefined) {\r\n validators.push((control) => {\r\n if (!control.value || typeof control.value !== 'object') {\r\n return null;\r\n }\r\n return Object.keys(control.value).length < schema.minProperties!\r\n ? { minProperties: true }\r\n : null;\r\n });\r\n }\r\n\r\n if (schema.maxProperties !== undefined) {\r\n validators.push((control) => {\r\n if (!control.value || typeof control.value !== 'object') {\r\n return null;\r\n }\r\n return Object.keys(control.value).length > schema.maxProperties!\r\n ? { maxProperties: true }\r\n : null;\r\n });\r\n }\r\n\r\n if (resolvedType === 'integer') {\r\n validators.push((control) => {\r\n if (control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n\r\n const numericValue = Number(control.value);\r\n return Number.isInteger(numericValue) ? null : { integer: true };\r\n });\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n private isRecord(value: unknown): value is Record<string, unknown> {\r\n return !!value && typeof value === 'object' && !Array.isArray(value);\r\n }\r\n\r\n private mergeSchemas(schemas: JsonSchema[]): JsonSchema {\r\n return schemas.reduce((acc, schema) => {\r\n const merged: JsonSchema = {\r\n ...acc,\r\n ...schema,\r\n properties: { ...(acc.properties ?? {}), ...(schema.properties ?? {}) },\r\n patternProperties: { ...(acc.patternProperties ?? {}), ...(schema.patternProperties ?? {}) },\r\n required: Array.from(new Set([...(acc.required ?? []), ...(schema.required ?? [])])),\r\n };\r\n return merged;\r\n }, {} as JsonSchema);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { JsonSchema } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaResolverService {\r\n async resolve(schema: JsonSchema, baseUri?: string): Promise<JsonSchema> {\r\n const rootBase = baseUri ?? schema.$id ?? '';\r\n const localCache = new Map<string, JsonSchema>();\r\n const externalCache = new Map<string, JsonSchema>();\r\n return this.resolveRefs(schema, schema, rootBase, localCache, externalCache);\r\n }\r\n\r\n private async resolveRefs(\r\n current: JsonSchema,\r\n root: JsonSchema,\r\n baseUri: string,\r\n localCache: Map<string, JsonSchema>,\r\n externalCache: Map<string, JsonSchema>\r\n ): Promise<JsonSchema> {\r\n if (!current || typeof current !== 'object') {\r\n return current;\r\n }\r\n\r\n if (current.$ref) {\r\n const ref = current.$ref;\r\n if (ref.startsWith('#/')) {\r\n if (localCache.has(ref)) {\r\n return localCache.get(ref)!;\r\n }\r\n const resolved = this.resolvePointer(root, ref);\r\n if (resolved) {\r\n localCache.set(ref, resolved);\r\n return this.resolveRefs(resolved, root, baseUri, localCache, externalCache);\r\n }\r\n } else {\r\n const resolved = await this.resolveExternalRef(ref, baseUri, externalCache, localCache);\r\n if (resolved) {\r\n return resolved;\r\n }\r\n }\r\n }\r\n\r\n const next: JsonSchema = { ...current };\r\n\r\n if (next.properties) {\r\n const entries = await Promise.all(\r\n Object.entries(next.properties).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.properties = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.patternProperties) {\r\n const entries = await Promise.all(\r\n Object.entries(next.patternProperties).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.patternProperties = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.items && typeof next.items === 'object') {\r\n next.items = await this.resolveRefs(next.items as JsonSchema, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.prefixItems) {\r\n next.prefixItems = await Promise.all(\r\n next.prefixItems.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.additionalProperties && typeof next.additionalProperties === 'object') {\r\n next.additionalProperties = await this.resolveRefs(\r\n next.additionalProperties,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.additionalItems && typeof next.additionalItems === 'object') {\r\n next.additionalItems = await this.resolveRefs(\r\n next.additionalItems,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.unevaluatedProperties && typeof next.unevaluatedProperties === 'object') {\r\n next.unevaluatedProperties = await this.resolveRefs(\r\n next.unevaluatedProperties,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.unevaluatedItems && typeof next.unevaluatedItems === 'object') {\r\n next.unevaluatedItems = await this.resolveRefs(next.unevaluatedItems, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.contains) {\r\n next.contains = await this.resolveRefs(next.contains, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.oneOf) {\r\n next.oneOf = await Promise.all(\r\n next.oneOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.anyOf) {\r\n next.anyOf = await Promise.all(\r\n next.anyOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.allOf) {\r\n next.allOf = await Promise.all(\r\n next.allOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.not) {\r\n next.not = await this.resolveRefs(next.not, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.if) {\r\n next.if = await this.resolveRefs(next.if, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.then) {\r\n next.then = await this.resolveRefs(next.then, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.else) {\r\n next.else = await this.resolveRefs(next.else, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.dependencies) {\r\n const entries = await Promise.all(\r\n Object.entries(next.dependencies).map(async ([key, value]) => {\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return [key, await this.resolveRefs(value as JsonSchema, root, baseUri, localCache, externalCache)];\r\n }\r\n return [key, value];\r\n })\r\n );\r\n next.dependencies = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.dependentSchemas) {\r\n const entries = await Promise.all(\r\n Object.entries(next.dependentSchemas).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.dependentSchemas = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.$defs) {\r\n const entries = await Promise.all(\r\n Object.entries(next.$defs).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.$defs = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.definitions) {\r\n const entries = await Promise.all(\r\n Object.entries(next.definitions).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.definitions = Object.fromEntries(entries);\r\n }\r\n\r\n return next;\r\n }\r\n\r\n private async resolveExternalRef(\r\n ref: string,\r\n baseUri: string,\r\n externalCache: Map<string, JsonSchema>,\r\n localCache: Map<string, JsonSchema>\r\n ): Promise<JsonSchema | null> {\r\n try {\r\n const url = new URL(ref, baseUri || window.location.href).toString();\r\n if (externalCache.has(url)) {\r\n return externalCache.get(url)!;\r\n }\r\n\r\n const { schema, fragment } = await this.fetchSchema(url);\r\n if (!schema) {\r\n return null;\r\n }\r\n\r\n const target = fragment ? this.resolvePointer(schema, fragment) : schema;\r\n if (!target) {\r\n return null;\r\n }\r\n\r\n const resolved = await this.resolveRefs(target, schema, schema.$id ?? url, localCache, externalCache);\r\n externalCache.set(url, resolved);\r\n return resolved;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private async fetchSchema(url: string): Promise<{ schema: JsonSchema | null; fragment: string | null }> {\r\n const [base, hash] = url.split('#');\r\n const fragment = hash ? `#/${hash.replace(/^\\//, '')}` : null;\r\n const response = await fetch(base, { headers: { Accept: 'application/json' } });\r\n if (!response.ok) {\r\n return { schema: null, fragment: null };\r\n }\r\n const schema = (await response.json()) as JsonSchema;\r\n return { schema, fragment };\r\n }\r\n\r\n private resolvePointer(root: JsonSchema, ref: string): JsonSchema | null {\r\n const pointer = ref.replace(/^#\\//, '');\r\n const parts = pointer.split('/').map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'));\r\n let current: any = root;\r\n for (const part of parts) {\r\n if (current && typeof current === 'object' && part in current) {\r\n current = current[part];\r\n } else {\r\n return null;\r\n }\r\n }\r\n return current as JsonSchema;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport Ajv, { ErrorObject } from 'ajv';\r\nimport Ajv2019 from 'ajv/dist/2019';\r\nimport Ajv2020 from 'ajv/dist/2020';\r\nimport addFormats from 'ajv-formats';\r\nimport AjvDraft04 from 'ajv-draft-04';\r\nimport { JsonSchema, SchemaError } from './types';\r\n\r\nexport type JsonSchemaDraft = 'draft4' | 'draft6' | 'draft7' | 'draft2019' | 'draft2020';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaValidationService {\r\n private readonly ajvCache = new Map<JsonSchemaDraft, Ajv>();\r\n\r\n validate(schema: JsonSchema, value: unknown): ErrorObject[] {\r\n const draft = this.detectDraft(schema);\r\n const ajv = this.getAjv(draft);\r\n const validate = ajv.compile(schema as object);\r\n const valid = validate(value);\r\n if (valid) {\r\n return [];\r\n }\r\n return validate.errors ?? [];\r\n }\r\n\r\n /**\r\n * Validates the schema itself against its JSON Schema meta-schema.\r\n * Returns a list of SchemaError describing what is wrong in the schema definition.\r\n */\r\n validateSchema(schema: JsonSchema): SchemaError[] {\r\n const draft = this.detectDraft(schema);\r\n const ajv = this.getAjv(draft);\r\n\r\n try {\r\n const valid = ajv.validateSchema(schema as object);\r\n if (valid) return [];\r\n return (ajv.errors ?? []).map((e) => ({\r\n path: e.instancePath || '/',\r\n message: e.message ?? e.keyword,\r\n keyword: e.keyword,\r\n }));\r\n } catch (e) {\r\n // ajv.validateSchema throws when the schema is so broken it cannot be compiled.\r\n // The error message contains comma-separated individual violations — split them.\r\n const raw = e instanceof Error ? e.message : String(e);\r\n // Strip the \"schema is invalid: \" prefix if present\r\n const body = raw.replace(/^schema is invalid:\\s*/i, '');\r\n // Each violation looks like \"data/some/path must ...\" — extract path and message\r\n return body.split(', ').map((msg) => {\r\n const trimmed = msg.trim();\r\n const match = trimmed.match(/^(data[^\\s]*)\\s+(.+)$/);\r\n return match\r\n ? { path: match[1].replace(/^data/, '') || '/', message: match[2], keyword: 'schema' }\r\n : { path: '/', message: trimmed, keyword: 'schema' };\r\n });\r\n }\r\n }\r\n\r\n detectDraft(schema: JsonSchema): JsonSchemaDraft {\r\n const schemaId = schema.$schema ?? '';\r\n if (schemaId.includes('draft-04')) {\r\n return 'draft4';\r\n }\r\n if (schemaId.includes('draft-06')) {\r\n return 'draft6';\r\n }\r\n if (schemaId.includes('draft-07')) {\r\n return 'draft7';\r\n }\r\n if (schemaId.includes('2019-09')) {\r\n return 'draft2019';\r\n }\r\n if (schemaId.includes('2020-12')) {\r\n return 'draft2020';\r\n }\r\n\r\n if (schema.$defs) {\r\n return 'draft2020';\r\n }\r\n if (schema.definitions) {\r\n return 'draft7';\r\n }\r\n\r\n return 'draft2020';\r\n }\r\n\r\n private getAjv(draft: JsonSchemaDraft): Ajv {\r\n if (this.ajvCache.has(draft)) {\r\n return this.ajvCache.get(draft)!;\r\n }\r\n\r\n let ajv: Ajv;\r\n switch (draft) {\r\n case 'draft4':\r\n ajv = new AjvDraft04({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft2019':\r\n ajv = new Ajv2019({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft6':\r\n case 'draft7':\r\n ajv = new Ajv({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft2020':\r\n default:\r\n ajv = new Ajv2020({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n }\r\n\r\n addFormats(ajv);\r\n this.ajvCache.set(draft, ajv);\r\n return ajv;\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AbstractControl, FormArray, FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { JsonSchema, JsonSchemaType } from './types';\r\nimport { JsonSchemaFormService } from './json-schema-form.service';\r\nimport { JsonSchemaValidationService } from './json-schema-validation.service';\r\n\r\n@Component({\r\n selector: 'jsm-schema-node',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n styles: [`\r\n .jsm-toggle-track {\r\n position: relative; display: inline-flex; align-items: center;\r\n width: 2.25rem; height: 1.25rem; border-radius: 9999px;\r\n flex-shrink: 0; transition: background-color 0.2s;\r\n background-color: #cbd5e1;\r\n }\r\n .jsm-toggle-track.jsm-toggle-on { background-color: #4f46e5; }\r\n .dark .jsm-toggle-track:not(.jsm-toggle-on) { background-color: #475569; }\r\n .jsm-toggle-thumb {\r\n display: inline-block; width: 1rem; height: 1rem;\r\n border-radius: 9999px; background: #fff;\r\n box-shadow: 0 1px 3px rgba(0,0,0,0.2);\r\n transform: translateX(0.125rem);\r\n transition: transform 0.2s;\r\n }\r\n .jsm-toggle-track.jsm-toggle-on .jsm-toggle-thumb { transform: translateX(1.125rem); }\r\n `],\r\n template: `\r\n <ng-container [ngSwitch]=\"nodeKind\">\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n oneOf — tab bar: ogni opzione è una tab, nessuna icona\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'oneOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-blue-100 dark:bg-blue-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-blue-700 dark:text-blue-400\">oneOf</span>\r\n </div>\r\n <div class=\"flex overflow-x-auto border-b border-slate-200 dark:border-slate-700\">\r\n <button\r\n *ngFor=\"let option of schema.oneOf; let i = index\"\r\n type=\"button\"\r\n class=\"px-4 py-2.5 text-xs font-medium whitespace-nowrap border-b-2 transition-colors\"\r\n [class.border-indigo-500]=\"selectedOneOf === i\"\r\n [class.text-indigo-600]=\"selectedOneOf === i\"\r\n [class.dark:text-indigo-400]=\"selectedOneOf === i\"\r\n [class.font-semibold]=\"selectedOneOf === i\"\r\n [class.border-transparent]=\"selectedOneOf !== i\"\r\n [class.text-slate-500]=\"selectedOneOf !== i\"\r\n [class.dark:text-slate-400]=\"selectedOneOf !== i\"\r\n (click)=\"selectedOneOf = i; onOneOfChange()\"\r\n >{{ option.title || ('Option ' + (i + 1)) }}</button>\r\n </div>\r\n <div class=\"p-4\" *ngIf=\"activeVariant\">\r\n <jsm-schema-node [schema]=\"activeVariant\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"label\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n anyOf — pill toggle, nessuna icona\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'anyOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-violet-100 dark:bg-violet-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-violet-700 dark:text-violet-400\">anyOf</span>\r\n </div>\r\n <div class=\"flex flex-wrap gap-2 px-4 py-3 border-b border-slate-200 dark:border-slate-700\">\r\n <label\r\n *ngFor=\"let option of schema.anyOf; let i = index\"\r\n class=\"inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium cursor-pointer transition-colors select-none\"\r\n [class.border-indigo-400]=\"selectedAnyOf.has(i)\"\r\n [class.bg-indigo-50]=\"selectedAnyOf.has(i)\"\r\n [class.dark:bg-indigo-900/30]=\"selectedAnyOf.has(i)\"\r\n [class.text-indigo-700]=\"selectedAnyOf.has(i)\"\r\n [class.dark:text-indigo-400]=\"selectedAnyOf.has(i)\"\r\n [class.border-slate-200]=\"!selectedAnyOf.has(i)\"\r\n [class.dark:border-slate-600]=\"!selectedAnyOf.has(i)\"\r\n [class.text-slate-600]=\"!selectedAnyOf.has(i)\"\r\n [class.dark:text-slate-400]=\"!selectedAnyOf.has(i)\"\r\n >\r\n <input type=\"checkbox\" class=\"h-3.5 w-3.5 accent-indigo-600\" [checked]=\"selectedAnyOf.has(i)\" (change)=\"toggleAnyOf(i)\" />\r\n {{ option.title || ('Option ' + (i + 1)) }}\r\n </label>\r\n </div>\r\n <div class=\"p-4\" *ngIf=\"activeVariant\">\r\n <jsm-schema-node [schema]=\"activeVariant\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"label\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n allOf — sezioni in colonna con bordo sinistro\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'allOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-teal-100 dark:bg-teal-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-teal-700 dark:text-teal-400\">allOf</span>\r\n </div>\r\n <div class=\"p-4 space-y-4\">\r\n <div *ngFor=\"let subSchema of mergedAllOf; let i = index\" class=\"border-l-2 border-indigo-200 dark:border-indigo-700 pl-4\">\r\n <jsm-schema-node [schema]=\"subSchema\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"subSchema.title || ('Section ' + (i + 1))\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n object — fieldset con griglia SOLO per campi primitivi.\r\n Logica layout:\r\n - I figli vengono classificati come \"semplici\" (primitive/enum/bool)\r\n o \"complessi\" (object/array/oneOf/anyOf/allOf).\r\n - I semplici vanno in griglia 2 colonne (sm:grid-cols-2).\r\n - I complessi vanno sempre in colonna piena (col-span-2).\r\n ═══════════════════════════════════════════════════════════ -->\r\n <fieldset *ngSwitchCase=\"'object'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm p-4 transition-shadow focus-within:border-indigo-300 dark:focus-within:border-indigo-600 focus-within:ring-2 focus-within:ring-indigo-100 dark:focus-within:ring-indigo-900/40\">\r\n <legend class=\"px-2 text-sm font-bold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</legend>\r\n\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mb-3 mt-1\">{{ schema.description }}</p>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5 mb-3\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <!-- campi semplici (string/number/bool/enum) → griglia 2 colonne -->\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\" [formGroup]=\"controlAsGroup\">\r\n <ng-container *ngFor=\"let key of simpleKeys\">\r\n <div class=\"flex flex-col gap-1\">\r\n <div *ngIf=\"isDynamicKey(key)\"\r\n class=\"flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1\">\r\n <span class=\"font-mono text-xs text-slate-500 dark:text-slate-400\">{{ key }}</span>\r\n <button type=\"button\"\r\n class=\"rounded px-1.5 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors\"\r\n (click)=\"removeDynamicKey(key)\">Remove</button>\r\n </div>\r\n <jsm-schema-node\r\n [schema]=\"schemaForKey(key)\"\r\n [control]=\"childControl(key)\"\r\n [parent]=\"controlAsGroup\"\r\n [controlKey]=\"key\"\r\n [path]=\"pathForChild(key)\"\r\n [errorsMap]=\"errorsMap\"\r\n [label]=\"key\"\r\n [required]=\"isRequired(key)\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\">\r\n </jsm-schema-node>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- campi complessi (object/array/combinator) → colonna piena -->\r\n <div class=\"space-y-4 mt-4\" *ngIf=\"complexKeys.length > 0\" [formGroup]=\"controlAsGroup\">\r\n <ng-container *ngFor=\"let key of complexKeys\">\r\n <div class=\"flex flex-col gap-1\">\r\n <div *ngIf=\"isDynamicKey(key)\"\r\n class=\"flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1\">\r\n <span class=\"font-mono text-xs text-slate-500 dark:text-slate-400\">{{ key }}</span>\r\n <button type=\"button\"\r\n class=\"rounded px-1.5 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors\"\r\n (click)=\"removeDynamicKey(key)\">Remove</button>\r\n </div>\r\n <jsm-schema-node\r\n [schema]=\"schemaForKey(key)\"\r\n [control]=\"childControl(key)\"\r\n [parent]=\"controlAsGroup\"\r\n [controlKey]=\"key\"\r\n [path]=\"pathForChild(key)\"\r\n [errorsMap]=\"errorsMap\"\r\n [label]=\"key\"\r\n [required]=\"isRequired(key)\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\">\r\n </jsm-schema-node>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- add dynamic property -->\r\n <div *ngIf=\"canAddProperty\" class=\"mt-4 rounded-lg border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/40 p-3 space-y-2\">\r\n <p class=\"text-[10px] font-bold uppercase tracking-widest text-slate-400 dark:text-slate-500\">Add property</p>\r\n <div class=\"flex gap-2\">\r\n <input\r\n class=\"flex-1 rounded-lg border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-1.5 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100 dark:focus:ring-indigo-900/40\"\r\n [(ngModel)]=\"newPropertyKey\" placeholder=\"propertyName\" />\r\n <button type=\"button\"\r\n class=\"rounded-lg bg-indigo-600 px-3 py-1.5 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-700 active:scale-95\"\r\n (click)=\"addDynamicProperty()\">Add</button>\r\n </div>\r\n <p *ngIf=\"propertyError\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <!-- icona errore: unico caso in cui ha senso, segnala un problema -->\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ propertyError }}\r\n </p>\r\n </div>\r\n\r\n <div *ngIf=\"errorsForPath.length\" class=\"mt-3 space-y-1\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </fieldset>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n array — sempre in colonna piena, items in colonna\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'array'\" class=\"space-y-3\">\r\n <div class=\"flex items-start justify-between gap-2\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <!-- icona + nel bottone: indica l'azione \"aggiungi\", non decorativa -->\r\n <button type=\"button\"\r\n class=\"shrink-0 flex items-center gap-1 rounded-lg bg-indigo-600 px-3 py-1.5 text-xs font-semibold text-white shadow-sm transition hover:bg-indigo-700 active:scale-95 disabled:opacity-40 disabled:cursor-not-allowed\"\r\n (click)=\"addArrayItem()\" [disabled]=\"!canAddArrayItem\">\r\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M8 3v10M3 8h10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n Add item\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"effectiveSchema.contains\" class=\"rounded-md bg-indigo-50 dark:bg-indigo-900/30 px-3 py-1.5 text-xs text-indigo-700 dark:text-indigo-400\">\r\n Must contain matching item(s)\r\n <span *ngIf=\"effectiveSchema.minContains\"> · min {{ effectiveSchema.minContains }}</span>\r\n <span *ngIf=\"effectiveSchema.maxContains\"> · max {{ effectiveSchema.maxContains }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <div class=\"space-y-2\" *ngIf=\"arrayControls.length > 0; else emptyArray\">\r\n <div *ngFor=\"let item of arrayControls; let i = index\"\r\n class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 p-3 shadow-sm transition focus-within:border-indigo-300 dark:focus-within:border-indigo-600 focus-within:ring-2 focus-within:ring-indigo-100 dark:focus-within:ring-indigo-900/40\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"inline-flex h-5 w-5 items-center justify-center rounded-full bg-indigo-100 dark:bg-indigo-900/50 text-[11px] font-bold text-indigo-600 dark:text-indigo-400\">{{ i + 1 }}</span>\r\n <button type=\"button\"\r\n class=\"rounded-md border border-red-200 dark:border-red-800 px-2 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 transition hover:bg-red-50 dark:hover:bg-red-900/20\"\r\n (click)=\"removeArrayItem(i)\">Remove</button>\r\n </div>\r\n <jsm-schema-node [schema]=\"schemaForIndex(i)\" [control]=\"item\" [parent]=\"controlAsArray\"\r\n [controlKey]=\"i\" [path]=\"pathForChild(i)\" [errorsMap]=\"errorsMap\" [label]=\"label + ' item'\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <ng-template #emptyArray>\r\n <div class=\"flex flex-col items-center gap-2 rounded-xl border border-dashed border-slate-200 dark:border-slate-700 py-8 text-slate-400 dark:text-slate-500 text-xs\">\r\n No items yet — click \"Add item\" to start.\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"errorsForPath.length\" class=\"space-y-1\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n primitive — sempre in colonna, nessuna icona decorativa.\r\n Icona errore solo nei messaggi di validazione.\r\n Icona chevron nel select: funzionale (indica dropdown).\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchDefault class=\"space-y-1.5\">\r\n <ng-container *ngIf=\"inputKind !== 'checkbox'\">\r\n <label class=\"block text-[13px] font-semibold text-slate-700 dark:text-slate-300\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </label>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 -mt-0.5\">{{ schema.description }}</p>\r\n </ng-container>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <ng-container [ngSwitch]=\"inputKind\">\r\n\r\n <input *ngSwitchCase=\"'text'\"\r\n class=\"w-full rounded-lg border bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-2 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:ring-2\"\r\n [class.border-slate-300]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:border-slate-600]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:border-indigo-400]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:ring-indigo-100]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:focus:ring-indigo-900/40]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:border-red-400]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:ring-red-100]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [attr.type]=\"inputType\"\r\n [attr.placeholder]=\"schema.title || label\"\r\n [formControl]=\"controlAsFormControl\"\r\n />\r\n\r\n <textarea *ngSwitchCase=\"'textarea'\" rows=\"4\"\r\n class=\"w-full resize-y rounded-lg border bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-2 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:ring-2\"\r\n [class.border-slate-300]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:border-slate-600]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:border-indigo-400]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:ring-indigo-100]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:focus:ring-indigo-900/40]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:border-red-400]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:ring-red-100]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [attr.placeholder]=\"schema.title || label\"\r\n [formControl]=\"controlAsFormControl\"\r\n ></textarea>\r\n\r\n <!-- select: il chevron SVG è funzionale, indica che è un dropdown -->\r\n <div *ngSwitchCase=\"'select'\" class=\"relative\">\r\n <select\r\n class=\"w-full appearance-none rounded-lg border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 px-3 py-2 pr-8 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100 dark:focus:ring-indigo-900/40\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [formControl]=\"controlAsFormControl\">\r\n <option *ngFor=\"let option of effectiveSchema.enum\" [ngValue]=\"option\">{{ option }}</option>\r\n </select>\r\n <svg class=\"pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400 dark:text-slate-500\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n\r\n <!-- checkbox come toggle switch -->\r\n <label *ngSwitchCase=\"'checkbox'\" class=\"inline-flex cursor-pointer items-center gap-2.5\">\r\n <span class=\"jsm-toggle-track\" [class.jsm-toggle-on]=\"controlAsFormControl.value\">\r\n <input type=\"checkbox\" class=\"sr-only\" [formControl]=\"controlAsFormControl\" />\r\n <span class=\"jsm-toggle-thumb\"></span>\r\n </span>\r\n <span class=\"text-sm font-medium text-slate-700 dark:text-slate-300\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </span>\r\n </label>\r\n\r\n </ng-container>\r\n\r\n <p *ngIf=\"inputKind === 'checkbox' && schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400\">{{ schema.description }}</p>\r\n\r\n <p *ngIf=\"effectiveSchema.examples?.length\" class=\"text-[11px] text-slate-400 dark:text-slate-500\">\r\n e.g. {{ effectiveSchema.examples?.[0] }}\r\n </p>\r\n\r\n <p *ngIf=\"effectiveSchema.contentMediaType\" class=\"text-[11px] text-slate-400 dark:text-slate-500\">\r\n {{ effectiveSchema.contentMediaType }}<span *ngIf=\"effectiveSchema.contentEncoding\"> ({{ effectiveSchema.contentEncoding }})</span>\r\n </p>\r\n\r\n <!-- icona errore: funzionale, segnala un problema di validazione -->\r\n <div *ngIf=\"errorsForPath.length && controlAsFormControl.dirty\" class=\"space-y-1 pt-0.5\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\r\n <path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class JsonSchemaNodeComponent implements OnInit {\r\n @Input({ required: true }) schema!: JsonSchema;\r\n @Input({ required: true }) control!: AbstractControl;\r\n @Input() label = '';\r\n @Input() required = false;\r\n @Input() path = '';\r\n @Input() errorsMap = new Map<string, string[]>();\r\n @Input() parent?: FormGroup | FormArray;\r\n @Input() controlKey?: string | number;\r\n @Input() allowAdditionalProperties = false;\r\n\r\n @Output() controlReplaced = new EventEmitter<AbstractControl>();\r\n\r\n selectedOneOf = 0;\r\n selectedAnyOf = new Set<number>();\r\n newPropertyKey = '';\r\n propertyError = '';\r\n\r\n constructor(\r\n private readonly schemaService: JsonSchemaFormService,\r\n private readonly validation: JsonSchemaValidationService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.schema.anyOf?.length) {\r\n this.selectedAnyOf.add(0);\r\n }\r\n }\r\n\r\n /**\r\n * Determina se un figlio di un object è \"semplice\" (primitive/enum/bool),\r\n * quindi può stare in griglia 2-col, oppure \"complesso\" (object/array/combinator)\r\n * che deve occupare la larghezza piena.\r\n */\r\n isSimpleChild(key: string): boolean {\r\n const childSchema = this.schemaForKey(key);\r\n if (childSchema.oneOf?.length || childSchema.anyOf?.length || childSchema.allOf?.length) return false;\r\n const t = this.schemaService.resolveType(childSchema);\r\n return t !== 'object' && t !== 'array';\r\n }\r\n\r\n badgeClass(badge: string): Record<string, boolean> {\r\n return {\r\n 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400': badge === 'Deprecated',\r\n 'bg-slate-100 text-slate-600 dark:bg-slate-700 dark:text-slate-400': badge === 'Read-only' || badge === 'Nullable',\r\n 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400': badge === 'Write-only',\r\n 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400': badge === 'Not constraint',\r\n };\r\n }\r\n\r\n get nodeKind(): 'oneOf' | 'anyOf' | 'allOf' | 'object' | 'array' | 'primitive' {\r\n if (this.schema.oneOf?.length) return 'oneOf';\r\n if (this.schema.anyOf?.length) return 'anyOf';\r\n if (this.schema.allOf?.length) return 'allOf';\r\n const resolved = this.resolvedType;\r\n if (resolved === 'object') return 'object';\r\n if (resolved === 'array') return 'array';\r\n return 'primitive';\r\n }\r\n\r\n get resolvedType(): JsonSchema['type'] | 'enum' {\r\n return this.schemaService.resolveType(this.effectiveSchema) ?? 'string';\r\n }\r\n\r\n get inputKind(): 'text' | 'textarea' | 'select' | 'checkbox' {\r\n if (this.effectiveSchema.enum) return 'select';\r\n if (this.resolvedType === 'boolean') return 'checkbox';\r\n if (this.effectiveSchema.format === 'textarea' || (this.effectiveSchema.maxLength ?? 0) > 200) return 'textarea';\r\n return 'text';\r\n }\r\n\r\n get inputType(): string {\r\n if (this.effectiveSchema.format === 'email') return 'email';\r\n if (this.effectiveSchema.format === 'date') return 'date';\r\n if (this.effectiveSchema.format === 'time') return 'time';\r\n if (this.effectiveSchema.format === 'date-time') return 'datetime-local';\r\n if (this.resolvedType === 'number' || this.resolvedType === 'integer') return 'number';\r\n if (this.effectiveSchema.format === 'password') return 'password';\r\n return 'text';\r\n }\r\n\r\n get controlAsGroup(): FormGroup { return this.control as FormGroup; }\r\n get controlAsFormControl(): FormControl { return this.control as FormControl; }\r\n get controlAsArray(): FormArray { return this.control as FormArray; }\r\n get arrayControls(): AbstractControl[] { return this.controlAsArray.controls; }\r\n get objectKeys(): string[] { return Object.keys(this.controlAsGroup.controls); }\r\n\r\n get simpleKeys(): string[] {\r\n return this.objectKeys.filter(k => this.isSimpleChild(k));\r\n }\r\n\r\n get complexKeys(): string[] {\r\n return this.objectKeys.filter(k => !this.isSimpleChild(k));\r\n }\r\n\r\n get canAddProperty(): boolean {\r\n if (!this.allowAdditionalProperties) return false;\r\n return this.effectiveSchema.additionalProperties !== false || !!this.effectiveSchema.patternProperties;\r\n }\r\n\r\n get errorsForPath(): string[] { return this.errorsMap.get(this.path) ?? []; }\r\n\r\n get metaBadges(): string[] {\r\n const badges: string[] = [];\r\n if (this.effectiveSchema.deprecated) badges.push('Deprecated');\r\n if (this.effectiveSchema.readOnly) badges.push('Read-only');\r\n if (this.effectiveSchema.writeOnly) badges.push('Write-only');\r\n if (this.effectiveSchema.nullable) badges.push('Nullable');\r\n if (this.effectiveSchema.not) badges.push('Not constraint');\r\n return badges;\r\n }\r\n\r\n get activeVariant(): JsonSchema | null {\r\n if (this.schema.oneOf?.length) return this.schema.oneOf[this.selectedOneOf] ?? null;\r\n if (this.schema.anyOf?.length) {\r\n const selections = Array.from(this.selectedAnyOf).map((i) => this.schema.anyOf![i]);\r\n return selections.length ? this.mergeSchemas(selections) : this.schema.anyOf[0] ?? null;\r\n }\r\n if (this.schema.allOf?.length) return this.mergeSchemas([this.schema, ...this.schema.allOf]);\r\n return this.effectiveSchema;\r\n }\r\n\r\n get mergedAllOf(): JsonSchema[] {\r\n return this.schema.allOf?.length ? [this.schema, ...this.schema.allOf] : [this.schema];\r\n }\r\n\r\n isRequired(key: string): boolean { return this.effectiveSchema.required?.includes(key) ?? false; }\r\n\r\n schemaForKey(key: string): JsonSchema {\r\n return (\r\n this.effectiveSchema.properties?.[key] ??\r\n this.schemaService.resolveDynamicSchema(this.effectiveSchema, key) ??\r\n {}\r\n );\r\n }\r\n\r\n isDynamicKey(key: string): boolean { return !this.effectiveSchema.properties?.[key]; }\r\n\r\n pathForChild(key: string | number): string {\r\n return this.path === '' ? `/${key}` : `${this.path}/${key}`;\r\n }\r\n\r\n addDynamicProperty(): void {\r\n this.propertyError = '';\r\n const key = this.newPropertyKey.trim();\r\n if (!key) { this.propertyError = 'Property name is required.'; return; }\r\n if (this.effectiveSchema.propertyNames) {\r\n const nameErrors = this.validation.validate(this.effectiveSchema.propertyNames, key);\r\n if (nameErrors.length) { this.propertyError = 'Property name does not match schema constraints.'; return; }\r\n }\r\n if (this.controlAsGroup.contains(key)) { this.propertyError = 'Property already exists.'; return; }\r\n const schemaForKey = this.schemaService.resolveDynamicSchema(this.effectiveSchema, key);\r\n if (!schemaForKey) { this.propertyError = 'This property is not allowed by the schema.'; return; }\r\n const control = this.schemaService.buildControl(schemaForKey, undefined, false);\r\n this.controlAsGroup.addControl(key, control);\r\n this.newPropertyKey = '';\r\n }\r\n\r\n removeDynamicKey(key: string): void { this.controlAsGroup.removeControl(key); }\r\n\r\n schemaForIndex(index: number): JsonSchema {\r\n const prefixItems = this.effectiveSchema.prefixItems ?? [];\r\n if (prefixItems[index]) return prefixItems[index];\r\n if (this.effectiveSchema.items && this.effectiveSchema.items !== true) return this.effectiveSchema.items as JsonSchema;\r\n if (this.effectiveSchema.additionalItems && this.effectiveSchema.additionalItems !== true) return this.effectiveSchema.additionalItems as JsonSchema;\r\n if (this.effectiveSchema.unevaluatedItems && this.effectiveSchema.unevaluatedItems !== true) return this.effectiveSchema.unevaluatedItems as JsonSchema;\r\n return {};\r\n }\r\n\r\n get canAddArrayItem(): boolean {\r\n return !(\r\n this.effectiveSchema.items === false ||\r\n this.effectiveSchema.additionalItems === false ||\r\n this.effectiveSchema.unevaluatedItems === false\r\n );\r\n }\r\n\r\n addArrayItem(): void {\r\n if (!this.canAddArrayItem) return;\r\n const formArray = this.controlAsArray;\r\n const index = formArray.length;\r\n formArray.push(this.schemaService.buildControl(this.schemaForIndex(index), undefined, false));\r\n formArray.markAsDirty();\r\n }\r\n\r\n removeArrayItem(index: number): void {\r\n this.controlAsArray.removeAt(index);\r\n this.controlAsArray.markAsDirty();\r\n }\r\n\r\n onOneOfChange(): void {\r\n if (!this.activeVariant) return;\r\n this.replaceControl(this.schemaService.buildControl(this.activeVariant, this.control.value, this.required));\r\n }\r\n\r\n toggleAnyOf(index: number): void {\r\n if (this.selectedAnyOf.has(index)) this.selectedAnyOf.delete(index);\r\n else this.selectedAnyOf.add(index);\r\n const variant = this.activeVariant;\r\n if (variant) this.replaceControl(this.schemaService.buildControl(variant, this.control.value, this.required));\r\n }\r\n\r\n private replaceControl(control: AbstractControl): void {\r\n if (this.parent) {\r\n if (this.parent instanceof FormGroup && typeof this.controlKey === 'string') this.parent.setControl(this.controlKey, control);\r\n if (this.parent instanceof FormArray && typeof this.controlKey === 'number') this.parent.setControl(this.controlKey, control);\r\n this.control = control;\r\n return;\r\n }\r\n this.control = control;\r\n this.controlReplaced.emit(control);\r\n }\r\n\r\n childControl(key: string): AbstractControl { return this.controlAsGroup.get(key) as AbstractControl; }\r\n\r\n get effectiveSchema(): JsonSchema {\r\n let schema = this.schema;\r\n if (schema.allOf?.length) schema = this.mergeSchemas([schema, ...schema.allOf]);\r\n schema = this.applyConditional(schema);\r\n schema = this.applyDependencies(schema);\r\n return schema;\r\n }\r\n\r\n private applyConditional(schema: JsonSchema): JsonSchema {\r\n if (!schema.if) return schema;\r\n const errors = this.validation.validate(schema.if, this.control.value);\r\n const branch = errors.length === 0 ? schema.then : schema.else;\r\n if (!branch) return schema;\r\n return this.mergeSchemas([schema, branch]);\r\n }\r\n\r\n private applyDependencies(schema: JsonSchema): JsonSchema {\r\n const value = this.control.value;\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return schema;\r\n let merged = { ...schema } as JsonSchema;\r\n const valueKeys = Object.keys(value as Record<string, unknown>);\r\n if (schema.dependentRequired) {\r\n for (const key of valueKeys) {\r\n const required = schema.dependentRequired[key];\r\n if (required?.length) merged = this.mergeSchemas([merged, { required }]);\r\n }\r\n }\r\n if (schema.dependentSchemas) {\r\n for (const key of valueKeys) {\r\n const depSchema = schema.dependentSchemas[key];\r\n if (depSchema) merged = this.mergeSchemas([merged, depSchema]);\r\n }\r\n }\r\n if (schema.dependencies) {\r\n for (const key of valueKeys) {\r\n const dep = schema.dependencies[key];\r\n if (Array.isArray(dep)) merged = this.mergeSchemas([merged, { required: dep }]);\r\n else if (dep) merged = this.mergeSchemas([merged, dep]);\r\n }\r\n }\r\n return merged;\r\n }\r\n\r\n private mergeSchemas(schemas: JsonSchema[]): JsonSchema {\r\n return schemas.reduce((acc, schema) => {\r\n const merged: JsonSchema = {\r\n ...acc,\r\n ...schema,\r\n properties: { ...(acc.properties ?? {}), ...(schema.properties ?? {}) },\r\n patternProperties: { ...(acc.patternProperties ?? {}), ...(schema.patternProperties ?? {}) },\r\n required: Array.from(new Set([...(acc.required ?? []), ...(schema.required ?? [])])),\r\n };\r\n if (acc.type && schema.type) {\r\n const accTypes = Array.isArray(acc.type) ? acc.type : [acc.type];\r\n const schemaTypes = Array.isArray(schema.type) ? schema.type : [schema.type];\r\n merged.type = Array.from(new Set([...accTypes, ...schemaTypes])) as JsonSchemaType[];\r\n }\r\n return merged;\r\n }, {} as JsonSchema);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AbstractControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { JsonSchemaFormService } from './json-schema-form.service';\r\nimport { JsonSchema, SchemaError } from './types';\r\nimport { JsonSchemaNodeComponent } from './json-schema-node.component';\r\nimport { JsonSchemaResolverService } from './json-schema-resolver.service';\r\nimport { JsonSchemaValidationService } from './json-schema-validation.service';\r\n\r\n@Component({\r\n selector: 'jsm-json-schema-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, JsonSchemaNodeComponent],\r\n encapsulation: ViewEncapsulation.None,\r\n styles: [`\r\n .jsm-root *, .jsm-root *::before, .jsm-root *::after { box-sizing: border-box; }\r\n .jsm-root input, .jsm-root textarea, .jsm-root select, .jsm-root button {\r\n font-family: inherit;\r\n font-size: inherit;\r\n line-height: inherit;\r\n }\r\n .jsm-root input[type=\"number\"]::-webkit-inner-spin-button,\r\n .jsm-root input[type=\"number\"]::-webkit-outer-spin-button { opacity: 1; }\r\n /* Force border visibility against host resets */\r\n .jsm-root input:not([type=\"checkbox\"]):not([type=\"radio\"]):not(.sr-only),\r\n .jsm-root textarea,\r\n .jsm-root select {\r\n border-width: 1.5px !important;\r\n border-style: solid !important;\r\n }\r\n `],\r\n template: `\r\n <div class=\"jsm-root\">\r\n <form class=\"w-full space-y-5\">\r\n <div *ngIf=\"resolvedSchema?.title || resolvedSchema?.description\" class=\"space-y-0.5\">\r\n <h2 class=\"text-lg font-bold tracking-tight text-slate-900 dark:text-white\">{{ resolvedSchema?.title || 'Form' }}</h2>\r\n <p *ngIf=\"resolvedSchema?.description\" class=\"text-sm text-slate-500 dark:text-slate-400\">{{ resolvedSchema?.description }}</p>\r\n </div>\r\n\r\n <div *ngIf=\"loading\" class=\"flex items-center gap-2 py-6 text-sm text-slate-500 dark:text-slate-400\" aria-live=\"polite\">\r\n <svg class=\"h-4 w-4 animate-spin text-indigo-500 dark:text-indigo-400\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"/>\r\n </svg>\r\n Resolving schema…\r\n </div>\r\n\r\n <!-- schema structural errors panel -->\r\n <div *ngIf=\"schemaErrorList.length > 0 && !loading\"\r\n class=\"rounded-xl border border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-900/20 p-4 space-y-3\"\r\n role=\"alert\">\r\n <div class=\"flex items-center gap-2\">\r\n <svg class=\"w-4 h-4 shrink-0 text-amber-600 dark:text-amber-400\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 2L1.5 13.5h13L8 2z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\r\n <path d=\"M8 6v3.5M8 11.5v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <span class=\"text-sm font-semibold text-amber-800 dark:text-amber-300\">\r\n Schema errors ({{ schemaErrorList.length }})\r\n </span>\r\n </div>\r\n <p class=\"text-xs text-amber-700 dark:text-amber-400\">\r\n The schema has structural issues. Fix them to get a valid form.\r\n </p>\r\n <div class=\"space-y-2\">\r\n <div *ngFor=\"let err of schemaErrorList\"\r\n class=\"rounded-lg border border-amber-200 dark:border-amber-800 bg-white dark:bg-slate-900 px-3 py-2 space-y-0.5\">\r\n <p class=\"font-mono text-[11px] font-semibold text-amber-700 dark:text-amber-400\">{{ err.path }}</p>\r\n <p class=\"text-xs text-slate-700 dark:text-slate-300\">{{ err.message }}</p>\r\n <p class=\"text-[10px] uppercase tracking-wide text-slate-400 dark:text-slate-500\">keyword: {{ err.keyword }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"form && resolvedSchema && !loading\" class=\"space-y-5\" [formGroup]=\"form\">\r\n <jsm-schema-node\r\n [schema]=\"resolvedSchema\"\r\n [control]=\"rootControl\"\r\n [path]=\"''\"\r\n [errorsMap]=\"errorsMap\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n label=\"Root\"\r\n (controlReplaced)=\"onRootReplaced($event)\"\r\n ></jsm-schema-node>\r\n </div>\r\n </form>\r\n </div>\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class JsonSchemaFormComponent implements OnChanges, OnDestroy {\r\n @Input({ required: true }) schema!: JsonSchema;\r\n @Input() value?: unknown;\r\n @Input() data?: unknown;\r\n @Input() allowAdditionalProperties = false;\r\n\r\n @Output() formReady = new EventEmitter<FormGroup>();\r\n @Output() valueChange = new EventEmitter<unknown>();\r\n @Output() schemaReady = new EventEmitter<JsonSchema>();\r\n @Output() schemaErrors = new EventEmitter<SchemaError[]>();\r\n\r\n form!: FormGroup;\r\n rootControl!: AbstractControl;\r\n resolvedSchema?: JsonSchema;\r\n errorsMap = new Map<string, string[]>();\r\n schemaErrorList: SchemaError[] = [];\r\n loading = false;\r\n\r\n private valueSub?: Subscription;\r\n\r\n constructor(\r\n private readonly schemaService: JsonSchemaFormService,\r\n private readonly resolver: JsonSchemaResolverService,\r\n private readonly validation: JsonSchemaValidationService\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] || changes['value'] || changes['data']) {\r\n void this.buildForm();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.valueSub?.unsubscribe();\r\n }\r\n\r\n private async buildForm(): Promise<void> {\r\n this.valueSub?.unsubscribe();\r\n this.loading = true;\r\n this.resolvedSchema = await this.resolver.resolve(this.schema, this.schema?.$id);\r\n\r\n // Validate the schema itself and emit any structural errors\r\n const schemaErrs = this.validation.validateSchema(this.resolvedSchema);\r\n this.schemaErrorList = schemaErrs;\r\n this.schemaErrors.emit(schemaErrs);\r\n\r\n this.schemaReady.emit(this.resolvedSchema);\r\n\r\n // If the schema has structural errors, stop here — don't try to build the form\r\n if (schemaErrs.length > 0) {\r\n this.form = undefined!;\r\n this.loading = false;\r\n return;\r\n }\r\n const initialData = this.value !== undefined ? this.value : this.data;\r\n this.rootControl = this.schemaService.buildControl(this.resolvedSchema, initialData);\r\n this.form = this.rootControl instanceof FormGroup ? this.rootControl : new FormGroup({ value: this.rootControl });\r\n this.formReady.emit(this.form);\r\n this.loading = false;\r\n\r\n this.attachValueSub();\r\n }\r\n\r\n private updateErrors(): void {\r\n if (!this.resolvedSchema) {\r\n this.errorsMap = new Map();\r\n return;\r\n }\r\n\r\n const errors = this.validation.validate(this.resolvedSchema, this.rootControl.value);\r\n const map = new Map<string, string[]>();\r\n\r\n for (const error of errors) {\r\n const path = error.instancePath ?? '';\r\n const messages = map.get(path) ?? [];\r\n messages.push(error.message ?? error.keyword);\r\n map.set(path, messages);\r\n }\r\n\r\n this.errorsMap = map;\r\n }\r\n\r\n onRootReplaced(control: AbstractControl): void {\r\n this.rootControl = control;\r\n if (control instanceof FormGroup) {\r\n this.form = control;\r\n } else {\r\n if (!(this.form instanceof FormGroup) || !this.form.contains('value')) {\r\n this.form = new FormGroup({ value: control });\r\n } else {\r\n this.form.setControl('value', control);\r\n }\r\n }\r\n this.attachValueSub();\r\n }\r\n\r\n private attachValueSub(): void {\r\n this.valueSub?.unsubscribe();\r\n this.updateErrors();\r\n this.valueSub = this.form.valueChanges.subscribe(() => {\r\n this.updateErrors();\r\n this.valueChange.emit(this.rootControl.value);\r\n });\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { JsonSchemaFormComponent } from './json-schema-form.component';\r\nimport { JsonSchemaNodeComponent } from './json-schema-node.component';\r\n\r\n@NgModule({\r\n imports: [JsonSchemaFormComponent, JsonSchemaNodeComponent],\r\n exports: [JsonSchemaFormComponent, JsonSchemaNodeComponent],\r\n})\r\nexport class JsonSchemaFormModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.JsonSchemaFormService","i2.JsonSchemaValidationService","i2.JsonSchemaResolverService","i3.JsonSchemaValidationService","i4","i5"],"mappings":";;;;;;;;;;;;MAca,qBAAqB,CAAA;AAChC,IAAA,YAAY,CAAC,MAAkB,EAAE,KAAe,EAAE,QAAQ,GAAG,KAAK,EAAA;QAChE,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;AAEtD,QAAA,IAAI,YAAY,KAAK,QAAQ,EAAE;YAC7B,MAAM,KAAK,GAAoC,EAAE;AACjD,YAAA,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,IAAI,EAAE;YACnD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC9D,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AAErD,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AAC9D,gBAAA,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;AACnC,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrF;;YAGA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AAC1C,gBAAA,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;oBACd;gBACF;gBACA,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,GAAG,CAAC;AACrE,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;YAC9E;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE;gBACnC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC;AAC5D,aAAA,CAAC;AACF,YAAA,IAAI,eAAe,CAAC,QAAQ,EAAE;gBAC5B,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACvC;AACA,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,IAAI,YAAY,KAAK,OAAO,EAAE;YAC5B,MAAM,QAAQ,GAAsB,EAAE;AACtC,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AACtD,YAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,IAAI,CAAC;AAC9C,YAAA,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,IAAI,EAAE;AACrD,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC;AAE/E,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE;AACvC,gBAAA,MAAM,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,KAAK,CAAqC;AAChG,gBAAA,IAAI,UAAU,KAAK,KAAK,EAAE;oBACxB;gBACF;AACA,gBAAA,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;AACjC,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAE,UAAyB,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACtF;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE;gBACtC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC;AAC5D,aAAA,CAAC;AACF,YAAA,IAAI,eAAe,CAAC,QAAQ,EAAE;gBAC5B,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACvC;AACA,YAAA,OAAO,OAAO;QAChB;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,KAAK,CAAC;AACrE,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE;YAC5C,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,QAAQ,EAAE,YAAY,CAAC;AACzE,YAAA,WAAW,EAAE,KAAK;AACnB,SAAA,CAAC;QAEF,IAAI,eAAe,CAAC,QAAQ,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,EAAE;YACnE,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACvC;AAEA,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,WAAW,CAAC,MAAkB,EAAA;AAC5B,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C;AACA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C;AACA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;YACf,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAC9B,gBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,MAAM,CAAC;gBAC7D,OAAO,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC;YAEA,OAAO,MAAM,CAAC,IAAI;QACpB;AAEA,QAAA,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,oBAAoB,EAAE;AAChF,YAAA,OAAO,QAAQ;QACjB;QAEA,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,EAAE;AACtC,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEQ,IAAA,gBAAgB,CAAC,MAAkB,EAAA;QACzC,IAAI,SAAS,GAAG,MAAM;AACtB,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;AACxB,YAAA,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1D;AACA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;AACxB,YAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B;AACA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;AACxB,YAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B;AACA,QAAA,OAAO,SAAS;IAClB;IAEA,oBAAoB,CAAC,MAAkB,EAAE,GAAW,EAAA;AAClD,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE;AACrD,QAAA,KAAK,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;AACrE,YAAA,IAAI;AACF,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC;AACjC,gBAAA,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACnB,oBAAA,OAAO,aAAa;gBACtB;YACF;AAAE,YAAA,MAAM;;YAER;QACF;AAEA,QAAA,IAAI,MAAM,CAAC,oBAAoB,KAAK,IAAI,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE;AACrF,YAAA,OAAO,EAAE;QACX;QAEA,IAAI,MAAM,CAAC,oBAAoB,IAAI,OAAO,MAAM,CAAC,oBAAoB,KAAK,QAAQ,EAAE;YAClF,OAAO,MAAM,CAAC,oBAAoB;QACpC;QAEA,IAAI,MAAM,CAAC,qBAAqB,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,QAAQ,EAAE;YACpF,OAAO,MAAM,CAAC,qBAAqB;QACrC;AACA,QAAA,IAAI,MAAM,CAAC,qBAAqB,KAAK,IAAI,EAAE;AACzC,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,SAAS;IAClB;IAEQ,mBAAmB,CAAC,MAAkB,EAAE,KAAe,EAAA;AAC7D,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;YAC9B,OAAO,MAAM,CAAC,KAAK;QACrB;AAEA,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE;YAChC,OAAO,MAAM,CAAC,OAAO;QACvB;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACvB;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;AAC3B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,eAAe,CACrB,MAAkB,EAClB,QAAiB,EACjB,YAA0C,EAAA;QAE1C,MAAM,UAAU,GAAkB,EAAE;QAEpC,IAAI,QAAQ,EAAE;AACZ,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtC;AAEA,QAAA,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;AAClC,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzD;AAEA,QAAA,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;AAClC,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzD;AAEA,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE;AAChC,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD;AAEA,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE;AAChC,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD;AAEA,QAAA,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACzC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KACtB,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK;AACzE,kBAAE;kBACA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;AAC/B,sBAAE;AACF,sBAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CACjC;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACzC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KACtB,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK;AACzE,kBAAE;kBACA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;AAC/B,sBAAE;AACF,sBAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CACjC;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE;AACnC,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAC1B,gBAAA,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE,EAAE;AACjF,oBAAA,OAAO,IAAI;gBACb;gBACA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AAC1C,gBAAA,OAAO,YAAY,GAAG,MAAM,CAAC,UAAW,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE;AAC9E,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD;AAEA,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE;AAC7B,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACnC;AAEA,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE;YACjC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KACtB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AAC5D,kBAAE,EAAE,QAAQ,EAAE,IAAI;kBAChB,IAAI,CACT;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE;YACjC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KACtB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AAC5D,kBAAE,EAAE,QAAQ,EAAE,IAAI;kBAChB,IAAI,CACT;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;gBAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACjC,oBAAA,OAAO,IAAI;gBACb;gBACA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzE,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE;AAC5E,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE;AACtC,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAC1B,gBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;AACvD,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;AAChD,sBAAE,EAAE,aAAa,EAAE,IAAI;sBACrB,IAAI;AACV,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE;AACtC,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAC1B,gBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;AACvD,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;AAChD,sBAAE,EAAE,aAAa,EAAE,IAAI;sBACrB,IAAI;AACV,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,YAAY,KAAK,SAAS,EAAE;AAC9B,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAC1B,gBAAA,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE,EAAE;AACjF,oBAAA,OAAO,IAAI;gBACb;gBAEA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AAC1C,gBAAA,OAAO,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;AAClE,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,OAAO,UAAU;IACnB;AAEQ,IAAA,QAAQ,CAAC,KAAc,EAAA;AAC7B,QAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACtE;AAEQ,IAAA,YAAY,CAAC,OAAqB,EAAA;QACxC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,KAAI;AACpC,YAAA,MAAM,MAAM,GAAe;AACzB,gBAAA,GAAG,GAAG;AACN,gBAAA,GAAG,MAAM;AACT,gBAAA,UAAU,EAAE,EAAE,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;AACvE,gBAAA,iBAAiB,EAAE,EAAE,IAAI,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE;AAC5F,gBAAA,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;aACrF;AACD,YAAA,OAAO,MAAM;QACf,CAAC,EAAE,EAAgB,CAAC;IACtB;wGAtUW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;4FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCPY,yBAAyB,CAAA;AACpC,IAAA,MAAM,OAAO,CAAC,MAAkB,EAAE,OAAgB,EAAA;QAChD,MAAM,QAAQ,GAAG,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,EAAE;AAC5C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB;AAChD,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsB;AACnD,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC;IAC9E;IAEQ,MAAM,WAAW,CACvB,OAAmB,EACnB,IAAgB,EAChB,OAAe,EACf,UAAmC,EACnC,aAAsC,EAAA;QAEtC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC3C,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,IAAI,OAAO,CAAC,IAAI,EAAE;AAChB,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI;AACxB,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACxB,gBAAA,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACvB,oBAAA,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE;gBAC7B;gBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC/C,IAAI,QAAQ,EAAE;AACZ,oBAAA,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;AAC7B,oBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;gBAC7E;YACF;iBAAO;AACL,gBAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,CAAC;gBACvF,IAAI,QAAQ,EAAE;AACZ,oBAAA,OAAO,QAAQ;gBACjB;YACF;QACF;AAEA,QAAA,MAAM,IAAI,GAAe,EAAE,GAAG,OAAO,EAAE;AAEvC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBAC1D,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QAC/C;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBACjE,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACtD;QAEA,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;YAChD,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACzG;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CACjG;QACH;QAEA,IAAI,IAAI,CAAC,oBAAoB,IAAI,OAAO,IAAI,CAAC,oBAAoB,KAAK,QAAQ,EAAE;YAC9E,IAAI,CAAC,oBAAoB,GAAG,MAAM,IAAI,CAAC,WAAW,CAChD,IAAI,CAAC,oBAAoB,EACzB,IAAI,EACJ,OAAO,EACP,UAAU,EACV,aAAa,CACd;QACH;QAEA,IAAI,IAAI,CAAC,eAAe,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE;YACpE,IAAI,CAAC,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAC3C,IAAI,CAAC,eAAe,EACpB,IAAI,EACJ,OAAO,EACP,UAAU,EACV,aAAa,CACd;QACH;QAEA,IAAI,IAAI,CAAC,qBAAqB,IAAI,OAAO,IAAI,CAAC,qBAAqB,KAAK,QAAQ,EAAE;YAChF,IAAI,CAAC,qBAAqB,GAAG,MAAM,IAAI,CAAC,WAAW,CACjD,IAAI,CAAC,qBAAqB,EAC1B,IAAI,EACJ,OAAO,EACP,UAAU,EACV,aAAa,CACd;QACH;QAEA,IAAI,IAAI,CAAC,gBAAgB,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE;YACtE,IAAI,CAAC,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACjH;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACjG;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAC3F;QACH;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAC3F;QACH;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAC3F;QACH;AAEA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACvF;AAEA,QAAA,IAAI,IAAI,CAAC,EAAE,EAAE;YACX,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACrF;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACzF;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACzF;AAEA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC3D,gBAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/D,oBAAA,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,KAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;gBACrG;AACA,gBAAA,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YACrB,CAAC,CAAC,CACH;YACD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACjD;AAEA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBAChE,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACrD;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBACrD,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QAC1C;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBAC3D,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QAChD;AAEA,QAAA,OAAO,IAAI;IACb;IAEQ,MAAM,kBAAkB,CAC9B,GAAW,EACX,OAAe,EACf,aAAsC,EACtC,UAAmC,EAAA;AAEnC,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AACpE,YAAA,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAC1B,gBAAA,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAE;YAChC;AAEA,YAAA,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YACxD,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,IAAI;YACb;AAEA,YAAA,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM;YACxE,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC;AACrG,YAAA,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;AAChC,YAAA,OAAO,QAAQ;QACjB;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,MAAM,WAAW,CAAC,GAAW,EAAA;AACnC,QAAA,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAA,EAAA,EAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAE,GAAG,IAAI;AAC7D,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC;AAC/E,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC;QACA,MAAM,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe;AACpD,QAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC7B;IAEQ,cAAc,CAAC,IAAgB,EAAE,GAAW,EAAA;QAClD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACvC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5F,IAAI,OAAO,GAAQ,IAAI;AACvB,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,IAAI,IAAI,OAAO,EAAE;AAC7D,gBAAA,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YACzB;iBAAO;AACL,gBAAA,OAAO,IAAI;YACb;QACF;AACA,QAAA,OAAO,OAAqB;IAC9B;wGAhPW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cAFxB,MAAM,EAAA,CAAA;;4FAEP,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAHrC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCQY,2BAA2B,CAAA;AACrB,IAAA,QAAQ,GAAG,IAAI,GAAG,EAAwB;IAE3D,QAAQ,CAAC,MAAkB,EAAE,KAAc,EAAA;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAgB,CAAC;AAC9C,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,IAAI,KAAK,EAAE;AACT,YAAA,OAAO,EAAE;QACX;AACA,QAAA,OAAO,QAAQ,CAAC,MAAM,IAAI,EAAE;IAC9B;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,MAAkB,EAAA;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAE9B,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,MAAgB,CAAC;AAClD,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;AACpC,gBAAA,IAAI,EAAE,CAAC,CAAC,YAAY,IAAI,GAAG;AAC3B,gBAAA,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO;gBAC/B,OAAO,EAAE,CAAC,CAAC,OAAO;AACnB,aAAA,CAAC,CAAC;QACL;QAAE,OAAO,CAAC,EAAE;;;AAGV,YAAA,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;;YAEtD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;;AAEvD,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAClC,gBAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE;gBAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC;AACpD,gBAAA,OAAO;AACL,sBAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ;AACpF,sBAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;AACxD,YAAA,CAAC,CAAC;QACJ;IACF;AAEA,IAAA,WAAW,CAAC,MAAkB,EAAA;AAC5B,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE;AACrC,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAChC,YAAA,OAAO,WAAW;QACpB;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAChC,YAAA,OAAO,WAAW;QACpB;AAEA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,OAAO,WAAW;QACpB;AACA,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,OAAO,WAAW;IACpB;AAEQ,IAAA,MAAM,CAAC,KAAsB,EAAA;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE;QAClC;AAEA,QAAA,IAAI,GAAQ;QACZ,QAAQ,KAAK;AACX,YAAA,KAAK,QAAQ;gBACX,GAAG,GAAG,IAAI,UAAU,CAAC;AACnB,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;gBACF;AACF,YAAA,KAAK,WAAW;gBACd,GAAG,GAAG,IAAI,OAAO,CAAC;AAChB,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;gBACF;AACF,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,QAAQ;gBACX,GAAG,GAAG,IAAI,GAAG,CAAC;AACZ,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;gBACF;AACF,YAAA,KAAK,WAAW;AAChB,YAAA;gBACE,GAAG,GAAG,IAAI,OAAO,CAAC;AAChB,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;;QAGN,UAAU,CAAC,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;AAC7B,QAAA,OAAO,GAAG;IACZ;wGApHW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cAF1B,MAAM,EAAA,CAAA;;4FAEP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MC0YY,uBAAuB,CAAA;AAmBf,IAAA,aAAA;AACA,IAAA,UAAA;AAnBQ,IAAA,MAAM;AACN,IAAA,OAAO;IACzB,KAAK,GAAG,EAAE;IACV,QAAQ,GAAG,KAAK;IAChB,IAAI,GAAG,EAAE;AACT,IAAA,SAAS,GAAG,IAAI,GAAG,EAAoB;AACvC,IAAA,MAAM;AACN,IAAA,UAAU;IACV,yBAAyB,GAAG,KAAK;AAEhC,IAAA,eAAe,GAAG,IAAI,YAAY,EAAmB;IAE/D,aAAa,GAAG,CAAC;AACjB,IAAA,aAAa,GAAG,IAAI,GAAG,EAAU;IACjC,cAAc,GAAG,EAAE;IACnB,aAAa,GAAG,EAAE;IAElB,WAAA,CACmB,aAAoC,EACpC,UAAuC,EAAA;QADvC,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,UAAU,GAAV,UAAU;IAC1B;IAEH,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B;IACF;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,GAAW,EAAA;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AAC1C,QAAA,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,KAAK;QACrG,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC;AACrD,QAAA,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,OAAO;IACxC;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,OAAO;YACL,sEAAsE,EAAE,KAAK,KAAK,YAAY;AAC9F,YAAA,mEAAmE,EAAK,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,UAAU;YACrH,kEAAkE,EAAM,KAAK,KAAK,YAAY;YAC9F,8DAA8D,EAAU,KAAK,KAAK,gBAAgB;SACnG;IACH;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,OAAO;AAC7C,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,OAAO;AAC7C,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,OAAO;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY;QAClC,IAAI,QAAQ,KAAK,QAAQ;AAAE,YAAA,OAAO,QAAQ;QAC1C,IAAI,QAAQ,KAAK,OAAO;AAAE,YAAA,OAAO,OAAO;AACxC,QAAA,OAAO,WAAW;IACpB;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,QAAQ;IACzE;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI;AAAE,YAAA,OAAO,QAAQ;AAC9C,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;AAAE,YAAA,OAAO,UAAU;AACtD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI,CAAC,IAAI,GAAG;AAAE,YAAA,OAAO,UAAU;AAChH,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,OAAO;AAAE,YAAA,OAAO,OAAO;AAC3D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,MAAM;AAAE,YAAA,OAAO,MAAM;AACzD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,MAAM;AAAE,YAAA,OAAO,MAAM;AACzD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,WAAW;AAAE,YAAA,OAAO,gBAAgB;QACxE,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;AAAE,YAAA,OAAO,QAAQ;AACtF,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,UAAU;AAAE,YAAA,OAAO,UAAU;AACjE,QAAA,OAAO,MAAM;IACf;IAEA,IAAI,cAAc,KAAgB,OAAO,IAAI,CAAC,OAAoB,CAAC,CAAC;IACpE,IAAI,oBAAoB,KAAkB,OAAO,IAAI,CAAC,OAAsB,CAAC,CAAC;IAC9E,IAAI,cAAc,KAAgB,OAAO,IAAI,CAAC,OAAoB,CAAC,CAAC;IACpE,IAAI,aAAa,GAAA,EAAwB,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC9E,IAAA,IAAI,UAAU,GAAA,EAAe,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE/E,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3D;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5D;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,yBAAyB;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,iBAAiB;IACxG;AAEA,IAAA,IAAI,aAAa,GAAA,EAAe,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAE5E,IAAA,IAAI,UAAU,GAAA;QACZ,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC9D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;AAC3D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC7D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;AAC1D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3D,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI;QACnF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC;YACnF,OAAO,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QACzF;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC,eAAe;IAC7B;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;IACxF;AAEA,IAAA,UAAU,CAAC,GAAW,EAAA,EAAa,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;AAEjG,IAAA,YAAY,CAAC,GAAW,EAAA;QACtB,QACE,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,GAAG,CAAC;YACtC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC;AAClE,YAAA,EAAE;IAEN;AAEA,IAAA,YAAY,CAAC,GAAW,EAAA,EAAa,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC;AAErF,IAAA,YAAY,CAAC,GAAoB,EAAA;QAC/B,OAAO,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,CAAA,CAAA,EAAI,GAAG,EAAE,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE;IAC7D;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;QACtC,IAAI,CAAC,GAAG,EAAE;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,4BAA4B;YAAE;QAAQ;AACvE,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE;AACtC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC;AACpF,YAAA,IAAI,UAAU,CAAC,MAAM,EAAE;AAAE,gBAAA,IAAI,CAAC,aAAa,GAAG,kDAAkD;gBAAE;YAAQ;QAC5G;QACA,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,0BAA0B;YAAE;QAAQ;AAClG,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC;QACvF,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,6CAA6C;YAAE;QAAQ;AACjG,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC;QAC/E,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;AAC5C,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;IAC1B;AAEA,IAAA,gBAAgB,CAAC,GAAW,EAAA,EAAU,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9E,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,IAAI,EAAE;QAC1D,IAAI,WAAW,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,WAAW,CAAC,KAAK,CAAC;AACjD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAmB;AACtH,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,eAA6B;AACpJ,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,gBAA8B;AACvJ,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,EACL,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,KAAK;AACpC,YAAA,IAAI,CAAC,eAAe,CAAC,eAAe,KAAK,KAAK;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,KAAK,KAAK,CAChD;IACH;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE;AAC3B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc;AACrC,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM;QAC9B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7F,SAAS,CAAC,WAAW,EAAE;IACzB;AAEA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;IACnC;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;QACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7G;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;;AAC9D,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;AAClC,QAAA,IAAI,OAAO;YAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/G;AAEQ,IAAA,cAAc,CAAC,OAAwB,EAAA;AAC7C,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,IAAI,CAAC,MAAM,YAAY,SAAS,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;gBAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YAC7H,IAAI,IAAI,CAAC,MAAM,YAAY,SAAS,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;gBAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;AAC7H,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO;YACtB;QACF;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;AAEA,IAAA,YAAY,CAAC,GAAW,EAAA,EAAqB,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAoB,CAAC,CAAC;AAErG,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;AACxB,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/E,QAAA,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACtC,QAAA,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;AACvC,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,gBAAgB,CAAC,MAAkB,EAAA;QACzC,IAAI,CAAC,MAAM,CAAC,EAAE;AAAE,YAAA,OAAO,MAAM;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AACtE,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AAC9D,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,MAAM;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;AAEQ,IAAA,iBAAiB,CAAC,MAAkB,EAAA;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;AAChC,QAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;AAC9E,QAAA,IAAI,MAAM,GAAG,EAAE,GAAG,MAAM,EAAgB;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC;AAC/D,QAAA,IAAI,MAAM,CAAC,iBAAiB,EAAE;AAC5B,YAAA,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;gBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBAC9C,IAAI,QAAQ,EAAE,MAAM;AAAE,oBAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E;QACF;AACA,QAAA,IAAI,MAAM,CAAC,gBAAgB,EAAE;AAC3B,YAAA,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;gBAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC9C,gBAAA,IAAI,SAAS;oBAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAChE;QACF;AACA,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;gBAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;AACpC,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAAE,oBAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;AAC1E,qBAAA,IAAI,GAAG;oBAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzD;QACF;AACA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,YAAY,CAAC,OAAqB,EAAA;QACxC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,KAAI;AACpC,YAAA,MAAM,MAAM,GAAe;AACzB,gBAAA,GAAG,GAAG;AACN,gBAAA,GAAG,MAAM;AACT,gBAAA,UAAU,EAAE,EAAE,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;AACvE,gBAAA,iBAAiB,EAAE,EAAE,IAAI,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE;AAC5F,gBAAA,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;aACrF;YACD,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;gBAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAChE,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5E,gBAAA,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC,CAAqB;YACtF;AACA,YAAA,OAAO,MAAM;QACf,CAAC,EAAE,EAAgB,CAAC;IACtB;wGAlRW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,2BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhXxB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6WT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0kBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGU,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,QAAA,EAAA,YAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApYxB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,s1CAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAoY7C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAvYnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,CAAC,EAAA,aAAA,EAC1C,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAmB3B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6WT,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,0kBAAA,CAAA,EAAA;;sBAG9C,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;;MC7TU,uBAAuB,CAAA;AAqBf,IAAA,aAAA;AACA,IAAA,QAAA;AACA,IAAA,UAAA;AAtBQ,IAAA,MAAM;AACxB,IAAA,KAAK;AACL,IAAA,IAAI;IACJ,yBAAyB,GAAG,KAAK;AAEhC,IAAA,SAAS,GAAG,IAAI,YAAY,EAAa;AACzC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAW;AACzC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAc;AAC5C,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;AAE1D,IAAA,IAAI;AACJ,IAAA,WAAW;AACX,IAAA,cAAc;AACd,IAAA,SAAS,GAAG,IAAI,GAAG,EAAoB;IACvC,eAAe,GAAkB,EAAE;IACnC,OAAO,GAAG,KAAK;AAEP,IAAA,QAAQ;AAEhB,IAAA,WAAA,CACmB,aAAoC,EACpC,QAAmC,EACnC,UAAuC,EAAA;QAFvC,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,UAAU,GAAV,UAAU;IAC1B;AAEH,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;AAC5D,YAAA,KAAK,IAAI,CAAC,SAAS,EAAE;QACvB;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;IAC9B;AAEQ,IAAA,MAAM,SAAS,GAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;;AAGhF,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;AACtE,QAAA,IAAI,CAAC,eAAe,GAAG,UAAU;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAElC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;;AAG1C,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,GAAG,SAAU;AACtB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB;QACF;AACA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI;AACrE,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC;AACpF,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,YAAY,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QAEpB,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE;YAC1B;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACpF,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB;AAEvC,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE;YACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;YACpC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AAC7C,YAAA,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QACzB;AAEA,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;IACtB;AAEA,IAAA,cAAc,CAAC,OAAwB,EAAA;AACrC,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO;AAC1B,QAAA,IAAI,OAAO,YAAY,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,IAAI,GAAG,OAAO;QACrB;aAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,YAAY,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACrE,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAC/C;iBAAO;gBACL,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;YACxC;QACF;QACA,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;QAC5B,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;YACpD,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC/C,QAAA,CAAC,CAAC;IACJ;wGAvGW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,2BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1DxB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ueAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1ES,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,QAAA,EAAA,YAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FA6EzD,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAhFnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,EAAA,aAAA,EACtD,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAkB3B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDT,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,ueAAA,CAAA,EAAA;;sBAG9C,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;;MCrGU,oBAAoB,CAAA;wGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAHrB,uBAAuB,EAAE,uBAAuB,CAAA,EAAA,OAAA,EAAA,CAChD,uBAAuB,EAAE,uBAAuB,CAAA,EAAA,CAAA;yGAE/C,oBAAoB,EAAA,OAAA,EAAA,CAHrB,uBAAuB,EAAE,uBAAuB,CAAA,EAAA,CAAA;;4FAG/C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;AAC3D,oBAAA,OAAO,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;AAC5D,iBAAA;;;ACPD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"elle96-ng-json-schema-manager.mjs","sources":["../../../projects/ng-json-schema-form/src/lib/json-schema-form.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-resolver.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-validation.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-node.component.ts","../../../projects/ng-json-schema-form/src/lib/jsm-styles.generated.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-styles.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-form.component.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-form.module.ts","../../../projects/ng-json-schema-form/src/elle96-ng-json-schema-manager.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormArray,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { JsonSchema } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaFormService {\r\n buildControl(schema: JsonSchema, value?: unknown, required = false): AbstractControl {\r\n const effectiveSchema = this.applyCombinators(schema);\r\n const resolvedType = this.resolveType(effectiveSchema);\r\n\r\n if (resolvedType === 'object') {\r\n const group: Record<string, AbstractControl> = {};\r\n const properties = effectiveSchema.properties ?? {};\r\n const requiredFields = new Set(effectiveSchema.required ?? []);\r\n const valueObject = this.isRecord(value) ? value : {};\r\n\r\n for (const [key, propertySchema] of Object.entries(properties)) {\r\n const childValue = valueObject[key];\r\n group[key] = this.buildControl(propertySchema, childValue, requiredFields.has(key));\r\n }\r\n\r\n // Include dynamic keys from value (patternProperties/additionalProperties).\r\n for (const key of Object.keys(valueObject)) {\r\n if (group[key]) {\r\n continue;\r\n }\r\n const dynamicSchema = this.resolveDynamicSchema(effectiveSchema, key);\r\n group[key] = this.buildControl(dynamicSchema ?? {}, valueObject[key], false);\r\n }\r\n\r\n const control = new FormGroup(group, {\r\n validators: this.buildValidators(effectiveSchema, required),\r\n });\r\n if (effectiveSchema.readOnly) {\r\n control.disable({ emitEvent: false });\r\n }\r\n return control;\r\n }\r\n\r\n if (resolvedType === 'array') {\r\n const controls: AbstractControl[] = [];\r\n const initialItems = Array.isArray(value) ? value : [];\r\n const minItems = effectiveSchema.minItems ?? 0;\r\n const prefixItems = effectiveSchema.prefixItems ?? [];\r\n const tupleLength = Math.max(prefixItems.length, minItems, initialItems.length);\r\n\r\n for (let i = 0; i < tupleLength; i += 1) {\r\n const itemSchema = (prefixItems[i] ?? effectiveSchema.items) as JsonSchema | boolean | undefined;\r\n if (itemSchema === false) {\r\n continue;\r\n }\r\n const itemValue = initialItems[i];\r\n controls.push(this.buildControl((itemSchema as JsonSchema) ?? {}, itemValue, false));\r\n }\r\n\r\n const control = new FormArray(controls, {\r\n validators: this.buildValidators(effectiveSchema, required),\r\n });\r\n if (effectiveSchema.readOnly) {\r\n control.disable({ emitEvent: false });\r\n }\r\n return control;\r\n }\r\n\r\n const initialValue = this.resolveInitialValue(effectiveSchema, value);\r\n const control = new FormControl(initialValue, {\r\n validators: this.buildValidators(effectiveSchema, required, resolvedType),\r\n nonNullable: false,\r\n });\r\n\r\n if (effectiveSchema.readOnly || effectiveSchema.const !== undefined) {\r\n control.disable({ emitEvent: false });\r\n }\r\n\r\n return control;\r\n }\r\n\r\n resolveType(schema: JsonSchema): JsonSchema['type'] | 'enum' {\r\n if (schema.enum) {\r\n return 'enum';\r\n }\r\n\r\n if (schema.oneOf?.length) {\r\n return this.resolveType(schema.oneOf[0]);\r\n }\r\n if (schema.anyOf?.length) {\r\n return this.resolveType(schema.anyOf[0]);\r\n }\r\n if (schema.allOf?.length) {\r\n return this.resolveType(schema.allOf[0]);\r\n }\r\n\r\n if (schema.type) {\r\n if (Array.isArray(schema.type)) {\r\n const preferred = schema.type.find((item) => item !== 'null');\r\n return preferred ?? schema.type[0];\r\n }\r\n\r\n return schema.type;\r\n }\r\n\r\n if (schema.properties || schema.patternProperties || schema.additionalProperties) {\r\n return 'object';\r\n }\r\n\r\n if (schema.items || schema.prefixItems) {\r\n return 'array';\r\n }\r\n\r\n return 'string';\r\n }\r\n\r\n private applyCombinators(schema: JsonSchema): JsonSchema {\r\n let effective = schema;\r\n if (schema.allOf?.length) {\r\n effective = this.mergeSchemas([schema, ...schema.allOf]);\r\n }\r\n if (schema.oneOf?.length) {\r\n effective = schema.oneOf[0];\r\n }\r\n if (schema.anyOf?.length) {\r\n effective = schema.anyOf[0];\r\n }\r\n return effective;\r\n }\r\n\r\n resolveDynamicSchema(schema: JsonSchema, key: string): JsonSchema | undefined {\r\n const patternSchemas = schema.patternProperties ?? {};\r\n for (const [pattern, patternSchema] of Object.entries(patternSchemas)) {\r\n try {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n return patternSchema;\r\n }\r\n } catch {\r\n // ignore invalid regex\r\n }\r\n }\r\n\r\n if (schema.additionalProperties === true || schema.additionalProperties === undefined) {\r\n return {};\r\n }\r\n\r\n if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\r\n return schema.additionalProperties;\r\n }\r\n\r\n if (schema.unevaluatedProperties && typeof schema.unevaluatedProperties === 'object') {\r\n return schema.unevaluatedProperties;\r\n }\r\n if (schema.unevaluatedProperties === true) {\r\n return {};\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private resolveInitialValue(schema: JsonSchema, value?: unknown): unknown {\r\n if (value !== undefined) {\r\n return value;\r\n }\r\n\r\n if (schema.const !== undefined) {\r\n return schema.const;\r\n }\r\n\r\n if (schema.default !== undefined) {\r\n return schema.default;\r\n }\r\n\r\n if (schema.enum && schema.enum.length > 0) {\r\n return schema.enum[0];\r\n }\r\n\r\n if (schema.type === 'boolean') {\r\n return false;\r\n }\r\n\r\n if (schema.type === 'array') {\r\n return [];\r\n }\r\n\r\n if (schema.type === 'object') {\r\n return {};\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private buildValidators(\r\n schema: JsonSchema,\r\n required: boolean,\r\n resolvedType?: JsonSchema['type'] | 'enum'\r\n ): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (required) {\r\n validators.push(Validators.required);\r\n }\r\n\r\n if (schema.minLength !== undefined) {\r\n validators.push(Validators.minLength(schema.minLength));\r\n }\r\n\r\n if (schema.maxLength !== undefined) {\r\n validators.push(Validators.maxLength(schema.maxLength));\r\n }\r\n\r\n if (schema.minimum !== undefined) {\r\n validators.push(Validators.min(schema.minimum));\r\n }\r\n\r\n if (schema.maximum !== undefined) {\r\n validators.push(Validators.max(schema.maximum));\r\n }\r\n\r\n if (schema.exclusiveMinimum !== undefined) {\r\n validators.push((control) =>\r\n control.value === null || control.value === undefined || control.value === ''\r\n ? null\r\n : Number(control.value) > schema.exclusiveMinimum!\r\n ? null\r\n : { exclusiveMinimum: true }\r\n );\r\n }\r\n\r\n if (schema.exclusiveMaximum !== undefined) {\r\n validators.push((control) =>\r\n control.value === null || control.value === undefined || control.value === ''\r\n ? null\r\n : Number(control.value) < schema.exclusiveMaximum!\r\n ? null\r\n : { exclusiveMaximum: true }\r\n );\r\n }\r\n\r\n if (schema.multipleOf !== undefined) {\r\n validators.push((control) => {\r\n if (control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n const numericValue = Number(control.value);\r\n return numericValue % schema.multipleOf! === 0 ? null : { multipleOf: true };\r\n });\r\n }\r\n\r\n if (schema.pattern) {\r\n validators.push(Validators.pattern(schema.pattern));\r\n }\r\n\r\n if (schema.format === 'email') {\r\n validators.push(Validators.email);\r\n }\r\n\r\n if (schema.minItems !== undefined) {\r\n validators.push((control) =>\r\n Array.isArray(control.value) && control.value.length < schema.minItems!\r\n ? { minItems: true }\r\n : null\r\n );\r\n }\r\n\r\n if (schema.maxItems !== undefined) {\r\n validators.push((control) =>\r\n Array.isArray(control.value) && control.value.length > schema.maxItems!\r\n ? { maxItems: true }\r\n : null\r\n );\r\n }\r\n\r\n if (schema.uniqueItems) {\r\n validators.push((control) => {\r\n if (!Array.isArray(control.value)) {\r\n return null;\r\n }\r\n const unique = new Set(control.value.map((item) => JSON.stringify(item)));\r\n return unique.size === control.value.length ? null : { uniqueItems: true };\r\n });\r\n }\r\n\r\n if (schema.minProperties !== undefined) {\r\n validators.push((control) => {\r\n if (!control.value || typeof control.value !== 'object') {\r\n return null;\r\n }\r\n return Object.keys(control.value).length < schema.minProperties!\r\n ? { minProperties: true }\r\n : null;\r\n });\r\n }\r\n\r\n if (schema.maxProperties !== undefined) {\r\n validators.push((control) => {\r\n if (!control.value || typeof control.value !== 'object') {\r\n return null;\r\n }\r\n return Object.keys(control.value).length > schema.maxProperties!\r\n ? { maxProperties: true }\r\n : null;\r\n });\r\n }\r\n\r\n if (resolvedType === 'integer') {\r\n validators.push((control) => {\r\n if (control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n\r\n const numericValue = Number(control.value);\r\n return Number.isInteger(numericValue) ? null : { integer: true };\r\n });\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n private isRecord(value: unknown): value is Record<string, unknown> {\r\n return !!value && typeof value === 'object' && !Array.isArray(value);\r\n }\r\n\r\n private mergeSchemas(schemas: JsonSchema[]): JsonSchema {\r\n return schemas.reduce((acc, schema) => {\r\n const merged: JsonSchema = {\r\n ...acc,\r\n ...schema,\r\n properties: { ...(acc.properties ?? {}), ...(schema.properties ?? {}) },\r\n patternProperties: { ...(acc.patternProperties ?? {}), ...(schema.patternProperties ?? {}) },\r\n required: Array.from(new Set([...(acc.required ?? []), ...(schema.required ?? [])])),\r\n };\r\n return merged;\r\n }, {} as JsonSchema);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { JsonSchema } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaResolverService {\r\n async resolve(schema: JsonSchema, baseUri?: string): Promise<JsonSchema> {\r\n const rootBase = baseUri ?? schema.$id ?? '';\r\n const localCache = new Map<string, JsonSchema>();\r\n const externalCache = new Map<string, JsonSchema>();\r\n return this.resolveRefs(schema, schema, rootBase, localCache, externalCache);\r\n }\r\n\r\n private async resolveRefs(\r\n current: JsonSchema,\r\n root: JsonSchema,\r\n baseUri: string,\r\n localCache: Map<string, JsonSchema>,\r\n externalCache: Map<string, JsonSchema>\r\n ): Promise<JsonSchema> {\r\n if (!current || typeof current !== 'object') {\r\n return current;\r\n }\r\n\r\n if (current.$ref) {\r\n const ref = current.$ref;\r\n if (ref.startsWith('#/')) {\r\n if (localCache.has(ref)) {\r\n return localCache.get(ref)!;\r\n }\r\n const resolved = this.resolvePointer(root, ref);\r\n if (resolved) {\r\n localCache.set(ref, resolved);\r\n return this.resolveRefs(resolved, root, baseUri, localCache, externalCache);\r\n }\r\n } else {\r\n const resolved = await this.resolveExternalRef(ref, baseUri, externalCache, localCache);\r\n if (resolved) {\r\n return resolved;\r\n }\r\n }\r\n }\r\n\r\n const next: JsonSchema = { ...current };\r\n\r\n if (next.properties) {\r\n const entries = await Promise.all(\r\n Object.entries(next.properties).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.properties = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.patternProperties) {\r\n const entries = await Promise.all(\r\n Object.entries(next.patternProperties).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.patternProperties = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.items && typeof next.items === 'object') {\r\n next.items = await this.resolveRefs(next.items as JsonSchema, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.prefixItems) {\r\n next.prefixItems = await Promise.all(\r\n next.prefixItems.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.additionalProperties && typeof next.additionalProperties === 'object') {\r\n next.additionalProperties = await this.resolveRefs(\r\n next.additionalProperties,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.additionalItems && typeof next.additionalItems === 'object') {\r\n next.additionalItems = await this.resolveRefs(\r\n next.additionalItems,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.unevaluatedProperties && typeof next.unevaluatedProperties === 'object') {\r\n next.unevaluatedProperties = await this.resolveRefs(\r\n next.unevaluatedProperties,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.unevaluatedItems && typeof next.unevaluatedItems === 'object') {\r\n next.unevaluatedItems = await this.resolveRefs(next.unevaluatedItems, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.contains) {\r\n next.contains = await this.resolveRefs(next.contains, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.oneOf) {\r\n next.oneOf = await Promise.all(\r\n next.oneOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.anyOf) {\r\n next.anyOf = await Promise.all(\r\n next.anyOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.allOf) {\r\n next.allOf = await Promise.all(\r\n next.allOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.not) {\r\n next.not = await this.resolveRefs(next.not, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.if) {\r\n next.if = await this.resolveRefs(next.if, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.then) {\r\n next.then = await this.resolveRefs(next.then, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.else) {\r\n next.else = await this.resolveRefs(next.else, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.dependencies) {\r\n const entries = await Promise.all(\r\n Object.entries(next.dependencies).map(async ([key, value]) => {\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return [key, await this.resolveRefs(value as JsonSchema, root, baseUri, localCache, externalCache)];\r\n }\r\n return [key, value];\r\n })\r\n );\r\n next.dependencies = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.dependentSchemas) {\r\n const entries = await Promise.all(\r\n Object.entries(next.dependentSchemas).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.dependentSchemas = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.$defs) {\r\n const entries = await Promise.all(\r\n Object.entries(next.$defs).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.$defs = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.definitions) {\r\n const entries = await Promise.all(\r\n Object.entries(next.definitions).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.definitions = Object.fromEntries(entries);\r\n }\r\n\r\n return next;\r\n }\r\n\r\n private async resolveExternalRef(\r\n ref: string,\r\n baseUri: string,\r\n externalCache: Map<string, JsonSchema>,\r\n localCache: Map<string, JsonSchema>\r\n ): Promise<JsonSchema | null> {\r\n try {\r\n const url = new URL(ref, baseUri || window.location.href).toString();\r\n if (externalCache.has(url)) {\r\n return externalCache.get(url)!;\r\n }\r\n\r\n const { schema, fragment } = await this.fetchSchema(url);\r\n if (!schema) {\r\n return null;\r\n }\r\n\r\n const target = fragment ? this.resolvePointer(schema, fragment) : schema;\r\n if (!target) {\r\n return null;\r\n }\r\n\r\n const resolved = await this.resolveRefs(target, schema, schema.$id ?? url, localCache, externalCache);\r\n externalCache.set(url, resolved);\r\n return resolved;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private async fetchSchema(url: string): Promise<{ schema: JsonSchema | null; fragment: string | null }> {\r\n const [base, hash] = url.split('#');\r\n const fragment = hash ? `#/${hash.replace(/^\\//, '')}` : null;\r\n const response = await fetch(base, { headers: { Accept: 'application/json' } });\r\n if (!response.ok) {\r\n return { schema: null, fragment: null };\r\n }\r\n const schema = (await response.json()) as JsonSchema;\r\n return { schema, fragment };\r\n }\r\n\r\n private resolvePointer(root: JsonSchema, ref: string): JsonSchema | null {\r\n const pointer = ref.replace(/^#\\//, '');\r\n const parts = pointer.split('/').map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'));\r\n let current: any = root;\r\n for (const part of parts) {\r\n if (current && typeof current === 'object' && part in current) {\r\n current = current[part];\r\n } else {\r\n return null;\r\n }\r\n }\r\n return current as JsonSchema;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport Ajv, { ErrorObject } from 'ajv';\r\nimport Ajv2019 from 'ajv/dist/2019';\r\nimport Ajv2020 from 'ajv/dist/2020';\r\nimport addFormats from 'ajv-formats';\r\nimport AjvDraft04 from 'ajv-draft-04';\r\nimport { JsonSchema, SchemaError } from './types';\r\n\r\nexport type JsonSchemaDraft = 'draft4' | 'draft6' | 'draft7' | 'draft2019' | 'draft2020';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaValidationService {\r\n private readonly ajvCache = new Map<JsonSchemaDraft, Ajv>();\r\n\r\n validate(schema: JsonSchema, value: unknown): ErrorObject[] {\r\n const draft = this.detectDraft(schema);\r\n const ajv = this.getAjv(draft);\r\n const validate = ajv.compile(schema as object);\r\n const valid = validate(value);\r\n if (valid) {\r\n return [];\r\n }\r\n return validate.errors ?? [];\r\n }\r\n\r\n /**\r\n * Validates the schema itself against its JSON Schema meta-schema.\r\n * Returns a list of SchemaError describing what is wrong in the schema definition.\r\n */\r\n validateSchema(schema: JsonSchema): SchemaError[] {\r\n const draft = this.detectDraft(schema);\r\n const ajv = this.getAjv(draft);\r\n\r\n try {\r\n const valid = ajv.validateSchema(schema as object);\r\n if (valid) return [];\r\n return (ajv.errors ?? []).map((e) => ({\r\n path: e.instancePath || '/',\r\n message: e.message ?? e.keyword,\r\n keyword: e.keyword,\r\n }));\r\n } catch (e) {\r\n // ajv.validateSchema throws when the schema is so broken it cannot be compiled.\r\n // The error message contains comma-separated individual violations — split them.\r\n const raw = e instanceof Error ? e.message : String(e);\r\n // Strip the \"schema is invalid: \" prefix if present\r\n const body = raw.replace(/^schema is invalid:\\s*/i, '');\r\n // Each violation looks like \"data/some/path must ...\" — extract path and message\r\n return body.split(', ').map((msg) => {\r\n const trimmed = msg.trim();\r\n const match = trimmed.match(/^(data[^\\s]*)\\s+(.+)$/);\r\n return match\r\n ? { path: match[1].replace(/^data/, '') || '/', message: match[2], keyword: 'schema' }\r\n : { path: '/', message: trimmed, keyword: 'schema' };\r\n });\r\n }\r\n }\r\n\r\n detectDraft(schema: JsonSchema): JsonSchemaDraft {\r\n const schemaId = schema.$schema ?? '';\r\n if (schemaId.includes('draft-04')) {\r\n return 'draft4';\r\n }\r\n if (schemaId.includes('draft-06')) {\r\n return 'draft6';\r\n }\r\n if (schemaId.includes('draft-07')) {\r\n return 'draft7';\r\n }\r\n if (schemaId.includes('2019-09')) {\r\n return 'draft2019';\r\n }\r\n if (schemaId.includes('2020-12')) {\r\n return 'draft2020';\r\n }\r\n\r\n if (schema.$defs) {\r\n return 'draft2020';\r\n }\r\n if (schema.definitions) {\r\n return 'draft7';\r\n }\r\n\r\n return 'draft2020';\r\n }\r\n\r\n private getAjv(draft: JsonSchemaDraft): Ajv {\r\n if (this.ajvCache.has(draft)) {\r\n return this.ajvCache.get(draft)!;\r\n }\r\n\r\n let ajv: Ajv;\r\n switch (draft) {\r\n case 'draft4':\r\n ajv = new AjvDraft04({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft2019':\r\n ajv = new Ajv2019({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft6':\r\n case 'draft7':\r\n ajv = new Ajv({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft2020':\r\n default:\r\n ajv = new Ajv2020({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n }\r\n\r\n addFormats(ajv);\r\n this.ajvCache.set(draft, ajv);\r\n return ajv;\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n OnInit,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AbstractControl, FormArray, FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { JsonSchema, JsonSchemaType } from './types';\r\nimport { JsonSchemaFormService } from './json-schema-form.service';\r\nimport { JsonSchemaValidationService } from './json-schema-validation.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'jsm-schema-node',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n styles: [`\r\n /* ── Layout ── */\r\n .jsm-field { display:flex; flex-direction:column; gap:.375rem; }\r\n .jsm-field-label { display:block; font-size:.8125rem; font-weight:600; color:#374151; }\r\n .jsm-field-hint { font-size:.75rem; color:#6b7280; margin:0; line-height:1.4; }\r\n .jsm-required { color:#ef4444; margin-left:.125rem; }\r\n .jsm-example { font-size:.6875rem; color:#9ca3af; }\r\n\r\n /* ── Inputs ── */\r\n .jsm-input, .jsm-textarea, .jsm-select {\r\n width:100%; border-radius:.5rem; border:1.5px solid #d1d5db;\r\n background:Canvas; padding:.5rem .75rem; font-size:.875rem; color:CanvasText;\r\n outline:none; box-shadow:0 1px 2px rgba(0,0,0,.04);\r\n transition:border-color .15s, box-shadow .15s;\r\n font-family:inherit; box-sizing:border-box;\r\n }\r\n .jsm-input:hover, .jsm-textarea:hover, .jsm-select:hover { border-color:#9ca3af; }\r\n .jsm-input:focus, .jsm-textarea:focus, .jsm-select:focus {\r\n border-color:#6366f1; box-shadow:0 0 0 3px rgba(99,102,241,.15);\r\n }\r\n .jsm-input--error, .jsm-textarea--error, .jsm-select--error {\r\n border-color:#f87171 !important; background:#fff5f5;\r\n }\r\n .jsm-input--error:focus, .jsm-textarea--error:focus, .jsm-select--error:focus {\r\n box-shadow:0 0 0 3px rgba(248,113,113,.2) !important;\r\n }\r\n .jsm-textarea { resize:vertical; min-height:6rem; }\r\n\r\n /* ── Select wrapper ── */\r\n .jsm-select-wrap { position:relative; }\r\n .jsm-select { appearance:none; padding-right:2.25rem; cursor:pointer; }\r\n .jsm-select-chevron {\r\n position:absolute; right:.625rem; top:50%; transform:translateY(-50%);\r\n width:1rem; height:1rem; color:#9ca3af; pointer-events:none;\r\n }\r\n\r\n /* ── Toggle switch ── */\r\n .jsm-toggle-label { display:inline-flex; align-items:center; gap:.625rem; cursor:pointer; user-select:none; }\r\n .jsm-toggle-track {\r\n position:relative; display:inline-flex; align-items:center;\r\n width:2.25rem; height:1.25rem; border-radius:9999px; flex-shrink:0;\r\n background:#d1d5db; transition:background .2s;\r\n }\r\n .jsm-toggle-track.jsm-on { background:#4f46e5; }\r\n .jsm-toggle-thumb {\r\n display:inline-block; width:1rem; height:1rem; border-radius:9999px;\r\n background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.2);\r\n transform:translateX(.125rem); transition:transform .2s;\r\n }\r\n .jsm-toggle-track.jsm-on .jsm-toggle-thumb { transform:translateX(1.125rem); }\r\n .jsm-toggle-text { font-size:.875rem; font-weight:500; color:#374151; }\r\n\r\n /* ── Buttons ── */\r\n .jsm-btn-primary {\r\n display:inline-flex; align-items:center; gap:.25rem;\r\n padding:.375rem .75rem; border-radius:.5rem; font-size:.8125rem;\r\n font-weight:600; background:#4f46e5; color:#fff; border:none;\r\n cursor:pointer; box-shadow:0 1px 2px rgba(79,70,229,.3);\r\n transition:background .15s, transform .1s, box-shadow .15s;\r\n white-space:nowrap; font-family:inherit;\r\n }\r\n .jsm-btn-primary:hover { background:#4338ca; transform:translateY(-1px); box-shadow:0 3px 8px rgba(79,70,229,.3); }\r\n .jsm-btn-primary:active { transform:translateY(0); }\r\n .jsm-btn-primary:disabled { opacity:.45; cursor:not-allowed; transform:none; }\r\n .jsm-btn-danger {\r\n display:inline-flex; align-items:center; gap:.25rem;\r\n padding:.25rem .5rem; border-radius:.375rem; font-size:.75rem;\r\n font-weight:600; background:transparent; color:#dc2626;\r\n border:1.5px solid #fca5a5; cursor:pointer;\r\n transition:background .15s, border-color .15s; font-family:inherit;\r\n }\r\n .jsm-btn-danger:hover { background:#fee2e2; border-color:#f87171; }\r\n\r\n /* ── Errors ── */\r\n .jsm-error-list { display:flex; flex-direction:column; gap:.25rem; margin-top:.25rem; }\r\n .jsm-error-msg { display:flex; align-items:center; gap:.375rem; font-size:.75rem; color:#dc2626; font-weight:500; }\r\n .jsm-error-icon { width:.875rem; height:.875rem; flex-shrink:0; }\r\n\r\n /* ── Badges ── */\r\n .jsm-badge-row { display:flex; flex-wrap:wrap; gap:.375rem; }\r\n .jsm-badge {\r\n display:inline-flex; align-items:center; border-radius:9999px;\r\n padding:.125rem .5rem; font-size:.6875rem; font-weight:600;\r\n letter-spacing:.02em; text-transform:uppercase;\r\n }\r\n .jsm-badge--deprecated { background:#fef3c7; color:#92400e; }\r\n .jsm-badge--readonly { background:#f1f5f9; color:#475569; }\r\n .jsm-badge--writeonly { background:#dbeafe; color:#1e40af; }\r\n .jsm-badge--not { background:#fee2e2; color:#991b1b; }\r\n .jsm-badge--nullable { background:#f3f4f6; color:#6b7280; }\r\n\r\n /* ── Object fieldset ── */\r\n .jsm-fieldset {\r\n border:1.5px solid #e5e7eb; border-radius:.875rem; padding:1.25rem;\r\n background:transparent; box-shadow:0 1px 3px rgba(0,0,0,.06);\r\n transition:box-shadow .2s; box-sizing:border-box;\r\n }\r\n .jsm-fieldset:focus-within { border-color:#c7d2fe; box-shadow:0 0 0 3px rgba(99,102,241,.08),0 1px 3px rgba(0,0,0,.06); }\r\n .jsm-legend { display:inline-flex; align-items:center; gap:.375rem; padding:0 .5rem; font-size:.875rem; font-weight:700; color:#1f2937; }\r\n .jsm-obj-grid { display:grid; grid-template-columns:1fr; gap:1rem; }\r\n @media(min-width:640px){ .jsm-obj-grid { grid-template-columns:repeat(2,1fr); } }\r\n .jsm-obj-complex { display:flex; flex-direction:column; gap:1rem; margin-top:1rem; }\r\n .jsm-dynamic-key-header {\r\n display:flex; align-items:center; justify-content:space-between;\r\n padding:.25rem .5rem; background:#f9fafb; border-radius:.375rem;\r\n border:1px dashed #d1d5db; margin-bottom:.25rem;\r\n }\r\n .jsm-dynamic-key-label { font-size:.75rem; font-weight:600; color:#6b7280; font-family:monospace; }\r\n .jsm-add-prop {\r\n margin-top:1rem; padding:.875rem; background:#f9fafb;\r\n border-radius:.625rem; border:1.5px dashed #d1d5db;\r\n display:flex; flex-direction:column; gap:.5rem;\r\n }\r\n .jsm-add-prop-label { font-size:.75rem; font-weight:600; color:#6b7280; text-transform:uppercase; letter-spacing:.04em; }\r\n .jsm-add-prop-row { display:flex; gap:.5rem; align-items:center; }\r\n .jsm-input--sm { padding:.375rem .625rem; font-size:.8125rem; }\r\n\r\n /* ── Array ── */\r\n .jsm-array-block { display:flex; flex-direction:column; gap:.75rem; }\r\n .jsm-array-header { display:flex; align-items:flex-start; justify-content:space-between; gap:.5rem; }\r\n .jsm-array-title { font-size:.875rem; font-weight:700; color:#1f2937; display:flex; align-items:center; gap:.375rem; }\r\n .jsm-array-items { display:flex; flex-direction:column; gap:.75rem; }\r\n .jsm-array-item {\r\n border:1.5px solid #e5e7eb; border-radius:.75rem; padding:.875rem;\r\n background:transparent; box-shadow:0 1px 2px rgba(0,0,0,.04);\r\n transition:border-color .15s, box-shadow .15s;\r\n }\r\n .jsm-array-item:focus-within { border-color:#c7d2fe; box-shadow:0 0 0 3px rgba(99,102,241,.08); }\r\n .jsm-array-item-header { display:flex; align-items:center; justify-content:space-between; margin-bottom:.75rem; }\r\n .jsm-array-index {\r\n display:inline-flex; align-items:center; justify-content:center;\r\n width:1.5rem; height:1.5rem; border-radius:9999px;\r\n background:#eef2ff; color:#4f46e5; font-size:.6875rem; font-weight:700;\r\n }\r\n .jsm-empty-array {\r\n display:flex; flex-direction:column; align-items:center; gap:.5rem;\r\n padding:2rem 1rem; border:1.5px dashed #e5e7eb; border-radius:.75rem;\r\n color:#9ca3af; font-size:.8125rem; text-align:center;\r\n }\r\n .jsm-contains-hint {\r\n display:flex; align-items:center; gap:.375rem; font-size:.75rem;\r\n color:#6366f1; background:#eef2ff; border-radius:.375rem; padding:.375rem .625rem;\r\n }\r\n\r\n /* ── Combinators ── */\r\n .jsm-combinator { border:1.5px solid #e5e7eb; border-radius:.875rem; overflow:hidden; background:transparent; box-shadow:0 1px 3px rgba(0,0,0,.06); }\r\n .jsm-combinator-header { display:flex; align-items:flex-start; justify-content:space-between; padding:.875rem 1rem; background:rgba(0,0,0,.03); border-bottom:1.5px solid #e5e7eb; }\r\n .jsm-combinator-title { font-size:.875rem; font-weight:700; color:#1f2937; }\r\n .jsm-combinator-body { padding:1rem; }\r\n .jsm-combinator-hint { font-size:.75rem; color:#6b7280; margin:.25rem 0 0; }\r\n .jsm-oneof-tabs { display:flex; overflow-x:auto; border-bottom:1.5px solid #e5e7eb; }\r\n .jsm-tab {\r\n padding:.5rem 1rem; font-size:.8125rem; font-weight:500; color:#6b7280;\r\n border:none; background:transparent; cursor:pointer;\r\n border-bottom:2px solid transparent; margin-bottom:-1.5px;\r\n transition:color .15s, border-color .15s; white-space:nowrap; font-family:inherit;\r\n }\r\n .jsm-tab:hover { color:#4f46e5; }\r\n .jsm-tab--active { color:#4f46e5; border-bottom-color:#4f46e5; font-weight:600; }\r\n .jsm-anyof-options { display:flex; flex-wrap:wrap; gap:.5rem; padding:.75rem 1rem; border-bottom:1.5px solid #e5e7eb; }\r\n .jsm-anyof-option {\r\n display:inline-flex; align-items:center; gap:.375rem; padding:.375rem .75rem;\r\n border-radius:9999px; border:1.5px solid #e5e7eb; font-size:.8125rem;\r\n font-weight:500; color:#6b7280; cursor:pointer; transition:all .15s; background:transparent;\r\n }\r\n .jsm-anyof-option:hover { border-color:#a5b4fc; color:#4f46e5; }\r\n .jsm-anyof-option--active { border-color:#6366f1; background:#eef2ff; color:#4f46e5; }\r\n .jsm-allof-section { border-left:3px solid #e0e7ff; padding-left:1rem; }\r\n .jsm-combinator-badge {\r\n display:inline-flex; align-items:center; border-radius:9999px;\r\n padding:.125rem .5rem; font-size:.6875rem; font-weight:700;\r\n text-transform:uppercase; letter-spacing:.04em; flex-shrink:0; margin-left:.75rem;\r\n }\r\n .jsm-badge--oneof { background:#dbeafe; color:#1e40af; }\r\n .jsm-badge--anyof { background:#ede9fe; color:#5b21b6; }\r\n .jsm-badge--allof { background:#ccfbf1; color:#065f46; }\r\n\r\n /* ── Dark mode ── */\r\n .dark .jsm-field-label { color:#d1d5db; }\r\n .dark .jsm-field-hint { color:#9ca3af; }\r\n .dark .jsm-toggle-track { background:#475569; }\r\n .dark .jsm-toggle-track.jsm-on { background:#4f46e5; }\r\n .dark .jsm-toggle-text { color:#d1d5db; }\r\n .dark .jsm-input, .dark .jsm-textarea, .dark .jsm-select {\r\n border-color:#475569; color:#f1f5f9;\r\n }\r\n .dark .jsm-input:focus, .dark .jsm-textarea:focus, .dark .jsm-select:focus {\r\n border-color:#6366f1; box-shadow:0 0 0 3px rgba(99,102,241,.2);\r\n }\r\n .dark .jsm-input--error, .dark .jsm-textarea--error, .dark .jsm-select--error {\r\n border-color:#f87171 !important; background:rgba(248,113,113,.1);\r\n }\r\n .dark .jsm-fieldset { border-color:#334155; }\r\n .dark .jsm-fieldset:focus-within { border-color:#6366f1; }\r\n .dark .jsm-legend { color:#f1f5f9; }\r\n .dark .jsm-combinator { border-color:#334155; }\r\n .dark .jsm-combinator-header { background:rgba(255,255,255,.04); border-color:#334155; }\r\n .dark .jsm-combinator-title { color:#f1f5f9; }\r\n .dark .jsm-oneof-tabs { border-color:#334155; }\r\n .dark .jsm-tab { color:#94a3b8; }\r\n .dark .jsm-tab--active { color:#818cf8; border-bottom-color:#818cf8; }\r\n .dark .jsm-anyof-options { border-color:#334155; }\r\n .dark .jsm-anyof-option { border-color:#334155; color:#94a3b8; background:#0f172a; }\r\n .dark .jsm-anyof-option--active { border-color:#6366f1; background:rgba(99,102,241,.15); color:#818cf8; }\r\n .dark .jsm-allof-section { border-left-color:#3730a3; }\r\n .dark .jsm-array-item { border-color:#334155; }\r\n .dark .jsm-array-item:focus-within { border-color:#6366f1; }\r\n .dark .jsm-array-index { background:rgba(99,102,241,.2); color:#818cf8; }\r\n .dark .jsm-empty-array { border-color:#334155; color:#64748b; }\r\n .dark .jsm-contains-hint { background:rgba(99,102,241,.15); color:#818cf8; }\r\n .dark .jsm-add-prop { background:rgba(30,41,59,.4); border-color:#475569; }\r\n .dark .jsm-add-prop-label { color:#64748b; }\r\n .dark .jsm-dynamic-key-header { background:rgba(30,41,59,.5); border-color:#475569; }\r\n .dark .jsm-dynamic-key-label { color:#94a3b8; }\r\n .dark .jsm-error-msg { color:#f87171; }\r\n .dark .jsm-array-title { color:#f1f5f9; }\r\n .dark .jsm-badge--deprecated { background:rgba(217,119,6,.2); color:#fbbf24; }\r\n .dark .jsm-badge--readonly { background:#1e293b; color:#94a3b8; }\r\n .dark .jsm-badge--writeonly { background:rgba(37,99,235,.2); color:#60a5fa; }\r\n .dark .jsm-badge--not { background:rgba(220,38,38,.2); color:#f87171; }\r\n .dark .jsm-badge--nullable { background:#1e293b; color:#94a3b8; }\r\n .dark .jsm-select-chevron { color:#64748b; }\r\n `],\r\n template: `\r\n <ng-container [ngSwitch]=\"nodeKind\">\r\n\r\n <!-- ═══ oneOf ═══ -->\r\n <div *ngSwitchCase=\"'oneOf'\" class=\"jsm-combinator\">\r\n <div class=\"jsm-combinator-header\">\r\n <div>\r\n <p class=\"jsm-combinator-title\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"jsm-combinator-hint\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"jsm-combinator-badge jsm-badge--oneof\">oneOf</span>\r\n </div>\r\n <div class=\"jsm-oneof-tabs\">\r\n <button *ngFor=\"let option of schema.oneOf; let i = index\" type=\"button\"\r\n class=\"jsm-tab\" [class.jsm-tab--active]=\"selectedOneOf === i\"\r\n (click)=\"selectedOneOf = i; onOneOfChange()\">\r\n {{ option.title || ('Option ' + (i + 1)) }}\r\n </button>\r\n </div>\r\n <div class=\"jsm-combinator-body\" *ngIf=\"activeVariant\">\r\n <jsm-schema-node [schema]=\"activeVariant\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"label\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══ anyOf ═══ -->\r\n <div *ngSwitchCase=\"'anyOf'\" class=\"jsm-combinator\">\r\n <div class=\"jsm-combinator-header\">\r\n <div>\r\n <p class=\"jsm-combinator-title\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"jsm-combinator-hint\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"jsm-combinator-badge jsm-badge--anyof\">anyOf</span>\r\n </div>\r\n <div class=\"jsm-anyof-options\">\r\n <label *ngFor=\"let option of schema.anyOf; let i = index\"\r\n class=\"jsm-anyof-option\" [class.jsm-anyof-option--active]=\"selectedAnyOf.has(i)\">\r\n <input type=\"checkbox\" class=\"sr-only\" [checked]=\"selectedAnyOf.has(i)\" (change)=\"toggleAnyOf(i)\" />\r\n {{ option.title || ('Option ' + (i + 1)) }}\r\n </label>\r\n </div>\r\n <div class=\"jsm-combinator-body\" *ngIf=\"activeVariant\">\r\n <jsm-schema-node [schema]=\"activeVariant\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"label\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══ allOf ═══ -->\r\n <div *ngSwitchCase=\"'allOf'\" class=\"jsm-combinator\">\r\n <div class=\"jsm-combinator-header\">\r\n <div>\r\n <p class=\"jsm-combinator-title\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"jsm-combinator-hint\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"jsm-combinator-badge jsm-badge--allof\">allOf</span>\r\n </div>\r\n <div class=\"jsm-combinator-body\">\r\n <div *ngFor=\"let subSchema of mergedAllOf; let i = index\" class=\"jsm-allof-section\">\r\n <jsm-schema-node [schema]=\"subSchema\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"subSchema.title || ('Section ' + (i + 1))\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══ object ═══ -->\r\n <fieldset *ngSwitchCase=\"'object'\" class=\"jsm-fieldset\">\r\n <legend class=\"jsm-legend\">{{ schema.title || label }}</legend>\r\n <p *ngIf=\"schema.description\" class=\"jsm-field-hint\" style=\"margin-bottom:.75rem;margin-top:.25rem;\">{{ schema.description }}</p>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"jsm-badge-row\" style=\"margin-bottom:.75rem;\">\r\n <span *ngFor=\"let badge of metaBadges\" class=\"jsm-badge\" [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <div class=\"jsm-obj-grid\" [formGroup]=\"controlAsGroup\">\r\n <ng-container *ngFor=\"let key of simpleKeys\">\r\n <div style=\"display:flex;flex-direction:column;gap:.25rem;\">\r\n <div *ngIf=\"isDynamicKey(key)\" class=\"jsm-dynamic-key-header\">\r\n <span class=\"jsm-dynamic-key-label\">{{ key }}</span>\r\n <button type=\"button\" class=\"jsm-btn-danger\" (click)=\"removeDynamicKey(key)\">Remove</button>\r\n </div>\r\n <jsm-schema-node [schema]=\"schemaForKey(key)\" [control]=\"childControl(key)\" [parent]=\"controlAsGroup\"\r\n [controlKey]=\"key\" [path]=\"pathForChild(key)\" [errorsMap]=\"errorsMap\" [label]=\"key\"\r\n [required]=\"isRequired(key)\" [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"jsm-obj-complex\" *ngIf=\"complexKeys.length > 0\" [formGroup]=\"controlAsGroup\">\r\n <ng-container *ngFor=\"let key of complexKeys\">\r\n <div style=\"display:flex;flex-direction:column;gap:.25rem;\">\r\n <div *ngIf=\"isDynamicKey(key)\" class=\"jsm-dynamic-key-header\">\r\n <span class=\"jsm-dynamic-key-label\">{{ key }}</span>\r\n <button type=\"button\" class=\"jsm-btn-danger\" (click)=\"removeDynamicKey(key)\">Remove</button>\r\n </div>\r\n <jsm-schema-node [schema]=\"schemaForKey(key)\" [control]=\"childControl(key)\" [parent]=\"controlAsGroup\"\r\n [controlKey]=\"key\" [path]=\"pathForChild(key)\" [errorsMap]=\"errorsMap\" [label]=\"key\"\r\n [required]=\"isRequired(key)\" [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"canAddProperty\" class=\"jsm-add-prop\">\r\n <p class=\"jsm-add-prop-label\">Add property</p>\r\n <div class=\"jsm-add-prop-row\">\r\n <input class=\"jsm-input jsm-input--sm\" style=\"flex:1;\" [(ngModel)]=\"newPropertyKey\" placeholder=\"propertyName\" />\r\n <button type=\"button\" class=\"jsm-btn-primary\" (click)=\"addDynamicProperty()\">Add</button>\r\n </div>\r\n <p *ngIf=\"propertyError\" class=\"jsm-error-msg\">\r\n <svg class=\"jsm-error-icon\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ propertyError }}\r\n </p>\r\n </div>\r\n\r\n <div *ngIf=\"errorsForPath.length\" class=\"jsm-error-list\" style=\"margin-top:.75rem;\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"jsm-error-msg\">\r\n <svg class=\"jsm-error-icon\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </fieldset>\r\n\r\n <!-- ═══ array ═══ -->\r\n <div *ngSwitchCase=\"'array'\" class=\"jsm-array-block\">\r\n <div class=\"jsm-array-header\">\r\n <div>\r\n <p class=\"jsm-array-title\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" style=\"color:#ef4444;margin-left:.125rem;\">*</span>\r\n </p>\r\n <p *ngIf=\"schema.description\" class=\"jsm-field-hint\">{{ schema.description }}</p>\r\n </div>\r\n <button type=\"button\" class=\"jsm-btn-primary\" (click)=\"addArrayItem()\" [disabled]=\"!canAddArrayItem\">\r\n <svg style=\"width:.875rem;height:.875rem;flex-shrink:0;\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M8 3v10M3 8h10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n Add item\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"effectiveSchema.contains\" class=\"jsm-contains-hint\">\r\n Must contain matching item(s)\r\n <span *ngIf=\"effectiveSchema.minContains\"> · min {{ effectiveSchema.minContains }}</span>\r\n <span *ngIf=\"effectiveSchema.maxContains\"> · max {{ effectiveSchema.maxContains }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"jsm-badge-row\">\r\n <span *ngFor=\"let badge of metaBadges\" class=\"jsm-badge\" [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <div class=\"jsm-array-items\" *ngIf=\"arrayControls.length > 0; else emptyArray\">\r\n <div *ngFor=\"let item of arrayControls; let i = index\" class=\"jsm-array-item\">\r\n <div class=\"jsm-array-item-header\">\r\n <span class=\"jsm-array-index\">{{ i + 1 }}</span>\r\n <button type=\"button\" class=\"jsm-btn-danger\" (click)=\"removeArrayItem(i)\">Remove</button>\r\n </div>\r\n <jsm-schema-node [schema]=\"schemaForIndex(i)\" [control]=\"item\" [parent]=\"controlAsArray\"\r\n [controlKey]=\"i\" [path]=\"pathForChild(i)\" [errorsMap]=\"errorsMap\" [label]=\"label + ' item'\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <ng-template #emptyArray>\r\n <div class=\"jsm-empty-array\">No items yet — click \"Add item\" to start.</div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"errorsForPath.length\" class=\"jsm-error-list\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"jsm-error-msg\">\r\n <svg class=\"jsm-error-icon\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══ primitive ═══ -->\r\n <div *ngSwitchDefault class=\"jsm-field\">\r\n <ng-container *ngIf=\"inputKind !== 'checkbox'\">\r\n <label class=\"jsm-field-label\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"jsm-required\">*</span>\r\n </label>\r\n <p *ngIf=\"schema.description\" class=\"jsm-field-hint\">{{ schema.description }}</p>\r\n </ng-container>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"jsm-badge-row\">\r\n <span *ngFor=\"let badge of metaBadges\" class=\"jsm-badge\" [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <ng-container [ngSwitch]=\"inputKind\">\r\n <input *ngSwitchCase=\"'text'\" class=\"jsm-input\"\r\n [class.jsm-input--error]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [attr.type]=\"inputType\" [attr.placeholder]=\"schema.title || label\"\r\n [formControl]=\"controlAsFormControl\" />\r\n\r\n <textarea *ngSwitchCase=\"'textarea'\" rows=\"4\" class=\"jsm-textarea\"\r\n [class.jsm-textarea--error]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [attr.placeholder]=\"schema.title || label\"\r\n [formControl]=\"controlAsFormControl\"></textarea>\r\n\r\n <div *ngSwitchCase=\"'select'\" class=\"jsm-select-wrap\">\r\n <select class=\"jsm-select\"\r\n [class.jsm-select--error]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [formControl]=\"controlAsFormControl\">\r\n <option *ngFor=\"let option of effectiveSchema.enum\" [ngValue]=\"option\">{{ option }}</option>\r\n </select>\r\n <svg class=\"jsm-select-chevron\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n\r\n <label *ngSwitchCase=\"'checkbox'\" class=\"jsm-toggle-label\">\r\n <span class=\"jsm-toggle-track\" [class.jsm-on]=\"controlAsFormControl.value\">\r\n <input type=\"checkbox\" class=\"sr-only\" [formControl]=\"controlAsFormControl\" />\r\n <span class=\"jsm-toggle-thumb\"></span>\r\n </span>\r\n <span class=\"jsm-toggle-text\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"jsm-required\">*</span>\r\n </span>\r\n </label>\r\n </ng-container>\r\n\r\n <p *ngIf=\"inputKind === 'checkbox' && schema.description\" class=\"jsm-field-hint\">{{ schema.description }}</p>\r\n <p *ngIf=\"effectiveSchema.examples?.length\" class=\"jsm-example\">e.g. {{ effectiveSchema.examples?.[0] }}</p>\r\n <p *ngIf=\"effectiveSchema.contentMediaType\" class=\"jsm-example\">\r\n {{ effectiveSchema.contentMediaType }}<span *ngIf=\"effectiveSchema.contentEncoding\"> ({{ effectiveSchema.contentEncoding }})</span>\r\n </p>\r\n\r\n <div *ngIf=\"errorsForPath.length && controlAsFormControl.dirty\" class=\"jsm-error-list\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"jsm-error-msg\">\r\n <svg class=\"jsm-error-icon\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\r\n <path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class JsonSchemaNodeComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) schema!: JsonSchema;\r\n @Input({ required: true }) control!: AbstractControl;\r\n @Input() label = '';\r\n @Input() required = false;\r\n @Input() path = '';\r\n @Input() errorsMap = new Map<string, string[]>();\r\n @Input() parent?: FormGroup | FormArray;\r\n @Input() controlKey?: string | number;\r\n @Input() allowAdditionalProperties = false;\r\n\r\n @Output() controlReplaced = new EventEmitter<AbstractControl>();\r\n\r\n selectedOneOf = 0;\r\n selectedAnyOf = new Set<number>();\r\n newPropertyKey = '';\r\n propertyError = '';\r\n\r\n private valueSub?: Subscription;\r\n\r\n constructor(\r\n private readonly schemaService: JsonSchemaFormService,\r\n private readonly validation: JsonSchemaValidationService,\r\n private readonly cdr: ChangeDetectorRef,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.schema.anyOf?.length) this.selectedAnyOf.add(0);\r\n // Subscribe to value changes to trigger CD for OnPush (needed for toggle visual state)\r\n this.valueSub = this.control.valueChanges.subscribe(() => this.cdr.markForCheck());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.valueSub?.unsubscribe();\r\n }\r\n\r\n isSimpleChild(key: string): boolean {\r\n const s = this.schemaForKey(key);\r\n if (s.oneOf?.length || s.anyOf?.length || s.allOf?.length) return false;\r\n const t = this.schemaService.resolveType(s);\r\n return t !== 'object' && t !== 'array';\r\n }\r\n\r\n badgeClass(badge: string): string {\r\n if (badge === 'Deprecated') return 'jsm-badge--deprecated';\r\n if (badge === 'Read-only' || badge === 'Nullable') return 'jsm-badge--readonly';\r\n if (badge === 'Write-only') return 'jsm-badge--writeonly';\r\n if (badge === 'Not constraint') return 'jsm-badge--not';\r\n return 'jsm-badge--nullable';\r\n }\r\n\r\n get nodeKind(): 'oneOf' | 'anyOf' | 'allOf' | 'object' | 'array' | 'primitive' {\r\n if (this.schema.oneOf?.length) return 'oneOf';\r\n if (this.schema.anyOf?.length) return 'anyOf';\r\n if (this.schema.allOf?.length) return 'allOf';\r\n const r = this.resolvedType;\r\n if (r === 'object') return 'object';\r\n if (r === 'array') return 'array';\r\n return 'primitive';\r\n }\r\n\r\n get resolvedType(): JsonSchema['type'] | 'enum' {\r\n return this.schemaService.resolveType(this.effectiveSchema) ?? 'string';\r\n }\r\n\r\n get inputKind(): 'text' | 'textarea' | 'select' | 'checkbox' {\r\n if (this.effectiveSchema.enum) return 'select';\r\n if (this.resolvedType === 'boolean') return 'checkbox';\r\n if (this.effectiveSchema.format === 'textarea' || (this.effectiveSchema.maxLength ?? 0) > 200) return 'textarea';\r\n return 'text';\r\n }\r\n\r\n get inputType(): string {\r\n if (this.effectiveSchema.format === 'email') return 'email';\r\n if (this.effectiveSchema.format === 'date') return 'date';\r\n if (this.effectiveSchema.format === 'time') return 'time';\r\n if (this.effectiveSchema.format === 'date-time') return 'datetime-local';\r\n if (this.resolvedType === 'number' || this.resolvedType === 'integer') return 'number';\r\n if (this.effectiveSchema.format === 'password') return 'password';\r\n return 'text';\r\n }\r\n\r\n get controlAsGroup(): FormGroup { return this.control as FormGroup; }\r\n get controlAsFormControl(): FormControl { return this.control as FormControl; }\r\n get controlAsArray(): FormArray { return this.control as FormArray; }\r\n get arrayControls(): AbstractControl[] { return this.controlAsArray.controls; }\r\n get objectKeys(): string[] { return Object.keys(this.controlAsGroup.controls); }\r\n get simpleKeys(): string[] { return this.objectKeys.filter(k => this.isSimpleChild(k)); }\r\n get complexKeys(): string[] { return this.objectKeys.filter(k => !this.isSimpleChild(k)); }\r\n get canAddProperty(): boolean {\r\n if (!this.allowAdditionalProperties) return false;\r\n return this.effectiveSchema.additionalProperties !== false || !!this.effectiveSchema.patternProperties;\r\n }\r\n get errorsForPath(): string[] { return this.errorsMap.get(this.path) ?? []; }\r\n get metaBadges(): string[] {\r\n const b: string[] = [];\r\n if (this.effectiveSchema.deprecated) b.push('Deprecated');\r\n if (this.effectiveSchema.readOnly) b.push('Read-only');\r\n if (this.effectiveSchema.writeOnly) b.push('Write-only');\r\n if (this.effectiveSchema.nullable) b.push('Nullable');\r\n if (this.effectiveSchema.not) b.push('Not constraint');\r\n return b;\r\n }\r\n\r\n get activeVariant(): JsonSchema | null {\r\n if (this.schema.oneOf?.length) return this.schema.oneOf[this.selectedOneOf] ?? null;\r\n if (this.schema.anyOf?.length) {\r\n const sel = Array.from(this.selectedAnyOf).map(i => this.schema.anyOf![i]);\r\n return sel.length ? this.mergeSchemas(sel) : this.schema.anyOf[0] ?? null;\r\n }\r\n if (this.schema.allOf?.length) return this.mergeSchemas([this.schema, ...this.schema.allOf]);\r\n return this.effectiveSchema;\r\n }\r\n\r\n get mergedAllOf(): JsonSchema[] {\r\n return this.schema.allOf?.length ? [this.schema, ...this.schema.allOf] : [this.schema];\r\n }\r\n\r\n isRequired(key: string): boolean { return this.effectiveSchema.required?.includes(key) ?? false; }\r\n\r\n schemaForKey(key: string): JsonSchema {\r\n return this.effectiveSchema.properties?.[key] ?? this.schemaService.resolveDynamicSchema(this.effectiveSchema, key) ?? {};\r\n }\r\n\r\n isDynamicKey(key: string): boolean { return !this.effectiveSchema.properties?.[key]; }\r\n\r\n pathForChild(key: string | number): string {\r\n return this.path === '' ? `/${key}` : `${this.path}/${key}`;\r\n }\r\n\r\n addDynamicProperty(): void {\r\n this.propertyError = '';\r\n const key = this.newPropertyKey.trim();\r\n if (!key) { this.propertyError = 'Property name is required.'; return; }\r\n if (this.effectiveSchema.propertyNames) {\r\n if (this.validation.validate(this.effectiveSchema.propertyNames, key).length) {\r\n this.propertyError = 'Property name does not match schema constraints.'; return;\r\n }\r\n }\r\n if (this.controlAsGroup.contains(key)) { this.propertyError = 'Property already exists.'; return; }\r\n const s = this.schemaService.resolveDynamicSchema(this.effectiveSchema, key);\r\n if (!s) { this.propertyError = 'This property is not allowed by the schema.'; return; }\r\n this.controlAsGroup.addControl(key, this.schemaService.buildControl(s, undefined, false));\r\n this.newPropertyKey = '';\r\n }\r\n\r\n removeDynamicKey(key: string): void { this.controlAsGroup.removeControl(key); }\r\n\r\n schemaForIndex(index: number): JsonSchema {\r\n const p = this.effectiveSchema.prefixItems ?? [];\r\n if (p[index]) return p[index];\r\n if (this.effectiveSchema.items && this.effectiveSchema.items !== true) return this.effectiveSchema.items as JsonSchema;\r\n if (this.effectiveSchema.additionalItems && this.effectiveSchema.additionalItems !== true) return this.effectiveSchema.additionalItems as JsonSchema;\r\n if (this.effectiveSchema.unevaluatedItems && this.effectiveSchema.unevaluatedItems !== true) return this.effectiveSchema.unevaluatedItems as JsonSchema;\r\n return {};\r\n }\r\n\r\n get canAddArrayItem(): boolean {\r\n return !(this.effectiveSchema.items === false || this.effectiveSchema.additionalItems === false || this.effectiveSchema.unevaluatedItems === false);\r\n }\r\n\r\n addArrayItem(): void {\r\n if (!this.canAddArrayItem) return;\r\n const fa = this.controlAsArray;\r\n fa.push(this.schemaService.buildControl(this.schemaForIndex(fa.length), undefined, false));\r\n fa.markAsDirty();\r\n }\r\n\r\n removeArrayItem(index: number): void {\r\n this.controlAsArray.removeAt(index);\r\n this.controlAsArray.markAsDirty();\r\n }\r\n\r\n onOneOfChange(): void {\r\n if (!this.activeVariant) return;\r\n this.replaceControl(this.schemaService.buildControl(this.activeVariant, this.control.value, this.required));\r\n }\r\n\r\n toggleAnyOf(index: number): void {\r\n if (this.selectedAnyOf.has(index)) this.selectedAnyOf.delete(index);\r\n else this.selectedAnyOf.add(index);\r\n const v = this.activeVariant;\r\n if (v) this.replaceControl(this.schemaService.buildControl(v, this.control.value, this.required));\r\n }\r\n\r\n private replaceControl(control: AbstractControl): void {\r\n if (this.parent) {\r\n if (this.parent instanceof FormGroup && typeof this.controlKey === 'string') this.parent.setControl(this.controlKey, control);\r\n if (this.parent instanceof FormArray && typeof this.controlKey === 'number') this.parent.setControl(this.controlKey, control);\r\n this.control = control; return;\r\n }\r\n this.control = control;\r\n this.controlReplaced.emit(control);\r\n }\r\n\r\n childControl(key: string): AbstractControl { return this.controlAsGroup.get(key) as AbstractControl; }\r\n\r\n get effectiveSchema(): JsonSchema {\r\n let s = this.schema;\r\n if (s.allOf?.length) s = this.mergeSchemas([s, ...s.allOf]);\r\n s = this.applyConditional(s);\r\n s = this.applyDependencies(s);\r\n return s;\r\n }\r\n\r\n private applyConditional(schema: JsonSchema): JsonSchema {\r\n if (!schema.if) return schema;\r\n const errors = this.validation.validate(schema.if, this.control.value);\r\n const branch = errors.length === 0 ? schema.then : schema.else;\r\n if (!branch) return schema;\r\n return this.mergeSchemas([schema, branch]);\r\n }\r\n\r\n private applyDependencies(schema: JsonSchema): JsonSchema {\r\n const value = this.control.value;\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return schema;\r\n let merged = { ...schema } as JsonSchema;\r\n const keys = Object.keys(value as Record<string, unknown>);\r\n if (schema.dependentRequired) {\r\n for (const k of keys) { const r = schema.dependentRequired[k]; if (r?.length) merged = this.mergeSchemas([merged, { required: r }]); }\r\n }\r\n if (schema.dependentSchemas) {\r\n for (const k of keys) { const d = schema.dependentSchemas[k]; if (d) merged = this.mergeSchemas([merged, d]); }\r\n }\r\n if (schema.dependencies) {\r\n for (const k of keys) {\r\n const d = schema.dependencies[k];\r\n if (Array.isArray(d)) merged = this.mergeSchemas([merged, { required: d }]);\r\n else if (d) merged = this.mergeSchemas([merged, d]);\r\n }\r\n }\r\n return merged;\r\n }\r\n\r\n private mergeSchemas(schemas: JsonSchema[]): JsonSchema {\r\n return schemas.reduce((acc, s) => ({\r\n ...acc, ...s,\r\n properties: { ...(acc.properties ?? {}), ...(s.properties ?? {}) },\r\n patternProperties: { ...(acc.patternProperties ?? {}), ...(s.patternProperties ?? {}) },\r\n required: Array.from(new Set([...(acc.required ?? []), ...(s.required ?? [])])),\r\n ...(acc.type && s.type ? {\r\n type: Array.from(new Set([\r\n ...(Array.isArray(acc.type) ? acc.type : [acc.type]),\r\n ...(Array.isArray(s.type) ? s.type : [s.type]),\r\n ])) as JsonSchemaType[]\r\n } : {}),\r\n }), {} as JsonSchema);\r\n }\r\n}\r\n","// AUTO-GENERATED — do not edit manually. Run: node scripts/generate-lib-styles.mjs\nexport const JSM_CSS: string = \"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\\n@layer properties;\\n@layer theme, base, components, utilities;\\n@layer theme {\\n :root, :host {\\n --font-sans: ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\",\\n \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\",\\n \\\"Courier New\\\", monospace;\\n --color-red-50: oklch(97.1% 0.013 17.38);\\n --color-red-300: oklch(80.8% 0.114 19.571);\\n --color-red-700: oklch(50.5% 0.213 27.518);\\n --color-red-900: oklch(39.6% 0.141 25.723);\\n --color-amber-50: oklch(98.7% 0.022 95.277);\\n --color-amber-200: oklch(92.4% 0.12 95.746);\\n --color-amber-300: oklch(87.9% 0.169 91.605);\\n --color-amber-400: oklch(82.8% 0.189 84.429);\\n --color-amber-600: oklch(66.6% 0.179 58.318);\\n --color-amber-700: oklch(55.5% 0.163 48.998);\\n --color-amber-800: oklch(47.3% 0.137 46.201);\\n --color-amber-900: oklch(41.4% 0.112 45.904);\\n --color-emerald-50: oklch(97.9% 0.021 166.113);\\n --color-emerald-400: oklch(76.5% 0.177 163.223);\\n --color-emerald-700: oklch(50.8% 0.118 165.612);\\n --color-emerald-900: oklch(37.8% 0.077 168.94);\\n --color-indigo-100: oklch(93% 0.034 272.788);\\n --color-indigo-300: oklch(78.5% 0.115 274.713);\\n --color-indigo-400: oklch(67.3% 0.182 276.935);\\n --color-indigo-500: oklch(58.5% 0.233 277.117);\\n --color-indigo-600: oklch(51.1% 0.262 276.966);\\n --color-indigo-700: oklch(45.7% 0.24 277.023);\\n --color-indigo-900: oklch(35.9% 0.144 278.697);\\n --color-rose-50: oklch(96.9% 0.015 12.422);\\n --color-rose-400: oklch(71.2% 0.194 13.428);\\n --color-rose-500: oklch(64.5% 0.246 16.439);\\n --color-rose-600: oklch(58.6% 0.253 17.585);\\n --color-rose-700: oklch(51.4% 0.222 16.935);\\n --color-rose-900: oklch(41% 0.159 10.272);\\n --color-slate-50: oklch(98.4% 0.003 247.858);\\n --color-slate-100: oklch(96.8% 0.007 247.896);\\n --color-slate-200: oklch(92.9% 0.013 255.508);\\n --color-slate-300: oklch(86.9% 0.022 252.894);\\n --color-slate-400: oklch(70.4% 0.04 256.788);\\n --color-slate-500: oklch(55.4% 0.046 257.417);\\n --color-slate-600: oklch(44.6% 0.043 257.281);\\n --color-slate-700: oklch(37.2% 0.044 257.287);\\n --color-slate-800: oklch(27.9% 0.041 260.031);\\n --color-slate-900: oklch(20.8% 0.042 265.755);\\n --color-slate-950: oklch(12.9% 0.042 264.695);\\n --color-white: #fff;\\n --spacing: 0.25rem;\\n --container-2xl: 42rem;\\n --container-3xl: 48rem;\\n --container-6xl: 72rem;\\n --text-xs: 0.75rem;\\n --text-xs--line-height: calc(1 / 0.75);\\n --text-sm: 0.875rem;\\n --text-sm--line-height: calc(1.25 / 0.875);\\n --text-lg: 1.125rem;\\n --text-lg--line-height: calc(1.75 / 1.125);\\n --text-xl: 1.25rem;\\n --text-xl--line-height: calc(1.75 / 1.25);\\n --text-3xl: 1.875rem;\\n --text-3xl--line-height: calc(2.25 / 1.875);\\n --text-4xl: 2.25rem;\\n --text-4xl--line-height: calc(2.5 / 2.25);\\n --font-weight-medium: 500;\\n --font-weight-semibold: 600;\\n --font-weight-bold: 700;\\n --tracking-tight: -0.025em;\\n --tracking-wide: 0.025em;\\n --radius-lg: 0.5rem;\\n --radius-xl: 0.75rem;\\n --radius-2xl: 1rem;\\n --animate-spin: spin 1s linear infinite;\\n --default-transition-duration: 150ms;\\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n --default-font-family: var(--font-sans);\\n --default-mono-font-family: var(--font-mono);\\n }\\n}\\n@layer base {\\n *, ::after, ::before, ::backdrop, ::file-selector-button {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n border: 0 solid;\\n }\\n html, :host {\\n line-height: 1.5;\\n -webkit-text-size-adjust: 100%;\\n tab-size: 4;\\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");\\n font-feature-settings: var(--default-font-feature-settings, normal);\\n font-variation-settings: var(--default-font-variation-settings, normal);\\n -webkit-tap-highlight-color: transparent;\\n }\\n hr {\\n height: 0;\\n color: inherit;\\n border-top-width: 1px;\\n }\\n abbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n }\\n h1, h2, h3, h4, h5, h6 {\\n font-size: inherit;\\n font-weight: inherit;\\n }\\n a {\\n color: inherit;\\n -webkit-text-decoration: inherit;\\n text-decoration: inherit;\\n }\\n b, strong {\\n font-weight: bolder;\\n }\\n code, kbd, samp, pre {\\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);\\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\\n font-size: 1em;\\n }\\n small {\\n font-size: 80%;\\n }\\n sub, sup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n }\\n sub {\\n bottom: -0.25em;\\n }\\n sup {\\n top: -0.5em;\\n }\\n table {\\n text-indent: 0;\\n border-color: inherit;\\n border-collapse: collapse;\\n }\\n :-moz-focusring {\\n outline: auto;\\n }\\n progress {\\n vertical-align: baseline;\\n }\\n summary {\\n display: list-item;\\n }\\n ol, ul, menu {\\n list-style: none;\\n }\\n img, svg, video, canvas, audio, iframe, embed, object {\\n display: block;\\n vertical-align: middle;\\n }\\n img, video {\\n max-width: 100%;\\n height: auto;\\n }\\n button, input, select, optgroup, textarea, ::file-selector-button {\\n font: inherit;\\n font-feature-settings: inherit;\\n font-variation-settings: inherit;\\n letter-spacing: inherit;\\n color: inherit;\\n border-radius: 0;\\n background-color: transparent;\\n opacity: 1;\\n }\\n :where(select:is([multiple], [size])) optgroup {\\n font-weight: bolder;\\n }\\n :where(select:is([multiple], [size])) optgroup option {\\n padding-inline-start: 20px;\\n }\\n ::file-selector-button {\\n margin-inline-end: 4px;\\n }\\n ::placeholder {\\n opacity: 1;\\n }\\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\\n ::placeholder {\\n color: currentcolor;\\n @supports (color: color-mix(in lab, red, red)) {\\n color: color-mix(in oklab, currentcolor 50%, transparent);\\n }\\n }\\n }\\n textarea {\\n resize: vertical;\\n }\\n ::-webkit-search-decoration {\\n -webkit-appearance: none;\\n }\\n ::-webkit-date-and-time-value {\\n min-height: 1lh;\\n text-align: inherit;\\n }\\n ::-webkit-datetime-edit {\\n display: inline-flex;\\n }\\n ::-webkit-datetime-edit-fields-wrapper {\\n padding: 0;\\n }\\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\\n padding-block: 0;\\n }\\n ::-webkit-calendar-picker-indicator {\\n line-height: 1;\\n }\\n :-moz-ui-invalid {\\n box-shadow: none;\\n }\\n button, input:where([type=\\\"button\\\"], [type=\\\"reset\\\"], [type=\\\"submit\\\"]), ::file-selector-button {\\n appearance: button;\\n }\\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\\n height: auto;\\n }\\n [hidden]:where(:not([hidden=\\\"until-found\\\"])) {\\n display: none !important;\\n }\\n}\\n@layer utilities {\\n .sr-only {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip-path: inset(50%);\\n white-space: nowrap;\\n border-width: 0;\\n }\\n .relative {\\n position: relative;\\n }\\n .col-span-2 {\\n grid-column: span 2 / span 2;\\n }\\n .mx-auto {\\n margin-inline: auto;\\n }\\n .mb-2 {\\n margin-bottom: calc(var(--spacing) * 2);\\n }\\n .mb-4 {\\n margin-bottom: calc(var(--spacing) * 4);\\n }\\n .contents {\\n display: contents;\\n }\\n .flex {\\n display: flex;\\n }\\n .grid {\\n display: grid;\\n }\\n .inline {\\n display: inline;\\n }\\n .inline-block {\\n display: inline-block;\\n }\\n .inline-flex {\\n display: inline-flex;\\n }\\n .table {\\n display: table;\\n }\\n .h-3 {\\n height: calc(var(--spacing) * 3);\\n }\\n .h-3\\\\.5 {\\n height: calc(var(--spacing) * 3.5);\\n }\\n .h-4 {\\n height: calc(var(--spacing) * 4);\\n }\\n .h-5 {\\n height: calc(var(--spacing) * 5);\\n }\\n .h-40 {\\n height: calc(var(--spacing) * 40);\\n }\\n .h-56 {\\n height: calc(var(--spacing) * 56);\\n }\\n .min-h-screen {\\n min-height: 100vh;\\n }\\n .w-3 {\\n width: calc(var(--spacing) * 3);\\n }\\n .w-3\\\\.5 {\\n width: calc(var(--spacing) * 3.5);\\n }\\n .w-4 {\\n width: calc(var(--spacing) * 4);\\n }\\n .w-9 {\\n width: calc(var(--spacing) * 9);\\n }\\n .w-full {\\n width: 100%;\\n }\\n .max-w-2xl {\\n max-width: var(--container-2xl);\\n }\\n .max-w-3xl {\\n max-width: var(--container-3xl);\\n }\\n .max-w-6xl {\\n max-width: var(--container-6xl);\\n }\\n .flex-shrink {\\n flex-shrink: 1;\\n }\\n .shrink-0 {\\n flex-shrink: 0;\\n }\\n .border-collapse {\\n border-collapse: collapse;\\n }\\n .translate-x-0 {\\n --tw-translate-x: calc(var(--spacing) * 0);\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .translate-x-0\\\\.5 {\\n --tw-translate-x: calc(var(--spacing) * 0.5);\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .translate-x-4 {\\n --tw-translate-x: calc(var(--spacing) * 4);\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .transform {\\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\\n }\\n .animate-spin {\\n animation: var(--animate-spin);\\n }\\n .cursor-pointer {\\n cursor: pointer;\\n }\\n .resize {\\n resize: both;\\n }\\n .grid-cols-1 {\\n grid-template-columns: repeat(1, minmax(0, 1fr));\\n }\\n .flex-col {\\n flex-direction: column;\\n }\\n .items-center {\\n align-items: center;\\n }\\n .justify-between {\\n justify-content: space-between;\\n }\\n .justify-center {\\n justify-content: center;\\n }\\n .gap-2 {\\n gap: calc(var(--spacing) * 2);\\n }\\n .gap-3 {\\n gap: calc(var(--spacing) * 3);\\n }\\n .gap-4 {\\n gap: calc(var(--spacing) * 4);\\n }\\n .gap-6 {\\n gap: calc(var(--spacing) * 6);\\n }\\n .space-y-0 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-0\\\\.5 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-1 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-2 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-3 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-4 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-5 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-6 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-10 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .rounded {\\n border-radius: 0.25rem;\\n }\\n .rounded-2xl {\\n border-radius: var(--radius-2xl);\\n }\\n .rounded-full {\\n border-radius: calc(infinity * 1px);\\n }\\n .rounded-lg {\\n border-radius: var(--radius-lg);\\n }\\n .rounded-xl {\\n border-radius: var(--radius-xl);\\n }\\n .border {\\n border-style: var(--tw-border-style);\\n border-width: 1px;\\n }\\n .border-2 {\\n border-style: var(--tw-border-style);\\n border-width: 2px;\\n }\\n .border-amber-200 {\\n border-color: var(--color-amber-200);\\n }\\n .border-amber-300 {\\n border-color: var(--color-amber-300);\\n }\\n .border-red-300 {\\n border-color: var(--color-red-300);\\n }\\n .border-red-700 {\\n border-color: var(--color-red-700);\\n }\\n .border-slate-100 {\\n border-color: var(--color-slate-100);\\n }\\n .border-slate-200 {\\n border-color: var(--color-slate-200);\\n }\\n .border-slate-300 {\\n border-color: var(--color-slate-300);\\n }\\n .border-t-slate-900 {\\n border-top-color: var(--color-slate-900);\\n }\\n .bg-amber-50 {\\n background-color: var(--color-amber-50);\\n }\\n .bg-emerald-50 {\\n background-color: var(--color-emerald-50);\\n }\\n .bg-indigo-600 {\\n background-color: var(--color-indigo-600);\\n }\\n .bg-red-50 {\\n background-color: var(--color-red-50);\\n }\\n .bg-red-900 {\\n background-color: var(--color-red-900);\\n }\\n .bg-red-900\\\\/20 {\\n background-color: color-mix(in srgb, oklch(39.6% 0.141 25.723) 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-red-900) 20%, transparent);\\n }\\n }\\n .bg-rose-50 {\\n background-color: var(--color-rose-50);\\n }\\n .bg-slate-50 {\\n background-color: var(--color-slate-50);\\n }\\n .bg-slate-300 {\\n background-color: var(--color-slate-300);\\n }\\n .bg-slate-900 {\\n background-color: var(--color-slate-900);\\n }\\n .bg-white {\\n background-color: var(--color-white);\\n }\\n .bg-white\\\\/70 {\\n background-color: color-mix(in srgb, #fff 70%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-white) 70%, transparent);\\n }\\n }\\n .bg-white\\\\/90 {\\n background-color: color-mix(in srgb, #fff 90%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-white) 90%, transparent);\\n }\\n }\\n .p-3 {\\n padding: calc(var(--spacing) * 3);\\n }\\n .p-4 {\\n padding: calc(var(--spacing) * 4);\\n }\\n .p-5 {\\n padding: calc(var(--spacing) * 5);\\n }\\n .p-6 {\\n padding: calc(var(--spacing) * 6);\\n }\\n .px-2 {\\n padding-inline: calc(var(--spacing) * 2);\\n }\\n .px-3 {\\n padding-inline: calc(var(--spacing) * 3);\\n }\\n .px-6 {\\n padding-inline: calc(var(--spacing) * 6);\\n }\\n .py-1 {\\n padding-block: calc(var(--spacing) * 1);\\n }\\n .py-1\\\\.5 {\\n padding-block: calc(var(--spacing) * 1.5);\\n }\\n .py-2 {\\n padding-block: calc(var(--spacing) * 2);\\n }\\n .py-2\\\\.5 {\\n padding-block: calc(var(--spacing) * 2.5);\\n }\\n .py-6 {\\n padding-block: calc(var(--spacing) * 6);\\n }\\n .py-8 {\\n padding-block: calc(var(--spacing) * 8);\\n }\\n .py-10 {\\n padding-block: calc(var(--spacing) * 10);\\n }\\n .font-mono {\\n font-family: var(--font-mono);\\n }\\n .text-3xl {\\n font-size: var(--text-3xl);\\n line-height: var(--tw-leading, var(--text-3xl--line-height));\\n }\\n .text-lg {\\n font-size: var(--text-lg);\\n line-height: var(--tw-leading, var(--text-lg--line-height));\\n }\\n .text-sm {\\n font-size: var(--text-sm);\\n line-height: var(--tw-leading, var(--text-sm--line-height));\\n }\\n .text-xl {\\n font-size: var(--text-xl);\\n line-height: var(--tw-leading, var(--text-xl--line-height));\\n }\\n .text-xs {\\n font-size: var(--text-xs);\\n line-height: var(--tw-leading, var(--text-xs--line-height));\\n }\\n .text-\\\\[10px\\\\] {\\n font-size: 10px;\\n }\\n .text-\\\\[11px\\\\] {\\n font-size: 11px;\\n }\\n .font-bold {\\n --tw-font-weight: var(--font-weight-bold);\\n font-weight: var(--font-weight-bold);\\n }\\n .font-medium {\\n --tw-font-weight: var(--font-weight-medium);\\n font-weight: var(--font-weight-medium);\\n }\\n .font-semibold {\\n --tw-font-weight: var(--font-weight-semibold);\\n font-weight: var(--font-weight-semibold);\\n }\\n .tracking-\\\\[0\\\\.2em\\\\] {\\n --tw-tracking: 0.2em;\\n letter-spacing: 0.2em;\\n }\\n .tracking-tight {\\n --tw-tracking: var(--tracking-tight);\\n letter-spacing: var(--tracking-tight);\\n }\\n .tracking-wide {\\n --tw-tracking: var(--tracking-wide);\\n letter-spacing: var(--tracking-wide);\\n }\\n .whitespace-pre-wrap {\\n white-space: pre-wrap;\\n }\\n .text-amber-600 {\\n color: var(--color-amber-600);\\n }\\n .text-amber-700 {\\n color: var(--color-amber-700);\\n }\\n .text-amber-800 {\\n color: var(--color-amber-800);\\n }\\n .text-emerald-700 {\\n color: var(--color-emerald-700);\\n }\\n .text-indigo-500 {\\n color: var(--color-indigo-500);\\n }\\n .text-rose-500 {\\n color: var(--color-rose-500);\\n }\\n .text-rose-600 {\\n color: var(--color-rose-600);\\n }\\n .text-rose-700 {\\n color: var(--color-rose-700);\\n }\\n .text-slate-400 {\\n color: var(--color-slate-400);\\n }\\n .text-slate-500 {\\n color: var(--color-slate-500);\\n }\\n .text-slate-600 {\\n color: var(--color-slate-600);\\n }\\n .text-slate-700 {\\n color: var(--color-slate-700);\\n }\\n .text-slate-800 {\\n color: var(--color-slate-800);\\n }\\n .text-slate-900 {\\n color: var(--color-slate-900);\\n }\\n .text-white {\\n color: var(--color-white);\\n }\\n .uppercase {\\n text-transform: uppercase;\\n }\\n .italic {\\n font-style: italic;\\n }\\n .underline {\\n text-decoration-line: underline;\\n }\\n .opacity-25 {\\n opacity: 25%;\\n }\\n .opacity-75 {\\n opacity: 75%;\\n }\\n .shadow {\\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\\n }\\n .shadow-sm {\\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\\n }\\n .outline {\\n outline-style: var(--tw-outline-style);\\n outline-width: 1px;\\n }\\n .backdrop-blur {\\n --tw-backdrop-blur: blur(8px);\\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\\n }\\n .backdrop-filter {\\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\\n }\\n .transition {\\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .transition-all {\\n transition-property: all;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .transition-colors {\\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .transition-transform {\\n transition-property: transform, translate, scale, rotate;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .duration-200 {\\n --tw-duration: 200ms;\\n transition-duration: 200ms;\\n }\\n .focus-within\\\\:border-indigo-300 {\\n &:focus-within {\\n border-color: var(--color-indigo-300);\\n }\\n }\\n .focus-within\\\\:ring-2 {\\n &:focus-within {\\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\\n }\\n }\\n .hover\\\\:-translate-y-0\\\\.5 {\\n &:hover {\\n @media (hover: hover) {\\n --tw-translate-y: calc(var(--spacing) * -0.5);\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n }\\n }\\n .hover\\\\:border-slate-300 {\\n &:hover {\\n @media (hover: hover) {\\n border-color: var(--color-slate-300);\\n }\\n }\\n }\\n .hover\\\\:border-slate-400 {\\n &:hover {\\n @media (hover: hover) {\\n border-color: var(--color-slate-400);\\n }\\n }\\n }\\n .hover\\\\:bg-slate-50 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: var(--color-slate-50);\\n }\\n }\\n }\\n .hover\\\\:bg-slate-800 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: var(--color-slate-800);\\n }\\n }\\n }\\n .hover\\\\:text-rose-700 {\\n &:hover {\\n @media (hover: hover) {\\n color: var(--color-rose-700);\\n }\\n }\\n }\\n .hover\\\\:shadow {\\n &:hover {\\n @media (hover: hover) {\\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\\n }\\n }\\n }\\n .hover\\\\:shadow-lg {\\n &:hover {\\n @media (hover: hover) {\\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\\n }\\n }\\n }\\n .hover\\\\:shadow-md {\\n &:hover {\\n @media (hover: hover) {\\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\\n }\\n }\\n }\\n .focus\\\\:border-indigo-400 {\\n &:focus {\\n border-color: var(--color-indigo-400);\\n }\\n }\\n .focus\\\\:ring-2 {\\n &:focus {\\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\\n }\\n }\\n .focus\\\\:ring-indigo-100 {\\n &:focus {\\n --tw-ring-color: var(--color-indigo-100);\\n }\\n }\\n .focus\\\\:ring-indigo-500 {\\n &:focus {\\n --tw-ring-color: var(--color-indigo-500);\\n }\\n }\\n .focus\\\\:ring-slate-900 {\\n &:focus {\\n --tw-ring-color: var(--color-slate-900);\\n }\\n }\\n .focus\\\\:outline-none {\\n &:focus {\\n --tw-outline-style: none;\\n outline-style: none;\\n }\\n }\\n .sm\\\\:grid-cols-2 {\\n @media (width >= 40rem) {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n }\\n }\\n .md\\\\:grid-cols-2 {\\n @media (width >= 48rem) {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n }\\n }\\n .md\\\\:flex-row {\\n @media (width >= 48rem) {\\n flex-direction: row;\\n }\\n }\\n .md\\\\:items-center {\\n @media (width >= 48rem) {\\n align-items: center;\\n }\\n }\\n .md\\\\:justify-between {\\n @media (width >= 48rem) {\\n justify-content: space-between;\\n }\\n }\\n .md\\\\:p-6 {\\n @media (width >= 48rem) {\\n padding: calc(var(--spacing) * 6);\\n }\\n }\\n .md\\\\:text-4xl {\\n @media (width >= 48rem) {\\n font-size: var(--text-4xl);\\n line-height: var(--tw-leading, var(--text-4xl--line-height));\\n }\\n }\\n .lg\\\\:grid-cols-\\\\[360px\\\\,1fr\\\\] {\\n @media (width >= 64rem) {\\n grid-template-columns: 360px,1fr;\\n }\\n }\\n .dark\\\\:border-amber-700 {\\n &:where(.dark, .dark *) {\\n border-color: var(--color-amber-700);\\n }\\n }\\n .dark\\\\:border-amber-800 {\\n &:where(.dark, .dark *) {\\n border-color: var(--color-amber-800);\\n }\\n }\\n .dark\\\\:border-slate-600 {\\n &:where(.dark, .dark *) {\\n border-color: var(--color-slate-600);\\n }\\n }\\n .dark\\\\:border-slate-700 {\\n &:where(.dark, .dark *) {\\n border-color: var(--color-slate-700);\\n }\\n }\\n .dark\\\\:border-t-indigo-400 {\\n &:where(.dark, .dark *) {\\n border-top-color: var(--color-indigo-400);\\n }\\n }\\n .dark\\\\:bg-amber-900\\\\/20 {\\n &:where(.dark, .dark *) {\\n background-color: color-mix(in srgb, oklch(41.4% 0.112 45.904) 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-amber-900) 20%, transparent);\\n }\\n }\\n }\\n .dark\\\\:bg-emerald-900\\\\/30 {\\n &:where(.dark, .dark *) {\\n background-color: color-mix(in srgb, oklch(37.8% 0.077 168.94) 30%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-emerald-900) 30%, transparent);\\n }\\n }\\n }\\n .dark\\\\:bg-indigo-600 {\\n &:where(.dark, .dark *) {\\n background-color: var(--color-indigo-600);\\n }\\n }\\n .dark\\\\:bg-rose-900\\\\/30 {\\n &:where(.dark, .dark *) {\\n background-color: color-mix(in srgb, oklch(41% 0.159 10.272) 30%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-rose-900) 30%, transparent);\\n }\\n }\\n }\\n .dark\\\\:bg-slate-600 {\\n &:where(.dark, .dark *) {\\n background-color: var(--color-slate-600);\\n }\\n }\\n .dark\\\\:bg-slate-700 {\\n &:where(.dark, .dark *) {\\n background-color: var(--color-slate-700);\\n }\\n }\\n .dark\\\\:bg-slate-800 {\\n &:where(.dark, .dark *) {\\n background-color: var(--color-slate-800);\\n }\\n }\\n .dark\\\\:bg-slate-800\\\\/50 {\\n &:where(.dark, .dark *) {\\n background-color: color-mix(in srgb, oklch(27.9% 0.041 260.031) 50%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-slate-800) 50%, transparent);\\n }\\n }\\n }\\n .dark\\\\:bg-slate-800\\\\/60 {\\n &:where(.dark, .dark *) {\\n background-color: color-mix(in srgb, oklch(27.9% 0.041 260.031) 60%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-slate-800) 60%, transparent);\\n }\\n }\\n }\\n .dark\\\\:bg-slate-900 {\\n &:where(.dark, .dark *) {\\n background-color: var(--color-slate-900);\\n }\\n }\\n .dark\\\\:bg-slate-900\\\\/90 {\\n &:where(.dark, .dark *) {\\n background-color: color-mix(in srgb, oklch(20.8% 0.042 265.755) 90%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-slate-900) 90%, transparent);\\n }\\n }\\n }\\n .dark\\\\:bg-slate-950 {\\n &:where(.dark, .dark *) {\\n background-color: var(--color-slate-950);\\n }\\n }\\n .dark\\\\:text-amber-300 {\\n &:where(.dark, .dark *) {\\n color: var(--color-amber-300);\\n }\\n }\\n .dark\\\\:text-amber-400 {\\n &:where(.dark, .dark *) {\\n color: var(--color-amber-400);\\n }\\n }\\n .dark\\\\:text-emerald-400 {\\n &:where(.dark, .dark *) {\\n color: var(--color-emerald-400);\\n }\\n }\\n .dark\\\\:text-indigo-400 {\\n &:where(.dark, .dark *) {\\n color: var(--color-indigo-400);\\n }\\n }\\n .dark\\\\:text-rose-400 {\\n &:where(.dark, .dark *) {\\n color: var(--color-rose-400);\\n }\\n }\\n .dark\\\\:text-slate-100 {\\n &:where(.dark, .dark *) {\\n color: var(--color-slate-100);\\n }\\n }\\n .dark\\\\:text-slate-200 {\\n &:where(.dark, .dark *) {\\n color: var(--color-slate-200);\\n }\\n }\\n .dark\\\\:text-slate-300 {\\n &:where(.dark, .dark *) {\\n color: var(--color-slate-300);\\n }\\n }\\n .dark\\\\:text-slate-400 {\\n &:where(.dark, .dark *) {\\n color: var(--color-slate-400);\\n }\\n }\\n .dark\\\\:text-slate-500 {\\n &:where(.dark, .dark *) {\\n color: var(--color-slate-500);\\n }\\n }\\n .dark\\\\:text-white {\\n &:where(.dark, .dark *) {\\n color: var(--color-white);\\n }\\n }\\n .dark\\\\:hover\\\\:border-slate-500 {\\n &:where(.dark, .dark *) {\\n &:hover {\\n @media (hover: hover) {\\n border-color: var(--color-slate-500);\\n }\\n }\\n }\\n }\\n .dark\\\\:hover\\\\:bg-indigo-700 {\\n &:where(.dark, .dark *) {\\n &:hover {\\n @media (hover: hover) {\\n background-color: var(--color-indigo-700);\\n }\\n }\\n }\\n }\\n .dark\\\\:hover\\\\:bg-slate-700 {\\n &:where(.dark, .dark *) {\\n &:hover {\\n @media (hover: hover) {\\n background-color: var(--color-slate-700);\\n }\\n }\\n }\\n }\\n .dark\\\\:focus\\\\:ring-indigo-900\\\\/40 {\\n &:where(.dark, .dark *) {\\n &:focus {\\n --tw-ring-color: color-mix(in srgb, oklch(35.9% 0.144 278.697) 40%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-ring-color: color-mix(in oklab, var(--color-indigo-900) 40%, transparent);\\n }\\n }\\n }\\n }\\n}\\n@property --tw-translate-x {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0;\\n}\\n@property --tw-translate-y {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0;\\n}\\n@property --tw-translate-z {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0;\\n}\\n@property --tw-rotate-x {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-rotate-y {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-rotate-z {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-skew-x {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-skew-y {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-space-y-reverse {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0;\\n}\\n@property --tw-border-style {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: solid;\\n}\\n@property --tw-font-weight {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-tracking {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-shadow {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0 0 #0000;\\n}\\n@property --tw-shadow-color {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-shadow-alpha {\\n syntax: \\\"<percentage>\\\";\\n inherits: false;\\n initial-value: 100%;\\n}\\n@property --tw-inset-shadow {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0 0 #0000;\\n}\\n@property --tw-inset-shadow-color {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-inset-shadow-alpha {\\n syntax: \\\"<percentage>\\\";\\n inherits: false;\\n initial-value: 100%;\\n}\\n@property --tw-ring-color {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-ring-shadow {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0 0 #0000;\\n}\\n@property --tw-inset-ring-color {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-inset-ring-shadow {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0 0 #0000;\\n}\\n@property --tw-ring-inset {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-ring-offset-width {\\n syntax: \\\"<length>\\\";\\n inherits: false;\\n initial-value: 0px;\\n}\\n@property --tw-ring-offset-color {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: #fff;\\n}\\n@property --tw-ring-offset-shadow {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: 0 0 #0000;\\n}\\n@property --tw-outline-style {\\n syntax: \\\"*\\\";\\n inherits: false;\\n initial-value: solid;\\n}\\n@property --tw-backdrop-blur {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-backdrop-brightness {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-backdrop-contrast {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-backdrop-grayscale {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-backdrop-hue-rotate {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-backdrop-invert {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-backdrop-opacity {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-backdrop-saturate {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-backdrop-sepia {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@property --tw-duration {\\n syntax: \\\"*\\\";\\n inherits: false;\\n}\\n@keyframes spin {\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n@layer properties {\\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\\n *, ::before, ::after, ::backdrop {\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-translate-z: 0;\\n --tw-rotate-x: initial;\\n --tw-rotate-y: initial;\\n --tw-rotate-z: initial;\\n --tw-skew-x: initial;\\n --tw-skew-y: initial;\\n --tw-space-y-reverse: 0;\\n --tw-border-style: solid;\\n --tw-font-weight: initial;\\n --tw-tracking: initial;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-color: initial;\\n --tw-shadow-alpha: 100%;\\n --tw-inset-shadow: 0 0 #0000;\\n --tw-inset-shadow-color: initial;\\n --tw-inset-shadow-alpha: 100%;\\n --tw-ring-color: initial;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-inset-ring-color: initial;\\n --tw-inset-ring-shadow: 0 0 #0000;\\n --tw-ring-inset: initial;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-outline-style: solid;\\n --tw-backdrop-blur: initial;\\n --tw-backdrop-brightness: initial;\\n --tw-backdrop-contrast: initial;\\n --tw-backdrop-grayscale: initial;\\n --tw-backdrop-hue-rotate: initial;\\n --tw-backdrop-invert: initial;\\n --tw-backdrop-opacity: initial;\\n --tw-backdrop-saturate: initial;\\n --tw-backdrop-sepia: initial;\\n --tw-duration: initial;\\n }\\n }\\n}\\n\";\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { JSM_CSS } from './jsm-styles.generated';\r\n\r\nconst STYLE_ID = 'jsm-tailwind-styles';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class JsonSchemaStylesService {\r\n private injected = false;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {}\r\n\r\n inject(): void {\r\n if (this.injected || !isPlatformBrowser(this.platformId)) return;\r\n if (typeof document === 'undefined') return;\r\n if (document.getElementById(STYLE_ID)) { this.injected = true; return; }\r\n\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = JSM_CSS;\r\n document.head.appendChild(style);\r\n this.injected = true;\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AbstractControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { JsonSchemaFormService } from './json-schema-form.service';\r\nimport { JsonSchema, SchemaError } from './types';\r\nimport { JsonSchemaNodeComponent } from './json-schema-node.component';\r\nimport { JsonSchemaResolverService } from './json-schema-resolver.service';\r\nimport { JsonSchemaValidationService } from './json-schema-validation.service';\r\nimport { JsonSchemaStylesService } from './json-schema-styles.service';\r\n\r\n@Component({\r\n selector: 'jsm-json-schema-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, JsonSchemaNodeComponent],\r\n encapsulation: ViewEncapsulation.None,\r\n styles: [`\r\n .jsm-root *, .jsm-root *::before, .jsm-root *::after { box-sizing: border-box; }\r\n .jsm-root input, .jsm-root textarea, .jsm-root select, .jsm-root button {\r\n font-family: inherit;\r\n font-size: inherit;\r\n line-height: inherit;\r\n }\r\n .jsm-root input[type=\"number\"]::-webkit-inner-spin-button,\r\n .jsm-root input[type=\"number\"]::-webkit-outer-spin-button { opacity: 1; }\r\n /* Force border visibility against host resets */\r\n .jsm-root input:not([type=\"checkbox\"]):not([type=\"radio\"]):not(.sr-only),\r\n .jsm-root textarea,\r\n .jsm-root select {\r\n border-width: 1.5px !important;\r\n border-style: solid !important;\r\n }\r\n `],\r\n template: `\r\n <div class=\"jsm-root\">\r\n <form class=\"w-full space-y-5\">\r\n <div *ngIf=\"resolvedSchema?.title || resolvedSchema?.description\" class=\"space-y-0.5\">\r\n <h2 class=\"text-lg font-bold tracking-tight text-slate-900 dark:text-white\">{{ resolvedSchema?.title || 'Form' }}</h2>\r\n <p *ngIf=\"resolvedSchema?.description\" class=\"text-sm text-slate-500 dark:text-slate-400\">{{ resolvedSchema?.description }}</p>\r\n </div>\r\n\r\n <div *ngIf=\"loading\" class=\"flex items-center gap-2 py-6 text-sm text-slate-500 dark:text-slate-400\" aria-live=\"polite\">\r\n <svg class=\"h-4 w-4 animate-spin text-indigo-500 dark:text-indigo-400\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"/>\r\n </svg>\r\n Resolving schema…\r\n </div>\r\n\r\n <!-- schema structural errors panel -->\r\n <div *ngIf=\"schemaErrorList.length > 0 && !loading\"\r\n class=\"rounded-xl border border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-900/20 p-4 space-y-3\"\r\n role=\"alert\">\r\n <div class=\"flex items-center gap-2\">\r\n <svg class=\"w-4 h-4 shrink-0 text-amber-600 dark:text-amber-400\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 2L1.5 13.5h13L8 2z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\r\n <path d=\"M8 6v3.5M8 11.5v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <span class=\"text-sm font-semibold text-amber-800 dark:text-amber-300\">\r\n Schema errors ({{ schemaErrorList.length }})\r\n </span>\r\n </div>\r\n <p class=\"text-xs text-amber-700 dark:text-amber-400\">\r\n The schema has structural issues. Fix them to get a valid form.\r\n </p>\r\n <div class=\"space-y-2\">\r\n <div *ngFor=\"let err of schemaErrorList\"\r\n class=\"rounded-lg border border-amber-200 dark:border-amber-800 bg-white dark:bg-slate-900 px-3 py-2 space-y-0.5\">\r\n <p class=\"font-mono text-[11px] font-semibold text-amber-700 dark:text-amber-400\">{{ err.path }}</p>\r\n <p class=\"text-xs text-slate-700 dark:text-slate-300\">{{ err.message }}</p>\r\n <p class=\"text-[10px] uppercase tracking-wide text-slate-400 dark:text-slate-500\">keyword: {{ err.keyword }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"form && resolvedSchema && !loading\" class=\"space-y-5\" [formGroup]=\"form\">\r\n <jsm-schema-node\r\n [schema]=\"resolvedSchema\"\r\n [control]=\"rootControl\"\r\n [path]=\"''\"\r\n [errorsMap]=\"errorsMap\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n label=\"Root\"\r\n (controlReplaced)=\"onRootReplaced($event)\"\r\n ></jsm-schema-node>\r\n </div>\r\n </form>\r\n </div>\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class JsonSchemaFormComponent implements OnChanges, OnDestroy {\r\n @Input({ required: true }) schema!: JsonSchema;\r\n @Input() value?: unknown;\r\n @Input() data?: unknown;\r\n @Input() allowAdditionalProperties = false;\r\n\r\n @Output() formReady = new EventEmitter<FormGroup>();\r\n @Output() valueChange = new EventEmitter<unknown>();\r\n @Output() schemaReady = new EventEmitter<JsonSchema>();\r\n @Output() schemaErrors = new EventEmitter<SchemaError[]>();\r\n\r\n form!: FormGroup;\r\n rootControl!: AbstractControl;\r\n resolvedSchema?: JsonSchema;\r\n errorsMap = new Map<string, string[]>();\r\n schemaErrorList: SchemaError[] = [];\r\n loading = false;\r\n\r\n private valueSub?: Subscription;\r\n\r\n constructor(\r\n private readonly schemaService: JsonSchemaFormService,\r\n private readonly resolver: JsonSchemaResolverService,\r\n private readonly validation: JsonSchemaValidationService,\r\n stylesService: JsonSchemaStylesService,\r\n ) {\r\n stylesService.inject();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] || changes['value'] || changes['data']) {\r\n void this.buildForm();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.valueSub?.unsubscribe();\r\n }\r\n\r\n private async buildForm(): Promise<void> {\r\n this.valueSub?.unsubscribe();\r\n this.loading = true;\r\n this.resolvedSchema = await this.resolver.resolve(this.schema, this.schema?.$id);\r\n\r\n // Validate the schema itself and emit any structural errors\r\n const schemaErrs = this.validation.validateSchema(this.resolvedSchema);\r\n this.schemaErrorList = schemaErrs;\r\n this.schemaErrors.emit(schemaErrs);\r\n\r\n this.schemaReady.emit(this.resolvedSchema);\r\n\r\n // If the schema has structural errors, stop here — don't try to build the form\r\n if (schemaErrs.length > 0) {\r\n this.form = undefined!;\r\n this.loading = false;\r\n return;\r\n }\r\n const initialData = this.value !== undefined ? this.value : this.data;\r\n this.rootControl = this.schemaService.buildControl(this.resolvedSchema, initialData);\r\n this.form = this.rootControl instanceof FormGroup ? this.rootControl : new FormGroup({ value: this.rootControl });\r\n this.formReady.emit(this.form);\r\n this.loading = false;\r\n\r\n this.attachValueSub();\r\n }\r\n\r\n private updateErrors(): void {\r\n if (!this.resolvedSchema) {\r\n this.errorsMap = new Map();\r\n return;\r\n }\r\n\r\n const errors = this.validation.validate(this.resolvedSchema, this.rootControl.value);\r\n const map = new Map<string, string[]>();\r\n\r\n for (const error of errors) {\r\n const path = error.instancePath ?? '';\r\n const messages = map.get(path) ?? [];\r\n messages.push(error.message ?? error.keyword);\r\n map.set(path, messages);\r\n }\r\n\r\n this.errorsMap = map;\r\n }\r\n\r\n onRootReplaced(control: AbstractControl): void {\r\n this.rootControl = control;\r\n if (control instanceof FormGroup) {\r\n this.form = control;\r\n } else {\r\n if (!(this.form instanceof FormGroup) || !this.form.contains('value')) {\r\n this.form = new FormGroup({ value: control });\r\n } else {\r\n this.form.setControl('value', control);\r\n }\r\n }\r\n this.attachValueSub();\r\n }\r\n\r\n private attachValueSub(): void {\r\n this.valueSub?.unsubscribe();\r\n this.updateErrors();\r\n this.valueSub = this.form.valueChanges.subscribe(() => {\r\n this.updateErrors();\r\n this.valueChange.emit(this.rootControl.value);\r\n });\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { JsonSchemaFormComponent } from './json-schema-form.component';\r\nimport { JsonSchemaNodeComponent } from './json-schema-node.component';\r\n\r\n@NgModule({\r\n imports: [JsonSchemaFormComponent, JsonSchemaNodeComponent],\r\n exports: [JsonSchemaFormComponent, JsonSchemaNodeComponent],\r\n})\r\nexport class JsonSchemaFormModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.JsonSchemaFormService","i2.JsonSchemaValidationService","i2.JsonSchemaResolverService","i3.JsonSchemaValidationService","i4.JsonSchemaStylesService","i5","i6"],"mappings":"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"}
|