ngx-blocks-studio 0.0.2 → 0.0.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.
Potentially problematic release.
This version of ngx-blocks-studio might be problematic. Click here for more details.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, signal, computed, Injectable, Injector, effect, ViewContainerRef, DestroyRef, input, Directive } from '@angular/core';
|
|
2
|
+
import { inject, signal, computed, Injectable, isSignal, Injector, effect, ViewContainerRef, DestroyRef, input, Directive } from '@angular/core';
|
|
3
3
|
import { Router } from '@angular/router';
|
|
4
4
|
import { HttpClient } from '@angular/common/http';
|
|
5
5
|
import { firstValueFrom } from 'rxjs';
|
|
@@ -686,6 +686,7 @@ const ServiceEntrySchema = z.union([
|
|
|
686
686
|
z.object({
|
|
687
687
|
id: z.string().min(1),
|
|
688
688
|
scope: z.literal('self'),
|
|
689
|
+
alias: z.string().min(1).optional(),
|
|
689
690
|
}),
|
|
690
691
|
]);
|
|
691
692
|
/**
|
|
@@ -952,6 +953,34 @@ function resolveRefPath(refPath, ctx) {
|
|
|
952
953
|
}
|
|
953
954
|
return { target: current, path: rest.slice(-1) };
|
|
954
955
|
}
|
|
956
|
+
/**
|
|
957
|
+
* Get a value from an object by dot-notation path (e.g. "name.firstName" -> obj.name?.firstName).
|
|
958
|
+
* Returns undefined if any segment is null/undefined or not an object.
|
|
959
|
+
*/
|
|
960
|
+
function getValueByPath(obj, path) {
|
|
961
|
+
if (obj == null)
|
|
962
|
+
return undefined;
|
|
963
|
+
const parts = path.trim().split('.').filter(Boolean);
|
|
964
|
+
let current = obj;
|
|
965
|
+
for (const part of parts) {
|
|
966
|
+
if (current == null || typeof current !== 'object')
|
|
967
|
+
return undefined;
|
|
968
|
+
current = current[part];
|
|
969
|
+
}
|
|
970
|
+
return current;
|
|
971
|
+
}
|
|
972
|
+
/**
|
|
973
|
+
* Return true if the value at ref path is an Angular signal (so reading it in an effect would be reactive).
|
|
974
|
+
*/
|
|
975
|
+
function refPathResolvesToSignal(refPath, ctx) {
|
|
976
|
+
const resolved = resolveRefPath(refPath, ctx);
|
|
977
|
+
if (resolved == null)
|
|
978
|
+
return false;
|
|
979
|
+
const val = resolved.path.length === 0
|
|
980
|
+
? resolved.target
|
|
981
|
+
: resolved.target?.[resolved.path[0]];
|
|
982
|
+
return val != null && isSignal(val);
|
|
983
|
+
}
|
|
955
984
|
/**
|
|
956
985
|
* Get value at ref path (read-only). Returns undefined if not found.
|
|
957
986
|
*/
|
|
@@ -964,11 +993,26 @@ function getRefValue(refPath, ctx) {
|
|
|
964
993
|
const key = resolved.path[0];
|
|
965
994
|
const val = obj?.[key];
|
|
966
995
|
// Unwrap Angular signals and other getter functions by calling them
|
|
996
|
+
if (val != null && isSignal(val)) {
|
|
997
|
+
return val();
|
|
998
|
+
}
|
|
967
999
|
if (typeof val === 'function') {
|
|
968
1000
|
return val();
|
|
969
1001
|
}
|
|
970
1002
|
return val;
|
|
971
1003
|
}
|
|
1004
|
+
function getRefSignal(refPath, ctx) {
|
|
1005
|
+
const resolved = resolveRefPath(refPath, ctx);
|
|
1006
|
+
if (resolved == null)
|
|
1007
|
+
return undefined;
|
|
1008
|
+
const val = resolved.path.length === 0
|
|
1009
|
+
? resolved.target
|
|
1010
|
+
: resolved.target?.[resolved.path[0]];
|
|
1011
|
+
if (val != null && isSignal(val)) {
|
|
1012
|
+
return val;
|
|
1013
|
+
}
|
|
1014
|
+
return undefined;
|
|
1015
|
+
}
|
|
972
1016
|
/**
|
|
973
1017
|
* Set value at ref path (write). No-op if target is not writable.
|
|
974
1018
|
*/
|
|
@@ -979,9 +1023,9 @@ function setRefValue(refPath, ctx, value) {
|
|
|
979
1023
|
const obj = resolved.target;
|
|
980
1024
|
const key = resolved.path[0];
|
|
981
1025
|
const val = obj?.[key];
|
|
982
|
-
// Angular signals are callable (typeof 'function') but have .set; treat any value with .set as writable so we don't overwrite the signal with a string
|
|
983
1026
|
const writable = val != null &&
|
|
984
|
-
|
|
1027
|
+
isSignal(val) &&
|
|
1028
|
+
typeof val.set === 'function'
|
|
985
1029
|
? val
|
|
986
1030
|
: null;
|
|
987
1031
|
if (writable) {
|
|
@@ -1080,7 +1124,7 @@ class BlockLoaderService {
|
|
|
1080
1124
|
injector = inject(Injector);
|
|
1081
1125
|
componentRegistry = ComponentRegistry.getInstance();
|
|
1082
1126
|
serviceRegistry = ServiceRegistry.getInstance();
|
|
1083
|
-
async load(description, viewContainerRef, options) {
|
|
1127
|
+
async load(description, viewContainerRef, model, options) {
|
|
1084
1128
|
let resolved = description;
|
|
1085
1129
|
if (isBlockReference(description)) {
|
|
1086
1130
|
resolved = resolveBlockReference(description, options?.blockDefinitions);
|
|
@@ -1108,19 +1152,12 @@ class BlockLoaderService {
|
|
|
1108
1152
|
const blockInstance = {};
|
|
1109
1153
|
for (let i = 0; i < selfServices.length; i++) {
|
|
1110
1154
|
const id = selfServices[i].id;
|
|
1155
|
+
const alias = selfServices[i].alias ?? id;
|
|
1111
1156
|
const serviceType = serviceTypes[i];
|
|
1112
1157
|
if (serviceType) {
|
|
1113
1158
|
const svc = componentRef.injector.get(serviceType);
|
|
1114
1159
|
if (svc != null)
|
|
1115
|
-
blockInstance[
|
|
1116
|
-
}
|
|
1117
|
-
}
|
|
1118
|
-
if (desc.inputs?.['model'] != null) {
|
|
1119
|
-
const model = desc.inputs['model'];
|
|
1120
|
-
for (const svc of Object.values(blockInstance)) {
|
|
1121
|
-
if (svc != null && typeof svc['setModel'] === 'function') {
|
|
1122
|
-
svc['setModel'](model);
|
|
1123
|
-
}
|
|
1160
|
+
blockInstance[alias] = svc;
|
|
1124
1161
|
}
|
|
1125
1162
|
}
|
|
1126
1163
|
const ctx = {
|
|
@@ -1131,7 +1168,9 @@ class BlockLoaderService {
|
|
|
1131
1168
|
const handle = { instance: blockInstance };
|
|
1132
1169
|
if (desc.id != null && desc.id !== '')
|
|
1133
1170
|
registry.register(desc.id, handle);
|
|
1134
|
-
|
|
1171
|
+
this.applyInitialModel(desc, ctx, blockInstance, model);
|
|
1172
|
+
let currentEffectRefs = this.setInputs(componentRef, desc, ctx, model);
|
|
1173
|
+
currentEffectRefs = currentEffectRefs.concat(this.applyModelReactivity(desc, ctx, blockInstance, model));
|
|
1135
1174
|
const subscriptions = this.wireOutputs(componentRef, desc, registry, options?.outputHandlers);
|
|
1136
1175
|
const doDestroy = () => {
|
|
1137
1176
|
if (desc.id != null && desc.id !== '')
|
|
@@ -1148,7 +1187,9 @@ class BlockLoaderService {
|
|
|
1148
1187
|
const p = safeParseBlockDescription(newDesc);
|
|
1149
1188
|
if (p.success) {
|
|
1150
1189
|
currentEffectRefs.forEach((ref) => ref.destroy());
|
|
1151
|
-
|
|
1190
|
+
this.applyInitialModel(p.data, ctx, blockInstance, model);
|
|
1191
|
+
currentEffectRefs = this.setInputs(componentRef, p.data, ctx, model);
|
|
1192
|
+
currentEffectRefs = currentEffectRefs.concat(this.applyModelReactivity(p.data, ctx, blockInstance, model));
|
|
1152
1193
|
}
|
|
1153
1194
|
};
|
|
1154
1195
|
return { componentRef, destroy: doDestroy, updateInputs };
|
|
@@ -1168,13 +1209,14 @@ class BlockLoaderService {
|
|
|
1168
1209
|
: Injector.create({ providers, parent: this.injector });
|
|
1169
1210
|
}
|
|
1170
1211
|
/** Set inputs and wire template/two-way effects. Single pass over inputs for large configs. */
|
|
1171
|
-
setInputs(componentRef, desc, ctx) {
|
|
1212
|
+
setInputs(componentRef, desc, ctx, blockModel) {
|
|
1172
1213
|
const effectRefs = [];
|
|
1173
1214
|
const inputs = desc.inputs ?? {};
|
|
1174
1215
|
const inst = componentRef.instance;
|
|
1175
1216
|
for (const [key, value] of Object.entries(inputs)) {
|
|
1176
|
-
if (key === 'model')
|
|
1217
|
+
if (key === 'model') {
|
|
1177
1218
|
continue;
|
|
1219
|
+
}
|
|
1178
1220
|
if (typeof value === 'string') {
|
|
1179
1221
|
const twoWayKind = classifyTwoWayString(value);
|
|
1180
1222
|
if (twoWayKind === 'invalid-mix') {
|
|
@@ -1184,13 +1226,8 @@ class BlockLoaderService {
|
|
|
1184
1226
|
if (twoWayKind === 'two-way') {
|
|
1185
1227
|
const refPath = parseTwoWayRef(value);
|
|
1186
1228
|
if (refPath) {
|
|
1187
|
-
const initial = getRefValue(refPath, ctx);
|
|
1188
|
-
if (componentRef.setInput)
|
|
1189
|
-
componentRef.setInput(key, initial);
|
|
1190
|
-
else
|
|
1191
|
-
inst[key] = initial;
|
|
1192
1229
|
const modelSig = inst[key];
|
|
1193
|
-
if (modelSig != null &&
|
|
1230
|
+
if (modelSig != null && isSignal(modelSig)) {
|
|
1194
1231
|
effectRefs.push(effect(() => {
|
|
1195
1232
|
const fromRef = getRefValue(refPath, ctx);
|
|
1196
1233
|
if (fromRef === undefined)
|
|
@@ -1213,13 +1250,12 @@ class BlockLoaderService {
|
|
|
1213
1250
|
if (typeof value === 'string' &&
|
|
1214
1251
|
str.indexOf('{{') !== -1 &&
|
|
1215
1252
|
str.indexOf('}}', str.indexOf('{{')) !== -1) {
|
|
1216
|
-
const initial = this.interpolateTemplate(str, ctx);
|
|
1217
|
-
if (componentRef.setInput)
|
|
1218
|
-
componentRef.setInput(key, initial);
|
|
1219
|
-
else
|
|
1220
|
-
inst[key] = initial;
|
|
1221
1253
|
effectRefs.push(effect(() => {
|
|
1222
|
-
const
|
|
1254
|
+
const modelSig = ctx.currentInstance?.['model'];
|
|
1255
|
+
const model = modelSig != null && isSignal(modelSig)
|
|
1256
|
+
? modelSig()
|
|
1257
|
+
: modelSig;
|
|
1258
|
+
const resolved = this.interpolateTemplateMixed(str, ctx, model);
|
|
1223
1259
|
if (componentRef.setInput)
|
|
1224
1260
|
componentRef.setInput(key, resolved);
|
|
1225
1261
|
else
|
|
@@ -1235,6 +1271,88 @@ class BlockLoaderService {
|
|
|
1235
1271
|
}
|
|
1236
1272
|
return effectRefs;
|
|
1237
1273
|
}
|
|
1274
|
+
/** Resolve model from desc (interpolate ref if string) and set on services and blockInstance. */
|
|
1275
|
+
applyInitialModel(desc, ctx, blockInstance, blockModel) {
|
|
1276
|
+
const rawModel = desc.inputs?.['model'];
|
|
1277
|
+
if (rawModel === undefined || rawModel === null) {
|
|
1278
|
+
const model = blockModel();
|
|
1279
|
+
for (const svc of Object.values(blockInstance)) {
|
|
1280
|
+
if (svc != null && typeof svc['setModel'] === 'function') {
|
|
1281
|
+
svc['setModel'](model);
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
blockInstance['model'] = blockModel;
|
|
1285
|
+
return;
|
|
1286
|
+
}
|
|
1287
|
+
let model = rawModel;
|
|
1288
|
+
if (typeof rawModel === 'string') {
|
|
1289
|
+
const refPath = rawModel.trim().replace(/^\{\{\s*|\s*\}\}$/g, '');
|
|
1290
|
+
if (refPath.length > 0) {
|
|
1291
|
+
const refSignal = getRefSignal(refPath, ctx);
|
|
1292
|
+
if (refSignal != null) {
|
|
1293
|
+
model = refSignal();
|
|
1294
|
+
blockInstance['model'] = refSignal;
|
|
1295
|
+
}
|
|
1296
|
+
else {
|
|
1297
|
+
model = getRefValue(refPath, ctx);
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
for (const svc of Object.values(blockInstance)) {
|
|
1302
|
+
if (svc != null && typeof svc['setModel'] === 'function') {
|
|
1303
|
+
svc['setModel'](model);
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
}
|
|
1307
|
+
/** If model is a ref string, return an effect that keeps setModel/blockInstance in sync with the ref. */
|
|
1308
|
+
applyModelReactivity(desc, ctx, blockInstance, blockModel) {
|
|
1309
|
+
const rawModel = desc.inputs?.['model'];
|
|
1310
|
+
const refPath = rawModel != null && typeof rawModel === 'string'
|
|
1311
|
+
? rawModel.trim().replace(/^\{\{\s*|\s*\}\}$/g, '')
|
|
1312
|
+
: '';
|
|
1313
|
+
if (refPath.length === 0) {
|
|
1314
|
+
return [];
|
|
1315
|
+
}
|
|
1316
|
+
const effectRef = effect(() => {
|
|
1317
|
+
const model = refPath ? getRefValue(refPath, ctx) : blockModel();
|
|
1318
|
+
for (const svc of Object.values(blockInstance)) {
|
|
1319
|
+
if (svc != null && typeof svc['setModel'] === 'function') {
|
|
1320
|
+
svc['setModel'](model);
|
|
1321
|
+
}
|
|
1322
|
+
}
|
|
1323
|
+
}, { ...(ngDevMode ? { debugName: "effectRef" } : {}), injector: this.injector });
|
|
1324
|
+
return [effectRef];
|
|
1325
|
+
}
|
|
1326
|
+
/**
|
|
1327
|
+
* Replace each {{ refPath }} with a value: resolve as ref first (e.g. Person.instance.AuthState.firstName),
|
|
1328
|
+
* else as model path (e.g. firstName, instance.model.firstName). Allows mixing both in one template.
|
|
1329
|
+
*/
|
|
1330
|
+
interpolateTemplateMixed(template, ctx, model) {
|
|
1331
|
+
const parts = [];
|
|
1332
|
+
let s = template;
|
|
1333
|
+
for (let i = 0; i < BlockLoaderService.INTERPOLATE_MAX_PLACEHOLDERS; i++) {
|
|
1334
|
+
const start = s.indexOf('{{');
|
|
1335
|
+
if (start === -1) {
|
|
1336
|
+
parts.push(s);
|
|
1337
|
+
break;
|
|
1338
|
+
}
|
|
1339
|
+
parts.push(s.slice(0, start));
|
|
1340
|
+
const end = s.indexOf('}}', start);
|
|
1341
|
+
if (end === -1) {
|
|
1342
|
+
parts.push(s.slice(start));
|
|
1343
|
+
break;
|
|
1344
|
+
}
|
|
1345
|
+
const ref = s.slice(start + 2, end).trim();
|
|
1346
|
+
const val = ref
|
|
1347
|
+
? resolveRefPath(ref, ctx) != null
|
|
1348
|
+
? getRefValue(ref, ctx)
|
|
1349
|
+
: getValueByPath(model, ref)
|
|
1350
|
+
: null;
|
|
1351
|
+
parts.push(val != null ? String(val) : '');
|
|
1352
|
+
s = s.slice(end + 2);
|
|
1353
|
+
}
|
|
1354
|
+
return parts.join('');
|
|
1355
|
+
}
|
|
1238
1356
|
/** Replace all {{ refPath }} with resolved values. Uses parts array + join to avoid N string concats. */
|
|
1239
1357
|
static INTERPOLATE_MAX_PLACEHOLDERS = 200;
|
|
1240
1358
|
interpolateTemplate(template, ctx) {
|
|
@@ -1342,7 +1460,11 @@ function getServicesKey(services) {
|
|
|
1342
1460
|
const arr = normalizeServices(services);
|
|
1343
1461
|
if (arr.length === 0)
|
|
1344
1462
|
return '';
|
|
1345
|
-
return arr
|
|
1463
|
+
return arr
|
|
1464
|
+
.map((s) => typeof s === 'string'
|
|
1465
|
+
? s
|
|
1466
|
+
: `${s.id}:${s.scope ?? ''}`)
|
|
1467
|
+
.join(',');
|
|
1346
1468
|
}
|
|
1347
1469
|
class BlockDirective {
|
|
1348
1470
|
viewContainerRef = inject(ViewContainerRef);
|
|
@@ -1356,6 +1478,8 @@ class BlockDirective {
|
|
|
1356
1478
|
blockRegistry = input(null, ...(ngDevMode ? [{ debugName: "blockRegistry" }] : []));
|
|
1357
1479
|
/** Map id → full description; used when description is a block reference (id/blockId). */
|
|
1358
1480
|
blockDefinitions = input(null, ...(ngDevMode ? [{ debugName: "blockDefinitions" }] : []));
|
|
1481
|
+
/** Model for the block. */
|
|
1482
|
+
model = input(undefined, ...(ngDevMode ? [{ debugName: "model" }] : []));
|
|
1359
1483
|
loadResult = null;
|
|
1360
1484
|
loadedComponent = null;
|
|
1361
1485
|
loadedServicesKey = null;
|
|
@@ -1402,7 +1526,7 @@ class BlockDirective {
|
|
|
1402
1526
|
const registry = this.blockRegistry() ?? undefined;
|
|
1403
1527
|
const generation = ++this.loadGeneration;
|
|
1404
1528
|
this.loader
|
|
1405
|
-
.load(resolved, this.viewContainerRef, {
|
|
1529
|
+
.load(resolved, this.viewContainerRef, this.model, {
|
|
1406
1530
|
outputHandlers: Object.keys(outputHandlers).length > 0 ? outputHandlers : undefined,
|
|
1407
1531
|
registry,
|
|
1408
1532
|
blockDefinitions: inputDefs ?? undefined,
|
|
@@ -1434,7 +1558,7 @@ class BlockDirective {
|
|
|
1434
1558
|
}
|
|
1435
1559
|
}
|
|
1436
1560
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: BlockDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1437
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: BlockDirective, isStandalone: true, selector: "[block]", inputs: { description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, outputHandlers: { classPropertyName: "outputHandlers", publicName: "outputHandlers", isSignal: true, isRequired: false, transformFunction: null }, blockRegistry: { classPropertyName: "blockRegistry", publicName: "blockRegistry", isSignal: true, isRequired: false, transformFunction: null }, blockDefinitions: { classPropertyName: "blockDefinitions", publicName: "blockDefinitions", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
1561
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: BlockDirective, isStandalone: true, selector: "[block]", inputs: { description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, outputHandlers: { classPropertyName: "outputHandlers", publicName: "outputHandlers", isSignal: true, isRequired: false, transformFunction: null }, blockRegistry: { classPropertyName: "blockRegistry", publicName: "blockRegistry", isSignal: true, isRequired: false, transformFunction: null }, blockDefinitions: { classPropertyName: "blockDefinitions", publicName: "blockDefinitions", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
1438
1562
|
}
|
|
1439
1563
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: BlockDirective, decorators: [{
|
|
1440
1564
|
type: Directive,
|
|
@@ -1442,7 +1566,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
|
|
|
1442
1566
|
selector: '[block]',
|
|
1443
1567
|
standalone: true,
|
|
1444
1568
|
}]
|
|
1445
|
-
}], ctorParameters: () => [], propDecorators: { description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], outputHandlers: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputHandlers", required: false }] }], blockRegistry: [{ type: i0.Input, args: [{ isSignal: true, alias: "blockRegistry", required: false }] }], blockDefinitions: [{ type: i0.Input, args: [{ isSignal: true, alias: "blockDefinitions", required: false }] }] } });
|
|
1569
|
+
}], ctorParameters: () => [], propDecorators: { description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], outputHandlers: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputHandlers", required: false }] }], blockRegistry: [{ type: i0.Input, args: [{ isSignal: true, alias: "blockRegistry", required: false }] }], blockDefinitions: [{ type: i0.Input, args: [{ isSignal: true, alias: "blockDefinitions", required: false }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: false }] }] } });
|
|
1446
1570
|
|
|
1447
1571
|
/*
|
|
1448
1572
|
* Public API Surface of blocks-studio
|
|
@@ -1452,5 +1576,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
|
|
|
1452
1576
|
* Generated bundle index. Do not edit.
|
|
1453
1577
|
*/
|
|
1454
1578
|
|
|
1455
|
-
export { BlockDefinitionsRegistry, BlockDescriptionSchema, BlockDirective, BlockLoaderService, BlockRegistryImpl, ComponentRegistry, GuardRegistry, RegistryMetadataStore, RouteLoader, ServiceRegistry, buildComputedForTemplate, classifyTwoWayString, createOutputHandler, deepMergeBlockDefinition, extractReadonlyRefs, getRefPathFromReadonly, getRefValue, isBlockReference, isInvalidTwoWayMix, isOutputReference, isTwoWayRefString, normalizeServices, parseRefPath, parseTwoWayRef, resolveBlockReference, resolveOutputReference, resolveRefPath, safeParseBlockDescription, setRefValue };
|
|
1579
|
+
export { BlockDefinitionsRegistry, BlockDescriptionSchema, BlockDirective, BlockLoaderService, BlockRegistryImpl, ComponentRegistry, GuardRegistry, RegistryMetadataStore, RouteLoader, ServiceRegistry, buildComputedForTemplate, classifyTwoWayString, createOutputHandler, deepMergeBlockDefinition, extractReadonlyRefs, getRefPathFromReadonly, getRefSignal, getRefValue, getValueByPath, isBlockReference, isInvalidTwoWayMix, isOutputReference, isTwoWayRefString, normalizeServices, parseRefPath, parseTwoWayRef, refPathResolvesToSignal, resolveBlockReference, resolveOutputReference, resolveRefPath, safeParseBlockDescription, setRefValue };
|
|
1456
1580
|
//# sourceMappingURL=ngx-blocks-studio.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-blocks-studio.mjs","sources":["../../../projects/blocks-studio/src/lib/core/registry/registry-metadata.ts","../../../projects/blocks-studio/src/lib/core/registry/component.registry.ts","../../../projects/blocks-studio/src/lib/core/registry/guard.registry.ts","../../../projects/blocks-studio/src/lib/core/registry/service.registry.ts","../../../projects/blocks-studio/src/lib/core/services/router-loader.service.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block-definitions.registry.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block-description.schema.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block-registry.ts","../../../projects/blocks-studio/src/lib/core/block-loader/ref-expressions.ts","../../../projects/blocks-studio/src/lib/core/block-loader/ref-resolver.ts","../../../projects/blocks-studio/src/lib/core/block-loader/output-reference.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block-loader.service.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block.directive.ts","../../../projects/blocks-studio/src/public-api.ts","../../../projects/blocks-studio/src/ngx-blocks-studio.ts"],"sourcesContent":["/**\n * Registry entry type: component, service, or guard.\n */\nexport type RegistryEntryType = 'component' | 'service' | 'guard';\n\n/**\n * Metadata value stored per registry key.\n */\nexport type RegistryMetadataRecord = Record<string, unknown>;\n\nexport interface AllRegistryMetadata {\n components: Map<string, RegistryMetadataRecord>;\n services: Map<string, RegistryMetadataRecord>;\n guards: Map<string, RegistryMetadataRecord>;\n}\n\n/**\n * Single source of truth for metadata across component, service, and guard registries.\n * All registries delegate to this store so metadata can be queried uniformly\n * and all metadata can be retrieved in one call.\n */\nexport class RegistryMetadataStore {\n private static instance: RegistryMetadataStore;\n private entries = new Map<string, { type: RegistryEntryType; data: RegistryMetadataRecord }>();\n\n private constructor() {}\n\n static getInstance(): RegistryMetadataStore {\n if (!RegistryMetadataStore.instance) {\n RegistryMetadataStore.instance = new RegistryMetadataStore();\n }\n return RegistryMetadataStore.instance;\n }\n\n /**\n * Set metadata for a registry key (component, service, or guard).\n */\n set(key: string, type: RegistryEntryType, data: RegistryMetadataRecord): void {\n this.entries.set(key, { type, data });\n }\n\n /**\n * Get metadata for a key. Returns undefined if the key is not registered.\n */\n get(key: string): RegistryMetadataRecord | undefined {\n return this.entries.get(key)?.data;\n }\n\n /**\n * Alias for get(); allows registries to expose getMetadata(key).\n */\n getMetadata(key: string): RegistryMetadataRecord | undefined {\n return this.get(key);\n }\n\n /**\n * Get all metadata for a given type (components or services).\n */\n getByType(type: RegistryEntryType): Map<string, RegistryMetadataRecord> {\n const result = new Map<string, RegistryMetadataRecord>();\n for (const [key, entry] of this.entries) {\n if (entry.type === type) {\n result.set(key, entry.data);\n }\n }\n return result;\n }\n\n /**\n * Get all metadata for component, service, and guard registries in one call.\n */\n getAllMetadata(): AllRegistryMetadata {\n return {\n components: this.getByType('component'),\n services: this.getByType('service'),\n guards: this.getByType('guard'),\n };\n }\n\n /**\n * Remove metadata for a key (e.g. when unregistering).\n */\n remove(key: string): boolean {\n return this.entries.delete(key);\n }\n\n /**\n * Check if metadata exists for a key.\n */\n has(key: string): boolean {\n return this.entries.has(key);\n }\n\n /**\n * Clear all metadata (e.g. when clearing registries).\n */\n clear(): void {\n this.entries.clear();\n }\n}\n","import { Type } from '@angular/core';\nimport {\n RegistryMetadataStore,\n RegistryMetadataRecord,\n} from './registry-metadata';\n\ntype ComponentLoader = () => Promise<Type<any>>;\ntype ComponentOrLoader = Type<any> | ComponentLoader;\n\nexport class ComponentRegistry {\n private static instance: ComponentRegistry;\n private components = new Map<string, ComponentOrLoader>();\n private loadedComponents = new Map<string, Type<any>>();\n private readonly metadataStore = RegistryMetadataStore.getInstance();\n\n private constructor() {}\n\n static getInstance(): ComponentRegistry {\n if (!ComponentRegistry.instance) {\n ComponentRegistry.instance = new ComponentRegistry();\n }\n return ComponentRegistry.instance;\n }\n\n register(\n name: string,\n component: Type<any> | ComponentLoader,\n metadata?: RegistryMetadataRecord\n ): void {\n if (this.components.has(name)) {\n console.warn(`Component ${name} is already registered. Overwriting...`);\n }\n\n this.components.set(name, component);\n // If it's already a Type, cache it\n if (typeof component !== 'function' || component.prototype) {\n this.loadedComponents.set(name, component as Type<any>);\n }\n if (metadata != null && Object.keys(metadata).length > 0) {\n this.metadataStore.set(name, 'component', metadata);\n }\n }\n\n async get(name: string): Promise<Type<any> | undefined> {\n // Check if already loaded\n if (this.loadedComponents.has(name)) {\n return this.loadedComponents.get(name);\n }\n\n const componentOrLoader = this.components.get(name);\n if (!componentOrLoader) {\n return undefined;\n }\n\n // Check if it's a loader function (not a Type)\n // Type functions have a prototype, loader functions don't\n const isLoader =\n typeof componentOrLoader === 'function' && !(componentOrLoader as any).prototype?.constructor;\n\n if (isLoader) {\n try {\n const loader = componentOrLoader as ComponentLoader;\n const component = await loader();\n this.loadedComponents.set(name, component);\n return component;\n } catch (error) {\n console.error(`Failed to lazy load component \"${name}\":`, error);\n return undefined;\n }\n }\n\n // It's already a Type\n const component = componentOrLoader as Type<any>;\n this.loadedComponents.set(name, component);\n return component;\n }\n\n getSync(name: string): Type<any> | undefined {\n // Check if already loaded\n if (this.loadedComponents.has(name)) {\n return this.loadedComponents.get(name);\n }\n\n const componentOrLoader = this.components.get(name);\n if (!componentOrLoader) {\n return undefined;\n }\n\n // Check if it's a loader function (not a Type)\n const isLoader =\n typeof componentOrLoader === 'function' && !(componentOrLoader as any).prototype?.constructor;\n\n // If it's a loader, we can't get it synchronously\n if (isLoader) {\n return undefined;\n }\n\n // It's already a Type\n const component = componentOrLoader as Type<any>;\n this.loadedComponents.set(name, component);\n return component;\n }\n\n has(name: string): boolean {\n return this.components.has(name);\n }\n\n getAll(): Map<string, Type<any>> {\n return new Map(this.loadedComponents);\n }\n\n unregister(name: string): boolean {\n this.metadataStore.remove(name);\n this.loadedComponents.delete(name);\n return this.components.delete(name);\n }\n\n clear(): void {\n for (const name of this.components.keys()) {\n this.metadataStore.remove(name);\n }\n this.components.clear();\n this.loadedComponents.clear();\n }\n\n getMetadata(key: string): RegistryMetadataRecord | undefined {\n return this.metadataStore.getMetadata(key);\n }\n\n getAllWithMetadata(): Map<string, { component: Type<any>; metadata?: RegistryMetadataRecord }> {\n const result = new Map<string, { component: Type<any>; metadata?: RegistryMetadataRecord }>();\n for (const [name, component] of this.loadedComponents) {\n result.set(name, {\n component,\n metadata: this.metadataStore.getMetadata(name),\n });\n }\n return result;\n }\n}\n","import { Type } from '@angular/core';\nimport { CanActivateFn } from '@angular/router';\nimport {\n RegistryMetadataStore,\n RegistryMetadataRecord,\n} from './registry-metadata';\n\n/**\n * Guard type: functional guard or class-based guard type.\n * Registered by name; resolved by RouteLoader from route config guards array.\n */\nexport type GuardOrType = CanActivateFn | Type<unknown>;\n\n/** Loader for lazy-loaded guards. Must be a function with no parameters that returns Promise<GuardOrType>. */\nexport type GuardLoader = () => Promise<GuardOrType>;\n\nexport type GuardOrLoader = GuardOrType | GuardLoader;\n\nexport class GuardRegistry {\n private static instance: GuardRegistry;\n private guards = new Map<string, GuardOrLoader>();\n private loadedGuards = new Map<string, GuardOrType>();\n private readonly metadataStore = RegistryMetadataStore.getInstance();\n\n private constructor() {}\n\n static getInstance(): GuardRegistry {\n if (!GuardRegistry.instance) {\n GuardRegistry.instance = new GuardRegistry();\n }\n return GuardRegistry.instance;\n }\n\n register(name: string, guard: GuardOrLoader, metadata?: RegistryMetadataRecord): void {\n if (this.guards.has(name)) {\n console.warn(`Guard \"${name}\" is already registered. Overwriting...`);\n }\n this.guards.set(name, guard);\n if (!this.isLoader(guard)) {\n this.loadedGuards.set(name, guard as GuardOrType);\n } else {\n this.loadedGuards.delete(name);\n }\n if (metadata != null && Object.keys(metadata).length > 0) {\n this.metadataStore.set(name, 'guard', metadata);\n }\n }\n\n /**\n * Resolve guard by name (async; runs loader if needed).\n */\n async get(name: string): Promise<GuardOrType | undefined> {\n if (this.loadedGuards.has(name)) {\n return this.loadedGuards.get(name);\n }\n\n const guardOrLoader = this.guards.get(name);\n if (!guardOrLoader) {\n return undefined;\n }\n\n if (this.isLoader(guardOrLoader)) {\n try {\n const loader = guardOrLoader as GuardLoader;\n const guard = await loader();\n this.loadedGuards.set(name, guard);\n return guard;\n } catch (error) {\n console.error(`Failed to lazy load guard \"${name}\":`, error);\n return undefined;\n }\n }\n\n const guard = guardOrLoader as GuardOrType;\n this.loadedGuards.set(name, guard);\n return guard;\n }\n\n /**\n * Resolve guard synchronously. Returns undefined if the entry is a lazy loader not yet loaded.\n */\n getSync(name: string): GuardOrType | undefined {\n if (this.loadedGuards.has(name)) {\n return this.loadedGuards.get(name);\n }\n\n const guardOrLoader = this.guards.get(name);\n if (!guardOrLoader || this.isLoader(guardOrLoader)) {\n return undefined;\n }\n\n const guard = guardOrLoader as GuardOrType;\n this.loadedGuards.set(name, guard);\n return guard;\n }\n\n has(name: string): boolean {\n return this.guards.has(name);\n }\n\n getMetadata(key: string): RegistryMetadataRecord | undefined {\n return this.metadataStore.getMetadata(key);\n }\n\n getAllWithMetadata(): Map<string, { guard: GuardOrType; metadata?: RegistryMetadataRecord }> {\n const result = new Map<string, { guard: GuardOrType; metadata?: RegistryMetadataRecord }>();\n for (const [name, guard] of this.loadedGuards) {\n result.set(name, {\n guard,\n metadata: this.metadataStore.getMetadata(name),\n });\n }\n return result;\n }\n\n unregister(name: string): boolean {\n this.metadataStore.remove(name);\n this.loadedGuards.delete(name);\n return this.guards.delete(name);\n }\n\n clear(): void {\n for (const name of this.guards.keys()) {\n this.metadataStore.remove(name);\n }\n this.guards.clear();\n this.loadedGuards.clear();\n }\n\n private isLoader(value: GuardOrLoader): value is GuardLoader {\n return (\n typeof value === 'function' &&\n (value as GuardLoader).length === 0\n );\n }\n}\n","import { Type, Injector, inject } from '@angular/core';\nimport {\n RegistryMetadataStore,\n RegistryMetadataRecord,\n} from './registry-metadata';\n\ntype ServiceLoader = () => Promise<Type<any>>;\ntype ServiceOrLoader = Type<any> | ServiceLoader;\n\nexport class ServiceRegistry {\n private static instance: ServiceRegistry;\n private services = new Map<string, ServiceOrLoader>();\n private loadedServices = new Map<string, Type<any>>();\n private injector: Injector | null = null;\n private readonly metadataStore = RegistryMetadataStore.getInstance();\n\n private constructor() {}\n\n static getInstance(): ServiceRegistry {\n if (!ServiceRegistry.instance) {\n ServiceRegistry.instance = new ServiceRegistry();\n }\n return ServiceRegistry.instance;\n }\n\n /**\n * Set the injector to use for service resolution\n */\n setInjector(injector: Injector): void {\n this.injector = injector;\n }\n\n /**\n * Register a service by name (supports lazy loading)\n */\n register(\n name: string,\n service: Type<any> | ServiceLoader,\n metadata?: RegistryMetadataRecord\n ): void {\n if (this.services.has(name)) {\n console.warn(`Service ${name} is already registered. Overwriting...`);\n }\n this.services.set(name, service);\n // If it's already a Type, cache it\n if (typeof service !== 'function' || (service as any).prototype) {\n this.loadedServices.set(name, service as Type<any>);\n }\n if (metadata != null && Object.keys(metadata).length > 0) {\n this.metadataStore.set(name, 'service', metadata);\n }\n }\n\n /**\n * Get a service instance by name (supports lazy loading)\n * Requires injector to be set first\n */\n async get(name: string): Promise<any> {\n // Check if already loaded\n if (this.loadedServices.has(name)) {\n const serviceType = this.loadedServices.get(name)!;\n return this.injectService(serviceType);\n }\n\n const serviceOrLoader = this.services.get(name);\n if (!serviceOrLoader) {\n console.error(`Service \"${name}\" not found in registry`);\n return undefined;\n }\n\n // Check if it's a loader function (not a Type)\n const isLoader = typeof serviceOrLoader === 'function' && \n !(serviceOrLoader as any).prototype?.constructor;\n\n if (isLoader) {\n try {\n const loader = serviceOrLoader as ServiceLoader;\n const serviceType = await loader();\n this.loadedServices.set(name, serviceType);\n return this.injectService(serviceType);\n } catch (error) {\n console.error(`Failed to lazy load service \"${name}\":`, error);\n return undefined;\n }\n }\n\n // It's already a Type\n const serviceType = serviceOrLoader as Type<any>;\n this.loadedServices.set(name, serviceType);\n return this.injectService(serviceType);\n }\n\n /**\n * Get a service instance synchronously (only works for already loaded services)\n */\n getSync(name: string): any {\n // Check if already loaded\n if (this.loadedServices.has(name)) {\n const serviceType = this.loadedServices.get(name)!;\n return this.injectService(serviceType);\n }\n\n const serviceOrLoader = this.services.get(name);\n if (!serviceOrLoader) {\n console.error(`Service \"${name}\" not found in registry`);\n return undefined;\n }\n\n // Check if it's a loader function\n const isLoader = typeof serviceOrLoader === 'function' && \n !(serviceOrLoader as any).prototype?.constructor;\n\n // If it's a loader, we can't get it synchronously\n if (isLoader) {\n console.warn(`Service \"${name}\" is lazy loaded and cannot be retrieved synchronously. Use get() instead.`);\n return undefined;\n }\n\n // It's already a Type\n const serviceType = serviceOrLoader as Type<any>;\n this.loadedServices.set(name, serviceType);\n return this.injectService(serviceType);\n }\n\n /**\n * Inject a service type using the injector\n */\n private injectService(serviceType: Type<any>): any {\n if (!this.injector) {\n // Try to use inject() if no injector is set\n try {\n return inject(serviceType);\n } catch (error) {\n console.error(`Cannot inject service: No injector set and inject() failed`, error);\n return undefined;\n }\n }\n\n try {\n return this.injector.get(serviceType);\n } catch (error) {\n console.error(`Failed to get service from injector:`, error);\n return undefined;\n }\n }\n\n /**\n * Get the service Type (class) by name (supports lazy loading).\n * Use this to scope the provider to a child injector (e.g. \"self\" context).\n */\n async getType(name: string): Promise<Type<any> | undefined> {\n if (this.loadedServices.has(name)) {\n return this.loadedServices.get(name);\n }\n\n const serviceOrLoader = this.services.get(name);\n if (!serviceOrLoader) {\n console.error(`Service \"${name}\" not found in registry`);\n return undefined;\n }\n\n const isLoader =\n typeof serviceOrLoader === 'function' &&\n !(serviceOrLoader as any).prototype?.constructor;\n\n if (isLoader) {\n try {\n const loader = serviceOrLoader as ServiceLoader;\n const serviceType = await loader();\n this.loadedServices.set(name, serviceType);\n return serviceType;\n } catch (error) {\n console.error(`Failed to lazy load service \"${name}\":`, error);\n return undefined;\n }\n }\n\n const serviceType = serviceOrLoader as Type<any>;\n this.loadedServices.set(name, serviceType);\n return serviceType;\n }\n\n /**\n * Get the service Type synchronously (only for already loaded services).\n */\n getTypeSync(name: string): Type<any> | undefined {\n if (this.loadedServices.has(name)) {\n return this.loadedServices.get(name);\n }\n\n const serviceOrLoader = this.services.get(name);\n if (!serviceOrLoader) {\n return undefined;\n }\n\n const isLoader =\n typeof serviceOrLoader === 'function' &&\n !(serviceOrLoader as any).prototype?.constructor;\n\n if (isLoader) {\n return undefined;\n }\n\n const serviceType = serviceOrLoader as Type<any>;\n this.loadedServices.set(name, serviceType);\n return serviceType;\n }\n\n /**\n * Check if a service is registered\n */\n has(name: string): boolean {\n return this.services.has(name);\n }\n\n /**\n * Get all registered service names\n */\n getAllNames(): string[] {\n return Array.from(this.services.keys());\n }\n\n /**\n * Get metadata for a registered service by key.\n */\n getMetadata(key: string): RegistryMetadataRecord | undefined {\n return this.metadataStore.getMetadata(key);\n }\n\n /**\n * Unregister a service\n */\n unregister(name: string): boolean {\n this.metadataStore.remove(name);\n this.loadedServices.delete(name);\n return this.services.delete(name);\n }\n\n /**\n * Clear all registered services\n */\n clear(): void {\n for (const name of this.services.keys()) {\n this.metadataStore.remove(name);\n }\n this.services.clear();\n this.loadedServices.clear();\n }\n}\n\n","import { Router, Routes, RunGuardsAndResolvers } from '@angular/router';\nimport { Type, Injectable, inject, signal, computed } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom } from 'rxjs';\nimport { ComponentRegistry } from '../registry/component.registry';\nimport { GuardRegistry, type GuardOrType } from '../registry/guard.registry';\n\n/**\n * Route configuration for the router.\n * @param path - The path of the route.\n * @param component - The component key to load for the route using the ComponentRegistry.\n * @param title - The title of the route.\n * @param canActivate - The guards keys to activate for the route using the GuardRegistry.\n * @param canDeactivate - The guards keys to deactivate for the route using the GuardRegistry.\n * @param canLoad - The guards keys to load for the route using the GuardRegistry.\n * @param canMatch - The guards keys to match for the route using the GuardRegistry.\n * @param pathMatch - The path match strategy for the route.\n * @param outlet - The outlet of the route.\n * @param canActivateChild - The guards keys to activate the children routes for the route using the GuardRegistry.\n * @param runGuardsAndResolvers - The strategy to run guards and resolvers for the route.\n * @param data - The data to pass to the route. It will be merged with the data from the route config file.\n * @param children - Nested routes and optional defaultRedirect/catchAllRedirect for the child segment.\n */\n\nexport interface RouteConfig {\n path: string;\n component: string;\n title?: string;\n canActivate?: string[];\n canDeactivate?: string[];\n canLoad?: string[];\n canMatch?: string[];\n outlet?: string;\n pathMatch?: 'full' | 'prefix';\n canActivateChild?: string[];\n runGuardsAndResolvers?: RunGuardsAndResolvers;\n data?: Record<string, any>;\n /** Child routes; can include defaultRedirect and catchAllRedirect for this segment. */\n children?: RouteConfigs;\n}\n\nexport interface RouteConfigs {\n routes: RouteConfig[];\n /** Redirect path for empty route (path: ''). Omit to not add a default redirect. */\n defaultRedirect?: string;\n /** Redirect path for unknown routes (path: '**'). Omit to not add a catch-all. */\n catchAllRedirect?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RouteLoader {\n private router = inject(Router);\n private http = inject(HttpClient);\n private componentRegistry = ComponentRegistry.getInstance();\n private guardRegistry = GuardRegistry.getInstance();\n\n private readonly _routeConfigFile = signal<RouteConfigs | null>(null);\n private readonly _configPath = signal<string>('');\n\n /** Currently loaded route config file, or null if not yet loaded. */\n readonly routeConfigFile = this._routeConfigFile.asReadonly();\n /** Path from which the config was loaded. */\n readonly configPath = this._configPath.asReadonly();\n /** Route config array from the loaded file. */\n readonly routeConfig = computed<RouteConfig[]>(() => this._routeConfigFile()?.routes ?? []);\n\n /**\n * Load routes from a config object. Updates signals and resets the router.\n */\n async loadRoutes(config: RouteConfigs): Promise<void> {\n this._configPath.set('');\n this._routeConfigFile.set(config);\n await this.updateRoutes();\n }\n\n /**\n * Fetch route config from a URL (HTTP GET), then load it. Sets configPath signal to the requested URL.\n */\n async loadRoutesFromUrl(configPath: string): Promise<void> {\n try {\n const config = await firstValueFrom(this.http.get<RouteConfigs>(configPath));\n this._configPath.set(configPath);\n this._routeConfigFile.set(config);\n await this.updateRoutes();\n } catch (error) {\n console.error('Failed to load route configuration from URL:', error);\n throw error;\n }\n }\n\n private async updateRoutes(): Promise<void> {\n const config = this._routeConfigFile();\n const routeConfigList = this.routeConfig();\n const routes: Routes = await Promise.all(\n routeConfigList.map((routeConfig) => this.convertRouteConfig(routeConfig))\n );\n\n if (config?.defaultRedirect != null && config.defaultRedirect !== '') {\n routes.unshift({\n path: '',\n redirectTo: config.defaultRedirect,\n pathMatch: 'full',\n });\n }\n\n if (config?.catchAllRedirect != null && config.catchAllRedirect !== '') {\n routes.push({\n path: '**',\n redirectTo: config.catchAllRedirect,\n });\n }\n\n this.router.resetConfig(routes);\n }\n\n private async convertRouteConfig(config: RouteConfig): Promise<Routes[0]> {\n const routeData: Record<string, unknown> = { ...(config.data ?? {}) };\n if (config.component) {\n routeData['component'] = config.component;\n }\n\n const [\n canActivateGuards,\n canDeactivateGuards,\n canLoadGuards,\n canMatchGuards,\n canActivateChildGuards,\n ] = await Promise.all([\n this.resolveGuards(config.canActivate),\n this.resolveGuards(config.canDeactivate),\n this.resolveGuards(config.canLoad),\n this.resolveGuards(config.canMatch),\n this.resolveGuards(config.canActivateChild),\n ]);\n\n const route: Routes[0] = {\n path: config.path,\n loadComponent: () => this.loadComponent(config),\n data: routeData,\n ...(config.title != null && { title: config.title }),\n ...(config.outlet != null && { outlet: config.outlet }),\n ...(config.pathMatch != null && { pathMatch: config.pathMatch }),\n ...(config.runGuardsAndResolvers != null && {\n runGuardsAndResolvers: config.runGuardsAndResolvers,\n }),\n ...(canActivateGuards.length > 0 && {\n canActivate: canActivateGuards as Routes[0]['canActivate'],\n }),\n ...(canDeactivateGuards.length > 0 && {\n canDeactivate: canDeactivateGuards as Routes[0]['canDeactivate'],\n }),\n ...(canLoadGuards.length > 0 && { canLoad: canLoadGuards as Routes[0]['canLoad'] }),\n ...(canMatchGuards.length > 0 && { canMatch: canMatchGuards as Routes[0]['canMatch'] }),\n ...(canActivateChildGuards.length > 0 && {\n canActivateChild: canActivateChildGuards as Routes[0]['canActivateChild'],\n }),\n };\n\n if (config.children?.routes?.length) {\n const childConfigs = config.children;\n route.children = await Promise.all(\n childConfigs.routes.map((child) => this.convertRouteConfig(child))\n );\n if (childConfigs.defaultRedirect != null && childConfigs.defaultRedirect !== '') {\n route.children.unshift({\n path: '',\n redirectTo: childConfigs.defaultRedirect,\n pathMatch: 'full',\n });\n }\n if (childConfigs.catchAllRedirect != null && childConfigs.catchAllRedirect !== '') {\n route.children.push({\n path: '**',\n redirectTo: childConfigs.catchAllRedirect,\n });\n }\n }\n\n return route;\n }\n\n private async resolveGuards(guardNames: string[] | undefined): Promise<GuardOrType[]> {\n if (!guardNames?.length) return [];\n const resolved = await Promise.all(guardNames.map((name) => this.getGuard(name)));\n return resolved.filter((g): g is GuardOrType => g != null);\n }\n\n private async loadComponent(routeConfig: RouteConfig): Promise<Type<unknown>> {\n const componentName = routeConfig.component;\n if (!componentName) {\n throw new Error('Route config must specify a component key.');\n }\n const component = await this.componentRegistry.get(componentName);\n if (!component) {\n throw new Error(\n `Component \"${componentName}\" is not registered. Register it with ComponentRegistry before loading routes.`\n );\n }\n return component;\n }\n\n private async getGuard(guardName: string): Promise<GuardOrType | null> {\n const guard = await this.guardRegistry.get(guardName);\n if (guard == null) {\n console.warn(`Unknown guard: ${guardName}. Register it with GuardRegistry.`);\n return null;\n }\n return guard;\n }\n}\n","/**\n * Global registry of block id → definition. Register block configs at app init\n * so they can be used as templates anywhere (e.g. nested blocks that reference\n * { id: 'AppNav' } resolve without passing blockDefinitions down).\n * Per-call blockDefinitions (e.g. from route data) override global entries.\n */\nexport class BlockDefinitionsRegistry {\n private static instance: BlockDefinitionsRegistry;\n private readonly definitions = new Map<string, Record<string, unknown>>();\n\n private constructor() {}\n\n static getInstance(): BlockDefinitionsRegistry {\n if (!BlockDefinitionsRegistry.instance) {\n BlockDefinitionsRegistry.instance = new BlockDefinitionsRegistry();\n }\n return BlockDefinitionsRegistry.instance;\n }\n\n /** Register a block template by id. Can be called before the block is needed. */\n register(id: string, definition: Record<string, unknown>): void {\n this.definitions.set(id, definition);\n }\n\n /** Get one definition by id. */\n get(id: string): Record<string, unknown> | undefined {\n return this.definitions.get(id);\n }\n\n /** Get all registered definitions (id → definition). Used to merge with per-call definitions. */\n getAll(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n this.definitions.forEach((def, id) => {\n out[id] = def;\n });\n return out;\n }\n\n unregister(id: string): boolean {\n return this.definitions.delete(id);\n }\n}\n","import { z } from 'zod';\nimport { BlockDefinitionsRegistry } from './block-definitions.registry';\n\n/**\n * Service entry: root-scoped (string id) or self-scoped ({ id, scope: \"self\" }).\n */\nconst ServiceEntrySchema = z.union([\n z.string().min(1),\n z.object({\n id: z.string().min(1),\n scope: z.literal('self'),\n }),\n]);\n\n/**\n * Output handler: empty (use directive-provided handler) or reference-based (call method on ref).\n */\nconst OutputReferenceSchema = z.object({\n type: z.literal('reference'),\n reference: z.string().min(1),\n method: z.string().min(1),\n params: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional(),\n then: z\n .array(\n z.object({\n reference: z.string().min(1),\n method: z.string().min(1),\n params: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional(),\n }),\n )\n .optional(),\n onSuccess: z\n .object({\n reference: z.string().min(1),\n method: z.string().min(1),\n params: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional(),\n })\n .optional(),\n onError: z\n .object({\n reference: z.string().min(1),\n method: z.string().min(1),\n params: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional(),\n })\n .optional(),\n});\n\nconst OutputValueSchema = z.union([z.record(z.string(), z.unknown()), OutputReferenceSchema]);\n\n/**\n * Block description: JSON-serializable descriptor for dynamic block loading.\n * Refs in inputs use instance namespace: instance.FormState.firstName or UserForm.instance.FormState.firstName.\n */\nexport const BlockDescriptionSchema = z.object({\n component: z.string().min(1),\n id: z.string().min(1).optional(),\n services: z\n .union([ServiceEntrySchema, z.array(ServiceEntrySchema)])\n .optional()\n .default([]),\n inputs: z.record(z.string(), z.unknown()).optional(),\n outputs: z.record(z.string(), OutputValueSchema).optional(),\n});\n\nexport type BlockDescription = z.infer<typeof BlockDescriptionSchema>;\nexport type ServiceEntry = z.infer<typeof ServiceEntrySchema>;\nexport type OutputReference = z.infer<typeof OutputReferenceSchema>;\n\n/** Normalize services to array. */\nexport function normalizeServices(services: BlockDescription['services']): ServiceEntry[] {\n if (services == null) return [];\n return Array.isArray(services) ? services : [services];\n}\n\nexport function safeParseBlockDescription(\n data: unknown,\n): ReturnType<typeof BlockDescriptionSchema.safeParse> {\n return BlockDescriptionSchema.safeParse(data);\n}\n\nexport function isOutputReference(value: unknown): value is OutputReference {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as OutputReference).type === 'reference' &&\n typeof (value as OutputReference).reference === 'string' &&\n typeof (value as OutputReference).method === 'string'\n );\n}\n\n/**\n * Reference to a registered block: { blockId: string, blockDefinition?: object }.\n * Resolution uses blockId only to look up the registered block description.\n * When blockDefinition is provided, it is deep-merged onto the base so only\n * specified properties override (e.g. inputs.model); other keys are preserved.\n */\nexport interface BlockReference {\n /** Used by isBlockReference only; resolution uses blockId. */\n id?: string;\n /** Registered block id used to resolve the block description. */\n blockId?: string;\n blockDefinition?: Record<string, unknown>;\n}\n\nexport function isBlockReference(value: unknown): value is BlockReference {\n if (typeof value !== 'object' || value === null || 'component' in value) return false;\n const id = (value as BlockReference).id ?? (value as BlockReference).blockId;\n return typeof id === 'string' && id.length > 0;\n}\n\n/**\n * Deep-merge override onto base. Only keys present in override are changed; nested objects\n * are merged recursively so e.g. override.inputs.model does not remove base.inputs.rows.\n * Arrays and primitives in override replace the base value.\n */\nexport function deepMergeBlockDefinition(\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...base };\n for (const key of Object.keys(override)) {\n const baseVal = result[key];\n const overrideVal = override[key];\n if (\n overrideVal != null &&\n typeof overrideVal === 'object' &&\n !Array.isArray(overrideVal) &&\n baseVal != null &&\n typeof baseVal === 'object' &&\n !Array.isArray(baseVal)\n ) {\n result[key] = deepMergeBlockDefinition(\n baseVal as Record<string, unknown>,\n overrideVal as Record<string, unknown>,\n );\n } else {\n result[key] = overrideVal;\n }\n }\n return result;\n}\n\n/**\n * Resolve a block reference to a full description using optional per-call definitions\n * and the global BlockDefinitionsRegistry. Per-call blockDefinitions take precedence\n * over global entries. If blockDefinition is present, it is deep-merged onto the base;\n * otherwise returns a shallow copy of the base.\n */\nexport function resolveBlockReference(\n ref: BlockReference,\n blockDefinitions: Record<string, unknown> | null | undefined,\n): Record<string, unknown> {\n const blockId = ref.blockId;\n const id = ref.id;\n const registry: BlockDefinitionsRegistry = BlockDefinitionsRegistry.getInstance();\n if (!blockId || typeof blockId !== 'string')\n throw new Error('Block reference must have blockId.');\n\n let base: unknown;\n if (blockDefinitions && Object.prototype.hasOwnProperty.call(blockDefinitions, blockId)) {\n base = blockDefinitions[blockId];\n } else {\n base = registry.get(blockId);\n }\n\n if (base == null || typeof base !== 'object')\n throw new Error(`Block \"${blockId}\" has no definition.`);\n\n const baseObj = { ...base, id };\n\n const overrides = ref.blockDefinition;\n if (overrides == null || typeof overrides !== 'object' || Object.keys(overrides).length === 0)\n return { ...baseObj };\n return deepMergeBlockDefinition(baseObj, overrides);\n}\n","import type { Signal } from '@angular/core';\n\n/**\n * Handle for a registered block: exposes instance (services/state by name) for ref resolution.\n */\nexport interface BlockInstanceHandle {\n /** Instance: services and state by name (e.g. FormState, value). */\n instance: Record<string, unknown>;\n /** Optional cleanup when block is destroyed. */\n destroy?: () => void;\n}\n\n/**\n * Registry of block instances by (full) id within a tree.\n * One registry per logical tree; duplicate id throws.\n */\nexport interface BlockRegistry {\n register(id: string, handle: BlockInstanceHandle): void;\n unregister(id: string): void;\n get(id: string): BlockInstanceHandle | undefined;\n has(id: string): boolean;\n}\n\n/**\n * Default in-memory BlockRegistry.\n */\nexport class BlockRegistryImpl implements BlockRegistry {\n private readonly map = new Map<string, BlockInstanceHandle>();\n\n register(id: string, handle: BlockInstanceHandle): void {\n if (this.map.has(id)) {\n throw new Error(`Block id \"${id}\" is already registered. Each id may only occur once per tree.`);\n }\n this.map.set(id, handle);\n }\n\n unregister(id: string): void {\n this.map.delete(id);\n }\n\n get(id: string): BlockInstanceHandle | undefined {\n return this.map.get(id);\n }\n\n has(id: string): boolean {\n return this.map.has(id);\n }\n}\n","/**\n * Parse ref paths and detect {{ref}} (read-only) and [(ref)] (two-way) in strings.\n */\n\nconst READONLY_REF_RE = /\\{\\{([^}]+)\\}\\}/g;\nconst TWOWAY_REF_RE = /^\\[\\(([^)]+)\\)\\]$/;\n\nexport interface ParsedRefPath {\n blockId?: string;\n instancePath: string;\n pathParts: string[];\n}\n\nconst PARSE_REF_PATH_CACHE_MAX = 64;\nconst parseRefPathCache = new Map<string, ParsedRefPath>();\n\nfunction toPathParts(instancePath: string): string[] {\n return instancePath.split('.').filter(Boolean);\n}\n\nfunction parseRefPathUncached(refPath: string): ParsedRefPath {\n const trimmed = refPath.trim();\n const parts = trimmed.split('.');\n if (parts.length >= 2 && parts[0] === 'instance') {\n return { instancePath: trimmed, pathParts: toPathParts(trimmed) };\n }\n if (parts.length >= 3 && parts[1] === 'instance') {\n const instancePath = parts.slice(1).join('.');\n return { blockId: parts[0], instancePath, pathParts: toPathParts(instancePath) };\n }\n return { instancePath: trimmed, pathParts: toPathParts(trimmed) };\n}\n\nexport function parseRefPath(refPath: string): ParsedRefPath {\n const cached = parseRefPathCache.get(refPath);\n if (cached) return cached;\n const result = parseRefPathUncached(refPath);\n if (parseRefPathCache.size >= PARSE_REF_PATH_CACHE_MAX) parseRefPathCache.clear();\n parseRefPathCache.set(refPath, result);\n return result;\n}\n\nexport function extractReadonlyRefs(template: string): string[] {\n const refs: string[] = [];\n let m: RegExpExecArray | null;\n READONLY_REF_RE.lastIndex = 0;\n while ((m = READONLY_REF_RE.exec(template)) !== null) {\n const ref = m[1].trim();\n if (ref && !refs.includes(ref)) refs.push(ref);\n }\n return refs;\n}\n\nexport function isTwoWayRefString(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n return TWOWAY_REF_RE.test(value.trim());\n}\n\n/**\n * True when a string contains two-way ref delimiters `[(` or `)]` but is not a valid\n * standalone two-way ref (exact form `[(refPath)]`). Mixing two-way with literals or {{ }} is invalid.\n */\nexport function isInvalidTwoWayMix(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n const s = value.trim();\n const hasDelimiters = s.includes('[(') || s.includes(')]');\n return hasDelimiters && !TWOWAY_REF_RE.test(s);\n}\n\n/**\n * One trim + one pass: classify string for two-way ref handling. Use instead of calling\n * isInvalidTwoWayMix and isTwoWayRefString separately to avoid double trim/regex.\n */\nexport function classifyTwoWayString(value: unknown): 'two-way' | 'invalid-mix' | 'none' {\n if (typeof value !== 'string') return 'none';\n const s = value.trim();\n if (!s.includes('[(') && !s.includes(')]')) return 'none';\n return TWOWAY_REF_RE.test(s) ? 'two-way' : 'invalid-mix';\n}\n\nexport function parseTwoWayRef(value: string): string | null {\n const m = value.trim().match(TWOWAY_REF_RE);\n return m ? m[1].trim() : null;\n}\n\nexport function getRefPathFromReadonly(template: string, match: string): string {\n const re = new RegExp(`\\\\{\\\\{${escapeRe(match)}\\\\}\\\\}`, 'g');\n const m = re.exec(template);\n return m ? match : '';\n}\n\nfunction escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import { computed, type Signal } from '@angular/core';\nimport type { BlockRegistry } from './block-registry';\nimport { parseRefPath } from './ref-expressions';\n\nexport interface ResolverContext {\n registry: BlockRegistry;\n /** Current block's full id (nearest block with id). */\n currentBlockId?: string;\n /** Current block's instance (services/state by name). */\n currentInstance?: Record<string, unknown>;\n}\n\n/**\n * Resolve a ref path to the target object and path.\n * Path format: \"instance.FormState.firstName\" (context) or \"UserForm.instance.FormState.firstName\" (registry).\n */\nexport function resolveRefPath(\n refPath: string,\n ctx: ResolverContext\n): { target: unknown; path: string[] } | null {\n const { blockId, pathParts } = parseRefPath(refPath);\n if (pathParts[0] !== 'instance' || pathParts.length < 2) {\n return null;\n }\n const rest = pathParts.slice(2);\n const serviceOrProp = pathParts[1];\n\n let instance: Record<string, unknown> | undefined;\n if (blockId != null) {\n // Prefer current block's instance when ref points to this block (e.g. root resolving nested refs to itself)\n if (blockId === ctx.currentBlockId && ctx.currentInstance != null) {\n instance = ctx.currentInstance;\n } else {\n const handle = ctx.registry.get(blockId);\n instance = handle?.instance as Record<string, unknown> | undefined;\n }\n } else if (ctx.currentInstance != null) {\n instance = ctx.currentInstance;\n }\n if (instance == null) return null;\n\n const service = instance[serviceOrProp];\n if (rest.length === 0) {\n return { target: service, path: [] };\n }\n let current: unknown = service;\n for (let i = 0; i < rest.length - 1; i++) {\n if (current == null || typeof current !== 'object') return null;\n current = (current as Record<string, unknown>)[rest[i]];\n }\n return { target: current, path: rest.slice(-1) };\n}\n\n/**\n * Get value at ref path (read-only). Returns undefined if not found.\n */\nexport function getRefValue(refPath: string, ctx: ResolverContext): unknown {\n const resolved = resolveRefPath(refPath, ctx);\n if (resolved == null || resolved.path.length === 0) {\n return resolved?.target;\n }\n const obj = resolved.target as Record<string, unknown>;\n const key = resolved.path[0];\n const val = obj?.[key];\n // Unwrap Angular signals and other getter functions by calling them\n if (typeof val === 'function') {\n return (val as () => unknown)();\n }\n return val;\n}\n\n/**\n * Set value at ref path (write). No-op if target is not writable.\n */\nexport function setRefValue(refPath: string, ctx: ResolverContext, value: unknown): void {\n const resolved = resolveRefPath(refPath, ctx);\n if (resolved == null || resolved.path.length === 0) return;\n const obj = resolved.target as Record<string, unknown>;\n const key = resolved.path[0];\n const val = obj?.[key];\n // Angular signals are callable (typeof 'function') but have .set; treat any value with .set as writable so we don't overwrite the signal with a string\n const writable =\n val != null &&\n typeof (val as Record<string, unknown>)['set'] === 'function'\n ? (val as { set: (v: unknown) => void })\n : null;\n if (writable) {\n writable.set(value);\n } else if (obj != null && typeof obj === 'object') {\n (obj as Record<string, unknown>)[key] = value;\n }\n}\n\n/**\n * Build a computed signal for a template string with {{refPath}} placeholders.\n */\nexport function buildComputedForTemplate(\n template: string,\n refPaths: string[],\n ctx: ResolverContext\n): Signal<string> {\n const escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return computed(() => {\n let out = template;\n for (const refPath of refPaths) {\n const val = getRefValue(refPath, ctx);\n const str = val != null ? String(val) : '';\n out = out.replace(new RegExp(`\\\\{\\\\{${escapeRe(refPath)}\\\\}\\\\}`, 'g'), str);\n }\n return out;\n });\n}\n","import type { BlockRegistry } from './block-registry';\nimport { type OutputReference, isOutputReference } from './block-description.schema';\nimport { resolveRefPath } from './ref-resolver';\n\nfunction getCallTarget(\n reference: string,\n registry: BlockRegistry\n): unknown {\n const resolved = resolveRefPath(reference, { registry });\n if (resolved == null) return undefined;\n const { target, path } = resolved;\n if (path.length === 0) return target;\n const parent = target as Record<string, unknown>;\n return parent?.[path[0]];\n}\n\nfunction getMethodOnTarget(target: unknown, methodName: string): ((...args: unknown[]) => unknown) | null {\n if (target == null) return null;\n const m = (target as Record<string, unknown>)[methodName];\n return typeof m === 'function' ? (m as (...args: unknown[]) => unknown) : null;\n}\n\nexport function resolveOutputReference(\n ref: OutputReference,\n eventValue: unknown,\n registry: BlockRegistry\n): (value: unknown) => void {\n return (value: unknown) => {\n const payload = value ?? eventValue;\n const callTarget = getCallTarget(ref.reference, registry);\n const method = getMethodOnTarget(callTarget, ref.method);\n if (method == null) return;\n const params = ref.params != null\n ? (Array.isArray(ref.params) ? ref.params : [ref.params])\n : [payload];\n const result = method.call(callTarget, ...params);\n if (result != null && typeof (result as Promise<unknown>).then === 'function') {\n (result as Promise<unknown>).then(\n () => runThenOrSuccess(ref, registry),\n () => runOnError(ref, registry)\n );\n } else {\n runThenOrSuccess(ref, registry);\n }\n };\n}\n\nfunction toParams(p: unknown[] | Record<string, unknown> | undefined): unknown[] {\n if (p == null) return [];\n return Array.isArray(p) ? p : [p];\n}\n\nfunction runThenOrSuccess(ref: OutputReference, registry: BlockRegistry): void {\n if (ref.then?.length) {\n for (const step of ref.then) {\n invokeRefMethod(registry, step.reference, step.method, toParams(step.params));\n }\n } else if (ref.onSuccess) {\n invokeRefMethod(registry, ref.onSuccess.reference, ref.onSuccess.method, toParams(ref.onSuccess.params));\n }\n}\n\nfunction runOnError(ref: OutputReference, registry: BlockRegistry): void {\n if (ref.onError) {\n invokeRefMethod(registry, ref.onError.reference, ref.onError.method, toParams(ref.onError.params));\n }\n}\n\nfunction invokeRefMethod(\n registry: BlockRegistry,\n reference: string,\n method: string,\n params: unknown[]\n): void {\n const callTarget = getCallTarget(reference, registry);\n const fn = getMethodOnTarget(callTarget, method);\n if (fn) fn.call(callTarget, ...params);\n}\n\nexport function createOutputHandler(\n outputValue: unknown,\n outputKey: string,\n registry: BlockRegistry,\n directiveHandlers?: Record<string, (value: unknown) => void>\n): (value: unknown) => void {\n if (isOutputReference(outputValue)) {\n return resolveOutputReference(outputValue, undefined, registry);\n }\n const fromDirective = directiveHandlers?.[outputKey];\n return fromDirective ?? (() => {});\n}\n","import {\n Type,\n Injector,\n Injectable,\n inject,\n ComponentRef,\n ViewContainerRef,\n effect,\n type EffectRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport {\n BlockDescription,\n safeParseBlockDescription,\n normalizeServices,\n isBlockReference,\n resolveBlockReference,\n} from './block-description.schema';\nimport { BlockRegistryImpl, type BlockRegistry, type BlockInstanceHandle } from './block-registry';\nimport { ResolverContext, getRefValue, setRefValue } from './ref-resolver';\nimport { classifyTwoWayString, parseTwoWayRef } from './ref-expressions';\nimport { createOutputHandler } from './output-reference';\nimport { ComponentRegistry } from '../registry/component.registry';\nimport { ServiceRegistry } from '../registry/service.registry';\n\nexport interface BlockLoadOptions {\n outputHandlers?: Record<string, (value: unknown) => void>;\n registry?: BlockRegistry;\n /** Map of block id → full description; used when description is an id-only reference. */\n blockDefinitions?: Record<string, unknown>;\n}\n\nexport interface BlockLoadResult {\n componentRef: ComponentRef<unknown>;\n destroy: () => void;\n updateInputs: (description: unknown) => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BlockLoaderService {\n private readonly injector = inject(Injector);\n private readonly componentRegistry = ComponentRegistry.getInstance();\n private readonly serviceRegistry = ServiceRegistry.getInstance();\n\n async load(\n description: unknown,\n viewContainerRef: ViewContainerRef,\n options?: BlockLoadOptions,\n ): Promise<BlockLoadResult> {\n let resolved: unknown = description;\n if (isBlockReference(description)) {\n resolved = resolveBlockReference(description, options?.blockDefinitions);\n }\n const parsed = safeParseBlockDescription(resolved);\n\n if (!parsed.success) {\n throw new Error(`Invalid block description: ${parsed.error.message}`);\n }\n const desc = parsed.data;\n const registry = options?.registry ?? new BlockRegistryImpl();\n if (desc.id != null && desc.id !== '' && registry.has(desc.id)) {\n throw new Error(`Block id \"${desc.id}\" is already registered.`);\n }\n\n const componentType = await this.componentRegistry.get(desc.component);\n if (!componentType) {\n throw new Error(`Component \"${desc.component}\" is not registered.`);\n }\n\n const services = normalizeServices(desc.services);\n const selfServices = services.filter(\n (s): s is { id: string; scope: 'self' } =>\n typeof s === 'object' && (s as { scope?: string }).scope === 'self',\n );\n const serviceTypes = await this.getServiceTypes(selfServices);\n const childInjector = this.buildChildInjectorFromTypes(serviceTypes);\n const componentRef = viewContainerRef.createComponent(componentType as Type<unknown>, {\n injector: childInjector,\n });\n\n const blockInstance: Record<string, unknown> = {};\n for (let i = 0; i < selfServices.length; i++) {\n const id = selfServices[i].id;\n const serviceType = serviceTypes[i];\n if (serviceType) {\n const svc = componentRef.injector.get(serviceType as Type<unknown>);\n if (svc != null) blockInstance[id] = svc;\n }\n }\n if (desc.inputs?.['model'] != null) {\n const model = desc.inputs['model'];\n for (const svc of Object.values(blockInstance)) {\n if (svc != null && typeof (svc as Record<string, unknown>)['setModel'] === 'function') {\n ((svc as Record<string, unknown>)['setModel'] as (v: unknown) => void)(model);\n }\n }\n }\n\n const ctx: ResolverContext = {\n registry,\n currentBlockId: desc.id ?? undefined,\n currentInstance: blockInstance,\n };\n const handle: BlockInstanceHandle = { instance: blockInstance };\n if (desc.id != null && desc.id !== '') registry.register(desc.id, handle);\n let currentEffectRefs = this.setInputs(componentRef, desc, ctx);\n const subscriptions = this.wireOutputs(componentRef, desc, registry, options?.outputHandlers);\n\n const doDestroy = (): void => {\n if (desc.id != null && desc.id !== '') registry.unregister(desc.id);\n currentEffectRefs.forEach((ref) => ref.destroy());\n subscriptions.forEach((s) => s.unsubscribe());\n const idx = viewContainerRef.indexOf(componentRef.hostView);\n if (idx !== -1) viewContainerRef.remove(idx);\n componentRef.destroy();\n };\n handle.destroy = doDestroy;\n\n const updateInputs = (newDesc: unknown): void => {\n const p = safeParseBlockDescription(newDesc);\n if (p.success) {\n currentEffectRefs.forEach((ref) => ref.destroy());\n currentEffectRefs = this.setInputs(componentRef, p.data, ctx);\n }\n };\n\n return { componentRef, destroy: doDestroy, updateInputs };\n }\n\n /** Resolve all service types in parallel (single batch for load). */\n private async getServiceTypes(\n selfServices: { id: string; scope: 'self' }[],\n ): Promise<(Type<unknown> | undefined)[]> {\n if (selfServices.length === 0) return [];\n return Promise.all(selfServices.map((e) => this.serviceRegistry.getType(e.id)));\n }\n\n private buildChildInjectorFromTypes(serviceTypes: (Type<unknown> | undefined)[]): Injector {\n const providers = serviceTypes\n .filter((t): t is Type<unknown> => t != null)\n .map((t) => ({ provide: t, useClass: t }));\n return providers.length === 0\n ? this.injector\n : Injector.create({ providers, parent: this.injector });\n }\n\n /** Set inputs and wire template/two-way effects. Single pass over inputs for large configs. */\n private setInputs(\n componentRef: ComponentRef<unknown>,\n desc: BlockDescription,\n ctx: ResolverContext,\n ): EffectRef[] {\n const effectRefs: EffectRef[] = [];\n const inputs = desc.inputs ?? {};\n const inst = componentRef.instance as Record<string, unknown>;\n for (const [key, value] of Object.entries(inputs)) {\n if (key === 'model') continue;\n if (typeof value === 'string') {\n const twoWayKind = classifyTwoWayString(value);\n if (twoWayKind === 'invalid-mix') {\n throw new Error(\n `Invalid input \"${String(key)}\": two-way ref \"[( )]\" cannot be mixed with literals or \"{{ }}\". ` +\n `Use exactly \"[(refPath)]\" for two-way or \"{{ refPath }}\" for read-only.`,\n );\n }\n if (twoWayKind === 'two-way') {\n const refPath = parseTwoWayRef(value);\n if (refPath) {\n const initial = getRefValue(refPath, ctx);\n if (componentRef.setInput) componentRef.setInput(key as never, initial as never);\n else inst[key] = initial;\n const modelSig = inst[key];\n if (modelSig != null && typeof modelSig === 'function') {\n effectRefs.push(\n effect(\n () => {\n const fromRef = getRefValue(refPath, ctx);\n if (fromRef === undefined) return;\n if (componentRef.setInput) {\n componentRef.setInput(key as never, fromRef as never);\n componentRef.changeDetectorRef.detectChanges();\n }\n },\n { injector: this.injector },\n ),\n );\n effectRefs.push(\n effect(\n () => {\n const current = (modelSig as () => unknown)();\n setRefValue(refPath, ctx, current);\n },\n { injector: this.injector },\n ),\n );\n }\n }\n continue;\n }\n }\n const str = value as string;\n if (\n typeof value === 'string' &&\n str.indexOf('{{') !== -1 &&\n str.indexOf('}}', str.indexOf('{{')) !== -1\n ) {\n const initial = this.interpolateTemplate(str, ctx);\n if (componentRef.setInput) componentRef.setInput(key as never, initial as never);\n else inst[key] = initial;\n effectRefs.push(\n effect(\n () => {\n const resolved = this.interpolateTemplate(str, ctx);\n if (componentRef.setInput) componentRef.setInput(key as never, resolved as never);\n else inst[key] = resolved;\n },\n { injector: this.injector },\n ),\n );\n continue;\n }\n const resolved = this.resolveInputValue(value, ctx);\n if (componentRef.setInput) componentRef.setInput(key as never, resolved as never);\n else inst[key] = resolved;\n }\n return effectRefs;\n }\n\n /** Replace all {{ refPath }} with resolved values. Uses parts array + join to avoid N string concats. */\n private static readonly INTERPOLATE_MAX_PLACEHOLDERS = 200;\n private interpolateTemplate(template: string, ctx: ResolverContext): string {\n const parts: string[] = [];\n let s = template;\n for (let i = 0; i < BlockLoaderService.INTERPOLATE_MAX_PLACEHOLDERS; i++) {\n const start = s.indexOf('{{');\n if (start === -1) {\n parts.push(s);\n break;\n }\n parts.push(s.slice(0, start));\n const end = s.indexOf('}}', start);\n if (end === -1) {\n parts.push(s.slice(start));\n break;\n }\n const ref = s.slice(start + 2, end).trim();\n const val = ref ? getRefValue(ref, ctx) : null;\n parts.push(val != null ? String(val) : '');\n s = s.slice(end + 2);\n }\n return parts.join('');\n }\n\n /**\n * Resolve a single input value: resolve two-way refs, recurse into arrays/objects.\n * Strings with {{ }} are left as-is so child blocks receive the template for reactive interpolation.\n * Two-way refs inside nested block descriptors (object with \"component\" + \"inputs\") are left as-is\n * so that when a child block is loaded it still sees value: '[(ref)]' and can wire two-way binding.\n */\n private resolveInputValue(\n value: unknown,\n ctx: ResolverContext,\n options?: { preserveTwoWayRefs?: boolean },\n ): unknown {\n const preserveTwoWayRefs = options?.preserveTwoWayRefs ?? false;\n if (typeof value === 'string') {\n const twoWayKind = classifyTwoWayString(value);\n if (twoWayKind === 'invalid-mix') {\n const preview = value.length > 200 ? `${value.slice(0, 200)}...` : value;\n throw new Error(\n `Invalid input: two-way ref \"[( )]\" cannot be mixed with literals or \"{{ }}\". ` +\n `Use exactly \"[(refPath)]\" for two-way or \"{{ refPath }}\" for read-only. Got: ${JSON.stringify(preview)}`,\n );\n }\n if (twoWayKind === 'two-way') {\n if (preserveTwoWayRefs) return value;\n const refPath = parseTwoWayRef(value);\n return refPath ? getRefValue(refPath, ctx) : value;\n }\n return value;\n }\n if (Array.isArray(value)) {\n let changed = false;\n const resolved = value.map((item) => {\n const r = this.resolveInputValue(item, ctx, options);\n if (r !== item) changed = true;\n return r;\n });\n return changed ? resolved : value;\n }\n if (value != null && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const isNestedBlockDescriptor = typeof obj['component'] === 'string' && obj['inputs'] != null;\n const entries = Object.entries(value as Record<string, unknown>);\n const resolvedPairs: [string, unknown][] = [];\n let changed = false;\n for (const [k, v] of entries) {\n const childOptions =\n isNestedBlockDescriptor && k === 'inputs' ? { preserveTwoWayRefs: true } : options;\n const resolved = this.resolveInputValue(v, ctx, childOptions);\n if (resolved !== v) changed = true;\n resolvedPairs.push([k, resolved]);\n }\n if (!changed) return value;\n const out: Record<string, unknown> = {};\n for (const [k, r] of resolvedPairs) out[k] = r;\n return out;\n }\n return value;\n }\n\n private wireOutputs(\n componentRef: ComponentRef<unknown>,\n desc: BlockDescription,\n registry: BlockRegistry,\n outputHandlers?: Record<string, (value: unknown) => void>,\n ): Subscription[] {\n const subs: Subscription[] = [];\n const outputs = desc.outputs ?? {};\n const inst = componentRef.instance as Record<string, unknown>;\n for (const [outputKey, outputValue] of Object.entries(outputs)) {\n const handler = createOutputHandler(outputValue, outputKey, registry, outputHandlers);\n const emitter = inst[outputKey];\n if (\n emitter != null &&\n typeof (\n emitter as { subscribe?: (fn: (v: unknown) => void) => { unsubscribe: () => void } }\n ).subscribe === 'function'\n ) {\n const sub = (\n emitter as { subscribe: (fn: (v: unknown) => void) => { unsubscribe: () => void } }\n ).subscribe((v: unknown) => handler(v));\n subs.push(sub as unknown as Subscription);\n }\n }\n return subs;\n }\n}\n","import {\n Directive,\n input,\n effect,\n ViewContainerRef,\n inject,\n DestroyRef,\n} from '@angular/core';\nimport { BlockLoaderService, type BlockLoadResult } from './block-loader.service';\nimport type { BlockRegistry } from './block-registry';\nimport type { BlockDescription } from './block-description.schema';\nimport {\n safeParseBlockDescription,\n normalizeServices,\n isBlockReference,\n resolveBlockReference,\n} from './block-description.schema';\n\n/** Compact key for services to avoid JSON.stringify of large config in effect. */\nfunction getServicesKey(services: BlockDescription['services']): string {\n const arr = normalizeServices(services);\n if (arr.length === 0) return '';\n return arr.map((s) => (typeof s === 'string' ? s : `${(s as { id: string }).id}:${(s as { scope?: string }).scope ?? ''}`)).join(',');\n}\n\n@Directive({\n selector: '[block]',\n standalone: true,\n})\nexport class BlockDirective {\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly loader = inject(BlockLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Full description, or { id } / { blockId, blockDefinition? } to reuse/override from blockDefinitions. */\n readonly description = input<unknown | null>(null);\n /** Handlers for component outputs; keys match descriptor.outputs. */\n readonly outputHandlers = input<Record<string, (value: unknown) => void>>({});\n /** Registry for block instances by id; pass from root so nested blocks share it. */\n readonly blockRegistry = input<BlockRegistry | null>(null);\n /** Map id → full description; used when description is a block reference (id/blockId). */\n readonly blockDefinitions = input<Record<string, unknown> | null>(null);\n\n private loadResult: BlockLoadResult | null = null;\n private loadedComponent: string | null = null;\n private loadedServicesKey: string | null = null;\n private loadGeneration = 0;\n /** Avoid re-parsing when the same description reference is passed (e.g. stable signal). */\n private lastDescRef: unknown = null;\n private lastParsedData: BlockDescription | null = null;\n\n constructor() {\n effect(() => {\n const desc = this.description();\n const outputHandlers = this.outputHandlers();\n const inputDefs = this.blockDefinitions();\n\n if (desc == null) {\n this.lastDescRef = null;\n this.lastParsedData = null;\n this.clear();\n return;\n }\n\n const resolved = isBlockReference(desc)\n ? resolveBlockReference(desc, inputDefs ?? undefined)\n : desc;\n\n let data: BlockDescription;\n if (resolved === this.lastDescRef && this.lastParsedData != null) {\n data = this.lastParsedData;\n } else {\n const parsed = safeParseBlockDescription(resolved);\n if (!parsed.success) {\n return;\n }\n this.lastDescRef = resolved;\n this.lastParsedData = parsed.data;\n data = parsed.data;\n }\n const servicesKey = getServicesKey(data.services);\n const canUpdate =\n this.loadResult != null &&\n this.loadedComponent === data.component &&\n this.loadedServicesKey === servicesKey;\n\n if (canUpdate && this.loadResult) {\n this.loadResult.updateInputs(resolved);\n return;\n }\n\n this.clear();\n const registry = this.blockRegistry() ?? undefined;\n const generation = ++this.loadGeneration;\n this.loader\n .load(resolved, this.viewContainerRef, {\n outputHandlers: Object.keys(outputHandlers).length > 0 ? outputHandlers : undefined,\n registry,\n blockDefinitions: inputDefs ?? undefined,\n })\n .then((result) => {\n if (generation !== this.loadGeneration) return;\n this.loadResult = result;\n this.loadedComponent = data.component;\n this.loadedServicesKey = servicesKey;\n })\n .catch((err: unknown) => {\n if (generation !== this.loadGeneration) return;\n console.error('Block load failed:', err);\n });\n });\n this.destroyRef.onDestroy(() => this.clear());\n }\n\n private clear(): void {\n this.loadGeneration++;\n this.lastDescRef = null;\n this.lastParsedData = null;\n if (this.loadResult) {\n this.loadResult.destroy();\n this.loadResult = null;\n this.loadedComponent = null;\n this.loadedServicesKey = null;\n }\n }\n}\n","/*\n * Public API Surface of blocks-studio\n */\n\nexport * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-blocks-studio.mjs","sources":["../../../projects/blocks-studio/src/lib/core/registry/registry-metadata.ts","../../../projects/blocks-studio/src/lib/core/registry/component.registry.ts","../../../projects/blocks-studio/src/lib/core/registry/guard.registry.ts","../../../projects/blocks-studio/src/lib/core/registry/service.registry.ts","../../../projects/blocks-studio/src/lib/core/services/router-loader.service.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block-definitions.registry.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block-description.schema.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block-registry.ts","../../../projects/blocks-studio/src/lib/core/block-loader/ref-expressions.ts","../../../projects/blocks-studio/src/lib/core/block-loader/ref-resolver.ts","../../../projects/blocks-studio/src/lib/core/block-loader/output-reference.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block-loader.service.ts","../../../projects/blocks-studio/src/lib/core/block-loader/block.directive.ts","../../../projects/blocks-studio/src/public-api.ts","../../../projects/blocks-studio/src/ngx-blocks-studio.ts"],"sourcesContent":["/**\n * Registry entry type: component, service, or guard.\n */\nexport type RegistryEntryType = 'component' | 'service' | 'guard';\n\n/**\n * Metadata value stored per registry key.\n */\nexport type RegistryMetadataRecord = Record<string, unknown>;\n\nexport interface AllRegistryMetadata {\n components: Map<string, RegistryMetadataRecord>;\n services: Map<string, RegistryMetadataRecord>;\n guards: Map<string, RegistryMetadataRecord>;\n}\n\n/**\n * Single source of truth for metadata across component, service, and guard registries.\n * All registries delegate to this store so metadata can be queried uniformly\n * and all metadata can be retrieved in one call.\n */\nexport class RegistryMetadataStore {\n private static instance: RegistryMetadataStore;\n private entries = new Map<string, { type: RegistryEntryType; data: RegistryMetadataRecord }>();\n\n private constructor() {}\n\n static getInstance(): RegistryMetadataStore {\n if (!RegistryMetadataStore.instance) {\n RegistryMetadataStore.instance = new RegistryMetadataStore();\n }\n return RegistryMetadataStore.instance;\n }\n\n /**\n * Set metadata for a registry key (component, service, or guard).\n */\n set(key: string, type: RegistryEntryType, data: RegistryMetadataRecord): void {\n this.entries.set(key, { type, data });\n }\n\n /**\n * Get metadata for a key. Returns undefined if the key is not registered.\n */\n get(key: string): RegistryMetadataRecord | undefined {\n return this.entries.get(key)?.data;\n }\n\n /**\n * Alias for get(); allows registries to expose getMetadata(key).\n */\n getMetadata(key: string): RegistryMetadataRecord | undefined {\n return this.get(key);\n }\n\n /**\n * Get all metadata for a given type (components or services).\n */\n getByType(type: RegistryEntryType): Map<string, RegistryMetadataRecord> {\n const result = new Map<string, RegistryMetadataRecord>();\n for (const [key, entry] of this.entries) {\n if (entry.type === type) {\n result.set(key, entry.data);\n }\n }\n return result;\n }\n\n /**\n * Get all metadata for component, service, and guard registries in one call.\n */\n getAllMetadata(): AllRegistryMetadata {\n return {\n components: this.getByType('component'),\n services: this.getByType('service'),\n guards: this.getByType('guard'),\n };\n }\n\n /**\n * Remove metadata for a key (e.g. when unregistering).\n */\n remove(key: string): boolean {\n return this.entries.delete(key);\n }\n\n /**\n * Check if metadata exists for a key.\n */\n has(key: string): boolean {\n return this.entries.has(key);\n }\n\n /**\n * Clear all metadata (e.g. when clearing registries).\n */\n clear(): void {\n this.entries.clear();\n }\n}\n","import { Type } from '@angular/core';\nimport {\n RegistryMetadataStore,\n RegistryMetadataRecord,\n} from './registry-metadata';\n\ntype ComponentLoader = () => Promise<Type<any>>;\ntype ComponentOrLoader = Type<any> | ComponentLoader;\n\nexport class ComponentRegistry {\n private static instance: ComponentRegistry;\n private components = new Map<string, ComponentOrLoader>();\n private loadedComponents = new Map<string, Type<any>>();\n private readonly metadataStore = RegistryMetadataStore.getInstance();\n\n private constructor() {}\n\n static getInstance(): ComponentRegistry {\n if (!ComponentRegistry.instance) {\n ComponentRegistry.instance = new ComponentRegistry();\n }\n return ComponentRegistry.instance;\n }\n\n register(\n name: string,\n component: Type<any> | ComponentLoader,\n metadata?: RegistryMetadataRecord\n ): void {\n if (this.components.has(name)) {\n console.warn(`Component ${name} is already registered. Overwriting...`);\n }\n\n this.components.set(name, component);\n // If it's already a Type, cache it\n if (typeof component !== 'function' || component.prototype) {\n this.loadedComponents.set(name, component as Type<any>);\n }\n if (metadata != null && Object.keys(metadata).length > 0) {\n this.metadataStore.set(name, 'component', metadata);\n }\n }\n\n async get(name: string): Promise<Type<any> | undefined> {\n // Check if already loaded\n if (this.loadedComponents.has(name)) {\n return this.loadedComponents.get(name);\n }\n\n const componentOrLoader = this.components.get(name);\n if (!componentOrLoader) {\n return undefined;\n }\n\n // Check if it's a loader function (not a Type)\n // Type functions have a prototype, loader functions don't\n const isLoader =\n typeof componentOrLoader === 'function' && !(componentOrLoader as any).prototype?.constructor;\n\n if (isLoader) {\n try {\n const loader = componentOrLoader as ComponentLoader;\n const component = await loader();\n this.loadedComponents.set(name, component);\n return component;\n } catch (error) {\n console.error(`Failed to lazy load component \"${name}\":`, error);\n return undefined;\n }\n }\n\n // It's already a Type\n const component = componentOrLoader as Type<any>;\n this.loadedComponents.set(name, component);\n return component;\n }\n\n getSync(name: string): Type<any> | undefined {\n // Check if already loaded\n if (this.loadedComponents.has(name)) {\n return this.loadedComponents.get(name);\n }\n\n const componentOrLoader = this.components.get(name);\n if (!componentOrLoader) {\n return undefined;\n }\n\n // Check if it's a loader function (not a Type)\n const isLoader =\n typeof componentOrLoader === 'function' && !(componentOrLoader as any).prototype?.constructor;\n\n // If it's a loader, we can't get it synchronously\n if (isLoader) {\n return undefined;\n }\n\n // It's already a Type\n const component = componentOrLoader as Type<any>;\n this.loadedComponents.set(name, component);\n return component;\n }\n\n has(name: string): boolean {\n return this.components.has(name);\n }\n\n getAll(): Map<string, Type<any>> {\n return new Map(this.loadedComponents);\n }\n\n unregister(name: string): boolean {\n this.metadataStore.remove(name);\n this.loadedComponents.delete(name);\n return this.components.delete(name);\n }\n\n clear(): void {\n for (const name of this.components.keys()) {\n this.metadataStore.remove(name);\n }\n this.components.clear();\n this.loadedComponents.clear();\n }\n\n getMetadata(key: string): RegistryMetadataRecord | undefined {\n return this.metadataStore.getMetadata(key);\n }\n\n getAllWithMetadata(): Map<string, { component: Type<any>; metadata?: RegistryMetadataRecord }> {\n const result = new Map<string, { component: Type<any>; metadata?: RegistryMetadataRecord }>();\n for (const [name, component] of this.loadedComponents) {\n result.set(name, {\n component,\n metadata: this.metadataStore.getMetadata(name),\n });\n }\n return result;\n }\n}\n","import { Type } from '@angular/core';\nimport { CanActivateFn } from '@angular/router';\nimport {\n RegistryMetadataStore,\n RegistryMetadataRecord,\n} from './registry-metadata';\n\n/**\n * Guard type: functional guard or class-based guard type.\n * Registered by name; resolved by RouteLoader from route config guards array.\n */\nexport type GuardOrType = CanActivateFn | Type<unknown>;\n\n/** Loader for lazy-loaded guards. Must be a function with no parameters that returns Promise<GuardOrType>. */\nexport type GuardLoader = () => Promise<GuardOrType>;\n\nexport type GuardOrLoader = GuardOrType | GuardLoader;\n\nexport class GuardRegistry {\n private static instance: GuardRegistry;\n private guards = new Map<string, GuardOrLoader>();\n private loadedGuards = new Map<string, GuardOrType>();\n private readonly metadataStore = RegistryMetadataStore.getInstance();\n\n private constructor() {}\n\n static getInstance(): GuardRegistry {\n if (!GuardRegistry.instance) {\n GuardRegistry.instance = new GuardRegistry();\n }\n return GuardRegistry.instance;\n }\n\n register(name: string, guard: GuardOrLoader, metadata?: RegistryMetadataRecord): void {\n if (this.guards.has(name)) {\n console.warn(`Guard \"${name}\" is already registered. Overwriting...`);\n }\n this.guards.set(name, guard);\n if (!this.isLoader(guard)) {\n this.loadedGuards.set(name, guard as GuardOrType);\n } else {\n this.loadedGuards.delete(name);\n }\n if (metadata != null && Object.keys(metadata).length > 0) {\n this.metadataStore.set(name, 'guard', metadata);\n }\n }\n\n /**\n * Resolve guard by name (async; runs loader if needed).\n */\n async get(name: string): Promise<GuardOrType | undefined> {\n if (this.loadedGuards.has(name)) {\n return this.loadedGuards.get(name);\n }\n\n const guardOrLoader = this.guards.get(name);\n if (!guardOrLoader) {\n return undefined;\n }\n\n if (this.isLoader(guardOrLoader)) {\n try {\n const loader = guardOrLoader as GuardLoader;\n const guard = await loader();\n this.loadedGuards.set(name, guard);\n return guard;\n } catch (error) {\n console.error(`Failed to lazy load guard \"${name}\":`, error);\n return undefined;\n }\n }\n\n const guard = guardOrLoader as GuardOrType;\n this.loadedGuards.set(name, guard);\n return guard;\n }\n\n /**\n * Resolve guard synchronously. Returns undefined if the entry is a lazy loader not yet loaded.\n */\n getSync(name: string): GuardOrType | undefined {\n if (this.loadedGuards.has(name)) {\n return this.loadedGuards.get(name);\n }\n\n const guardOrLoader = this.guards.get(name);\n if (!guardOrLoader || this.isLoader(guardOrLoader)) {\n return undefined;\n }\n\n const guard = guardOrLoader as GuardOrType;\n this.loadedGuards.set(name, guard);\n return guard;\n }\n\n has(name: string): boolean {\n return this.guards.has(name);\n }\n\n getMetadata(key: string): RegistryMetadataRecord | undefined {\n return this.metadataStore.getMetadata(key);\n }\n\n getAllWithMetadata(): Map<string, { guard: GuardOrType; metadata?: RegistryMetadataRecord }> {\n const result = new Map<string, { guard: GuardOrType; metadata?: RegistryMetadataRecord }>();\n for (const [name, guard] of this.loadedGuards) {\n result.set(name, {\n guard,\n metadata: this.metadataStore.getMetadata(name),\n });\n }\n return result;\n }\n\n unregister(name: string): boolean {\n this.metadataStore.remove(name);\n this.loadedGuards.delete(name);\n return this.guards.delete(name);\n }\n\n clear(): void {\n for (const name of this.guards.keys()) {\n this.metadataStore.remove(name);\n }\n this.guards.clear();\n this.loadedGuards.clear();\n }\n\n private isLoader(value: GuardOrLoader): value is GuardLoader {\n return (\n typeof value === 'function' &&\n (value as GuardLoader).length === 0\n );\n }\n}\n","import { Type, Injector, inject } from '@angular/core';\nimport {\n RegistryMetadataStore,\n RegistryMetadataRecord,\n} from './registry-metadata';\n\ntype ServiceLoader = () => Promise<Type<any>>;\ntype ServiceOrLoader = Type<any> | ServiceLoader;\n\nexport class ServiceRegistry {\n private static instance: ServiceRegistry;\n private services = new Map<string, ServiceOrLoader>();\n private loadedServices = new Map<string, Type<any>>();\n private injector: Injector | null = null;\n private readonly metadataStore = RegistryMetadataStore.getInstance();\n\n private constructor() {}\n\n static getInstance(): ServiceRegistry {\n if (!ServiceRegistry.instance) {\n ServiceRegistry.instance = new ServiceRegistry();\n }\n return ServiceRegistry.instance;\n }\n\n /**\n * Set the injector to use for service resolution\n */\n setInjector(injector: Injector): void {\n this.injector = injector;\n }\n\n /**\n * Register a service by name (supports lazy loading)\n */\n register(\n name: string,\n service: Type<any> | ServiceLoader,\n metadata?: RegistryMetadataRecord\n ): void {\n if (this.services.has(name)) {\n console.warn(`Service ${name} is already registered. Overwriting...`);\n }\n this.services.set(name, service);\n // If it's already a Type, cache it\n if (typeof service !== 'function' || (service as any).prototype) {\n this.loadedServices.set(name, service as Type<any>);\n }\n if (metadata != null && Object.keys(metadata).length > 0) {\n this.metadataStore.set(name, 'service', metadata);\n }\n }\n\n /**\n * Get a service instance by name (supports lazy loading)\n * Requires injector to be set first\n */\n async get(name: string): Promise<any> {\n // Check if already loaded\n if (this.loadedServices.has(name)) {\n const serviceType = this.loadedServices.get(name)!;\n return this.injectService(serviceType);\n }\n\n const serviceOrLoader = this.services.get(name);\n if (!serviceOrLoader) {\n console.error(`Service \"${name}\" not found in registry`);\n return undefined;\n }\n\n // Check if it's a loader function (not a Type)\n const isLoader = typeof serviceOrLoader === 'function' && \n !(serviceOrLoader as any).prototype?.constructor;\n\n if (isLoader) {\n try {\n const loader = serviceOrLoader as ServiceLoader;\n const serviceType = await loader();\n this.loadedServices.set(name, serviceType);\n return this.injectService(serviceType);\n } catch (error) {\n console.error(`Failed to lazy load service \"${name}\":`, error);\n return undefined;\n }\n }\n\n // It's already a Type\n const serviceType = serviceOrLoader as Type<any>;\n this.loadedServices.set(name, serviceType);\n return this.injectService(serviceType);\n }\n\n /**\n * Get a service instance synchronously (only works for already loaded services)\n */\n getSync(name: string): any {\n // Check if already loaded\n if (this.loadedServices.has(name)) {\n const serviceType = this.loadedServices.get(name)!;\n return this.injectService(serviceType);\n }\n\n const serviceOrLoader = this.services.get(name);\n if (!serviceOrLoader) {\n console.error(`Service \"${name}\" not found in registry`);\n return undefined;\n }\n\n // Check if it's a loader function\n const isLoader = typeof serviceOrLoader === 'function' && \n !(serviceOrLoader as any).prototype?.constructor;\n\n // If it's a loader, we can't get it synchronously\n if (isLoader) {\n console.warn(`Service \"${name}\" is lazy loaded and cannot be retrieved synchronously. Use get() instead.`);\n return undefined;\n }\n\n // It's already a Type\n const serviceType = serviceOrLoader as Type<any>;\n this.loadedServices.set(name, serviceType);\n return this.injectService(serviceType);\n }\n\n /**\n * Inject a service type using the injector\n */\n private injectService(serviceType: Type<any>): any {\n if (!this.injector) {\n // Try to use inject() if no injector is set\n try {\n return inject(serviceType);\n } catch (error) {\n console.error(`Cannot inject service: No injector set and inject() failed`, error);\n return undefined;\n }\n }\n\n try {\n return this.injector.get(serviceType);\n } catch (error) {\n console.error(`Failed to get service from injector:`, error);\n return undefined;\n }\n }\n\n /**\n * Get the service Type (class) by name (supports lazy loading).\n * Use this to scope the provider to a child injector (e.g. \"self\" context).\n */\n async getType(name: string): Promise<Type<any> | undefined> {\n if (this.loadedServices.has(name)) {\n return this.loadedServices.get(name);\n }\n\n const serviceOrLoader = this.services.get(name);\n if (!serviceOrLoader) {\n console.error(`Service \"${name}\" not found in registry`);\n return undefined;\n }\n\n const isLoader =\n typeof serviceOrLoader === 'function' &&\n !(serviceOrLoader as any).prototype?.constructor;\n\n if (isLoader) {\n try {\n const loader = serviceOrLoader as ServiceLoader;\n const serviceType = await loader();\n this.loadedServices.set(name, serviceType);\n return serviceType;\n } catch (error) {\n console.error(`Failed to lazy load service \"${name}\":`, error);\n return undefined;\n }\n }\n\n const serviceType = serviceOrLoader as Type<any>;\n this.loadedServices.set(name, serviceType);\n return serviceType;\n }\n\n /**\n * Get the service Type synchronously (only for already loaded services).\n */\n getTypeSync(name: string): Type<any> | undefined {\n if (this.loadedServices.has(name)) {\n return this.loadedServices.get(name);\n }\n\n const serviceOrLoader = this.services.get(name);\n if (!serviceOrLoader) {\n return undefined;\n }\n\n const isLoader =\n typeof serviceOrLoader === 'function' &&\n !(serviceOrLoader as any).prototype?.constructor;\n\n if (isLoader) {\n return undefined;\n }\n\n const serviceType = serviceOrLoader as Type<any>;\n this.loadedServices.set(name, serviceType);\n return serviceType;\n }\n\n /**\n * Check if a service is registered\n */\n has(name: string): boolean {\n return this.services.has(name);\n }\n\n /**\n * Get all registered service names\n */\n getAllNames(): string[] {\n return Array.from(this.services.keys());\n }\n\n /**\n * Get metadata for a registered service by key.\n */\n getMetadata(key: string): RegistryMetadataRecord | undefined {\n return this.metadataStore.getMetadata(key);\n }\n\n /**\n * Unregister a service\n */\n unregister(name: string): boolean {\n this.metadataStore.remove(name);\n this.loadedServices.delete(name);\n return this.services.delete(name);\n }\n\n /**\n * Clear all registered services\n */\n clear(): void {\n for (const name of this.services.keys()) {\n this.metadataStore.remove(name);\n }\n this.services.clear();\n this.loadedServices.clear();\n }\n}\n\n","import { Router, Routes, RunGuardsAndResolvers } from '@angular/router';\nimport { Type, Injectable, inject, signal, computed } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom } from 'rxjs';\nimport { ComponentRegistry } from '../registry/component.registry';\nimport { GuardRegistry, type GuardOrType } from '../registry/guard.registry';\n\n/**\n * Route configuration for the router.\n * @param path - The path of the route.\n * @param component - The component key to load for the route using the ComponentRegistry.\n * @param title - The title of the route.\n * @param canActivate - The guards keys to activate for the route using the GuardRegistry.\n * @param canDeactivate - The guards keys to deactivate for the route using the GuardRegistry.\n * @param canLoad - The guards keys to load for the route using the GuardRegistry.\n * @param canMatch - The guards keys to match for the route using the GuardRegistry.\n * @param pathMatch - The path match strategy for the route.\n * @param outlet - The outlet of the route.\n * @param canActivateChild - The guards keys to activate the children routes for the route using the GuardRegistry.\n * @param runGuardsAndResolvers - The strategy to run guards and resolvers for the route.\n * @param data - The data to pass to the route. It will be merged with the data from the route config file.\n * @param children - Nested routes and optional defaultRedirect/catchAllRedirect for the child segment.\n */\n\nexport interface RouteConfig {\n path: string;\n component: string;\n title?: string;\n canActivate?: string[];\n canDeactivate?: string[];\n canLoad?: string[];\n canMatch?: string[];\n outlet?: string;\n pathMatch?: 'full' | 'prefix';\n canActivateChild?: string[];\n runGuardsAndResolvers?: RunGuardsAndResolvers;\n data?: Record<string, any>;\n /** Child routes; can include defaultRedirect and catchAllRedirect for this segment. */\n children?: RouteConfigs;\n}\n\nexport interface RouteConfigs {\n routes: RouteConfig[];\n /** Redirect path for empty route (path: ''). Omit to not add a default redirect. */\n defaultRedirect?: string;\n /** Redirect path for unknown routes (path: '**'). Omit to not add a catch-all. */\n catchAllRedirect?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RouteLoader {\n private router = inject(Router);\n private http = inject(HttpClient);\n private componentRegistry = ComponentRegistry.getInstance();\n private guardRegistry = GuardRegistry.getInstance();\n\n private readonly _routeConfigFile = signal<RouteConfigs | null>(null);\n private readonly _configPath = signal<string>('');\n\n /** Currently loaded route config file, or null if not yet loaded. */\n readonly routeConfigFile = this._routeConfigFile.asReadonly();\n /** Path from which the config was loaded. */\n readonly configPath = this._configPath.asReadonly();\n /** Route config array from the loaded file. */\n readonly routeConfig = computed<RouteConfig[]>(() => this._routeConfigFile()?.routes ?? []);\n\n /**\n * Load routes from a config object. Updates signals and resets the router.\n */\n async loadRoutes(config: RouteConfigs): Promise<void> {\n this._configPath.set('');\n this._routeConfigFile.set(config);\n await this.updateRoutes();\n }\n\n /**\n * Fetch route config from a URL (HTTP GET), then load it. Sets configPath signal to the requested URL.\n */\n async loadRoutesFromUrl(configPath: string): Promise<void> {\n try {\n const config = await firstValueFrom(this.http.get<RouteConfigs>(configPath));\n this._configPath.set(configPath);\n this._routeConfigFile.set(config);\n await this.updateRoutes();\n } catch (error) {\n console.error('Failed to load route configuration from URL:', error);\n throw error;\n }\n }\n\n private async updateRoutes(): Promise<void> {\n const config = this._routeConfigFile();\n const routeConfigList = this.routeConfig();\n const routes: Routes = await Promise.all(\n routeConfigList.map((routeConfig) => this.convertRouteConfig(routeConfig))\n );\n\n if (config?.defaultRedirect != null && config.defaultRedirect !== '') {\n routes.unshift({\n path: '',\n redirectTo: config.defaultRedirect,\n pathMatch: 'full',\n });\n }\n\n if (config?.catchAllRedirect != null && config.catchAllRedirect !== '') {\n routes.push({\n path: '**',\n redirectTo: config.catchAllRedirect,\n });\n }\n\n this.router.resetConfig(routes);\n }\n\n private async convertRouteConfig(config: RouteConfig): Promise<Routes[0]> {\n const routeData: Record<string, unknown> = { ...(config.data ?? {}) };\n if (config.component) {\n routeData['component'] = config.component;\n }\n\n const [\n canActivateGuards,\n canDeactivateGuards,\n canLoadGuards,\n canMatchGuards,\n canActivateChildGuards,\n ] = await Promise.all([\n this.resolveGuards(config.canActivate),\n this.resolveGuards(config.canDeactivate),\n this.resolveGuards(config.canLoad),\n this.resolveGuards(config.canMatch),\n this.resolveGuards(config.canActivateChild),\n ]);\n\n const route: Routes[0] = {\n path: config.path,\n loadComponent: () => this.loadComponent(config),\n data: routeData,\n ...(config.title != null && { title: config.title }),\n ...(config.outlet != null && { outlet: config.outlet }),\n ...(config.pathMatch != null && { pathMatch: config.pathMatch }),\n ...(config.runGuardsAndResolvers != null && {\n runGuardsAndResolvers: config.runGuardsAndResolvers,\n }),\n ...(canActivateGuards.length > 0 && {\n canActivate: canActivateGuards as Routes[0]['canActivate'],\n }),\n ...(canDeactivateGuards.length > 0 && {\n canDeactivate: canDeactivateGuards as Routes[0]['canDeactivate'],\n }),\n ...(canLoadGuards.length > 0 && { canLoad: canLoadGuards as Routes[0]['canLoad'] }),\n ...(canMatchGuards.length > 0 && { canMatch: canMatchGuards as Routes[0]['canMatch'] }),\n ...(canActivateChildGuards.length > 0 && {\n canActivateChild: canActivateChildGuards as Routes[0]['canActivateChild'],\n }),\n };\n\n if (config.children?.routes?.length) {\n const childConfigs = config.children;\n route.children = await Promise.all(\n childConfigs.routes.map((child) => this.convertRouteConfig(child))\n );\n if (childConfigs.defaultRedirect != null && childConfigs.defaultRedirect !== '') {\n route.children.unshift({\n path: '',\n redirectTo: childConfigs.defaultRedirect,\n pathMatch: 'full',\n });\n }\n if (childConfigs.catchAllRedirect != null && childConfigs.catchAllRedirect !== '') {\n route.children.push({\n path: '**',\n redirectTo: childConfigs.catchAllRedirect,\n });\n }\n }\n\n return route;\n }\n\n private async resolveGuards(guardNames: string[] | undefined): Promise<GuardOrType[]> {\n if (!guardNames?.length) return [];\n const resolved = await Promise.all(guardNames.map((name) => this.getGuard(name)));\n return resolved.filter((g): g is GuardOrType => g != null);\n }\n\n private async loadComponent(routeConfig: RouteConfig): Promise<Type<unknown>> {\n const componentName = routeConfig.component;\n if (!componentName) {\n throw new Error('Route config must specify a component key.');\n }\n const component = await this.componentRegistry.get(componentName);\n if (!component) {\n throw new Error(\n `Component \"${componentName}\" is not registered. Register it with ComponentRegistry before loading routes.`\n );\n }\n return component;\n }\n\n private async getGuard(guardName: string): Promise<GuardOrType | null> {\n const guard = await this.guardRegistry.get(guardName);\n if (guard == null) {\n console.warn(`Unknown guard: ${guardName}. Register it with GuardRegistry.`);\n return null;\n }\n return guard;\n }\n}\n","/**\n * Global registry of block id → definition. Register block configs at app init\n * so they can be used as templates anywhere (e.g. nested blocks that reference\n * { id: 'AppNav' } resolve without passing blockDefinitions down).\n * Per-call blockDefinitions (e.g. from route data) override global entries.\n */\nexport class BlockDefinitionsRegistry {\n private static instance: BlockDefinitionsRegistry;\n private readonly definitions = new Map<string, Record<string, unknown>>();\n\n private constructor() {}\n\n static getInstance(): BlockDefinitionsRegistry {\n if (!BlockDefinitionsRegistry.instance) {\n BlockDefinitionsRegistry.instance = new BlockDefinitionsRegistry();\n }\n return BlockDefinitionsRegistry.instance;\n }\n\n /** Register a block template by id. Can be called before the block is needed. */\n register(id: string, definition: Record<string, unknown>): void {\n this.definitions.set(id, definition);\n }\n\n /** Get one definition by id. */\n get(id: string): Record<string, unknown> | undefined {\n return this.definitions.get(id);\n }\n\n /** Get all registered definitions (id → definition). Used to merge with per-call definitions. */\n getAll(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n this.definitions.forEach((def, id) => {\n out[id] = def;\n });\n return out;\n }\n\n unregister(id: string): boolean {\n return this.definitions.delete(id);\n }\n}\n","import { z } from 'zod';\nimport { BlockDefinitionsRegistry } from './block-definitions.registry';\n\n/**\n * Service entry: root-scoped (string id) or self-scoped ({ id, scope: \"self\" }).\n */\nconst ServiceEntrySchema = z.union([\n z.string().min(1),\n z.object({\n id: z.string().min(1),\n scope: z.literal('self'),\n alias: z.string().min(1).optional(),\n }),\n]);\n\n/**\n * Output handler: empty (use directive-provided handler) or reference-based (call method on ref).\n */\nconst OutputReferenceSchema = z.object({\n type: z.literal('reference'),\n reference: z.string().min(1),\n method: z.string().min(1),\n params: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional(),\n then: z\n .array(\n z.object({\n reference: z.string().min(1),\n method: z.string().min(1),\n params: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional(),\n }),\n )\n .optional(),\n onSuccess: z\n .object({\n reference: z.string().min(1),\n method: z.string().min(1),\n params: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional(),\n })\n .optional(),\n onError: z\n .object({\n reference: z.string().min(1),\n method: z.string().min(1),\n params: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional(),\n })\n .optional(),\n});\n\nconst OutputValueSchema = z.union([z.record(z.string(), z.unknown()), OutputReferenceSchema]);\n\n/**\n * Block description: JSON-serializable descriptor for dynamic block loading.\n * Refs in inputs use instance namespace: instance.FormState.firstName or UserForm.instance.FormState.firstName.\n */\nexport const BlockDescriptionSchema = z.object({\n component: z.string().min(1),\n id: z.string().min(1).optional(),\n services: z\n .union([ServiceEntrySchema, z.array(ServiceEntrySchema)])\n .optional()\n .default([]),\n inputs: z.record(z.string(), z.unknown()).optional(),\n outputs: z.record(z.string(), OutputValueSchema).optional(),\n});\n\nexport type BlockDescription = z.infer<typeof BlockDescriptionSchema>;\nexport type BlockInput = z.input<typeof BlockDescriptionSchema>;\nexport type ServiceEntry = z.infer<typeof ServiceEntrySchema>;\nexport type OutputReference = z.infer<typeof OutputReferenceSchema>;\n\n/** Normalize services to array. */\nexport function normalizeServices(services: BlockDescription['services']): ServiceEntry[] {\n if (services == null) return [];\n return Array.isArray(services) ? services : [services];\n}\n\nexport function safeParseBlockDescription(\n data: unknown,\n): ReturnType<typeof BlockDescriptionSchema.safeParse> {\n return BlockDescriptionSchema.safeParse(data);\n}\n\nexport function isOutputReference(value: unknown): value is OutputReference {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as OutputReference).type === 'reference' &&\n typeof (value as OutputReference).reference === 'string' &&\n typeof (value as OutputReference).method === 'string'\n );\n}\n\n/**\n * Reference to a registered block: { blockId: string, blockDefinition?: object }.\n * Resolution uses blockId only to look up the registered block description.\n * When blockDefinition is provided, it is deep-merged onto the base so only\n * specified properties override (e.g. inputs.model); other keys are preserved.\n */\nexport interface BlockReference {\n /** Used by isBlockReference only; resolution uses blockId. */\n id?: string;\n /** Registered block id used to resolve the block description. */\n blockId?: string;\n blockDefinition?: Record<string, unknown>;\n}\n\nexport function isBlockReference(value: unknown): value is BlockReference {\n if (typeof value !== 'object' || value === null || 'component' in value) return false;\n const id = (value as BlockReference).id ?? (value as BlockReference).blockId;\n return typeof id === 'string' && id.length > 0;\n}\n\n/**\n * Deep-merge override onto base. Only keys present in override are changed; nested objects\n * are merged recursively so e.g. override.inputs.model does not remove base.inputs.rows.\n * Arrays and primitives in override replace the base value.\n */\nexport function deepMergeBlockDefinition(\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...base };\n for (const key of Object.keys(override)) {\n const baseVal = result[key];\n const overrideVal = override[key];\n if (\n overrideVal != null &&\n typeof overrideVal === 'object' &&\n !Array.isArray(overrideVal) &&\n baseVal != null &&\n typeof baseVal === 'object' &&\n !Array.isArray(baseVal)\n ) {\n result[key] = deepMergeBlockDefinition(\n baseVal as Record<string, unknown>,\n overrideVal as Record<string, unknown>,\n );\n } else {\n result[key] = overrideVal;\n }\n }\n return result;\n}\n\n/**\n * Resolve a block reference to a full description using optional per-call definitions\n * and the global BlockDefinitionsRegistry. Per-call blockDefinitions take precedence\n * over global entries. If blockDefinition is present, it is deep-merged onto the base;\n * otherwise returns a shallow copy of the base.\n */\nexport function resolveBlockReference(\n ref: BlockReference,\n blockDefinitions: Record<string, unknown> | null | undefined,\n): Record<string, unknown> {\n const blockId = ref.blockId;\n const id = ref.id;\n const registry: BlockDefinitionsRegistry = BlockDefinitionsRegistry.getInstance();\n if (!blockId || typeof blockId !== 'string')\n throw new Error('Block reference must have blockId.');\n\n let base: unknown;\n if (blockDefinitions && Object.prototype.hasOwnProperty.call(blockDefinitions, blockId)) {\n base = blockDefinitions[blockId];\n } else {\n base = registry.get(blockId);\n }\n\n if (base == null || typeof base !== 'object')\n throw new Error(`Block \"${blockId}\" has no definition.`);\n\n const baseObj = { ...base, id };\n\n const overrides = ref.blockDefinition;\n if (overrides == null || typeof overrides !== 'object' || Object.keys(overrides).length === 0)\n return { ...baseObj };\n return deepMergeBlockDefinition(baseObj, overrides);\n}\n","import type { Signal } from '@angular/core';\n\n/**\n * Handle for a registered block: exposes instance (services/state by name) for ref resolution.\n */\nexport interface BlockInstanceHandle {\n /** Instance: services and state by name (e.g. FormState, value). */\n instance: Record<string, unknown>;\n /** Optional cleanup when block is destroyed. */\n destroy?: () => void;\n}\n\n/**\n * Registry of block instances by (full) id within a tree.\n * One registry per logical tree; duplicate id throws.\n */\nexport interface BlockRegistry {\n register(id: string, handle: BlockInstanceHandle): void;\n unregister(id: string): void;\n get(id: string): BlockInstanceHandle | undefined;\n has(id: string): boolean;\n}\n\n/**\n * Default in-memory BlockRegistry.\n */\nexport class BlockRegistryImpl implements BlockRegistry {\n private readonly map = new Map<string, BlockInstanceHandle>();\n\n register(id: string, handle: BlockInstanceHandle): void {\n if (this.map.has(id)) {\n throw new Error(`Block id \"${id}\" is already registered. Each id may only occur once per tree.`);\n }\n this.map.set(id, handle);\n }\n\n unregister(id: string): void {\n this.map.delete(id);\n }\n\n get(id: string): BlockInstanceHandle | undefined {\n return this.map.get(id);\n }\n\n has(id: string): boolean {\n return this.map.has(id);\n }\n}\n","/**\n * Parse ref paths and detect {{ref}} (read-only) and [(ref)] (two-way) in strings.\n */\n\nconst READONLY_REF_RE = /\\{\\{([^}]+)\\}\\}/g;\nconst TWOWAY_REF_RE = /^\\[\\(([^)]+)\\)\\]$/;\n\nexport interface ParsedRefPath {\n blockId?: string;\n instancePath: string;\n pathParts: string[];\n}\n\nconst PARSE_REF_PATH_CACHE_MAX = 64;\nconst parseRefPathCache = new Map<string, ParsedRefPath>();\n\nfunction toPathParts(instancePath: string): string[] {\n return instancePath.split('.').filter(Boolean);\n}\n\nfunction parseRefPathUncached(refPath: string): ParsedRefPath {\n const trimmed = refPath.trim();\n const parts = trimmed.split('.');\n if (parts.length >= 2 && parts[0] === 'instance') {\n return { instancePath: trimmed, pathParts: toPathParts(trimmed) };\n }\n if (parts.length >= 3 && parts[1] === 'instance') {\n const instancePath = parts.slice(1).join('.');\n return { blockId: parts[0], instancePath, pathParts: toPathParts(instancePath) };\n }\n return { instancePath: trimmed, pathParts: toPathParts(trimmed) };\n}\n\nexport function parseRefPath(refPath: string): ParsedRefPath {\n const cached = parseRefPathCache.get(refPath);\n if (cached) return cached;\n const result = parseRefPathUncached(refPath);\n if (parseRefPathCache.size >= PARSE_REF_PATH_CACHE_MAX) parseRefPathCache.clear();\n parseRefPathCache.set(refPath, result);\n return result;\n}\n\nexport function extractReadonlyRefs(template: string): string[] {\n const refs: string[] = [];\n let m: RegExpExecArray | null;\n READONLY_REF_RE.lastIndex = 0;\n while ((m = READONLY_REF_RE.exec(template)) !== null) {\n const ref = m[1].trim();\n if (ref && !refs.includes(ref)) refs.push(ref);\n }\n return refs;\n}\n\nexport function isTwoWayRefString(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n return TWOWAY_REF_RE.test(value.trim());\n}\n\n/**\n * True when a string contains two-way ref delimiters `[(` or `)]` but is not a valid\n * standalone two-way ref (exact form `[(refPath)]`). Mixing two-way with literals or {{ }} is invalid.\n */\nexport function isInvalidTwoWayMix(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n const s = value.trim();\n const hasDelimiters = s.includes('[(') || s.includes(')]');\n return hasDelimiters && !TWOWAY_REF_RE.test(s);\n}\n\n/**\n * One trim + one pass: classify string for two-way ref handling. Use instead of calling\n * isInvalidTwoWayMix and isTwoWayRefString separately to avoid double trim/regex.\n */\nexport function classifyTwoWayString(value: unknown): 'two-way' | 'invalid-mix' | 'none' {\n if (typeof value !== 'string') return 'none';\n const s = value.trim();\n if (!s.includes('[(') && !s.includes(')]')) return 'none';\n return TWOWAY_REF_RE.test(s) ? 'two-way' : 'invalid-mix';\n}\n\nexport function parseTwoWayRef(value: string): string | null {\n const m = value.trim().match(TWOWAY_REF_RE);\n return m ? m[1].trim() : null;\n}\n\nexport function getRefPathFromReadonly(template: string, match: string): string {\n const re = new RegExp(`\\\\{\\\\{${escapeRe(match)}\\\\}\\\\}`, 'g');\n const m = re.exec(template);\n return m ? match : '';\n}\n\nfunction escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import { computed, isSignal, type Signal } from '@angular/core';\nimport type { BlockRegistry } from './block-registry';\nimport { parseRefPath } from './ref-expressions';\n\nexport interface ResolverContext {\n registry: BlockRegistry;\n /** Current block's full id (nearest block with id). */\n currentBlockId?: string;\n /** Current block's instance (services/state by name). */\n currentInstance?: Record<string, unknown>;\n}\n\n/**\n * Resolve a ref path to the target object and path.\n * Path format: \"instance.FormState.firstName\" (context) or \"UserForm.instance.FormState.firstName\" (registry).\n */\nexport function resolveRefPath(\n refPath: string,\n ctx: ResolverContext\n): { target: unknown; path: string[] } | null {\n const { blockId, pathParts } = parseRefPath(refPath);\n if (pathParts[0] !== 'instance' || pathParts.length < 2) {\n return null;\n }\n const rest = pathParts.slice(2);\n const serviceOrProp = pathParts[1];\n\n let instance: Record<string, unknown> | undefined;\n if (blockId != null) {\n // Prefer current block's instance when ref points to this block (e.g. root resolving nested refs to itself)\n if (blockId === ctx.currentBlockId && ctx.currentInstance != null) {\n instance = ctx.currentInstance;\n } else {\n const handle = ctx.registry.get(blockId);\n instance = handle?.instance as Record<string, unknown> | undefined;\n }\n } else if (ctx.currentInstance != null) {\n instance = ctx.currentInstance;\n }\n if (instance == null) return null;\n\n const service = instance[serviceOrProp];\n if (rest.length === 0) {\n return { target: service, path: [] };\n }\n let current: unknown = service;\n for (let i = 0; i < rest.length - 1; i++) {\n if (current == null || typeof current !== 'object') return null;\n current = (current as Record<string, unknown>)[rest[i]];\n }\n return { target: current, path: rest.slice(-1) };\n}\n\n/**\n * Get a value from an object by dot-notation path (e.g. \"name.firstName\" -> obj.name?.firstName).\n * Returns undefined if any segment is null/undefined or not an object.\n */\nexport function getValueByPath(obj: unknown, path: string): unknown {\n if (obj == null) return undefined;\n const parts = path.trim().split('.').filter(Boolean);\n let current: unknown = obj;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Return true if the value at ref path is an Angular signal (so reading it in an effect would be reactive).\n */\nexport function refPathResolvesToSignal(refPath: string, ctx: ResolverContext): boolean {\n const resolved = resolveRefPath(refPath, ctx);\n if (resolved == null) return false;\n const val =\n resolved.path.length === 0\n ? resolved.target\n : (resolved.target as Record<string, unknown>)?.[resolved.path[0]];\n return val != null && isSignal(val);\n}\n\n/**\n * Get value at ref path (read-only). Returns undefined if not found.\n */\nexport function getRefValue(refPath: string, ctx: ResolverContext): unknown {\n const resolved = resolveRefPath(refPath, ctx);\n if (resolved == null || resolved.path.length === 0) {\n return resolved?.target;\n }\n const obj = resolved.target as Record<string, unknown>;\n const key = resolved.path[0];\n const val = obj?.[key];\n // Unwrap Angular signals and other getter functions by calling them\n if (val != null && isSignal(val)) {\n return val();\n }\n if (typeof val === 'function') {\n return (val as () => unknown)();\n }\n return val;\n}\n\nexport function getRefSignal(refPath: string, ctx: ResolverContext): Signal<unknown> | undefined {\n const resolved = resolveRefPath(refPath, ctx);\n if (resolved == null) return undefined;\n const val =\n resolved.path.length === 0\n ? resolved.target\n : (resolved.target as Record<string, unknown>)?.[resolved.path[0]];\n if (val != null && isSignal(val)) {\n return val as Signal<unknown>;\n }\n return undefined;\n}\n\n/**\n * Set value at ref path (write). No-op if target is not writable.\n */\nexport function setRefValue(refPath: string, ctx: ResolverContext, value: unknown): void {\n const resolved = resolveRefPath(refPath, ctx);\n if (resolved == null || resolved.path.length === 0) return;\n const obj = resolved.target as Record<string, unknown>;\n const key = resolved.path[0];\n const val = obj?.[key];\n // use isSignal so we only treat real signals as writable\n type WritableSignalLike = { set: (v: unknown) => void };\n const writable =\n val != null &&\n isSignal(val) &&\n typeof (val as unknown as WritableSignalLike).set === 'function'\n ? (val as unknown as WritableSignalLike)\n : null;\n if (writable) {\n writable.set(value);\n } else if (obj != null && typeof obj === 'object') {\n (obj as Record<string, unknown>)[key] = value;\n }\n}\n\n/**\n * Build a computed signal for a template string with {{refPath}} placeholders.\n */\nexport function buildComputedForTemplate(\n template: string,\n refPaths: string[],\n ctx: ResolverContext\n): Signal<string> {\n const escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return computed(() => {\n let out = template;\n for (const refPath of refPaths) {\n const val = getRefValue(refPath, ctx);\n const str = val != null ? String(val) : '';\n out = out.replace(new RegExp(`\\\\{\\\\{${escapeRe(refPath)}\\\\}\\\\}`, 'g'), str);\n }\n return out;\n });\n}\n","import type { BlockRegistry } from './block-registry';\nimport { type OutputReference, isOutputReference } from './block-description.schema';\nimport { resolveRefPath } from './ref-resolver';\n\nfunction getCallTarget(\n reference: string,\n registry: BlockRegistry\n): unknown {\n const resolved = resolveRefPath(reference, { registry });\n if (resolved == null) return undefined;\n const { target, path } = resolved;\n if (path.length === 0) return target;\n const parent = target as Record<string, unknown>;\n return parent?.[path[0]];\n}\n\nfunction getMethodOnTarget(target: unknown, methodName: string): ((...args: unknown[]) => unknown) | null {\n if (target == null) return null;\n const m = (target as Record<string, unknown>)[methodName];\n return typeof m === 'function' ? (m as (...args: unknown[]) => unknown) : null;\n}\n\nexport function resolveOutputReference(\n ref: OutputReference,\n eventValue: unknown,\n registry: BlockRegistry\n): (value: unknown) => void {\n return (value: unknown) => {\n const payload = value ?? eventValue;\n const callTarget = getCallTarget(ref.reference, registry);\n const method = getMethodOnTarget(callTarget, ref.method);\n if (method == null) return;\n const params = ref.params != null\n ? (Array.isArray(ref.params) ? ref.params : [ref.params])\n : [payload];\n const result = method.call(callTarget, ...params);\n if (result != null && typeof (result as Promise<unknown>).then === 'function') {\n (result as Promise<unknown>).then(\n () => runThenOrSuccess(ref, registry),\n () => runOnError(ref, registry)\n );\n } else {\n runThenOrSuccess(ref, registry);\n }\n };\n}\n\nfunction toParams(p: unknown[] | Record<string, unknown> | undefined): unknown[] {\n if (p == null) return [];\n return Array.isArray(p) ? p : [p];\n}\n\nfunction runThenOrSuccess(ref: OutputReference, registry: BlockRegistry): void {\n if (ref.then?.length) {\n for (const step of ref.then) {\n invokeRefMethod(registry, step.reference, step.method, toParams(step.params));\n }\n } else if (ref.onSuccess) {\n invokeRefMethod(registry, ref.onSuccess.reference, ref.onSuccess.method, toParams(ref.onSuccess.params));\n }\n}\n\nfunction runOnError(ref: OutputReference, registry: BlockRegistry): void {\n if (ref.onError) {\n invokeRefMethod(registry, ref.onError.reference, ref.onError.method, toParams(ref.onError.params));\n }\n}\n\nfunction invokeRefMethod(\n registry: BlockRegistry,\n reference: string,\n method: string,\n params: unknown[]\n): void {\n const callTarget = getCallTarget(reference, registry);\n const fn = getMethodOnTarget(callTarget, method);\n if (fn) fn.call(callTarget, ...params);\n}\n\nexport function createOutputHandler(\n outputValue: unknown,\n outputKey: string,\n registry: BlockRegistry,\n directiveHandlers?: Record<string, (value: unknown) => void>\n): (value: unknown) => void {\n if (isOutputReference(outputValue)) {\n return resolveOutputReference(outputValue, undefined, registry);\n }\n const fromDirective = directiveHandlers?.[outputKey];\n return fromDirective ?? (() => {});\n}\n","import {\n ComponentRef,\n Injectable,\n Injector,\n Type,\n ViewContainerRef,\n effect,\n inject,\n isSignal,\n type EffectRef,\n type Signal,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ComponentRegistry } from '../registry/component.registry';\nimport { ServiceRegistry } from '../registry/service.registry';\nimport {\n BlockDescription,\n isBlockReference,\n normalizeServices,\n resolveBlockReference,\n safeParseBlockDescription,\n} from './block-description.schema';\nimport { BlockRegistryImpl, type BlockInstanceHandle, type BlockRegistry } from './block-registry';\nimport { createOutputHandler } from './output-reference';\nimport { classifyTwoWayString, parseTwoWayRef } from './ref-expressions';\nimport {\n ResolverContext,\n getRefSignal,\n getRefValue,\n getValueByPath,\n resolveRefPath,\n setRefValue,\n} from './ref-resolver';\n\nexport interface BlockLoadOptions {\n outputHandlers?: Record<string, (value: unknown) => void>;\n registry?: BlockRegistry;\n /** Map of block id → full description; used when description is an id-only reference. */\n blockDefinitions?: Record<string, unknown>;\n}\n\nexport interface BlockLoadResult {\n componentRef: ComponentRef<unknown>;\n destroy: () => void;\n updateInputs: (description: unknown) => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BlockLoaderService {\n private readonly injector = inject(Injector);\n private readonly componentRegistry = ComponentRegistry.getInstance();\n private readonly serviceRegistry = ServiceRegistry.getInstance();\n\n async load(\n description: unknown,\n viewContainerRef: ViewContainerRef,\n model: Signal<unknown | undefined>,\n options?: BlockLoadOptions,\n ): Promise<BlockLoadResult> {\n let resolved: unknown = description;\n if (isBlockReference(description)) {\n resolved = resolveBlockReference(description, options?.blockDefinitions);\n }\n const parsed = safeParseBlockDescription(resolved);\n\n if (!parsed.success) {\n throw new Error(`Invalid block description: ${parsed.error.message}`);\n }\n const desc = parsed.data;\n const registry = options?.registry ?? new BlockRegistryImpl();\n if (desc.id != null && desc.id !== '' && registry.has(desc.id)) {\n throw new Error(`Block id \"${desc.id}\" is already registered.`);\n }\n\n const componentType = await this.componentRegistry.get(desc.component);\n if (!componentType) {\n throw new Error(`Component \"${desc.component}\" is not registered.`);\n }\n\n const services = normalizeServices(desc.services);\n const selfServices = services.filter(\n (s): s is { id: string; scope: 'self'; alias?: string } =>\n typeof s === 'object' && (s as { scope?: string }).scope === 'self',\n );\n const serviceTypes = await this.getServiceTypes(selfServices);\n const childInjector = this.buildChildInjectorFromTypes(serviceTypes);\n const componentRef = viewContainerRef.createComponent(componentType as Type<unknown>, {\n injector: childInjector,\n });\n\n const blockInstance: Record<string, unknown> = {};\n for (let i = 0; i < selfServices.length; i++) {\n const id = selfServices[i].id;\n const alias = selfServices[i].alias ?? id;\n const serviceType = serviceTypes[i];\n if (serviceType) {\n const svc = componentRef.injector.get(serviceType as Type<unknown>);\n if (svc != null) blockInstance[alias] = svc;\n }\n }\n const ctx: ResolverContext = {\n registry,\n currentBlockId: desc.id ?? undefined,\n currentInstance: blockInstance,\n };\n const handle: BlockInstanceHandle = { instance: blockInstance };\n if (desc.id != null && desc.id !== '') registry.register(desc.id, handle);\n\n this.applyInitialModel(desc, ctx, blockInstance, model);\n\n let currentEffectRefs = this.setInputs(componentRef, desc, ctx, model);\n currentEffectRefs = currentEffectRefs.concat(\n this.applyModelReactivity(desc, ctx, blockInstance, model),\n );\n const subscriptions = this.wireOutputs(componentRef, desc, registry, options?.outputHandlers);\n\n const doDestroy = (): void => {\n if (desc.id != null && desc.id !== '') registry.unregister(desc.id);\n currentEffectRefs.forEach((ref) => ref.destroy());\n subscriptions.forEach((s) => s.unsubscribe());\n const idx = viewContainerRef.indexOf(componentRef.hostView);\n if (idx !== -1) viewContainerRef.remove(idx);\n componentRef.destroy();\n };\n handle.destroy = doDestroy;\n\n const updateInputs = (newDesc: unknown): void => {\n const p = safeParseBlockDescription(newDesc);\n if (p.success) {\n currentEffectRefs.forEach((ref) => ref.destroy());\n this.applyInitialModel(p.data, ctx, blockInstance, model);\n currentEffectRefs = this.setInputs(componentRef, p.data, ctx, model);\n currentEffectRefs = currentEffectRefs.concat(\n this.applyModelReactivity(p.data, ctx, blockInstance, model),\n );\n }\n };\n\n return { componentRef, destroy: doDestroy, updateInputs };\n }\n\n /** Resolve all service types in parallel (single batch for load). */\n private async getServiceTypes(\n selfServices: { id: string; scope: 'self' }[],\n ): Promise<(Type<unknown> | undefined)[]> {\n if (selfServices.length === 0) return [];\n return Promise.all(selfServices.map((e) => this.serviceRegistry.getType(e.id)));\n }\n\n private buildChildInjectorFromTypes(serviceTypes: (Type<unknown> | undefined)[]): Injector {\n const providers = serviceTypes\n .filter((t): t is Type<unknown> => t != null)\n .map((t) => ({ provide: t, useClass: t }));\n return providers.length === 0\n ? this.injector\n : Injector.create({ providers, parent: this.injector });\n }\n\n /** Set inputs and wire template/two-way effects. Single pass over inputs for large configs. */\n private setInputs(\n componentRef: ComponentRef<unknown>,\n desc: BlockDescription,\n ctx: ResolverContext,\n blockModel?: Signal<unknown | undefined>,\n ): EffectRef[] {\n const effectRefs: EffectRef[] = [];\n const inputs = desc.inputs ?? {};\n const inst = componentRef.instance as Record<string, unknown>;\n for (const [key, value] of Object.entries(inputs)) {\n if (key === 'model') {\n continue;\n }\n if (typeof value === 'string') {\n const twoWayKind = classifyTwoWayString(value);\n if (twoWayKind === 'invalid-mix') {\n throw new Error(\n `Invalid input \"${String(key)}\": two-way ref \"[( )]\" cannot be mixed with literals or \"{{ }}\". ` +\n `Use exactly \"[(refPath)]\" for two-way or \"{{ refPath }}\" for read-only.`,\n );\n }\n if (twoWayKind === 'two-way') {\n const refPath = parseTwoWayRef(value);\n if (refPath) {\n const modelSig = inst[key];\n if (modelSig != null && isSignal(modelSig)) {\n effectRefs.push(\n effect(\n () => {\n const fromRef = getRefValue(refPath, ctx);\n if (fromRef === undefined) return;\n if (componentRef.setInput) {\n componentRef.setInput(key as never, fromRef as never);\n componentRef.changeDetectorRef.detectChanges();\n }\n },\n { injector: this.injector },\n ),\n );\n effectRefs.push(\n effect(\n () => {\n const current = modelSig();\n setRefValue(refPath, ctx, current);\n },\n { injector: this.injector },\n ),\n );\n }\n }\n continue;\n }\n }\n const str = value as string;\n if (\n typeof value === 'string' &&\n str.indexOf('{{') !== -1 &&\n str.indexOf('}}', str.indexOf('{{')) !== -1\n ) {\n effectRefs.push(\n effect(\n () => {\n const modelSig = ctx.currentInstance?.['model'];\n const model =\n modelSig != null && isSignal(modelSig)\n ? (modelSig as Signal<unknown>)()\n : (modelSig as unknown);\n const resolved = this.interpolateTemplateMixed(str, ctx, model);\n if (componentRef.setInput) componentRef.setInput(key as never, resolved as never);\n else inst[key] = resolved;\n },\n { injector: this.injector },\n ),\n );\n continue;\n }\n\n const resolved = this.resolveInputValue(value, ctx);\n if (componentRef.setInput) componentRef.setInput(key as never, resolved as never);\n else inst[key] = resolved;\n }\n return effectRefs;\n }\n\n /** Resolve model from desc (interpolate ref if string) and set on services and blockInstance. */\n private applyInitialModel(\n desc: BlockDescription,\n ctx: ResolverContext,\n blockInstance: Record<string, unknown>,\n blockModel: Signal<unknown | undefined>,\n ): void {\n const rawModel = desc.inputs?.['model'];\n if (rawModel === undefined || rawModel === null) {\n const model = blockModel();\n for (const svc of Object.values(blockInstance)) {\n if (svc != null && typeof (svc as Record<string, unknown>)['setModel'] === 'function') {\n ((svc as Record<string, unknown>)['setModel'] as (v: unknown) => void)(model);\n }\n }\n blockInstance['model'] = blockModel;\n return;\n }\n let model: unknown = rawModel;\n if (typeof rawModel === 'string') {\n const refPath = rawModel.trim().replace(/^\\{\\{\\s*|\\s*\\}\\}$/g, '');\n if (refPath.length > 0) {\n const refSignal = getRefSignal(refPath, ctx);\n \n if (refSignal != null) {\n model = refSignal();\n blockInstance['model'] = refSignal;\n } else {\n model = getRefValue(refPath, ctx);\n }\n }\n }\n for (const svc of Object.values(blockInstance)) {\n if (svc != null && typeof (svc as Record<string, unknown>)['setModel'] === 'function') {\n ((svc as Record<string, unknown>)['setModel'] as (v: unknown) => void)(model);\n }\n }\n }\n\n /** If model is a ref string, return an effect that keeps setModel/blockInstance in sync with the ref. */\n private applyModelReactivity(\n desc: BlockDescription,\n ctx: ResolverContext,\n blockInstance: Record<string, unknown>,\n blockModel: Signal<unknown | undefined>,\n ): EffectRef[] {\n const rawModel = desc.inputs?.['model'];\n const refPath =\n rawModel != null && typeof rawModel === 'string'\n ? rawModel.trim().replace(/^\\{\\{\\s*|\\s*\\}\\}$/g, '')\n : '';\n if (refPath.length === 0) {\n return [];\n }\n const effectRef = effect(\n () => {\n const model = refPath ? getRefValue(refPath, ctx) : blockModel();\n for (const svc of Object.values(blockInstance)) {\n if (svc != null && typeof (svc as Record<string, unknown>)['setModel'] === 'function') {\n ((svc as Record<string, unknown>)['setModel'] as (v: unknown) => void)(model);\n }\n }\n },\n { injector: this.injector },\n );\n return [effectRef];\n }\n\n /**\n * Replace each {{ refPath }} with a value: resolve as ref first (e.g. Person.instance.AuthState.firstName),\n * else as model path (e.g. firstName, instance.model.firstName). Allows mixing both in one template.\n */\n private interpolateTemplateMixed(template: string, ctx: ResolverContext, model: unknown): string {\n const parts: string[] = [];\n let s = template;\n for (let i = 0; i < BlockLoaderService.INTERPOLATE_MAX_PLACEHOLDERS; i++) {\n const start = s.indexOf('{{');\n if (start === -1) {\n parts.push(s);\n break;\n }\n parts.push(s.slice(0, start));\n const end = s.indexOf('}}', start);\n if (end === -1) {\n parts.push(s.slice(start));\n break;\n }\n const ref = s.slice(start + 2, end).trim();\n const val = ref\n ? resolveRefPath(ref, ctx) != null\n ? getRefValue(ref, ctx)\n : getValueByPath(model, ref)\n : null;\n parts.push(val != null ? String(val) : '');\n s = s.slice(end + 2);\n }\n return parts.join('');\n }\n\n /** Replace all {{ refPath }} with resolved values. Uses parts array + join to avoid N string concats. */\n private static readonly INTERPOLATE_MAX_PLACEHOLDERS = 200;\n private interpolateTemplate(template: string, ctx: ResolverContext): string {\n const parts: string[] = [];\n let s = template;\n for (let i = 0; i < BlockLoaderService.INTERPOLATE_MAX_PLACEHOLDERS; i++) {\n const start = s.indexOf('{{');\n if (start === -1) {\n parts.push(s);\n break;\n }\n parts.push(s.slice(0, start));\n const end = s.indexOf('}}', start);\n if (end === -1) {\n parts.push(s.slice(start));\n break;\n }\n const ref = s.slice(start + 2, end).trim();\n const val = ref ? getRefValue(ref, ctx) : null;\n parts.push(val != null ? String(val) : '');\n s = s.slice(end + 2);\n }\n return parts.join('');\n }\n\n /**\n * Resolve a single input value: resolve two-way refs, recurse into arrays/objects.\n * Strings with {{ }} are left as-is so child blocks receive the template for reactive interpolation.\n * Two-way refs inside nested block descriptors (object with \"component\" + \"inputs\") are left as-is\n * so that when a child block is loaded it still sees value: '[(ref)]' and can wire two-way binding.\n */\n private resolveInputValue(\n value: unknown,\n ctx: ResolverContext,\n options?: { preserveTwoWayRefs?: boolean },\n ): unknown {\n const preserveTwoWayRefs = options?.preserveTwoWayRefs ?? false;\n if (typeof value === 'string') {\n const twoWayKind = classifyTwoWayString(value);\n if (twoWayKind === 'invalid-mix') {\n const preview = value.length > 200 ? `${value.slice(0, 200)}...` : value;\n throw new Error(\n `Invalid input: two-way ref \"[( )]\" cannot be mixed with literals or \"{{ }}\". ` +\n `Use exactly \"[(refPath)]\" for two-way or \"{{ refPath }}\" for read-only. Got: ${JSON.stringify(preview)}`,\n );\n }\n if (twoWayKind === 'two-way') {\n if (preserveTwoWayRefs) return value;\n const refPath = parseTwoWayRef(value);\n return refPath ? getRefValue(refPath, ctx) : value;\n }\n return value;\n }\n if (Array.isArray(value)) {\n let changed = false;\n const resolved = value.map((item) => {\n const r = this.resolveInputValue(item, ctx, options);\n if (r !== item) changed = true;\n return r;\n });\n return changed ? resolved : value;\n }\n if (value != null && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const isNestedBlockDescriptor = typeof obj['component'] === 'string' && obj['inputs'] != null;\n const entries = Object.entries(value as Record<string, unknown>);\n const resolvedPairs: [string, unknown][] = [];\n let changed = false;\n for (const [k, v] of entries) {\n const childOptions =\n isNestedBlockDescriptor && k === 'inputs' ? { preserveTwoWayRefs: true } : options;\n const resolved = this.resolveInputValue(v, ctx, childOptions);\n if (resolved !== v) changed = true;\n resolvedPairs.push([k, resolved]);\n }\n if (!changed) return value;\n const out: Record<string, unknown> = {};\n for (const [k, r] of resolvedPairs) out[k] = r;\n return out;\n }\n return value;\n }\n\n private wireOutputs(\n componentRef: ComponentRef<unknown>,\n desc: BlockDescription,\n registry: BlockRegistry,\n outputHandlers?: Record<string, (value: unknown) => void>,\n ): Subscription[] {\n const subs: Subscription[] = [];\n const outputs = desc.outputs ?? {};\n const inst = componentRef.instance as Record<string, unknown>;\n for (const [outputKey, outputValue] of Object.entries(outputs)) {\n const handler = createOutputHandler(outputValue, outputKey, registry, outputHandlers);\n const emitter = inst[outputKey];\n if (\n emitter != null &&\n typeof (\n emitter as { subscribe?: (fn: (v: unknown) => void) => { unsubscribe: () => void } }\n ).subscribe === 'function'\n ) {\n const sub = (\n emitter as { subscribe: (fn: (v: unknown) => void) => { unsubscribe: () => void } }\n ).subscribe((v: unknown) => handler(v));\n subs.push(sub as unknown as Subscription);\n }\n }\n return subs;\n }\n}\n","import { Directive, input, effect, ViewContainerRef, inject, DestroyRef } from '@angular/core';\nimport { BlockLoaderService, type BlockLoadResult } from './block-loader.service';\nimport type { BlockRegistry } from './block-registry';\nimport type { BlockDescription, BlockInput } from './block-description.schema';\nimport {\n safeParseBlockDescription,\n normalizeServices,\n isBlockReference,\n resolveBlockReference,\n} from './block-description.schema';\n\n/** Compact key for services to avoid JSON.stringify of large config in effect. */\nfunction getServicesKey(services: BlockDescription['services']): string {\n const arr = normalizeServices(services);\n if (arr.length === 0) return '';\n return arr\n .map((s) =>\n typeof s === 'string'\n ? s\n : `${(s as { id: string }).id}:${(s as { scope?: string }).scope ?? ''}`,\n )\n .join(',');\n}\n\n@Directive({\n selector: '[block]',\n standalone: true,\n})\nexport class BlockDirective {\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly loader = inject(BlockLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Full description, or { id } / { blockId, blockDefinition? } to reuse/override from blockDefinitions. */\n readonly description = input<BlockInput | null>(null);\n /** Handlers for component outputs; keys match descriptor.outputs. */\n readonly outputHandlers = input<Record<string, (value: unknown) => void>>({});\n /** Registry for block instances by id; pass from root so nested blocks share it. */\n readonly blockRegistry = input<BlockRegistry | null>(null);\n /** Map id → full description; used when description is a block reference (id/blockId). */\n readonly blockDefinitions = input<Record<string, unknown> | null>(null);\n /** Model for the block. */\n readonly model = input<unknown | undefined>(undefined);\n\n private loadResult: BlockLoadResult | null = null;\n private loadedComponent: string | null = null;\n private loadedServicesKey: string | null = null;\n private loadGeneration = 0;\n /** Avoid re-parsing when the same description reference is passed (e.g. stable signal). */\n private lastDescRef: unknown = null;\n private lastParsedData: BlockDescription | null = null;\n\n constructor() {\n effect(() => {\n const desc = this.description();\n const outputHandlers = this.outputHandlers();\n const inputDefs = this.blockDefinitions();\n\n if (desc == null) {\n this.lastDescRef = null;\n this.lastParsedData = null;\n this.clear();\n return;\n }\n\n const resolved = isBlockReference(desc)\n ? resolveBlockReference(desc, inputDefs ?? undefined)\n : desc;\n\n let data: BlockDescription;\n if (resolved === this.lastDescRef && this.lastParsedData != null) {\n data = this.lastParsedData;\n } else {\n const parsed = safeParseBlockDescription(resolved);\n if (!parsed.success) {\n return;\n }\n this.lastDescRef = resolved;\n this.lastParsedData = parsed.data;\n data = parsed.data;\n }\n const servicesKey = getServicesKey(data.services);\n const canUpdate =\n this.loadResult != null &&\n this.loadedComponent === data.component &&\n this.loadedServicesKey === servicesKey;\n\n if (canUpdate && this.loadResult) {\n this.loadResult.updateInputs(resolved);\n return;\n }\n\n this.clear();\n const registry = this.blockRegistry() ?? undefined;\n const generation = ++this.loadGeneration;\n this.loader\n .load(resolved, this.viewContainerRef, this.model, {\n outputHandlers: Object.keys(outputHandlers).length > 0 ? outputHandlers : undefined,\n registry,\n\n blockDefinitions: inputDefs ?? undefined,\n })\n .then((result) => {\n if (generation !== this.loadGeneration) return;\n this.loadResult = result;\n this.loadedComponent = data.component;\n this.loadedServicesKey = servicesKey;\n })\n .catch((err: unknown) => {\n if (generation !== this.loadGeneration) return;\n console.error('Block load failed:', err);\n });\n });\n this.destroyRef.onDestroy(() => this.clear());\n }\n\n private clear(): void {\n this.loadGeneration++;\n this.lastDescRef = null;\n this.lastParsedData = null;\n if (this.loadResult) {\n this.loadResult.destroy();\n this.loadResult = null;\n this.loadedComponent = null;\n this.loadedServicesKey = null;\n }\n }\n}\n","/*\n * Public API Surface of blocks-studio\n */\n\nexport * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAgBA;;;;AAIG;MACU,qBAAqB,CAAA;IACxB,OAAO,QAAQ;AACf,IAAA,OAAO,GAAG,IAAI,GAAG,EAAqE;AAE9F,IAAA,WAAA,GAAA,EAAuB;AAEvB,IAAA,OAAO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE;AACnC,YAAA,qBAAqB,CAAC,QAAQ,GAAG,IAAI,qBAAqB,EAAE;QAC9D;QACA,OAAO,qBAAqB,CAAC,QAAQ;IACvC;AAEA;;AAEG;AACH,IAAA,GAAG,CAAC,GAAW,EAAE,IAAuB,EAAE,IAA4B,EAAA;AACpE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvC;AAEA;;AAEG;AACH,IAAA,GAAG,CAAC,GAAW,EAAA;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI;IACpC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACtB;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,IAAuB,EAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkC;QACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;AACvC,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE;gBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC;YAC7B;QACF;AACA,QAAA,OAAO,MAAM;IACf;AAEA;;AAEG;IACH,cAAc,GAAA;QACZ,OAAO;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;AACvC,YAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;AACnC,YAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAChC;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,GAAW,EAAA;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;IACjC;AAEA;;AAEG;AACH,IAAA,GAAG,CAAC,GAAW,EAAA;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9B;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IACtB;AACD;;MC1FY,iBAAiB,CAAA;IACpB,OAAO,QAAQ;AACf,IAAA,UAAU,GAAG,IAAI,GAAG,EAA6B;AACjD,IAAA,gBAAgB,GAAG,IAAI,GAAG,EAAqB;AACtC,IAAA,aAAa,GAAG,qBAAqB,CAAC,WAAW,EAAE;AAEpE,IAAA,WAAA,GAAA,EAAuB;AAEvB,IAAA,OAAO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AAC/B,YAAA,iBAAiB,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE;QACtD;QACA,OAAO,iBAAiB,CAAC,QAAQ;IACnC;AAEA,IAAA,QAAQ,CACN,IAAY,EACZ,SAAsC,EACtC,QAAiC,EAAA;QAEjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC7B,YAAA,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,CAAA,sCAAA,CAAwC,CAAC;QACzE;QAEA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;;QAEpC,IAAI,OAAO,SAAS,KAAK,UAAU,IAAI,SAAS,CAAC,SAAS,EAAE;YAC1D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,SAAsB,CAAC;QACzD;AACA,QAAA,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACxD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC;QACrD;IACF;IAEA,MAAM,GAAG,CAAC,IAAY,EAAA;;QAEpB,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QACxC;QAEA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QACnD,IAAI,CAAC,iBAAiB,EAAE;AACtB,YAAA,OAAO,SAAS;QAClB;;;AAIA,QAAA,MAAM,QAAQ,GACZ,OAAO,iBAAiB,KAAK,UAAU,IAAI,CAAE,iBAAyB,CAAC,SAAS,EAAE,WAAW;QAE/F,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI;gBACF,MAAM,MAAM,GAAG,iBAAoC;AACnD,gBAAA,MAAM,SAAS,GAAG,MAAM,MAAM,EAAE;gBAChC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;AAC1C,gBAAA,OAAO,SAAS;YAClB;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAA,+BAAA,EAAkC,IAAI,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;AAChE,gBAAA,OAAO,SAAS;YAClB;QACF;;QAGA,MAAM,SAAS,GAAG,iBAA8B;QAChD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;AAC1C,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,OAAO,CAAC,IAAY,EAAA;;QAElB,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QACxC;QAEA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QACnD,IAAI,CAAC,iBAAiB,EAAE;AACtB,YAAA,OAAO,SAAS;QAClB;;AAGA,QAAA,MAAM,QAAQ,GACZ,OAAO,iBAAiB,KAAK,UAAU,IAAI,CAAE,iBAAyB,CAAC,SAAS,EAAE,WAAW;;QAG/F,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,SAAS;QAClB;;QAGA,MAAM,SAAS,GAAG,iBAA8B;QAChD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;AAC1C,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;IAEA,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACvC;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;IACrC;IAEA,KAAK,GAAA;QACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE;AACzC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AACvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;IAC/B;AAEA,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC;IAC5C;IAEA,kBAAkB,GAAA;AAChB,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuE;QAC7F,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACrD,YAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;gBACf,SAAS;gBACT,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC;AAC/C,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,MAAM;IACf;AACD;;MCzHY,aAAa,CAAA;IAChB,OAAO,QAAQ;AACf,IAAA,MAAM,GAAG,IAAI,GAAG,EAAyB;AACzC,IAAA,YAAY,GAAG,IAAI,GAAG,EAAuB;AACpC,IAAA,aAAa,GAAG,qBAAqB,CAAC,WAAW,EAAE;AAEpE,IAAA,WAAA,GAAA,EAAuB;AAEvB,IAAA,OAAO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC3B,YAAA,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE;QAC9C;QACA,OAAO,aAAa,CAAC,QAAQ;IAC/B;AAEA,IAAA,QAAQ,CAAC,IAAY,EAAE,KAAoB,EAAE,QAAiC,EAAA;QAC5E,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACzB,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAA,uCAAA,CAAyC,CAAC;QACvE;QACA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACzB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,KAAoB,CAAC;QACnD;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC;AACA,QAAA,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACxD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;QACjD;IACF;AAEA;;AAEG;IACH,MAAM,GAAG,CAAC,IAAY,EAAA;QACpB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QACpC;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;AAChC,YAAA,IAAI;gBACF,MAAM,MAAM,GAAG,aAA4B;AAC3C,gBAAA,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE;gBAC5B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;AAClC,gBAAA,OAAO,KAAK;YACd;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAA,2BAAA,EAA8B,IAAI,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;AAC5D,gBAAA,OAAO,SAAS;YAClB;QACF;QAEA,MAAM,KAAK,GAAG,aAA4B;QAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;AAClC,QAAA,OAAO,KAAK;IACd;AAEA;;AAEG;AACH,IAAA,OAAO,CAAC,IAAY,EAAA;QAClB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QACpC;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;AAClD,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,KAAK,GAAG,aAA4B;QAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;AAClC,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC;IAC5C;IAEA,kBAAkB,GAAA;AAChB,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqE;QAC3F,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE;AAC7C,YAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;gBACf,KAAK;gBACL,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC;AAC/C,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACjC;IAEA,KAAK,GAAA;QACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;AACrC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;IAC3B;AAEQ,IAAA,QAAQ,CAAC,KAAoB,EAAA;AACnC,QAAA,QACE,OAAO,KAAK,KAAK,UAAU;AAC1B,YAAA,KAAqB,CAAC,MAAM,KAAK,CAAC;IAEvC;AACD;;MC9HY,eAAe,CAAA;IAClB,OAAO,QAAQ;AACf,IAAA,QAAQ,GAAG,IAAI,GAAG,EAA2B;AAC7C,IAAA,cAAc,GAAG,IAAI,GAAG,EAAqB;IAC7C,QAAQ,GAAoB,IAAI;AACvB,IAAA,aAAa,GAAG,qBAAqB,CAAC,WAAW,EAAE;AAEpE,IAAA,WAAA,GAAA,EAAuB;AAEvB,IAAA,OAAO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AAC7B,YAAA,eAAe,CAAC,QAAQ,GAAG,IAAI,eAAe,EAAE;QAClD;QACA,OAAO,eAAe,CAAC,QAAQ;IACjC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,QAAkB,EAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;IAC1B;AAEA;;AAEG;AACH,IAAA,QAAQ,CACN,IAAY,EACZ,OAAkC,EAClC,QAAiC,EAAA;QAEjC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,CAAA,sCAAA,CAAwC,CAAC;QACvE;QACA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;;QAEhC,IAAI,OAAO,OAAO,KAAK,UAAU,IAAK,OAAe,CAAC,SAAS,EAAE;YAC/D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,OAAoB,CAAC;QACrD;AACA,QAAA,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACxD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;QACnD;IACF;AAEA;;;AAGG;IACH,MAAM,GAAG,CAAC,IAAY,EAAA;;QAEpB,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACjC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAE;AAClD,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QACxC;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,CAAA,uBAAA,CAAyB,CAAC;AACxD,YAAA,OAAO,SAAS;QAClB;;AAGA,QAAA,MAAM,QAAQ,GAAG,OAAO,eAAe,KAAK,UAAU;AACrC,YAAA,CAAE,eAAuB,CAAC,SAAS,EAAE,WAAW;QAEjE,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI;gBACF,MAAM,MAAM,GAAG,eAAgC;AAC/C,gBAAA,MAAM,WAAW,GAAG,MAAM,MAAM,EAAE;gBAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;AAC1C,gBAAA,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;YACxC;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAgC,IAAI,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;AAC9D,gBAAA,OAAO,SAAS;YAClB;QACF;;QAGA,MAAM,WAAW,GAAG,eAA4B;QAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;AAC1C,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;IACxC;AAEA;;AAEG;AACH,IAAA,OAAO,CAAC,IAAY,EAAA;;QAElB,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACjC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAE;AAClD,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QACxC;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,CAAA,uBAAA,CAAyB,CAAC;AACxD,YAAA,OAAO,SAAS;QAClB;;AAGA,QAAA,MAAM,QAAQ,GAAG,OAAO,eAAe,KAAK,UAAU;AACrC,YAAA,CAAE,eAAuB,CAAC,SAAS,EAAE,WAAW;;QAGjE,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,CAAA,0EAAA,CAA4E,CAAC;AAC1G,YAAA,OAAO,SAAS;QAClB;;QAGA,MAAM,WAAW,GAAG,eAA4B;QAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;AAC1C,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;IACxC;AAEA;;AAEG;AACK,IAAA,aAAa,CAAC,WAAsB,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;;AAElB,YAAA,IAAI;AACF,gBAAA,OAAO,MAAM,CAAC,WAAW,CAAC;YAC5B;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,4DAA4D,EAAE,KAAK,CAAC;AAClF,gBAAA,OAAO,SAAS;YAClB;QACF;AAEA,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;QACvC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC;AAC5D,YAAA,OAAO,SAAS;QAClB;IACF;AAEA;;;AAGG;IACH,MAAM,OAAO,CAAC,IAAY,EAAA;QACxB,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QACtC;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,CAAA,uBAAA,CAAyB,CAAC;AACxD,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,QAAQ,GACZ,OAAO,eAAe,KAAK,UAAU;AACrC,YAAA,CAAE,eAAuB,CAAC,SAAS,EAAE,WAAW;QAElD,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI;gBACF,MAAM,MAAM,GAAG,eAAgC;AAC/C,gBAAA,MAAM,WAAW,GAAG,MAAM,MAAM,EAAE;gBAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;AAC1C,gBAAA,OAAO,WAAW;YACpB;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAgC,IAAI,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;AAC9D,gBAAA,OAAO,SAAS;YAClB;QACF;QAEA,MAAM,WAAW,GAAG,eAA4B;QAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;AAC1C,QAAA,OAAO,WAAW;IACpB;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,IAAY,EAAA;QACtB,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QACtC;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,QAAQ,GACZ,OAAO,eAAe,KAAK,UAAU;AACrC,YAAA,CAAE,eAAuB,CAAC,SAAS,EAAE,WAAW;QAElD,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,WAAW,GAAG,eAA4B;QAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;AAC1C,QAAA,OAAO,WAAW;IACpB;AAEA;;AAEG;AACH,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC;IAC5C;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;IACnC;AAEA;;AAEG;IACH,KAAK,GAAA;QACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;AACvC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;IAC7B;AACD;;MCpMY,WAAW,CAAA;AACd,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,iBAAiB,GAAG,iBAAiB,CAAC,WAAW,EAAE;AACnD,IAAA,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE;AAElC,IAAA,gBAAgB,GAAG,MAAM,CAAsB,IAAI,4DAAC;AACpD,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,uDAAC;;AAGxC,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;;AAEpD,IAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;;AAE1C,IAAA,WAAW,GAAG,QAAQ,CAAgB,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,MAAM,IAAI,EAAE,uDAAC;AAE3F;;AAEG;IACH,MAAM,UAAU,CAAC,MAAoB,EAAA;AACnC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;AACjC,QAAA,MAAM,IAAI,CAAC,YAAY,EAAE;IAC3B;AAEA;;AAEG;IACH,MAAM,iBAAiB,CAAC,UAAkB,EAAA;AACxC,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,UAAU,CAAC,CAAC;AAC5E,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AAChC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;AACjC,YAAA,MAAM,IAAI,CAAC,YAAY,EAAE;QAC3B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC;AACpE,YAAA,MAAM,KAAK;QACb;IACF;AAEQ,IAAA,MAAM,YAAY,GAAA;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACtC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE;QAC1C,MAAM,MAAM,GAAW,MAAM,OAAO,CAAC,GAAG,CACtC,eAAe,CAAC,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAC3E;AAED,QAAA,IAAI,MAAM,EAAE,eAAe,IAAI,IAAI,IAAI,MAAM,CAAC,eAAe,KAAK,EAAE,EAAE;YACpE,MAAM,CAAC,OAAO,CAAC;AACb,gBAAA,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,MAAM,CAAC,eAAe;AAClC,gBAAA,SAAS,EAAE,MAAM;AAClB,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,EAAE,gBAAgB,IAAI,IAAI,IAAI,MAAM,CAAC,gBAAgB,KAAK,EAAE,EAAE;YACtE,MAAM,CAAC,IAAI,CAAC;AACV,gBAAA,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,MAAM,CAAC,gBAAgB;AACpC,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC;IAEQ,MAAM,kBAAkB,CAAC,MAAmB,EAAA;AAClD,QAAA,MAAM,SAAS,GAA4B,EAAE,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;AACrE,QAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AACpB,YAAA,SAAS,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,SAAS;QAC3C;AAEA,QAAA,MAAM,CACJ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,sBAAsB,EACvB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;AACtC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC;AACxC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;AAClC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;AACnC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAC5C,SAAA,CAAC;AAEF,QAAA,MAAM,KAAK,GAAc;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,aAAa,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC/C,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACpD,YAAA,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACvD,YAAA,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AAChE,YAAA,IAAI,MAAM,CAAC,qBAAqB,IAAI,IAAI,IAAI;gBAC1C,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;aACpD,CAAC;AACF,YAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI;AAClC,gBAAA,WAAW,EAAE,iBAA6C;aAC3D,CAAC;AACF,YAAA,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI;AACpC,gBAAA,aAAa,EAAE,mBAAiD;aACjE,CAAC;AACF,YAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,aAAqC,EAAE,CAAC;AACnF,YAAA,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAuC,EAAE,CAAC;AACvF,YAAA,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,IAAI;AACvC,gBAAA,gBAAgB,EAAE,sBAAuD;aAC1E,CAAC;SACH;QAED,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;AACnC,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ;YACpC,KAAK,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CACnE;AACD,YAAA,IAAI,YAAY,CAAC,eAAe,IAAI,IAAI,IAAI,YAAY,CAAC,eAAe,KAAK,EAAE,EAAE;AAC/E,gBAAA,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;AACrB,oBAAA,IAAI,EAAE,EAAE;oBACR,UAAU,EAAE,YAAY,CAAC,eAAe;AACxC,oBAAA,SAAS,EAAE,MAAM;AAClB,iBAAA,CAAC;YACJ;AACA,YAAA,IAAI,YAAY,CAAC,gBAAgB,IAAI,IAAI,IAAI,YAAY,CAAC,gBAAgB,KAAK,EAAE,EAAE;AACjF,gBAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAClB,oBAAA,IAAI,EAAE,IAAI;oBACV,UAAU,EAAE,YAAY,CAAC,gBAAgB;AAC1C,iBAAA,CAAC;YACJ;QACF;AAEA,QAAA,OAAO,KAAK;IACd;IAEQ,MAAM,aAAa,CAAC,UAAgC,EAAA;QAC1D,IAAI,CAAC,UAAU,EAAE,MAAM;AAAE,YAAA,OAAO,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACjF,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAuB,CAAC,IAAI,IAAI,CAAC;IAC5D;IAEQ,MAAM,aAAa,CAAC,WAAwB,EAAA;AAClD,QAAA,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS;QAC3C,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC;QAC/D;QACA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC;QACjE,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CACb,cAAc,aAAa,CAAA,8EAAA,CAAgF,CAC5G;QACH;AACA,QAAA,OAAO,SAAS;IAClB;IAEQ,MAAM,QAAQ,CAAC,SAAiB,EAAA;QACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACrD,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,YAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB,SAAS,CAAA,iCAAA,CAAmC,CAAC;AAC5E,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,KAAK;IACd;uGA9JW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;2FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACnDD;;;;;AAKG;MACU,wBAAwB,CAAA;IAC3B,OAAO,QAAQ;AACN,IAAA,WAAW,GAAG,IAAI,GAAG,EAAmC;AAEzE,IAAA,WAAA,GAAA,EAAuB;AAEvB,IAAA,OAAO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE;AACtC,YAAA,wBAAwB,CAAC,QAAQ,GAAG,IAAI,wBAAwB,EAAE;QACpE;QACA,OAAO,wBAAwB,CAAC,QAAQ;IAC1C;;IAGA,QAAQ,CAAC,EAAU,EAAE,UAAmC,EAAA;QACtD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC;IACtC;;AAGA,IAAA,GAAG,CAAC,EAAU,EAAA;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IACjC;;IAGA,MAAM,GAAA;QACJ,MAAM,GAAG,GAA4B,EAAE;QACvC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,KAAI;AACnC,YAAA,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;AACf,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,GAAG;IACZ;AAEA,IAAA,UAAU,CAAC,EAAU,EAAA;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;IACpC;AACD;;ACtCD;;AAEG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC;AACjC,IAAA,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACrB,QAAA,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;AACxB,QAAA,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACpC,CAAC;AACH,CAAA,CAAC;AAEF;;AAEG;AACH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;AACrC,IAAA,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,IAAA,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;AACrF,IAAA,IAAI,EAAE;AACH,SAAA,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;AACtF,KAAA,CAAC;AAEH,SAAA,QAAQ,EAAE;AACb,IAAA,SAAS,EAAE;AACR,SAAA,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACtF;AACA,SAAA,QAAQ,EAAE;AACb,IAAA,OAAO,EAAE;AACN,SAAA,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACtF;AACA,SAAA,QAAQ,EAAE;AACd,CAAA,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;AAE7F;;;AAGG;AACI,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,IAAA,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;AAChC,IAAA,QAAQ,EAAE;SACP,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;AACvD,SAAA,QAAQ;SACR,OAAO,CAAC,EAAE,CAAC;AACd,IAAA,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;AACpD,IAAA,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,QAAQ,EAAE;AAC5D,CAAA;AAOD;AACM,SAAU,iBAAiB,CAAC,QAAsC,EAAA;IACtE,IAAI,QAAQ,IAAI,IAAI;AAAE,QAAA,OAAO,EAAE;AAC/B,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACxD;AAEM,SAAU,yBAAyB,CACvC,IAAa,EAAA;AAEb,IAAA,OAAO,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC;AAC/C;AAEM,SAAU,iBAAiB,CAAC,KAAc,EAAA;AAC9C,IAAA,QACE,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,KAAK,KAAK,IAAI;QACb,KAAyB,CAAC,IAAI,KAAK,WAAW;AAC/C,QAAA,OAAQ,KAAyB,CAAC,SAAS,KAAK,QAAQ;AACxD,QAAA,OAAQ,KAAyB,CAAC,MAAM,KAAK,QAAQ;AAEzD;AAgBM,SAAU,gBAAgB,CAAC,KAAc,EAAA;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,IAAI,KAAK;AAAE,QAAA,OAAO,KAAK;IACrF,MAAM,EAAE,GAAI,KAAwB,CAAC,EAAE,IAAK,KAAwB,CAAC,OAAO;IAC5E,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;AAChD;AAEA;;;;AAIG;AACG,SAAU,wBAAwB,CACtC,IAA6B,EAC7B,QAAiC,EAAA;AAEjC,IAAA,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE;IAC1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACvC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;AAC3B,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC;QACjC,IACE,WAAW,IAAI,IAAI;YACnB,OAAO,WAAW,KAAK,QAAQ;AAC/B,YAAA,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;AAC3B,YAAA,OAAO,IAAI,IAAI;YACf,OAAO,OAAO,KAAK,QAAQ;AAC3B,YAAA,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EACvB;YACA,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CACpC,OAAkC,EAClC,WAAsC,CACvC;QACH;aAAO;AACL,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW;QAC3B;IACF;AACA,IAAA,OAAO,MAAM;AACf;AAEA;;;;;AAKG;AACG,SAAU,qBAAqB,CACnC,GAAmB,EACnB,gBAA4D,EAAA;AAE5D,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;AAC3B,IAAA,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE;AACjB,IAAA,MAAM,QAAQ,GAA6B,wBAAwB,CAAC,WAAW,EAAE;AACjF,IAAA,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;AACzC,QAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;AAEvD,IAAA,IAAI,IAAa;AACjB,IAAA,IAAI,gBAAgB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE;AACvF,QAAA,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAClC;SAAO;AACL,QAAA,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;IAC9B;AAEA,IAAA,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;AAC1C,QAAA,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAA,oBAAA,CAAsB,CAAC;IAE1D,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;AAE/B,IAAA,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe;AACrC,IAAA,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;AAC3F,QAAA,OAAO,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,OAAO,wBAAwB,CAAC,OAAO,EAAE,SAAS,CAAC;AACrD;;ACzJA;;AAEG;MACU,iBAAiB,CAAA;AACX,IAAA,GAAG,GAAG,IAAI,GAAG,EAA+B;IAE7D,QAAQ,CAAC,EAAU,EAAE,MAA2B,EAAA;QAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,EAAE,CAAA,8DAAA,CAAgE,CAAC;QAClG;QACA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;IAC1B;AAEA,IAAA,UAAU,CAAC,EAAU,EAAA;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IACrB;AAEA,IAAA,GAAG,CAAC,EAAU,EAAA;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;IACzB;AAEA,IAAA,GAAG,CAAC,EAAU,EAAA;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;IACzB;AACD;;AC/CD;;AAEG;AAEH,MAAM,eAAe,GAAG,kBAAkB;AAC1C,MAAM,aAAa,GAAG,mBAAmB;AAQzC,MAAM,wBAAwB,GAAG,EAAE;AACnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAyB;AAE1D,SAAS,WAAW,CAAC,YAAoB,EAAA;IACvC,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAChD;AAEA,SAAS,oBAAoB,CAAC,OAAe,EAAA;AAC3C,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AAChC,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE;AAChD,QAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE;IACnE;AACA,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE;AAChD,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7C,QAAA,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE;IAClF;AACA,IAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE;AACnE;AAEM,SAAU,YAAY,CAAC,OAAe,EAAA;IAC1C,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;AAC7C,IAAA,IAAI,MAAM;AAAE,QAAA,OAAO,MAAM;AACzB,IAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC;AAC5C,IAAA,IAAI,iBAAiB,CAAC,IAAI,IAAI,wBAAwB;QAAE,iBAAiB,CAAC,KAAK,EAAE;AACjF,IAAA,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;AACtC,IAAA,OAAO,MAAM;AACf;AAEM,SAAU,mBAAmB,CAAC,QAAgB,EAAA;IAClD,MAAM,IAAI,GAAa,EAAE;AACzB,IAAA,IAAI,CAAyB;AAC7B,IAAA,eAAe,CAAC,SAAS,GAAG,CAAC;AAC7B,IAAA,OAAO,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE;QACpD,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACvB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAChD;AACA,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,iBAAiB,CAAC,KAAc,EAAA;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IAC3C,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACzC;AAEA;;;AAGG;AACG,SAAU,kBAAkB,CAAC,KAAc,EAAA;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;AAC3C,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE;AACtB,IAAA,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC1D,OAAO,aAAa,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD;AAEA;;;AAGG;AACG,SAAU,oBAAoB,CAAC,KAAc,EAAA;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,MAAM;AAC5C,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE;AACtB,IAAA,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,MAAM;AACzD,IAAA,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,aAAa;AAC1D;AAEM,SAAU,cAAc,CAAC,KAAa,EAAA;IAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC;AAC3C,IAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI;AAC/B;AAEM,SAAU,sBAAsB,CAAC,QAAgB,EAAE,KAAa,EAAA;AACpE,IAAA,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAA,MAAA,EAAS,QAAQ,CAAC,KAAK,CAAC,CAAA,MAAA,CAAQ,EAAE,GAAG,CAAC;IAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC3B,OAAO,CAAC,GAAG,KAAK,GAAG,EAAE;AACvB;AAEA,SAAS,QAAQ,CAAC,CAAS,EAAA;IACzB,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;AACjD;;ACjFA;;;AAGG;AACG,SAAU,cAAc,CAC5B,OAAe,EACf,GAAoB,EAAA;IAEpB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;AACpD,IAAA,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvD,QAAA,OAAO,IAAI;IACb;IACA,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/B,IAAA,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC;AAElC,IAAA,IAAI,QAA6C;AACjD,IAAA,IAAI,OAAO,IAAI,IAAI,EAAE;;AAEnB,QAAA,IAAI,OAAO,KAAK,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,eAAe,IAAI,IAAI,EAAE;AACjE,YAAA,QAAQ,GAAG,GAAG,CAAC,eAAe;QAChC;aAAO;YACL,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;AACxC,YAAA,QAAQ,GAAG,MAAM,EAAE,QAA+C;QACpE;IACF;AAAO,SAAA,IAAI,GAAG,CAAC,eAAe,IAAI,IAAI,EAAE;AACtC,QAAA,QAAQ,GAAG,GAAG,CAAC,eAAe;IAChC;IACA,IAAI,QAAQ,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI;AAEjC,IAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC;AACvC,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;IACtC;IACA,IAAI,OAAO,GAAY,OAAO;AAC9B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACxC,QAAA,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;QAC/D,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzD;AACA,IAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;AAClD;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAC,GAAY,EAAE,IAAY,EAAA;IACvD,IAAI,GAAG,IAAI,IAAI;AAAE,QAAA,OAAO,SAAS;AACjC,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACpD,IAAI,OAAO,GAAY,GAAG;AAC1B,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,SAAS;AACpE,QAAA,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC;IACtD;AACA,IAAA,OAAO,OAAO;AAChB;AAEA;;AAEG;AACG,SAAU,uBAAuB,CAAC,OAAe,EAAE,GAAoB,EAAA;IAC3E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC;IAC7C,IAAI,QAAQ,IAAI,IAAI;AAAE,QAAA,OAAO,KAAK;IAClC,MAAM,GAAG,GACP,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK;UACrB,QAAQ,CAAC;AACX,UAAG,QAAQ,CAAC,MAAkC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,GAAG,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC;AACrC;AAEA;;AAEG;AACG,SAAU,WAAW,CAAC,OAAe,EAAE,GAAoB,EAAA;IAC/D,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC;AAC7C,IAAA,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAClD,OAAO,QAAQ,EAAE,MAAM;IACzB;AACA,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAiC;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;IAEtB,IAAI,GAAG,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;QAChC,OAAO,GAAG,EAAE;IACd;AACA,IAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;QAC7B,OAAQ,GAAqB,EAAE;IACjC;AACA,IAAA,OAAO,GAAG;AACZ;AAEM,SAAU,YAAY,CAAC,OAAe,EAAE,GAAoB,EAAA;IAChE,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC;IAC7C,IAAI,QAAQ,IAAI,IAAI;AAAE,QAAA,OAAO,SAAS;IACtC,MAAM,GAAG,GACP,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK;UACrB,QAAQ,CAAC;AACX,UAAG,QAAQ,CAAC,MAAkC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,GAAG,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;AAChC,QAAA,OAAO,GAAsB;IAC/B;AACA,IAAA,OAAO,SAAS;AAClB;AAEA;;AAEG;SACa,WAAW,CAAC,OAAe,EAAE,GAAoB,EAAE,KAAc,EAAA;IAC/E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC;IAC7C,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE;AACpD,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAiC;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAGtB,IAAA,MAAM,QAAQ,GACZ,GAAG,IAAI,IAAI;QACX,QAAQ,CAAC,GAAG,CAAC;AACb,QAAA,OAAQ,GAAqC,CAAC,GAAG,KAAK;AACpD,UAAG;UACD,IAAI;IACV,IAAI,QAAQ,EAAE;AACZ,QAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IACrB;SAAO,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAChD,QAAA,GAA+B,CAAC,GAAG,CAAC,GAAG,KAAK;IAC/C;AACF;AAEA;;AAEG;SACa,wBAAwB,CACtC,QAAgB,EAChB,QAAkB,EAClB,GAAoB,EAAA;AAEpB,IAAA,MAAM,QAAQ,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACxE,OAAO,QAAQ,CAAC,MAAK;QACnB,IAAI,GAAG,GAAG,QAAQ;AAClB,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;AACrC,YAAA,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;YAC1C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,MAAA,EAAS,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;QAC7E;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,CAAC;AACJ;;ACzJA,SAAS,aAAa,CACpB,SAAiB,EACjB,QAAuB,EAAA;IAEvB,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC;IACxD,IAAI,QAAQ,IAAI,IAAI;AAAE,QAAA,OAAO,SAAS;AACtC,IAAA,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ;AACjC,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,MAAM;IACpC,MAAM,MAAM,GAAG,MAAiC;IAChD,OAAO,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B;AAEA,SAAS,iBAAiB,CAAC,MAAe,EAAE,UAAkB,EAAA;IAC5D,IAAI,MAAM,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI;AAC/B,IAAA,MAAM,CAAC,GAAI,MAAkC,CAAC,UAAU,CAAC;AACzD,IAAA,OAAO,OAAO,CAAC,KAAK,UAAU,GAAI,CAAqC,GAAG,IAAI;AAChF;SAEgB,sBAAsB,CACpC,GAAoB,EACpB,UAAmB,EACnB,QAAuB,EAAA;IAEvB,OAAO,CAAC,KAAc,KAAI;AACxB,QAAA,MAAM,OAAO,GAAG,KAAK,IAAI,UAAU;QACnC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;QACzD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC;QACxD,IAAI,MAAM,IAAI,IAAI;YAAE;AACpB,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI;eACxB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;AACxD,cAAE,CAAC,OAAO,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC;QACjD,IAAI,MAAM,IAAI,IAAI,IAAI,OAAQ,MAA2B,CAAC,IAAI,KAAK,UAAU,EAAE;YAC5E,MAA2B,CAAC,IAAI,CAC/B,MAAM,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,EACrC,MAAM,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAChC;QACH;aAAO;AACL,YAAA,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC;QACjC;AACF,IAAA,CAAC;AACH;AAEA,SAAS,QAAQ,CAAC,CAAkD,EAAA;IAClE,IAAI,CAAC,IAAI,IAAI;AAAE,QAAA,OAAO,EAAE;AACxB,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACnC;AAEA,SAAS,gBAAgB,CAAC,GAAoB,EAAE,QAAuB,EAAA;AACrE,IAAA,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE;AACpB,QAAA,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE;AAC3B,YAAA,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/E;IACF;AAAO,SAAA,IAAI,GAAG,CAAC,SAAS,EAAE;QACxB,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1G;AACF;AAEA,SAAS,UAAU,CAAC,GAAoB,EAAE,QAAuB,EAAA;AAC/D,IAAA,IAAI,GAAG,CAAC,OAAO,EAAE;QACf,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpG;AACF;AAEA,SAAS,eAAe,CACtB,QAAuB,EACvB,SAAiB,EACjB,MAAc,EACd,MAAiB,EAAA;IAEjB,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrD,MAAM,EAAE,GAAG,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC;AAChD,IAAA,IAAI,EAAE;QAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC;AACxC;AAEM,SAAU,mBAAmB,CACjC,WAAoB,EACpB,SAAiB,EACjB,QAAuB,EACvB,iBAA4D,EAAA;AAE5D,IAAA,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE;QAClC,OAAO,sBAAsB,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;IACjE;AACA,IAAA,MAAM,aAAa,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACpD,OAAO,aAAa,KAAK,MAAK,EAAE,CAAC,CAAC;AACpC;;MC1Ca,kBAAkB,CAAA;AACZ,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,iBAAiB,GAAG,iBAAiB,CAAC,WAAW,EAAE;AACnD,IAAA,eAAe,GAAG,eAAe,CAAC,WAAW,EAAE;IAEhE,MAAM,IAAI,CACR,WAAoB,EACpB,gBAAkC,EAClC,KAAkC,EAClC,OAA0B,EAAA;QAE1B,IAAI,QAAQ,GAAY,WAAW;AACnC,QAAA,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE;YACjC,QAAQ,GAAG,qBAAqB,CAAC,WAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC;QAC1E;AACA,QAAA,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC;AAElD,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,CAAA,2BAAA,EAA8B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;QACvE;AACA,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI;QACxB,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,iBAAiB,EAAE;QAC7D,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAC9D,MAAM,IAAI,KAAK,CAAC,CAAA,UAAA,EAAa,IAAI,CAAC,EAAE,CAAA,wBAAA,CAA0B,CAAC;QACjE;AAEA,QAAA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACtE,IAAI,CAAC,aAAa,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,SAAS,CAAA,oBAAA,CAAsB,CAAC;QACrE;QAEA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAClC,CAAC,CAAC,KACA,OAAO,CAAC,KAAK,QAAQ,IAAK,CAAwB,CAAC,KAAK,KAAK,MAAM,CACtE;QACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;QAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC;AACpE,QAAA,MAAM,YAAY,GAAG,gBAAgB,CAAC,eAAe,CAAC,aAA8B,EAAE;AACpF,YAAA,QAAQ,EAAE,aAAa;AACxB,SAAA,CAAC;QAEF,MAAM,aAAa,GAA4B,EAAE;AACjD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;YAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;AACzC,YAAA,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC;YACnC,IAAI,WAAW,EAAE;gBACf,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,WAA4B,CAAC;gBACnE,IAAI,GAAG,IAAI,IAAI;AAAE,oBAAA,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG;YAC7C;QACF;AACA,QAAA,MAAM,GAAG,GAAoB;YAC3B,QAAQ;AACR,YAAA,cAAc,EAAE,IAAI,CAAC,EAAE,IAAI,SAAS;AACpC,YAAA,eAAe,EAAE,aAAa;SAC/B;AACD,QAAA,MAAM,MAAM,GAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE;QAC/D,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE;YAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC;QAEzE,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC;AAEvD,QAAA,IAAI,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;AACtE,QAAA,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAC1C,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC,CAC3D;AACD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC;QAE7F,MAAM,SAAS,GAAG,MAAW;YAC3B,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE;AAAE,gBAAA,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACnE,YAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;AACjD,YAAA,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC3D,IAAI,GAAG,KAAK,CAAC,CAAC;AAAE,gBAAA,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;YAC5C,YAAY,CAAC,OAAO,EAAE;AACxB,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,OAAO,GAAG,SAAS;AAE1B,QAAA,MAAM,YAAY,GAAG,CAAC,OAAgB,KAAU;AAC9C,YAAA,MAAM,CAAC,GAAG,yBAAyB,CAAC,OAAO,CAAC;AAC5C,YAAA,IAAI,CAAC,CAAC,OAAO,EAAE;AACb,gBAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;AACjD,gBAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC;AACzD,gBAAA,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;gBACpE,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAC1C,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC,CAC7D;YACH;AACF,QAAA,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE;IAC3D;;IAGQ,MAAM,eAAe,CAC3B,YAA6C,EAAA;AAE7C,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF;AAEQ,IAAA,2BAA2B,CAAC,YAA2C,EAAA;QAC7E,MAAM,SAAS,GAAG;aACf,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,IAAI,IAAI;AAC3C,aAAA,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5C,QAAA,OAAO,SAAS,CAAC,MAAM,KAAK;cACxB,IAAI,CAAC;AACP,cAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3D;;AAGQ,IAAA,SAAS,CACf,YAAmC,EACnC,IAAsB,EACtB,GAAoB,EACpB,UAAwC,EAAA;QAExC,MAAM,UAAU,GAAgB,EAAE;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE;AAChC,QAAA,MAAM,IAAI,GAAG,YAAY,CAAC,QAAmC;AAC7D,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACjD,YAAA,IAAI,GAAG,KAAK,OAAO,EAAE;gBACnB;YACF;AACA,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC;AAC9C,gBAAA,IAAI,UAAU,KAAK,aAAa,EAAE;oBAChC,MAAM,IAAI,KAAK,CACb,CAAA,eAAA,EAAkB,MAAM,CAAC,GAAG,CAAC,CAAA,iEAAA,CAAmE;AAC9F,wBAAA,CAAA,uEAAA,CAAyE,CAC5E;gBACH;AACA,gBAAA,IAAI,UAAU,KAAK,SAAS,EAAE;AAC5B,oBAAA,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC;oBACrC,IAAI,OAAO,EAAE;AACX,wBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;wBAC1B,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAC1C,4BAAA,UAAU,CAAC,IAAI,CACb,MAAM,CACJ,MAAK;gCACH,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;gCACzC,IAAI,OAAO,KAAK,SAAS;oCAAE;AAC3B,gCAAA,IAAI,YAAY,CAAC,QAAQ,EAAE;AACzB,oCAAA,YAAY,CAAC,QAAQ,CAAC,GAAY,EAAE,OAAgB,CAAC;AACrD,oCAAA,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE;gCAChD;4BACF,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B,CACF;AACD,4BAAA,UAAU,CAAC,IAAI,CACb,MAAM,CACJ,MAAK;AACH,gCAAA,MAAM,OAAO,GAAG,QAAQ,EAAE;AAC1B,gCAAA,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC;4BACpC,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B,CACF;wBACH;oBACF;oBACA;gBACF;YACF;YACA,MAAM,GAAG,GAAG,KAAe;YAC3B,IACE,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,gBAAA,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAC3C;AACA,gBAAA,UAAU,CAAC,IAAI,CACb,MAAM,CACJ,MAAK;oBACH,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,GAAG,OAAO,CAAC;oBAC/C,MAAM,KAAK,GACT,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,QAAQ;0BAChC,QAA4B;0BAC5B,QAAoB;AAC3B,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;oBAC/D,IAAI,YAAY,CAAC,QAAQ;AAAE,wBAAA,YAAY,CAAC,QAAQ,CAAC,GAAY,EAAE,QAAiB,CAAC;;AAC5E,wBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ;gBAC3B,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B,CACF;gBACD;YACF;YAEA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;YACnD,IAAI,YAAY,CAAC,QAAQ;AAAE,gBAAA,YAAY,CAAC,QAAQ,CAAC,GAAY,EAAE,QAAiB,CAAC;;AAC5E,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ;QAC3B;AACA,QAAA,OAAO,UAAU;IACnB;;AAGQ,IAAA,iBAAiB,CACvB,IAAsB,EACtB,GAAoB,EACpB,aAAsC,EACtC,UAAuC,EAAA;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE;AAC/C,YAAA,MAAM,KAAK,GAAG,UAAU,EAAE;YAC1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;AAC9C,gBAAA,IAAI,GAAG,IAAI,IAAI,IAAI,OAAQ,GAA+B,CAAC,UAAU,CAAC,KAAK,UAAU,EAAE;AACnF,oBAAA,GAA+B,CAAC,UAAU,CAA0B,CAAC,KAAK,CAAC;gBAC/E;YACF;AACA,YAAA,aAAa,CAAC,OAAO,CAAC,GAAG,UAAU;YACnC;QACF;QACA,IAAI,KAAK,GAAY,QAAQ;AAC7B,QAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAChC,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;AACjE,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC;AAE5C,gBAAA,IAAI,SAAS,IAAI,IAAI,EAAE;oBACrB,KAAK,GAAG,SAAS,EAAE;AACnB,oBAAA,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS;gBACpC;qBAAO;AACL,oBAAA,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;gBACnC;YACF;QACF;QACA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;AAC9C,YAAA,IAAI,GAAG,IAAI,IAAI,IAAI,OAAQ,GAA+B,CAAC,UAAU,CAAC,KAAK,UAAU,EAAE;AACnF,gBAAA,GAA+B,CAAC,UAAU,CAA0B,CAAC,KAAK,CAAC;YAC/E;QACF;IACF;;AAGQ,IAAA,oBAAoB,CAC1B,IAAsB,EACtB,GAAoB,EACpB,aAAsC,EACtC,UAAuC,EAAA;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACvC,MAAM,OAAO,GACX,QAAQ,IAAI,IAAI,IAAI,OAAO,QAAQ,KAAK;cACpC,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE;cAChD,EAAE;AACR,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,EAAE;QACX;AACA,QAAA,MAAM,SAAS,GAAG,MAAM,CACtB,MAAK;AACH,YAAA,MAAM,KAAK,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,UAAU,EAAE;YAChE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;AAC9C,gBAAA,IAAI,GAAG,IAAI,IAAI,IAAI,OAAQ,GAA+B,CAAC,UAAU,CAAC,KAAK,UAAU,EAAE;AACnF,oBAAA,GAA+B,CAAC,UAAU,CAA0B,CAAC,KAAK,CAAC;gBAC/E;YACF;AACF,QAAA,CAAC,sDACC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAC1B;QACD,OAAO,CAAC,SAAS,CAAC;IACpB;AAEA;;;AAGG;AACK,IAAA,wBAAwB,CAAC,QAAgB,EAAE,GAAoB,EAAE,KAAc,EAAA;QACrF,MAAM,KAAK,GAAa,EAAE;QAC1B,IAAI,CAAC,GAAG,QAAQ;AAChB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,4BAA4B,EAAE,CAAC,EAAE,EAAE;YACxE,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;AAC7B,YAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACb;YACF;AACA,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;AAClC,YAAA,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;gBACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B;YACF;AACA,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;YAC1C,MAAM,GAAG,GAAG;kBACR,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI;AAC5B,sBAAE,WAAW,CAAC,GAAG,EAAE,GAAG;AACtB,sBAAE,cAAc,CAAC,KAAK,EAAE,GAAG;kBAC3B,IAAI;AACR,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAC1C,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QACtB;AACA,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IACvB;;AAGQ,IAAA,OAAgB,4BAA4B,GAAG,GAAG;IAClD,mBAAmB,CAAC,QAAgB,EAAE,GAAoB,EAAA;QAChE,MAAM,KAAK,GAAa,EAAE;QAC1B,IAAI,CAAC,GAAG,QAAQ;AAChB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,4BAA4B,EAAE,CAAC,EAAE,EAAE;YACxE,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;AAC7B,YAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACb;YACF;AACA,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;AAClC,YAAA,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;gBACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B;YACF;AACA,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;AAC1C,YAAA,MAAM,GAAG,GAAG,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI;AAC9C,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAC1C,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QACtB;AACA,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IACvB;AAEA;;;;;AAKG;AACK,IAAA,iBAAiB,CACvB,KAAc,EACd,GAAoB,EACpB,OAA0C,EAAA;AAE1C,QAAA,MAAM,kBAAkB,GAAG,OAAO,EAAE,kBAAkB,IAAI,KAAK;AAC/D,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC;AAC9C,YAAA,IAAI,UAAU,KAAK,aAAa,EAAE;gBAChC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,GAAG,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,KAAK;gBACxE,MAAM,IAAI,KAAK,CACb,CAAA,6EAAA,CAA+E;oBAC7E,CAAA,6EAAA,EAAgF,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA,CAAE,CAC5G;YACH;AACA,YAAA,IAAI,UAAU,KAAK,SAAS,EAAE;AAC5B,gBAAA,IAAI,kBAAkB;AAAE,oBAAA,OAAO,KAAK;AACpC,gBAAA,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC;AACrC,gBAAA,OAAO,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,KAAK;YACpD;AACA,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,OAAO,GAAG,KAAK;YACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAClC,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;gBACpD,IAAI,CAAC,KAAK,IAAI;oBAAE,OAAO,GAAG,IAAI;AAC9B,gBAAA,OAAO,CAAC;AACV,YAAA,CAAC,CAAC;YACF,OAAO,OAAO,GAAG,QAAQ,GAAG,KAAK;QACnC;QACA,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC9C,MAAM,GAAG,GAAG,KAAgC;AAC5C,YAAA,MAAM,uBAAuB,GAAG,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;YAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;YAChE,MAAM,aAAa,GAAwB,EAAE;YAC7C,IAAI,OAAO,GAAG,KAAK;YACnB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE;AAC5B,gBAAA,MAAM,YAAY,GAChB,uBAAuB,IAAI,CAAC,KAAK,QAAQ,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,OAAO;AACpF,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC;gBAC7D,IAAI,QAAQ,KAAK,CAAC;oBAAE,OAAO,GAAG,IAAI;gBAClC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACnC;AACA,YAAA,IAAI,CAAC,OAAO;AAAE,gBAAA,OAAO,KAAK;YAC1B,MAAM,GAAG,GAA4B,EAAE;AACvC,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,aAAa;AAAE,gBAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9C,YAAA,OAAO,GAAG;QACZ;AACA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,WAAW,CACjB,YAAmC,EACnC,IAAsB,EACtB,QAAuB,EACvB,cAAyD,EAAA;QAEzD,MAAM,IAAI,GAAmB,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE;AAClC,QAAA,MAAM,IAAI,GAAG,YAAY,CAAC,QAAmC;AAC7D,QAAA,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC9D,YAAA,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC;AACrF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC/B,IACE,OAAO,IAAI,IAAI;AACf,gBAAA,OACE,OACD,CAAC,SAAS,KAAK,UAAU,EAC1B;AACA,gBAAA,MAAM,GAAG,GACP,OACD,CAAC,SAAS,CAAC,CAAC,CAAU,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AACvC,gBAAA,IAAI,CAAC,IAAI,CAAC,GAA8B,CAAC;YAC3C;QACF;AACA,QAAA,OAAO,IAAI;IACb;uGAlZW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA;;2FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACpClC;AACA,SAAS,cAAc,CAAC,QAAsC,EAAA;AAC5D,IAAA,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC;AACvC,IAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;AAC/B,IAAA,OAAO;SACJ,GAAG,CAAC,CAAC,CAAC,KACL,OAAO,CAAC,KAAK;AACX,UAAE;AACF,UAAE,CAAA,EAAI,CAAoB,CAAC,EAAE,CAAA,CAAA,EAAK,CAAwB,CAAC,KAAK,IAAI,EAAE,CAAA,CAAE;SAE3E,IAAI,CAAC,GAAG,CAAC;AACd;MAMa,cAAc,CAAA;AACR,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACnC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGvC,IAAA,WAAW,GAAG,KAAK,CAAoB,IAAI,uDAAC;;AAE5C,IAAA,cAAc,GAAG,KAAK,CAA2C,EAAE,0DAAC;;AAEpE,IAAA,aAAa,GAAG,KAAK,CAAuB,IAAI,yDAAC;;AAEjD,IAAA,gBAAgB,GAAG,KAAK,CAAiC,IAAI,4DAAC;;AAE9D,IAAA,KAAK,GAAG,KAAK,CAAsB,SAAS,iDAAC;IAE9C,UAAU,GAA2B,IAAI;IACzC,eAAe,GAAkB,IAAI;IACrC,iBAAiB,GAAkB,IAAI;IACvC,cAAc,GAAG,CAAC;;IAElB,WAAW,GAAY,IAAI;IAC3B,cAAc,GAA4B,IAAI;AAEtD,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;AAC5C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAEzC,YAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AAChB,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;gBAC1B,IAAI,CAAC,KAAK,EAAE;gBACZ;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI;kBAClC,qBAAqB,CAAC,IAAI,EAAE,SAAS,IAAI,SAAS;kBAClD,IAAI;AAER,YAAA,IAAI,IAAsB;AAC1B,YAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;AAChE,gBAAA,IAAI,GAAG,IAAI,CAAC,cAAc;YAC5B;iBAAO;AACL,gBAAA,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC;AAClD,gBAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;oBACnB;gBACF;AACA,gBAAA,IAAI,CAAC,WAAW,GAAG,QAAQ;AAC3B,gBAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI;AACjC,gBAAA,IAAI,GAAG,MAAM,CAAC,IAAI;YACpB;YACA,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AACjD,YAAA,MAAM,SAAS,GACb,IAAI,CAAC,UAAU,IAAI,IAAI;AACvB,gBAAA,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,SAAS;AACvC,gBAAA,IAAI,CAAC,iBAAiB,KAAK,WAAW;AAExC,YAAA,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;AAChC,gBAAA,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;gBACtC;YACF;YAEA,IAAI,CAAC,KAAK,EAAE;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,SAAS;AAClD,YAAA,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC,cAAc;AACxC,YAAA,IAAI,CAAC;iBACF,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE;AACjD,gBAAA,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,cAAc,GAAG,SAAS;gBACnF,QAAQ;gBAER,gBAAgB,EAAE,SAAS,IAAI,SAAS;aACzC;AACA,iBAAA,IAAI,CAAC,CAAC,MAAM,KAAI;AACf,gBAAA,IAAI,UAAU,KAAK,IAAI,CAAC,cAAc;oBAAE;AACxC,gBAAA,IAAI,CAAC,UAAU,GAAG,MAAM;AACxB,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS;AACrC,gBAAA,IAAI,CAAC,iBAAiB,GAAG,WAAW;AACtC,YAAA,CAAC;AACA,iBAAA,KAAK,CAAC,CAAC,GAAY,KAAI;AACtB,gBAAA,IAAI,UAAU,KAAK,IAAI,CAAC,cAAc;oBAAE;AACxC,gBAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC;AAC1C,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/C;IAEQ,KAAK,GAAA;QACX,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC/B;IACF;uGAlGW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAJ1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;AC3BD;;AAEG;;ACFH;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -253,6 +253,7 @@ declare class RouteLoader {
|
|
|
253
253
|
declare const ServiceEntrySchema: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
254
254
|
id: z.ZodString;
|
|
255
255
|
scope: z.ZodLiteral<"self">;
|
|
256
|
+
alias: z.ZodOptional<z.ZodString>;
|
|
256
257
|
}, z.core.$strip>]>;
|
|
257
258
|
/**
|
|
258
259
|
* Output handler: empty (use directive-provided handler) or reference-based (call method on ref).
|
|
@@ -288,9 +289,11 @@ declare const BlockDescriptionSchema: z.ZodObject<{
|
|
|
288
289
|
services: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
289
290
|
id: z.ZodString;
|
|
290
291
|
scope: z.ZodLiteral<"self">;
|
|
292
|
+
alias: z.ZodOptional<z.ZodString>;
|
|
291
293
|
}, z.core.$strip>]>, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
292
294
|
id: z.ZodString;
|
|
293
295
|
scope: z.ZodLiteral<"self">;
|
|
296
|
+
alias: z.ZodOptional<z.ZodString>;
|
|
294
297
|
}, z.core.$strip>]>>]>>>;
|
|
295
298
|
inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
296
299
|
outputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodObject<{
|
|
@@ -316,6 +319,7 @@ declare const BlockDescriptionSchema: z.ZodObject<{
|
|
|
316
319
|
}, z.core.$strip>]>>>;
|
|
317
320
|
}, z.core.$strip>;
|
|
318
321
|
type BlockDescription = z.infer<typeof BlockDescriptionSchema>;
|
|
322
|
+
type BlockInput = z.input<typeof BlockDescriptionSchema>;
|
|
319
323
|
type ServiceEntry = z.infer<typeof ServiceEntrySchema>;
|
|
320
324
|
type OutputReference = z.infer<typeof OutputReferenceSchema>;
|
|
321
325
|
/** Normalize services to array. */
|
|
@@ -439,10 +443,20 @@ declare function resolveRefPath(refPath: string, ctx: ResolverContext): {
|
|
|
439
443
|
target: unknown;
|
|
440
444
|
path: string[];
|
|
441
445
|
} | null;
|
|
446
|
+
/**
|
|
447
|
+
* Get a value from an object by dot-notation path (e.g. "name.firstName" -> obj.name?.firstName).
|
|
448
|
+
* Returns undefined if any segment is null/undefined or not an object.
|
|
449
|
+
*/
|
|
450
|
+
declare function getValueByPath(obj: unknown, path: string): unknown;
|
|
451
|
+
/**
|
|
452
|
+
* Return true if the value at ref path is an Angular signal (so reading it in an effect would be reactive).
|
|
453
|
+
*/
|
|
454
|
+
declare function refPathResolvesToSignal(refPath: string, ctx: ResolverContext): boolean;
|
|
442
455
|
/**
|
|
443
456
|
* Get value at ref path (read-only). Returns undefined if not found.
|
|
444
457
|
*/
|
|
445
458
|
declare function getRefValue(refPath: string, ctx: ResolverContext): unknown;
|
|
459
|
+
declare function getRefSignal(refPath: string, ctx: ResolverContext): Signal<unknown> | undefined;
|
|
446
460
|
/**
|
|
447
461
|
* Set value at ref path (write). No-op if target is not writable.
|
|
448
462
|
*/
|
|
@@ -470,12 +484,21 @@ declare class BlockLoaderService {
|
|
|
470
484
|
private readonly injector;
|
|
471
485
|
private readonly componentRegistry;
|
|
472
486
|
private readonly serviceRegistry;
|
|
473
|
-
load(description: unknown, viewContainerRef: ViewContainerRef, options?: BlockLoadOptions): Promise<BlockLoadResult>;
|
|
487
|
+
load(description: unknown, viewContainerRef: ViewContainerRef, model: Signal<unknown | undefined>, options?: BlockLoadOptions): Promise<BlockLoadResult>;
|
|
474
488
|
/** Resolve all service types in parallel (single batch for load). */
|
|
475
489
|
private getServiceTypes;
|
|
476
490
|
private buildChildInjectorFromTypes;
|
|
477
491
|
/** Set inputs and wire template/two-way effects. Single pass over inputs for large configs. */
|
|
478
492
|
private setInputs;
|
|
493
|
+
/** Resolve model from desc (interpolate ref if string) and set on services and blockInstance. */
|
|
494
|
+
private applyInitialModel;
|
|
495
|
+
/** If model is a ref string, return an effect that keeps setModel/blockInstance in sync with the ref. */
|
|
496
|
+
private applyModelReactivity;
|
|
497
|
+
/**
|
|
498
|
+
* Replace each {{ refPath }} with a value: resolve as ref first (e.g. Person.instance.AuthState.firstName),
|
|
499
|
+
* else as model path (e.g. firstName, instance.model.firstName). Allows mixing both in one template.
|
|
500
|
+
*/
|
|
501
|
+
private interpolateTemplateMixed;
|
|
479
502
|
/** Replace all {{ refPath }} with resolved values. Uses parts array + join to avoid N string concats. */
|
|
480
503
|
private static readonly INTERPOLATE_MAX_PLACEHOLDERS;
|
|
481
504
|
private interpolateTemplate;
|
|
@@ -496,13 +519,49 @@ declare class BlockDirective {
|
|
|
496
519
|
private readonly loader;
|
|
497
520
|
private readonly destroyRef;
|
|
498
521
|
/** Full description, or { id } / { blockId, blockDefinition? } to reuse/override from blockDefinitions. */
|
|
499
|
-
readonly description: _angular_core.InputSignal<
|
|
522
|
+
readonly description: _angular_core.InputSignal<{
|
|
523
|
+
component: string;
|
|
524
|
+
id?: string | undefined;
|
|
525
|
+
services?: string | {
|
|
526
|
+
id: string;
|
|
527
|
+
scope: "self";
|
|
528
|
+
alias?: string | undefined;
|
|
529
|
+
} | (string | {
|
|
530
|
+
id: string;
|
|
531
|
+
scope: "self";
|
|
532
|
+
alias?: string | undefined;
|
|
533
|
+
})[] | undefined;
|
|
534
|
+
inputs?: Record<string, unknown> | undefined;
|
|
535
|
+
outputs?: Record<string, Record<string, unknown> | {
|
|
536
|
+
type: "reference";
|
|
537
|
+
reference: string;
|
|
538
|
+
method: string;
|
|
539
|
+
params?: Record<string, unknown> | unknown[] | undefined;
|
|
540
|
+
then?: {
|
|
541
|
+
reference: string;
|
|
542
|
+
method: string;
|
|
543
|
+
params?: Record<string, unknown> | unknown[] | undefined;
|
|
544
|
+
}[] | undefined;
|
|
545
|
+
onSuccess?: {
|
|
546
|
+
reference: string;
|
|
547
|
+
method: string;
|
|
548
|
+
params?: Record<string, unknown> | unknown[] | undefined;
|
|
549
|
+
} | undefined;
|
|
550
|
+
onError?: {
|
|
551
|
+
reference: string;
|
|
552
|
+
method: string;
|
|
553
|
+
params?: Record<string, unknown> | unknown[] | undefined;
|
|
554
|
+
} | undefined;
|
|
555
|
+
}> | undefined;
|
|
556
|
+
} | null>;
|
|
500
557
|
/** Handlers for component outputs; keys match descriptor.outputs. */
|
|
501
558
|
readonly outputHandlers: _angular_core.InputSignal<Record<string, (value: unknown) => void>>;
|
|
502
559
|
/** Registry for block instances by id; pass from root so nested blocks share it. */
|
|
503
560
|
readonly blockRegistry: _angular_core.InputSignal<BlockRegistry | null>;
|
|
504
561
|
/** Map id → full description; used when description is a block reference (id/blockId). */
|
|
505
562
|
readonly blockDefinitions: _angular_core.InputSignal<Record<string, unknown> | null>;
|
|
563
|
+
/** Model for the block. */
|
|
564
|
+
readonly model: _angular_core.InputSignal<unknown>;
|
|
506
565
|
private loadResult;
|
|
507
566
|
private loadedComponent;
|
|
508
567
|
private loadedServicesKey;
|
|
@@ -513,8 +572,8 @@ declare class BlockDirective {
|
|
|
513
572
|
constructor();
|
|
514
573
|
private clear;
|
|
515
574
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BlockDirective, never>;
|
|
516
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BlockDirective, "[block]", never, { "description": { "alias": "description"; "required": false; "isSignal": true; }; "outputHandlers": { "alias": "outputHandlers"; "required": false; "isSignal": true; }; "blockRegistry": { "alias": "blockRegistry"; "required": false; "isSignal": true; }; "blockDefinitions": { "alias": "blockDefinitions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
575
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BlockDirective, "[block]", never, { "description": { "alias": "description"; "required": false; "isSignal": true; }; "outputHandlers": { "alias": "outputHandlers"; "required": false; "isSignal": true; }; "blockRegistry": { "alias": "blockRegistry"; "required": false; "isSignal": true; }; "blockDefinitions": { "alias": "blockDefinitions"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
517
576
|
}
|
|
518
577
|
|
|
519
|
-
export { BlockDefinitionsRegistry, BlockDescriptionSchema, BlockDirective, BlockLoaderService, BlockRegistryImpl, ComponentRegistry, GuardRegistry, RegistryMetadataStore, RouteLoader, ServiceRegistry, buildComputedForTemplate, classifyTwoWayString, createOutputHandler, deepMergeBlockDefinition, extractReadonlyRefs, getRefPathFromReadonly, getRefValue, isBlockReference, isInvalidTwoWayMix, isOutputReference, isTwoWayRefString, normalizeServices, parseRefPath, parseTwoWayRef, resolveBlockReference, resolveOutputReference, resolveRefPath, safeParseBlockDescription, setRefValue };
|
|
520
|
-
export type { AllRegistryMetadata, BlockDescription, BlockInstanceHandle, BlockLoadOptions, BlockLoadResult, BlockReference, BlockRegistry, GuardLoader, GuardOrLoader, GuardOrType, OutputReference, ParsedRefPath, RegistryEntryType, RegistryMetadataRecord, ResolverContext, RouteConfig, ServiceEntry };
|
|
578
|
+
export { BlockDefinitionsRegistry, BlockDescriptionSchema, BlockDirective, BlockLoaderService, BlockRegistryImpl, ComponentRegistry, GuardRegistry, RegistryMetadataStore, RouteLoader, ServiceRegistry, buildComputedForTemplate, classifyTwoWayString, createOutputHandler, deepMergeBlockDefinition, extractReadonlyRefs, getRefPathFromReadonly, getRefSignal, getRefValue, getValueByPath, isBlockReference, isInvalidTwoWayMix, isOutputReference, isTwoWayRefString, normalizeServices, parseRefPath, parseTwoWayRef, refPathResolvesToSignal, resolveBlockReference, resolveOutputReference, resolveRefPath, safeParseBlockDescription, setRefValue };
|
|
579
|
+
export type { AllRegistryMetadata, BlockDescription, BlockInput, BlockInstanceHandle, BlockLoadOptions, BlockLoadResult, BlockReference, BlockRegistry, GuardLoader, GuardOrLoader, GuardOrType, OutputReference, ParsedRefPath, RegistryEntryType, RegistryMetadataRecord, ResolverContext, RouteConfig, ServiceEntry };
|