@itwin/core-backend 5.2.0 → 5.3.0-dev.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/lib/cjs/CloudSqlite.d.ts +10 -9
  3. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  4. package/lib/cjs/CloudSqlite.js.map +1 -1
  5. package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
  6. package/lib/cjs/GeographicCRSServices.js +2 -0
  7. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  8. package/lib/cjs/IModelHost.d.ts +1 -2
  9. package/lib/cjs/IModelHost.d.ts.map +1 -1
  10. package/lib/cjs/IModelHost.js +9 -17
  11. package/lib/cjs/IModelHost.js.map +1 -1
  12. package/lib/cjs/TileStorage.d.ts +1 -1
  13. package/lib/cjs/TileStorage.d.ts.map +1 -1
  14. package/lib/cjs/TileStorage.js.map +1 -1
  15. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +7 -1
  16. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  17. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +25 -0
  18. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  19. package/lib/cjs/annotations/TextAnnotationElement.d.ts +20 -1
  20. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  21. package/lib/cjs/annotations/TextAnnotationElement.js +84 -2
  22. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  23. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  24. package/lib/cjs/internal/annotations/fields.js +1 -0
  25. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  26. package/lib/esm/CloudSqlite.d.ts +10 -9
  27. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  28. package/lib/esm/CloudSqlite.js.map +1 -1
  29. package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
  30. package/lib/esm/GeographicCRSServices.js +2 -0
  31. package/lib/esm/GeographicCRSServices.js.map +1 -1
  32. package/lib/esm/IModelHost.d.ts +1 -2
  33. package/lib/esm/IModelHost.d.ts.map +1 -1
  34. package/lib/esm/IModelHost.js +10 -18
  35. package/lib/esm/IModelHost.js.map +1 -1
  36. package/lib/esm/TileStorage.d.ts +1 -1
  37. package/lib/esm/TileStorage.d.ts.map +1 -1
  38. package/lib/esm/TileStorage.js.map +1 -1
  39. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +7 -1
  40. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  41. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +25 -0
  42. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  43. package/lib/esm/annotations/TextAnnotationElement.d.ts +20 -1
  44. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  45. package/lib/esm/annotations/TextAnnotationElement.js +86 -5
  46. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  47. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  48. package/lib/esm/internal/annotations/fields.js +1 -0
  49. package/lib/esm/internal/annotations/fields.js.map +1 -1
  50. package/lib/esm/test/IModelHost.test.js +17 -11
  51. package/lib/esm/test/IModelHost.test.js.map +1 -1
  52. package/lib/esm/test/annotations/Fields.test.js +146 -51
  53. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  54. package/lib/esm/test/annotations/TextAnnotation.test.js +227 -2
  55. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  56. package/lib/esm/test/imodel/IModel.test.js +18 -0
  57. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  58. package/package.json +17 -19
@@ -13,7 +13,7 @@ import { Point3d, YawPitchRollAngles } from "@itwin/core-geometry";
13
13
  import { Schema, Schemas } from "../../Schema";
14
14
  import { ClassRegistry } from "../../ClassRegistry";
15
15
  import { PhysicalElement } from "../../Element";
16
- import { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, TextAnnotation3d } from "../../core-backend";
16
+ import { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, IModelElementCloneContext, TextAnnotation3d } from "../../core-backend";
17
17
  import { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault } from "../../annotations/ElementDrivesTextAnnotation";
18
18
  function isIntlSupported() {
19
19
  // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile
@@ -21,6 +21,55 @@ function isIntlSupported() {
21
21
  // solution.
22
22
  return !ProcessDetector.isMobileAppBackend;
23
23
  }
24
+ function createTestElement(imodel, model, category, overrides, aspectProp = 999) {
25
+ const props = {
26
+ classFullName: "Fields:TestElement",
27
+ model,
28
+ category,
29
+ code: Code.createEmpty(),
30
+ intProp: 100,
31
+ point: { x: 1, y: 2, z: 3 },
32
+ strings: ["a", "b", `"name": "c"`],
33
+ datetime: new Date("2025-08-28T13:45:30.123Z"),
34
+ intEnum: 1,
35
+ outerStruct: {
36
+ innerStruct: { bool: false, doubles: [1, 2, 3] },
37
+ innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],
38
+ },
39
+ outerStructs: [{
40
+ innerStruct: { bool: true, doubles: [10, 9] },
41
+ innerStructs: [{ bool: false, doubles: [5] }],
42
+ }],
43
+ placement: {
44
+ origin: new Point3d(1, 2, 0),
45
+ angles: new YawPitchRollAngles(),
46
+ },
47
+ jsonProperties: {
48
+ stringProp: "abc",
49
+ ints: [10, 11, 12, 13],
50
+ bool: true,
51
+ zoo: {
52
+ address: {
53
+ zipcode: 12345,
54
+ },
55
+ birds: [
56
+ { name: "duck", sound: "quack" },
57
+ { name: "hawk", sound: "scree!" },
58
+ ],
59
+ },
60
+ },
61
+ ...overrides,
62
+ };
63
+ const id = imodel.elements.insertElement(props);
64
+ const aspectProps = {
65
+ classFullName: TestAspect.classFullName,
66
+ aspectProp,
67
+ element: new ElementOwnsUniqueAspect(id),
68
+ };
69
+ imodel.elements.insertAspect(aspectProps);
70
+ imodel.saveChanges();
71
+ return id;
72
+ }
24
73
  describe("updateField", () => {
25
74
  const mockElementId = "0x1";
26
75
  const mockPath = {
@@ -178,53 +227,8 @@ describe("Field evaluation", () => {
178
227
  after(() => {
179
228
  imodel.close();
180
229
  });
181
- function insertTestElement() {
182
- const props = {
183
- classFullName: "Fields:TestElement",
184
- model,
185
- category,
186
- code: Code.createEmpty(),
187
- intProp: 100,
188
- point: { x: 1, y: 2, z: 3 },
189
- strings: ["a", "b", `"name": "c"`],
190
- datetime: new Date("2025-08-28T13:45:30.123Z"),
191
- intEnum: 1,
192
- outerStruct: {
193
- innerStruct: { bool: false, doubles: [1, 2, 3] },
194
- innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],
195
- },
196
- outerStructs: [{
197
- innerStruct: { bool: true, doubles: [10, 9] },
198
- innerStructs: [{ bool: false, doubles: [5] }],
199
- }],
200
- placement: {
201
- origin: new Point3d(1, 2, 0),
202
- angles: new YawPitchRollAngles(),
203
- },
204
- jsonProperties: {
205
- stringProp: "abc",
206
- ints: [10, 11, 12, 13],
207
- bool: true,
208
- zoo: {
209
- address: {
210
- zipcode: 12345,
211
- },
212
- birds: [
213
- { name: "duck", sound: "quack" },
214
- { name: "hawk", sound: "scree!" },
215
- ],
216
- },
217
- },
218
- };
219
- const id = imodel.elements.insertElement(props);
220
- const aspectProps = {
221
- classFullName: TestAspect.classFullName,
222
- aspectProp: 999,
223
- element: new ElementOwnsUniqueAspect(id),
224
- };
225
- imodel.elements.insertAspect(aspectProps);
226
- imodel.saveChanges();
227
- return id;
230
+ function insertTestElement(overrides, aspectProp) {
231
+ return createTestElement(imodel, model, category, overrides, aspectProp);
228
232
  }
229
233
  function evaluateField(propertyPath, propertyHost, deletedDependency = false) {
230
234
  if (typeof propertyHost === "string") {
@@ -406,7 +410,7 @@ describe("Field evaluation", () => {
406
410
  expect(fieldRun2.cachedContent).to.equal("a");
407
411
  });
408
412
  });
409
- function insertAnnotationElement(textBlock) {
413
+ function createAnnotationElement(textBlock) {
410
414
  const elem = TextAnnotation3d.fromJSON({
411
415
  model,
412
416
  category,
@@ -422,6 +426,10 @@ describe("Field evaluation", () => {
422
426
  const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });
423
427
  elem.setAnnotation(annotation);
424
428
  }
429
+ return elem;
430
+ }
431
+ function insertAnnotationElement(textBlock) {
432
+ const elem = createAnnotationElement(textBlock);
425
433
  return elem.insert();
426
434
  }
427
435
  describe("ElementDrivesTextAnnotation", () => {
@@ -543,8 +551,9 @@ describe("Field evaluation", () => {
543
551
  expectNumRelationships(1, targetId);
544
552
  });
545
553
  });
546
- function expectText(expected, elemId) {
547
- const elem = imodel.elements.getElement(elemId);
554
+ function expectText(expected, elemId, db) {
555
+ db = db ?? imodel;
556
+ const elem = db.elements.getElement(elemId);
548
557
  const anno = elem.getAnnotation();
549
558
  const actual = anno.textBlock.stringify();
550
559
  expect(actual).to.equal(expected);
@@ -637,6 +646,92 @@ describe("Field evaluation", () => {
637
646
  imodel.saveChanges();
638
647
  expectText("12.5", targetId);
639
648
  });
649
+ describe("remapFields", () => {
650
+ let dstIModel;
651
+ let dstModel;
652
+ let dstCategory;
653
+ let dstSourceElementId;
654
+ before(async () => {
655
+ const path = IModelTestUtils.prepareOutputFile("RemapFields", `dst.bim`);
656
+ dstIModel = StandaloneDb.createEmpty(path, { rootSubject: { name: `RemapFields-dst` }, allowEdit: JSON.stringify({ txns: true }) });
657
+ await registerTestSchema(dstIModel);
658
+ // Insert additional unused elements to ensure element Ids differ between src and dst iModels
659
+ for (let i = 0; i < 3; i++) {
660
+ IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);
661
+ }
662
+ const modelAndElement = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);
663
+ expect(modelAndElement[0]).to.equal(modelAndElement[1]);
664
+ dstModel = modelAndElement[1];
665
+ dstCategory = SpatialCategory.insert(dstIModel, StandaloneDb.dictionaryId, `dstCat`, new SubCategoryAppearance());
666
+ dstSourceElementId = createTestElement(dstIModel, dstModel, dstCategory, {
667
+ intProp: 200,
668
+ point: { x: -1, y: -2, z: -3 },
669
+ strings: ["x", "y", "z"],
670
+ intEnum: 2,
671
+ }, 1234);
672
+ await dstIModel.fonts.embedFontFile({
673
+ file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile("Karla-Regular.ttf"))
674
+ });
675
+ expect(dstCategory).not.to.equal(category);
676
+ expect(dstModel).not.to.equal(model);
677
+ expect(dstSourceElementId).not.to.equal(sourceElementId);
678
+ });
679
+ after(() => {
680
+ dstIModel.close();
681
+ });
682
+ function getTextBlockJson() {
683
+ return {
684
+ children: [{
685
+ children: [{
686
+ type: "field",
687
+ propertyHost: {
688
+ elementId: sourceElementId,
689
+ schemaName: "Fields",
690
+ className: "TestElement",
691
+ },
692
+ propertyPath: { propertyName: "intProp" },
693
+ cachedContent: "intProp",
694
+ }, {
695
+ type: "field",
696
+ propertyHost: {
697
+ elementId: category,
698
+ schemaName: "BisCore",
699
+ className: "Element",
700
+ },
701
+ propertyPath: { propertyName: "CodeValue" },
702
+ cachedContent: "CodeValue"
703
+ }],
704
+ }],
705
+ };
706
+ }
707
+ function expectHostIds(elem, host1, host2) {
708
+ const anno = elem.getAnnotation();
709
+ expect(anno.textBlock.children.length).to.equal(1);
710
+ const para = anno.textBlock.children[0];
711
+ expect(para.children.length).to.equal(2);
712
+ expect(para.children.every((x) => x.type === "field"));
713
+ const field1 = para.children[0];
714
+ expect(field1.propertyHost.elementId).to.equal(host1);
715
+ const field2 = para.children[1];
716
+ expect(field2.propertyHost.elementId).to.equal(host2);
717
+ }
718
+ it("remaps field hosts", () => {
719
+ const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));
720
+ expectHostIds(elem, sourceElementId, category);
721
+ const context = new IModelElementCloneContext(imodel, dstIModel);
722
+ context.remapElement(sourceElementId, dstSourceElementId);
723
+ context.remapElement(category, dstCategory);
724
+ ElementDrivesTextAnnotation.remapFields(elem, context);
725
+ expectHostIds(elem, dstSourceElementId, dstCategory);
726
+ });
727
+ it("invalidates field host if source element not remapped", () => {
728
+ const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));
729
+ expectHostIds(elem, sourceElementId, category);
730
+ const context = new IModelElementCloneContext(imodel, dstIModel);
731
+ ElementDrivesTextAnnotation.remapFields(elem, context);
732
+ expectHostIds(elem, Id64.invalid, Id64.invalid);
733
+ });
734
+ });
640
735
  });
641
736
  describe("Format Validation", () => {
642
737
  it("validates formatting options for string property type", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"Fields.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/Fields.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { expect } from \"chai\";\r\nimport { Code, ElementAspectProps, FieldPropertyHost, FieldPropertyPath, FieldPropertyType, FieldRun, FieldValue, PhysicalElementProps, SubCategoryAppearance, TextAnnotation, TextBlock, TextRun } from \"@itwin/core-common\";\r\nimport { IModelDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { createUpdateContext, updateField, updateFields } from \"../../internal/annotations/fields\";\r\nimport { DbResult, Id64, Id64String, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { SpatialCategory } from \"../../Category\";\r\nimport { Point3d, XYAndZ, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { Schema, Schemas } from \"../../Schema\";\r\nimport { ClassRegistry } from \"../../ClassRegistry\";\r\nimport { PhysicalElement } from \"../../Element\";\r\nimport { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, TextAnnotation3d } from \"../../core-backend\";\r\nimport { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault } from \"../../annotations/ElementDrivesTextAnnotation\";\r\n\r\nfunction isIntlSupported(): boolean {\r\n // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile\r\n // users are not expected to do any editing, but long term we will attempt to find a better\r\n // solution.\r\n return !ProcessDetector.isMobileAppBackend;\r\n}\r\n\r\ndescribe(\"updateField\", () => {\r\n const mockElementId = \"0x1\";\r\n const mockPath: FieldPropertyPath = {\r\n propertyName: \"mockProperty\",\r\n accessors: [0, \"nestedProperty\"],\r\n };\r\n const mockCachedContent = \"cachedContent\";\r\n const mockUpdatedContent = \"updatedContent\";\r\n\r\n const createMockContext = (elementId: string, propertyValue?: string) => ({\r\n hostElementId: elementId,\r\n getProperty: (field: FieldRun): FieldValue | undefined => {\r\n const propertyPath = field.propertyPath;\r\n if (\r\n propertyPath.propertyName === \"mockProperty\" &&\r\n propertyPath.accessors?.[0] === 0 &&\r\n propertyPath.accessors?.[1] === \"nestedProperty\" &&\r\n propertyValue !== undefined\r\n ) {\r\n return { value: propertyValue, type: \"string\" };\r\n }\r\n return undefined;\r\n },\r\n });\r\n\r\n it(\"does nothing if hostElementId does not match\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(\"0x2\", mockUpdatedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.false;\r\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\r\n });\r\n\r\n it(\"produces invalid content indicator if property value is undefined\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n\r\n it(\"returns false if cached content matches new content\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId, mockCachedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.false;\r\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\r\n });\r\n\r\n it(\"returns true and updates cached content if new content is different\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId, mockUpdatedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(mockUpdatedContent);\r\n });\r\n\r\n it(\"resolves to invalid content indicator if an exception occurs\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = {\r\n hostElementId: mockElementId,\r\n getProperty: () => {\r\n throw new Error(\"Test exception\");\r\n },\r\n };\r\n\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n});\r\n\r\nconst fieldsSchemaXml = `\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ECSchema schemaName=\"Fields\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.04\" alias=\"bis\"/>\r\n\r\n <ECEnumeration typeName=\"IntEnum\" backingTypeName=\"int\">\r\n <ECEnumerator name=\"one\" displayLabel=\"One\" value=\"1\" />\r\n <ECEnumerator name=\"two\" displayLabel=\"Two\" value=\"2\"/>\r\n </ECEnumeration>\r\n\r\n <ECStructClass typeName=\"InnerStruct\" modifier=\"None\">\r\n <ECProperty propertyName=\"bool\" typeName=\"boolean\"/>\r\n <ECArrayProperty propertyName=\"doubles\" typeName=\"double\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n </ECStructClass>\r\n\r\n <ECStructClass typeName=\"OuterStruct\" modifier=\"None\">\r\n <ECStructProperty propertyName=\"innerStruct\" typeName=\"InnerStruct\"/>\r\n <ECStructArrayProperty propertyName=\"innerStructs\" typeName=\"InnerStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n </ECStructClass>\r\n\r\n <ECEntityClass typeName=\"TestElement\" modifier=\"None\">\r\n <BaseClass>bis:PhysicalElement</BaseClass>\r\n <ECProperty propertyName=\"intProp\" typeName=\"int\"/>\r\n <ECProperty propertyName=\"point\" typeName=\"point3d\"/>\r\n <ECProperty propertyName=\"maybeNull\" typeName=\"int\"/>\r\n <ECProperty propertyName=\"datetime\" typeName=\"dateTime\"/>\r\n <ECArrayProperty propertyName=\"strings\" typeName=\"string\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n <ECStructProperty propertyName=\"outerStruct\" typeName=\"OuterStruct\"/>\r\n <ECStructArrayProperty propertyName=\"outerStructs\" typeName=\"OuterStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n <ECProperty propertyName=\"intEnum\" typeName=\"IntEnum\"/>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"TestAspect\" modifier=\"None\">\r\n <BaseClass>bis:ElementUniqueAspect</BaseClass>\r\n <ECProperty propertyName=\"aspectProp\" typeName=\"int\"/>\r\n </ECEntityClass>\r\n</ECSchema>\r\n`;\r\n\r\ninterface InnerStruct {\r\n bool: boolean;\r\n doubles: number[];\r\n}\r\n\r\ninterface OuterStruct {\r\n innerStruct: InnerStruct;\r\n innerStructs: InnerStruct[];\r\n}\r\n\r\ninterface TestElementProps extends PhysicalElementProps {\r\n intProp: number;\r\n point: XYAndZ;\r\n maybeNull?: number;\r\n strings: string[];\r\n datetime: Date;\r\n outerStruct: OuterStruct;\r\n outerStructs: OuterStruct[];\r\n intEnum?: number;\r\n}\r\n\r\nclass TestElement extends PhysicalElement {\r\n public static override get className() { return \"TestElement\"; }\r\n declare public intProp: number;\r\n declare public point: XYAndZ;\r\n declare public maybeNull?: number;\r\n declare public strings: string[];\r\n declare public datetime: Date;\r\n declare public outerStruct: OuterStruct;\r\n declare public outerStructs: OuterStruct[];\r\n}\r\n\r\nclass TestAspect extends ElementUniqueAspect {\r\n public static override get className() { return \"TestAspect\"; }\r\n\r\n declare public aspectProp: number;\r\n}\r\n\r\ninterface TestAspectProps extends ElementAspectProps {\r\n aspectProp: number;\r\n}\r\n\r\nclass FieldsSchema extends Schema {\r\n public static override get schemaName() { return \"Fields\"; }\r\n}\r\n\r\nasync function registerTestSchema(iModel: IModelDb): Promise<void> {\r\n if (!Schemas.getRegisteredSchema(\"Fields\")) {\r\n Schemas.registerSchema(FieldsSchema);\r\n ClassRegistry.register(TestElement, FieldsSchema);\r\n ClassRegistry.register(TestAspect, FieldsSchema);\r\n }\r\n\r\n await iModel.importSchemaStrings([fieldsSchemaXml]);\r\n iModel.saveChanges();\r\n}\r\n\r\ndescribe(\"Field evaluation\", () => {\r\n let imodel: StandaloneDb;\r\n let model: Id64String;\r\n let category: Id64String;\r\n let sourceElementId: Id64String;\r\n\r\n before(async () => {\r\n const iModelPath = IModelTestUtils.prepareOutputFile(\"UpdateFieldsContext\", \"test.bim\");\r\n imodel = StandaloneDb.createEmpty(iModelPath, { rootSubject: { name: \"UpdateFieldsContext\" }, allowEdit: JSON.stringify({ txns: true } )});\r\n\r\n await registerTestSchema(imodel);\r\n\r\n model = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), true)[1];\r\n category = SpatialCategory.insert(imodel, StandaloneDb.dictionaryId, \"UpdateFieldsContextCategory\", new SubCategoryAppearance());\r\n sourceElementId = insertTestElement();\r\n\r\n await imodel.fonts.embedFontFile({\r\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\r\n });\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n function insertTestElement(): Id64String {\r\n const props: TestElementProps = {\r\n classFullName: \"Fields:TestElement\",\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n intProp: 100,\r\n point: { x: 1, y: 2, z: 3 },\r\n strings: [\"a\", \"b\", `\"name\": \"c\"`],\r\n datetime: new Date(\"2025-08-28T13:45:30.123Z\"),\r\n intEnum: 1,\r\n outerStruct: {\r\n innerStruct: { bool: false, doubles: [1, 2, 3] },\r\n innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],\r\n },\r\n outerStructs: [{\r\n innerStruct: { bool: true, doubles: [10, 9] },\r\n innerStructs: [{ bool: false, doubles: [5] }],\r\n }],\r\n placement: {\r\n origin: new Point3d(1, 2, 0),\r\n angles: new YawPitchRollAngles(),\r\n },\r\n jsonProperties: {\r\n stringProp: \"abc\",\r\n ints: [10, 11, 12, 13],\r\n bool: true,\r\n zoo: {\r\n address: {\r\n zipcode: 12345,\r\n },\r\n birds: [\r\n { name: \"duck\", sound: \"quack\" },\r\n { name: \"hawk\", sound: \"scree!\" },\r\n ],\r\n },\r\n },\r\n };\r\n\r\n const id = imodel.elements.insertElement(props);\r\n\r\n const aspectProps: TestAspectProps = {\r\n classFullName: TestAspect.classFullName,\r\n aspectProp: 999,\r\n element: new ElementOwnsUniqueAspect(id),\r\n };\r\n imodel.elements.insertAspect(aspectProps);\r\n\r\n imodel.saveChanges();\r\n return id;\r\n }\r\n\r\n function evaluateField(propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): FieldValue | undefined {\r\n if (typeof propertyHost === \"string\") {\r\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\r\n }\r\n\r\n const field = FieldRun.create({\r\n propertyPath,\r\n propertyHost,\r\n });\r\n\r\n const context = createUpdateContext(propertyHost.elementId, imodel, deletedDependency);\r\n return context.getProperty(field);\r\n }\r\n\r\n describe(\"getProperty\", () => {\r\n function expectValue(expected: any, propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): void {\r\n expect(evaluateField(propertyPath, propertyHost, deletedDependency)?.value).to.deep.equal(expected);\r\n }\r\n\r\n it(\"returns a primitive property value\", () => {\r\n expectValue(100, { propertyName: \"intProp\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns an integer enum property value\", () => {\r\n expectValue(1, { propertyName: \"intEnum\" }, sourceElementId);\r\n });\r\n\r\n it(\"treats points as primitive values\", () => {\r\n expectValue({ x: 1, y: 2, z: 3 }, { propertyName: \"point\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"point\", accessors: [\"x\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns a primitive array value\", () => {\r\n expectValue(\"a\", { propertyName: \"strings\", accessors: [0] }, sourceElementId);\r\n expectValue(\"b\", { propertyName: \"strings\", accessors: [1] }, sourceElementId);\r\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [2] }, sourceElementId);\r\n });\r\n\r\n it(\"supports negative array indices\", () => {\r\n expectValue(\"a\", { propertyName: \"strings\", accessors: [-3] }, sourceElementId);\r\n expectValue(\"b\", { propertyName: \"strings\", accessors: [-2] }, sourceElementId);\r\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [-1] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the dependency was deleted\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\" }, sourceElementId, true);\r\n });\r\n\r\n it(\"returns undefined if the host element does not exist\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\" }, \"0xbaadf00d\");\r\n });\r\n\r\n it(\"returns undefined if the host element is not of the specified class or a subclass thereof\", () => {\r\n expectValue(undefined, { propertyName: \"origin\" }, { schemaName: \"BisCore\", className: \"GeometricElement2d\", elementId: sourceElementId });\r\n });\r\n\r\n it(\"returns undefined if an access string is specified for a non-object property\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\", accessors: [\"property\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the specified property does not exist\", () => {\r\n expectValue(undefined, { propertyName: \"nonExistentProperty\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the specified property is null\", () => {\r\n expectValue(undefined, { propertyName: \"maybeNull\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if an array index is specified for a non-array property\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\", accessors: [0] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if an array index is out of bounds\", () => {\r\n for (const index of [3, 4, -4, -5]) {\r\n expectValue(undefined, { propertyName: \"strings\", accessors: [index] }, sourceElementId);\r\n }\r\n });\r\n\r\n it(\"returns undefined for a non-primitive value\", () => {\r\n expectValue(undefined, { propertyName: \"strings\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStruct\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStruct\", accessors: [\"innerStruct\"] }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0] }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns arbitrarily-nested properties of structs and struct arrays\", () => {\r\n expectValue(false, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] }, sourceElementId);\r\n for (const index of [0, 1, 2]) {\r\n expectValue(index + 1, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", index] },sourceElementId);\r\n expectValue(3 - index, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", -1 - index] },sourceElementId);\r\n }\r\n\r\n expectValue(9, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\", \"doubles\", 1] }, sourceElementId);\r\n expectValue(false, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", -1, \"bool\"] }, sourceElementId);\r\n expectValue(5, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", 0, \"doubles\", 0] }, sourceElementId);\r\n });\r\n\r\n it(\"returns the value of a property of an aspect\", () => {\r\n expect(imodel.elements.getAspects(sourceElementId, \"Fields:TestAspect\").length).to.equal(1);\r\n expectValue(999, { propertyName: \"aspectProp\" }, { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestAspect\" });\r\n });\r\n\r\n it(\"should fail to evaluate if prop type does not match\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"string\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n formatOptions: {\r\n case: \"upper\",\r\n prefix: \"Value: \",\r\n suffix: \"!\"\r\n }\r\n });\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n\r\n const updated = updateField(fieldRun, context);\r\n\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n\r\n function getPropertyType(propertyHost: FieldPropertyHost, propertyPath: string | FieldPropertyPath): FieldPropertyType | undefined {\r\n if (typeof propertyPath === \"string\") {\r\n propertyPath = { propertyName: propertyPath };\r\n }\r\n\r\n return evaluateField(propertyPath, propertyHost)?.type;\r\n }\r\n\r\n it(\"deduces type for primitive properties\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"intProp\")).to.equal(\"string\");\r\n expect(getPropertyType(propertyHost, \"point\")).to.equal(\"coordinate\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"strings\", accessors: [0] })).to.equal(\"string\");\r\n expect(getPropertyType(propertyHost, \"intEnum\")).to.equal(\"int-enum\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", 0] })).to.equal(\"quantity\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] })).to.equal(\"boolean\");\r\n\r\n propertyHost.schemaName = \"BisCore\";\r\n propertyHost.className = \"GeometricElement3d\";\r\n expect(getPropertyType(propertyHost, \"LastMod\")).to.equal(\"datetime\");\r\n expect(getPropertyType(propertyHost, \"FederationGuid\")).to.equal(\"string\");\r\n });\r\n\r\n it(\"returns undefined for non-primitive properties\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"outerStruct\")).to.equal(undefined);\r\n expect(getPropertyType(propertyHost, \"outerStructs\")).to.equal(undefined);\r\n });\r\n\r\n it(\"returns undefined for invalid property paths\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"unknownPropertyName\")).to.be.undefined;\r\n });\r\n\r\n it(\"should return undefined for unsupported primitive types\", () => {\r\n const host = { elementId: sourceElementId, schemaName: \"BisCore\", className: \"GeometricElement3d\" };\r\n expect(getPropertyType(host, \"GeometryStream\")).to.be.undefined;\r\n });\r\n });\r\n\r\n describe(\"updateFields\", () => {\r\n it(\"recomputes cached content\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"oldValue\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(1);\r\n expect(fieldRun.cachedContent).to.equal(\"100\"); // `intProp` value from the test element\r\n });\r\n\r\n it(\"does not update a field if recomputed content matches cached content\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"100\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(0);\r\n expect(fieldRun.cachedContent).to.equal(\"100\");\r\n });\r\n\r\n it(\"returns the number of fields updated\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun1 = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"100\",\r\n });\r\n\r\n const fieldRun2 = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"strings\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun1);\r\n textBlock.appendRun(fieldRun2);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(1);\r\n expect(fieldRun1.cachedContent).to.equal(\"100\");\r\n expect(fieldRun2.cachedContent).to.equal(\"a\");\r\n });\r\n });\r\n\r\n function insertAnnotationElement(textBlock: TextBlock | undefined): Id64String {\r\n const elem = TextAnnotation3d.fromJSON({\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n placement: {\r\n origin: { x: 0, y: 0, z: 0 },\r\n angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\r\n },\r\n classFullName: TextAnnotation3d.classFullName,\r\n defaultTextStyle: new TextAnnotationUsesTextStyleByDefault(\"0x123\").toJSON(),\r\n }, imodel);\r\n\r\n if (textBlock) {\r\n const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });\r\n elem.setAnnotation(annotation);\r\n }\r\n\r\n return elem.insert();\r\n }\r\n\r\n describe(\"ElementDrivesTextAnnotation\", () => {\r\n function expectNumRelationships(expected: number, targetId?: Id64String): void {\r\n const where = targetId ? ` WHERE TargetECInstanceId=${targetId}` : \"\";\r\n const ecsql = `SELECT COUNT(*) FROM BisCore.ElementDrivesTextAnnotation ${where}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel.withPreparedStatement(ecsql, (stmt) => {\r\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);\r\n expect(stmt.getValue(0).getInteger()).to.equal(expected);\r\n });\r\n }\r\n\r\n it(\"can be inserted\", () => {\r\n expectNumRelationships(0);\r\n\r\n const targetId = insertAnnotationElement(undefined);\r\n expect(targetId).not.to.equal(Id64.invalid);\r\n\r\n const target = imodel.elements.getElement(targetId);\r\n expect(target.classFullName).to.equal(\"BisCore:TextAnnotation3d\");\r\n expect(target).instanceof(TextAnnotation3d);\r\n\r\n const targetAnno = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(targetAnno).instanceof(TextAnnotation3d);\r\n\r\n const rel = ElementDrivesTextAnnotation.create(imodel, sourceElementId, targetId);\r\n const relId = rel.insert();\r\n expect(relId).not.to.equal(Id64.invalid);\r\n\r\n expectNumRelationships(1);\r\n\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementDrivesTextAnnotation\", relId);\r\n expect(relationship.sourceId).to.equal(sourceElementId);\r\n expect(relationship.targetId).to.equal(targetId);\r\n });\r\n\r\n function createField(propertyHost: Id64String | FieldPropertyHost, cachedContent: string, propertyName = \"intProp\", accessors?: Array<string | number>): FieldRun {\r\n if (typeof propertyHost === \"string\") {\r\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\r\n }\r\n\r\n return FieldRun.create({\r\n styleOverrides: { font: { name: \"Karla\" } },\r\n propertyHost,\r\n cachedContent,\r\n propertyPath: { propertyName, accessors },\r\n });\r\n }\r\n\r\n describe(\"updateFieldDependencies\", () => {\r\n it(\"creates exactly one relationship for each unique source element on insert and update\", () => {\r\n const source1 = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(source1, \"1\"));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n\r\n const source2 = insertTestElement();\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n const anno = target.getAnnotation()!;\r\n anno.textBlock.appendRun(createField(source2, \"2a\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n\r\n anno.textBlock.appendRun(createField(source2, \"2b\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n\r\n const source3 = insertTestElement();\r\n anno.textBlock.appendRun(createField(source3, \"3\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(3, targetId);\r\n });\r\n\r\n it(\"deletes stale relationships\", () => {\r\n const sourceA = insertTestElement();\r\n const sourceB = insertTestElement();\r\n\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceA, \"A\"));\r\n block.appendRun(createField(sourceB, \"B\"));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n const anno = target.getAnnotation()!;\r\n\r\n // Remove the sourceA FieldRun from the first paragraph.\r\n const p1 = anno.textBlock.children[0];\r\n p1.children.shift();\r\n\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\r\n\r\n anno.textBlock.children.length = 0;\r\n anno.textBlock.appendRun(createField(sourceA, \"A2\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\r\n\r\n anno.textBlock.children.length = 0;\r\n anno.textBlock.appendRun(TextRun.create({\r\n styleOverrides: { font: { name: \"Karla\" } },\r\n content: \"not a field\",\r\n }));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(0, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\r\n });\r\n\r\n it(\"ignores invalid source element Ids\", () => {\r\n const source = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(Id64.invalid, \"invalid\"));\r\n block.appendRun(createField(\"0xbaadf00d\", \"non-existent\"));\r\n block.appendRun(createField(source, \"valid\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectNumRelationships(1, targetId);\r\n });\r\n });\r\n\r\n function expectText(expected: string, elemId: Id64String): void {\r\n const elem = imodel.elements.getElement<TextAnnotation3d>(elemId);\r\n const anno = elem.getAnnotation()!;\r\n const actual = anno.textBlock.stringify();\r\n expect(actual).to.equal(expected);\r\n }\r\n\r\n it(\"evaluates cachedContent when annotation element is inserted\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"initial cached content\"));\r\n expect(block.stringify()).to.equal(\"initial cached content\");\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()!.textBlock.stringify()).to.equal(\"100\");\r\n });\r\n\r\n it(\"updates fields when source element is modified or deleted\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"old value\"));;\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()).not.to.be.undefined;\r\n\r\n expectText(\"100\", targetId);\r\n\r\n let source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.intProp = 50;\r\n source.update();\r\n\r\n expectText(\"100\", targetId);\r\n\r\n imodel.saveChanges();\r\n\r\n source = imodel.elements.getElement<TestElement>(sourceId);\r\n expect(source.intProp).to.equal(50);\r\n\r\n expectText(\"50\", targetId);\r\n\r\n imodel.elements.deleteElement(sourceId);\r\n expectText(\"50\", targetId);\r\n\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n });\r\n\r\n it(\"updates fields when source element aspect is modified, deleted, or recreated\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField({ elementId: sourceId, schemaName: \"Fields\", className: \"TestAspect\" }, \"\", \"aspectProp\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"999\", targetId);\r\n\r\n const aspects = imodel.elements.getAspects(sourceId, \"Fields:TestAspect\");\r\n expect(aspects.length).to.equal(1);\r\n const aspect = aspects[0] as TestAspect;\r\n expect(aspect.aspectProp).to.equal(999);\r\n\r\n aspect.aspectProp = 12345;\r\n imodel.elements.updateAspect(aspect.toJSON());\r\n imodel.saveChanges();\r\n expectText(\"12345\", targetId);\r\n\r\n imodel.elements.deleteAspect([aspect.id]);\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n\r\n const newAspect: TestAspectProps = {\r\n element: new ElementOwnsUniqueAspect(sourceId),\r\n classFullName: TestAspect.classFullName,\r\n aspectProp: 42,\r\n };\r\n imodel.elements.insertAspect(newAspect);\r\n imodel.saveChanges();\r\n expectText(\"42\", targetId);\r\n });\r\n\r\n it(\"updates only fields for specific modified element\", () => {\r\n const sourceA = insertTestElement();\r\n const sourceB = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceA, \"A\"));\r\n block.appendRun(createField(sourceB, \"B\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"100100\", targetId);\r\n\r\n const sourceElem = imodel.elements.getElement<TestElement>(sourceB);\r\n sourceElem.intProp = 123;\r\n sourceElem.update();\r\n imodel.saveChanges();\r\n\r\n expectText(\"100123\", targetId);\r\n });\r\n\r\n it(\"supports complex property paths\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"\", \"outerStruct\", [\"innerStructs\", 1, \"doubles\", -2]));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"2\", targetId);\r\n\r\n const source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.outerStruct.innerStructs[1].doubles[3] = 12.5;\r\n source.update();\r\n imodel.saveChanges();\r\n expectText(\"12.5\", targetId);\r\n });\r\n });\r\n\r\n describe(\"Format Validation\", () => {\r\n it(\"validates formatting options for string property type\", () => {\r\n // Create a FieldRun with string property type and some format options\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"strings\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n formatOptions: {\r\n case: \"upper\",\r\n prefix: \"Value: \",\r\n suffix: \"!\"\r\n }\r\n });\r\n\r\n // Context returns a string value for the property\r\n const context = {\r\n hostElementId: sourceElementId,\r\n getProperty: () => { return { value: \"abc\", type: \"string\" as const } },\r\n };\r\n\r\n // Update the field and check the result\r\n const updated = updateField(fieldRun, context);\r\n\r\n // The formatted value should be uppercased and have prefix/suffix applied\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(\"Value: ABC!\");\r\n });\r\n\r\n it(\"validates formatting options for datetime objects\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n const fieldRun = FieldRun.create({\r\n propertyHost,\r\n propertyPath: { propertyName: \"datetime\"},\r\n cachedContent: \"oldval\",\r\n formatOptions: {\r\n dateTime: {\r\n formatOptions:{\r\n month: \"short\",\r\n day: \"2-digit\",\r\n year: \"numeric\",\r\n timeZone: \"UTC\"\r\n },\r\n locale: \"en-US\",\r\n },\r\n },\r\n });\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updated = updateField(fieldRun, context);\r\n\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(\"Aug 28, 2025\");\r\n });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"Fields.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/Fields.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,IAAI,EAA+E,QAAQ,EAAoC,qBAAqB,EAAE,cAAc,EAAE,SAAS,EAAkB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC9O,OAAO,EAAY,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACnG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAc,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAU,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACzI,OAAO,EAAE,2BAA2B,EAAE,oCAAoC,EAAE,MAAM,+CAA+C,CAAC;AAElI,SAAS,eAAe;IACtB,yFAAyF;IACzF,2FAA2F;IAC3F,YAAY;IACZ,OAAO,CAAC,eAAe,CAAC,kBAAkB,CAAC;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoB,EAAE,KAAiB,EAAE,QAAoB,EAAE,SAAqC,EAAE,UAAU,GAAG,GAAG;IAC/I,MAAM,KAAK,GAAqB;QAC9B,aAAa,EAAE,oBAAoB;QACnC,KAAK;QACL,QAAQ;QACR,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;QACxB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAClC,QAAQ,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;QAC9C,OAAO,EAAE,CAAC;QACV,WAAW,EAAE;YACX,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;YAChD,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;SACvF;QACD,YAAY,EAAE,CAAC;gBACb,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;gBAC7C,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9C,CAAC;QACF,SAAS,EAAE;YACT,MAAM,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAM,EAAE,IAAI,kBAAkB,EAAE;SACjC;QACD,cAAc,EAAE;YACd,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YACtB,IAAI,EAAE,IAAI;YACV,GAAG,EAAE;gBACH,OAAO,EAAE;oBACP,OAAO,EAAE,KAAK;iBACf;gBACD,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;oBAChC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;iBAClC;aACF;SACF;QACD,GAAG,SAAS;KACb,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAoB;QACnC,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,UAAU;QACV,OAAO,EAAE,IAAI,uBAAuB,CAAC,EAAE,CAAC;KACzC,CAAC;IACF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1C,MAAM,CAAC,WAAW,EAAE,CAAC;IACrB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,aAAa,GAAG,KAAK,CAAC;IAC5B,MAAM,QAAQ,GAAsB;QAClC,YAAY,EAAE,cAAc;QAC5B,SAAS,EAAE,CAAC,CAAC,EAAE,gBAAgB,CAAC;KACjC,CAAC;IACF,MAAM,iBAAiB,GAAG,eAAe,CAAC;IAC1C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;IAE5C,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAE,aAAsB,EAAE,EAAE,CAAC,CAAC;QACxE,aAAa,EAAE,SAAS;QACxB,WAAW,EAAE,CAAC,KAAe,EAA0B,EAAE;YACvD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;YACxC,IACE,YAAY,CAAC,YAAY,KAAK,cAAc;gBAC5C,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBACjC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,gBAAgB;gBAChD,aAAa,KAAK,SAAS,EAC3B,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAClD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE;YAC5F,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,iBAAiB;SACjC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE;YAC5F,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,iBAAiB;SACjC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE;YAC5F,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,iBAAiB;SACjC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE;YAC5F,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,iBAAiB;SACjC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE;YAC5F,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,iBAAiB;SACjC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG;YACd,aAAa,EAAE,aAAa;YAC5B,WAAW,EAAE,GAAG,EAAE;gBAChB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACpC,CAAC;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCvB,CAAC;AAuBF,MAAM,WAAY,SAAQ,eAAe;IAChC,MAAM,KAAc,SAAS,KAAK,OAAO,aAAa,CAAC,CAAC,CAAC;CAQjE;AAED,MAAM,UAAW,SAAQ,mBAAmB;IACnC,MAAM,KAAc,SAAS,KAAK,OAAO,YAAY,CAAC,CAAC,CAAC;CAGhE;AAMD,MAAM,YAAa,SAAQ,MAAM;IACxB,MAAM,KAAc,UAAU,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC;CAC7D;AAED,KAAK,UAAU,kBAAkB,CAAC,MAAgB;IAChD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACrC,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAClD,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,MAAoB,CAAC;IACzB,IAAI,KAAiB,CAAC;IACtB,IAAI,QAAoB,CAAC;IACzB,IAAI,eAA2B,CAAC;IAEhC,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,UAAU,GAAG,eAAe,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC;QACxF,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAE,EAAC,CAAC,CAAC;QAE3I,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEjC,KAAK,GAAG,eAAe,CAAC,wCAAwC,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,YAAY,EAAE,6BAA6B,EAAE,IAAI,qBAAqB,EAAE,CAAC,CAAC;QACjI,eAAe,GAAG,iBAAiB,EAAE,CAAC;QAEtC,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;YAC/B,IAAI,EAAE,QAAQ,CAAC,0BAA0B,CAAC,eAAe,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;SAChG,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,SAAS,iBAAiB,CAAC,SAAqC,EAAE,UAAmB;QACnF,OAAO,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3E,CAAC;IAED,SAAS,aAAa,CAAC,YAA+B,EAAE,YAA4C,EAAE,iBAAiB,GAAG,KAAK;QAC7H,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACrC,YAAY,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;QAC7F,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,YAAY;YACZ,YAAY;SACb,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACvF,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,SAAS,WAAW,CAAC,QAAa,EAAE,YAA+B,EAAE,YAA4C,EAAE,iBAAiB,GAAG,KAAK;YAC1I,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtG,CAAC;QAED,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,WAAW,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,eAAe,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,WAAW,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,eAAe,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;YAC9E,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,WAAW,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAC/E,WAAW,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAC/E,WAAW,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,WAAW,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAChF,WAAW,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAChF,WAAW,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2FAA2F,EAAE,GAAG,EAAE;YACnG,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;QAC7I,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAChG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,qBAAqB,EAAE,EAAE,eAAe,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;YACnF,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,eAAe,CAAC,CAAC;YACrE,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,eAAe,CAAC,CAAC;YACzE,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YACrG,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,eAAe,CAAC,CAAC;YAC1E,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAC1F,WAAW,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAC3G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,WAAW,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YACzG,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC9B,WAAW,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAC,eAAe,CAAC,CAAC;gBACtH,WAAW,CAAC,CAAC,GAAG,KAAK,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,EAAC,eAAe,CAAC,CAAC;YAC7H,CAAC;YAED,WAAW,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAC/G,WAAW,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAClH,WAAW,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QACrH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5F,WAAW,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAClI,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE;gBAC5F,YAAY,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;gBACxD,aAAa,EAAE,UAAU;gBACzB,aAAa,EAAE;oBACb,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAI,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAErE,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE/C,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,SAAS,eAAe,CAAC,YAA+B,EAAE,YAAwC;YAChG,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,YAAY,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;YAChD,CAAC;YAED,OAAO,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC;QACzD,CAAC;QAED,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;YACpG,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpE,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACtE,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtG,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACtE,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACtI,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAE/H,YAAY,CAAC,UAAU,GAAG,SAAS,CAAC;YACpC,YAAY,CAAC,SAAS,GAAG,oBAAoB,CAAC;YAC9C,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACtE,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;YACpG,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACzE,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;YACpG,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAC/E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;YACpG,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE;gBAC5F,YAAY,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;gBACzC,aAAa,EAAE,UAAU;aAC1B,CAAC,CAAC;YAEH,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE9B,MAAM,OAAO,GAAG,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACpE,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE;gBAC5F,YAAY,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;gBACzC,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE9B,MAAM,OAAO,GAAG,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACpE,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAChC,YAAY,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE;gBAC5F,YAAY,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;gBACzC,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAChC,YAAY,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE;gBAC5F,YAAY,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;gBACzD,aAAa,EAAE,UAAU;aAC1B,CAAC,CAAC;YAEH,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/B,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAE/B,MAAM,OAAO,GAAG,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACpE,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,uBAAuB,CAAC,SAAgC;QAC/D,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC;YACrC,KAAK;YACL,QAAQ;YACR,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,SAAS,EAAE;gBACT,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;gBAC5B,MAAM,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;aAC3D;YACD,aAAa,EAAE,gBAAgB,CAAC,aAAa;YAC7C,gBAAgB,EAAE,IAAI,oCAAoC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;SAC7E,EAAE,MAAM,CAAC,CAAC;QAEX,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,uBAAuB,CAAC,SAAgC;QAC/D,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,SAAS,sBAAsB,CAAC,QAAgB,EAAE,QAAqB;YACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,KAAK,GAAG,4DAA4D,KAAK,EAAE,CAAC;YAClF,4DAA4D;YAC5D,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC;QAED,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACzB,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAE1B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;YAE5C,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAmB,QAAQ,CAAC,CAAC;YAC1E,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;YAEhD,MAAM,GAAG,GAAG,2BAA2B,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;YAClF,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAE1B,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YACpG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACxD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,SAAS,WAAW,CAAC,YAA4C,EAAE,aAAqB,EAAE,YAAY,GAAG,SAAS,EAAE,SAAkC;YACpJ,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,YAAY,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;YAC7F,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,CAAC;gBACrB,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;gBAC3C,YAAY;gBACZ,aAAa;gBACb,YAAY,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACvC,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;gBAC9F,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;gBACjC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM,CAAC,WAAW,EAAE,CAAC;gBAErB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAEpC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAmB,QAAQ,CAAC,CAAC;gBACtE,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,EAAG,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBACrD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,WAAW,EAAE,CAAC;gBAErB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAEpC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBACrD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,WAAW,EAAE,CAAC;gBAErB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAEpC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBACpC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACpD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,WAAW,EAAE,CAAC;gBAErB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;gBACrC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBAEpC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;gBACjC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3C,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM,CAAC,WAAW,EAAE,CAAC;gBAErB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;gBAC5I,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;gBAE5I,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAmB,QAAQ,CAAC,CAAC;gBACtE,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,EAAG,CAAC;gBAErC,wDAAwD;gBACxD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAEpB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,WAAW,EAAE,CAAC;gBAErB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;gBACxI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;gBAE5I,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBACrD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,WAAW,EAAE,CAAC;gBAErB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;gBAC5I,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;gBAExI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;oBACtC,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;oBAC3C,OAAO,EAAE,aAAa;iBACvB,CAAC,CAAC,CAAC;gBACJ,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,WAAW,EAAE,CAAC;gBAErB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;gBACxI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YAC1I,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;gBAC5C,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;gBACjC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;gBACtD,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;gBAC3D,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAE9C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,SAAS,UAAU,CAAC,QAAgB,EAAE,MAAkB,EAAE,EAAiB;YACzE,EAAE,GAAG,EAAE,IAAI,MAAM,CAAC;YAClB,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAmB,MAAM,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAG,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAE7D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,EAAE,CAAC;YAErB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAmB,QAAQ,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAG,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;YAAA,CAAC;YAErD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,EAAE,CAAC;YAErB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAmB,QAAQ,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YAEnD,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAE5B,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAc,QAAQ,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,EAAE,CAAC;YAEhB,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAE5B,MAAM,CAAC,WAAW,EAAE,CAAC;YAErB,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAc,QAAQ,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAEpC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE3B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE3B,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,UAAU,CAAC,QAAQ,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;YAEvH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAE5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;YAC1E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAe,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAExC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE9B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,UAAU,CAAC,QAAQ,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;YAEvD,MAAM,SAAS,GAAoB;gBACjC,OAAO,EAAE,IAAI,uBAAuB,CAAC,QAAQ,CAAC;gBAC9C,aAAa,EAAE,UAAU,CAAC,aAAa;gBACvC,UAAU,EAAE,EAAE;aACf,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAE3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE/B,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAc,OAAO,CAAC,CAAC;YACpE,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;YACzB,UAAU,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,WAAW,EAAE,CAAC;YAErB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9F,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAE1B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAc,QAAQ,CAAC,CAAC;YACjE,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACrD,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;YAC3B,IAAI,SAAuB,CAAC;YAC5B,IAAI,QAAoB,CAAC;YACzB,IAAI,WAAuB,CAAC;YAC5B,IAAI,kBAA8B,CAAC;YAEnC,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,IAAI,GAAG,eAAe,CAAC,iBAAiB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBACzE,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAC,CAAC,CAAC;gBACnI,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAEpC,6FAA6F;gBAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,eAAe,CAAC,wCAAwC,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;gBAChG,CAAC;gBAED,MAAM,eAAe,GAAG,eAAe,CAAC,wCAAwC,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;gBACtH,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBAExD,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC9B,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,qBAAqB,EAAE,CAAC,CAAC;gBAClH,kBAAkB,GAAG,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE;oBACvE,OAAO,EAAE,GAAG;oBACZ,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;oBAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;oBACxB,OAAO,EAAE,CAAC;iBACX,EAAE,IAAI,CAAC,CAAC;gBAET,MAAM,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;oBAClC,IAAI,EAAE,QAAQ,CAAC,0BAA0B,CAAC,eAAe,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;iBAChG,CAAC,CAAC;gBAEH,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,GAAG,EAAE;gBACT,SAAS,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC,CAAC,CAAC;YAEH,SAAS,gBAAgB;gBACvB,OAAO;oBACL,QAAQ,EAAE,CAAC;4BACT,QAAQ,EAAE,CAAC;oCACT,IAAI,EAAE,OAAO;oCACb,YAAY,EAAE;wCACZ,SAAS,EAAE,eAAe;wCAC1B,UAAU,EAAE,QAAQ;wCACpB,SAAS,EAAE,aAAa;qCACzB;oCACD,YAAY,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;oCACzC,aAAa,EAAE,SAAS;iCACzB,EAAE;oCACD,IAAI,EAAE,OAAO;oCACb,YAAY,EAAE;wCACZ,SAAS,EAAE,QAAQ;wCACnB,UAAU,EAAE,SAAS;wCACrB,SAAS,EAAE,SAAS;qCACrB;oCACD,YAAY,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE;oCAC3C,aAAa,EAAE,WAAW;iCAC3B,CAAC;yBACH,CAAC;iBACH,CAAC;YACJ,CAAC;YAED,SAAS,aAAa,CAAC,IAAsB,EAAE,KAAiB,EAAE,KAAiB;gBACjF,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAG,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC;gBACvD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAa,CAAC;gBAC5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAa,CAAC;gBAC5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxD,CAAC;YAED,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;gBAC5B,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;gBAC3E,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;gBAE/C,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACjE,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;gBAC1D,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAE5C,2BAA2B,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACvD,aAAa,CAAC,IAAI,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;gBAC/D,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;gBAC3E,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;gBAE/C,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAEjE,2BAA2B,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACvD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,sEAAsE;YACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,YAAY,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE;gBAC5F,YAAY,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;gBACzD,aAAa,EAAE,UAAU;gBACzB,aAAa,EAAE;oBACb,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC,CAAC;YAEH,kDAAkD;YAClD,MAAM,OAAO,GAAG;gBACd,aAAa,EAAE,eAAe;gBAC9B,WAAW,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAA,CAAC,CAAC;aACxE,CAAC;YAEF,wCAAwC;YACxC,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE/C,0EAA0E;YAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE;YACtD,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;YAED,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;YACpG,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,YAAY;gBACZ,YAAY,EAAE,EAAE,YAAY,EAAE,UAAU,EAAC;gBACzC,aAAa,EAAE,QAAQ;gBACvB,aAAa,EAAE;oBACb,QAAQ,EAAE;wBACR,aAAa,EAAC;4BACZ,KAAK,EAAE,OAAO;4BACd,GAAG,EAAE,SAAS;4BACd,IAAI,EAAE,SAAS;4BACf,QAAQ,EAAE,KAAK;yBAChB;wBACD,MAAM,EAAE,OAAO;qBACjB;iBACD;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE/C,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { expect } from \"chai\";\r\nimport { Code, ElementAspectProps, FieldPropertyHost, FieldPropertyPath, FieldPropertyType, FieldRun, FieldValue, PhysicalElementProps, SubCategoryAppearance, TextAnnotation, TextBlock, TextBlockProps, TextRun } from \"@itwin/core-common\";\r\nimport { IModelDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { createUpdateContext, updateField, updateFields } from \"../../internal/annotations/fields\";\r\nimport { DbResult, Id64, Id64String, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { SpatialCategory } from \"../../Category\";\r\nimport { Point3d, XYAndZ, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { Schema, Schemas } from \"../../Schema\";\r\nimport { ClassRegistry } from \"../../ClassRegistry\";\r\nimport { PhysicalElement } from \"../../Element\";\r\nimport { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, IModelElementCloneContext, TextAnnotation3d } from \"../../core-backend\";\r\nimport { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault } from \"../../annotations/ElementDrivesTextAnnotation\";\r\n\r\nfunction isIntlSupported(): boolean {\r\n // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile\r\n // users are not expected to do any editing, but long term we will attempt to find a better\r\n // solution.\r\n return !ProcessDetector.isMobileAppBackend;\r\n}\r\n\r\nfunction createTestElement(imodel: StandaloneDb, model: Id64String, category: Id64String, overrides?: Partial<TestElementProps>, aspectProp = 999): Id64String {\r\n const props: TestElementProps = {\r\n classFullName: \"Fields:TestElement\",\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n intProp: 100,\r\n point: { x: 1, y: 2, z: 3 },\r\n strings: [\"a\", \"b\", `\"name\": \"c\"`],\r\n datetime: new Date(\"2025-08-28T13:45:30.123Z\"),\r\n intEnum: 1,\r\n outerStruct: {\r\n innerStruct: { bool: false, doubles: [1, 2, 3] },\r\n innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],\r\n },\r\n outerStructs: [{\r\n innerStruct: { bool: true, doubles: [10, 9] },\r\n innerStructs: [{ bool: false, doubles: [5] }],\r\n }],\r\n placement: {\r\n origin: new Point3d(1, 2, 0),\r\n angles: new YawPitchRollAngles(),\r\n },\r\n jsonProperties: {\r\n stringProp: \"abc\",\r\n ints: [10, 11, 12, 13],\r\n bool: true,\r\n zoo: {\r\n address: {\r\n zipcode: 12345,\r\n },\r\n birds: [\r\n { name: \"duck\", sound: \"quack\" },\r\n { name: \"hawk\", sound: \"scree!\" },\r\n ],\r\n },\r\n },\r\n ...overrides,\r\n };\r\n\r\n const id = imodel.elements.insertElement(props);\r\n\r\n const aspectProps: TestAspectProps = {\r\n classFullName: TestAspect.classFullName,\r\n aspectProp,\r\n element: new ElementOwnsUniqueAspect(id),\r\n };\r\n imodel.elements.insertAspect(aspectProps);\r\n\r\n imodel.saveChanges();\r\n return id;\r\n}\r\n\r\ndescribe(\"updateField\", () => {\r\n const mockElementId = \"0x1\";\r\n const mockPath: FieldPropertyPath = {\r\n propertyName: \"mockProperty\",\r\n accessors: [0, \"nestedProperty\"],\r\n };\r\n const mockCachedContent = \"cachedContent\";\r\n const mockUpdatedContent = \"updatedContent\";\r\n\r\n const createMockContext = (elementId: string, propertyValue?: string) => ({\r\n hostElementId: elementId,\r\n getProperty: (field: FieldRun): FieldValue | undefined => {\r\n const propertyPath = field.propertyPath;\r\n if (\r\n propertyPath.propertyName === \"mockProperty\" &&\r\n propertyPath.accessors?.[0] === 0 &&\r\n propertyPath.accessors?.[1] === \"nestedProperty\" &&\r\n propertyValue !== undefined\r\n ) {\r\n return { value: propertyValue, type: \"string\" };\r\n }\r\n return undefined;\r\n },\r\n });\r\n\r\n it(\"does nothing if hostElementId does not match\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(\"0x2\", mockUpdatedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.false;\r\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\r\n });\r\n\r\n it(\"produces invalid content indicator if property value is undefined\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n\r\n it(\"returns false if cached content matches new content\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId, mockCachedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.false;\r\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\r\n });\r\n\r\n it(\"returns true and updates cached content if new content is different\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId, mockUpdatedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(mockUpdatedContent);\r\n });\r\n\r\n it(\"resolves to invalid content indicator if an exception occurs\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = {\r\n hostElementId: mockElementId,\r\n getProperty: () => {\r\n throw new Error(\"Test exception\");\r\n },\r\n };\r\n\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n});\r\n\r\nconst fieldsSchemaXml = `\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ECSchema schemaName=\"Fields\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.04\" alias=\"bis\"/>\r\n\r\n <ECEnumeration typeName=\"IntEnum\" backingTypeName=\"int\">\r\n <ECEnumerator name=\"one\" displayLabel=\"One\" value=\"1\" />\r\n <ECEnumerator name=\"two\" displayLabel=\"Two\" value=\"2\"/>\r\n </ECEnumeration>\r\n\r\n <ECStructClass typeName=\"InnerStruct\" modifier=\"None\">\r\n <ECProperty propertyName=\"bool\" typeName=\"boolean\"/>\r\n <ECArrayProperty propertyName=\"doubles\" typeName=\"double\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n </ECStructClass>\r\n\r\n <ECStructClass typeName=\"OuterStruct\" modifier=\"None\">\r\n <ECStructProperty propertyName=\"innerStruct\" typeName=\"InnerStruct\"/>\r\n <ECStructArrayProperty propertyName=\"innerStructs\" typeName=\"InnerStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n </ECStructClass>\r\n\r\n <ECEntityClass typeName=\"TestElement\" modifier=\"None\">\r\n <BaseClass>bis:PhysicalElement</BaseClass>\r\n <ECProperty propertyName=\"intProp\" typeName=\"int\"/>\r\n <ECProperty propertyName=\"point\" typeName=\"point3d\"/>\r\n <ECProperty propertyName=\"maybeNull\" typeName=\"int\"/>\r\n <ECProperty propertyName=\"datetime\" typeName=\"dateTime\"/>\r\n <ECArrayProperty propertyName=\"strings\" typeName=\"string\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n <ECStructProperty propertyName=\"outerStruct\" typeName=\"OuterStruct\"/>\r\n <ECStructArrayProperty propertyName=\"outerStructs\" typeName=\"OuterStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n <ECProperty propertyName=\"intEnum\" typeName=\"IntEnum\"/>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"TestAspect\" modifier=\"None\">\r\n <BaseClass>bis:ElementUniqueAspect</BaseClass>\r\n <ECProperty propertyName=\"aspectProp\" typeName=\"int\"/>\r\n </ECEntityClass>\r\n</ECSchema>\r\n`;\r\n\r\ninterface InnerStruct {\r\n bool: boolean;\r\n doubles: number[];\r\n}\r\n\r\ninterface OuterStruct {\r\n innerStruct: InnerStruct;\r\n innerStructs: InnerStruct[];\r\n}\r\n\r\ninterface TestElementProps extends PhysicalElementProps {\r\n intProp: number;\r\n point: XYAndZ;\r\n maybeNull?: number;\r\n strings: string[];\r\n datetime: Date;\r\n outerStruct: OuterStruct;\r\n outerStructs: OuterStruct[];\r\n intEnum?: number;\r\n}\r\n\r\nclass TestElement extends PhysicalElement {\r\n public static override get className() { return \"TestElement\"; }\r\n declare public intProp: number;\r\n declare public point: XYAndZ;\r\n declare public maybeNull?: number;\r\n declare public strings: string[];\r\n declare public datetime: Date;\r\n declare public outerStruct: OuterStruct;\r\n declare public outerStructs: OuterStruct[];\r\n}\r\n\r\nclass TestAspect extends ElementUniqueAspect {\r\n public static override get className() { return \"TestAspect\"; }\r\n\r\n declare public aspectProp: number;\r\n}\r\n\r\ninterface TestAspectProps extends ElementAspectProps {\r\n aspectProp: number;\r\n}\r\n\r\nclass FieldsSchema extends Schema {\r\n public static override get schemaName() { return \"Fields\"; }\r\n}\r\n\r\nasync function registerTestSchema(iModel: IModelDb): Promise<void> {\r\n if (!Schemas.getRegisteredSchema(\"Fields\")) {\r\n Schemas.registerSchema(FieldsSchema);\r\n ClassRegistry.register(TestElement, FieldsSchema);\r\n ClassRegistry.register(TestAspect, FieldsSchema);\r\n }\r\n\r\n await iModel.importSchemaStrings([fieldsSchemaXml]);\r\n iModel.saveChanges();\r\n}\r\n\r\ndescribe(\"Field evaluation\", () => {\r\n let imodel: StandaloneDb;\r\n let model: Id64String;\r\n let category: Id64String;\r\n let sourceElementId: Id64String;\r\n\r\n before(async () => {\r\n const iModelPath = IModelTestUtils.prepareOutputFile(\"UpdateFieldsContext\", \"test.bim\");\r\n imodel = StandaloneDb.createEmpty(iModelPath, { rootSubject: { name: \"UpdateFieldsContext\" }, allowEdit: JSON.stringify({ txns: true } )});\r\n\r\n await registerTestSchema(imodel);\r\n\r\n model = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), true)[1];\r\n category = SpatialCategory.insert(imodel, StandaloneDb.dictionaryId, \"UpdateFieldsContextCategory\", new SubCategoryAppearance());\r\n sourceElementId = insertTestElement();\r\n\r\n await imodel.fonts.embedFontFile({\r\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\r\n });\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n function insertTestElement(overrides?: Partial<TestElementProps>, aspectProp?: number): Id64String {\r\n return createTestElement(imodel, model, category, overrides, aspectProp);\r\n }\r\n\r\n function evaluateField(propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): FieldValue | undefined {\r\n if (typeof propertyHost === \"string\") {\r\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\r\n }\r\n\r\n const field = FieldRun.create({\r\n propertyPath,\r\n propertyHost,\r\n });\r\n\r\n const context = createUpdateContext(propertyHost.elementId, imodel, deletedDependency);\r\n return context.getProperty(field);\r\n }\r\n\r\n describe(\"getProperty\", () => {\r\n function expectValue(expected: any, propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): void {\r\n expect(evaluateField(propertyPath, propertyHost, deletedDependency)?.value).to.deep.equal(expected);\r\n }\r\n\r\n it(\"returns a primitive property value\", () => {\r\n expectValue(100, { propertyName: \"intProp\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns an integer enum property value\", () => {\r\n expectValue(1, { propertyName: \"intEnum\" }, sourceElementId);\r\n });\r\n\r\n it(\"treats points as primitive values\", () => {\r\n expectValue({ x: 1, y: 2, z: 3 }, { propertyName: \"point\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"point\", accessors: [\"x\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns a primitive array value\", () => {\r\n expectValue(\"a\", { propertyName: \"strings\", accessors: [0] }, sourceElementId);\r\n expectValue(\"b\", { propertyName: \"strings\", accessors: [1] }, sourceElementId);\r\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [2] }, sourceElementId);\r\n });\r\n\r\n it(\"supports negative array indices\", () => {\r\n expectValue(\"a\", { propertyName: \"strings\", accessors: [-3] }, sourceElementId);\r\n expectValue(\"b\", { propertyName: \"strings\", accessors: [-2] }, sourceElementId);\r\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [-1] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the dependency was deleted\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\" }, sourceElementId, true);\r\n });\r\n\r\n it(\"returns undefined if the host element does not exist\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\" }, \"0xbaadf00d\");\r\n });\r\n\r\n it(\"returns undefined if the host element is not of the specified class or a subclass thereof\", () => {\r\n expectValue(undefined, { propertyName: \"origin\" }, { schemaName: \"BisCore\", className: \"GeometricElement2d\", elementId: sourceElementId });\r\n });\r\n\r\n it(\"returns undefined if an access string is specified for a non-object property\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\", accessors: [\"property\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the specified property does not exist\", () => {\r\n expectValue(undefined, { propertyName: \"nonExistentProperty\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the specified property is null\", () => {\r\n expectValue(undefined, { propertyName: \"maybeNull\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if an array index is specified for a non-array property\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\", accessors: [0] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if an array index is out of bounds\", () => {\r\n for (const index of [3, 4, -4, -5]) {\r\n expectValue(undefined, { propertyName: \"strings\", accessors: [index] }, sourceElementId);\r\n }\r\n });\r\n\r\n it(\"returns undefined for a non-primitive value\", () => {\r\n expectValue(undefined, { propertyName: \"strings\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStruct\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStruct\", accessors: [\"innerStruct\"] }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0] }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns arbitrarily-nested properties of structs and struct arrays\", () => {\r\n expectValue(false, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] }, sourceElementId);\r\n for (const index of [0, 1, 2]) {\r\n expectValue(index + 1, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", index] },sourceElementId);\r\n expectValue(3 - index, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", -1 - index] },sourceElementId);\r\n }\r\n\r\n expectValue(9, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\", \"doubles\", 1] }, sourceElementId);\r\n expectValue(false, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", -1, \"bool\"] }, sourceElementId);\r\n expectValue(5, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", 0, \"doubles\", 0] }, sourceElementId);\r\n });\r\n\r\n it(\"returns the value of a property of an aspect\", () => {\r\n expect(imodel.elements.getAspects(sourceElementId, \"Fields:TestAspect\").length).to.equal(1);\r\n expectValue(999, { propertyName: \"aspectProp\" }, { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestAspect\" });\r\n });\r\n\r\n it(\"should fail to evaluate if prop type does not match\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"string\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n formatOptions: {\r\n case: \"upper\",\r\n prefix: \"Value: \",\r\n suffix: \"!\"\r\n }\r\n });\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n\r\n const updated = updateField(fieldRun, context);\r\n\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n\r\n function getPropertyType(propertyHost: FieldPropertyHost, propertyPath: string | FieldPropertyPath): FieldPropertyType | undefined {\r\n if (typeof propertyPath === \"string\") {\r\n propertyPath = { propertyName: propertyPath };\r\n }\r\n\r\n return evaluateField(propertyPath, propertyHost)?.type;\r\n }\r\n\r\n it(\"deduces type for primitive properties\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"intProp\")).to.equal(\"string\");\r\n expect(getPropertyType(propertyHost, \"point\")).to.equal(\"coordinate\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"strings\", accessors: [0] })).to.equal(\"string\");\r\n expect(getPropertyType(propertyHost, \"intEnum\")).to.equal(\"int-enum\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", 0] })).to.equal(\"quantity\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] })).to.equal(\"boolean\");\r\n\r\n propertyHost.schemaName = \"BisCore\";\r\n propertyHost.className = \"GeometricElement3d\";\r\n expect(getPropertyType(propertyHost, \"LastMod\")).to.equal(\"datetime\");\r\n expect(getPropertyType(propertyHost, \"FederationGuid\")).to.equal(\"string\");\r\n });\r\n\r\n it(\"returns undefined for non-primitive properties\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"outerStruct\")).to.equal(undefined);\r\n expect(getPropertyType(propertyHost, \"outerStructs\")).to.equal(undefined);\r\n });\r\n\r\n it(\"returns undefined for invalid property paths\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"unknownPropertyName\")).to.be.undefined;\r\n });\r\n\r\n it(\"should return undefined for unsupported primitive types\", () => {\r\n const host = { elementId: sourceElementId, schemaName: \"BisCore\", className: \"GeometricElement3d\" };\r\n expect(getPropertyType(host, \"GeometryStream\")).to.be.undefined;\r\n });\r\n });\r\n\r\n describe(\"updateFields\", () => {\r\n it(\"recomputes cached content\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"oldValue\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(1);\r\n expect(fieldRun.cachedContent).to.equal(\"100\"); // `intProp` value from the test element\r\n });\r\n\r\n it(\"does not update a field if recomputed content matches cached content\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"100\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(0);\r\n expect(fieldRun.cachedContent).to.equal(\"100\");\r\n });\r\n\r\n it(\"returns the number of fields updated\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun1 = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"100\",\r\n });\r\n\r\n const fieldRun2 = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"strings\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun1);\r\n textBlock.appendRun(fieldRun2);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(1);\r\n expect(fieldRun1.cachedContent).to.equal(\"100\");\r\n expect(fieldRun2.cachedContent).to.equal(\"a\");\r\n });\r\n });\r\n\r\n function createAnnotationElement(textBlock: TextBlock | undefined): TextAnnotation3d {\r\n const elem = TextAnnotation3d.fromJSON({\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n placement: {\r\n origin: { x: 0, y: 0, z: 0 },\r\n angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\r\n },\r\n classFullName: TextAnnotation3d.classFullName,\r\n defaultTextStyle: new TextAnnotationUsesTextStyleByDefault(\"0x123\").toJSON(),\r\n }, imodel);\r\n\r\n if (textBlock) {\r\n const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });\r\n elem.setAnnotation(annotation);\r\n }\r\n\r\n return elem;\r\n }\r\n\r\n function insertAnnotationElement(textBlock: TextBlock | undefined): Id64String {\r\n const elem = createAnnotationElement(textBlock);\r\n return elem.insert();\r\n }\r\n\r\n describe(\"ElementDrivesTextAnnotation\", () => {\r\n function expectNumRelationships(expected: number, targetId?: Id64String): void {\r\n const where = targetId ? ` WHERE TargetECInstanceId=${targetId}` : \"\";\r\n const ecsql = `SELECT COUNT(*) FROM BisCore.ElementDrivesTextAnnotation ${where}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel.withPreparedStatement(ecsql, (stmt) => {\r\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);\r\n expect(stmt.getValue(0).getInteger()).to.equal(expected);\r\n });\r\n }\r\n\r\n it(\"can be inserted\", () => {\r\n expectNumRelationships(0);\r\n\r\n const targetId = insertAnnotationElement(undefined);\r\n expect(targetId).not.to.equal(Id64.invalid);\r\n\r\n const target = imodel.elements.getElement(targetId);\r\n expect(target.classFullName).to.equal(\"BisCore:TextAnnotation3d\");\r\n expect(target).instanceof(TextAnnotation3d);\r\n\r\n const targetAnno = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(targetAnno).instanceof(TextAnnotation3d);\r\n\r\n const rel = ElementDrivesTextAnnotation.create(imodel, sourceElementId, targetId);\r\n const relId = rel.insert();\r\n expect(relId).not.to.equal(Id64.invalid);\r\n\r\n expectNumRelationships(1);\r\n\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementDrivesTextAnnotation\", relId);\r\n expect(relationship.sourceId).to.equal(sourceElementId);\r\n expect(relationship.targetId).to.equal(targetId);\r\n });\r\n\r\n function createField(propertyHost: Id64String | FieldPropertyHost, cachedContent: string, propertyName = \"intProp\", accessors?: Array<string | number>): FieldRun {\r\n if (typeof propertyHost === \"string\") {\r\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\r\n }\r\n\r\n return FieldRun.create({\r\n styleOverrides: { font: { name: \"Karla\" } },\r\n propertyHost,\r\n cachedContent,\r\n propertyPath: { propertyName, accessors },\r\n });\r\n }\r\n\r\n describe(\"updateFieldDependencies\", () => {\r\n it(\"creates exactly one relationship for each unique source element on insert and update\", () => {\r\n const source1 = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(source1, \"1\"));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n\r\n const source2 = insertTestElement();\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n const anno = target.getAnnotation()!;\r\n anno.textBlock.appendRun(createField(source2, \"2a\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n\r\n anno.textBlock.appendRun(createField(source2, \"2b\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n\r\n const source3 = insertTestElement();\r\n anno.textBlock.appendRun(createField(source3, \"3\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(3, targetId);\r\n });\r\n\r\n it(\"deletes stale relationships\", () => {\r\n const sourceA = insertTestElement();\r\n const sourceB = insertTestElement();\r\n\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceA, \"A\"));\r\n block.appendRun(createField(sourceB, \"B\"));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n const anno = target.getAnnotation()!;\r\n\r\n // Remove the sourceA FieldRun from the first paragraph.\r\n const p1 = anno.textBlock.children[0];\r\n p1.children.shift();\r\n\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\r\n\r\n anno.textBlock.children.length = 0;\r\n anno.textBlock.appendRun(createField(sourceA, \"A2\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\r\n\r\n anno.textBlock.children.length = 0;\r\n anno.textBlock.appendRun(TextRun.create({\r\n styleOverrides: { font: { name: \"Karla\" } },\r\n content: \"not a field\",\r\n }));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(0, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\r\n });\r\n\r\n it(\"ignores invalid source element Ids\", () => {\r\n const source = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(Id64.invalid, \"invalid\"));\r\n block.appendRun(createField(\"0xbaadf00d\", \"non-existent\"));\r\n block.appendRun(createField(source, \"valid\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectNumRelationships(1, targetId);\r\n });\r\n });\r\n\r\n function expectText(expected: string, elemId: Id64String, db?: StandaloneDb): void {\r\n db = db ?? imodel;\r\n const elem = db.elements.getElement<TextAnnotation3d>(elemId);\r\n const anno = elem.getAnnotation()!;\r\n const actual = anno.textBlock.stringify();\r\n expect(actual).to.equal(expected);\r\n }\r\n\r\n it(\"evaluates cachedContent when annotation element is inserted\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"initial cached content\"));\r\n expect(block.stringify()).to.equal(\"initial cached content\");\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()!.textBlock.stringify()).to.equal(\"100\");\r\n });\r\n\r\n it(\"updates fields when source element is modified or deleted\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"old value\"));;\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()).not.to.be.undefined;\r\n\r\n expectText(\"100\", targetId);\r\n\r\n let source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.intProp = 50;\r\n source.update();\r\n\r\n expectText(\"100\", targetId);\r\n\r\n imodel.saveChanges();\r\n\r\n source = imodel.elements.getElement<TestElement>(sourceId);\r\n expect(source.intProp).to.equal(50);\r\n\r\n expectText(\"50\", targetId);\r\n\r\n imodel.elements.deleteElement(sourceId);\r\n expectText(\"50\", targetId);\r\n\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n });\r\n\r\n it(\"updates fields when source element aspect is modified, deleted, or recreated\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField({ elementId: sourceId, schemaName: \"Fields\", className: \"TestAspect\" }, \"\", \"aspectProp\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"999\", targetId);\r\n\r\n const aspects = imodel.elements.getAspects(sourceId, \"Fields:TestAspect\");\r\n expect(aspects.length).to.equal(1);\r\n const aspect = aspects[0] as TestAspect;\r\n expect(aspect.aspectProp).to.equal(999);\r\n\r\n aspect.aspectProp = 12345;\r\n imodel.elements.updateAspect(aspect.toJSON());\r\n imodel.saveChanges();\r\n expectText(\"12345\", targetId);\r\n\r\n imodel.elements.deleteAspect([aspect.id]);\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n\r\n const newAspect: TestAspectProps = {\r\n element: new ElementOwnsUniqueAspect(sourceId),\r\n classFullName: TestAspect.classFullName,\r\n aspectProp: 42,\r\n };\r\n imodel.elements.insertAspect(newAspect);\r\n imodel.saveChanges();\r\n expectText(\"42\", targetId);\r\n });\r\n\r\n it(\"updates only fields for specific modified element\", () => {\r\n const sourceA = insertTestElement();\r\n const sourceB = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceA, \"A\"));\r\n block.appendRun(createField(sourceB, \"B\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"100100\", targetId);\r\n\r\n const sourceElem = imodel.elements.getElement<TestElement>(sourceB);\r\n sourceElem.intProp = 123;\r\n sourceElem.update();\r\n imodel.saveChanges();\r\n\r\n expectText(\"100123\", targetId);\r\n });\r\n\r\n it(\"supports complex property paths\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"\", \"outerStruct\", [\"innerStructs\", 1, \"doubles\", -2]));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"2\", targetId);\r\n\r\n const source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.outerStruct.innerStructs[1].doubles[3] = 12.5;\r\n source.update();\r\n imodel.saveChanges();\r\n expectText(\"12.5\", targetId);\r\n });\r\n\r\n describe(\"remapFields\", () => {\r\n let dstIModel: StandaloneDb;\r\n let dstModel: Id64String;\r\n let dstCategory: Id64String;\r\n let dstSourceElementId: Id64String;\r\n\r\n before(async () => {\r\n const path = IModelTestUtils.prepareOutputFile(\"RemapFields\", `dst.bim`);\r\n dstIModel = StandaloneDb.createEmpty(path, { rootSubject: { name: `RemapFields-dst` }, allowEdit: JSON.stringify({ txns: true })});\r\n await registerTestSchema(dstIModel);\r\n\r\n // Insert additional unused elements to ensure element Ids differ between src and dst iModels\r\n for (let i = 0; i < 3; i++) {\r\n IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\r\n }\r\n\r\n const modelAndElement = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\r\n expect(modelAndElement[0]).to.equal(modelAndElement[1]);\r\n\r\n dstModel = modelAndElement[1];\r\n dstCategory = SpatialCategory.insert(dstIModel, StandaloneDb.dictionaryId, `dstCat`, new SubCategoryAppearance());\r\n dstSourceElementId = createTestElement(dstIModel, dstModel, dstCategory, {\r\n intProp: 200,\r\n point: { x: -1, y: -2, z: -3 },\r\n strings: [\"x\", \"y\", \"z\"],\r\n intEnum: 2,\r\n }, 1234);\r\n\r\n await dstIModel.fonts.embedFontFile({\r\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\r\n });\r\n\r\n expect(dstCategory).not.to.equal(category);\r\n expect(dstModel).not.to.equal(model);\r\n expect(dstSourceElementId).not.to.equal(sourceElementId);\r\n });\r\n\r\n after(() => {\r\n dstIModel.close();\r\n });\r\n\r\n function getTextBlockJson(): TextBlockProps {\r\n return {\r\n children: [{\r\n children: [{\r\n type: \"field\",\r\n propertyHost: {\r\n elementId: sourceElementId,\r\n schemaName: \"Fields\",\r\n className: \"TestElement\",\r\n },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"intProp\",\r\n }, {\r\n type: \"field\",\r\n propertyHost: {\r\n elementId: category,\r\n schemaName: \"BisCore\",\r\n className: \"Element\",\r\n },\r\n propertyPath: { propertyName: \"CodeValue\" },\r\n cachedContent: \"CodeValue\"\r\n }],\r\n }],\r\n };\r\n }\r\n\r\n function expectHostIds(elem: TextAnnotation3d, host1: Id64String, host2: Id64String): void {\r\n const anno = elem.getAnnotation()!;\r\n expect(anno.textBlock.children.length).to.equal(1);\r\n const para = anno.textBlock.children[0];\r\n expect(para.children.length).to.equal(2);\r\n expect(para.children.every((x) => x.type === \"field\"));\r\n const field1 = para.children[0] as FieldRun;\r\n expect(field1.propertyHost.elementId).to.equal(host1);\r\n const field2 = para.children[1] as FieldRun;\r\n expect(field2.propertyHost.elementId).to.equal(host2);\r\n }\r\n\r\n it(\"remaps field hosts\", () => {\r\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\r\n expectHostIds(elem, sourceElementId, category);\r\n\r\n const context = new IModelElementCloneContext(imodel, dstIModel);\r\n context.remapElement(sourceElementId, dstSourceElementId);\r\n context.remapElement(category, dstCategory);\r\n\r\n ElementDrivesTextAnnotation.remapFields(elem, context);\r\n expectHostIds(elem, dstSourceElementId, dstCategory);\r\n });\r\n\r\n it(\"invalidates field host if source element not remapped\", () => {\r\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\r\n expectHostIds(elem, sourceElementId, category);\r\n\r\n const context = new IModelElementCloneContext(imodel, dstIModel);\r\n\r\n ElementDrivesTextAnnotation.remapFields(elem, context);\r\n expectHostIds(elem, Id64.invalid, Id64.invalid);\r\n });\r\n });\r\n });\r\n\r\n describe(\"Format Validation\", () => {\r\n it(\"validates formatting options for string property type\", () => {\r\n // Create a FieldRun with string property type and some format options\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"strings\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n formatOptions: {\r\n case: \"upper\",\r\n prefix: \"Value: \",\r\n suffix: \"!\"\r\n }\r\n });\r\n\r\n // Context returns a string value for the property\r\n const context = {\r\n hostElementId: sourceElementId,\r\n getProperty: () => { return { value: \"abc\", type: \"string\" as const } },\r\n };\r\n\r\n // Update the field and check the result\r\n const updated = updateField(fieldRun, context);\r\n\r\n // The formatted value should be uppercased and have prefix/suffix applied\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(\"Value: ABC!\");\r\n });\r\n\r\n it(\"validates formatting options for datetime objects\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n const fieldRun = FieldRun.create({\r\n propertyHost,\r\n propertyPath: { propertyName: \"datetime\"},\r\n cachedContent: \"oldval\",\r\n formatOptions: {\r\n dateTime: {\r\n formatOptions:{\r\n month: \"short\",\r\n day: \"2-digit\",\r\n year: \"numeric\",\r\n timeZone: \"UTC\"\r\n },\r\n locale: \"en-US\",\r\n },\r\n },\r\n });\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updated = updateField(fieldRun, context);\r\n\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(\"Aug 28, 2025\");\r\n });\r\n });\r\n});\r\n"]}