@itwin/core-backend 5.2.0 → 5.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +7 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +25 -0
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +20 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +84 -2
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
- package/lib/cjs/internal/annotations/fields.js +1 -0
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +7 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +25 -0
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +20 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +86 -5
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
- package/lib/esm/internal/annotations/fields.js +1 -0
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +146 -51
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +227 -2
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +41 -1
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
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,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC9N,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,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC9G,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,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;QACxB,MAAM,KAAK,GAAqB;YAC9B,aAAa,EAAE,oBAAoB;YACnC,KAAK;YACL,QAAQ;YACR,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;YAClC,QAAQ,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;YAC9C,OAAO,EAAE,CAAC;YACV,WAAW,EAAE;gBACX,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;gBAChD,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;aACvF;YACD,YAAY,EAAE,CAAC;oBACb,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;oBAC7C,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC9C,CAAC;YACF,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM,EAAE,IAAI,kBAAkB,EAAE;aACjC;YACD,cAAc,EAAE;gBACd,UAAU,EAAE,KAAK;gBACjB,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;gBACtB,IAAI,EAAE,IAAI;gBACV,GAAG,EAAE;oBACH,OAAO,EAAE;wBACP,OAAO,EAAE,KAAK;qBACf;oBACD,KAAK,EAAE;wBACL,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;wBAChC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;qBAClC;iBACF;aACF;SACF,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAEhD,MAAM,WAAW,GAAoB;YACnC,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,IAAI,uBAAuB,CAAC,EAAE,CAAC;SACzC,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAE1C,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,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,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;YACtD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAmB,MAAM,CAAC,CAAC;YAClE,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;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, 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":"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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, 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"]}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { expect } from "chai";
|
|
6
6
|
import { Angle, Point3d, Range2d, Range3d, YawPitchRollAngles } from "@itwin/core-geometry";
|
|
7
|
-
import { FractionRun, SubCategoryAppearance, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
7
|
+
import { FieldRun, FractionRun, SubCategoryAppearance, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
8
8
|
import { StandaloneDb } from "../../IModelDb";
|
|
9
|
-
import { AnnotationTextStyle, TEXT_ANNOTATION_JSON_VERSION, TEXT_STYLE_SETTINGS_JSON_VERSION, TextAnnotation2d, TextAnnotation3d } from "../../annotations/TextAnnotationElement";
|
|
9
|
+
import { AnnotationTextStyle, parseTextAnnotationData, TEXT_ANNOTATION_JSON_VERSION, TEXT_STYLE_SETTINGS_JSON_VERSION, TextAnnotation2d, TextAnnotation3d } from "../../annotations/TextAnnotationElement";
|
|
10
10
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
11
11
|
import { Subject } from "../../Element";
|
|
12
12
|
import { Guid, Id64 } from "@itwin/core-bentley";
|
|
@@ -19,6 +19,7 @@ import { computeTextRangeAsStringLength, MockBuilder } from "../AnnotationTestUt
|
|
|
19
19
|
import { TextAnnotationUsesTextStyleByDefault } from "../../annotations/ElementDrivesTextAnnotation";
|
|
20
20
|
import { layoutTextBlock, TextStyleResolver } from "../../annotations/TextBlockLayout";
|
|
21
21
|
import { appendTextAnnotationGeometry } from "../../annotations/TextAnnotationGeometry";
|
|
22
|
+
import { IModelElementCloneContext } from "../../IModelElementCloneContext";
|
|
22
23
|
function mockIModel() {
|
|
23
24
|
const iModel = {
|
|
24
25
|
fonts: {
|
|
@@ -212,6 +213,58 @@ describe("TextAnnotation element", () => {
|
|
|
212
213
|
expect(elem.getAnnotation().toJSON()).not.to.equal(annotation.toJSON());
|
|
213
214
|
});
|
|
214
215
|
});
|
|
216
|
+
describe("getReferenceIds", () => {
|
|
217
|
+
function expectReferenceIds(expected, element) {
|
|
218
|
+
const actual = Array.from(element.getReferenceIds()).sort();
|
|
219
|
+
// reference Ids get a prefix indicating their type ('e' for 'element')
|
|
220
|
+
expected = expected.map((id) => `e${id}`);
|
|
221
|
+
// the superclasses provide some reference Ids (code spec, model, category)
|
|
222
|
+
const baseIds = ["e0x12", "e0x78", "m0x34"];
|
|
223
|
+
expected.push(...baseIds);
|
|
224
|
+
expected = expected.sort();
|
|
225
|
+
expect(actual).to.deep.equal(expected);
|
|
226
|
+
}
|
|
227
|
+
it("reports default text style and field hosts", () => {
|
|
228
|
+
// makeElement sets defaultTextStyle to "0x21"
|
|
229
|
+
const elem = makeElement();
|
|
230
|
+
expectReferenceIds(["0x21"], elem);
|
|
231
|
+
elem.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault("0x123");
|
|
232
|
+
expectReferenceIds(["0x123"], elem);
|
|
233
|
+
const textBlock = TextBlock.create();
|
|
234
|
+
textBlock.appendRun(FieldRun.create({
|
|
235
|
+
propertyHost: { elementId: "0x456", schemaName: "BisCore", className: "GeometricElement3d" },
|
|
236
|
+
propertyPath: { propertyName: "CodeValue" },
|
|
237
|
+
}));
|
|
238
|
+
textBlock.appendRun(FieldRun.create({
|
|
239
|
+
propertyHost: { elementId: "0x789", schemaName: "BisCore", className: "GeometricElement3d" },
|
|
240
|
+
propertyPath: { propertyName: "LastMod" },
|
|
241
|
+
}));
|
|
242
|
+
elem.setAnnotation(TextAnnotation.create({ textBlock }));
|
|
243
|
+
expectReferenceIds(["0x123", "0x456", "0x789"], elem);
|
|
244
|
+
elem.defaultTextStyle = undefined;
|
|
245
|
+
expectReferenceIds(["0x456", "0x789"], elem);
|
|
246
|
+
elem.setAnnotation(TextAnnotation.create());
|
|
247
|
+
expectReferenceIds([], elem);
|
|
248
|
+
});
|
|
249
|
+
it("does not report invalid Ids", () => {
|
|
250
|
+
const elem = makeElement();
|
|
251
|
+
elem.defaultTextStyle = undefined;
|
|
252
|
+
expectReferenceIds([], elem);
|
|
253
|
+
elem.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault("0");
|
|
254
|
+
expectReferenceIds([], elem);
|
|
255
|
+
const textBlock = TextBlock.create();
|
|
256
|
+
textBlock.appendRun(FieldRun.create({
|
|
257
|
+
propertyHost: { elementId: "0", schemaName: "BisCore", className: "GeometricElement3d" },
|
|
258
|
+
propertyPath: { propertyName: "CodeValue" },
|
|
259
|
+
}));
|
|
260
|
+
textBlock.appendRun(FieldRun.create({
|
|
261
|
+
propertyHost: { elementId: "0x123", schemaName: "BisCore", className: "GeometricElement3d" },
|
|
262
|
+
propertyPath: { propertyName: "LastMod" },
|
|
263
|
+
}));
|
|
264
|
+
elem.setAnnotation(TextAnnotation.create({ textBlock }));
|
|
265
|
+
expectReferenceIds(["0x123"], elem);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
215
268
|
describe("TextAnnotation3d Persistence", () => {
|
|
216
269
|
let imodel;
|
|
217
270
|
let createElement3dArgs;
|
|
@@ -399,6 +452,178 @@ describe("TextAnnotation element", () => {
|
|
|
399
452
|
expect(el1 instanceof TextAnnotation2d).to.be.true;
|
|
400
453
|
expect(el1.defaultTextStyle).to.be.undefined;
|
|
401
454
|
});
|
|
455
|
+
describe("onCloned", () => {
|
|
456
|
+
function insertStyledElement(styleId, db) {
|
|
457
|
+
const args = { ...createElement2dArgs, defaultTextStyleId: styleId };
|
|
458
|
+
const elem = createElement2d(db, args);
|
|
459
|
+
elem.insert();
|
|
460
|
+
imodel.saveChanges();
|
|
461
|
+
return elem;
|
|
462
|
+
}
|
|
463
|
+
describe("within a single iModel", () => {
|
|
464
|
+
it("leaves property hosts intact", () => {
|
|
465
|
+
const textBlock = TextBlock.create({
|
|
466
|
+
children: [{
|
|
467
|
+
children: [{
|
|
468
|
+
type: "field",
|
|
469
|
+
propertyHost: {
|
|
470
|
+
elementId: "0x123",
|
|
471
|
+
schemaName: "Fields",
|
|
472
|
+
className: "TestElement",
|
|
473
|
+
},
|
|
474
|
+
propertyPath: { propertyName: "intProp" },
|
|
475
|
+
}, {
|
|
476
|
+
type: "field",
|
|
477
|
+
propertyHost: {
|
|
478
|
+
elementId: "0xabc",
|
|
479
|
+
schemaName: "BisCore",
|
|
480
|
+
className: "Element",
|
|
481
|
+
},
|
|
482
|
+
propertyPath: { propertyName: "CodeValue" },
|
|
483
|
+
}],
|
|
484
|
+
}],
|
|
485
|
+
});
|
|
486
|
+
const annotation = TextAnnotation.create({ textBlock });
|
|
487
|
+
const elem = createElement2d(imodel, { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() });
|
|
488
|
+
elem.insert();
|
|
489
|
+
imodel.saveChanges();
|
|
490
|
+
const context = new IModelElementCloneContext(imodel);
|
|
491
|
+
context.remapElement("0x123", "0x456");
|
|
492
|
+
context.remapElement("0xabc", "0xdef");
|
|
493
|
+
context.remapElement(createElement2dArgs.model, createElement2dArgs.model);
|
|
494
|
+
const props = context.cloneElement(elem);
|
|
495
|
+
expect(props.textAnnotationData).not.to.be.undefined;
|
|
496
|
+
const anno = TextAnnotation.fromJSON(parseTextAnnotationData(props.textAnnotationData)?.data);
|
|
497
|
+
const para = anno.textBlock.children[0];
|
|
498
|
+
expect(para.children[0].propertyHost.elementId).to.equal("0x123");
|
|
499
|
+
expect(para.children[1].propertyHost.elementId).to.equal("0xabc");
|
|
500
|
+
});
|
|
501
|
+
it("leaves default text style intact", () => {
|
|
502
|
+
function clone(styleId, expectedStyleId) {
|
|
503
|
+
const elem = insertStyledElement(styleId, imodel);
|
|
504
|
+
const context = new IModelElementCloneContext(imodel);
|
|
505
|
+
context.remapElement(createElement2dArgs.model, createElement2dArgs.model);
|
|
506
|
+
const props = context.cloneElement(elem);
|
|
507
|
+
expect(props.defaultTextStyle?.id).to.equal(expectedStyleId);
|
|
508
|
+
if (styleId) {
|
|
509
|
+
// Even an explicit remapping is ignored when cloning within a single iModel
|
|
510
|
+
// (per the examples set by most other elements, excluding RenderMaterial).
|
|
511
|
+
context.remapElement(styleId, "0x99887");
|
|
512
|
+
const props2 = context.cloneElement(elem);
|
|
513
|
+
expect(props2.defaultTextStyle?.id).to.equal(expectedStyleId);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
clone(seedStyleId, seedStyleId);
|
|
517
|
+
clone(undefined, undefined);
|
|
518
|
+
clone("0x12345", "0x12345");
|
|
519
|
+
clone(Id64.invalid, undefined);
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
describe("between iModels", () => {
|
|
523
|
+
let dstDb;
|
|
524
|
+
let dstDefModel;
|
|
525
|
+
let dstElemArgs;
|
|
526
|
+
before(async () => {
|
|
527
|
+
dstDb = await createIModel("CloneTarget");
|
|
528
|
+
const jobSubjectId = createJobSubjectElement(dstDb, "Job").insert();
|
|
529
|
+
dstDefModel = DefinitionModel.insert(dstDb, jobSubjectId, "Definition");
|
|
530
|
+
const { category, model } = insertDrawingModel(dstDb, jobSubjectId, dstDefModel);
|
|
531
|
+
expect(category).not.to.equal(createElement2dArgs.category);
|
|
532
|
+
expect(model).not.to.equal(createElement2dArgs.model);
|
|
533
|
+
dstElemArgs = { category, model };
|
|
534
|
+
});
|
|
535
|
+
after(() => dstDb.close());
|
|
536
|
+
it("remaps property hosts", () => {
|
|
537
|
+
const textBlock = TextBlock.create({
|
|
538
|
+
children: [{
|
|
539
|
+
children: [{
|
|
540
|
+
type: "field",
|
|
541
|
+
propertyHost: {
|
|
542
|
+
elementId: "0x123",
|
|
543
|
+
schemaName: "Fields",
|
|
544
|
+
className: "TestElement",
|
|
545
|
+
},
|
|
546
|
+
propertyPath: { propertyName: "intProp" },
|
|
547
|
+
}, {
|
|
548
|
+
type: "field",
|
|
549
|
+
propertyHost: {
|
|
550
|
+
elementId: "0xabc",
|
|
551
|
+
schemaName: "BisCore",
|
|
552
|
+
className: "Element",
|
|
553
|
+
},
|
|
554
|
+
propertyPath: { propertyName: "CodeValue" },
|
|
555
|
+
}],
|
|
556
|
+
}],
|
|
557
|
+
});
|
|
558
|
+
const annotation = TextAnnotation.create({ textBlock });
|
|
559
|
+
const elem = createElement2d(imodel, { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() });
|
|
560
|
+
elem.insert();
|
|
561
|
+
imodel.saveChanges();
|
|
562
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
563
|
+
context.remapElement("0x123", "0x456");
|
|
564
|
+
context.remapElement("0xabc", "0xdef");
|
|
565
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
566
|
+
const props = context.cloneElement(elem);
|
|
567
|
+
expect(props.textAnnotationData).not.to.be.undefined;
|
|
568
|
+
const anno = TextAnnotation.fromJSON(parseTextAnnotationData(props.textAnnotationData)?.data);
|
|
569
|
+
const para = anno.textBlock.children[0];
|
|
570
|
+
expect(para.children[0].propertyHost.elementId).to.equal("0x456");
|
|
571
|
+
expect(para.children[1].propertyHost.elementId).to.equal("0xdef");
|
|
572
|
+
});
|
|
573
|
+
it("sets default text style to undefined if source style does not exist", () => {
|
|
574
|
+
const elem = insertStyledElement("0x12345", imodel);
|
|
575
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
576
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
577
|
+
const props = context.cloneElement(elem);
|
|
578
|
+
expect(props.defaultTextStyle).to.be.undefined;
|
|
579
|
+
});
|
|
580
|
+
it("remaps to an existing text style with the same code if present", () => {
|
|
581
|
+
const dstStyleId = createAnnotationTextStyle(dstDb, dstDefModel, "test", { font: { name: "Karla" } }).insert();
|
|
582
|
+
expect(dstStyleId).not.to.equal(seedStyleId);
|
|
583
|
+
const srcElem = insertStyledElement(seedStyleId, imodel);
|
|
584
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
585
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
586
|
+
const props = context.cloneElement(srcElem);
|
|
587
|
+
expect(props.defaultTextStyle?.id).to.equal(dstStyleId);
|
|
588
|
+
});
|
|
589
|
+
it("throws an error if definition model is not remapped", () => {
|
|
590
|
+
const srcElem = insertStyledElement(seedStyleId2, imodel);
|
|
591
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
592
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
593
|
+
expect(() => context.cloneElement(srcElem)).to.throw("Invalid target model");
|
|
594
|
+
});
|
|
595
|
+
it("imports default text style if necessary", () => {
|
|
596
|
+
const srcElem = insertStyledElement(seedStyleId2, imodel);
|
|
597
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
598
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
599
|
+
context.remapElement(seedDefinitionModelId, dstDefModel);
|
|
600
|
+
const props = context.cloneElement(srcElem);
|
|
601
|
+
const dstStyleId = props.defaultTextStyle.id;
|
|
602
|
+
expect(dstStyleId).not.to.be.undefined;
|
|
603
|
+
expect(dstStyleId).not.to.equal(seedStyleId2);
|
|
604
|
+
expect(dstDb.elements.tryGetElement(dstStyleId)).not.to.be.undefined;
|
|
605
|
+
});
|
|
606
|
+
it("remaps multiple occurrences of same style to same Id", () => {
|
|
607
|
+
const srcStyleId = createAnnotationTextStyle(imodel, seedDefinitionModelId, "styyyle", { font: { name: "Karla" } }).insert();
|
|
608
|
+
const srcElem1 = insertStyledElement(srcStyleId, imodel);
|
|
609
|
+
const srcElem2 = insertStyledElement(srcStyleId, imodel);
|
|
610
|
+
const srcElem3 = insertStyledElement(srcStyleId, imodel);
|
|
611
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
612
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
613
|
+
context.remapElement(seedDefinitionModelId, dstDefModel);
|
|
614
|
+
const props1 = context.cloneElement(srcElem1);
|
|
615
|
+
const props2 = context.cloneElement(srcElem2);
|
|
616
|
+
expect(props1.defaultTextStyle).not.to.be.undefined;
|
|
617
|
+
expect(props1.defaultTextStyle?.id).not.to.equal(srcStyleId);
|
|
618
|
+
expect(props2.defaultTextStyle?.id).to.equal(props1.defaultTextStyle?.id);
|
|
619
|
+
const context2 = new IModelElementCloneContext(imodel, dstDb);
|
|
620
|
+
context2.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
621
|
+
context2.remapElement(seedDefinitionModelId, dstDefModel);
|
|
622
|
+
const props3 = context2.cloneElement(srcElem3);
|
|
623
|
+
expect(props3.defaultTextStyle?.id).to.equal(props1.defaultTextStyle?.id);
|
|
624
|
+
});
|
|
625
|
+
});
|
|
626
|
+
});
|
|
402
627
|
});
|
|
403
628
|
describe("TextAnnotation3d", () => {
|
|
404
629
|
let createElement3dArgs;
|