@fluidframework/tree 2.74.0-368706 → 2.74.0-370705

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +1 -0
  2. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  3. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +5 -1
  4. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  5. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
  6. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  7. package/dist/feature-libraries/default-schema/index.d.ts +1 -1
  8. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  9. package/dist/feature-libraries/default-schema/index.js +2 -1
  10. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  11. package/dist/feature-libraries/index.d.ts +1 -1
  12. package/dist/feature-libraries/index.d.ts.map +1 -1
  13. package/dist/feature-libraries/index.js +2 -1
  14. package/dist/feature-libraries/index.js.map +1 -1
  15. package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
  16. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  17. package/dist/feature-libraries/modular-schema/index.js +2 -1
  18. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  19. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +1 -0
  20. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  21. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +9 -1
  22. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  23. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +23 -0
  24. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
  25. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +31 -0
  26. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
  27. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +12 -0
  28. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
  29. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js +57 -0
  30. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
  31. package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  32. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
  33. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  34. package/dist/packageVersion.d.ts +1 -1
  35. package/dist/packageVersion.js +1 -1
  36. package/dist/packageVersion.js.map +1 -1
  37. package/dist/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
  38. package/dist/shared-tree/sharedTreeChangeEnricher.js +1 -1
  39. package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  40. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +1 -1
  41. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  42. package/dist/shared-tree/sharedTreeChangeFamily.js +8 -2
  43. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  44. package/dist/shared-tree/sharedTreeEditBuilder.js +1 -1
  45. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  46. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +1 -0
  47. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  48. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +4 -1
  49. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  50. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
  51. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  52. package/lib/feature-libraries/default-schema/index.d.ts +1 -1
  53. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  54. package/lib/feature-libraries/default-schema/index.js +1 -1
  55. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  56. package/lib/feature-libraries/index.d.ts +1 -1
  57. package/lib/feature-libraries/index.d.ts.map +1 -1
  58. package/lib/feature-libraries/index.js +1 -1
  59. package/lib/feature-libraries/index.js.map +1 -1
  60. package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
  61. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  62. package/lib/feature-libraries/modular-schema/index.js +1 -1
  63. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  64. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +1 -0
  65. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  66. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +7 -0
  67. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  68. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +23 -0
  69. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
  70. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +27 -0
  71. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
  72. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +12 -0
  73. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
  74. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js +53 -0
  75. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
  76. package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  77. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
  78. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  79. package/lib/packageVersion.d.ts +1 -1
  80. package/lib/packageVersion.js +1 -1
  81. package/lib/packageVersion.js.map +1 -1
  82. package/lib/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
  83. package/lib/shared-tree/sharedTreeChangeEnricher.js +2 -2
  84. package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  85. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +1 -1
  86. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  87. package/lib/shared-tree/sharedTreeChangeFamily.js +8 -2
  88. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  89. package/lib/shared-tree/sharedTreeEditBuilder.js +1 -1
  90. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  91. package/package.json +21 -21
  92. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +5 -0
  93. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -1
  94. package/src/feature-libraries/default-schema/index.ts +1 -0
  95. package/src/feature-libraries/index.ts +1 -0
  96. package/src/feature-libraries/modular-schema/index.ts +1 -0
  97. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +8 -0
  98. package/src/feature-libraries/optional-field/optionalFieldChangeFormatV3.ts +45 -0
  99. package/src/feature-libraries/optional-field/optionalFieldCodecV3.ts +94 -0
  100. package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +5 -1
  101. package/src/packageVersion.ts +1 -1
  102. package/src/shared-tree/sharedTreeChangeEnricher.ts +2 -0
  103. package/src/shared-tree/sharedTreeChangeFamily.ts +8 -1
  104. package/src/shared-tree/sharedTreeEditBuilder.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"modularChangeFamily.js","sourceRoot":"","sources":["../../../src/feature-libraries/modular-schema/modularChangeFamily.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAGlD,OAAO,EAYN,WAAW,EAOX,kBAAkB,EAClB,oBAAoB,EACpB,8BAA8B,EAC9B,qBAAqB,EAErB,wBAAwB,EACxB,SAAS,EACT,cAAc,EAGd,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EAExB,kBAAkB,EAGlB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIN,KAAK,EACL,oBAAoB,EACpB,oBAAoB,EAEpB,WAAW,EACX,aAAa,EACb,gBAAgB,EAEhB,QAAQ,EACR,cAAc,GAGd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAGN,gBAAgB,EAKhB,kBAAkB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEN,eAAe,GAEf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE/E,OAAO,EAWN,sBAAsB,EAEtB,uBAAuB,EAIvB,yBAAyB,EAGzB,oBAAoB,GACpB,MAAM,yBAAyB,CAAC;AAGjC;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAS/B,YACC,UAA2D,EAC3C,MAA6D;QAA7D,WAAM,GAAN,MAAM,CAAuD;QAE7E,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED,IAAW,OAAO;QACjB,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACK,qBAAqB,CAC5B,OAAoB,EACpB,OAAoB;QAOpB,mEAAmE;QACnE,MAAM,IAAI,GACT,OAAO,CAAC,SAAS,KAAK,gBAAgB,CAAC,UAAU;YAChD,CAAC,CAAC,OAAO,CAAC,SAAS;YACnB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAEtB,IAAI,IAAI,KAAK,gBAAgB,CAAC,UAAU,EAAE,CAAC;YAC1C,2BAA2B;YAC3B,OAAO;gBACN,SAAS,EAAE,gBAAgB,CAAC,UAAU;gBACtC,aAAa,EAAE,gBAAgB,CAAC,aAAa;gBAC7C,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,OAAO,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC;QAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC5E,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC5E,OAAO;YACN,SAAS,EAAE,IAAI;YACf,aAAa;YACb,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,iBAAiB;SAC1B,CAAC;IACH,CAAC;IAEO,oBAAoB,CAC3B,WAAwB,EACxB,OAA8B;QAE9B,IAAI,WAAW,CAAC,SAAS,KAAK,gBAAgB,CAAC,UAAU,EAAE,CAAC;YAC3D,OAAO,WAAW,CAAC,MAAM,CAAC;QAC3B,CAAC;QAED,mDAAmD;QACnD,MAAM,aAAa,GAAG,WAAW,CAAC,MAAqC,CAAC;QACxE,MAAM,eAAe,GAAG,oBAAoB,CAAC,aAAa,EAAE,OAAO,CAAmB,CAAC;QAEvF,OAAO,eAAe,CAAC;IACxB,CAAC;IAEM,OAAO,CAAC,OAAyC;QACvD,MAAM,EAAE,KAAK,EAAE,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,OAAO,GAAsB,EAAE,KAAK,EAAE,CAAC;QAE7C,MAAM,gBAAgB,GAAG,CACxB,IAAsB,EACtB,KAAuB,EACJ,EAAE;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5D,OAAO,cAAc,CAAC,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IAC7E,CAAC;IAEO,WAAW,CAClB,OAAyB,EACzB,OAAyB,EACzB,OAA0B;QAE1B,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAEvE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,GACxF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE5D,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,kCAAkC,CACnF,OAAO,EACP,OAAO,CACP,CAAC;QAEF,MAAM,QAAQ,GAAG,oBAAoB,CAAC;YACrC,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,WAAW;YACX,cAAc;YACd,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,QAAQ;YACnB,SAAS;YACT,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,WAAW;YACrB,UAAU,EAAE,aAAa;SACzB,CAAC,CAAC;QAEH,4EAA4E;QAC5E,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjC,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEO,gBAAgB,CACvB,4BAA8C,EAC9C,4BAA8C,EAC9C,QAAwB,EACxB,OAA0B;QAE1B,8GAA8G;QAC9G,gJAAgJ;QAChJ,0CAA0C;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAgB,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,gBAAgB,GAA2B,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QAE1F,+EAA+E;QAC/E,sHAAsH;QACtH,oHAAoH;QACpH,wCAAwC;QACxC,qHAAqH;QACrH,kFAAkF;QAClF,qGAAqG;QACrG,iGAAiG;QACjG,MAAM,mBAAmB,GAAqC,KAAK,CAClE,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,CAC1D,CAAC;QAEF,MAAM,oBAAoB,GAAoC,KAAK,CAClE,gBAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAC5D,CAAC;QACF,MAAM,mBAAmB,GAA8B,KAAK,CAC3D,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,CAC1D,CAAC;QAEF,MAAM,mBAAmB,GAAwB;YAChD,gBAAgB,EAAE,EAAE;YACpB,kBAAkB,EAAE,aAAa,EAAE;SACnC,CAAC;QAEF,MAAM,mBAAmB,GAAuB,uBAAuB,EAAE,CAAC;QAC1E,MAAM,qBAAqB,GAAkC,uBAAuB,EAAE,CAAC;QAEvF,MAAM,aAAa,GAAG,iBAAiB,CACtC,OAAO,EACP,OAAO,EACP,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,CACnB,CAAC;QAEF,MAAM,eAAe,GAAG,eAAe,CACtC,OAAO,EACP,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,CACnB,CAAC;QAEF,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAC3C,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,YAAY,EACpB,SAAS,EACT,KAAK,EACL,eAAe,EACf,gBAAgB,CAChB,CAAC;QAEF,IAAI,CAAC,0BAA0B,CAC9B,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,EACL,gBAAgB,CAChB,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,oBAAoB,CAAC,eAAe,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACpF,CAAC;QAED,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9E,gCAAgC;YAChC,8GAA8G;YAC9G,kFAAkF;YAClF,4CAA4C;YAC5C,IAAI,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC/D,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5C,CAAC;QACF,CAAC;QAED,OAAO;YACN,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,mBAAmB;YAChC,YAAY,EAAE,oBAAoB;YAClC,WAAW,EAAE,mBAAmB;YAChC,cAAc,EAAE,0BAA0B,CACzC,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,cAAc,EACtB,eAAe,CAAC,mBAAmB,EACnC,eAAe,CAAC,qBAAqB,CACrC;YACD,SAAS,EAAE,aAAa;SACxB,CAAC;IACH,CAAC;IAEO,uBAAuB,CAC9B,WAAwB,EACxB,eAA6B,EAC7B,KAAkB,EAClB,gBAAwC;QAExC,MAAM,OAAO,GAAG,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChE,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC3F,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAEjF,eAAe,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,MAAM,CAC5D,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CACtC,CAAC;QAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;QACpF,MAAM,YAAY,GAAG,CAAC,MAA0B,EAAE,MAA0B,EAAU,EAAE;YACvF,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAClD,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACpD,CAAC;YAED,OAAO,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACrF,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CACpC,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,IAAI,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAChE,gBAAgB,CAChB,CAAC;QACF,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;OASG;IACK,0BAA0B,CACjC,KAAmB,EACnB,cAA8B,EAC9B,aAA+C,EAC/C,oBAAqD,EACrD,WAAsC,EACtC,KAAkB,EAClB,QAAgC;QAEhC,MAAM,OAAO,GAAG,KAAK,CAAC,mBAAmB,CAAC;QAC1C,OAAO,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,8BAA8B,CAClC,KAAK,EACL,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,KAAK,EACL,QAAQ,CACR,CAAC;YAEF,IAAI,CAAC,qBAAqB,CACzB,KAAK,EACL,KAAK,CAAC,UAAU,EAChB,OAAO,CAAC,kBAAkB,EAC1B,cAAc,EACd,aAAa,EACb,KAAK,EACL,QAAQ,CACR,CAAC;QACH,CAAC;IACF,CAAC;IAEO,8BAA8B,CACrC,KAAmB,EACnB,aAA+C,EAC/C,oBAAqD,EACrD,WAAsC,EACtC,KAAkB,EAClB,QAAgC;QAEhC,6FAA6F;QAC7F,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,CAAC;YACrE,IAAI,CAAC,gBAAgB,CACpB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,GAAG,EACH,GAAG,EACH,KAAK,EACL,KAAK,EACL,QAAQ,CACR,CAAC;QACH,CAAC;QAED,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;;;OAUG;IACK,qBAAqB,CAC5B,KAAmB,EACnB,MAAwB,EACxB,cAAuC,EACvC,cAA8B,EAC9B,aAA+C,EAC/C,KAAkB,EAClB,QAAgC;QAEhC,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;QAC/C,cAAc,CAAC,KAAK,EAAE,CAAC;QAEvB,KAAK,MAAM,UAAU,IAAI,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAEvD,IACC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;gBACrC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,EACzC,CAAC;gBACF,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,2BAA2B,CAC/B,KAAK,EACL,WAAW,EACX,OAAO,EACP,cAAc,EACd,aAAa,EACb,KAAK,EACL,QAAQ,CACR,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAEO,2BAA2B,CAClC,KAAmB,EACnB,eAA4B,EAC5B,OAAgB,EAChB,cAA8B,EAC9B,aAA+C,EAC/C,KAAkB,EAClB,QAAgC;QAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAE3E,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAC7C,OAAO,EACP,eAAe,EACf,WAAW,EACX,KAAK,EACL,KAAK,EACL,QAAQ,CACR,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YACjD,OAAO;QACR,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAC7B,sBAAsB,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,EAC/E,KAAK,CAAC,UAAU,CAAC,WAAW,CAC5B,CAAC;QAEF,iGAAiG;QACjG,MAAM,aAAa,GAA2B,kBAAkB,CAC/D,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CACrE,CAAC;QACF,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAE3D,IAAI,aAAa,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC9C,aAAa,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QACxC,CAAC;QAED,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC9D,CAAC;IAEO,gBAAgB,CACvB,OAAmC,EACnC,OAAmC,EACnC,QAA4B,EAC5B,KAAkB,EAClB,eAA6B,EAC7B,gBAAwC;QAExC,MAAM,cAAc,GAAmB,IAAI,GAAG,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACpD,OAAO,OAAO,IAAI,OAAO,IAAI,cAAc,CAAC;QAC7C,CAAC;QAED,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACrD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAExC,MAAM,yBAAyB,GAC9B,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC;YAElE,IAAI,YAAY,KAAK,SAAS,IAAI,yBAAyB,KAAK,SAAS,EAAE,CAAC;gBAC3E,wFAAwF;gBACxF,uFAAuF;gBACvF,6EAA6E;gBAC7E,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;gBACrD,SAAS;YACV,CAAC;YAED,MAAM,aAAa,GAClB,YAAY,KAAK,SAAS;gBACzB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CACxB,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,eAAe,EACf,gBAAgB,CAChB;gBACF,CAAC,CAAC,YAAY,CAAC;YAEjB,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACzC,CAAC;QACF,CAAC;QAED,OAAO,cAAc,CAAC;IACvB,CAAC;IAED;;;;;;;;;;OAUG;IACK,mBAAmB,CAC1B,OAAgB,EAChB,OAAoB,EACpB,OAAoB,EACpB,WAAwB,EACxB,eAA6B,EAC7B,gBAAwC;QAExC,MAAM,EACL,SAAS,EACT,aAAa,EACb,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,iBAAiB,GAC1B,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAElE,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CACnD,iBAAiB,EACjB,iBAAiB,EACjB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YAClB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAClD,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACrF,CAAC,EACD,WAAW,EACX,OAAO,EACP,gBAAgB,CAChB,CAAC;QAEF,MAAM,aAAa,GAAgB;YAClC,SAAS;YACT,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC;SAC7B,CAAC;QAEF,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE;YAC3C,OAAO;YACP,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,iBAAiB;YAC1B,cAAc,EAAE,aAAa;SAC7B,CAAC,CAAC;QAEH,eAAe,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,aAAa,CAAC;IACtB,CAAC;IAEO,gBAAgB,CACvB,OAAyB,EACzB,OAAyB,EACzB,aAA+C,EAC/C,oBAAqD,EACrD,eAA0C,EAC1C,GAAW,EACX,GAAW,EACX,WAAwB,EACxB,eAA6B,EAC7B,gBAAwC;QAExC,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvF,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvF,MAAM,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CACpD,GAAG,EACH,cAAc,EACd,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,CAChB,CAAC;QAEF,oBAAoB,CAAC,aAAa,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC;QAEhE,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACtC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAClD,oBAAoB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACzD,oBAAoB,CAAC,eAAe,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAEhD,mFAAmF;YACnF,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAEO,kBAAkB,CACzB,MAAc,EACd,OAAsB,EACtB,OAAsB,EACtB,KAAkB,EAClB,eAA6B,EAC7B,gBAAwC;QAExC,iGAAiG;QACjG,2DAA2D;QAC3D,kDAAkD;QAClD,kIAAkI;QAClI,yHAAyH;QACzH,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC;QAE1F,iGAAiG;QACjG,wDAAwD;QACxD,+DAA+D;QAC/D,0HAA0H;QAC1H,wHAAwH;QACxH,MAAM,4BAA4B,GACjC,OAAO,CAAC,4BAA4B,IAAI,OAAO,CAAC,4BAA4B,CAAC;QAE9E,MAAM,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,CACjD,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,YAAY,EACpB,MAAM,EACN,KAAK,EACL,eAAe,EACf,gBAAgB,CAChB,CAAC;QAEF,MAAM,kBAAkB,GAA2B,EAAE,CAAC;QAEtD,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACnC,kBAAkB,CAAC,YAAY,GAAG,oBAAoB,CAAC;QACxD,CAAC;QAED,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACxC,kBAAkB,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;QAChE,CAAC;QAED,IAAI,4BAA4B,KAAK,SAAS,EAAE,CAAC;YAChD,kBAAkB,CAAC,4BAA4B,GAAG,4BAA4B,CAAC;QAChF,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACI,MAAM,CACZ,MAAsC,EACtC,UAAmB,EACnB,iBAA8B;QAE9B,iFAAiF;QACjF,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7E,wEAAwE;QACxE,MAAM,CACL,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,EACpC,KAAK,CAAC,6CAA6C,CACnD,CAAC;QAEF,MAAM,QAAQ,GAAmB,UAAU;YAC1C,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAErC,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,oBAAoB,CAAC;gBAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAe;gBACpC,SAAS,EAAE,QAAQ;gBACnB,QAAQ;aACR,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAgB,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3E,MAAM,eAAe,GAAgB;YACpC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,uBAAuB,EAAE;YAClC,sBAAsB,EAAE,IAAI,GAAG,EAAE;YACjC,cAAc,EAAE,iBAAiB;YACjC,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAC/D,iBAAiB,EAAE,IAAI,GAAG,EAAE;YAC5B,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;YACzD,gBAAgB,EAAE,wBAAwB,EAAE;SAC5C,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,MAAM,gBAAgB,GAAG,8BAA8B,CAAC,WAAW,CAAC,CAAC;QAErE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CACzC,MAAM,CAAC,MAAM,CAAC,YAAY,EAC1B,SAAS,EACT,UAAU,EACV,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,CACjB,CAAC;QAEF,MAAM,aAAa,GAAqC,aAAa,EAAE,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,EAAE;YAC5E,aAAa,CAAC,GAAG,CAChB,CAAC,QAAQ,EAAE,OAAO,CAAC,EACnB,IAAI,CAAC,gBAAgB,CACpB,aAAa,EACb,EAAE,QAAQ,EAAE,OAAO,EAAE,EACrB,UAAU,EACV,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,CACjB,CACD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,eAAe,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC;YACzD,eAAe,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAC;YAC9C,KAAK,MAAM,WAAW,IAAI,cAAc,EAAE,CAAC;gBAC1C,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC;gBAC/C,MAAM,OAAO,GAAG,eAAe,CAAC,sBAAsB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACxE,MAAM,CACL,OAAO,KAAK,SAAS,EACrB,KAAK,CAAC,qDAAqD,CAC3D,CAAC;gBACF,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;gBAElC,MAAM,aAAa,GAAG,gBAAgB,CACrC,IAAI,CAAC,UAAU,EACf,WAAW,CAAC,SAAS,CACrB,CAAC,OAAO,CAAC,MAAM,CACf,mBAAmB,EACnB,UAAU,EACV,KAAK,EACL,iBAAiB,EACjB,IAAI,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,EACxD,gBAAgB,CAChB,CAAC;gBACF,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;YAC7C,CAAC;QACF,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAElF,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QAE3C,OAAO,oBAAoB,CAAC;YAC3B,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,aAAa;YAC1B,YAAY,EAAE,eAAe,CAAC,oBAAoB;YAClD,SAAS,EAAE,eAAe,CAAC,aAAa;YACxC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;YACtC,cAAc;YACd,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;YACvB,SAAS,EAAE,QAAQ;YACnB,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,gCAAgC;YACxE,gCAAgC,EAAE,MAAM,CAAC,MAAM,CAAC,wBAAwB;YACxE,QAAQ;SACR,CAAC,CAAC;IACJ,CAAC;IAEO,cAAc,CACrB,OAAuB,EACvB,QAA4B,EAC5B,UAAmB,EACnB,KAAkB,EAClB,eAA4B,EAC5B,gBAAwC,EACxC,iBAA8B;QAE9B,MAAM,cAAc,GAAmB,IAAI,GAAG,EAAE,CAAC;QAEjD,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,cAAc,GAAG,gBAAgB,CACtC,IAAI,CAAC,UAAU,EACf,WAAW,CAAC,SAAS,CACrB,CAAC,OAAO,CAAC,MAAM,CACf,WAAW,CAAC,MAAM,EAClB,UAAU,EACV,KAAK,EACL,iBAAiB,EACjB,OAAO,EACP,gBAAgB,CAChB,CAAC;YAEF,MAAM,mBAAmB,GAAgB;gBACxC,GAAG,WAAW;gBACd,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC;aAC7B,CAAC;YACF,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;YAE/C,eAAe,CAAC,sBAAsB,CAAC,GAAG,CAAC,WAAW,EAAE;gBACvD,OAAO;gBACP,aAAa,EAAE,mBAAmB;aAClC,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,cAAc,CAAC;IACvB,CAAC;IAEO,gBAAgB,CACvB,MAAqB,EACrB,EAAU,EACV,UAAmB,EACnB,KAAkB,EAClB,eAA4B,EAC5B,gBAAwC,EACxC,iBAA8B;QAE9B,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,gHAAgH;QAChH,iFAAiF;QACjF,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,CAAC,4BAA4B,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACpE,CAAC;QAED,mHAAmH;QACnH,gHAAgH;QAChH,wBAAwB;QACxB,IAAI,MAAM,CAAC,4BAA4B,KAAK,SAAS,EAAE,CAAC;YACvD,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,4BAA4B,CAAC;QACpE,CAAC;QAED,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CACzC,MAAM,CAAC,YAAY,EACnB,EAAE,EACF,UAAU,EACV,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,CACjB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,oBAAoB,CAAC,KAAkB;QAC9C,KAAK,MAAM,EACV,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,gBAAgB,EACvB,MAAM,GACN,IAAI,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;YACvC,kEAAkE;YAClE,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACtF,CAAC;IACF,CAAC;IAEM,MAAM,CACZ,YAA4C,EAC5C,yBAAyD,EACzD,gBAAwC;QAExC,8GAA8G;QAC9G,mFAAmF;QACnF,2FAA2F;QAC3F,0CAA0C;QAC1C,MAAM,IAAI,GAAG,eAAe,CAC3B,yBAAyB,EACzB,IAAI,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,MAAM,CAAC,CACzD,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,OAAO,GAAsB,EAAE,KAAK,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAgB,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAEzD,MAAM,kBAAkB,GAAoC,aAAa,EAAE,CAAC;QAC5E,MAAM,aAAa,GAAoD,EAAE,CAAC;QAE1E,MAAM,mBAAmB,GAAoC,KAAK,CACjE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAC3B,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC7B,MAAM,CAAC,aAAa,EACpB,IAAI,CAAC,MAAM,CAAC,aAAa,CACR,CAAC;QAEnB,MAAM,gBAAgB,GAAG,WAAW,CACnC,MAAM,EACN,IAAI,CAAC,MAAM,EACX,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,aAAa,CACb,CAAC;QACF,MAAM,eAAe,GAAgB;YACpC,aAAa;YACb,OAAO,EAAE,mBAAmB,EAAE;YAC9B,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,kBAAkB,EAAE,IAAI,GAAG,EAAE;YAC7B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,gBAAgB;YAChB,mBAAmB,EAAE,aAAa,EAAE;YACpC,aAAa,EAAE,IAAI,GAAG,EAAE;YACxB,mBAAmB;YACnB,sBAAsB,EAAE,uBAAuB,EAAE;YACjD,aAAa,EAAE,uBAAuB,EAAE;YACxC,WAAW,EAAE,EAAE;YACf,kBAAkB;YAClB,yBAAyB,EAAE,IAAI,GAAG,EAAE;SACpC,CAAC;QAEF,MAAM,gBAAgB,GAAG,GAAkB,EAAE,CAC5C,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjE,MAAM,cAAc,GAA2B;YAC9C,GAAG,gBAAgB;YACnB,mBAAmB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ;YAChD,gBAAgB;SAChB,CAAC;QAEF,MAAM,YAAY,GAAqC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QAEzF,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAClD,aAAa,EACb,eAAe,EACf,YAAY,EACZ,KAAK,EACL,cAAc,CACd,CAAC;QAEF,IAAI,CAAC,uBAAuB,CAC3B,aAAa,EACb,YAAY,EACZ,eAAe,EACf,cAAc,EACd,KAAK,CACL,CAAC;QAEF,2BAA2B,CAAC,eAAe,CAAC,CAAC;QAE7C,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,wBAAwB,IAAI,CAAC,CAAC,CAAC;QACjF,MAAM,qBAAqB,GAAG,kBAAkB,CAC/C,MAAM,CAAC,gCAAgC,IAAI,CAAC,CAC5C,CAAC;QAEF,IAAI,CAAC,iBAAiB,CACrB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,qBAAqB,CACrB,CAAC;QAEF,MAAM,mBAAmB,GAAG,sBAAsB,CACjD,eAAe,CAAC,gBAAgB,EAChC,MAAM,CAAC,WAAW,CAClB,CAAC;QAEF,MAAM,kBAAkB,GAAG,qBAAqB,CAC/C,eAAe,CAAC,gBAAgB,EAChC,MAAM,CAAC,WAAW,CAClB,CAAC;QAEF,MAAM,OAAO,GAAG,oBAAoB,CAAC;YACpC,YAAY,EAAE,IAAI,CAAC,aAAa,CAC/B,aAAa,EACb,SAAS,EACT,YAAY,EACZ,eAAe,CAAC,mBAAmB,EACnC,MAAM,CAAC,WAAW,EAClB,eAAe,CAAC,gBAAgB,EAChC,mBAAmB,EACnB,kBAAkB,CAClB;YACD,WAAW,EAAE,YAAY;YACzB,YAAY,EAAE,eAAe,CAAC,mBAAmB;YACjD,SAAS,EAAE,IAAI,CAAC,UAAU,CACzB,eAAe,CAAC,gBAAgB,EAChC,YAAY,EACZ,eAAe,CAAC,mBAAmB,EACnC,MAAM,CAAC,WAAW,EAClB,mBAAmB,EACnB,kBAAkB,CAClB;YACD,iFAAiF;YACjF,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,cAAc,EAAE,oBAAoB,CACnC,MAAM,CAAC,cAAc,EACrB,eAAe,CAAC,aAAa,EAC7B,eAAe,CAAC,sBAAsB,CACtC;YACD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,wBAAwB,EAAE,eAAe,CAAC,cAAc;YACxD,gCAAgC,EAAE,qBAAqB,CAAC,cAAc;YACtE,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,aAAa;SACb,CAAC,CAAC;QAEH,4EAA4E;QAC5E,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,iFAAiF;IACjF,6DAA6D;IACrD,wBAAwB,CAC/B,WAA4D,EAC5D,eAA4B,EAC5B,YAA8C,EAC9C,KAAkB,EAClB,QAAgC;QAEhC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC;QACzC,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CACxC,MAAM,CAAC,YAAY,EACnB,UAAU,CAAC,YAAY,EACvB,SAAS,EACT,KAAK,EACL,eAAe,EACf,QAAQ,CACR,CAAC;QAEF,KAAK,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,IAAI,WAAW,EAAE,CAAC;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CACxC,cAAc,EACd,eAAe,EACf,KAAK,EACL,eAAe,EACf,QAAQ,CACR,CAAC;YAEF,oBAAoB,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QACjE,CAAC;QAED,uEAAuE;QACvE,6FAA6F;QAC7F,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,CAAC;YACzE,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CACxC,KAAK,EACL,MAAM,EACN,KAAK,EACL,eAAe,EACf,QAAQ,CACR,CAAC;YAEF,oBAAoB,CAAC,YAAY,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,aAAa,CAAC;IACtB,CAAC;IAEO,4BAA4B,CACnC,eAA4B,EAC5B,WAAoB,EACpB,eAA4B,EAC5B,aAA6B,EAC7B,YAA8C,EAC9C,KAAkB,EAClB,QAAgC;IAEhC;;OAEG;IACH,UAAmB;QAEnB,wFAAwF;QACxF,8FAA8F;QAC9F,MAAM,WAAW,GAAG,CACnB,KAAyB,EACzB,SAA6B,EAC7B,WAAwC,EACnB,EAAE;YACvB,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtF,IAAI,SAAS,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBACzD,OAAO,SAAS,CAAC;YAClB,CAAC;YAED,OAAO,qBAAqB,CAC3B,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,EAClE,UAAU,CACV;gBACA,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,SAAS,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7E,MAAM,WAAW,GAAgB;YAChC,GAAG,eAAe;YAClB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;SACpC,CAAC;QAEF,MAAM,aAAa,GAClB,WAAW,CAAC,MAAM,KAAK,SAAS;YAC/B,CAAC,CAAC,2BAA2B,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC;YAClE,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,OAAO,GAAY,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;QAE7E,MAAM,YAAY,GAAY,OAAO,CAAC,OAAO,CAAC,MAAM,CACnD,WAAW,CAAC,MAAM,EAClB,eAAe,CAAC,MAAM,EACtB,WAAW,EACX,KAAK,EACL,IAAI,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,EAChD,QAAQ,EACR,eAAe,CAAC,aAAa,CAC7B,CAAC;QAEF,MAAM,kBAAkB,GAAgB;YACvC,GAAG,eAAe;YAClB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC;SAC3B,CAAC;QAEF,MAAM,OAAO,GAAuB;YACnC,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,kBAAkB;YACjC,OAAO;YACP,WAAW,EAAE,aAAa,EAAE;SAC5B,CAAC;QAEF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC9B,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,eAAe,CAAC,kBAAkB,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAEjE,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEtD,IAAI,CAAC,kBAAkB,CACtB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,KAAK,EACL,QAAQ,CACR,CAAC;IACH,CAAC;IAEO,uBAAuB,CAC9B,aAA6B,EAC7B,YAA8C,EAC9C,eAA4B,EAC5B,cAAsC,EACtC,KAAkB;QAElB,OAAO,eAAe,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,UAAU,GAAG,eAAe,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAC9D,eAAe,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAE3C,KAAK,MAAM,cAAc,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,MAAM,WAAW,GAAG,gBAAgB,CACnC,qBAAqB,CAAC,cAAc,CAAC,EACrC,eAAe,CAAC,UAAU,CAAC,WAAW,CACtC,CAAC;gBAEF,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBAE7E,MAAM,CACL,SAAS,KAAK,SAAS,EACvB,KAAK,CAAC,gDAAgD,CACtD,CAAC;gBAEF,MAAM,OAAO,GAAG,eAAe,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAClE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC3B,IAAI,CAAC,4BAA4B,CAChC,SAAS,EACT,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,KAAK,EACL,cAAc,CACd,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,sBAAsB,CAC1B,SAAS,EACT,eAAe,EACf,OAAO,EACP,cAAc,EACd,KAAK,CACL,CAAC;gBACH,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAEO,sBAAsB,CAC7B,SAAsB,EACtB,eAA4B,EAC5B,OAA2B,EAC3B,cAAsC,EACtC,KAAkB;QAElB,MAAM,EACL,aAAa,EACb,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,aAAa,GACtB,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAEtE,MAAM,WAAW,GAAG,CACnB,IAAwB,EACxB,IAAwB,EACH,EAAE;YACvB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACb,CAAC;YAED,IAAI,IAAI,KAAK,SAAS,IAAI,sBAAsB,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACtF,OAAO,IAAI,CAAC;YACb,CAAC;YAED,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QAEF,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,eAAe,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9D,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,UAAU,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,KAAK,CACnC,aAAa,CAAC,OAAO,CAAC,MAAM,CAC3B,cAAc,EACd,aAAa,EACb,WAAW,EACX,KAAK,EACL,IAAI,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EACpE,cAAc,EACd,eAAe,CAAC,aAAa,CAC7B,CACD,CAAC;IACH,CAAC;IAEO,kBAAkB,CACzB,aAA6B,EAC7B,YAA8C,EAC9C,KAAkB,EAClB,YAAyB,EACzB,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAW,EACpC,WAAwB,EACxB,QAAgC;QAEhC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC1C,OAAO;QACR,CAAC;QACD,MAAM,WAAW,GAAG,sBAAsB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,kBAAkB,GAA2B,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACnF,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;YAE/D,IAAI,kBAAkB,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACnD,kBAAkB,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;gBACtE,OAAO;YACR,CAAC;YAED,MAAM,CACL,CAAC,kBAAkB,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAC9C,KAAK,CAAC,6BAA6B,CACnC,CAAC;YACF,kBAAkB,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC5D,OAAO;QACR,CAAC;QAED,MAAM,OAAO,GAAkB;YAC9B,YAAY,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;SACjD,CAAC;QAEF,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,oBAAoB,CAAC,KAAK,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAE3D,IAAI,CAAC,iBAAiB,CACrB,aAAa,EACb,YAAY,EACZ,KAAK,EACL,MAAM,EACN,UAAU,EACV,WAAW,EACX,QAAQ,CACR,CAAC;IACH,CAAC;IAEO,iBAAiB,CACxB,aAA6B,EAC7B,YAA8C,EAC9C,KAAkB,EAClB,UAAkB,EAClB,UAAwB,EACxB,WAAwB,EACxB,QAAgC;QAEhC,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,yBAAyB,CAC5C,KAAK,CAAC,UAAU,CAAC,SAAS,EAC1B,UAAU,CAAC,IAAI,EACf,CAAC,CACD,CAAC,KAAK,CAAC;YAER,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAC3D,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,EACxD,CAAC,CACD,CAAC,KAAK,CAAC;YAER,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC/B,gHAAgH;gBAChH,MAAM,qBAAqB,GAAG,gBAAgB,CAC7C,WAAW,EACX,KAAK,CAAC,UAAU,CAAC,WAAW,CAC5B,CAAC;gBAEF,MAAM,KAAK,GAAsB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACpF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;gBACxE,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,CAAC;gBACjF,IAAI,CAAC,iBAAiB,CACrB,aAAa,EACb,YAAY,EACZ,KAAK,EACL,UAAU,EACV,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAChC,WAAW,EACX,QAAQ,CACR,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAC7E,UAAU,CAAC,IAAI,EACf,CAAC,CACD,CAAC,KAAK,CAAC;gBAER,gBAAgB,CACf,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,mBAAmB,EACzB,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,KAAK,CAAC,aAAa,CACnB,CAAC;gBAEF,2EAA2E;gBAC3E,mFAAmF;gBACnF,IACC,kBAAkB,KAAK,SAAS;oBAChC,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAC5B,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,kBAAkB,CAAC,CACvD,EACA,CAAC;oBACF,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC/E,CAAC;YACF,CAAC;YAED,OAAO;QACR,CAAC;QAED,MAAM,iBAAiB,GAAG,UAAU,CAAC,KAAK,CAAC;QAC3C,MAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAE/E,MAAM,cAAc,GAAG,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC1E,oBAAoB,CAAC,KAAK,CAAC,mBAAmB,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAEvF,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,sCAAsC;YACtC,wDAAwD;YACxD,mGAAmG;YACnG,gGAAgG;YAChG,yFAAyF;YACzF,IAAI,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;gBACjE,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACrD,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO;QACR,CAAC;QAED,IAAI,CAAC,4BAA4B,CAChC,eAAe,EACf,iBAAiB,EACjB,KAAK,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,UAAU,CACV,CAAC;IACH,CAAC;IAEO,cAAc,CACrB,MAAsB,EACtB,IAAoB,EACpB,QAA4B,EAC5B,KAAkB,EAClB,eAA4B,EAC5B,gBAAwC;QAExC,MAAM,aAAa,GAAmB,IAAI,GAAG,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,CACnB,KAAyB,EACzB,SAA6B,EAC7B,WAAwC,EACnB,EAAE;YACvB,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBACpD,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,KAAK,CAAC;QACd,CAAC,CAAC;QAEF,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBACtC,SAAS;YACV,CAAC;YAED,MAAM,EACL,SAAS,EACT,aAAa,EACb,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,aAAa,GACtB,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAExD,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAEjE,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAChD,cAAc,EACd,aAAa,EACb,WAAW,EACX,KAAK,EACL,OAAO,EACP,gBAAgB,EAChB,eAAe,CAAC,aAAa,CAC7B,CAAC;YAEF,MAAM,kBAAkB,GAAgB;gBACvC,SAAS;gBACT,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC;aAC3B,CAAC;YAEF,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;YAE7C,eAAe,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE;gBAClD,UAAU;gBACV,SAAS,EAAE,WAAW;gBACtB,aAAa,EAAE,kBAAkB;gBACjC,OAAO;gBACP,WAAW,EAAE,aAAa,EAAE;aAC5B,CAAC,CAAC;YAEH,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,aAAa,CAAC;IACtB,CAAC;IAEO,gBAAgB,CACvB,KAAa,EACb,MAAc,EACd,KAAkB,EAClB,eAA4B,EAC5B,gBAAwC;QAExC,MAAM,MAAM,GAAG,gBAAgB,CAC9B,eAAe,CAAC,SAAS,CAAC,WAAW,EACrC,eAAe,CAAC,SAAS,CAAC,WAAW,EACrC,KAAK,CACL,CAAC;QACF,MAAM,IAAI,GAAG,gBAAgB,CAC5B,eAAe,CAAC,UAAU,CAAC,WAAW,EACtC,eAAe,CAAC,UAAU,CAAC,WAAW,EACtC,MAAM,CACN,CAAC;QAEF,MAAM,OAAO,GAAmB,IAAI,EAAE,YAAY,IAAI,IAAI,GAAG,EAAE,CAAC;QAEhE,MAAM,YAAY,GACjB,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;YACnE,CAAC,CAAC,IAAI,CAAC,cAAc,CACnB,MAAM,EAAE,YAAY,IAAI,IAAI,GAAG,EAAE,EACjC,OAAO,EACP,KAAK,EACL,KAAK,EACL,eAAe,EACf,gBAAgB,CAChB;YACF,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAExB,MAAM,aAAa,GAA2B,EAAE,CAAC;QAEjD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACzD,aAAa,CAAC,YAAY,GAAG,YAAY,CAAC;QAC3C,CAAC;QAED,IAAI,MAAM,EAAE,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAChD,aAAa,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAClE,CAAC;QAED,IAAI,MAAM,EAAE,4BAA4B,KAAK,SAAS,EAAE,CAAC;YACxD,aAAa,CAAC,4BAA4B,GAAG,MAAM,CAAC,4BAA4B,CAAC;QAClF,CAAC;QAED,oBAAoB,CAAC,eAAe,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACzE,OAAO,aAAa,CAAC;IACtB,CAAC;IAEO,iBAAiB,CACxB,aAA6B,EAC7B,YAA8C,EAC9C,YAA2B,EAC3B,eAAgC,EAChC,qBAAsC;QAEtC,IAAI,CAAC,0BAA0B,CAC9B,aAAa,EACb,eAAe,CAAC,QAAQ,EACxB,eAAe,CAAC,QAAQ,EACxB,eAAe,EACf,qBAAqB,EACrB,YAAY,CACZ,CAAC;QAEF,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,YAAY,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YACtE,qEAAqE;YACrE,+HAA+H;YAC/H,MAAM,gBAAgB,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,wBAAwB,CAC5B,MAAM,EACN,eAAe,CAAC,QAAQ,EACxB,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,EACtE,YAAY,EACZ,eAAe,EACf,qBAAqB,CACrB,CAAC;QACH,CAAC;IACF,CAAC;IAEO,0BAA0B,CACjC,MAAsB,EACtB,sBAAuC,EACvC,uBAAwC,EACxC,eAAgC,EAChC,qBAAsC,EACtC,KAAuC;QAEvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACnE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/D,sEAAsE;gBACtE,+HAA+H;gBAC/H,MAAM,gBAAgB,GAAG,KAAK,CAAC;gBAC/B,MAAM,iBAAiB,GACtB,uBAAuB,KAAK,eAAe,CAAC,QAAQ,IAAI,gBAAgB;oBACvE,CAAC,CAAC,eAAe,CAAC,QAAQ;oBAC1B,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC;gBAE7B,IAAI,CAAC,wBAAwB,CAC5B,MAAM,EACN,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,EACL,eAAe,EACf,qBAAqB,CACrB,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAEO,wBAAwB,CAC/B,MAAc,EACd,gBAAiC,EACjC,iBAAkC,EAClC,KAAuC,EACvC,eAAgC,EAChC,qBAAsC;QAEtC,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAExF,MAAM,WAAW,GAA2B,EAAE,GAAG,IAAI,EAAE,CAAC;QACxD,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAEjD,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,aAAa,GAAG,gBAAgB,KAAK,eAAe,CAAC,QAAQ,CAAC;YACpE,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC1D,WAAW,CAAC,oBAAoB,GAAG;oBAClC,GAAG,IAAI,CAAC,oBAAoB;oBAC5B,QAAQ,EAAE,aAAa;iBACvB,CAAC;gBACF,eAAe,CAAC,cAAc,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACF,CAAC;QACD,IAAI,IAAI,CAAC,4BAA4B,KAAK,SAAS,EAAE,CAAC;YACrD,MAAM,aAAa,GAAG,iBAAiB,KAAK,eAAe,CAAC,QAAQ,CAAC;YACrE,IAAI,IAAI,CAAC,4BAA4B,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAClE,WAAW,CAAC,4BAA4B,GAAG;oBAC1C,GAAG,IAAI,CAAC,4BAA4B;oBACpC,QAAQ,EAAE,aAAa;iBACvB,CAAC;gBACF,qBAAqB,CAAC,cAAc,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,CAAC;QACF,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,0BAA0B,CAC9B,IAAI,CAAC,YAAY,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,KAAK,CACL,CAAC;QACH,CAAC;IACF,CAAC;IAEO,aAAa,CACpB,SAAqC,EACrC,QAA4B,EAC5B,OAAyC,EACzC,YAA6C,EAC7C,OAAkC,EAClC,KAAoB,EACpB,mBAAoD,EACpD,mBAA2D;QAE3D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,eAAe,GAAmB,IAAI,GAAG,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,SAAS,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;YAEzE,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjF,IAAI,CAAC,eAAe,CACnB,MAAM,EACN,OAAO,EACP,YAAY,EACZ,OAAO,EACP,KAAK,EACL,mBAAmB,EACnB,mBAAmB,CACnB,CACD,CAAC;YAEF,MAAM,OAAO,GAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACrD,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACnE,IAAI,qBAAqB,GAAG,KAAK,CAAC;YAClC,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;gBACvC,MAAM,MAAM,GACX,sBAAsB,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBAEnF,MAAM,iBAAiB,GACtB,IAAI,CAAC,eAAe,CACnB,MAAM,EACN,OAAO,EACP,YAAY,EACZ,OAAO,EACP,KAAK,EACL,mBAAmB,EACnB,mBAAmB,CACnB,KAAK,SAAS,CAAC;gBAEjB,IAAI,iBAAiB,EAAE,CAAC;oBACvB,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC5D,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACP,qBAAqB,GAAG,IAAI,CAAC;gBAC9B,CAAC;YACF,CAAC;YAED,MAAM,cAAc,GACnB,qBAAqB,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;YAEvE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC9D,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;QACF,CAAC;QAED,OAAO,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IAEO,UAAU,CACjB,KAAoB,EACpB,OAAyC,EACzC,YAA6C,EAC7C,OAAkC,EAClC,mBAAoD,EACpD,mBAA2D;QAE3D,MAAM,MAAM,GAAkB,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE,CAAC;QACzE,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,MAAM,iBAAiB,GAAG,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;YAExF,kHAAkH;YAClH,MAAM,QAAQ,GAAG,iBAAiB;gBACjC,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,IAAI,CAAC,eAAe,CACpB,MAAM,EACN,OAAO,EACP,YAAY,EACZ,OAAO,EACP,KAAK,EACL,mBAAmB,EACnB,mBAAmB,CACnB,CAAC;YAEJ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC7C,CAAC;YAED,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,eAAe,CACtB,MAAc,EACd,KAAuC,EACvC,YAA6C,EAC7C,OAAkC,EAClC,KAAoB,EACpB,mBAAoD,EACpD,mBAA2D;QAE3D,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,YAAY,GACjB,SAAS,CAAC,YAAY,KAAK,SAAS;YACnC,CAAC,CAAC,IAAI,CAAC,aAAa,CAClB,SAAS,CAAC,YAAY,EACtB,MAAM,EACN,KAAK,EACL,YAAY,EACZ,OAAO,EACP,KAAK,EACL,mBAAmB,EACnB,mBAAmB,CACnB;YACF,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,YAAY,GAAG,EAAE,GAAG,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;QAClE,IAAI,YAAY,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,YAAY,CAAC,YAAY,CAAC;QAClC,CAAC;QAED,IAAI,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;YACxC,MAAM,SAAS,GAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAErE,wEAAwE;YACxE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxB,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC;QAClB,CAAC;aAAM,CAAC;YACP,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YAClD,OAAO,MAAM,CAAC;QACf,CAAC;IACF,CAAC;IAEM,cAAc,CACpB,MAAwB,EACxB,WAAoC,EACpC,UAAwB;QAExB,MAAM,YAAY,GAAG,IAAI,GAAG,CAC3B,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAC9D,CAAC,CAAC,CAAC,SAAS,CAAC;YACb,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CACtD,CAAC;QACF,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAClD,MAAM,CAAC,YAAY,EACnB,YAAY,EACZ,WAAW,CACX,CAAC;QAEF,MAAM,YAAY,GAAqC,aAAa,EAAE,CAAC;QACvE,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5E,YAAY,CAAC,GAAG,CACf,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,EAC1D,IAAI,CAAC,6BAA6B,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,CAAC,CAC5E,CAAC;QACH,CAAC;QAED,MAAM,mBAAmB,GAAoC,aAAa,EAAE,CAAC;QAC7E,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACxE,mBAAmB,CAAC,GAAG,CACtB,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,EAC1D,2BAA2B,CAC1B,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,EACnD,YAAY,EACZ,WAAW,CACX,CACD,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAA8B;YAC1C,GAAG,MAAM;YACT,YAAY,EAAE,aAAa;YAC3B,WAAW,EAAE,YAAY;YACzB,YAAY,EAAE,mBAAmB;YACjC,SAAS,EAAE,wBAAwB,CAClC,MAAM,CAAC,SAAS,EAChB,YAAY,EACZ,WAAW,EACX,MAAM,CAAC,WAAW,CAClB;YAED,qFAAqF;YACrF,WAAW,EAAE,aAAa,EAAE;YAC5B,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,CAC/C,CAAC,GAAG,EAAE,EAAE,CAAC,4BAA4B,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,EACrE,CAAC,EAAE,EAAE,EAAE,CACN,sBAAsB,CACrB,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,EACxC,YAAY,EACZ,WAAW,CACX,CACF;SACD,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,OAAO,GAA0B,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;YACjE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;YACjC,CAAC;YAED,OAAO,CAAC,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACP,OAAO,OAAO,CAAC,SAAS,CAAC;QAC1B,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,6BAA6B,CACpC,aAA4B,EAC5B,YAA0C,EAC1C,WAAoC;QAEpC,MAAM,OAAO,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QACrC,IAAI,aAAa,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,wBAAwB,CACnD,aAAa,CAAC,YAAY,EAC1B,YAAY,EACZ,WAAW,CACX,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,wBAAwB,CAC/B,MAAsB,EACtB,YAA0C,EAC1C,WAAoC;QAEpC,MAAM,aAAa,GAAmB,IAAI,GAAG,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;YAC3C,MAAM,kBAAkB,GAAG,gBAAgB,CAC1C,IAAI,CAAC,UAAU,EACf,WAAW,CAAC,SAAS,CACrB,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;YAE1E,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,aAAa,CAAC;IACtB,CAAC;IAEO,sBAAsB,CAC7B,MAAsB,EACtB,KAAuC;QAEvC,MAAM,IAAI,GAAuB,uBAAuB,EAAE,CAAC;QAC3D,IAAI,CAAC,qCAAqC,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACpE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE;YAC/C,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACrC,IAAI,CAAC,qCAAqC,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE;oBACnE,QAAQ;oBACR,OAAO;iBACP,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,qCAAqC,CAC5C,KAAyB,EACzB,MAAsB,EACtB,MAA0B;QAE1B,KAAK,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CACtF,WAAW,CAAC,MAAM,CAClB,CAAC;YACF,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;gBACnC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5D,CAAC;QACF,CAAC;IACF,CAAC;IAEM,WAAW,CACjB,cAAgE;QAEhE,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACtE,CAAC;IAEO,sBAAsB,CAAC,SAA8B;QAC5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IAClD,CAAC;IAEM,iBAAiB,CAAC,MAAwB;QAChD,MAAM,gBAAgB,GAAoC,KAAK,CAC9D,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAC3B,CAAC;QAEF,MAAM,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAEtD,IAAI,CAAC,oBAAoB,CACxB,MAAM,EACN,MAAM,CAAC,YAAY,EACnB,SAAS,EACT,gBAAgB,EAChB,eAAe,CACf,CAAC;QAEF,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YACxE,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACrC,SAAS;YACV,CAAC;YAED,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,CAAC,oBAAoB,CACxB,MAAM,EACN,IAAI,CAAC,YAAY,EACjB,MAAM,EACN,gBAAgB,EAChB,eAAe,CACf,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5E,MAAM,QAAQ,GAAiB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,4BAA4B,CAAC,CAAC;YAExF,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACrE,gBAAgB,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;YAE/E,MAAM,YAAY,GAAG,gBAAgB,CACpC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,EAClB,MAAM,CACN,CAAC,YAAY,CAAC;YAEf,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,oBAAoB,CACxB,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,CACf,CAAC;YACH,CAAC;QACF,CAAC;QAED,MAAM,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,oCAAoC,CAAC,CAAC;IACtF,CAAC;IAED;;;;OAIG;IACK,oBAAoB,CAC3B,MAAwB,EACxB,YAA4B,EAC5B,UAA8B,EAC9B,gBAAiD,EACjD,eAA8C;QAE9C,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3D,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;YACzE,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5E,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACnD,MAAM,CACL,aAAa,CAAC,KAAK,KAAK,SAAS,IAAI,gBAAgB,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,EACnF,KAAK,CAAC,iCAAiC,CACvC,CAAC;gBAEF,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1D,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtE,MAAM,MAAM,GAAG,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC/E,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,8BAA8B,CAAC,CAAC;gBAC1D,KAAK,MAAM,eAAe,IAAI,MAAM,EAAE,CAAC;oBACtC,MAAM,CACL,gBAAgB,CAAC,eAAe,EAAE,OAAO,CAAC,EAC1C,KAAK,CAAC,mCAAmC,CACzC,CAAC;gBACH,CAAC;gBAED,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtD,CAAC;QACF,CAAC;IACF,CAAC;IAEO,kBAAkB,CAAC,MAAwB;QAClD,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,MAAwB;QAC1C,MAAM,KAAK,GAA8B;YACxC,GAAG,MAAM;YACT,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;YAC5C,cAAc,EAAE,uBAAuB,EAAE;YACzC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC;YACxD,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/E,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,cAAc,CAAC,MAAqB;QAC3C,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,MAAM,CAAC;QACf,CAAC;QACD,OAAO;YACN,GAAG,MAAM;YACT,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC;SACxD,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,MAAsB;QAC9C,OAAO,IAAI,GAAG,CACb,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAClF,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,MAAmB;QAC1C,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACpE,OAAO;YACN,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAClD,CAAC;IACH,CAAC;;AA5/DsB,+BAAW,GAAqB,oBAAoB,EAAE,CAAC;AA+/D/E,SAAS,4BAA4B,CACpC,GAAkB,EAClB,YAA0C,EAC1C,WAAoC;IAEpC,OAAO;QACN,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC;QAClE,OAAO,EAAE,GAAG,CAAC,OAAO;KACpB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACvB,QAAiC,EACjC,YAA0C,EAC1C,WAAoC;IAEpC,OAAO,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC5D,CAAC;AAED,SAAS,qBAAqB,CAC7B,GAAyB,EACzB,YAA0C,EAC1C,WAAoC;IAEpC,MAAM,OAAO,GAAyB,aAAa,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAQD,SAAS,kCAAkC,CAC1C,OAAyB,EACzB,OAAyB;IAEzB,wHAAwH;IACxH,+FAA+F;IAC/F,yFAAyF;IACzF,wFAAwF;IACxF,0FAA0F;IAC1F,6FAA6F;IAC7F,4EAA4E;IAC5E,4FAA4F;IAC5F,0FAA0F;IAC1F,gCAAgC;IAChC,MAAM,SAAS,GAAiC,KAAK,CACpD,gBAAgB,CACf,OAAO,CAAC,MAAM,IAAI,aAAa,EAAE,EACjC,OAAO,CAAC,MAAM,IAAI,aAAa,EAAE,EACjC,IAAI,CACJ,CACD,CAAC;IAEF,MAAM,WAAW,GAA8B,KAAK,CACnD,gBAAgB,CAAC,OAAO,CAAC,QAAQ,IAAI,aAAa,EAAE,EAAE,OAAO,CAAC,QAAQ,IAAI,aAAa,EAAE,CAAC,CAC1F,CAAC;IAEF,MAAM,aAAa,GAAiC,KAAK,CACxD,gBAAgB,CACf,OAAO,CAAC,UAAU,IAAI,aAAa,EAAE,EACrC,OAAO,CAAC,UAAU,IAAI,aAAa,EAAE,EACrC,IAAI,CACJ,CACD,CAAC;IAEF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,CACL,YAAY,KAAK,KAAK,CAAC,cAAc,EACrC,KAAK,CAAC,wDAAwD,CAC9D,CAAC;gBAEF,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,CACL,YAAY,KAAK,KAAK,CAAC,cAAc,EACrC,KAAK,CAAC,wDAAwD,CAC9D,CAAC;gBAEF,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACF,CAAC;IACF,CAAC;IAED,sKAAsK;IACtK,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,EAAE,2CAA2C,CAAC,CAAC;YAChF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;gBACrC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChF,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CACpB,MAAgD;IAEhD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,SAAS,CAAC,CAAC,oBAAoB,CACpC,MAAwB,EACxB,UAA2D;IAE3D,MAAM,OAAO,GAAkC,uBAAuB,EAAE,CAAC;IACzE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACvC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CACxB,MAAwB,EACxB,OAAsC;IAEtC,wEAAwE;IACxE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,gBAAgB,CAAC,WAAW,EAAE,CAAC;YACzD,SAAS;QACV,CAAC;QAED,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAC9D,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,CACZ,EAAE,CAAC;YACH,MAAM,QAAQ,GACb,aAAa,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YAC9E,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,cAAc,CAAC,OAAO,CACtD,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EAChD,aAAa,CAAC,MAAM,CACpB,EAAE,CAAC;gBACH,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CACV,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAChD,WAAW,CAAC,MAAM,EAClB,IAAI,CACJ,CAAC;gBACH,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CACvB,MAAwB,EACxB,OAAsC;IAEtC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QACjE,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,cAAc,CAAC,OAAO,CACtD,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EACzD,WAAW,CAAC,MAAM,CAClB,EAAE,CAAC;YACH,qGAAqG;YACrG,oEAAoE;YACpE,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1D,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC/B,MAAwB,EACxB,eAAmE,EACnE,YAA2C,EAC3C,oBAA6B,IAAI;IAEjC,MAAM,UAAU,GAAiC,aAAa,EAAE,CAAC;IACjE,MAAM,YAAY,GAAwD,IAAI,GAAG,EAAE,CAAC;IAEpF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;YAC1E,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEhD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC;oBAExC,4EAA4E;oBAC5E,sDAAsD;oBACtD,IAAI,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC;wBACtC,SAAS;oBACV,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,CAAC,iBAAiB,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACP,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,MAAM,EACL,YAAY,EACZ,WAAW,EACX,KAAK,EACL,SAAS,EACT,wBAAwB,EACxB,gCAAgC,EAChC,MAAM,EACN,QAAQ,GACR,GAAG,MAAM,CAAC;IAEX,OAAO,oBAAoB,CAAC;QAC3B,YAAY;QACZ,WAAW;QACX,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,KAAK,EAAE,KAAe;QACtB,SAAS;QACT,wBAAwB;QACxB,gCAAgC;QAChC,MAAM;QACN,QAAQ;QACR,UAAU;KACV,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACxB,YAA4C,EAC5C,UAA2D;IAE3D,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IACnC,MAAM,SAAS,GAAuB,EAAE,CAAC;IAEzC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,kEAAkE;QAClE,MAAM,WAAW,GAAG,aAAa,CAChC,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,EAClB,UAAU,CACV,CAAC;QAEF,MAAM,MAAM,GAA+B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBACpB,MAAM,EAAE,mBAAmB,CAC1B,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,EAChE,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,EAClB,UAAU,CACV;aACD,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAA8B,EAAE,CAAC;QAC7C,KAAK,MAAM,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,GACN,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;gBACxD,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;aACxD,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC;QAChC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QAC3B,CAAC;IACF,CAAC;IAED,kEAAkE;IAClE,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC7C,SAAS,CAAC,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAmC,EAAE,CAAC;QACpD,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACjE,QAAQ,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC;gBACpC,KAAK;aACL,CAAC,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrD,SAAS,CAAC,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CACzB,aAA2C;IAE3C,MAAM,mBAAmB,GAA6B,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/D,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,mBAAmB,CAAC,IAAI,CAAC;gBACxB,EAAE,EAAE,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC;gBACpC,KAAK,EAAE,KAAK;aACZ,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACrB,MAAsB,EACtB,WAA6C,EAC7C,WAAsC,EACtC,UAA2D;IAE3D,MAAM,KAAK,GAAqC,IAAI,GAAG,EAAE,CAAC;IAE1D,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CAC/E,WAAW,CAAC,MAAM,EAClB,CAAC,WAAW,EAAiB,EAAE;YAC9B,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAC3E,OAAO,mBAAmB,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9E,CAAC,CACD,CAAC;QACF,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAC3B,MAAqB,EACrB,WAA6C,EAC7C,WAAsC,EACtC,UAA2D;IAE3D,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,aAAa,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACjF,CAAC;IACD,8DAA8D;IAC9D,OAAO,IAAI,GAAG,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,8BAA8B,CAC7C,QAAiC,EACjC,gBAAyC,EACzC,aAA0C;IAE1C,MAAM,iBAAiB,GAAkB,EAAE,CAAC;IAC5C,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;IAED,MAAM,gBAAgB,GAAG,GAAkB,EAAE,CAAC,iBAAiB,CAAC;IAChE,OAAO;QACN,GAAG,8BAA8B,CAAC,QAAQ,CAAC;QAC3C,mBAAmB,EAAE,GAAG,EAAE,CAAC,gBAAgB;QAC3C,gBAAgB;KAChB,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAqB;IAClD,OAAO,CACN,MAAM,CAAC,YAAY,KAAK,SAAS;QACjC,MAAM,CAAC,oBAAoB,KAAK,SAAS;QACzC,MAAM,CAAC,4BAA4B,KAAK,SAAS,CACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,UAA2D,EAC3D,IAAyB;IAEzB,IAAI,IAAI,KAAK,gBAAgB,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,gBAAgB,CAAC;IACzB,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAChE,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,UAA2D,EAC3D,IAAyB;IAEzB,OAAO,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,aAAa,CAAC;AACrD,CAAC;AAwED,SAAS,eAAe,CACvB,UAA4B,EAC5B,SAA2B,EAC3B,iBAAgC,EAChC,mBAAuC,EACvC,qBAAoD,EACpD,mBAAwC;IAExC,OAAO;QACN,aAAa,EAAE,IAAI,CAAC,GAAG,CACtB,UAAU,CAAC,aAAa,EACxB,SAAS,CAAC,aAAa,CACN;QAClB,OAAO,EAAE,mBAAmB,EAAE;QAC9B,UAAU;QACV,SAAS;QACT,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,mBAAmB,EAAE,IAAI,GAAG,EAAE;QAC9B,eAAe,EAAE,aAAa,EAAE;QAChC,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,iBAAiB,EAAE,aAAa,EAAE;QAClC,iBAAiB;QACjB,mBAAmB;QACnB,qBAAqB;QACrB,eAAe,EAAE,uBAAuB,EAAE;QAC1C,mBAAmB;KACnB,CAAC;AACH,CAAC;AAoDD,SAAS,kBAAkB,CAAC,cAAsB;IACjD,OAAO;QACN,cAAc;KACd,CAAC;AACH,CAAC;AAED,MAAM,kBAAkB;IACvB,YACkB,KAAkB,EAClB,OAAgB;QADhB,UAAK,GAAL,KAAK,CAAa;QAClB,YAAO,GAAP,OAAO,CAAS;IAC/B,CAAC;IAEG,YAAY,CAClB,QAAsB,EACtB,KAAa,EACb,UAA8B,EAC9B,WAAyB;QAEzB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,2CAA2C,CAAC,CAAC;YAEjE,MAAM,WAAW,GAAG,yBAAyB,CAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAC3B,QAAQ,EACR,KAAK,CACL,CAAC;YAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CACjE,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,EAC9D,KAAK,CACL,CAAC;YAEF,IAAI,gBAAgB,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC7E,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAC/B,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,gBAAgB,CACf,IAAI,CAAC,KAAK,CAAC,aAAa,EACxB,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAC/B,WAAW,CAAC,KAAK,EACjB,UAAU,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAC/B,CAAC;YACH,CAAC;QACF,CAAC;QAED,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;YACnD,KAAK,MAAM,KAAK,IAAI,qBAAqB,CACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAChC,QAAQ,EACR,KAAK,CACL,EAAE,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBAClB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAC9D,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7E,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAEM,YAAY,CAClB,QAAsB,EACtB,KAAa;QAEb,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,MAAM,aAAa,GAAG,yBAAyB,CAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAC3B,QAAQ,EACR,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC;QAEtC,MAAM,WAAW,GAAG,6BAA6B,CAChD,IAAI,CAAC,KAAK,CAAC,MAAM,EACjB,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,EAC3D,cAAc,CACd,CAAC;QACF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;QAEpC,IAAI,MAA2C,CAAC;QAChD,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACxE,MAAM,GAAG,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACnE,CAAC;aAAM,CAAC;YACP,qEAAqE;YACrE,MAAM,WAAW,GAAG,yBAAyB,CAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EACvC,aAAa,CAAC,KAAK,EACnB,cAAc,CACd,CAAC;YAEF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;YACpC,MAAM,GAAG;gBACR,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;gBACvE,MAAM,EAAE,cAAc;aACtB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;YAC5C,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC9E,KAAK,EAAE,IAAI,CAAC,OAAO;aACnB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAED,MAAM,kBAAkB;IACvB,YACkB,KAAkB,EAClB,OAAgB,EAChB,aAAsB,IAAI;QAF1B,UAAK,GAAL,KAAK,CAAa;QAClB,YAAO,GAAP,OAAO,CAAS;QAChB,eAAU,GAAV,UAAU,CAAgB;IACzC,CAAC;IAEG,0BAA0B,CAChC,YAA0B,EAC1B,KAAa;QAEb,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,MAAM,WAAW,GAAG,yBAAyB,CAC5C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAC/B,YAAY,EACZ,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;QAEpC,MAAM,SAAS,GAAG,yBAAyB,CAC1C,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAC1C,WAAW,CAAC,KAAK,EACjB,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;QAClC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;QAElC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CACxE,WAAW,CAAC,KAAK,EACjB,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;QAEvC,IAAI,MAAuD,CAAC;QAC5D,kDAAkD;QAClD,IAAI,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnE,MAAM,GAAG;gBACR,GAAG,cAAc;gBACjB,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE;aAChE,CAAC;QACH,CAAC;aAAM,CAAC;YACP,wEAAwE;YACxE,yEAAyE;YACzE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACpE,CAAC;QAED,2GAA2G;QAC3G,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,GAAG,CACpC,MAAM,CAAC,KAAK,CAAC,QAAQ,EACrB,MAAM,CAAC,MAAM,EACb,IAAI,CAAC,OAAO,CACZ,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;YAC5C,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC7E,KAAK,EAAE,IAAI,CAAC,OAAO;aACnB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,gBAAgB,CACtB,YAA0B,EAC1B,KAAa,EACb,WAAqC,EACrC,UAA8B,EAC9B,UAAyB;QAEzB,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,MAAM,aAAa,GAAG,yBAAyB,CAC9C,IAAI,CAAC,KAAK,CAAC,SAAS,EACpB,YAAY,EACZ,cAAc,CACd,CAAC;QACF,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC;QACzC,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC;QAEtC,MAAM,gBAAgB,GAAG,6BAA6B,CACrD,IAAI,CAAC,KAAK,CAAC,UAAU,EACrB,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,EACzD,cAAc,CACd,CAAC;QACF,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAEzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CACvF,YAAY,EACZ,cAAc,CACd,CAAC;QACF,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC;QAE1C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC;QAC3E,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACpC,wFAAwF;YACxF,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE;gBACpE,UAAU;gBACV,QAAQ,EAAE,WAAW;gBACrB,UAAU;aACV,CAAC,CAAC;YAEH,IAAI,UAAU,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC3D,IAAI,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC/C,CAAC;QACF,CAAC;QAED,IAAI,gBAAgB,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,wEAAwE;YACxE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,gBAAgB,CACf,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAC3B,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAC9B,YAAY,EACZ,UAAU,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,KAAK,CAAC,aAAa,CACxB,CAAC;YACH,CAAC;YAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC/B,aAAa,CACZ,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAC3B,YAAY,EACZ,WAAW,EACX,cAAc,EACd,IAAI,CAAC,OAAO,CACZ,CAAC;YACH,CAAC;QACF,CAAC;QAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,KAAK,GAAG,cAAc,CAAC;YAE9C,MAAM,YAAY,GACjB,WAAW,KAAK,SAAS;gBACxB,CAAC,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,CAAC;gBACjD,CAAC,CAAC,SAAS,CAAC;YAEd,IAAI,CAAC,gBAAgB,CACpB,kBAAkB,CAAC,YAAY,EAAE,cAAc,CAAC,EAChD,cAAc,EACd,YAAY,EACZ,UAAU,CACV,CAAC;QACH,CAAC;IACF,CAAC;IAEM,SAAS,CAAC,EAAgB,EAAE,KAAa;QAC/C,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IAEM,YAAY,CAAC,EAAgB,EAAE,KAAa;QAClD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEM,mBAAmB,CACzB,EAAgB,EAChB,KAAa;QAEb,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,MAAM,WAAW,GAAG,mBAAmB,CACtC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,EACpC,EAAE,EACF,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACtF,CAAC;IAEM,aAAa,CACnB,EAAgB,EAChB,KAAa;QAEb,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;IAEM,yBAAyB,CAC/B,YAA0B,EAC1B,KAAa;QAEb,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,MAAM,UAAU,GAAG,yBAAyB,CAC3C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAC/B,YAAY,EACZ,cAAc,CACd,CAAC;QAEF,MAAM,WAAW,GAAG,mBAAmB,CACtC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,EACpC,YAAY,EACZ,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;QACpC,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrC,wEAAwE;YACxE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QACrD,CAAC;QAED,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAEvE,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;QAClC,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxF,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACpF,CAAC;IAEO,oBAAoB,CAAC,MAAiB;QAC7C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;YACzE,CAAC;QACF,CAAC;IACF,CAAC;CACD;AAED,SAAS,gBAAgB,CACxB,KAAoB,EACpB,YAAyD,EACzD,QAAsB,EACtB,MAAc,EACd,cAAmC,EACnC,aAA4B;IAE5B,MAAM,CACL,aAAa,IAAI,CAAC,IAAI,cAAc,KAAK,SAAS,EAClD,6FAA6F,CAC7F,CAAC;IAEF,oBAAoB,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE1D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAChC,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,mBAAmB;IACxB,YACkB,KAAmB,EACnB,OAAgB,EAChB,aAAsB,IAAI;QAF1B,UAAK,GAAL,KAAK,CAAc;QACnB,YAAO,GAAP,OAAO,CAAS;QAChB,eAAU,GAAV,UAAU,CAAgB;IACzC,CAAC;IAEG,0BAA0B,CAChC,YAA0B,EAC1B,KAAa;QAEb,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,MAAM,eAAe,GAAG,6BAA6B,CACpD,IAAI,CAAC,KAAK,CAAC,UAAU,EACrB,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,GAAG,YAAY,EAAE,EACzD,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;QAExC,IAAI,MAAuD,CAAC;QAC5D,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACzC,sCAAsC;YACtC,2EAA2E;YAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YACxE,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QACvD,CAAC;aAAM,CAAC;YACP,2EAA2E;YAC3E,MAAM,SAAS,GAAG,yBAAyB,CAC1C,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAC1C,YAAY,EACZ,cAAc,CACd,CAAC;YAEF,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;YAElC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CACxE,YAAY,EACZ,cAAc,CACd,CAAC;YAEF,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;YAEvC,MAAM,GAAG;gBACR,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,EAAE;gBACtE,MAAM,EAAE,cAAc;aACtB,CAAC;QACH,CAAC;QAED,+FAA+F;QAC/F,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;YAC5C,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC3E,KAAK,EAAE,IAAI,CAAC,OAAO;aACnB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,mBAAmB,CACzB,YAA0B,EAC1B,WAAyB,EACzB,KAAa;QAEb,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,MAAM,cAAc,GAAG,mBAAmB,CACzC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,EACnC,WAAW,EACX,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;QAEvC,0EAA0E;QAC1E,uCAAuC;QACvC,6EAA6E;QAC7E,wFAAwF;QACxF,2DAA2D;QAC3D,8EAA8E;QAC9E,MAAM,4BAA4B,GACjC,qBAAqB,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,cAAc,CAAC,KAAK,KAAK,SAAS,CAAC;QAExF,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CACnC,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,EACzD,cAAc,EACd,IAAI,CACJ,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAG,mBAAmB,CAC1C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,EACpC,YAAY,EACZ,cAAc,CACd,CAAC;QAEF,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;QAExC,MAAM,eAAe,GAAG,yBAAyB,CAChD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAC/B,YAAY,EACZ,cAAc,CACd,CAAC;QACF,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;QAExC,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC;QAE3C,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACzC,qCAAqC;YACrC,MAAM,SAAS,GACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAE/E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,MAAM,EAAE;gBAC5D,GAAG,SAAS;gBACZ,QAAQ,EAAE,WAAW;aACrB,CAAC,CAAC;YAEH,uHAAuH;YACvH,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CACnC,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EACpD,cAAc,EACd,IAAI,CACJ,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CACjC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EACnD,cAAc,EACd,eAAe,CAAC,KAAK,CACrB,CAAC;YAEF,IAAI,CAAC,oBAAoB,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACP,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CACvF,YAAY,EACZ,cAAc,CACd,CAAC;YACF,cAAc,GAAG,uBAAuB,CAAC,MAAM,CAAC;YAEhD,gEAAgE;YAChE,oDAAoD;YACpD,gBAAgB,CACf,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAC5B,YAAY,EACZ,WAAW,EACX,eAAe,CAAC,MAAM,EACtB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAC/B,uBAAuB,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAC7C,CAAC;YAEF,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CACnC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EACnD,cAAc,EACd,IAAI,CACJ,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,4BAA4B,GACjC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAC5D,WAAW,EACX,cAAc,CACd,CAAC;YAEH,cAAc,GAAG,4BAA4B,CAAC,MAAM,CAAC;YAErD,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,GAAG,CACrD,WAAW,EACX,cAAc,EACd,4BAA4B,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAClD,CAAC;QACH,CAAC;QAED,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,KAAK,GAAG,cAAc,CAAC;YAC9C,IAAI,CAAC,mBAAmB,CACvB,kBAAkB,CAAC,YAAY,EAAE,cAAc,CAAC,EAChD,kBAAkB,CAAC,WAAW,EAAE,cAAc,CAAC,EAC/C,cAAc,CACd,CAAC;QACH,CAAC;IACF,CAAC;IAEM,kCAAkC,CACxC,YAA0B,EAC1B,UAAkB;QAElB,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,yBAAyB,CACxD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAC/B,YAAY,EACZ,CAAC,CACD,CAAC;QAEF,MAAM,YAAY,GAAG,yBAAyB,CAC7C,IAAI,CAAC,KAAK,CAAC,UAAU,EACrB;YACC,GAAG,YAAY;YACf,MAAM,EAAE,gBAAgB,CAAC,MAAM;SAC/B,EACD,CAAC,CACD,CAAC;QAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,2DAA2D;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;YAElF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,UAAU,GAAG,sBAAsB,CACxC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,EAC3C,YAAY,CACZ,CAAC;YAEF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACP,gBAAgB,CACf,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAC5B,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAC5B,YAAY,EACZ,UAAU,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,KAAK,CAAC,aAAa,CACxB,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAEO,YAAY,CACnB,YAA0B,EAC1B,WAAyB,EACzB,KAAa;QAEb,MAAM,kBAAkB,GAAG,yBAAyB,CACnD,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAC5B,YAAY,EACZ,KAAK,CACL,CAAC;QAEF,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC3F,OAAO,EAAE,GAAG,kBAAkB,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAChE,CAAC;IAEM,mBAAmB,CACzB,YAA0B,EAC1B,WAAyB,EACzB,KAAa,EACb,YAAqB;QAErB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAEzE,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;QAC3C,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YACxB,+HAA+H;YAC/H,2GAA2G;YAC3G,qHAAqH;YACrH,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CACjC,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,EACnD,cAAc,EACd,IAAI,CAAC,OAAO,CACZ,CAAC;YAEF,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;gBACvD,oEAAoE;gBACpE,2EAA2E;gBAC3E,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CACnC,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,YAAY,EAAE,EACpD,cAAc,EACd,IAAI,CACJ,CAAC;YACH,CAAC;YAED,6HAA6H;YAC7H,kFAAkF;YAClF,sGAAsG;YACtG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CACjC,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,GAAG,WAAW,EAAE,EACxD,cAAc,EACd,IAAI,CAAC,OAAO,CACZ,CAAC;QACH,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CACnC,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,YAAY,EAAE,EACpD,cAAc,EACd,IAAI,CACJ,CAAC;YAEF,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CACnC,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,GAAG,WAAW,EAAE,EACxD,cAAc,EACd,IAAI,CACJ,CAAC;QACH,CAAC;QAED,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,mBAAmB,CACvB,kBAAkB,CAAC,YAAY,EAAE,cAAc,CAAC,EAChD,kBAAkB,CAAC,WAAW,EAAE,cAAc,CAAC,EAC/C,KAAK,GAAG,cAAc,CACtB,CAAC;QACH,CAAC;IACF,CAAC;IAEO,oBAAoB,CAAC,MAAiB;QAC7C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,GAAG,CACpD,qBAAqB,CAAC,OAAO,CAAC,EAC9B,IAAI,CACJ,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;CACD;AAED,SAAS,oBAAoB,CAC5B,QAeI;IACH,KAAK,EAAE,CAAC,CAAC;CACT;IAED,MAAM,SAAS,GAA8B;QAC5C,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;QACvC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI,GAAG,EAAE;QAC7C,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,aAAa,EAAE;QACjD,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,YAAY,EAAE;QAC5C,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,aAAa,EAAE;QACnD,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,aAAa,EAAE;QACjD,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,uBAAuB,EAAE;KACjE,CAAC;IAEF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,SAAS,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,CAAC,wBAAwB,KAAK,SAAS,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,EAAE,CAAC;QACxF,SAAS,CAAC,wBAAwB,GAAG,KAAK,CAAC,wBAAwB,CAAC;IACrE,CAAC;IACD,IACC,KAAK,CAAC,gCAAgC,KAAK,SAAS;QACpD,KAAK,CAAC,gCAAgC,GAAG,CAAC,EACzC,CAAC;QACF,SAAS,CAAC,gCAAgC,GAAG,KAAK,CAAC,gCAAgC,CAAC;IACrF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACzD,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC7D,SAAS,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IACrC,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACjE,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,kBAAmB,SAAQ,WAA6B;IAIpE,YACC,MAA0D,EACzC,UAA2D,EAC5E,cAAgE;QAEhE,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAHb,eAAU,GAAV,UAAU,CAAiD;QALrE,qBAAgB,GAAW,CAAC,CAAC;QASpC,IAAI,CAAC,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAC3C,CAAC;IAEM,eAAe;QACrB,OAAO,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAClC,CAAC;IAEe,gBAAgB;QAC/B,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,oBAAoB,EAAE,CAAC;QAC3C,CAAC;IACF,CAAC;IAEe,eAAe;QAC9B,MAAM,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAClF,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,oBAAoB,EAAE,CAAC;QAC3C,CAAC;IACF,CAAC;IAED;;;;;;;;OAQG;IACI,UAAU,CAChB,OAAyB,EACzB,OAAkB,EAClB,QAAqB;QAErB,IAAI,OAAO,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACrC,CAAC;QAED,2GAA2G;QAC3G,OAAO,CAAC,cAAc,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAiC,aAAa,EAAE,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAEzC,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,MAAM;YACN,QAAQ;SACR,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,YAAY,CAClB,KAA4B,EAC5B,SAA8B,EAC9B,MAAsB,EACtB,QAAqB;QAErB,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,iBAAiB,CACzF,MAAM,CACN,CAAC;QAEF,MAAM,aAAa,GAAG,8BAA8B,CAAC;YACpD,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;YAClC,WAAW,EAAE,aAAa,EAAE;YAC5B,YAAY,EAAE,aAAa,EAAE;YAC7B,cAAc,EAAE,uBAAuB,EAAE;YACzC,SAAS,EAAE,YAAY,EAAE;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,mBAAmB;YACnB,QAAQ;SACR,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC;IAEM,aAAa,CAAC,OAA0B,EAAE,QAAqB;QACrE,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC;IAEM,YAAY,CAAC,OAA0B;QAC7C,MAAM,SAAS,GAAqB,IAAI,GAAG,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,cAAc,CACpB,MAAM,CAAC,IAAI,KAAK,QAAQ;gBACvB,CAAC,CAAC,oBAAoB,CAAC;oBACrB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;oBAClC,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,SAAS,EAAE,iCAAiC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;oBAClE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;iBAC1C,CAAC;gBACH,CAAC,CAAC,8BAA8B,CAAC;oBAC/B,IAAI,EAAE,MAAM,CAAC,KAAK;oBAClB,WAAW,EAAE;wBACZ,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;qBACrB;oBACD,WAAW,EAAE,aAAa,EAAE;oBAC5B,YAAY,EAAE,aAAa,EAAE;oBAC7B,cAAc,EAAE,uBAAuB,EAAE;oBACzC,SAAS,EAAE,YAAY,EAAE;oBACzB,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,mBAAmB,EAAE,gBAAgB,CACpC,IAAI,CAAC,UAAU,EACf,MAAM,CAAC,SAAS,CAChB,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC;oBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBACzB,CAAC,CACJ,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,cAAc,GAA8B;YACjD,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;YAChD,SAAS,EAAE,OAAO;SAClB,CAAC;QAEF,MAAM,KAAK,GAAqB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAChB,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9B,CAAC;QACD,OAAO,cAAc,CAAC;IACvB,CAAC;IAEM,UAAU,CAAC,KAAc;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;IAEM,uBAAuB,CAAC,IAAsB,EAAE,QAAqB;QAC3E,MAAM,UAAU,GAAkB;YACjC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;SACzC,CAAC;QAEF,IAAI,CAAC,WAAW,CACf,SAAS,CACR,6BAA6B,CAAC;YAC7B,IAAI;YACJ,UAAU;YACV,WAAW,EAAE,aAAa,EAAE;YAC5B,YAAY,EAAE,aAAa,EAAE;YAC7B,cAAc,EAAE,uBAAuB,EAAE;YACzC,SAAS,EAAE,YAAY,EAAE;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ;SACR,CAAC,EACF,QAAQ,CACR,CACD,CAAC;IACH,CAAC;IAEM,+BAA+B,CAAC,IAAsB,EAAE,QAAqB;QACnF,MAAM,UAAU,GAAkB;YACjC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;SACjD,CAAC;QAEF,IAAI,CAAC,WAAW,CACf,SAAS,CACR,6BAA6B,CAAC;YAC7B,IAAI;YACJ,UAAU;YACV,WAAW,EAAE,aAAa,EAAE;YAC5B,YAAY,EAAE,aAAa,EAAE;YAC7B,cAAc,EAAE,uBAAuB,EAAE;YACzC,SAAS,EAAE,YAAY,EAAE;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ;SACR,CAAC,EACF,QAAQ,CACR,CACD,CAAC;IACH,CAAC;CACD;AAED,MAAM,UAAU,8BAA8B,CAAC,KAW9C;IACA,MAAM,EACL,IAAI,EACJ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,cAAc,EACd,SAAS,EACT,WAAW,GAAG,oBAAoB,EAAE,EACpC,mBAAmB,GAAG,EAAE,EACxB,OAAO,EACP,QAAQ,GACR,GAAG,KAAK,CAAC;IACV,MAAM,YAAY,GAAmB,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAE1E,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACvD,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,mBAAmB,EAAE,CAAC;YAClD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,oBAAoB,CAAC,YAAY,EAAE,OAAO,EAAE;gBAC3C,KAAK,EAAE;oBACN,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;iBACjB;aACD,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,oBAAoB,CAAC;YAC3B,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,cAAc;YACd,SAAS;YACT,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE;YAC7B,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;SACzB,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAkB;QACpC,YAAY;KACZ,CAAC;IAEF,MAAM,QAAQ,GAAW,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC9E,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAExD,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,mBAAmB,EAAE,CAAC;QAClD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,oBAAoB,CAAC,YAAY,EAAE,OAAO,EAAE;YAC3C,KAAK,EAAE,OAAO;SACd,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,6BAA6B,CAAC;QACpC,IAAI,EAAE,IAAI,CAAC,MAAM;QACjB,UAAU,EAAE,aAAa;QACzB,WAAW;QACX,YAAY;QACZ,cAAc;QACd,SAAS;QACT,WAAW;QACX,QAAQ;QACR,MAAM,EAAE,QAAQ;KAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,KAUtC;IACA,MAAM,EACL,IAAI,EACJ,MAAM,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GACnF,GAAG,KAAK,CAAC;IACV,oBAAoB,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAElE,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAC9B,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAC7D,MAAM,CACN,CAAC;QACF,OAAO,oBAAoB,CAAC;YAC3B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE;YACnC,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;SACzC,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACP,MAAM,cAAc,GAAG,gBAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC9E,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;SAC1B,CAAC,CAAC;QAEH,MAAM,WAAW,GAAgB;YAChC,SAAS,EAAE,gBAAgB,CAAC,UAAU;YACtC,MAAM,EAAE,cAAc;SACtB,CAAC;QAEF,OAAO,8BAA8B,CAAC;YACrC,GAAG,KAAK;YACR,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE;YACtD,WAAW;YACX,mBAAmB,EAAE,EAAE;YACvB,OAAO,EAAE,MAAM;SACf,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAwBD,SAAS,iCAAiC,CAAC,OAA4B;IACtE,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAID,SAAS,2BAA2B,CAAC,OAAyC;IAI7E,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,YAAY,IAAI,OAAO,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,4BAA4B,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,4BAA4B,CACpC,YAA4C;IAE5C,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,YAAY,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,IAAI,GAA0B,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;QACxE,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;QAC3C,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAwB,EAAE,EAAW;IAC/D,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,kBAAkB,CAClC,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,EAClB,OAAO,CAAC,MAAM,CACd,CAAC;IACF,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,kBAAkB,CAC1B,YAA4B,EAC5B,KAAuC,EACvC,OAAkC,EAClC,MAA0B;IAE1B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACzF,OAAO,IAAI,CAAC,YAAY,CAAC;AAC1B,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAkB,EAAE,MAAe;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IACf,CAAC;IAED,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAkB,EAAE,MAAc;IACtE,OAAO,sBAAsB,CAAC,KAAK,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC;AAC5E,CAAC;AAED,SAAS,gBAAgB,CACxB,KAAuC,EACvC,OAAkC,EAClC,EAAU;IAEV,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAa;IACpE,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB;IAC9C,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,kBAAkB,CAAC,aAA4B;IACvD,IAAI,aAAa,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,GAAG,aAAa,EAAE,YAAY,EAAE,IAAI,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;IAChF,CAAC;IAED,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,2BAA2B,CACnC,QAAsB,EACtB,YAA0C,EAC1C,WAAoC;IAEpC,OAAO,QAAQ,CAAC,KAAK,KAAK,SAAS;QAClC,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE;QAC9E,CAAC,CAAC,EAAE,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,sBAAsB,CAC9B,OAAgB,EAChB,YAA0C,EAC1C,WAAoC;IAEpC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,OAAO;QACN,GAAG,OAAO;QACV,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC;KACvE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAA2B,EAAE,MAAc;IACxE,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAClF,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAE3E,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,yBAAyB,CACjC,SAA2B,EAC3B,GAAkB,EAClB,KAAa;IAEb,OAAO,SAAS,CAAC,cAAc;SAC7B,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;SAClB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,6BAA6B,CACrC,SAA2B,EAC3B,GAAkB,EAClB,KAAa;IAEb,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IACf,CAAC;IAED,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,qBAAqB,CAC7B,QAAsB,EACtB,WAAsC;IAEtC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,gBAAgB,CAC/B,OAAgB,EAChB,WAAsC;IAEtC,OAAO,OAAO,CAAC,MAAM,KAAK,SAAS;QAClC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE;QACtE,CAAC,CAAC,OAAO,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,MAAc,EACd,WAAsC;IAEtC,IAAI,SAAS,GAAG,MAAM,CAAC;IACvB,IAAI,YAAY,GAAuB,MAAM,CAAC;IAE9C,iDAAiD;IACjD,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,sBAAsB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACjE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,SAAS,GAAG,SAAS,CAAC;QAEtB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAChC,YAAY,GAAG,sBAAsB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAChC,YAAY,GAAG,sBAAsB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,CAAC,CAAC,wBAAwB,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACpF,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,MAAwB;IAC7C,OAAO,CAAC,MAAM,CAAC,wBAAwB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAWD,SAAS,gBAAgB,CAAC,CAAU,EAAE,CAAU;IAC/C,OAAO,wBAAwB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC;AAC5E,CAAC;AAED,SAAS,yBAAyB,CACjC,KAAoB,EACpB,QAAsB,EACtB,KAAa;IAEb,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,yBAAyB,CACjC,KAAoB,EACpB,QAAsB,EACtB,KAAa;IAEb,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,oBAAoB,CAC5B,WAA+B,EAC/B,aAA4C,EAC5C,kBAAiD;IAEjD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,YAAY,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;QAClD,YAAY,CAAC,GAAG,CACf,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EACnD,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,KAAK,CACX,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,OAAO;QACN,UAAU,EAAE,wBAAwB,EAAE;QACtC,UAAU,EAAE,wBAAwB,EAAE;QACtC,WAAW,EAAE,aAAa,EAAE;QAC5B,eAAe,EAAE,uBAAuB,EAAE;QAC1C,qBAAqB,EAAE,uBAAuB,EAAE;KAChD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CACnB,MAAwB,EACxB,IAAsB,EACtB,kBAAmD,EACnD,aAA8D,EAC9D,mBAAoD,EACpD,aAA4B;IAE5B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;IACpC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QACjE,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CACnD,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,GAAG,QAAQ,EAAE,EACrD,CAAC,CACD,CAAC;QACF,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACzC,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3E,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACP,MAAM,eAAe,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YACrF,MAAM,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAC7E,eAAe,EACf,CAAC,CACD,CAAC,KAAK,CAAC;YAER,IAAI,wBAAwB,KAAK,SAAS,EAAE,CAAC;gBAC5C,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,cAAc,GACnB,wBAAwB;gBACxB,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAE9D,sFAAsF;YACtF,yHAAyH;YACzH,gBAAgB,CACf,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,MAAM,EACN,cAAc,EACd,aAAa,CACb,CAAC;QACH,CAAC;IACF,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;QACtE,YAAY,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,YAAY,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CACpB,QAAuB,EACvB,YAA2B,EAC3B,WAAwD,EACxD,IAAsB,EACtB,kBAAmD;IAEnD,IAAI,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;IAC/B,MAAM,eAAe,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5F,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC;IAE/B,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CACnD;QACC,GAAG,eAAe,CAAC,KAAK;QACxB,MAAM,EAAE,gBAAgB,CAAC,WAAW;KACpC,EACD,KAAK,CACL,CAAC;IAEF,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC;IAE/B,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACzC,6DAA6D;QAC7D,iGAAiG;QACjG,gDAAgD;QAChD,kBAAkB,CAAC,GAAG,CACrB,qBAAqB,CAAC,gBAAgB,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAChF,IAAI,CACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACP,MAAM,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAC7E,eAAe,CAAC,KAAK,EACrB,CAAC,CACD,CAAC,KAAK,CAAC;QAER,IAAI,wBAAwB,KAAK,SAAS,EAAE,CAAC;YAC5C,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChF,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;QAE3B,MAAM,cAAc,GAAG,wBAAwB,IAAI,WAAW,CAAC,KAAK,CAAC;QAErE,sFAAsF;QACtF,yHAAyH;QACzH,aAAa,CACZ,YAAY,EACZ,eAAe,CAAC,KAAK,EACrB,WAAW,CAAC,KAAK,EACjB,KAAK,EACL,cAAc,CACd,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC;IAClD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACxB,YAAY,CACX,QAAQ,EACR,YAAY,EACZ;YACC,KAAK,EAAE,kBAAkB,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;YACnD,KAAK,EAAE,kBAAkB,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;YACnD,MAAM,EAAE,cAAc;SACtB,EACD,IAAI,EACJ,kBAAkB,CAClB,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,2BAA2B,CAAC,KAAkB;IACtD,KAAK,MAAM,EACV,KAAK,EACL,MAAM,EACN,KAAK,EAAE,cAAc,GACrB,IAAI,KAAK,CAAC,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,wBAAwB,GAAG,gBAAgB,CAChD,cAAc,EACd,KAAK,CAAC,UAAU,CAAC,WAAW,CAC5B,CAAC;QAEF,IAAI,wBAAwB,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,aAAa,GAAG,sBAAsB,CAC3C,KAAK,CAAC,mBAAmB,EACzB,wBAAwB,CAAC,MAAM,CAC/B,CAAC;YAEF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACjC,KAAK,CAAC,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE;oBACzD,GAAG,wBAAwB;oBAC3B,MAAM,EAAE,aAAa;iBACrB,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB,EAAE,GAAW,EAAE,GAAW;IACvE,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxE,IAAI,sBAAsB,CAAC,KAAK,CAAC,eAAe,EAAE,aAAa,CAAC,KAAK,SAAS,EAAE,CAAC;QAChF,oBAAoB,CAAC,KAAK,CAAC,eAAe,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QAC1E,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IACjF,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CACvB,UAA+C,EAC/C,UAA+C;IAE/C,MAAM,MAAM,GAAmB,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,0BAA0B,CAClC,MAA0B,EAC1B,MAA0B,EAC1B,mBAAuC,EACvC,qBAAoD;IAEpD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB,CACzB,OAAyB,EACzB,OAAyB,EACzB,oBAAqD,EACrD,mBAAuC,EACvC,qBAAoD,EACpD,mBAAwC;IAExC,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAExD,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,aAAa,CACZ,OAAO,EACP,OAAO,EACP,aAAa,EACb,WAAW,CAAC,KAAK,EACjB,WAAW,CAAC,KAAK,EACjB,WAAW,CAAC,MAAM,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,CACnB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QACnF,MAAM,SAAS,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,yBAAyB,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACnF,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEjF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACP,MAAM,OAAO,GAAG,yBAAyB,CACxC,OAAO,EACP,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EACjD,CAAC,CACD,CAAC,CAAC,CAAC,CAAC;YAEL,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,uEAAuE;gBACvE,uCAAuC;gBACvC,mBAAmB,CAAC,kBAAkB,CAAC,GAAG,CACzC,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAClE,IAAI,CACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,gBAAgB,CACf,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,OAAO,EACP,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK;oBAC7D,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,EAC/D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAkB,CACvE,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,MAAM,iBAAiB,IAAI,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;QACnF,2BAA2B,CAC1B,iBAAiB,CAAC,KAAK,EACvB,iBAAiB,CAAC,MAAM,EACxB,iBAAiB,CAAC,KAAK,EACvB,OAAO,EACP,aAAa,CACb,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;QACvE,aAAa,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,SAAS,2BAA2B,CACnC,eAA6B,EAC7B,KAAa,EACb,cAAuB,EACvB,OAAyB,EACzB,aAA4B;IAE5B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,WAAW,GAAG,yBAAyB,CAC5C,OAAO,CAAC,SAAS,EACjB,eAAe,EACf,cAAc,CACd,CAAC;IACF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;IAEpC,MAAM,WAAW,GAAG,mBAAmB,CACtC,OAAO,CAAC,cAAc,EACtB,WAAW,CAAC,KAAK,EACjB,cAAc,CACd,CAAC;IACF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;IAEpC,aAAa,CAAC,qBAAqB,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAE5E,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACrC,0GAA0G;QAC1G,aAAa,CAAC,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IAC5F,CAAC;SAAM,CAAC;QACP,0FAA0F;QAC1F,gDAAgD;IACjD,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,GAAG,cAAc,CAAC;IAC9C,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACxB,2BAA2B,CAC1B,kBAAkB,CAAC,eAAe,EAAE,cAAc,CAAC,EACnD,cAAc,EACd,cAAc,EACd,OAAO,EACP,aAAa,CACb,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CACrB,OAAyB,EACzB,OAAyB,EACzB,WAA0B,EAC1B,KAAmB,EACnB,KAAmB,EACnB,KAAa,EACb,mBAAuC,EACvC,qBAAoD,EACpD,mBAAwC;IAExC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IACvF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;IAEpC,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACrC,kCAAkC;QAClC,gGAAgG;QAChG,mBAAmB,CAAC,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAE3F,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC1C,gGAAgG;YAChG,qBAAqB,CAAC,GAAG,CACxB,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EAC7C,cAAc,EACd,IAAI,CACJ,CAAC;QACH,CAAC;QAED,mBAAmB,CAAC,GAAG,CACtB,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EAC7C,cAAc,EACd,WAAW,CAAC,KAAK,CACjB,CAAC;IACH,CAAC;SAAM,CAAC;QACP,4GAA4G;QAC5G,4EAA4E;QAC5E,2EAA2E;QAC3E,kGAAkG;QAClG,kBAAkB,CAAC,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAEvD,qEAAqE;QACrE,gBAAgB,CACf,WAAW,EACX,KAAK,EACL,KAAK,EACL,cAAc,EACd,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,KAAK,CACvE,CAAC;IACH,CAAC;IAED,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;QAC5B,aAAa,CACZ,OAAO,EACP,OAAO,EACP,WAAW,EACX,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,EACzC,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,EACzC,KAAK,GAAG,cAAc,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,CACnB,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB;IAClD,OAAO;QACN,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE;QACpC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE;QACpC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC7C,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE;QAC9C,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,CAAC,KAAK,EAAE;KAC1D,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAwB,EAAE,UAAmB;IACrE,MAAM,aAAa,GAAkB,YAAY,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QACpF,MAAM,QAAQ,GAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,yBAAyB,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAEjF,mDAAmD;QACnD,6HAA6H;QAC7H,IACC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;aACvF,KAAK,KAAK,SAAS,EACpB,CAAC;YACF,gBAAgB,CACf,aAAa,EACb,SAAS,EACT,SAAS,EACT,MAAM,EACN,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,EAC5D,MAAM,CAAC,aAAa,CACpB,CAAC;QACH,CAAC;IACF,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QAChB,wFAAwF;QACxF,kFAAkF;QAClF,KAAK,MAAM,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,GACN,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;IACF,CAAC;IAED,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,SAAS,YAAY,CACpB,MAAwB,EACxB,aAA4B,EAC5B,KAAmB,EACnB,KAAmB,EACnB,MAAc;IAEd,KAAK,MAAM,WAAW,IAAI,qBAAqB,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACvF,MAAM,CACL,CAAC,WAAW,CAAC,KAAK,EAClB,oEAAoE,CACpE,CAAC;IACH,CAAC;IAED,IAAI,cAAc,GAAG,MAAM,CAAC;IAC5B,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IACtF,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;IACpC,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CACxE,KAAK,EACL,cAAc,CACd,CAAC;QACF,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC;QAE1C,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAC1F,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAEzC,aAAa,CACZ,aAAa,EACb,KAAK,EACL,KAAK,EACL,cAAc,EACd,iBAAiB,CAAC,KAAK,IAAI,gBAAgB,CAAC,KAAK,CACjD,CAAC;IACH,CAAC;IAED,IAAI,cAAc,GAAG,MAAM,EAAE,CAAC;QAC7B,YAAY,CACX,MAAM,EACN,aAAa,EACb,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,EACzC,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,EACzC,MAAM,GAAG,cAAc,CACvB,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAAyB,EACzB,EAAgB,EAChB,KAAa;IAEb,OAAO,KAAK;SACV,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC;SAC/D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAAyB,EACzB,EAAgB,EAChB,KAAa;IAEb,OAAO,KAAK;SACV,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;SAC1D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,KAAyB,EACzB,EAAgB,EAChB,KAAa;IAEb,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,KAAyB,EACzB,EAAgB,EAChB,KAAa;IAEb,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,KAAoB,EACpB,KAAmB,EACnB,KAAmB,EACnB,KAAa,EACb,cAAmC;IAEnC,IAAI,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO;IACR,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CACL,KAAK,CAAC,KAAK,KAAK,SAAS;YACxB,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAC5E,2BAA2B,CAC3B,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CACL,KAAK,CAAC,KAAK,KAAK,SAAS;YACxB,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAC5E,2BAA2B,CAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1C,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE1C,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IACzD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAoB,EAAE,EAAgB,EAAE,KAAa;IAClF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;QACxD,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAoB,EAAE,EAAgB,EAAE,KAAa;IAChF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;QACxD,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CACxB,aAA4B,EAC5B,KAAmB,EACnB,KAAmB,EACnB,KAAa,EACb,YAA2B,EAC3B,cAAmC;IAEnC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC7E,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;IAErC,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACtC,oBAAoB,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACzE,CAAC;IAED,aAAa,CACZ,aAAa,EACb,YAAY,CAAC,KAAK,IAAI,KAAK,EAC3B,KAAK,EACL,cAAc,EACd,cAAc,CACd,CAAC;IAEF,uBAAuB,CAAC,aAAa,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAE9D,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,KAAK,GAAG,cAAc,CAAC;QAC9C,gBAAgB,CACf,aAAa,EACb,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,EACzC,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,EACzC,cAAc,EACd,YAAY,EACZ,cAAc,CACd,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAC/B,KAAoB,EACpB,MAAoB,EACpB,KAAa;IAEb,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtE,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;IAEpC,MAAM,iBAAiB,GAAG,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvF,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAE1C,MAAM,eAAe,GAAG,yBAAyB,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7F,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;IAExC,IACC,eAAe,CAAC,KAAK,KAAK,SAAS;QACnC,WAAW,CAAC,KAAK,KAAK,SAAS;QAC/B,iBAAiB,CAAC,KAAK,KAAK,SAAS,EACpC,CAAC;QACF,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,GAAG,cAAc,CAAC;IAC9C,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACxB,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC;IAC5F,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAC7B,KAAoB,EACpB,KAAmB,EACnB,KAAmB,EACnB,KAAa;IAEb,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,wBAAwB,CAChC,KAAoB,EACpB,YAA0C,EAC1C,WAAoC,EACpC,WAAsC;IAEtC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAC7C,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,EAC3D,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,CAC3D,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAC7C,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,EAC3D,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,CAC3D,CAAC;IAEF,MAAM,WAAW,GAA8B,aAAa,CAC3D,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;QAClE,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACzD,oBAAoB,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC;KACrF,CAAC,CACF,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,UAAU,CACvD,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,EAC3D,CAAC,OAAO,EAAE,EAAE,CACX,sBAAsB,CACrB,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,EACtC,YAAY,EACZ,WAAW,CACX,CACF,CAAC;IAEF,MAAM,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,CAAC,UAAU,CACnE,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,EAC3D,CAAC,OAAO,EAAE,EAAE,CACX,sBAAsB,CACrB,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,EACtC,YAAY,EACZ,WAAW,CACX,CACF,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,mBAAmB;IAC3B,OAAO,IAAI,QAAQ,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAwB,EAAE,KAAa;IACvE,MAAM,CACL,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAC5C,0CAA0C,CAC1C,CAAC;IAEF,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS;QAClC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE;QACnE,CAAC,CAAC,KAAK,CAAC;AACV,CAAC;AAED,SAAS,sBAAsB,CAC9B,KAAoB,EACpB,WAAsC;IAEtC,MAAM,MAAM,GAAoC,aAAa,EAAE,CAAC;IAChE,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;QACzF,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YACpE,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrC,WAAW,GAAG,IAAI,CAAC;YACpB,CAAC;QACF,CAAC;QAED,KAAK,MAAM,iBAAiB,IAAI,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YACrF,IAAI,iBAAiB,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC3C,WAAW,GAAG,IAAI,CAAC;YACpB,CAAC;QACF,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACjF,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAAoB,EACpB,WAAsC;IAEtC,MAAM,MAAM,GAA2C,aAAa,EAAE,CAAC;IACvE,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,MAAM,GAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACvE,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;YACxF,IAAI,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAChC,YAAY,GAAG,EAAE,CAAC;gBAClB,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACtC,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAoB;IAC5C,OAAO;QACN,UAAU,EAAE,wBAAwB,EAAE;QACtC,UAAU,EAAE,wBAAwB,EAAE;QACtC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC7C,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE;QAC9C,qBAAqB,EAAE,uBAAuB,EAAE;KAChD,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, fail } from \"@fluidframework/core-utils/internal\";\nimport { BTree } from \"@tylerbu/sorted-btree-es6\";\n\nimport type { ICodecFamily } from \"../../codec/index.js\";\nimport {\n\ttype ChangeEncodingContext,\n\ttype ChangeFamily,\n\ttype ChangeFamilyEditor,\n\ttype ChangeRebaser,\n\ttype ChangesetLocalId,\n\ttype DeltaDetachedNodeBuild,\n\ttype DeltaDetachedNodeDestruction,\n\ttype DeltaDetachedNodeId,\n\ttype DeltaFieldChanges,\n\ttype DeltaFieldMap,\n\ttype DeltaRoot,\n\tEditBuilder,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\ttype RevisionInfo,\n\ttype RevisionMetadataSource,\n\ttype RevisionTag,\n\ttype TaggedChange,\n\tmakeDetachedNodeId,\n\treplaceAtomRevisions,\n\trevisionMetadataSourceFromInfo,\n\tareEqualChangeAtomIds,\n\ttype ChangeAtomId,\n\tareEqualChangeAtomIdOpts,\n\ttagChange,\n\tmakeAnonChange,\n\ttype DeltaDetachedNodeChanges,\n\ttype DeltaDetachedNodeRename,\n\tmapTaggedChange,\n\tnewChangeAtomIdRangeMap,\n\tnewChangeAtomIdTransform,\n\ttype ChangeAtomIdRangeMap,\n\toffsetChangeAtomId,\n\ttype NormalizedUpPath,\n\ttype NormalizedFieldUpPath,\n\tisDetachedUpPathRoot,\n\tsubtractChangeAtomIds,\n\tmakeChangeAtomId,\n} from \"../../core/index.js\";\nimport {\n\ttype IdAllocationState,\n\ttype IdAllocator,\n\ttype Mutable,\n\tbrand,\n\tidAllocatorFromMaxId,\n\tidAllocatorFromState,\n\ttype RangeQueryResult,\n\tgetOrCreate,\n\tnewTupleBTree,\n\tmergeTupleBTrees,\n\ttype TupleBTree,\n\tRangeMap,\n\tbalancedReduce,\n\ttype RangeQueryEntry,\n\ttype RangeQueryResultFragment,\n} from \"../../util/index.js\";\nimport type { TreeChunk } from \"../chunked-forest/index.js\";\n\nimport {\n\ttype ComposeNodeManager,\n\ttype CrossFieldMap,\n\tCrossFieldTarget,\n\ttype DetachedNodeEntry,\n\ttype InvertNodeManager,\n\ttype RebaseDetachedNodeEntry,\n\ttype RebaseNodeManager,\n\tsetInCrossFieldMap,\n} from \"./crossFieldQueries.js\";\nimport {\n\ttype FieldChangeHandler,\n\tNodeAttachState,\n\ttype RebaseRevisionMetadata,\n} from \"./fieldChangeHandler.js\";\nimport { convertGenericChange, genericFieldKind } from \"./genericFieldKind.js\";\nimport type { GenericChangeset } from \"./genericFieldKindTypes.js\";\nimport {\n\ttype ChangeAtomIdBTree,\n\ttype ChangeAtomIdKey,\n\ttype CrossFieldKey,\n\ttype CrossFieldKeyRange,\n\ttype CrossFieldKeyTable,\n\ttype CrossFieldRangeTable,\n\ttype FieldChange,\n\ttype FieldChangeMap,\n\ttype FieldChangeset,\n\ttype FieldId,\n\tgetFromChangeAtomIdMap,\n\ttype ModularChangeset,\n\tnewCrossFieldRangeTable,\n\ttype NodeChangeset,\n\ttype NodeId,\n\ttype NodeLocation,\n\trangeQueryChangeAtomIdMap,\n\ttype RebaseVersion,\n\ttype RootNodeTable,\n\tsetInChangeAtomIdMap,\n} from \"./modularChangeTypes.js\";\nimport type { FlexFieldKind } from \"./fieldKind.js\";\n\n/**\n * Implementation of ChangeFamily which delegates work in a given field to the appropriate FieldKind\n * as determined by the schema.\n */\nexport class ModularChangeFamily\n\timplements\n\t\tChangeFamily<ModularEditBuilder, ModularChangeset>,\n\t\tChangeRebaser<ModularChangeset>\n{\n\tpublic static readonly emptyChange: ModularChangeset = makeModularChangeset();\n\n\tpublic readonly fieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>;\n\n\tpublic constructor(\n\t\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n\t\tpublic readonly codecs: ICodecFamily<ModularChangeset, ChangeEncodingContext>,\n\t) {\n\t\tthis.fieldKinds = fieldKinds;\n\t}\n\n\tpublic get rebaser(): ChangeRebaser<ModularChangeset> {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Produces an equivalent list of `FieldChangeset`s that all target the same {@link FlexFieldKind}.\n\t * @param changes - The list of `FieldChange`s whose `FieldChangeset`s needs to be normalized.\n\t * @returns An object that contains both the equivalent list of `FieldChangeset`s that all\n\t * target the same {@link FlexFieldKind}, and the `FieldKind` that they target.\n\t * The returned `FieldChangeset`s may be a shallow copy of the input `FieldChange`s.\n\t */\n\tprivate normalizeFieldChanges(\n\t\tchange1: FieldChange,\n\t\tchange2: FieldChange,\n\t): {\n\t\tfieldKind: FieldKindIdentifier;\n\t\tchangeHandler: FieldChangeHandler<unknown>;\n\t\tchange1: FieldChangeset;\n\t\tchange2: FieldChangeset;\n\t} {\n\t\t// TODO: Handle the case where changes have conflicting field kinds\n\t\tconst kind =\n\t\t\tchange1.fieldKind !== genericFieldKind.identifier\n\t\t\t\t? change1.fieldKind\n\t\t\t\t: change2.fieldKind;\n\n\t\tif (kind === genericFieldKind.identifier) {\n\t\t\t// Both changes are generic\n\t\t\treturn {\n\t\t\t\tfieldKind: genericFieldKind.identifier,\n\t\t\t\tchangeHandler: genericFieldKind.changeHandler,\n\t\t\t\tchange1: change1.change,\n\t\t\t\tchange2: change2.change,\n\t\t\t};\n\t\t}\n\t\tconst fieldKind = getFieldKind(this.fieldKinds, kind);\n\t\tconst changeHandler = fieldKind.changeHandler;\n\t\tconst normalizedChange1 = this.normalizeFieldChange(change1, changeHandler);\n\t\tconst normalizedChange2 = this.normalizeFieldChange(change2, changeHandler);\n\t\treturn {\n\t\t\tfieldKind: kind,\n\t\t\tchangeHandler,\n\t\t\tchange1: normalizedChange1,\n\t\t\tchange2: normalizedChange2,\n\t\t};\n\t}\n\n\tprivate normalizeFieldChange<T>(\n\t\tfieldChange: FieldChange,\n\t\thandler: FieldChangeHandler<T>,\n\t): FieldChangeset {\n\t\tif (fieldChange.fieldKind !== genericFieldKind.identifier) {\n\t\t\treturn fieldChange.change;\n\t\t}\n\n\t\t// The cast is based on the `fieldKind` check above\n\t\tconst genericChange = fieldChange.change as unknown as GenericChangeset;\n\t\tconst convertedChange = convertGenericChange(genericChange, handler) as FieldChangeset;\n\n\t\treturn convertedChange;\n\t}\n\n\tpublic compose(changes: TaggedChange<ModularChangeset>[]): ModularChangeset {\n\t\tconst { maxId } = getRevInfoFromTaggedChanges(changes);\n\t\tconst idState: IdAllocationState = { maxId };\n\n\t\tconst pairwiseDelegate = (\n\t\t\tleft: ModularChangeset,\n\t\t\tright: ModularChangeset,\n\t\t): ModularChangeset => {\n\t\t\treturn this.composePair(left, right, idState);\n\t\t};\n\n\t\tconst innerChanges = changes.map((change) => change.change);\n\t\treturn balancedReduce(innerChanges, pairwiseDelegate, makeModularChangeset);\n\t}\n\n\tprivate composePair(\n\t\tchange1: ModularChangeset,\n\t\tchange2: ModularChangeset,\n\t\tidState: IdAllocationState,\n\t): ModularChangeset {\n\t\tconst revInfos = composeRevInfos(change1.revisions, change2.revisions);\n\n\t\tconst { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys, rootNodes } =\n\t\t\tthis.composeAllFields(change1, change2, revInfos, idState);\n\n\t\tconst { allBuilds, allDestroys, allRefreshers } = composeBuildsDestroysAndRefreshers(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t);\n\n\t\tconst composed = makeModularChangeset({\n\t\t\tfieldChanges,\n\t\t\tnodeChanges,\n\t\t\tnodeToParent,\n\t\t\tnodeAliases,\n\t\t\tcrossFieldKeys,\n\t\t\tmaxId: idState.maxId,\n\t\t\trevisions: revInfos,\n\t\t\trootNodes,\n\t\t\tbuilds: allBuilds,\n\t\t\tdestroys: allDestroys,\n\t\t\trefreshers: allRefreshers,\n\t\t});\n\n\t\t// XXX: This is an expensive assert which should be disabled before merging.\n\t\tthis.validateChangeset(composed);\n\t\treturn composed;\n\t}\n\n\tprivate composeAllFields(\n\t\tpotentiallyConflictedChange1: ModularChangeset,\n\t\tpotentiallyConflictedChange2: ModularChangeset,\n\t\trevInfos: RevisionInfo[],\n\t\tidState: IdAllocationState,\n\t): ModularChangesetContent {\n\t\t// Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.\n\t\t// This means that compose must preserve declarations (e.g., new cells) made by conflicted changes (so that we can rebase over the composition).\n\t\t// TODO: remove once AB#46104 is completed\n\t\tconst change1 = this.getEffectiveChange(potentiallyConflictedChange1);\n\t\tconst change2 = this.getEffectiveChange(potentiallyConflictedChange2);\n\n\t\tconst genId: IdAllocator = idAllocatorFromState(idState);\n\t\tconst revisionMetadata: RevisionMetadataSource = revisionMetadataSourceFromInfo(revInfos);\n\n\t\t// We merge nodeChanges, nodeToParent, and nodeAliases from the two changesets.\n\t\t// The merged tables will have correct entries for all nodes which are only referenced in one of the input changesets.\n\t\t// During composeFieldMaps and composeInvalidatedElements we will find all nodes referenced in both input changesets\n\t\t// and adjust these tables as necessary.\n\t\t// Note that when merging these tables we may encounter key collisions and will arbitrarily drop values in that case.\n\t\t// A collision for a node ID means that that node is referenced in both changesets\n\t\t// (since we assume that if two changesets use the same node ID they are referring to the same node),\n\t\t// therefore all collisions will be addressed when processing the intersection of the changesets.\n\t\tconst composedNodeChanges: ChangeAtomIdBTree<NodeChangeset> = brand(\n\t\t\tmergeTupleBTrees(change1.nodeChanges, change2.nodeChanges),\n\t\t);\n\n\t\tconst composedNodeToParent: ChangeAtomIdBTree<NodeLocation> = brand(\n\t\t\tmergeTupleBTrees(change1.nodeToParent, change2.nodeToParent),\n\t\t);\n\t\tconst composedNodeAliases: ChangeAtomIdBTree<NodeId> = brand(\n\t\t\tmergeTupleBTrees(change1.nodeAliases, change2.nodeAliases),\n\t\t);\n\n\t\tconst pendingCompositions: PendingCompositions = {\n\t\t\tnodeIdsToCompose: [],\n\t\t\taffectedBaseFields: newTupleBTree(),\n\t\t};\n\n\t\tconst movedCrossFieldKeys: CrossFieldKeyTable = newCrossFieldRangeTable();\n\t\tconst removedCrossFieldKeys: CrossFieldRangeTable<boolean> = newCrossFieldRangeTable();\n\n\t\tconst composedRoots = composeRootTables(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t\tcomposedNodeToParent,\n\t\t\tmovedCrossFieldKeys,\n\t\t\tremovedCrossFieldKeys,\n\t\t\tpendingCompositions,\n\t\t);\n\n\t\tconst crossFieldTable = newComposeTable(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t\tcomposedRoots,\n\t\t\tmovedCrossFieldKeys,\n\t\t\tremovedCrossFieldKeys,\n\t\t\tpendingCompositions,\n\t\t);\n\n\t\tconst composedFields = this.composeFieldMaps(\n\t\t\tchange1.fieldChanges,\n\t\t\tchange2.fieldChanges,\n\t\t\tundefined,\n\t\t\tgenId,\n\t\t\tcrossFieldTable,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tthis.composeInvalidatedElements(\n\t\t\tcrossFieldTable,\n\t\t\tcomposedFields,\n\t\t\tcomposedNodeChanges,\n\t\t\tcomposedNodeToParent,\n\t\t\tcomposedNodeAliases,\n\t\t\tgenId,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tfor (const entry of crossFieldTable.renamesToDelete.entries()) {\n\t\t\tdeleteNodeRenameFrom(crossFieldTable.composedRootNodes, entry.start, entry.length);\n\t\t}\n\n\t\tfor (const [nodeId, location] of crossFieldTable.movedNodeToParent.entries()) {\n\t\t\t// Moved nodes are from change2.\n\t\t\t// If there is a corresponding node in change1, then composedNodeToParent will already have the correct entry,\n\t\t\t// because the location of the node is the same in change1 and the composed change\n\t\t\t// (since they have the same input context).\n\t\t\tif (crossFieldTable.newToBaseNodeId.get(nodeId) === undefined) {\n\t\t\t\tcomposedNodeToParent.set(nodeId, location);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tfieldChanges: composedFields,\n\t\t\tnodeChanges: composedNodeChanges,\n\t\t\tnodeToParent: composedNodeToParent,\n\t\t\tnodeAliases: composedNodeAliases,\n\t\t\tcrossFieldKeys: composeCrossFieldKeyTables(\n\t\t\t\tchange1.crossFieldKeys,\n\t\t\t\tchange2.crossFieldKeys,\n\t\t\t\tcrossFieldTable.movedCrossFieldKeys,\n\t\t\t\tcrossFieldTable.removedCrossFieldKeys,\n\t\t\t),\n\t\t\trootNodes: composedRoots,\n\t\t};\n\t}\n\n\tprivate composeInvalidatedField(\n\t\tfieldChange: FieldChange,\n\t\tcrossFieldTable: ComposeTable,\n\t\tgenId: IdAllocator,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst context = crossFieldTable.fieldToContext.get(fieldChange);\n\t\tassert(context !== undefined, 0x8cc /* Should have context for every invalidated field */);\n\t\tconst { change1: fieldChange1, change2: fieldChange2, composedChange } = context;\n\n\t\tcrossFieldTable.pendingCompositions.affectedBaseFields.delete(\n\t\t\tfieldIdKeyFromFieldId(context.fieldId),\n\t\t);\n\n\t\tconst rebaser = getChangeHandler(this.fieldKinds, composedChange.fieldKind).rebaser;\n\t\tconst composeNodes = (child1: NodeId | undefined, child2: NodeId | undefined): NodeId => {\n\t\t\tif (child1 !== undefined && child2 !== undefined) {\n\t\t\t\taddNodesToCompose(crossFieldTable, child1, child2);\n\t\t\t}\n\n\t\t\treturn child1 ?? child2 ?? fail(0xb22 /* Should not compose two undefined nodes */);\n\t\t};\n\n\t\tconst amendedChange = rebaser.compose(\n\t\t\tfieldChange1,\n\t\t\tfieldChange2,\n\t\t\tcomposeNodes,\n\t\t\tgenId,\n\t\t\tnew ComposeNodeManagerI(crossFieldTable, context.fieldId, false),\n\t\t\trevisionMetadata,\n\t\t);\n\t\tcomposedChange.change = brand(amendedChange);\n\t}\n\n\t/**\n\t * Updates everything in the composed output which may no longer be valid.\n\t * This could be due to\n\t * - discovering that two node changesets refer to the same node (`nodeIdsToCompose`)\n\t * - a previously composed field being invalidated by a cross field effect (`invalidatedFields`)\n\t * - a field which was copied directly from an input changeset being invalidated by a cross field effect\n\t * (`affectedBaseFields`)\n\t *\n\t * Updating an element may invalidate further elements. This function runs until there is no more invalidation.\n\t */\n\tprivate composeInvalidatedElements(\n\t\ttable: ComposeTable,\n\t\tcomposedFields: FieldChangeMap,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tcomposedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst pending = table.pendingCompositions;\n\t\twhile (pending.nodeIdsToCompose.length > 0 || pending.affectedBaseFields.length > 0) {\n\t\t\tthis.processPendingNodeCompositions(\n\t\t\t\ttable,\n\t\t\t\tcomposedNodes,\n\t\t\t\tcomposedNodeToParent,\n\t\t\t\tnodeAliases,\n\t\t\t\tgenId,\n\t\t\t\tmetadata,\n\t\t\t);\n\n\t\t\tthis.composeAffectedFields(\n\t\t\t\ttable,\n\t\t\t\ttable.baseChange,\n\t\t\t\tpending.affectedBaseFields,\n\t\t\t\tcomposedFields,\n\t\t\t\tcomposedNodes,\n\t\t\t\tgenId,\n\t\t\t\tmetadata,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate processPendingNodeCompositions(\n\t\ttable: ComposeTable,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tcomposedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RevisionMetadataSource,\n\t): void {\n\t\t// Note that the call to `composeNodesById` can add entries to `crossFieldTable.nodeIdPairs`.\n\t\tfor (const [id1, id2] of table.pendingCompositions.nodeIdsToCompose) {\n\t\t\tthis.composeNodesById(\n\t\t\t\ttable.baseChange,\n\t\t\t\ttable.newChange,\n\t\t\t\tcomposedNodes,\n\t\t\t\tcomposedNodeToParent,\n\t\t\t\tnodeAliases,\n\t\t\t\tid1,\n\t\t\t\tid2,\n\t\t\t\tgenId,\n\t\t\t\ttable,\n\t\t\t\tmetadata,\n\t\t\t);\n\t\t}\n\n\t\ttable.pendingCompositions.nodeIdsToCompose.length = 0;\n\t}\n\n\t/**\n\t * Ensures that each field in `affectedFields` has been updated in the composition output.\n\t * Any field which has already been composed is ignored.\n\t * All other fields are optimistically assumed to not have any changes in the other input changeset.\n\t *\n\t * @param change - The changeset which contains the affected fields.\n\t * This should be one of the two changesets being composed.\n\t * @param areBaseFields - Whether the affected fields are part of the base changeset.\n\t * If not, they are assumed to be part of the new changeset.\n\t * @param affectedFields - The set of fields to process.\n\t */\n\tprivate composeAffectedFields(\n\t\ttable: ComposeTable,\n\t\tchange: ModularChangeset,\n\t\taffectedFields: BTree<FieldIdKey, true>,\n\t\tcomposedFields: FieldChangeMap,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst fieldsToProcess = affectedFields.clone();\n\t\taffectedFields.clear();\n\n\t\tfor (const fieldIdKey of fieldsToProcess.keys()) {\n\t\t\tconst fieldId = fieldIdFromFieldIdKey(fieldIdKey);\n\t\t\tconst fieldChange = fieldChangeFromId(change, fieldId);\n\n\t\t\tif (\n\t\t\t\ttable.fieldToContext.has(fieldChange) ||\n\t\t\t\ttable.newFieldToBaseField.has(fieldChange)\n\t\t\t) {\n\t\t\t\tthis.composeInvalidatedField(fieldChange, table, genId, metadata);\n\t\t\t} else {\n\t\t\t\tthis.composeFieldWithNoNewChange(\n\t\t\t\t\ttable,\n\t\t\t\t\tfieldChange,\n\t\t\t\t\tfieldId,\n\t\t\t\t\tcomposedFields,\n\t\t\t\t\tcomposedNodes,\n\t\t\t\t\tgenId,\n\t\t\t\t\tmetadata,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate composeFieldWithNoNewChange(\n\t\ttable: ComposeTable,\n\t\tbaseFieldChange: FieldChange,\n\t\tfieldId: FieldId,\n\t\tcomposedFields: FieldChangeMap,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst emptyChange = this.createEmptyFieldChange(baseFieldChange.fieldKind);\n\n\t\tconst composedField = this.composeFieldChanges(\n\t\t\tfieldId,\n\t\t\tbaseFieldChange,\n\t\t\temptyChange,\n\t\t\tgenId,\n\t\t\ttable,\n\t\t\tmetadata,\n\t\t);\n\n\t\tif (fieldId.nodeId === undefined) {\n\t\t\tcomposedFields.set(fieldId.field, composedField);\n\t\t\treturn;\n\t\t}\n\n\t\tconst nodeId = normalizeNodeId(\n\t\t\tgetFromChangeAtomIdMap(table.newToBaseNodeId, fieldId.nodeId) ?? fieldId.nodeId,\n\t\t\ttable.baseChange.nodeAliases,\n\t\t);\n\n\t\t// We clone the node changeset before mutating it, as it may be from one of the input changesets.\n\t\tconst nodeChangeset: Mutable<NodeChangeset> = cloneNodeChangeset(\n\t\t\tnodeChangeFromId(composedNodes, table.baseChange.nodeAliases, nodeId),\n\t\t);\n\t\tsetInChangeAtomIdMap(composedNodes, nodeId, nodeChangeset);\n\n\t\tif (nodeChangeset.fieldChanges === undefined) {\n\t\t\tnodeChangeset.fieldChanges = new Map();\n\t\t}\n\n\t\tnodeChangeset.fieldChanges.set(fieldId.field, composedField);\n\t}\n\n\tprivate composeFieldMaps(\n\t\tchange1: FieldChangeMap | undefined,\n\t\tchange2: FieldChangeMap | undefined,\n\t\tparentId: NodeId | undefined,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: ComposeTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): FieldChangeMap {\n\t\tconst composedFields: FieldChangeMap = new Map();\n\t\tif (change1 === undefined || change2 === undefined) {\n\t\t\treturn change1 ?? change2 ?? composedFields;\n\t\t}\n\n\t\tfor (const [field, fieldChange1] of change1) {\n\t\t\tconst fieldId: FieldId = { nodeId: parentId, field };\n\t\t\tconst fieldChange2 = change2.get(field);\n\n\t\t\tconst cachedComposedFieldChange =\n\t\t\t\tcrossFieldTable.fieldToContext.get(fieldChange1)?.composedChange;\n\n\t\t\tif (fieldChange2 === undefined && cachedComposedFieldChange !== undefined) {\n\t\t\t\t// This can happen if the field was previous processed in `composeFieldWithNoNewChange`.\n\t\t\t\t// If `change2` does not have a change for this field, then without this check we would\n\t\t\t\t// lose the composed field change and instead simply have `change1`'s change.\n\t\t\t\tcomposedFields.set(field, cachedComposedFieldChange);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst composedField =\n\t\t\t\tfieldChange2 !== undefined\n\t\t\t\t\t? this.composeFieldChanges(\n\t\t\t\t\t\t\tfieldId,\n\t\t\t\t\t\t\tfieldChange1,\n\t\t\t\t\t\t\tfieldChange2,\n\t\t\t\t\t\t\tgenId,\n\t\t\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\t\t\trevisionMetadata,\n\t\t\t\t\t\t)\n\t\t\t\t\t: fieldChange1;\n\n\t\t\tcomposedFields.set(field, composedField);\n\t\t}\n\n\t\tfor (const [field, fieldChange2] of change2) {\n\t\t\tif (!change1?.has(field)) {\n\t\t\t\tcomposedFields.set(field, fieldChange2);\n\t\t\t}\n\t\t}\n\n\t\treturn composedFields;\n\t}\n\n\t/**\n\t * Returns the composition of the two input fields.\n\t *\n\t * Any nodes in this field which were modified by both changesets\n\t * will be added to `crossFieldTable.pendingCompositions.nodeIdsToCompose`.\n\t *\n\t * Any fields which had cross-field information sent to them as part of this field composition\n\t * will be added to `affectedBaseFields` in `crossFieldTable.pendingCompositions`.\n\t *\n\t * Any composed `FieldChange` which is invalidated by new cross-field information will be added to `crossFieldTable.invalidatedFields`.\n\t */\n\tprivate composeFieldChanges(\n\t\tfieldId: FieldId,\n\t\tchange1: FieldChange,\n\t\tchange2: FieldChange,\n\t\tidAllocator: IdAllocator,\n\t\tcrossFieldTable: ComposeTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): FieldChange {\n\t\tconst {\n\t\t\tfieldKind,\n\t\t\tchangeHandler,\n\t\t\tchange1: change1Normalized,\n\t\t\tchange2: change2Normalized,\n\t\t} = this.normalizeFieldChanges(change1, change2);\n\n\t\tconst manager = new ComposeNodeManagerI(crossFieldTable, fieldId);\n\n\t\tconst composedChange = changeHandler.rebaser.compose(\n\t\t\tchange1Normalized,\n\t\t\tchange2Normalized,\n\t\t\t(child1, child2) => {\n\t\t\t\tif (child1 !== undefined && child2 !== undefined) {\n\t\t\t\t\taddNodesToCompose(crossFieldTable, child1, child2);\n\t\t\t\t}\n\t\t\t\treturn child1 ?? child2 ?? fail(0xb23 /* Should not compose two undefined nodes */);\n\t\t\t},\n\t\t\tidAllocator,\n\t\t\tmanager,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tconst composedField: FieldChange = {\n\t\t\tfieldKind,\n\t\t\tchange: brand(composedChange),\n\t\t};\n\n\t\tcrossFieldTable.fieldToContext.set(change1, {\n\t\t\tfieldId,\n\t\t\tchange1: change1Normalized,\n\t\t\tchange2: change2Normalized,\n\t\t\tcomposedChange: composedField,\n\t\t});\n\n\t\tcrossFieldTable.newFieldToBaseField.set(change2, change1);\n\t\treturn composedField;\n\t}\n\n\tprivate composeNodesById(\n\t\tchange1: ModularChangeset,\n\t\tchange2: ModularChangeset,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tcomposedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\tcomposedAliases: ChangeAtomIdBTree<NodeId>,\n\t\tid1: NodeId,\n\t\tid2: NodeId,\n\t\tidAllocator: IdAllocator,\n\t\tcrossFieldTable: ComposeTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst nodeChangeset1 = nodeChangeFromId(change1.nodeChanges, change1.nodeAliases, id1);\n\t\tconst nodeChangeset2 = nodeChangeFromId(change2.nodeChanges, change2.nodeAliases, id2);\n\t\tconst composedNodeChangeset = this.composeNodeChanges(\n\t\t\tid1,\n\t\t\tnodeChangeset1,\n\t\t\tnodeChangeset2,\n\t\t\tidAllocator,\n\t\t\tcrossFieldTable,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tsetInChangeAtomIdMap(composedNodes, id1, composedNodeChangeset);\n\n\t\tif (!areEqualChangeAtomIds(id1, id2)) {\n\t\t\tcomposedNodes.delete([id2.revision, id2.localId]);\n\t\t\tcomposedNodeToParent.delete([id2.revision, id2.localId]);\n\t\t\tsetInChangeAtomIdMap(composedAliases, id2, id1);\n\n\t\t\t// We need to delete id1 to avoid forming a cycle in case id1 already had an alias.\n\t\t\tcomposedAliases.delete([id1.revision, id1.localId]);\n\t\t}\n\t}\n\n\tprivate composeNodeChanges(\n\t\tnodeId: NodeId,\n\t\tchange1: NodeChangeset,\n\t\tchange2: NodeChangeset,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: ComposeTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): NodeChangeset {\n\t\t// WARNING: this composition logic assumes that we never make compositions of the following form:\n\t\t// change1: a changeset that impact the existence of a node\n\t\t// change2: a node-exists constraint on that node.\n\t\t// This is currently enforced by the fact that constraints which apply to the input context are included first in the composition.\n\t\t// If that weren't the case, we would need to rebase the status of the constraint backward over the changes from change1.\n\t\tconst nodeExistsConstraint = change1.nodeExistsConstraint ?? change2.nodeExistsConstraint;\n\n\t\t// WARNING: this composition logic assumes that we never make compositions of the following form:\n\t\t// change1: a node-exists-on-revert constraint on a node\n\t\t// change2: a changeset that impacts the existence of that node\n\t\t// This is currently enforced by the fact that constraints which apply to the revert are included last in the composition.\n\t\t// If that weren't the case, we would need to rebase the status of the constraint forward over the changes from change2.\n\t\tconst nodeExistsConstraintOnRevert =\n\t\t\tchange1.nodeExistsConstraintOnRevert ?? change2.nodeExistsConstraintOnRevert;\n\n\t\tconst composedFieldChanges = this.composeFieldMaps(\n\t\t\tchange1.fieldChanges,\n\t\t\tchange2.fieldChanges,\n\t\t\tnodeId,\n\t\t\tgenId,\n\t\t\tcrossFieldTable,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tconst composedNodeChange: Mutable<NodeChangeset> = {};\n\n\t\tif (composedFieldChanges.size > 0) {\n\t\t\tcomposedNodeChange.fieldChanges = composedFieldChanges;\n\t\t}\n\n\t\tif (nodeExistsConstraint !== undefined) {\n\t\t\tcomposedNodeChange.nodeExistsConstraint = nodeExistsConstraint;\n\t\t}\n\n\t\tif (nodeExistsConstraintOnRevert !== undefined) {\n\t\t\tcomposedNodeChange.nodeExistsConstraintOnRevert = nodeExistsConstraintOnRevert;\n\t\t}\n\n\t\treturn composedNodeChange;\n\t}\n\n\t/**\n\t * @param change - The change to invert.\n\t * @param isRollback - Whether the inverted change is meant to rollback a change on a branch as is the case when\n\t * @param revisionForInvert - The revision for the invert changeset.\n\t * performing a sandwich rebase.\n\t */\n\tpublic invert(\n\t\tchange: TaggedChange<ModularChangeset>,\n\t\tisRollback: boolean,\n\t\trevisionForInvert: RevisionTag,\n\t): ModularChangeset {\n\t\t// Rollback changesets destroy the nodes created by the change being rolled back.\n\t\tconst destroys = isRollback ? invertBuilds(change.change.builds) : undefined;\n\n\t\t// Destroys only occur in rollback changesets, which are never inverted.\n\t\tassert(\n\t\t\tchange.change.destroys === undefined,\n\t\t\t0x89a /* Unexpected destroys in change to invert */,\n\t\t);\n\n\t\tconst revInfos: RevisionInfo[] = isRollback\n\t\t\t? [{ revision: revisionForInvert, rollbackOf: change.revision }]\n\t\t\t: [{ revision: revisionForInvert }];\n\n\t\tif (hasConflicts(change.change)) {\n\t\t\treturn makeModularChangeset({\n\t\t\t\tmaxId: change.change.maxId as number,\n\t\t\t\trevisions: revInfos,\n\t\t\t\tdestroys,\n\t\t\t});\n\t\t}\n\n\t\tconst genId: IdAllocator = idAllocatorFromMaxId(change.change.maxId ?? -1);\n\n\t\tconst crossFieldTable: InvertTable = {\n\t\t\tchange: change.change,\n\t\t\tentries: newChangeAtomIdRangeMap(),\n\t\t\toriginalFieldToContext: new Map(),\n\t\t\tinvertRevision: revisionForInvert,\n\t\t\tinvertedNodeToParent: brand(change.change.nodeToParent.clone()),\n\t\t\tinvalidatedFields: new Set(),\n\t\t\tinvertedRoots: invertRootTable(change.change, isRollback),\n\t\t\tattachToDetachId: newChangeAtomIdTransform(),\n\t\t};\n\t\tconst { revInfos: oldRevInfos } = getRevInfoFromTaggedChanges([change]);\n\t\tconst revisionMetadata = revisionMetadataSourceFromInfo(oldRevInfos);\n\n\t\tconst invertedFields = this.invertFieldMap(\n\t\t\tchange.change.fieldChanges,\n\t\t\tundefined,\n\t\t\tisRollback,\n\t\t\tgenId,\n\t\t\tcrossFieldTable,\n\t\t\trevisionMetadata,\n\t\t\trevisionForInvert,\n\t\t);\n\n\t\tconst invertedNodes: ChangeAtomIdBTree<NodeChangeset> = newTupleBTree();\n\t\tchange.change.nodeChanges.forEachPair(([revision, localId], nodeChangeset) => {\n\t\t\tinvertedNodes.set(\n\t\t\t\t[revision, localId],\n\t\t\t\tthis.invertNodeChange(\n\t\t\t\t\tnodeChangeset,\n\t\t\t\t\t{ revision, localId },\n\t\t\t\t\tisRollback,\n\t\t\t\t\tgenId,\n\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\trevisionMetadata,\n\t\t\t\t\trevisionForInvert,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\n\t\tif (crossFieldTable.invalidatedFields.size > 0) {\n\t\t\tconst fieldsToUpdate = crossFieldTable.invalidatedFields;\n\t\t\tcrossFieldTable.invalidatedFields = new Set();\n\t\t\tfor (const fieldChange of fieldsToUpdate) {\n\t\t\t\tconst originalFieldChange = fieldChange.change;\n\t\t\t\tconst context = crossFieldTable.originalFieldToContext.get(fieldChange);\n\t\t\t\tassert(\n\t\t\t\t\tcontext !== undefined,\n\t\t\t\t\t0x851 /* Should have context for every invalidated field */,\n\t\t\t\t);\n\t\t\t\tconst { invertedField } = context;\n\n\t\t\t\tconst amendedChange = getChangeHandler(\n\t\t\t\t\tthis.fieldKinds,\n\t\t\t\t\tfieldChange.fieldKind,\n\t\t\t\t).rebaser.invert(\n\t\t\t\t\toriginalFieldChange,\n\t\t\t\t\tisRollback,\n\t\t\t\t\tgenId,\n\t\t\t\t\trevisionForInvert,\n\t\t\t\t\tnew InvertNodeManagerI(crossFieldTable, context.fieldId),\n\t\t\t\t\trevisionMetadata,\n\t\t\t\t);\n\t\t\t\tinvertedField.change = brand(amendedChange);\n\t\t\t}\n\t\t}\n\n\t\tconst crossFieldKeys = this.makeCrossFieldKeyTable(invertedFields, invertedNodes);\n\n\t\tthis.processInvertRenames(crossFieldTable);\n\n\t\treturn makeModularChangeset({\n\t\t\tfieldChanges: invertedFields,\n\t\t\tnodeChanges: invertedNodes,\n\t\t\tnodeToParent: crossFieldTable.invertedNodeToParent,\n\t\t\trootNodes: crossFieldTable.invertedRoots,\n\t\t\tnodeAliases: change.change.nodeAliases,\n\t\t\tcrossFieldKeys,\n\t\t\tmaxId: genId.getMaxId(),\n\t\t\trevisions: revInfos,\n\t\t\tconstraintViolationCount: change.change.constraintViolationCountOnRevert,\n\t\t\tconstraintViolationCountOnRevert: change.change.constraintViolationCount,\n\t\t\tdestroys,\n\t\t});\n\t}\n\n\tprivate invertFieldMap(\n\t\tchanges: FieldChangeMap,\n\t\tparentId: NodeId | undefined,\n\t\tisRollback: boolean,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: InvertTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t\trevisionForInvert: RevisionTag,\n\t): FieldChangeMap {\n\t\tconst invertedFields: FieldChangeMap = new Map();\n\n\t\tfor (const [field, fieldChange] of changes) {\n\t\t\tconst fieldId = { nodeId: parentId, field };\n\t\t\tconst manager = new InvertNodeManagerI(crossFieldTable, fieldId);\n\t\t\tconst invertedChange = getChangeHandler(\n\t\t\t\tthis.fieldKinds,\n\t\t\t\tfieldChange.fieldKind,\n\t\t\t).rebaser.invert(\n\t\t\t\tfieldChange.change,\n\t\t\t\tisRollback,\n\t\t\t\tgenId,\n\t\t\t\trevisionForInvert,\n\t\t\t\tmanager,\n\t\t\t\trevisionMetadata,\n\t\t\t);\n\n\t\t\tconst invertedFieldChange: FieldChange = {\n\t\t\t\t...fieldChange,\n\t\t\t\tchange: brand(invertedChange),\n\t\t\t};\n\t\t\tinvertedFields.set(field, invertedFieldChange);\n\n\t\t\tcrossFieldTable.originalFieldToContext.set(fieldChange, {\n\t\t\t\tfieldId,\n\t\t\t\tinvertedField: invertedFieldChange,\n\t\t\t});\n\t\t}\n\n\t\treturn invertedFields;\n\t}\n\n\tprivate invertNodeChange(\n\t\tchange: NodeChangeset,\n\t\tid: NodeId,\n\t\tisRollback: boolean,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: InvertTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t\trevisionForInvert: RevisionTag,\n\t): NodeChangeset {\n\t\tconst inverse: Mutable<NodeChangeset> = {};\n\n\t\t// If the node has a constraint, it should be inverted to a node-exist-on-revert constraint. This ensure that if\n\t\t// the inverse is inverted again, the original input constraint will be restored.\n\t\tif (change.nodeExistsConstraint !== undefined) {\n\t\t\tinverse.nodeExistsConstraintOnRevert = change.nodeExistsConstraint;\n\t\t}\n\n\t\t// The node-exist-on-revert constraint of a node is the constraint that should apply when the a change is reverted.\n\t\t// So, it should become the constraint in the inverse. If this constraint is violated when applying the inverse,\n\t\t// it will be discarded.\n\t\tif (change.nodeExistsConstraintOnRevert !== undefined) {\n\t\t\tinverse.nodeExistsConstraint = change.nodeExistsConstraintOnRevert;\n\t\t}\n\n\t\tif (change.fieldChanges !== undefined) {\n\t\t\tinverse.fieldChanges = this.invertFieldMap(\n\t\t\t\tchange.fieldChanges,\n\t\t\t\tid,\n\t\t\t\tisRollback,\n\t\t\t\tgenId,\n\t\t\t\tcrossFieldTable,\n\t\t\t\trevisionMetadata,\n\t\t\t\trevisionForInvert,\n\t\t\t);\n\t\t}\n\n\t\treturn inverse;\n\t}\n\n\tprivate processInvertRenames(table: InvertTable): void {\n\t\tfor (const {\n\t\t\tstart: newAttachId,\n\t\t\tvalue: originalDetachId,\n\t\t\tlength,\n\t\t} of table.attachToDetachId.entries()) {\n\t\t\t// Note that the detach location is already set in `invertDetach`.\n\t\t\taddNodeRename(table.invertedRoots, originalDetachId, newAttachId, length, undefined);\n\t\t}\n\t}\n\n\tpublic rebase(\n\t\ttaggedChange: TaggedChange<ModularChangeset>,\n\t\tpotentiallyConflictedOver: TaggedChange<ModularChangeset>,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): ModularChangeset {\n\t\t// Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.\n\t\t// This means that we must rebase over a muted version of the conflicted changeset.\n\t\t// That is, a version that includes its declarations (e.g., new cells) but not its changes.\n\t\t// TODO: remove once AB#46104 is completed\n\t\tconst over = mapTaggedChange(\n\t\t\tpotentiallyConflictedOver,\n\t\t\tthis.getEffectiveChange(potentiallyConflictedOver.change),\n\t\t);\n\n\t\tconst change = taggedChange.change;\n\t\tconst maxId = Math.max(change.maxId ?? -1, over.change.maxId ?? -1);\n\t\tconst idState: IdAllocationState = { maxId };\n\t\tconst genId: IdAllocator = idAllocatorFromState(idState);\n\n\t\tconst affectedBaseFields: TupleBTree<FieldIdKey, boolean> = newTupleBTree();\n\t\tconst nodesToRebase: [newChangeset: NodeId, baseChangeset: NodeId][] = [];\n\n\t\tconst rebasedNodeToParent: ChangeAtomIdBTree<NodeLocation> = brand(\n\t\t\tchange.nodeToParent.clone(),\n\t\t);\n\n\t\tconst rebaseVersion = Math.max(\n\t\t\tchange.rebaseVersion,\n\t\t\tover.change.rebaseVersion,\n\t\t) as RebaseVersion;\n\n\t\tconst rebasedRootNodes = rebaseRoots(\n\t\t\tchange,\n\t\t\tover.change,\n\t\t\taffectedBaseFields,\n\t\t\tnodesToRebase,\n\t\t\trebasedNodeToParent,\n\t\t\trebaseVersion,\n\t\t);\n\t\tconst crossFieldTable: RebaseTable = {\n\t\t\trebaseVersion,\n\t\t\tentries: newDetachedEntryMap(),\n\t\t\tnewChange: change,\n\t\t\tbaseChange: over.change,\n\t\t\tbaseFieldToContext: new Map(),\n\t\t\tbaseRoots: over.change.rootNodes,\n\t\t\trebasedRootNodes,\n\t\t\tbaseToRebasedNodeId: newTupleBTree(),\n\t\t\trebasedFields: new Set(),\n\t\t\trebasedNodeToParent,\n\t\t\trebasedDetachLocations: newChangeAtomIdRangeMap(),\n\t\t\tmovedDetaches: newChangeAtomIdRangeMap(),\n\t\t\tnodeIdPairs: [],\n\t\t\taffectedBaseFields,\n\t\t\tfieldsWithUnattachedChild: new Set(),\n\t\t};\n\n\t\tconst getBaseRevisions = (): RevisionTag[] =>\n\t\t\trevisionInfoFromTaggedChange(over).map((info) => info.revision);\n\n\t\tconst rebaseMetadata: RebaseRevisionMetadata = {\n\t\t\t...revisionMetadata,\n\t\t\tgetRevisionToRebase: () => taggedChange.revision,\n\t\t\tgetBaseRevisions,\n\t\t};\n\n\t\tconst rebasedNodes: ChangeAtomIdBTree<NodeChangeset> = brand(change.nodeChanges.clone());\n\n\t\tconst rebasedFields = this.rebaseIntersectingFields(\n\t\t\tnodesToRebase,\n\t\t\tcrossFieldTable,\n\t\t\trebasedNodes,\n\t\t\tgenId,\n\t\t\trebaseMetadata,\n\t\t);\n\n\t\tthis.rebaseInvalidatedFields(\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\tcrossFieldTable,\n\t\t\trebaseMetadata,\n\t\t\tgenId,\n\t\t);\n\n\t\tfixupRebasedDetachLocations(crossFieldTable);\n\n\t\tconst constraintState = newConstraintState(change.constraintViolationCount ?? 0);\n\t\tconst revertConstraintState = newConstraintState(\n\t\t\tchange.constraintViolationCountOnRevert ?? 0,\n\t\t);\n\n\t\tthis.updateConstraints(\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\trebasedRootNodes,\n\t\t\tconstraintState,\n\t\t\trevertConstraintState,\n\t\t);\n\n\t\tconst fieldsWithRootMoves = getFieldsWithRootMoves(\n\t\t\tcrossFieldTable.rebasedRootNodes,\n\t\t\tchange.nodeAliases,\n\t\t);\n\n\t\tconst fieldToRootChanges = getFieldToRootChanges(\n\t\t\tcrossFieldTable.rebasedRootNodes,\n\t\t\tchange.nodeAliases,\n\t\t);\n\n\t\tconst rebased = makeModularChangeset({\n\t\t\tfieldChanges: this.pruneFieldMap(\n\t\t\t\trebasedFields,\n\t\t\t\tundefined,\n\t\t\t\trebasedNodes,\n\t\t\t\tcrossFieldTable.rebasedNodeToParent,\n\t\t\t\tchange.nodeAliases,\n\t\t\t\tcrossFieldTable.rebasedRootNodes,\n\t\t\t\tfieldsWithRootMoves,\n\t\t\t\tfieldToRootChanges,\n\t\t\t),\n\t\t\tnodeChanges: rebasedNodes,\n\t\t\tnodeToParent: crossFieldTable.rebasedNodeToParent,\n\t\t\trootNodes: this.pruneRoots(\n\t\t\t\tcrossFieldTable.rebasedRootNodes,\n\t\t\t\trebasedNodes,\n\t\t\t\tcrossFieldTable.rebasedNodeToParent,\n\t\t\t\tchange.nodeAliases,\n\t\t\t\tfieldsWithRootMoves,\n\t\t\t\tfieldToRootChanges,\n\t\t\t),\n\t\t\t// TODO: Do we need to include aliases for node changesets added during rebasing?\n\t\t\tnodeAliases: change.nodeAliases,\n\t\t\tcrossFieldKeys: rebaseCrossFieldKeys(\n\t\t\t\tchange.crossFieldKeys,\n\t\t\t\tcrossFieldTable.movedDetaches,\n\t\t\t\tcrossFieldTable.rebasedDetachLocations,\n\t\t\t),\n\t\t\tmaxId: idState.maxId,\n\t\t\trevisions: change.revisions,\n\t\t\tconstraintViolationCount: constraintState.violationCount,\n\t\t\tconstraintViolationCountOnRevert: revertConstraintState.violationCount,\n\t\t\tbuilds: change.builds,\n\t\t\tdestroys: change.destroys,\n\t\t\trefreshers: change.refreshers,\n\t\t\trebaseVersion,\n\t\t});\n\n\t\t// XXX: This is an expensive assert which should be disabled before merging.\n\t\tthis.validateChangeset(rebased);\n\t\treturn rebased;\n\t}\n\n\t// This performs a first pass on all fields which have both new and base changes.\n\t// TODO: Can we also handle additional passes in this method?\n\tprivate rebaseIntersectingFields(\n\t\trootChanges: [newChangeset: NodeId, baseChangeset: NodeId][],\n\t\tcrossFieldTable: RebaseTable,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RebaseRevisionMetadata,\n\t): FieldChangeMap {\n\t\tconst change = crossFieldTable.newChange;\n\t\tconst baseChange = crossFieldTable.baseChange;\n\t\tconst rebasedFields = this.rebaseFieldMap(\n\t\t\tchange.fieldChanges,\n\t\t\tbaseChange.fieldChanges,\n\t\t\tundefined,\n\t\t\tgenId,\n\t\t\tcrossFieldTable,\n\t\t\tmetadata,\n\t\t);\n\n\t\tfor (const [newChildChange, baseChildChange] of rootChanges) {\n\t\t\tconst rebasedNode = this.rebaseNodeChange(\n\t\t\t\tnewChildChange,\n\t\t\t\tbaseChildChange,\n\t\t\t\tgenId,\n\t\t\t\tcrossFieldTable,\n\t\t\t\tmetadata,\n\t\t\t);\n\n\t\t\tsetInChangeAtomIdMap(rebasedNodes, newChildChange, rebasedNode);\n\t\t}\n\n\t\t// This loop processes all fields which have both base and new changes.\n\t\t// Note that the call to `rebaseNodeChange` can add entries to `crossFieldTable.nodeIdPairs`.\n\t\tfor (const [newId, baseId, _attachState] of crossFieldTable.nodeIdPairs) {\n\t\t\tconst rebasedNode = this.rebaseNodeChange(\n\t\t\t\tnewId,\n\t\t\t\tbaseId,\n\t\t\t\tgenId,\n\t\t\t\tcrossFieldTable,\n\t\t\t\tmetadata,\n\t\t\t);\n\n\t\t\tsetInChangeAtomIdMap(rebasedNodes, newId, rebasedNode);\n\t\t}\n\n\t\treturn rebasedFields;\n\t}\n\n\tprivate rebaseFieldWithoutNewChanges(\n\t\tbaseFieldChange: FieldChange,\n\t\tbaseFieldId: FieldId,\n\t\tcrossFieldTable: RebaseTable,\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RebaseRevisionMetadata,\n\n\t\t/**\n\t\t * The ID of a node in `baseFieldChange` which should be included in the rebased field change.\n\t\t */\n\t\tbaseNodeId?: NodeId,\n\t): void {\n\t\t// This field has no changes in the new changeset, otherwise it would have been added to\n\t\t// `crossFieldTable.baseFieldToContext` when processing fields with both base and new changes.\n\t\tconst rebaseChild = (\n\t\t\tchild: NodeId | undefined,\n\t\t\tbaseChild: NodeId | undefined,\n\t\t\tstateChange: NodeAttachState | undefined,\n\t\t): NodeId | undefined => {\n\t\t\tassert(child === undefined, 0x9c3 /* There should be no new changes in this field */);\n\t\t\tif (baseChild === undefined || baseNodeId === undefined) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn areEqualChangeAtomIds(\n\t\t\t\tnormalizeNodeId(baseChild, crossFieldTable.baseChange.nodeAliases),\n\t\t\t\tbaseNodeId,\n\t\t\t)\n\t\t\t\t? baseNodeId\n\t\t\t\t: undefined;\n\t\t};\n\n\t\tconst handler = getChangeHandler(this.fieldKinds, baseFieldChange.fieldKind);\n\t\tconst fieldChange: FieldChange = {\n\t\t\t...baseFieldChange,\n\t\t\tchange: brand(handler.createEmpty()),\n\t\t};\n\n\t\tconst rebasedNodeId =\n\t\t\tbaseFieldId.nodeId !== undefined\n\t\t\t\t? rebasedNodeIdFromBaseNodeId(crossFieldTable, baseFieldId.nodeId)\n\t\t\t\t: undefined;\n\n\t\tconst fieldId: FieldId = { nodeId: rebasedNodeId, field: baseFieldId.field };\n\n\t\tconst rebasedField: unknown = handler.rebaser.rebase(\n\t\t\tfieldChange.change,\n\t\t\tbaseFieldChange.change,\n\t\t\trebaseChild,\n\t\t\tgenId,\n\t\t\tnew RebaseNodeManagerI(crossFieldTable, fieldId),\n\t\t\tmetadata,\n\t\t\tcrossFieldTable.rebaseVersion,\n\t\t);\n\n\t\tconst rebasedFieldChange: FieldChange = {\n\t\t\t...baseFieldChange,\n\t\t\tchange: brand(rebasedField),\n\t\t};\n\n\t\tconst context: RebaseFieldContext = {\n\t\t\tnewChange: fieldChange,\n\t\t\tbaseChange: baseFieldChange,\n\t\t\trebasedChange: rebasedFieldChange,\n\t\t\tfieldId,\n\t\t\tbaseNodeIds: newTupleBTree(),\n\t\t};\n\n\t\tif (baseNodeId !== undefined) {\n\t\t\tsetInChangeAtomIdMap(context.baseNodeIds, baseNodeId, true);\n\t\t}\n\n\t\tcrossFieldTable.baseFieldToContext.set(baseFieldChange, context);\n\n\t\tcrossFieldTable.rebasedFields.add(rebasedFieldChange);\n\n\t\tthis.attachRebasedField(\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\tcrossFieldTable,\n\t\t\trebasedFieldChange,\n\t\t\tfieldId,\n\t\t\tgenId,\n\t\t\tmetadata,\n\t\t);\n\t}\n\n\tprivate rebaseInvalidatedFields(\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tcrossFieldTable: RebaseTable,\n\t\trebaseMetadata: RebaseRevisionMetadata,\n\t\tgenId: IdAllocator,\n\t): void {\n\t\twhile (crossFieldTable.affectedBaseFields.size > 0) {\n\t\t\tconst baseFields = crossFieldTable.affectedBaseFields.clone();\n\t\t\tcrossFieldTable.affectedBaseFields.clear();\n\n\t\t\tfor (const baseFieldIdKey of baseFields.keys()) {\n\t\t\t\tconst baseFieldId = normalizeFieldId(\n\t\t\t\t\tfieldIdFromFieldIdKey(baseFieldIdKey),\n\t\t\t\t\tcrossFieldTable.baseChange.nodeAliases,\n\t\t\t\t);\n\n\t\t\t\tconst baseField = fieldChangeFromId(crossFieldTable.baseChange, baseFieldId);\n\n\t\t\t\tassert(\n\t\t\t\t\tbaseField !== undefined,\n\t\t\t\t\t0x9c2 /* Cross field key registered for empty field */,\n\t\t\t\t);\n\n\t\t\t\tconst context = crossFieldTable.baseFieldToContext.get(baseField);\n\t\t\t\tif (context === undefined) {\n\t\t\t\t\tthis.rebaseFieldWithoutNewChanges(\n\t\t\t\t\t\tbaseField,\n\t\t\t\t\t\tbaseFieldId,\n\t\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\t\trebasedFields,\n\t\t\t\t\t\trebasedNodes,\n\t\t\t\t\t\tgenId,\n\t\t\t\t\t\trebaseMetadata,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.rebaseInvalidatedField(\n\t\t\t\t\t\tbaseField,\n\t\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\trebaseMetadata,\n\t\t\t\t\t\tgenId,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rebaseInvalidatedField(\n\t\tbaseField: FieldChange,\n\t\tcrossFieldTable: RebaseTable,\n\t\tcontext: RebaseFieldContext,\n\t\trebaseMetadata: RebaseRevisionMetadata,\n\t\tgenId: IdAllocator,\n\t): void {\n\t\tconst {\n\t\t\tchangeHandler,\n\t\t\tchange1: fieldChangeset,\n\t\t\tchange2: baseChangeset,\n\t\t} = this.normalizeFieldChanges(context.newChange, context.baseChange);\n\n\t\tconst rebaseChild = (\n\t\t\tcurr: NodeId | undefined,\n\t\t\tbase: NodeId | undefined,\n\t\t): NodeId | undefined => {\n\t\t\tif (curr !== undefined) {\n\t\t\t\treturn curr;\n\t\t\t}\n\n\t\t\tif (base !== undefined && getFromChangeAtomIdMap(context.baseNodeIds, base) === true) {\n\t\t\t\treturn base;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\n\t\tlet allowInval = false;\n\t\tif (crossFieldTable.fieldsWithUnattachedChild.has(baseField)) {\n\t\t\tcrossFieldTable.fieldsWithUnattachedChild.delete(baseField);\n\t\t\tallowInval = true;\n\t\t}\n\n\t\tcontext.rebasedChange.change = brand(\n\t\t\tchangeHandler.rebaser.rebase(\n\t\t\t\tfieldChangeset,\n\t\t\t\tbaseChangeset,\n\t\t\t\trebaseChild,\n\t\t\t\tgenId,\n\t\t\t\tnew RebaseNodeManagerI(crossFieldTable, context.fieldId, allowInval),\n\t\t\t\trebaseMetadata,\n\t\t\t\tcrossFieldTable.rebaseVersion,\n\t\t\t),\n\t\t);\n\t}\n\n\tprivate attachRebasedField(\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\ttable: RebaseTable,\n\t\trebasedField: FieldChange,\n\t\t{ nodeId, field: fieldKey }: FieldId,\n\t\tidAllocator: IdAllocator,\n\t\tmetadata: RebaseRevisionMetadata,\n\t): void {\n\t\tif (nodeId === undefined) {\n\t\t\trebasedFields.set(fieldKey, rebasedField);\n\t\t\treturn;\n\t\t}\n\t\tconst rebasedNode = getFromChangeAtomIdMap(rebasedNodes, nodeId);\n\t\tif (rebasedNode !== undefined) {\n\t\t\tconst updatedRebasedNode: Mutable<NodeChangeset> = cloneNodeChangeset(rebasedNode);\n\t\t\tsetInChangeAtomIdMap(rebasedNodes, nodeId, updatedRebasedNode);\n\n\t\t\tif (updatedRebasedNode.fieldChanges === undefined) {\n\t\t\t\tupdatedRebasedNode.fieldChanges = new Map([[fieldKey, rebasedField]]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\t!updatedRebasedNode.fieldChanges.has(fieldKey),\n\t\t\t\t0x9c4 /* Expected an empty field */,\n\t\t\t);\n\t\t\tupdatedRebasedNode.fieldChanges.set(fieldKey, rebasedField);\n\t\t\treturn;\n\t\t}\n\n\t\tconst newNode: NodeChangeset = {\n\t\t\tfieldChanges: new Map([[fieldKey, rebasedField]]),\n\t\t};\n\n\t\tsetInChangeAtomIdMap(rebasedNodes, nodeId, newNode);\n\t\tsetInChangeAtomIdMap(table.baseToRebasedNodeId, nodeId, nodeId);\n\n\t\tconst parentBase = getNodeParent(table.baseChange, nodeId);\n\n\t\tthis.attachRebasedNode(\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\ttable,\n\t\t\tnodeId,\n\t\t\tparentBase,\n\t\t\tidAllocator,\n\t\t\tmetadata,\n\t\t);\n\t}\n\n\tprivate attachRebasedNode(\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\ttable: RebaseTable,\n\t\tbaseNodeId: NodeId,\n\t\tparentBase: NodeLocation,\n\t\tidAllocator: IdAllocator,\n\t\tmetadata: RebaseRevisionMetadata,\n\t): void {\n\t\tif (parentBase.root !== undefined) {\n\t\t\tconst renamedRoot = firstAttachIdFromDetachId(\n\t\t\t\ttable.baseChange.rootNodes,\n\t\t\t\tparentBase.root,\n\t\t\t\t1,\n\t\t\t).value;\n\n\t\t\tconst attachField = table.baseChange.crossFieldKeys.getFirst(\n\t\t\t\t{ ...renamedRoot, target: CrossFieldTarget.Destination },\n\t\t\t\t1,\n\t\t\t).value;\n\n\t\t\tif (attachField !== undefined) {\n\t\t\t\t// The base change inserts this node into `attachField`, so the rebased change should represent this node there.\n\t\t\t\tconst normalizedAttachField = normalizeFieldId(\n\t\t\t\t\tattachField,\n\t\t\t\t\ttable.baseChange.nodeAliases,\n\t\t\t\t);\n\n\t\t\t\tconst entry: DetachedNodeEntry = table.entries.getFirst(renamedRoot, 1).value ?? {};\n\t\t\t\ttable.entries.set(renamedRoot, 1, { ...entry, nodeChange: baseNodeId });\n\t\t\t\ttable.affectedBaseFields.set(fieldIdKeyFromFieldId(normalizedAttachField), true);\n\t\t\t\tthis.attachRebasedNode(\n\t\t\t\t\trebasedFields,\n\t\t\t\t\trebasedNodes,\n\t\t\t\t\ttable,\n\t\t\t\t\tbaseNodeId,\n\t\t\t\t\t{ field: normalizedAttachField },\n\t\t\t\t\tidAllocator,\n\t\t\t\t\tmetadata,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst baseDetachLocation = table.baseChange.rootNodes.detachLocations.getFirst(\n\t\t\t\t\tparentBase.root,\n\t\t\t\t\t1,\n\t\t\t\t).value;\n\n\t\t\t\tassignRootChange(\n\t\t\t\t\ttable.rebasedRootNodes,\n\t\t\t\t\ttable.rebasedNodeToParent,\n\t\t\t\t\trenamedRoot,\n\t\t\t\t\tbaseNodeId,\n\t\t\t\t\tbaseDetachLocation,\n\t\t\t\t\ttable.rebaseVersion,\n\t\t\t\t);\n\n\t\t\t\t// We need to make sure the rebased changeset includes the detach location,\n\t\t\t\t// so we add that field to `affectedBaseFields` unless it's already been processed.\n\t\t\t\tif (\n\t\t\t\t\tbaseDetachLocation !== undefined &&\n\t\t\t\t\t!table.baseFieldToContext.has(\n\t\t\t\t\t\tfieldChangeFromId(table.baseChange, baseDetachLocation),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\ttable.affectedBaseFields.set(fieldIdKeyFromFieldId(baseDetachLocation), true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst parentFieldIdBase = parentBase.field;\n\t\tconst baseFieldChange = fieldChangeFromId(table.baseChange, parentFieldIdBase);\n\n\t\tconst rebasedFieldId = rebasedFieldIdFromBaseId(table, parentFieldIdBase);\n\t\tsetInChangeAtomIdMap(table.rebasedNodeToParent, baseNodeId, { field: rebasedFieldId });\n\n\t\tconst context = table.baseFieldToContext.get(baseFieldChange);\n\t\tif (context !== undefined) {\n\t\t\t// We've already processed this field.\n\t\t\t// The new child node will be attached in the next pass.\n\t\t\t// Note that adding to `fieldsWithUnattachedChild` allows that field to generate new invalidations,\n\t\t\t// so to avoid invalidation cycles we make sure we only add to it once per new unattached child.\n\t\t\t// This is done by checking whether `context.baseNodeIds` already contained `baseNodeId`.\n\t\t\tif (setInChangeAtomIdMap(context.baseNodeIds, baseNodeId, true)) {\n\t\t\t\ttable.fieldsWithUnattachedChild.add(baseFieldChange);\n\t\t\t\ttable.affectedBaseFields.set(fieldIdKeyFromFieldId(parentFieldIdBase), true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.rebaseFieldWithoutNewChanges(\n\t\t\tbaseFieldChange,\n\t\t\tparentFieldIdBase,\n\t\t\ttable,\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\tidAllocator,\n\t\t\tmetadata,\n\t\t\tbaseNodeId,\n\t\t);\n\t}\n\n\tprivate rebaseFieldMap(\n\t\tchange: FieldChangeMap,\n\t\tover: FieldChangeMap,\n\t\tparentId: NodeId | undefined,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: RebaseTable,\n\t\trevisionMetadata: RebaseRevisionMetadata,\n\t): FieldChangeMap {\n\t\tconst rebasedFields: FieldChangeMap = new Map();\n\t\tconst rebaseChild = (\n\t\t\tchild: NodeId | undefined,\n\t\t\tbaseChild: NodeId | undefined,\n\t\t\tstateChange: NodeAttachState | undefined,\n\t\t): NodeId | undefined => {\n\t\t\tif (child !== undefined && baseChild !== undefined) {\n\t\t\t\tcrossFieldTable.nodeIdPairs.push([child, baseChild, stateChange]);\n\t\t\t}\n\t\t\treturn child;\n\t\t};\n\n\t\tfor (const [field, fieldChange] of change) {\n\t\t\tconst fieldId: FieldId = { nodeId: parentId, field };\n\t\t\tconst baseChange = over.get(field);\n\t\t\tif (baseChange === undefined) {\n\t\t\t\trebasedFields.set(field, fieldChange);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst {\n\t\t\t\tfieldKind,\n\t\t\t\tchangeHandler,\n\t\t\t\tchange1: fieldChangeset,\n\t\t\t\tchange2: baseChangeset,\n\t\t\t} = this.normalizeFieldChanges(fieldChange, baseChange);\n\n\t\t\tconst manager = new RebaseNodeManagerI(crossFieldTable, fieldId);\n\n\t\t\tconst rebasedField = changeHandler.rebaser.rebase(\n\t\t\t\tfieldChangeset,\n\t\t\t\tbaseChangeset,\n\t\t\t\trebaseChild,\n\t\t\t\tgenId,\n\t\t\t\tmanager,\n\t\t\t\trevisionMetadata,\n\t\t\t\tcrossFieldTable.rebaseVersion,\n\t\t\t);\n\n\t\t\tconst rebasedFieldChange: FieldChange = {\n\t\t\t\tfieldKind,\n\t\t\t\tchange: brand(rebasedField),\n\t\t\t};\n\n\t\t\trebasedFields.set(field, rebasedFieldChange);\n\n\t\t\tcrossFieldTable.baseFieldToContext.set(baseChange, {\n\t\t\t\tbaseChange,\n\t\t\t\tnewChange: fieldChange,\n\t\t\t\trebasedChange: rebasedFieldChange,\n\t\t\t\tfieldId,\n\t\t\t\tbaseNodeIds: newTupleBTree(),\n\t\t\t});\n\n\t\t\tcrossFieldTable.rebasedFields.add(rebasedFieldChange);\n\t\t}\n\n\t\treturn rebasedFields;\n\t}\n\n\tprivate rebaseNodeChange(\n\t\tnewId: NodeId,\n\t\tbaseId: NodeId,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: RebaseTable,\n\t\trevisionMetadata: RebaseRevisionMetadata,\n\t): NodeChangeset {\n\t\tconst change = nodeChangeFromId(\n\t\t\tcrossFieldTable.newChange.nodeChanges,\n\t\t\tcrossFieldTable.newChange.nodeAliases,\n\t\t\tnewId,\n\t\t);\n\t\tconst over = nodeChangeFromId(\n\t\t\tcrossFieldTable.baseChange.nodeChanges,\n\t\t\tcrossFieldTable.baseChange.nodeAliases,\n\t\t\tbaseId,\n\t\t);\n\n\t\tconst baseMap: FieldChangeMap = over?.fieldChanges ?? new Map();\n\n\t\tconst fieldChanges =\n\t\t\tchange.fieldChanges !== undefined && over.fieldChanges !== undefined\n\t\t\t\t? this.rebaseFieldMap(\n\t\t\t\t\t\tchange?.fieldChanges ?? new Map(),\n\t\t\t\t\t\tbaseMap,\n\t\t\t\t\t\tnewId,\n\t\t\t\t\t\tgenId,\n\t\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\t\trevisionMetadata,\n\t\t\t\t\t)\n\t\t\t\t: change.fieldChanges;\n\n\t\tconst rebasedChange: Mutable<NodeChangeset> = {};\n\n\t\tif (fieldChanges !== undefined && fieldChanges.size > 0) {\n\t\t\trebasedChange.fieldChanges = fieldChanges;\n\t\t}\n\n\t\tif (change?.nodeExistsConstraint !== undefined) {\n\t\t\trebasedChange.nodeExistsConstraint = change.nodeExistsConstraint;\n\t\t}\n\n\t\tif (change?.nodeExistsConstraintOnRevert !== undefined) {\n\t\t\trebasedChange.nodeExistsConstraintOnRevert = change.nodeExistsConstraintOnRevert;\n\t\t}\n\n\t\tsetInChangeAtomIdMap(crossFieldTable.baseToRebasedNodeId, baseId, newId);\n\t\treturn rebasedChange;\n\t}\n\n\tprivate updateConstraints(\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\trebasedRoots: RootNodeTable,\n\t\tconstraintState: ConstraintState,\n\t\trevertConstraintState: ConstraintState,\n\t): void {\n\t\tthis.updateConstraintsForFields(\n\t\t\trebasedFields,\n\t\t\tNodeAttachState.Attached,\n\t\t\tNodeAttachState.Attached,\n\t\t\tconstraintState,\n\t\t\trevertConstraintState,\n\t\t\trebasedNodes,\n\t\t);\n\n\t\tfor (const [_detachId, nodeId] of rebasedRoots.nodeChanges.entries()) {\n\t\t\t// XXX: This is incorrect if the rebased changeset attaches the node.\n\t\t\t// Efficiently computing whether the changeset attaches the node would require maintaining a mapping from node ID to attach ID.\n\t\t\tconst detachedInOutput = true;\n\t\t\tthis.updateConstraintsForNode(\n\t\t\t\tnodeId,\n\t\t\t\tNodeAttachState.Detached,\n\t\t\t\tdetachedInOutput ? NodeAttachState.Detached : NodeAttachState.Attached,\n\t\t\t\trebasedNodes,\n\t\t\t\tconstraintState,\n\t\t\t\trevertConstraintState,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate updateConstraintsForFields(\n\t\tfields: FieldChangeMap,\n\t\tparentInputAttachState: NodeAttachState,\n\t\tparentOutputAttachState: NodeAttachState,\n\t\tconstraintState: ConstraintState,\n\t\trevertConstraintState: ConstraintState,\n\t\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\t): void {\n\t\tfor (const field of fields.values()) {\n\t\t\tconst handler = getChangeHandler(this.fieldKinds, field.fieldKind);\n\t\t\tfor (const [nodeId] of handler.getNestedChanges(field.change)) {\n\t\t\t\t// XXX: This is incorrect if the rebased changeset detaches this node.\n\t\t\t\t// Efficiently computing whether the changeset detaches the node would require maintaining a mapping from node ID to detach ID.\n\t\t\t\tconst isOutputDetached = false;\n\t\t\t\tconst outputAttachState =\n\t\t\t\t\tparentOutputAttachState === NodeAttachState.Detached || isOutputDetached\n\t\t\t\t\t\t? NodeAttachState.Detached\n\t\t\t\t\t\t: NodeAttachState.Attached;\n\n\t\t\t\tthis.updateConstraintsForNode(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tparentInputAttachState,\n\t\t\t\t\toutputAttachState,\n\t\t\t\t\tnodes,\n\t\t\t\t\tconstraintState,\n\t\t\t\t\trevertConstraintState,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateConstraintsForNode(\n\t\tnodeId: NodeId,\n\t\tinputAttachState: NodeAttachState,\n\t\toutputAttachState: NodeAttachState,\n\t\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tconstraintState: ConstraintState,\n\t\trevertConstraintState: ConstraintState,\n\t): void {\n\t\tconst node = getFromChangeAtomIdMap(nodes, nodeId) ?? fail(0xb24 /* Unknown node ID */);\n\n\t\tconst updatedNode: Mutable<NodeChangeset> = { ...node };\n\t\tsetInChangeAtomIdMap(nodes, nodeId, updatedNode);\n\n\t\tif (node.nodeExistsConstraint !== undefined) {\n\t\t\tconst isNowViolated = inputAttachState === NodeAttachState.Detached;\n\t\t\tif (node.nodeExistsConstraint.violated !== isNowViolated) {\n\t\t\t\tupdatedNode.nodeExistsConstraint = {\n\t\t\t\t\t...node.nodeExistsConstraint,\n\t\t\t\t\tviolated: isNowViolated,\n\t\t\t\t};\n\t\t\t\tconstraintState.violationCount += isNowViolated ? 1 : -1;\n\t\t\t}\n\t\t}\n\t\tif (node.nodeExistsConstraintOnRevert !== undefined) {\n\t\t\tconst isNowViolated = outputAttachState === NodeAttachState.Detached;\n\t\t\tif (node.nodeExistsConstraintOnRevert.violated !== isNowViolated) {\n\t\t\t\tupdatedNode.nodeExistsConstraintOnRevert = {\n\t\t\t\t\t...node.nodeExistsConstraintOnRevert,\n\t\t\t\t\tviolated: isNowViolated,\n\t\t\t\t};\n\t\t\t\trevertConstraintState.violationCount += isNowViolated ? 1 : -1;\n\t\t\t}\n\t\t}\n\n\t\tif (node.fieldChanges !== undefined) {\n\t\t\tthis.updateConstraintsForFields(\n\t\t\t\tnode.fieldChanges,\n\t\t\t\tinputAttachState,\n\t\t\t\toutputAttachState,\n\t\t\t\tconstraintState,\n\t\t\t\trevertConstraintState,\n\t\t\t\tnodes,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate pruneFieldMap(\n\t\tchangeset: FieldChangeMap | undefined,\n\t\tparentId: NodeId | undefined,\n\t\tnodeMap: ChangeAtomIdBTree<NodeChangeset>,\n\t\tnodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\taliases: ChangeAtomIdBTree<NodeId>,\n\t\troots: RootNodeTable,\n\t\tfieldsWithRootMoves: TupleBTree<FieldIdKey, boolean>,\n\t\tfieldsToRootChanges: TupleBTree<FieldIdKey, ChangeAtomId[]>,\n\t): FieldChangeMap | undefined {\n\t\tif (changeset === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prunedChangeset: FieldChangeMap = new Map();\n\t\tfor (const [field, fieldChange] of changeset) {\n\t\t\tconst handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);\n\n\t\t\tconst prunedFieldChangeset = handler.rebaser.prune(fieldChange.change, (nodeId) =>\n\t\t\t\tthis.pruneNodeChange(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tnodeMap,\n\t\t\t\t\tnodeToParent,\n\t\t\t\t\taliases,\n\t\t\t\t\troots,\n\t\t\t\t\tfieldsWithRootMoves,\n\t\t\t\t\tfieldsToRootChanges,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst fieldId: FieldId = { nodeId: parentId, field };\n\t\t\tconst fieldIdKey = fieldIdKeyFromFieldId(fieldId);\n\t\t\tconst rootsWithChanges = fieldsToRootChanges.get(fieldIdKey) ?? [];\n\t\t\tlet hasRootWithNodeChange = false;\n\t\t\tfor (const rootId of rootsWithChanges) {\n\t\t\t\tconst nodeId =\n\t\t\t\t\tgetFromChangeAtomIdMap(roots.nodeChanges, rootId) ?? fail(\"No root change found\");\n\n\t\t\t\tconst isRootChangeEmpty =\n\t\t\t\t\tthis.pruneNodeChange(\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tnodeMap,\n\t\t\t\t\t\tnodeToParent,\n\t\t\t\t\t\taliases,\n\t\t\t\t\t\troots,\n\t\t\t\t\t\tfieldsWithRootMoves,\n\t\t\t\t\t\tfieldsToRootChanges,\n\t\t\t\t\t) === undefined;\n\n\t\t\t\tif (isRootChangeEmpty) {\n\t\t\t\t\troots.nodeChanges.delete([rootId.revision, rootId.localId]);\n\t\t\t\t\ttryRemoveDetachLocation(roots, rootId, 1);\n\t\t\t\t} else {\n\t\t\t\t\thasRootWithNodeChange = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst hasRootChanges =\n\t\t\t\thasRootWithNodeChange || fieldsWithRootMoves.get(fieldIdKey) === true;\n\n\t\t\tif (!handler.isEmpty(prunedFieldChangeset) || hasRootChanges) {\n\t\t\t\tprunedChangeset.set(field, { ...fieldChange, change: brand(prunedFieldChangeset) });\n\t\t\t}\n\t\t}\n\n\t\treturn prunedChangeset.size > 0 ? prunedChangeset : undefined;\n\t}\n\n\tprivate pruneRoots(\n\t\troots: RootNodeTable,\n\t\tnodeMap: ChangeAtomIdBTree<NodeChangeset>,\n\t\tnodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\taliases: ChangeAtomIdBTree<NodeId>,\n\t\tfieldsWithRootMoves: TupleBTree<FieldIdKey, boolean>,\n\t\tfieldsToRootChanges: TupleBTree<FieldIdKey, ChangeAtomId[]>,\n\t): RootNodeTable {\n\t\tconst pruned: RootNodeTable = { ...roots, nodeChanges: newTupleBTree() };\n\t\tfor (const [rootIdKey, nodeId] of roots.nodeChanges.entries()) {\n\t\t\tconst rootId: ChangeAtomId = { revision: rootIdKey[0], localId: rootIdKey[1] };\n\t\t\tconst hasDetachLocation = roots.detachLocations.getFirst(rootId, 1).value !== undefined;\n\n\t\t\t// If the root has a detach location it should be pruned by recursion when pruning the field it was detached from.\n\t\t\tconst prunedId = hasDetachLocation\n\t\t\t\t? nodeId\n\t\t\t\t: this.pruneNodeChange(\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tnodeMap,\n\t\t\t\t\t\tnodeToParent,\n\t\t\t\t\t\taliases,\n\t\t\t\t\t\troots,\n\t\t\t\t\t\tfieldsWithRootMoves,\n\t\t\t\t\t\tfieldsToRootChanges,\n\t\t\t\t\t);\n\n\t\t\tif (prunedId !== undefined) {\n\t\t\t\tpruned.nodeChanges.set(rootIdKey, prunedId);\n\t\t\t}\n\n\t\t\ttryRemoveDetachLocation(pruned, rootId, 1);\n\t\t}\n\n\t\treturn pruned;\n\t}\n\n\tprivate pruneNodeChange(\n\t\tnodeId: NodeId,\n\t\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tnodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\taliases: ChangeAtomIdBTree<NodeId>,\n\t\troots: RootNodeTable,\n\t\tfieldsWithRootMoves: TupleBTree<FieldIdKey, boolean>,\n\t\tfieldsToRootChanges: TupleBTree<FieldIdKey, ChangeAtomId[]>,\n\t): NodeId | undefined {\n\t\tconst changeset = nodeChangeFromId(nodes, aliases, nodeId);\n\t\tconst prunedFields =\n\t\t\tchangeset.fieldChanges !== undefined\n\t\t\t\t? this.pruneFieldMap(\n\t\t\t\t\t\tchangeset.fieldChanges,\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tnodes,\n\t\t\t\t\t\tnodeToParent,\n\t\t\t\t\t\taliases,\n\t\t\t\t\t\troots,\n\t\t\t\t\t\tfieldsWithRootMoves,\n\t\t\t\t\t\tfieldsToRootChanges,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\n\t\tconst prunedChange = { ...changeset, fieldChanges: prunedFields };\n\t\tif (prunedChange.fieldChanges === undefined) {\n\t\t\tdelete prunedChange.fieldChanges;\n\t\t}\n\n\t\tif (isEmptyNodeChangeset(prunedChange)) {\n\t\t\tconst nodeIdKey: ChangeAtomIdKey = [nodeId.revision, nodeId.localId];\n\n\t\t\t// TODO: Shouldn't we also delete all aliases associated with this node?\n\t\t\tnodes.delete(nodeIdKey);\n\t\t\tnodeToParent.delete(nodeIdKey);\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\tsetInChangeAtomIdMap(nodes, nodeId, prunedChange);\n\t\t\treturn nodeId;\n\t\t}\n\t}\n\n\tpublic changeRevision(\n\t\tchange: ModularChangeset,\n\t\tnewRevision: RevisionTag | undefined,\n\t\trollbackOf?: RevisionTag,\n\t): ModularChangeset {\n\t\tconst oldRevisions = new Set(\n\t\t\tchange.revisions === undefined || change.revisions.length === 0\n\t\t\t\t? [undefined]\n\t\t\t\t: change.revisions.map((revInfo) => revInfo.revision),\n\t\t);\n\t\tconst updatedFields = this.replaceFieldMapRevisions(\n\t\t\tchange.fieldChanges,\n\t\t\toldRevisions,\n\t\t\tnewRevision,\n\t\t);\n\n\t\tconst updatedNodes: ChangeAtomIdBTree<NodeChangeset> = newTupleBTree();\n\t\tfor (const [[revision, id], nodeChangeset] of change.nodeChanges.entries()) {\n\t\t\tupdatedNodes.set(\n\t\t\t\t[replaceRevision(revision, oldRevisions, newRevision), id],\n\t\t\t\tthis.replaceNodeChangesetRevisions(nodeChangeset, oldRevisions, newRevision),\n\t\t\t);\n\t\t}\n\n\t\tconst updatedNodeToParent: ChangeAtomIdBTree<NodeLocation> = newTupleBTree();\n\t\tfor (const [[revision, id], location] of change.nodeToParent.entries()) {\n\t\t\tupdatedNodeToParent.set(\n\t\t\t\t[replaceRevision(revision, oldRevisions, newRevision), id],\n\t\t\t\treplaceNodeLocationRevision(\n\t\t\t\t\tnormalizeNodeLocation(location, change.nodeAliases),\n\t\t\t\t\toldRevisions,\n\t\t\t\t\tnewRevision,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tconst updated: Mutable<ModularChangeset> = {\n\t\t\t...change,\n\t\t\tfieldChanges: updatedFields,\n\t\t\tnodeChanges: updatedNodes,\n\t\t\tnodeToParent: updatedNodeToParent,\n\t\t\trootNodes: replaceRootTableRevision(\n\t\t\t\tchange.rootNodes,\n\t\t\t\toldRevisions,\n\t\t\t\tnewRevision,\n\t\t\t\tchange.nodeAliases,\n\t\t\t),\n\n\t\t\t// We've updated all references to old node IDs, so we no longer need an alias table.\n\t\t\tnodeAliases: newTupleBTree(),\n\t\t\tcrossFieldKeys: change.crossFieldKeys.mapEntries(\n\t\t\t\t(key) => replaceCrossFieldKeyRevision(key, oldRevisions, newRevision),\n\t\t\t\t(id) =>\n\t\t\t\t\treplaceFieldIdRevision(\n\t\t\t\t\t\tnormalizeFieldId(id, change.nodeAliases),\n\t\t\t\t\t\toldRevisions,\n\t\t\t\t\t\tnewRevision,\n\t\t\t\t\t),\n\t\t\t),\n\t\t};\n\n\t\tif (change.builds !== undefined) {\n\t\t\tupdated.builds = replaceIdMapRevisions(change.builds, oldRevisions, newRevision);\n\t\t}\n\n\t\tif (change.destroys !== undefined) {\n\t\t\tupdated.destroys = replaceIdMapRevisions(change.destroys, oldRevisions, newRevision);\n\t\t}\n\n\t\tif (change.refreshers !== undefined) {\n\t\t\tupdated.refreshers = replaceIdMapRevisions(change.refreshers, oldRevisions, newRevision);\n\t\t}\n\n\t\tif (newRevision !== undefined) {\n\t\t\tconst revInfo: Mutable<RevisionInfo> = { revision: newRevision };\n\t\t\tif (rollbackOf !== undefined) {\n\t\t\t\trevInfo.rollbackOf = rollbackOf;\n\t\t\t}\n\n\t\t\tupdated.revisions = [revInfo];\n\t\t} else {\n\t\t\tdelete updated.revisions;\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tprivate replaceNodeChangesetRevisions(\n\t\tnodeChangeset: NodeChangeset,\n\t\toldRevisions: Set<RevisionTag | undefined>,\n\t\tnewRevision: RevisionTag | undefined,\n\t): NodeChangeset {\n\t\tconst updated = { ...nodeChangeset };\n\t\tif (nodeChangeset.fieldChanges !== undefined) {\n\t\t\tupdated.fieldChanges = this.replaceFieldMapRevisions(\n\t\t\t\tnodeChangeset.fieldChanges,\n\t\t\t\toldRevisions,\n\t\t\t\tnewRevision,\n\t\t\t);\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tprivate replaceFieldMapRevisions(\n\t\tfields: FieldChangeMap,\n\t\toldRevisions: Set<RevisionTag | undefined>,\n\t\tnewRevision: RevisionTag | undefined,\n\t): FieldChangeMap {\n\t\tconst updatedFields: FieldChangeMap = new Map();\n\t\tfor (const [field, fieldChange] of fields) {\n\t\t\tconst updatedFieldChange = getChangeHandler(\n\t\t\t\tthis.fieldKinds,\n\t\t\t\tfieldChange.fieldKind,\n\t\t\t).rebaser.replaceRevisions(fieldChange.change, oldRevisions, newRevision);\n\n\t\t\tupdatedFields.set(field, { ...fieldChange, change: brand(updatedFieldChange) });\n\t\t}\n\n\t\treturn updatedFields;\n\t}\n\n\tprivate makeCrossFieldKeyTable(\n\t\tfields: FieldChangeMap,\n\t\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\t): CrossFieldKeyTable {\n\t\tconst keys: CrossFieldKeyTable = newCrossFieldRangeTable();\n\t\tthis.populateCrossFieldKeyTableForFieldMap(keys, fields, undefined);\n\t\tnodes.forEachPair(([revision, localId], node) => {\n\t\t\tif (node.fieldChanges !== undefined) {\n\t\t\t\tthis.populateCrossFieldKeyTableForFieldMap(keys, node.fieldChanges, {\n\t\t\t\t\trevision,\n\t\t\t\t\tlocalId,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn keys;\n\t}\n\n\tprivate populateCrossFieldKeyTableForFieldMap(\n\t\ttable: CrossFieldKeyTable,\n\t\tfields: FieldChangeMap,\n\t\tparent: NodeId | undefined,\n\t): void {\n\t\tfor (const [fieldKey, fieldChange] of fields) {\n\t\t\tconst keys = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).getCrossFieldKeys(\n\t\t\t\tfieldChange.change,\n\t\t\t);\n\t\t\tfor (const { key, count } of keys) {\n\t\t\t\ttable.set(key, count, { nodeId: parent, field: fieldKey });\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic buildEditor(\n\t\tchangeReceiver: (change: TaggedChange<ModularChangeset>) => void,\n\t): ModularEditBuilder {\n\t\treturn new ModularEditBuilder(this, this.fieldKinds, changeReceiver);\n\t}\n\n\tprivate createEmptyFieldChange(fieldKind: FieldKindIdentifier): FieldChange {\n\t\tconst emptyChange = getChangeHandler(this.fieldKinds, fieldKind).createEmpty();\n\t\treturn { fieldKind, change: brand(emptyChange) };\n\t}\n\n\tpublic validateChangeset(change: ModularChangeset): void {\n\t\tconst unreachableNodes: ChangeAtomIdBTree<NodeLocation> = brand(\n\t\t\tchange.nodeToParent.clone(),\n\t\t);\n\n\t\tconst unreachableCFKs = change.crossFieldKeys.clone();\n\n\t\tthis.validateFieldChanges(\n\t\t\tchange,\n\t\t\tchange.fieldChanges,\n\t\t\tundefined,\n\t\t\tunreachableNodes,\n\t\t\tunreachableCFKs,\n\t\t);\n\n\t\tfor (const [[revision, localId], node] of change.nodeChanges.entries()) {\n\t\t\tif (node.fieldChanges === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst nodeId = normalizeNodeId({ revision, localId }, change.nodeAliases);\n\t\t\tthis.validateFieldChanges(\n\t\t\t\tchange,\n\t\t\t\tnode.fieldChanges,\n\t\t\t\tnodeId,\n\t\t\t\tunreachableNodes,\n\t\t\t\tunreachableCFKs,\n\t\t\t);\n\t\t}\n\n\t\tfor (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {\n\t\t\tconst detachId: ChangeAtomId = { revision: detachIdKey[0], localId: detachIdKey[1] };\n\t\t\tconst location = getNodeParent(change, nodeId);\n\t\t\tassert(areEqualChangeAtomIdOpts(location.root, detachId), \"Inconsistent node location\");\n\n\t\t\tconst normalizedNodeId = normalizeNodeId(nodeId, change.nodeAliases);\n\t\t\tunreachableNodes.delete([normalizedNodeId.revision, normalizedNodeId.localId]);\n\n\t\t\tconst fieldChanges = nodeChangeFromId(\n\t\t\t\tchange.nodeChanges,\n\t\t\t\tchange.nodeAliases,\n\t\t\t\tnodeId,\n\t\t\t).fieldChanges;\n\n\t\t\tif (fieldChanges !== undefined) {\n\t\t\t\tthis.validateFieldChanges(\n\t\t\t\t\tchange,\n\t\t\t\t\tfieldChanges,\n\t\t\t\t\tnormalizedNodeId,\n\t\t\t\t\tunreachableNodes,\n\t\t\t\t\tunreachableCFKs,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tassert(unreachableNodes.size === 0, \"Unreachable nodes found\");\n\t\tassert(unreachableCFKs.entries().length === 0, \"Unreachable cross-field keys found\");\n\t}\n\n\t/**\n\t * Asserts that each node has a correct entry in `change.nodeToParent`,\n\t * and each cross field key has a correct entry in `change.crossFieldKeys`.\n\t * @returns the number of children found.\n\t */\n\tprivate validateFieldChanges(\n\t\tchange: ModularChangeset,\n\t\tfieldChanges: FieldChangeMap,\n\t\tnodeParent: NodeId | undefined,\n\t\tunreachableNodes: ChangeAtomIdBTree<NodeLocation>,\n\t\tunreachableCFKs: CrossFieldRangeTable<FieldId>,\n\t): void {\n\t\tfor (const [field, fieldChange] of fieldChanges.entries()) {\n\t\t\tconst fieldId = { nodeId: nodeParent, field };\n\t\t\tconst handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);\n\t\t\tfor (const [child, _index] of handler.getNestedChanges(fieldChange.change)) {\n\t\t\t\tconst parentFieldId = getNodeParent(change, child);\n\t\t\t\tassert(\n\t\t\t\t\tparentFieldId.field !== undefined && areEqualFieldIds(parentFieldId.field, fieldId),\n\t\t\t\t\t0xa4e /* Inconsistent node parentage */,\n\t\t\t\t);\n\n\t\t\t\tunreachableNodes.delete([child.revision, child.localId]);\n\t\t\t}\n\n\t\t\tfor (const keyRange of handler.getCrossFieldKeys(fieldChange.change)) {\n\t\t\t\tconst fields = getFieldsForCrossFieldKey(change, keyRange.key, keyRange.count);\n\t\t\t\tassert(fields.length > 0, \"Unregistered cross-field key\");\n\t\t\t\tfor (const fieldFromLookup of fields) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tareEqualFieldIds(fieldFromLookup, fieldId),\n\t\t\t\t\t\t0xa4f /* Inconsistent cross field keys */,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tunreachableCFKs.delete(keyRange.key, keyRange.count);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getEffectiveChange(change: ModularChangeset): ModularChangeset {\n\t\tif (hasConflicts(change)) {\n\t\t\treturn this.muteChange(change);\n\t\t}\n\t\treturn change;\n\t}\n\n\t/**\n\t * Returns a copy of the given changeset with the same declarations (e.g., new cells) but no actual changes.\n\t */\n\tprivate muteChange(change: ModularChangeset): ModularChangeset {\n\t\tconst muted: Mutable<ModularChangeset> = {\n\t\t\t...change,\n\t\t\trootNodes: muteRootChanges(change.rootNodes),\n\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\tfieldChanges: this.muteFieldChanges(change.fieldChanges),\n\t\t\tnodeChanges: brand(change.nodeChanges.mapValues((v) => this.muteNodeChange(v))),\n\t\t};\n\t\treturn muted;\n\t}\n\n\tprivate muteNodeChange(change: NodeChangeset): NodeChangeset {\n\t\tif (change.fieldChanges === undefined) {\n\t\t\treturn change;\n\t\t}\n\t\treturn {\n\t\t\t...change,\n\t\t\tfieldChanges: this.muteFieldChanges(change.fieldChanges),\n\t\t};\n\t}\n\n\tprivate muteFieldChanges(change: FieldChangeMap): FieldChangeMap {\n\t\treturn new Map(\n\t\t\tArray.from(change.entries(), ([key, value]) => [key, this.muteFieldChange(value)]),\n\t\t);\n\t}\n\n\tprivate muteFieldChange(change: FieldChange): FieldChange {\n\t\tconst handler = getChangeHandler(this.fieldKinds, change.fieldKind);\n\t\treturn {\n\t\t\tfieldKind: change.fieldKind,\n\t\t\tchange: brand(handler.rebaser.mute(change.change)),\n\t\t};\n\t}\n}\n\nfunction replaceCrossFieldKeyRevision(\n\tkey: CrossFieldKey,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): CrossFieldKey {\n\treturn {\n\t\ttarget: key.target,\n\t\trevision: replaceRevision(key.revision, oldRevisions, newRevision),\n\t\tlocalId: key.localId,\n\t};\n}\n\nfunction replaceRevision(\n\trevision: RevisionTag | undefined,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): RevisionTag | undefined {\n\treturn oldRevisions.has(revision) ? newRevision : revision;\n}\n\nfunction replaceIdMapRevisions<T>(\n\tmap: ChangeAtomIdBTree<T>,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): ChangeAtomIdBTree<T> {\n\tconst updated: ChangeAtomIdBTree<T> = newTupleBTree();\n\tfor (const [[revision, id], value] of map.entries()) {\n\t\tupdated.set([replaceRevision(revision, oldRevisions, newRevision), id], value);\n\t}\n\n\treturn updated;\n}\n\ninterface BuildsDestroysAndRefreshers {\n\treadonly allBuilds: ChangeAtomIdBTree<TreeChunk>;\n\treadonly allDestroys: ChangeAtomIdBTree<number>;\n\treadonly allRefreshers: ChangeAtomIdBTree<TreeChunk>;\n}\n\nfunction composeBuildsDestroysAndRefreshers(\n\tchange1: ModularChangeset,\n\tchange2: ModularChangeset,\n): BuildsDestroysAndRefreshers {\n\t// Duplicate builds can happen in compositions of commits that needed to include detached tree refreshers (e.g., undos):\n\t// In that case, it's possible for the refreshers to contain different trees because the latter\n\t// refresher may already reflect the changes made by the commit that includes the earlier\n\t// refresher. This composition includes the changes made by the commit that includes the\n\t// earlier refresher, so we need to include the build for the earlier refresher, otherwise\n\t// the produced changeset will build a tree one which those changes have already been applied\n\t// and also try to apply the changes again, effectively applying them twice.\n\t// Note that it would in principle be possible to adopt the later build and exclude from the\n\t// composition all the changes already reflected on the tree, but that is not something we\n\t// care to support at this time.\n\tconst allBuilds: ChangeAtomIdBTree<TreeChunk> = brand(\n\t\tmergeTupleBTrees(\n\t\t\tchange1.builds ?? newTupleBTree(),\n\t\t\tchange2.builds ?? newTupleBTree(),\n\t\t\ttrue,\n\t\t),\n\t);\n\n\tconst allDestroys: ChangeAtomIdBTree<number> = brand(\n\t\tmergeTupleBTrees(change1.destroys ?? newTupleBTree(), change2.destroys ?? newTupleBTree()),\n\t);\n\n\tconst allRefreshers: ChangeAtomIdBTree<TreeChunk> = brand(\n\t\tmergeTupleBTrees(\n\t\t\tchange1.refreshers ?? newTupleBTree(),\n\t\t\tchange2.refreshers ?? newTupleBTree(),\n\t\t\ttrue,\n\t\t),\n\t);\n\n\tif (change1.destroys !== undefined && change2.builds !== undefined) {\n\t\tfor (const [key, chunk] of change2.builds.entries()) {\n\t\t\tconst destroyCount = change1.destroys.get(key);\n\t\t\tif (destroyCount !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tdestroyCount === chunk.topLevelLength,\n\t\t\t\t\t0x89b /* Expected build and destroy to have the same length */,\n\t\t\t\t);\n\n\t\t\t\tallBuilds.delete(key);\n\t\t\t\tallDestroys.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (change1.builds !== undefined && change2.destroys !== undefined) {\n\t\tfor (const [key, chunk] of change1.builds.entries()) {\n\t\t\tconst destroyCount = change2.destroys.get(key);\n\t\t\tif (destroyCount !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tdestroyCount === chunk.topLevelLength,\n\t\t\t\t\t0x9f0 /* Expected build and destroy to have the same length */,\n\t\t\t\t);\n\n\t\t\t\tallBuilds.delete(key);\n\t\t\t\tallDestroys.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\t// It's possible to have a build and a refresher for the same root because an attach operation need not be performed in the same changeset as the corresponding build.\n\tif (change1.builds !== undefined && change2.refreshers !== undefined) {\n\t\tfor (const [key, chunk] of change2.refreshers.entries()) {\n\t\t\tassert(chunk.topLevelLength === 1, \"Expected refresher chunk to have length 1\");\n\t\t\tconst match = change1.builds.getPairOrNextLower(key);\n\t\t\tif (match !== undefined) {\n\t\t\t\tconst [buildKey, buildChunk] = match;\n\t\t\t\tif (buildKey[0] === key[0] && buildKey[1] + buildChunk.topLevelLength > key[1]) {\n\t\t\t\t\tallRefreshers.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { allBuilds, allDestroys, allRefreshers };\n}\n\nfunction invertBuilds(\n\tbuilds: ChangeAtomIdBTree<TreeChunk> | undefined,\n): ChangeAtomIdBTree<number> | undefined {\n\tif (builds !== undefined) {\n\t\treturn brand(builds.mapValues((chunk) => chunk.topLevelLength));\n\t}\n\treturn undefined;\n}\n\n/**\n * Returns the set of removed roots that should be in memory for the given change to be applied.\n * A removed root is relevant if any of the following is true:\n * - It is being inserted\n * - It is being restored\n * - It is being edited\n * - The ID it is associated with is being changed\n *\n * May be conservative by returning more removed roots than strictly necessary.\n *\n * Will never return IDs for non-root trees, even if they are removed.\n *\n * @param change - The change to be applied.\n * @param fieldKinds - The field kinds to delegate to.\n */\nexport function* relevantRemovedRoots(\n\tchange: ModularChangeset,\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n): Iterable<DeltaDetachedNodeId> {\n\tconst rootIds: ChangeAtomIdRangeMap<boolean> = newChangeAtomIdRangeMap();\n\taddAttachesToSet(change, rootIds);\n\taddRenamesToSet(change, rootIds);\n\n\tfor (const [[revision, localId]] of change.rootNodes.nodeChanges.entries()) {\n\t\trootIds.set({ revision, localId }, 1, true);\n\t}\n\n\tfor (const entry of rootIds.entries()) {\n\t\tfor (let offset = 0; offset < entry.length; offset++) {\n\t\t\tconst detachId = offsetChangeAtomId(entry.start, offset);\n\t\t\tyield makeDetachedNodeId(detachId.revision, detachId.localId);\n\t\t}\n\t}\n}\n\nfunction addAttachesToSet(\n\tchange: ModularChangeset,\n\trootIds: ChangeAtomIdRangeMap<boolean>,\n): void {\n\t// This includes each attach which does not have a corresponding detach.\n\tfor (const entry of change.crossFieldKeys.entries()) {\n\t\tif (entry.start.target !== CrossFieldTarget.Destination) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const detachIdEntry of change.rootNodes.newToOldId.getAll2(\n\t\t\tentry.start,\n\t\t\tentry.length,\n\t\t)) {\n\t\t\tconst detachId =\n\t\t\t\tdetachIdEntry.value ?? offsetChangeAtomId(entry.start, detachIdEntry.offset);\n\t\t\tfor (const detachEntry of change.crossFieldKeys.getAll2(\n\t\t\t\t{ ...detachId, target: CrossFieldTarget.Source },\n\t\t\t\tdetachIdEntry.length,\n\t\t\t)) {\n\t\t\t\tif (detachEntry.value === undefined) {\n\t\t\t\t\trootIds.set(\n\t\t\t\t\t\toffsetChangeAtomId(detachId, detachEntry.offset),\n\t\t\t\t\t\tdetachEntry.length,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction addRenamesToSet(\n\tchange: ModularChangeset,\n\trootIds: ChangeAtomIdRangeMap<boolean>,\n): void {\n\tfor (const renameEntry of change.rootNodes.oldToNewId.entries()) {\n\t\tfor (const detachEntry of change.crossFieldKeys.getAll2(\n\t\t\t{ ...renameEntry.start, target: CrossFieldTarget.Source },\n\t\t\trenameEntry.length,\n\t\t)) {\n\t\t\t// We only want to include renames of nodes which are detached in the input context of the changeset.\n\t\t\t// So if there is a detach for the node, the rename is not relevant.\n\t\t\tif (detachEntry.value === undefined) {\n\t\t\t\trootIds.set(renameEntry.start, renameEntry.length, true);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Adds any refreshers missing from the provided change that are relevant to the change and\n * removes any refreshers from the provided change that are not relevant to the change.\n *\n * @param change - The change that possibly has missing or superfluous refreshers. Not mutated by this function.\n * @param getDetachedNode - The function to retrieve a tree chunk from the corresponding detached node id.\n * @param removedRoots - The set of removed roots that should be in memory for the given change to be applied.\n * Can be retrieved by calling {@link relevantRemovedRoots}.\n * @param requireRefreshers - when true, this function enforces that all relevant removed roots have a\n * corresponding build or refresher.\n */\nexport function updateRefreshers(\n\tchange: ModularChangeset,\n\tgetDetachedNode: (id: DeltaDetachedNodeId) => TreeChunk | undefined,\n\tremovedRoots: Iterable<DeltaDetachedNodeId>,\n\trequireRefreshers: boolean = true,\n): ModularChangeset {\n\tconst refreshers: ChangeAtomIdBTree<TreeChunk> = newTupleBTree();\n\tconst chunkLengths: Map<RevisionTag | undefined, BTree<number, number>> = new Map();\n\n\tif (change.builds !== undefined) {\n\t\tfor (const [[revision, id], chunk] of change.builds.entries()) {\n\t\t\tconst lengthTree = getOrCreate(chunkLengths, revision, () => new BTree());\n\t\t\tlengthTree.set(id, chunk.topLevelLength);\n\t\t}\n\t}\n\n\tfor (const root of removedRoots) {\n\t\tif (change.builds !== undefined) {\n\t\t\tconst lengthTree = chunkLengths.get(root.major);\n\n\t\t\tif (lengthTree !== undefined) {\n\t\t\t\tconst lengthPair = lengthTree.getPairOrNextLower(root.minor);\n\t\t\t\tif (lengthPair !== undefined) {\n\t\t\t\t\tconst [firstMinor, length] = lengthPair;\n\n\t\t\t\t\t// if the root minor is within the length of the minor of the retrieved pair\n\t\t\t\t\t// then there's no need to check for the detached node\n\t\t\t\t\tif (root.minor < firstMinor + length) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst node = getDetachedNode(root);\n\t\tif (node === undefined) {\n\t\t\tassert(!requireRefreshers, 0x8cd /* detached node should exist */);\n\t\t} else {\n\t\t\trefreshers.set([root.major, brand(root.minor)], node);\n\t\t}\n\t}\n\n\tconst {\n\t\tfieldChanges,\n\t\tnodeChanges,\n\t\tmaxId,\n\t\trevisions,\n\t\tconstraintViolationCount,\n\t\tconstraintViolationCountOnRevert,\n\t\tbuilds,\n\t\tdestroys,\n\t} = change;\n\n\treturn makeModularChangeset({\n\t\tfieldChanges,\n\t\tnodeChanges,\n\t\tnodeToParent: change.nodeToParent,\n\t\tnodeAliases: change.nodeAliases,\n\t\trootNodes: change.rootNodes,\n\t\tcrossFieldKeys: change.crossFieldKeys,\n\t\tmaxId: maxId as number,\n\t\trevisions,\n\t\tconstraintViolationCount,\n\t\tconstraintViolationCountOnRevert,\n\t\tbuilds,\n\t\tdestroys,\n\t\trefreshers,\n\t});\n}\n\n/**\n * Converts a change into the delta format.\n *\n * @param change - The change to convert into a delta.\n * @param fieldKinds - The field kinds to delegate to.\n */\nexport function intoDelta(\n\ttaggedChange: TaggedChange<ModularChangeset>,\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n): DeltaRoot {\n\tconst change = taggedChange.change;\n\tconst rootDelta: Mutable<DeltaRoot> = {};\n\n\tif (!hasConflicts(change)) {\n\t\t// If there are no constraint violations, then tree changes apply.\n\t\tconst fieldDeltas = intoDeltaImpl(\n\t\t\tchange.fieldChanges,\n\t\t\tchange.nodeChanges,\n\t\t\tchange.nodeAliases,\n\t\t\tfieldKinds,\n\t\t);\n\n\t\tconst global: DeltaDetachedNodeChanges[] = [];\n\t\tfor (const [[major, minor], nodeId] of change.rootNodes.nodeChanges.entries()) {\n\t\t\tglobal.push({\n\t\t\t\tid: { major, minor },\n\t\t\t\tfields: deltaFromNodeChange(\n\t\t\t\t\tnodeChangeFromId(change.nodeChanges, change.nodeAliases, nodeId),\n\t\t\t\t\tchange.nodeChanges,\n\t\t\t\t\tchange.nodeAliases,\n\t\t\t\t\tfieldKinds,\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\tconst rename: DeltaDetachedNodeRename[] = [];\n\t\tfor (const {\n\t\t\tstart: oldId,\n\t\t\tvalue: newId,\n\t\t\tlength,\n\t\t} of change.rootNodes.oldToNewId.entries()) {\n\t\t\trename.push({\n\t\t\t\tcount: length,\n\t\t\t\toldId: makeDetachedNodeId(oldId.revision, oldId.localId),\n\t\t\t\tnewId: makeDetachedNodeId(newId.revision, newId.localId),\n\t\t\t});\n\t\t}\n\n\t\tif (fieldDeltas.size > 0) {\n\t\t\trootDelta.fields = fieldDeltas;\n\t\t}\n\t\tif (global.length > 0) {\n\t\t\trootDelta.global = global;\n\t\t}\n\t\tif (rename.length > 0) {\n\t\t\trootDelta.rename = rename;\n\t\t}\n\t}\n\n\t// Constraint violations should not prevent nodes from being built\n\tif (change.builds && change.builds.size > 0) {\n\t\trootDelta.build = copyDetachedNodes(change.builds);\n\t}\n\tif (change.destroys !== undefined && change.destroys.size > 0) {\n\t\tconst destroys: DeltaDetachedNodeDestruction[] = [];\n\t\tfor (const [[major, minor], count] of change.destroys.entries()) {\n\t\t\tdestroys.push({\n\t\t\t\tid: makeDetachedNodeId(major, minor),\n\t\t\t\tcount,\n\t\t\t});\n\t\t}\n\t\trootDelta.destroy = destroys;\n\t}\n\tif (change.refreshers && change.refreshers.size > 0) {\n\t\trootDelta.refreshers = copyDetachedNodes(change.refreshers);\n\t}\n\n\treturn rootDelta;\n}\n\nfunction copyDetachedNodes(\n\tdetachedNodes: ChangeAtomIdBTree<TreeChunk>,\n): DeltaDetachedNodeBuild[] | undefined {\n\tconst copiedDetachedNodes: DeltaDetachedNodeBuild[] = [];\n\tfor (const [[major, minor], chunk] of detachedNodes.entries()) {\n\t\tif (chunk.topLevelLength > 0) {\n\t\t\tchunk.referenceAdded();\n\t\t\tcopiedDetachedNodes.push({\n\t\t\t\tid: makeDetachedNodeId(major, minor),\n\t\t\t\ttrees: chunk,\n\t\t\t});\n\t\t}\n\t}\n\treturn copiedDetachedNodes.length > 0 ? copiedDetachedNodes : undefined;\n}\n\n/**\n * @param change - The change to convert into a delta.\n */\nfunction intoDeltaImpl(\n\tchange: FieldChangeMap,\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n): Map<FieldKey, DeltaFieldChanges> {\n\tconst delta: Map<FieldKey, DeltaFieldChanges> = new Map();\n\n\tfor (const [field, fieldChange] of change) {\n\t\tconst fieldDelta = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(\n\t\t\tfieldChange.change,\n\t\t\t(childChange): DeltaFieldMap => {\n\t\t\t\tconst nodeChange = nodeChangeFromId(nodeChanges, nodeAliases, childChange);\n\t\t\t\treturn deltaFromNodeChange(nodeChange, nodeChanges, nodeAliases, fieldKinds);\n\t\t\t},\n\t\t);\n\t\tif (fieldDelta !== undefined && fieldDelta.length > 0) {\n\t\t\tdelta.set(field, fieldDelta);\n\t\t}\n\t}\n\treturn delta;\n}\n\nfunction deltaFromNodeChange(\n\tchange: NodeChangeset,\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n): DeltaFieldMap {\n\tif (change.fieldChanges !== undefined) {\n\t\treturn intoDeltaImpl(change.fieldChanges, nodeChanges, nodeAliases, fieldKinds);\n\t}\n\t// TODO: update the API to allow undefined to be returned here\n\treturn new Map();\n}\n\n/**\n * @param revInfos - This should describe the revision being rebased and all revisions in the rebase path,\n * even if not part of the current base changeset.\n * For example, when rebasing change B from a local branch [A, B, C] over a branch [X, Y], the `revInfos` must include\n * the changes [A⁻¹ X, Y, A, B] for each rebase step of B.\n * @param revisionToRebase - The revision of the changeset which is being rebased.\n * @param baseRevisions - The set of revisions in the changeset being rebased over.\n * For example, when rebasing change B from a local branch [A, B, C] over a branch [X, Y], the `baseRevisions` must include\n * revisions [A⁻¹ X, Y, A] if rebasing over the composition of all those changes, or\n * revision [A⁻¹] for the first rebase, then [X], etc. if rebasing over edits individually.\n * @returns RebaseRevisionMetadata to be passed to `FieldChangeRebaser.rebase`*\n */\nexport function rebaseRevisionMetadataFromInfo(\n\trevInfos: readonly RevisionInfo[],\n\trevisionToRebase: RevisionTag | undefined,\n\tbaseRevisions: (RevisionTag | undefined)[],\n): RebaseRevisionMetadata {\n\tconst filteredRevisions: RevisionTag[] = [];\n\tfor (const revision of baseRevisions) {\n\t\tif (revision !== undefined) {\n\t\t\tfilteredRevisions.push(revision);\n\t\t}\n\t}\n\n\tconst getBaseRevisions = (): RevisionTag[] => filteredRevisions;\n\treturn {\n\t\t...revisionMetadataSourceFromInfo(revInfos),\n\t\tgetRevisionToRebase: () => revisionToRebase,\n\t\tgetBaseRevisions,\n\t};\n}\n\nfunction isEmptyNodeChangeset(change: NodeChangeset): boolean {\n\treturn (\n\t\tchange.fieldChanges === undefined &&\n\t\tchange.nodeExistsConstraint === undefined &&\n\t\tchange.nodeExistsConstraintOnRevert === undefined\n\t);\n}\n\nexport function getFieldKind(\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n\tkind: FieldKindIdentifier,\n): FlexFieldKind {\n\tif (kind === genericFieldKind.identifier) {\n\t\treturn genericFieldKind;\n\t}\n\tconst fieldKind = fieldKinds.get(kind);\n\tassert(fieldKind !== undefined, 0x3ad /* Unknown field kind */);\n\treturn fieldKind;\n}\n\nexport function getChangeHandler(\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n\tkind: FieldKindIdentifier,\n): FieldChangeHandler<unknown> {\n\treturn getFieldKind(fieldKinds, kind).changeHandler;\n}\n\ninterface InvertTable {\n\tchange: ModularChangeset;\n\n\t// Entries are keyed on attach ID\n\tentries: CrossFieldMap<NodeId>;\n\toriginalFieldToContext: Map<FieldChange, InvertContext>;\n\tinvertedNodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\tinvertRevision: RevisionTag;\n\tinvalidatedFields: Set<FieldChange>;\n\tinvertedRoots: RootNodeTable;\n\n\t/**\n\t * Maps from attach ID in the inverted changeset to the corresponding detach ID in the base changeset.\n\t */\n\tattachToDetachId: ChangeAtomIdRangeMap<ChangeAtomId>;\n}\n\ninterface InvertContext {\n\tfieldId: FieldId;\n\tinvertedField: FieldChange;\n}\n\ninterface RebaseTable {\n\treadonly rebaseVersion: RebaseVersion;\n\n\t// Entries are keyed on attach ID\n\treadonly entries: CrossFieldMap<RebaseDetachedNodeEntry>;\n\treadonly baseChange: ModularChangeset;\n\treadonly newChange: ModularChangeset;\n\n\t/**\n\t * Maps from the FieldChange key used for the CrossFieldTable (which is the base FieldChange)\n\t * to the context for the field.\n\t */\n\treadonly baseFieldToContext: Map<FieldChange, RebaseFieldContext>;\n\treadonly baseRoots: RootNodeTable;\n\treadonly baseToRebasedNodeId: ChangeAtomIdBTree<NodeId>;\n\treadonly rebasedFields: Set<FieldChange>;\n\treadonly rebasedNodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\treadonly rebasedDetachLocations: ChangeAtomIdRangeMap<FieldId>;\n\treadonly movedDetaches: ChangeAtomIdRangeMap<boolean>;\n\treadonly rebasedRootNodes: RootNodeTable;\n\n\t/**\n\t * List of unprocessed (newId, baseId) pairs encountered so far.\n\t */\n\treadonly nodeIdPairs: [NodeId, NodeId, NodeAttachState | undefined][];\n\treadonly affectedBaseFields: TupleBTree<FieldIdKey, boolean>;\n\n\t/**\n\t * Set of base fields which contain a node which needs to be attached in the rebased changeset.\n\t */\n\treadonly fieldsWithUnattachedChild: Set<FieldChange>;\n}\n\nexport type FieldIdKey = [RevisionTag | undefined, ChangesetLocalId | undefined, FieldKey];\n\ninterface RebaseFieldContext {\n\tbaseChange: FieldChange;\n\tnewChange: FieldChange;\n\trebasedChange: FieldChange;\n\tfieldId: FieldId;\n\n\t/**\n\t * The set of node IDs in the base changeset which should be included in the rebased field,\n\t * even if there is no corresponding node changeset in the new change.\n\t */\n\tbaseNodeIds: ChangeAtomIdBTree<boolean>;\n}\n\nfunction newComposeTable(\n\tbaseChange: ModularChangeset,\n\tnewChange: ModularChangeset,\n\tcomposedRootNodes: RootNodeTable,\n\tmovedCrossFieldKeys: CrossFieldKeyTable,\n\tremovedCrossFieldKeys: CrossFieldRangeTable<boolean>,\n\tpendingCompositions: PendingCompositions,\n): ComposeTable {\n\treturn {\n\t\trebaseVersion: Math.max(\n\t\t\tbaseChange.rebaseVersion,\n\t\t\tnewChange.rebaseVersion,\n\t\t) as RebaseVersion,\n\t\tentries: newDetachedEntryMap(),\n\t\tbaseChange,\n\t\tnewChange,\n\t\tfieldToContext: new Map(),\n\t\tnewFieldToBaseField: new Map(),\n\t\tnewToBaseNodeId: newTupleBTree(),\n\t\tcomposedNodes: new Set(),\n\t\tmovedNodeToParent: newTupleBTree(),\n\t\tcomposedRootNodes,\n\t\tmovedCrossFieldKeys,\n\t\tremovedCrossFieldKeys,\n\t\trenamesToDelete: newChangeAtomIdRangeMap(),\n\t\tpendingCompositions,\n\t};\n}\n\ninterface ComposeTable {\n\treadonly rebaseVersion: RebaseVersion;\n\n\t// Entries are keyed on detach ID\n\treadonly entries: ChangeAtomIdRangeMap<DetachedNodeEntry>;\n\treadonly baseChange: ModularChangeset;\n\treadonly newChange: ModularChangeset;\n\n\t/**\n\t * Maps from an input changeset for a field (from change1 if it has one, from change2 otherwise) to the context for that field.\n\t */\n\treadonly fieldToContext: Map<FieldChange, ComposeFieldContext>;\n\treadonly newFieldToBaseField: Map<FieldChange, FieldChange>;\n\treadonly newToBaseNodeId: ChangeAtomIdBTree<NodeId>;\n\treadonly composedNodes: Set<NodeChangeset>;\n\treadonly movedNodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\treadonly composedRootNodes: RootNodeTable;\n\treadonly movedCrossFieldKeys: CrossFieldKeyTable;\n\treadonly removedCrossFieldKeys: CrossFieldRangeTable<boolean>;\n\treadonly renamesToDelete: ChangeAtomIdRangeMap<boolean>;\n\treadonly pendingCompositions: PendingCompositions;\n}\n\ninterface PendingCompositions {\n\t/**\n\t * Each entry in this list represents a node with both base and new changes which have not yet been composed.\n\t * Entries are of the form [baseId, newId].\n\t */\n\treadonly nodeIdsToCompose: [NodeId, NodeId][];\n\n\t/**\n\t * The set of fields in the base changeset which have been affected by a cross field effect.\n\t */\n\treadonly affectedBaseFields: BTree<FieldIdKey, true>;\n}\n\ninterface ComposeFieldContext {\n\t/**\n\t * The field ID for this field in the composed changeset.\n\t */\n\tfieldId: FieldId;\n\tchange1: FieldChangeset;\n\tchange2: FieldChangeset;\n\tcomposedChange: FieldChange;\n}\n\ninterface ConstraintState {\n\tviolationCount: number;\n}\n\nfunction newConstraintState(violationCount: number): ConstraintState {\n\treturn {\n\t\tviolationCount,\n\t};\n}\n\nclass InvertNodeManagerI implements InvertNodeManager {\n\tpublic constructor(\n\t\tprivate readonly table: InvertTable,\n\t\tprivate readonly fieldId: FieldId,\n\t) {}\n\n\tpublic invertDetach(\n\t\tdetachId: ChangeAtomId,\n\t\tcount: number,\n\t\tnodeChange: NodeId | undefined,\n\t\tnewAttachId: ChangeAtomId,\n\t): void {\n\t\tif (nodeChange !== undefined) {\n\t\t\tassert(count === 1, \"A node change should only affect one node\");\n\n\t\t\tconst attachEntry = firstAttachIdFromDetachId(\n\t\t\t\tthis.table.change.rootNodes,\n\t\t\t\tdetachId,\n\t\t\t\tcount,\n\t\t\t);\n\n\t\t\tconst attachFieldEntry = this.table.change.crossFieldKeys.getFirst(\n\t\t\t\t{ target: CrossFieldTarget.Destination, ...attachEntry.value },\n\t\t\t\tcount,\n\t\t\t);\n\n\t\t\tif (attachFieldEntry.value !== undefined) {\n\t\t\t\tsetInCrossFieldMap(this.table.entries, attachEntry.value, count, nodeChange);\n\t\t\t\tthis.table.invalidatedFields.add(\n\t\t\t\t\tfieldChangeFromId(this.table.change, attachFieldEntry.value),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tassignRootChange(\n\t\t\t\t\tthis.table.invertedRoots,\n\t\t\t\t\tthis.table.invertedNodeToParent,\n\t\t\t\t\tattachEntry.value,\n\t\t\t\t\tnodeChange,\n\t\t\t\t\tthis.fieldId,\n\t\t\t\t\tthis.table.change.rebaseVersion,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (!areEqualChangeAtomIds(detachId, newAttachId)) {\n\t\t\tfor (const entry of doesChangeAttachNodes(\n\t\t\t\tthis.table.change.crossFieldKeys,\n\t\t\t\tdetachId,\n\t\t\t\tcount,\n\t\t\t)) {\n\t\t\t\tif (!entry.value) {\n\t\t\t\t\tthis.table.attachToDetachId.set(newAttachId, count, detachId);\n\t\t\t\t\tthis.table.invertedRoots.detachLocations.set(detachId, count, this.fieldId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic invertAttach(\n\t\tattachId: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<DetachedNodeEntry> {\n\t\tlet countToProcess = count;\n\n\t\tconst detachIdEntry = firstDetachIdFromAttachId(\n\t\t\tthis.table.change.rootNodes,\n\t\t\tattachId,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = detachIdEntry.length;\n\n\t\tconst detachEntry = getFirstFieldForCrossFieldKey(\n\t\t\tthis.table.change,\n\t\t\t{ target: CrossFieldTarget.Source, ...detachIdEntry.value },\n\t\t\tcountToProcess,\n\t\t);\n\t\tcountToProcess = detachEntry.length;\n\n\t\tlet result: RangeQueryResult<DetachedNodeEntry>;\n\t\tif (detachEntry.value !== undefined) {\n\t\t\tconst moveEntry = this.table.entries.getFirst(attachId, countToProcess);\n\t\t\tresult = { ...moveEntry, value: { nodeChange: moveEntry.value } };\n\t\t} else {\n\t\t\t// This node is detached in the input context of the original change.\n\t\t\tconst nodeIdEntry = rangeQueryChangeAtomIdMap(\n\t\t\t\tthis.table.change.rootNodes.nodeChanges,\n\t\t\t\tdetachIdEntry.value,\n\t\t\t\tcountToProcess,\n\t\t\t);\n\n\t\t\tcountToProcess = nodeIdEntry.length;\n\t\t\tresult = {\n\t\t\t\tvalue: { nodeChange: nodeIdEntry.value, detachId: detachIdEntry.value },\n\t\t\t\tlength: countToProcess,\n\t\t\t};\n\t\t}\n\n\t\tif (result.value?.nodeChange !== undefined) {\n\t\t\tsetInChangeAtomIdMap(this.table.invertedNodeToParent, result.value.nodeChange, {\n\t\t\t\tfield: this.fieldId,\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n}\n\nclass RebaseNodeManagerI implements RebaseNodeManager {\n\tpublic constructor(\n\t\tprivate readonly table: RebaseTable,\n\t\tprivate readonly fieldId: FieldId,\n\t\tprivate readonly allowInval: boolean = true,\n\t) {}\n\n\tpublic getNewChangesForBaseAttach(\n\t\tbaseAttachId: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<RebaseDetachedNodeEntry | undefined> {\n\t\tlet countToProcess = count;\n\n\t\tconst detachEntry = firstDetachIdFromAttachId(\n\t\t\tthis.table.baseChange.rootNodes,\n\t\t\tbaseAttachId,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = detachEntry.length;\n\n\t\tconst nodeEntry = rangeQueryChangeAtomIdMap(\n\t\t\tthis.table.newChange.rootNodes.nodeChanges,\n\t\t\tdetachEntry.value,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = nodeEntry.length;\n\t\tconst newNodeId = nodeEntry.value;\n\n\t\tconst newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(\n\t\t\tdetachEntry.value,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = newRenameEntry.length;\n\n\t\tlet result: RangeQueryResult<DetachedNodeEntry | undefined>;\n\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\tif (newNodeId !== undefined || newRenameEntry.value !== undefined) {\n\t\t\tresult = {\n\t\t\t\t...newRenameEntry,\n\t\t\t\tvalue: { detachId: newRenameEntry.value, nodeChange: newNodeId },\n\t\t\t};\n\t\t} else {\n\t\t\t// This handles the case where the base changeset has moved these nodes,\n\t\t\t// meaning they were attached in the input context of the base changeset.\n\t\t\tresult = this.table.entries.getFirst(baseAttachId, countToProcess);\n\t\t}\n\n\t\t// TODO: Consider moving these two checks into a separate method so that this function has no side effects.\n\t\tif (result.value?.detachId !== undefined) {\n\t\t\tthis.table.rebasedDetachLocations.set(\n\t\t\t\tresult.value.detachId,\n\t\t\t\tresult.length,\n\t\t\t\tthis.fieldId,\n\t\t\t);\n\t\t}\n\n\t\tif (result.value?.nodeChange !== undefined) {\n\t\t\tsetInChangeAtomIdMap(this.table.rebasedNodeToParent, result.value.nodeChange, {\n\t\t\t\tfield: this.fieldId,\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic rebaseOverDetach(\n\t\tbaseDetachId: ChangeAtomId,\n\t\tcount: number,\n\t\tnewDetachId: ChangeAtomId | undefined,\n\t\tnodeChange: NodeId | undefined,\n\t\tcellRename?: ChangeAtomId,\n\t): void {\n\t\tlet countToProcess = count;\n\t\tconst attachIdEntry = firstAttachIdFromDetachId(\n\t\t\tthis.table.baseRoots,\n\t\t\tbaseDetachId,\n\t\t\tcountToProcess,\n\t\t);\n\t\tconst baseAttachId = attachIdEntry.value;\n\t\tcountToProcess = attachIdEntry.length;\n\n\t\tconst attachFieldEntry = getFirstFieldForCrossFieldKey(\n\t\t\tthis.table.baseChange,\n\t\t\t{ ...baseAttachId, target: CrossFieldTarget.Destination },\n\t\t\tcountToProcess,\n\t\t);\n\t\tcountToProcess = attachFieldEntry.length;\n\n\t\tconst detachedMoveEntry = this.table.baseChange.rootNodes.outputDetachLocations.getFirst(\n\t\t\tbaseDetachId,\n\t\t\tcountToProcess,\n\t\t);\n\t\tcountToProcess = detachedMoveEntry.length;\n\n\t\tconst destinationField = attachFieldEntry.value ?? detachedMoveEntry.value;\n\t\tif (destinationField !== undefined) {\n\t\t\t// The base detach is part of a move (or move of detach location) in the base changeset.\n\t\t\tsetInCrossFieldMap(this.table.entries, baseAttachId, countToProcess, {\n\t\t\t\tnodeChange,\n\t\t\t\tdetachId: newDetachId,\n\t\t\t\tcellRename,\n\t\t\t});\n\n\t\t\tif (nodeChange !== undefined || newDetachId !== undefined) {\n\t\t\t\tthis.invalidateBaseFields([destinationField]);\n\t\t\t}\n\t\t}\n\n\t\tif (attachFieldEntry.value === undefined) {\n\t\t\t// These nodes are detached in the output context of the base changeset.\n\t\t\tif (nodeChange !== undefined) {\n\t\t\t\tassignRootChange(\n\t\t\t\t\tthis.table.rebasedRootNodes,\n\t\t\t\t\tthis.table.rebasedNodeToParent,\n\t\t\t\t\tbaseAttachId,\n\t\t\t\t\tnodeChange,\n\t\t\t\t\tthis.fieldId,\n\t\t\t\t\tthis.table.rebaseVersion,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (newDetachId !== undefined) {\n\t\t\t\taddNodeRename(\n\t\t\t\t\tthis.table.rebasedRootNodes,\n\t\t\t\t\tbaseAttachId,\n\t\t\t\t\tnewDetachId,\n\t\t\t\t\tcountToProcess,\n\t\t\t\t\tthis.fieldId,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (newDetachId !== undefined) {\n\t\t\tthis.table.movedDetaches.set(newDetachId, countToProcess, true);\n\t\t}\n\n\t\tif (countToProcess < count) {\n\t\t\tconst remainingCount = count - countToProcess;\n\n\t\t\tconst nextDetachId =\n\t\t\t\tnewDetachId !== undefined\n\t\t\t\t\t? offsetChangeAtomId(newDetachId, countToProcess)\n\t\t\t\t\t: undefined;\n\n\t\t\tthis.rebaseOverDetach(\n\t\t\t\toffsetChangeAtomId(baseDetachId, countToProcess),\n\t\t\t\tremainingCount,\n\t\t\t\tnextDetachId,\n\t\t\t\tnodeChange,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic addDetach(id: ChangeAtomId, count: number): void {\n\t\tthis.table.rebasedDetachLocations.set(id, count, this.fieldId);\n\t}\n\n\tpublic removeDetach(id: ChangeAtomId, count: number): void {\n\t\tthis.table.movedDetaches.set(id, count, true);\n\t}\n\n\tpublic doesBaseAttachNodes(\n\t\tid: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryEntry<ChangeAtomId, boolean> {\n\t\tlet countToProcess = count;\n\t\tconst attachEntry = getFirstAttachField(\n\t\t\tthis.table.baseChange.crossFieldKeys,\n\t\t\tid,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = attachEntry.length;\n\t\treturn { start: id, value: attachEntry.value !== undefined, length: countToProcess };\n\t}\n\n\tpublic getBaseRename(\n\t\tid: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<ChangeAtomId | undefined> {\n\t\treturn this.table.baseChange.rootNodes.oldToNewId.getFirst(id, count);\n\t}\n\n\tpublic getNewRenameForBaseRename(\n\t\tbaseRenameTo: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<ChangeAtomId | undefined> {\n\t\tlet countToProcess = count;\n\t\tconst inputEntry = firstDetachIdFromAttachId(\n\t\t\tthis.table.baseChange.rootNodes,\n\t\t\tbaseRenameTo,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tconst attachEntry = getFirstAttachField(\n\t\t\tthis.table.baseChange.crossFieldKeys,\n\t\t\tbaseRenameTo,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = attachEntry.length;\n\t\tif (attachEntry.value !== undefined) {\n\t\t\t// These nodes are attached in the output context of the base changeset.\n\t\t\treturn { value: undefined, length: countToProcess };\n\t\t}\n\n\t\tcountToProcess = inputEntry.length;\n\t\tconst inputId = inputEntry.value;\n\n\t\tconst moveEntry = this.table.entries.getFirst(inputId, countToProcess);\n\n\t\tcountToProcess = moveEntry.length;\n\t\tif (moveEntry.value !== undefined) {\n\t\t\treturn { ...moveEntry, value: moveEntry.value.cellRename ?? moveEntry.value.detachId };\n\t\t}\n\n\t\treturn this.table.newChange.rootNodes.oldToNewId.getFirst(inputId, countToProcess);\n\t}\n\n\tprivate invalidateBaseFields(fields: FieldId[]): void {\n\t\tif (this.allowInval) {\n\t\t\tfor (const fieldId of fields) {\n\t\t\t\tthis.table.affectedBaseFields.set(fieldIdKeyFromFieldId(fieldId), true);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assignRootChange(\n\ttable: RootNodeTable,\n\tnodeToParent: ChangeAtomIdBTree<NodeLocation> | undefined,\n\tdetachId: ChangeAtomId,\n\tnodeId: NodeId,\n\tdetachLocation: FieldId | undefined,\n\trebaseVersion: RebaseVersion,\n): void {\n\tassert(\n\t\trebaseVersion >= 2 || detachLocation !== undefined,\n\t\t\"All root changes need a detach location to support compatibility with older client versions\",\n\t);\n\n\tsetInChangeAtomIdMap(table.nodeChanges, detachId, nodeId);\n\n\tif (nodeToParent !== undefined) {\n\t\tsetInChangeAtomIdMap(nodeToParent, nodeId, { root: detachId });\n\t}\n\n\ttable.detachLocations.set(detachId, 1, detachLocation);\n}\n\nclass ComposeNodeManagerI implements ComposeNodeManager {\n\tpublic constructor(\n\t\tprivate readonly table: ComposeTable,\n\t\tprivate readonly fieldId: FieldId,\n\t\tprivate readonly allowInval: boolean = true,\n\t) {}\n\n\tpublic getNewChangesForBaseDetach(\n\t\tbaseDetachId: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<DetachedNodeEntry | undefined> {\n\t\tlet countToProcess = count;\n\n\t\tconst baseAttachEntry = getFirstFieldForCrossFieldKey(\n\t\t\tthis.table.baseChange,\n\t\t\t{ target: CrossFieldTarget.Destination, ...baseDetachId },\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = baseAttachEntry.length;\n\n\t\tlet result: RangeQueryResult<DetachedNodeEntry | undefined>;\n\t\tif (baseAttachEntry.value !== undefined) {\n\t\t\t// The base detach was part of a move.\n\t\t\t// We check if we've previously seen a node change at the move destination.\n\t\t\tconst entry = this.table.entries.getFirst(baseDetachId, countToProcess);\n\t\t\tresult = { value: entry.value, length: entry.length };\n\t\t} else {\n\t\t\t// The detached nodes are still detached in the new change's input context.\n\t\t\tconst rootEntry = rangeQueryChangeAtomIdMap(\n\t\t\t\tthis.table.newChange.rootNodes.nodeChanges,\n\t\t\t\tbaseDetachId,\n\t\t\t\tcountToProcess,\n\t\t\t);\n\n\t\t\tcountToProcess = rootEntry.length;\n\n\t\t\tconst newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(\n\t\t\t\tbaseDetachId,\n\t\t\t\tcountToProcess,\n\t\t\t);\n\n\t\t\tcountToProcess = newRenameEntry.length;\n\n\t\t\tresult = {\n\t\t\t\tvalue: { nodeChange: rootEntry.value, detachId: newRenameEntry.value },\n\t\t\t\tlength: countToProcess,\n\t\t\t};\n\t\t}\n\n\t\t// TODO: Consider moving this to a separate method so that this method can be side-effect free.\n\t\tif (result.value?.nodeChange !== undefined) {\n\t\t\tsetInChangeAtomIdMap(this.table.movedNodeToParent, result.value.nodeChange, {\n\t\t\t\tfield: this.fieldId,\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic composeAttachDetach(\n\t\tbaseAttachId: ChangeAtomId,\n\t\tnewDetachId: ChangeAtomId,\n\t\tcount: number,\n\t): void {\n\t\tlet countToProcess = count;\n\n\t\tconst newAttachEntry = getFirstAttachField(\n\t\t\tthis.table.newChange.crossFieldKeys,\n\t\t\tnewDetachId,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = newAttachEntry.length;\n\n\t\t// Both changes can have the same ID if they came from inverse changesets.\n\t\t// If the new detach is part of a move,\n\t\t// then both input changesets contain the attach cross-field key for this ID.\n\t\t// The new attach may still exist in the composed changeset so we do not remove it here.\n\t\t// The new attach will typically cancel with a base detach,\n\t\t// in which case the cross-field key will be removed in `composeDetachAttach`.\n\t\tconst hasNewAttachWithBaseAttachId =\n\t\t\tareEqualChangeAtomIds(baseAttachId, newDetachId) && newAttachEntry.value !== undefined;\n\n\t\tif (!hasNewAttachWithBaseAttachId) {\n\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t{ ...baseAttachId, target: CrossFieldTarget.Destination },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\tconst baseDetachEntry = getFirstDetachField(\n\t\t\tthis.table.baseChange.crossFieldKeys,\n\t\t\tbaseAttachId,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = baseDetachEntry.length;\n\n\t\tconst baseRootIdEntry = firstDetachIdFromAttachId(\n\t\t\tthis.table.baseChange.rootNodes,\n\t\t\tbaseAttachId,\n\t\t\tcountToProcess,\n\t\t);\n\t\tcountToProcess = baseRootIdEntry.length;\n\n\t\tconst baseDetachId = baseRootIdEntry.value;\n\n\t\tif (baseDetachEntry.value !== undefined) {\n\t\t\t// The base change moves these nodes.\n\t\t\tconst prevEntry =\n\t\t\t\tthis.table.entries.getFirst(baseAttachId, baseDetachEntry.length).value ?? {};\n\n\t\t\tthis.table.entries.set(baseAttachId, baseDetachEntry.length, {\n\t\t\t\t...prevEntry,\n\t\t\t\tdetachId: newDetachId,\n\t\t\t});\n\n\t\t\t// The new detach will replace the base detach, so we remove the key for the base detach, unless they have the same ID.\n\t\t\tif (!areEqualChangeAtomIds(baseAttachId, newDetachId)) {\n\t\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t\t{ ...baseAttachId, target: CrossFieldTarget.Source },\n\t\t\t\t\tcountToProcess,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.table.movedCrossFieldKeys.set(\n\t\t\t\t{ ...newDetachId, target: CrossFieldTarget.Source },\n\t\t\t\tcountToProcess,\n\t\t\t\tbaseDetachEntry.value,\n\t\t\t);\n\n\t\t\tthis.invalidateBaseFields([baseDetachEntry.value]);\n\t\t} else {\n\t\t\tconst baseDetachLocationEntry = this.table.baseChange.rootNodes.detachLocations.getFirst(\n\t\t\t\tbaseDetachId,\n\t\t\t\tcountToProcess,\n\t\t\t);\n\t\t\tcountToProcess = baseDetachLocationEntry.length;\n\n\t\t\t// These nodes were detached in the base change's input context,\n\t\t\t// so the net effect of the two changes is a rename.\n\t\t\tappendNodeRename(\n\t\t\t\tthis.table.composedRootNodes,\n\t\t\t\tbaseAttachId,\n\t\t\t\tnewDetachId,\n\t\t\t\tbaseDetachEntry.length,\n\t\t\t\tthis.table.baseChange.rootNodes,\n\t\t\t\tbaseDetachLocationEntry.value ?? this.fieldId,\n\t\t\t);\n\n\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t{ ...newDetachId, target: CrossFieldTarget.Source },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\tif (newAttachEntry.value === undefined) {\n\t\t\tconst newOutputDetachLocationEntry =\n\t\t\t\tthis.table.newChange.rootNodes.outputDetachLocations.getFirst(\n\t\t\t\t\tnewDetachId,\n\t\t\t\t\tcountToProcess,\n\t\t\t\t);\n\n\t\t\tcountToProcess = newOutputDetachLocationEntry.length;\n\n\t\t\tthis.table.composedRootNodes.outputDetachLocations.set(\n\t\t\t\tnewDetachId,\n\t\t\t\tcountToProcess,\n\t\t\t\tnewOutputDetachLocationEntry.value ?? this.fieldId,\n\t\t\t);\n\t\t}\n\n\t\tif (countToProcess < count) {\n\t\t\tconst remainingCount = count - countToProcess;\n\t\t\tthis.composeAttachDetach(\n\t\t\t\toffsetChangeAtomId(baseAttachId, countToProcess),\n\t\t\t\toffsetChangeAtomId(newDetachId, countToProcess),\n\t\t\t\tremainingCount,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic sendNewChangesToBaseSourceLocation(\n\t\tbaseAttachId: ChangeAtomId,\n\t\tnewChanges: NodeId,\n\t): void {\n\t\tconst { value: baseDetachId } = firstDetachIdFromAttachId(\n\t\t\tthis.table.baseChange.rootNodes,\n\t\t\tbaseAttachId,\n\t\t\t1,\n\t\t);\n\n\t\tconst detachFields = getFieldsForCrossFieldKey(\n\t\t\tthis.table.baseChange,\n\t\t\t{\n\t\t\t\t...baseDetachId,\n\t\t\t\ttarget: CrossFieldTarget.Source,\n\t\t\t},\n\t\t\t1,\n\t\t);\n\n\t\tif (detachFields.length > 0) {\n\t\t\t// The base attach is part of a move in the base changeset.\n\t\t\tconst prevEntry = this.table.entries.getFirst(baseDetachId, 1).value ?? {};\n\t\t\tthis.table.entries.set(baseDetachId, 1, { ...prevEntry, nodeChange: newChanges });\n\n\t\t\tif (newChanges !== undefined) {\n\t\t\t\tthis.invalidateBaseFields(detachFields);\n\t\t\t}\n\t\t} else {\n\t\t\tconst baseNodeId = getFromChangeAtomIdMap(\n\t\t\t\tthis.table.baseChange.rootNodes.nodeChanges,\n\t\t\t\tbaseDetachId,\n\t\t\t);\n\n\t\t\tif (baseNodeId !== undefined) {\n\t\t\t\taddNodesToCompose(this.table, baseNodeId, newChanges);\n\t\t\t} else {\n\t\t\t\tassignRootChange(\n\t\t\t\t\tthis.table.composedRootNodes,\n\t\t\t\t\tthis.table.movedNodeToParent,\n\t\t\t\t\tbaseDetachId,\n\t\t\t\t\tnewChanges,\n\t\t\t\t\tthis.fieldId,\n\t\t\t\t\tthis.table.rebaseVersion,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate areSameNodes(\n\t\tbaseDetachId: ChangeAtomId,\n\t\tnewAttachId: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<boolean> {\n\t\tconst renamedDetachEntry = firstAttachIdFromDetachId(\n\t\t\tthis.table.composedRootNodes,\n\t\t\tbaseDetachId,\n\t\t\tcount,\n\t\t);\n\n\t\tconst isReattachOfSameNodes = areEqualChangeAtomIds(renamedDetachEntry.value, newAttachId);\n\t\treturn { ...renamedDetachEntry, value: isReattachOfSameNodes };\n\t}\n\n\tpublic composeDetachAttach(\n\t\tbaseDetachId: ChangeAtomId,\n\t\tnewAttachId: ChangeAtomId,\n\t\tcount: number,\n\t\tcomposeToPin: boolean,\n\t): void {\n\t\tconst areSameEntry = this.areSameNodes(baseDetachId, newAttachId, count);\n\n\t\tconst countToProcess = areSameEntry.length;\n\t\tif (areSameEntry.value) {\n\t\t\t// These nodes have been moved back to their original location, so the composed changeset should not have any renames for them.\n\t\t\t// Note that deleting the rename from `this.table.composedRootNodes` would change the result of this method\n\t\t\t// if it were rerun due to the field being invalidated, so we instead record that the rename should be deleted later.\n\t\t\tthis.table.renamesToDelete.set(baseDetachId, countToProcess, true);\n\t\t}\n\n\t\tif (composeToPin) {\n\t\t\tthis.table.movedCrossFieldKeys.set(\n\t\t\t\t{ target: CrossFieldTarget.Source, ...newAttachId },\n\t\t\t\tcountToProcess,\n\t\t\t\tthis.fieldId,\n\t\t\t);\n\n\t\t\tif (!areEqualChangeAtomIds(baseDetachId, newAttachId)) {\n\t\t\t\t// The pin will have `newAttachId` as both its detach and attach ID.\n\t\t\t\t// So we remove `baseDetachId` unless that is equal to the pin's detach ID.\n\t\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t\t{ target: CrossFieldTarget.Source, ...baseDetachId },\n\t\t\t\t\tcountToProcess,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Note that while change2 should already have this key, change1 may have a rollback for the same ID in a different location.\n\t\t\t// In that case, change1's attach should be canceled out by a detach from change2.\n\t\t\t// Here we make sure that the composed change has the correct location (this field) for the attach ID.\n\t\t\tthis.table.movedCrossFieldKeys.set(\n\t\t\t\t{ target: CrossFieldTarget.Destination, ...newAttachId },\n\t\t\t\tcountToProcess,\n\t\t\t\tthis.fieldId,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t{ target: CrossFieldTarget.Source, ...baseDetachId },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t{ target: CrossFieldTarget.Destination, ...newAttachId },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\tif (countToProcess < count) {\n\t\t\tthis.composeAttachDetach(\n\t\t\t\toffsetChangeAtomId(baseDetachId, countToProcess),\n\t\t\t\toffsetChangeAtomId(newAttachId, countToProcess),\n\t\t\t\tcount - countToProcess,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate invalidateBaseFields(fields: FieldId[]): void {\n\t\tif (this.allowInval) {\n\t\t\tfor (const fieldId of fields) {\n\t\t\t\tthis.table.pendingCompositions.affectedBaseFields.set(\n\t\t\t\t\tfieldIdKeyFromFieldId(fieldId),\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction makeModularChangeset(\n\tprops: {\n\t\trebaseVersion?: RebaseVersion;\n\t\tfieldChanges?: FieldChangeMap;\n\t\tnodeChanges?: ChangeAtomIdBTree<NodeChangeset>;\n\t\trootNodes?: RootNodeTable;\n\t\tnodeToParent?: ChangeAtomIdBTree<NodeLocation>;\n\t\tnodeAliases?: ChangeAtomIdBTree<NodeId>;\n\t\tcrossFieldKeys?: CrossFieldKeyTable;\n\t\tmaxId: number;\n\t\trevisions?: readonly RevisionInfo[];\n\t\tconstraintViolationCount?: number;\n\t\tconstraintViolationCountOnRevert?: number;\n\t\tbuilds?: ChangeAtomIdBTree<TreeChunk>;\n\t\tdestroys?: ChangeAtomIdBTree<number>;\n\t\trefreshers?: ChangeAtomIdBTree<TreeChunk>;\n\t} = {\n\t\tmaxId: -1,\n\t},\n): ModularChangeset {\n\tconst changeset: Mutable<ModularChangeset> = {\n\t\trebaseVersion: props.rebaseVersion ?? 1,\n\t\tfieldChanges: props.fieldChanges ?? new Map(),\n\t\tnodeChanges: props.nodeChanges ?? newTupleBTree(),\n\t\trootNodes: props.rootNodes ?? newRootTable(),\n\t\tnodeToParent: props.nodeToParent ?? newTupleBTree(),\n\t\tnodeAliases: props.nodeAliases ?? newTupleBTree(),\n\t\tcrossFieldKeys: props.crossFieldKeys ?? newCrossFieldRangeTable(),\n\t};\n\n\tif (props.revisions !== undefined && props.revisions.length > 0) {\n\t\tchangeset.revisions = props.revisions;\n\t}\n\tif (props.maxId >= 0) {\n\t\tchangeset.maxId = brand(props.maxId);\n\t}\n\tif (props.constraintViolationCount !== undefined && props.constraintViolationCount > 0) {\n\t\tchangeset.constraintViolationCount = props.constraintViolationCount;\n\t}\n\tif (\n\t\tprops.constraintViolationCountOnRevert !== undefined &&\n\t\tprops.constraintViolationCountOnRevert > 0\n\t) {\n\t\tchangeset.constraintViolationCountOnRevert = props.constraintViolationCountOnRevert;\n\t}\n\tif (props.builds !== undefined && props.builds.size > 0) {\n\t\tchangeset.builds = props.builds;\n\t}\n\tif (props.destroys !== undefined && props.destroys.size > 0) {\n\t\tchangeset.destroys = props.destroys;\n\t}\n\tif (props.refreshers !== undefined && props.refreshers.size > 0) {\n\t\tchangeset.refreshers = props.refreshers;\n\t}\n\n\treturn changeset;\n}\n\nexport class ModularEditBuilder extends EditBuilder<ModularChangeset> {\n\tprivate transactionDepth: number = 0;\n\tprivate idAllocator: IdAllocator;\n\n\tpublic constructor(\n\t\tfamily: ChangeFamily<ChangeFamilyEditor, ModularChangeset>,\n\t\tprivate readonly fieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n\t\tchangeReceiver: (change: TaggedChange<ModularChangeset>) => void,\n\t) {\n\t\tsuper(family, changeReceiver);\n\t\tthis.idAllocator = idAllocatorFromMaxId();\n\t}\n\n\tpublic isInTransaction(): boolean {\n\t\treturn this.transactionDepth > 0;\n\t}\n\n\tpublic override enterTransaction(): void {\n\t\tthis.transactionDepth += 1;\n\t\tif (this.transactionDepth === 1) {\n\t\t\tthis.idAllocator = idAllocatorFromMaxId();\n\t\t}\n\t}\n\n\tpublic override exitTransaction(): void {\n\t\tassert(this.transactionDepth > 0, 0x5b9 /* Cannot exit inexistent transaction */);\n\t\tthis.transactionDepth -= 1;\n\t\tif (this.transactionDepth === 0) {\n\t\t\tthis.idAllocator = idAllocatorFromMaxId();\n\t\t}\n\t}\n\n\t/**\n\t * Builds a new tree to use in an edit.\n\t *\n\t * @param firstId - The ID to associate with the first node\n\t * @param content - The node(s) to build.\n\t * @param revision - The revision to use for the build.\n\t * @returns A description of the edit that can be passed to `submitChanges`.\n\t * The returned object may contain an owning reference to the given TreeChunk.\n\t */\n\tpublic buildTrees(\n\t\tfirstId: ChangesetLocalId,\n\t\tcontent: TreeChunk,\n\t\trevision: RevisionTag,\n\t): GlobalEditDescription {\n\t\tif (content.topLevelLength === 0) {\n\t\t\treturn { type: \"global\", revision };\n\t\t}\n\n\t\t// This content will be added to a GlobalEditDescription whose lifetime exceeds the scope of this function.\n\t\tcontent.referenceAdded();\n\n\t\tconst builds: ChangeAtomIdBTree<TreeChunk> = newTupleBTree();\n\t\tbuilds.set([revision, firstId], content);\n\n\t\treturn {\n\t\t\ttype: \"global\",\n\t\t\tbuilds,\n\t\t\trevision,\n\t\t};\n\t}\n\n\t/**\n\t * Adds a change to the edit builder\n\t * @param field - the field which is being edited\n\t * @param fieldKind - the kind of the field\n\t * @param change - the change to the field\n\t * @param revision - the revision of the change\n\t */\n\tpublic submitChange(\n\t\tfield: NormalizedFieldUpPath,\n\t\tfieldKind: FieldKindIdentifier,\n\t\tchange: FieldChangeset,\n\t\trevision: RevisionTag,\n\t): void {\n\t\tconst localCrossFieldKeys = getChangeHandler(this.fieldKinds, fieldKind).getCrossFieldKeys(\n\t\t\tchange,\n\t\t);\n\n\t\tconst modularChange = buildModularChangesetFromField({\n\t\t\tpath: field,\n\t\t\tfieldChange: { fieldKind, change },\n\t\t\tnodeChanges: newTupleBTree(),\n\t\t\tnodeToParent: newTupleBTree(),\n\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\trootNodes: newRootTable(),\n\t\t\tidAllocator: this.idAllocator,\n\t\t\tlocalCrossFieldKeys,\n\t\t\trevision,\n\t\t});\n\t\tthis.applyChange(tagChange(modularChange, revision));\n\t}\n\n\tpublic submitChanges(changes: EditDescription[], revision: RevisionTag): void {\n\t\tconst modularChange = this.buildChanges(changes);\n\t\tthis.applyChange(tagChange(modularChange, revision));\n\t}\n\n\tpublic buildChanges(changes: EditDescription[]): ModularChangeset {\n\t\tconst revisions: Set<RevisionTag> = new Set();\n\t\tconst changeMaps = changes.map((change) => {\n\t\t\trevisions.add(change.revision);\n\t\t\treturn makeAnonChange(\n\t\t\t\tchange.type === \"global\"\n\t\t\t\t\t? makeModularChangeset({\n\t\t\t\t\t\t\tmaxId: this.idAllocator.getMaxId(),\n\t\t\t\t\t\t\tbuilds: change.builds,\n\t\t\t\t\t\t\trootNodes: renameTableFromRenameDescriptions(change.renames ?? []),\n\t\t\t\t\t\t\trevisions: [{ revision: change.revision }],\n\t\t\t\t\t\t})\n\t\t\t\t\t: buildModularChangesetFromField({\n\t\t\t\t\t\t\tpath: change.field,\n\t\t\t\t\t\t\tfieldChange: {\n\t\t\t\t\t\t\t\tfieldKind: change.fieldKind,\n\t\t\t\t\t\t\t\tchange: change.change,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnodeChanges: newTupleBTree(),\n\t\t\t\t\t\t\tnodeToParent: newTupleBTree(),\n\t\t\t\t\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\t\t\t\t\trootNodes: newRootTable(),\n\t\t\t\t\t\t\tidAllocator: this.idAllocator,\n\t\t\t\t\t\t\tlocalCrossFieldKeys: getChangeHandler(\n\t\t\t\t\t\t\t\tthis.fieldKinds,\n\t\t\t\t\t\t\t\tchange.fieldKind,\n\t\t\t\t\t\t\t).getCrossFieldKeys(change.change),\n\t\t\t\t\t\t\trevision: change.revision,\n\t\t\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t\tconst revInfo = Array.from(revisions).map((revision) => ({ revision }));\n\t\tconst composedChange: Mutable<ModularChangeset> = {\n\t\t\t...this.changeFamily.rebaser.compose(changeMaps),\n\t\t\trevisions: revInfo,\n\t\t};\n\n\t\tconst maxId: ChangesetLocalId = brand(this.idAllocator.getMaxId());\n\t\tif (maxId >= 0) {\n\t\t\tcomposedChange.maxId = maxId;\n\t\t}\n\t\treturn composedChange;\n\t}\n\n\tpublic generateId(count?: number): ChangesetLocalId {\n\t\treturn brand(this.idAllocator.allocate(count));\n\t}\n\n\tpublic addNodeExistsConstraint(path: NormalizedUpPath, revision: RevisionTag): void {\n\t\tconst nodeChange: NodeChangeset = {\n\t\t\tnodeExistsConstraint: { violated: false },\n\t\t};\n\n\t\tthis.applyChange(\n\t\t\ttagChange(\n\t\t\t\tbuildModularChangesetFromNode({\n\t\t\t\t\tpath,\n\t\t\t\t\tnodeChange,\n\t\t\t\t\tnodeChanges: newTupleBTree(),\n\t\t\t\t\tnodeToParent: newTupleBTree(),\n\t\t\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\t\t\trootNodes: newRootTable(),\n\t\t\t\t\tidAllocator: this.idAllocator,\n\t\t\t\t\trevision,\n\t\t\t\t}),\n\t\t\t\trevision,\n\t\t\t),\n\t\t);\n\t}\n\n\tpublic addNodeExistsConstraintOnRevert(path: NormalizedUpPath, revision: RevisionTag): void {\n\t\tconst nodeChange: NodeChangeset = {\n\t\t\tnodeExistsConstraintOnRevert: { violated: false },\n\t\t};\n\n\t\tthis.applyChange(\n\t\t\ttagChange(\n\t\t\t\tbuildModularChangesetFromNode({\n\t\t\t\t\tpath,\n\t\t\t\t\tnodeChange,\n\t\t\t\t\tnodeChanges: newTupleBTree(),\n\t\t\t\t\tnodeToParent: newTupleBTree(),\n\t\t\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\t\t\trootNodes: newRootTable(),\n\t\t\t\t\tidAllocator: this.idAllocator,\n\t\t\t\t\trevision,\n\t\t\t\t}),\n\t\t\t\trevision,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport function buildModularChangesetFromField(props: {\n\tpath: NormalizedFieldUpPath;\n\tfieldChange: FieldChange;\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>;\n\tnodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\tcrossFieldKeys: CrossFieldKeyTable;\n\trootNodes: RootNodeTable;\n\tlocalCrossFieldKeys?: CrossFieldKeyRange[];\n\trevision: RevisionTag;\n\tidAllocator?: IdAllocator;\n\tchildId?: NodeId;\n}): ModularChangeset {\n\tconst {\n\t\tpath,\n\t\tfieldChange,\n\t\tnodeChanges,\n\t\tnodeToParent,\n\t\tcrossFieldKeys,\n\t\trootNodes,\n\t\tidAllocator = idAllocatorFromMaxId(),\n\t\tlocalCrossFieldKeys = [],\n\t\tchildId,\n\t\trevision,\n\t} = props;\n\tconst fieldChanges: FieldChangeMap = new Map([[path.field, fieldChange]]);\n\n\tif (path.parent === undefined) {\n\t\tconst field = { nodeId: undefined, field: path.field };\n\t\tfor (const { key, count } of localCrossFieldKeys) {\n\t\t\tcrossFieldKeys.set(key, count, field);\n\t\t}\n\n\t\tif (childId !== undefined) {\n\t\t\tsetInChangeAtomIdMap(nodeToParent, childId, {\n\t\t\t\tfield: {\n\t\t\t\t\tnodeId: undefined,\n\t\t\t\t\tfield: path.field,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn makeModularChangeset({\n\t\t\tfieldChanges,\n\t\t\tnodeChanges,\n\t\t\tnodeToParent,\n\t\t\tcrossFieldKeys,\n\t\t\trootNodes,\n\t\t\tmaxId: idAllocator.getMaxId(),\n\t\t\trevisions: [{ revision }],\n\t\t});\n\t}\n\n\tconst nodeChangeset: NodeChangeset = {\n\t\tfieldChanges,\n\t};\n\n\tconst parentId: NodeId = { localId: brand(idAllocator.allocate()), revision };\n\tconst fieldId = { nodeId: parentId, field: path.field };\n\n\tfor (const { key, count } of localCrossFieldKeys) {\n\t\tcrossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });\n\t}\n\n\tif (childId !== undefined) {\n\t\tsetInChangeAtomIdMap(nodeToParent, childId, {\n\t\t\tfield: fieldId,\n\t\t});\n\t}\n\n\treturn buildModularChangesetFromNode({\n\t\tpath: path.parent,\n\t\tnodeChange: nodeChangeset,\n\t\tnodeChanges,\n\t\tnodeToParent,\n\t\tcrossFieldKeys,\n\t\trootNodes,\n\t\tidAllocator,\n\t\trevision,\n\t\tnodeId: parentId,\n\t});\n}\n\nfunction buildModularChangesetFromNode(props: {\n\tpath: NormalizedUpPath;\n\tnodeChange: NodeChangeset;\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>;\n\tnodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\tcrossFieldKeys: CrossFieldKeyTable;\n\trootNodes: RootNodeTable;\n\tidAllocator: IdAllocator;\n\trevision: RevisionTag;\n\tnodeId?: NodeId;\n}): ModularChangeset {\n\tconst {\n\t\tpath,\n\t\tnodeId = { localId: brand(props.idAllocator.allocate()), revision: props.revision },\n\t} = props;\n\tsetInChangeAtomIdMap(props.nodeChanges, nodeId, props.nodeChange);\n\n\tif (isDetachedUpPathRoot(path)) {\n\t\tprops.rootNodes.nodeChanges.set(\n\t\t\t[path.detachedNodeId.major, brand(path.detachedNodeId.minor)],\n\t\t\tnodeId,\n\t\t);\n\t\treturn makeModularChangeset({\n\t\t\trootNodes: props.rootNodes,\n\t\t\tnodeChanges: props.nodeChanges,\n\t\t\tnodeToParent: props.nodeToParent,\n\t\t\tcrossFieldKeys: props.crossFieldKeys,\n\t\t\tmaxId: props.idAllocator.getMaxId(),\n\t\t\trevisions: [{ revision: props.revision }],\n\t\t});\n\t} else {\n\t\tconst fieldChangeset = genericFieldKind.changeHandler.editor.buildChildChanges([\n\t\t\t[path.parentIndex, nodeId],\n\t\t]);\n\n\t\tconst fieldChange: FieldChange = {\n\t\t\tfieldKind: genericFieldKind.identifier,\n\t\t\tchange: fieldChangeset,\n\t\t};\n\n\t\treturn buildModularChangesetFromField({\n\t\t\t...props,\n\t\t\tpath: { parent: path.parent, field: path.parentField },\n\t\t\tfieldChange,\n\t\t\tlocalCrossFieldKeys: [],\n\t\t\tchildId: nodeId,\n\t\t});\n\t}\n}\n\nexport interface FieldEditDescription {\n\ttype: \"field\";\n\tfield: NormalizedFieldUpPath;\n\tfieldKind: FieldKindIdentifier;\n\tchange: FieldChangeset;\n\trevision: RevisionTag;\n}\n\nexport interface GlobalEditDescription {\n\ttype: \"global\";\n\trevision: RevisionTag;\n\tbuilds?: ChangeAtomIdBTree<TreeChunk>;\n\trenames?: RenameDescription[];\n}\n\nexport interface RenameDescription {\n\tcount: number;\n\toldId: ChangeAtomId;\n\tnewId: ChangeAtomId;\n\tdetachLocation: FieldId | undefined;\n}\n\nfunction renameTableFromRenameDescriptions(renames: RenameDescription[]): RootNodeTable {\n\tconst table = newRootTable();\n\tfor (const rename of renames) {\n\t\taddNodeRename(table, rename.oldId, rename.newId, rename.count, rename.detachLocation);\n\t}\n\n\treturn table;\n}\n\nexport type EditDescription = FieldEditDescription | GlobalEditDescription;\n\nfunction getRevInfoFromTaggedChanges(changes: TaggedChange<ModularChangeset>[]): {\n\trevInfos: RevisionInfo[];\n\tmaxId: ChangesetLocalId;\n} {\n\tlet maxId = -1;\n\tconst revInfos: RevisionInfo[] = [];\n\tfor (const taggedChange of changes) {\n\t\tconst change = taggedChange.change;\n\t\tmaxId = Math.max(change.maxId ?? -1, maxId);\n\t\trevInfos.push(...revisionInfoFromTaggedChange(taggedChange));\n\t}\n\n\treturn { maxId: brand(maxId), revInfos };\n}\n\nfunction revisionInfoFromTaggedChange(\n\ttaggedChange: TaggedChange<ModularChangeset>,\n): RevisionInfo[] {\n\tconst revInfos: RevisionInfo[] = [];\n\tif (taggedChange.change.revisions !== undefined) {\n\t\trevInfos.push(...taggedChange.change.revisions);\n\t} else if (taggedChange.revision !== undefined) {\n\t\tconst info: Mutable<RevisionInfo> = { revision: taggedChange.revision };\n\t\tif (taggedChange.rollbackOf !== undefined) {\n\t\t\tinfo.rollbackOf = taggedChange.rollbackOf;\n\t\t}\n\t\trevInfos.push(info);\n\t}\n\treturn revInfos;\n}\n\nfunction fieldChangeFromId(change: ModularChangeset, id: FieldId): FieldChange {\n\tconst fieldId = normalizeFieldId(id, change.nodeAliases);\n\tconst fieldMap = fieldMapFromNodeId(\n\t\tchange.fieldChanges,\n\t\tchange.nodeChanges,\n\t\tchange.nodeAliases,\n\t\tfieldId.nodeId,\n\t);\n\treturn fieldMap.get(id.field) ?? fail(0xb25 /* No field exists for the given ID */);\n}\n\nfunction fieldMapFromNodeId(\n\trootFieldMap: FieldChangeMap,\n\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\taliases: ChangeAtomIdBTree<NodeId>,\n\tnodeId: NodeId | undefined,\n): FieldChangeMap {\n\tif (nodeId === undefined) {\n\t\treturn rootFieldMap;\n\t}\n\n\tconst node = nodeChangeFromId(nodes, aliases, nodeId);\n\tassert(node.fieldChanges !== undefined, 0x9c9 /* Expected node to have field changes */);\n\treturn node.fieldChanges;\n}\n\nfunction rebasedFieldIdFromBaseId(table: RebaseTable, baseId: FieldId): FieldId {\n\tif (baseId.nodeId === undefined) {\n\t\treturn baseId;\n\t}\n\n\treturn { ...baseId, nodeId: rebasedNodeIdFromBaseNodeId(table, baseId.nodeId) };\n}\n\nfunction rebasedNodeIdFromBaseNodeId(table: RebaseTable, baseId: NodeId): NodeId {\n\treturn getFromChangeAtomIdMap(table.baseToRebasedNodeId, baseId) ?? baseId;\n}\n\nfunction nodeChangeFromId(\n\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\taliases: ChangeAtomIdBTree<NodeId>,\n\tid: NodeId,\n): NodeChangeset {\n\tconst normalizedId = normalizeNodeId(id, aliases);\n\tconst node = getFromChangeAtomIdMap(nodes, normalizedId);\n\tassert(node !== undefined, 0x9ca /* Unknown node ID */);\n\treturn node;\n}\n\nfunction fieldIdFromFieldIdKey([revision, localId, field]: FieldIdKey): FieldId {\n\tconst nodeId = localId !== undefined ? { revision, localId } : undefined;\n\treturn { nodeId, field };\n}\n\nfunction fieldIdKeyFromFieldId(fieldId: FieldId): FieldIdKey {\n\treturn [fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field];\n}\n\nfunction cloneNodeChangeset(nodeChangeset: NodeChangeset): NodeChangeset {\n\tif (nodeChangeset.fieldChanges !== undefined) {\n\t\treturn { ...nodeChangeset, fieldChanges: new Map(nodeChangeset.fieldChanges) };\n\t}\n\n\treturn { ...nodeChangeset };\n}\n\nfunction replaceNodeLocationRevision(\n\tlocation: NodeLocation,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): NodeLocation {\n\treturn location.field !== undefined\n\t\t? { field: replaceFieldIdRevision(location.field, oldRevisions, newRevision) }\n\t\t: { root: replaceAtomRevisions(location.root, oldRevisions, newRevision) };\n}\n\nfunction replaceFieldIdRevision(\n\tfieldId: FieldId,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): FieldId {\n\tif (fieldId.nodeId === undefined) {\n\t\treturn fieldId;\n\t}\n\n\treturn {\n\t\t...fieldId,\n\t\tnodeId: replaceAtomRevisions(fieldId.nodeId, oldRevisions, newRevision),\n\t};\n}\n\nexport function getNodeParent(changeset: ModularChangeset, nodeId: NodeId): NodeLocation {\n\tconst normalizedNodeId = normalizeNodeId(nodeId, changeset.nodeAliases);\n\tconst location = getFromChangeAtomIdMap(changeset.nodeToParent, normalizedNodeId);\n\tassert(location !== undefined, 0x9cb /* Parent field should be defined */);\n\n\tif (location.field !== undefined) {\n\t\treturn { field: normalizeFieldId(location.field, changeset.nodeAliases) };\n\t}\n\n\treturn location;\n}\n\nfunction getFieldsForCrossFieldKey(\n\tchangeset: ModularChangeset,\n\tkey: CrossFieldKey,\n\tcount: number,\n): FieldId[] {\n\treturn changeset.crossFieldKeys\n\t\t.getAll(key, count)\n\t\t.map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));\n}\n\nfunction getFirstFieldForCrossFieldKey(\n\tchangeset: ModularChangeset,\n\tkey: CrossFieldKey,\n\tcount: number,\n): RangeQueryResult<FieldId | undefined> {\n\tconst result = changeset.crossFieldKeys.getFirst(key, count);\n\tif (result.value === undefined) {\n\t\treturn result;\n\t}\n\n\treturn { ...result, value: normalizeFieldId(result.value, changeset.nodeAliases) };\n}\n\nfunction normalizeNodeLocation(\n\tlocation: NodeLocation,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): NodeLocation {\n\tif (location.field !== undefined) {\n\t\treturn { field: normalizeFieldId(location.field, nodeAliases) };\n\t}\n\n\treturn location;\n}\n\n// This is only exported for use in test utilities.\nexport function normalizeFieldId(\n\tfieldId: FieldId,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): FieldId {\n\treturn fieldId.nodeId !== undefined\n\t\t? { ...fieldId, nodeId: normalizeNodeId(fieldId.nodeId, nodeAliases) }\n\t\t: fieldId;\n}\n\n/**\n * @returns The canonical form of nodeId, according to nodeAliases\n */\nexport function normalizeNodeId(\n\tnodeId: NodeId,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): NodeId {\n\tlet currentId = nodeId;\n\tlet cycleProbeId: NodeId | undefined = nodeId;\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst dealiased = getFromChangeAtomIdMap(nodeAliases, currentId);\n\t\tif (dealiased === undefined) {\n\t\t\treturn currentId;\n\t\t}\n\n\t\tcurrentId = dealiased;\n\n\t\tif (cycleProbeId !== undefined) {\n\t\t\tcycleProbeId = getFromChangeAtomIdMap(nodeAliases, cycleProbeId);\n\t\t}\n\n\t\tif (cycleProbeId !== undefined) {\n\t\t\tcycleProbeId = getFromChangeAtomIdMap(nodeAliases, cycleProbeId);\n\t\t}\n\n\t\tassert(!areEqualChangeAtomIdOpts(cycleProbeId, currentId), \"Alias cycle detected\");\n\t}\n}\n\nfunction hasConflicts(change: ModularChangeset): boolean {\n\treturn (change.constraintViolationCount ?? 0) > 0;\n}\n\ninterface ModularChangesetContent {\n\tfieldChanges: FieldChangeMap;\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>;\n\tnodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\trootNodes: RootNodeTable;\n\tnodeAliases: ChangeAtomIdBTree<NodeId>;\n\tcrossFieldKeys: CrossFieldKeyTable;\n}\n\nfunction areEqualFieldIds(a: FieldId, b: FieldId): boolean {\n\treturn areEqualChangeAtomIdOpts(a.nodeId, b.nodeId) && a.field === b.field;\n}\n\nfunction firstAttachIdFromDetachId(\n\troots: RootNodeTable,\n\tdetachId: ChangeAtomId,\n\tcount: number,\n): RangeQueryResult<ChangeAtomId> {\n\tconst result = roots.oldToNewId.getFirst(detachId, count);\n\treturn { ...result, value: result.value ?? detachId };\n}\n\nfunction firstDetachIdFromAttachId(\n\troots: RootNodeTable,\n\tattachId: ChangeAtomId,\n\tcount: number,\n): RangeQueryEntry<ChangeAtomId, ChangeAtomId> {\n\tconst result = roots.newToOldId.getFirst(attachId, count);\n\treturn { ...result, start: attachId, value: result.value ?? attachId };\n}\n\nfunction rebaseCrossFieldKeys(\n\tsourceTable: CrossFieldKeyTable,\n\tmovedDetaches: ChangeAtomIdRangeMap<boolean>,\n\tnewDetachLocations: ChangeAtomIdRangeMap<FieldId>,\n): CrossFieldKeyTable {\n\tconst rebasedTable = sourceTable.clone();\n\tfor (const entry of movedDetaches.entries()) {\n\t\trebasedTable.delete({ ...entry.start, target: CrossFieldTarget.Source }, entry.length);\n\t}\n\n\tfor (const entry of newDetachLocations.entries()) {\n\t\trebasedTable.set(\n\t\t\t{ ...entry.start, target: CrossFieldTarget.Source },\n\t\t\tentry.length,\n\t\t\tentry.value,\n\t\t);\n\t}\n\n\treturn rebasedTable;\n}\n\nexport function newRootTable(): RootNodeTable {\n\treturn {\n\t\tnewToOldId: newChangeAtomIdTransform(),\n\t\toldToNewId: newChangeAtomIdTransform(),\n\t\tnodeChanges: newTupleBTree(),\n\t\tdetachLocations: newChangeAtomIdRangeMap(),\n\t\toutputDetachLocations: newChangeAtomIdRangeMap(),\n\t};\n}\n\nfunction rebaseRoots(\n\tchange: ModularChangeset,\n\tbase: ModularChangeset,\n\taffectedBaseFields: TupleBTree<FieldIdKey, boolean>,\n\tnodesToRebase: [newChangeset: NodeId, baseChangeset: NodeId][],\n\trebasedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\trebaseVersion: RebaseVersion,\n): RootNodeTable {\n\tconst rebasedRoots = newRootTable();\n\tfor (const renameEntry of change.rootNodes.oldToNewId.entries()) {\n\t\trebaseRename(change.rootNodes, rebasedRoots, renameEntry, base, affectedBaseFields);\n\t}\n\n\tfor (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {\n\t\tconst changes = base.rootNodes.nodeChanges.get(detachIdKey);\n\t\tif (changes !== undefined) {\n\t\t\tnodesToRebase.push([nodeId, changes]);\n\t\t}\n\n\t\tconst detachId = makeChangeAtomId(detachIdKey[1], detachIdKey[0]);\n\t\tconst attachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;\n\t\tconst baseAttachEntry = base.crossFieldKeys.getFirst(\n\t\t\t{ target: CrossFieldTarget.Destination, ...attachId },\n\t\t\t1,\n\t\t);\n\t\tif (baseAttachEntry.value !== undefined) {\n\t\t\taffectedBaseFields.set(fieldIdKeyFromFieldId(baseAttachEntry.value), true);\n\t\t\trebasedNodeToParent.delete(detachIdKey);\n\t\t} else {\n\t\t\tconst renamedDetachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;\n\t\t\tconst baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(\n\t\t\t\trenamedDetachId,\n\t\t\t\t1,\n\t\t\t).value;\n\n\t\t\tif (baseOutputDetachLocation !== undefined) {\n\t\t\t\taffectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);\n\t\t\t}\n\n\t\t\tconst detachLocation =\n\t\t\t\tbaseOutputDetachLocation ??\n\t\t\t\tchange.rootNodes.detachLocations.getFirst(detachId, 1).value;\n\n\t\t\t// Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.\n\t\t\t// We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`\n\t\t\tassignRootChange(\n\t\t\t\trebasedRoots,\n\t\t\t\trebasedNodeToParent,\n\t\t\t\trenamedDetachId,\n\t\t\t\tnodeId,\n\t\t\t\tdetachLocation,\n\t\t\t\trebaseVersion,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const entry of change.rootNodes.outputDetachLocations.entries()) {\n\t\trebasedRoots.outputDetachLocations.set(entry.start, entry.length, entry.value);\n\t}\n\n\treturn rebasedRoots;\n}\n\nfunction rebaseRename(\n\tnewRoots: RootNodeTable,\n\trebasedRoots: RootNodeTable,\n\trenameEntry: RangeQueryEntry<ChangeAtomId, ChangeAtomId>,\n\tbase: ModularChangeset,\n\taffectedBaseFields: TupleBTree<FieldIdKey, boolean>,\n): void {\n\tlet count = renameEntry.length;\n\tconst baseRenameEntry = firstAttachIdFromDetachId(base.rootNodes, renameEntry.start, count);\n\tcount = baseRenameEntry.length;\n\n\tconst baseAttachEntry = base.crossFieldKeys.getFirst(\n\t\t{\n\t\t\t...baseRenameEntry.value,\n\t\t\ttarget: CrossFieldTarget.Destination,\n\t\t},\n\t\tcount,\n\t);\n\n\tcount = baseAttachEntry.length;\n\n\tif (baseAttachEntry.value !== undefined) {\n\t\t// This rename represents an intention to detach these nodes.\n\t\t// The rebased change should have a detach in the field where the base change attaches the nodes,\n\t\t// so we need to ensure that field is processed.\n\t\taffectedBaseFields.set(\n\t\t\tfieldIdKeyFromFieldId(normalizeFieldId(baseAttachEntry.value, base.nodeAliases)),\n\t\t\ttrue,\n\t\t);\n\t} else {\n\t\tconst baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(\n\t\t\tbaseRenameEntry.value,\n\t\t\t1,\n\t\t).value;\n\n\t\tif (baseOutputDetachLocation !== undefined) {\n\t\t\taffectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);\n\t\t}\n\n\t\tconst detachEntry = newRoots.detachLocations.getFirst(renameEntry.start, count);\n\t\tcount = detachEntry.length;\n\n\t\tconst detachLocation = baseOutputDetachLocation ?? detachEntry.value;\n\n\t\t// Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.\n\t\t// We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`\n\t\taddNodeRename(\n\t\t\trebasedRoots,\n\t\t\tbaseRenameEntry.value,\n\t\t\trenameEntry.value,\n\t\t\tcount,\n\t\t\tdetachLocation,\n\t\t);\n\t}\n\n\tconst countRemaining = renameEntry.length - count;\n\tif (countRemaining > 0) {\n\t\trebaseRename(\n\t\t\tnewRoots,\n\t\t\trebasedRoots,\n\t\t\t{\n\t\t\t\tstart: offsetChangeAtomId(renameEntry.start, count),\n\t\t\t\tvalue: offsetChangeAtomId(renameEntry.value, count),\n\t\t\t\tlength: countRemaining,\n\t\t\t},\n\t\t\tbase,\n\t\t\taffectedBaseFields,\n\t\t);\n\t}\n}\n\n/**\n * For each root detach location, replaces any node ID from the base changeset\n * with the corresponding ID in the new changeset.\n */\nfunction fixupRebasedDetachLocations(table: RebaseTable): void {\n\tfor (const {\n\t\tstart,\n\t\tlength,\n\t\tvalue: detachLocation,\n\t} of table.rebasedRootNodes.detachLocations.entries()) {\n\t\tconst normalizedDetachLocation = normalizeFieldId(\n\t\t\tdetachLocation,\n\t\t\ttable.baseChange.nodeAliases,\n\t\t);\n\n\t\tif (normalizedDetachLocation.nodeId !== undefined) {\n\t\t\tconst rebasedNodeId = getFromChangeAtomIdMap(\n\t\t\t\ttable.baseToRebasedNodeId,\n\t\t\t\tnormalizedDetachLocation.nodeId,\n\t\t\t);\n\n\t\t\tif (rebasedNodeId !== undefined) {\n\t\t\t\ttable.rebasedRootNodes.detachLocations.set(start, length, {\n\t\t\t\t\t...normalizedDetachLocation,\n\t\t\t\t\tnodeId: rebasedNodeId,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction addNodesToCompose(table: ComposeTable, id1: NodeId, id2: NodeId): void {\n\tconst normalizedId1 = normalizeNodeId(id1, table.baseChange.nodeAliases);\n\tconst normalizedId2 = normalizeNodeId(id2, table.newChange.nodeAliases);\n\tif (getFromChangeAtomIdMap(table.newToBaseNodeId, normalizedId2) === undefined) {\n\t\tsetInChangeAtomIdMap(table.newToBaseNodeId, normalizedId2, normalizedId1);\n\t\ttable.pendingCompositions.nodeIdsToCompose.push([normalizedId1, normalizedId2]);\n\t}\n}\n\nfunction composeRevInfos(\n\trevisions1: readonly RevisionInfo[] | undefined,\n\trevisions2: readonly RevisionInfo[] | undefined,\n): RevisionInfo[] {\n\tconst result: RevisionInfo[] = [...(revisions1 ?? []), ...(revisions2 ?? [])];\n\treturn result;\n}\n\nfunction composeCrossFieldKeyTables(\n\ttable1: CrossFieldKeyTable,\n\ttable2: CrossFieldKeyTable,\n\tmovedCrossFieldKeys: CrossFieldKeyTable,\n\tremovedCrossFieldKeys: CrossFieldRangeTable<boolean>,\n): CrossFieldKeyTable {\n\tconst composedTable = RangeMap.union(table1, table2);\n\tfor (const entry of movedCrossFieldKeys.entries()) {\n\t\tcomposedTable.set(entry.start, entry.length, entry.value);\n\t}\n\n\tfor (const entry of removedCrossFieldKeys.entries()) {\n\t\tcomposedTable.delete(entry.start, entry.length);\n\t}\n\n\treturn composedTable;\n}\n\nfunction composeRootTables(\n\tchange1: ModularChangeset,\n\tchange2: ModularChangeset,\n\tcomposedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\tmovedCrossFieldKeys: CrossFieldKeyTable,\n\tremovedCrossFieldKeys: CrossFieldRangeTable<boolean>,\n\tpendingCompositions: PendingCompositions,\n): RootNodeTable {\n\tconst composedTable = cloneRootTable(change1.rootNodes);\n\n\tfor (const renameEntry of change2.rootNodes.oldToNewId.entries()) {\n\t\tcomposeRename(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t\tcomposedTable,\n\t\t\trenameEntry.start,\n\t\t\trenameEntry.value,\n\t\t\trenameEntry.length,\n\t\t\tmovedCrossFieldKeys,\n\t\t\tremovedCrossFieldKeys,\n\t\t\tpendingCompositions,\n\t\t);\n\t}\n\n\tfor (const [[revision2, id2], nodeId2] of change2.rootNodes.nodeChanges.entries()) {\n\t\tconst detachId2 = { revision: revision2, localId: id2 };\n\t\tconst detachId1 = firstDetachIdFromAttachId(change1.rootNodes, detachId2, 1).value;\n\t\tconst nodeId1 = getFromChangeAtomIdMap(change1.rootNodes.nodeChanges, detachId1);\n\n\t\tif (nodeId1 !== undefined) {\n\t\t\tpendingCompositions.nodeIdsToCompose.push([nodeId1, nodeId2]);\n\t\t} else {\n\t\t\tconst fieldId = getFieldsForCrossFieldKey(\n\t\t\t\tchange1,\n\t\t\t\t{ ...detachId1, target: CrossFieldTarget.Source },\n\t\t\t\t1,\n\t\t\t)[0];\n\n\t\t\tif (fieldId !== undefined) {\n\t\t\t\t// In this case, this node is attached in the input context of change1,\n\t\t\t\t// and is represented in detachFieldId.\n\t\t\t\tpendingCompositions.affectedBaseFields.set(\n\t\t\t\t\t[fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field],\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tassignRootChange(\n\t\t\t\t\tcomposedTable,\n\t\t\t\t\tcomposedNodeToParent,\n\t\t\t\t\tdetachId1,\n\t\t\t\t\tnodeId2,\n\t\t\t\t\tchange1.rootNodes.detachLocations.getFirst(detachId1, 1).value ??\n\t\t\t\t\t\tchange2.rootNodes.detachLocations.getFirst(detachId2, 1).value,\n\t\t\t\t\tMath.max(change1.rebaseVersion, change2.rebaseVersion) as RebaseVersion,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const outputDetachEntry of change1.rootNodes.outputDetachLocations.entries()) {\n\t\tcomposeOutputDetachLocation(\n\t\t\toutputDetachEntry.start,\n\t\t\toutputDetachEntry.length,\n\t\t\toutputDetachEntry.value,\n\t\t\tchange2,\n\t\t\tcomposedTable,\n\t\t);\n\t}\n\n\tfor (const entry of change2.rootNodes.outputDetachLocations.entries()) {\n\t\tcomposedTable.outputDetachLocations.set(entry.start, entry.length, entry.value);\n\t}\n\n\treturn composedTable;\n}\n\nfunction composeOutputDetachLocation(\n\toutputDetachId1: ChangeAtomId,\n\tcount: number,\n\tdetachLocation: FieldId,\n\tchange2: ModularChangeset,\n\tcomposedTable: RootNodeTable,\n): void {\n\tlet countToProcess = count;\n\tconst renameEntry = firstAttachIdFromDetachId(\n\t\tchange2.rootNodes,\n\t\toutputDetachId1,\n\t\tcountToProcess,\n\t);\n\tcountToProcess = renameEntry.length;\n\n\tconst attachEntry = getFirstAttachField(\n\t\tchange2.crossFieldKeys,\n\t\trenameEntry.value,\n\t\tcountToProcess,\n\t);\n\tcountToProcess = attachEntry.length;\n\n\tcomposedTable.outputDetachLocations.delete(outputDetachId1, countToProcess);\n\n\tif (attachEntry.value === undefined) {\n\t\t// We update the key for the detach location to the renamed ID of the root in the composed output context.\n\t\tcomposedTable.outputDetachLocations.set(renameEntry.value, countToProcess, detachLocation);\n\t} else {\n\t\t// These nodes are attached by `change2` and thus attached in the composed output context,\n\t\t// so there should be no output detach location.\n\t}\n\n\tconst countRemaining = count - countToProcess;\n\tif (countRemaining > 0) {\n\t\tcomposeOutputDetachLocation(\n\t\t\toffsetChangeAtomId(outputDetachId1, countToProcess),\n\t\t\tcountRemaining,\n\t\t\tdetachLocation,\n\t\t\tchange2,\n\t\t\tcomposedTable,\n\t\t);\n\t}\n}\n\nfunction composeRename(\n\tchange1: ModularChangeset,\n\tchange2: ModularChangeset,\n\tmergedTable: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tcount: number,\n\tmovedCrossFieldKeys: CrossFieldKeyTable,\n\tremovedCrossFieldKeys: CrossFieldRangeTable<boolean>,\n\tpendingCompositions: PendingCompositions,\n): void {\n\tlet countToProcess = count;\n\tconst detachEntry = getFirstDetachField(change1.crossFieldKeys, oldId, countToProcess);\n\tcountToProcess = detachEntry.length;\n\n\tif (detachEntry.value !== undefined) {\n\t\t// `change1` detached these nodes,\n\t\t// so we invalidate the detach location so that the detach's ID can be replaced with the new ID.\n\t\tpendingCompositions.affectedBaseFields.set(fieldIdKeyFromFieldId(detachEntry.value), true);\n\n\t\tif (!areEqualChangeAtomIds(oldId, newId)) {\n\t\t\t// `change1`'s detach will be replaced by `change2`'s detach, so we update the cross-field keys.\n\t\t\tremovedCrossFieldKeys.set(\n\t\t\t\t{ ...oldId, target: CrossFieldTarget.Source },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\tmovedCrossFieldKeys.set(\n\t\t\t{ ...newId, target: CrossFieldTarget.Source },\n\t\t\tcountToProcess,\n\t\t\tdetachEntry.value,\n\t\t);\n\t} else {\n\t\t// `change1` may also have a rename to `renameEntry.value`, in which case it must refer to a different node.\n\t\t// That node must have been attached by `change1` and detached by `change2`.\n\t\t// The final rename for that node will be created in `composeAttachDetach`.\n\t\t// We delete any such rename for now to avoid colliding with the rename currently being processed.\n\t\tdeleteNodeRenameTo(mergedTable, newId, countToProcess);\n\n\t\t// The nodes were detached before `change`, so we append this rename.\n\t\tappendNodeRename(\n\t\t\tmergedTable,\n\t\t\toldId,\n\t\t\tnewId,\n\t\t\tcountToProcess,\n\t\t\tchange1.rootNodes,\n\t\t\tchange2.rootNodes.detachLocations.getFirst(oldId, countToProcess).value,\n\t\t);\n\t}\n\n\tif (countToProcess < count) {\n\t\tcomposeRename(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t\tmergedTable,\n\t\t\toffsetChangeAtomId(oldId, countToProcess),\n\t\t\toffsetChangeAtomId(newId, countToProcess),\n\t\t\tcount - countToProcess,\n\t\t\tmovedCrossFieldKeys,\n\t\t\tremovedCrossFieldKeys,\n\t\t\tpendingCompositions,\n\t\t);\n\t}\n}\n\nexport function cloneRootTable(table: RootNodeTable): RootNodeTable {\n\treturn {\n\t\toldToNewId: table.oldToNewId.clone(),\n\t\tnewToOldId: table.newToOldId.clone(),\n\t\tnodeChanges: brand(table.nodeChanges.clone()),\n\t\tdetachLocations: table.detachLocations.clone(),\n\t\toutputDetachLocations: table.outputDetachLocations.clone(),\n\t};\n}\n\nfunction invertRootTable(change: ModularChangeset, isRollback: boolean): RootNodeTable {\n\tconst invertedRoots: RootNodeTable = newRootTable();\n\tfor (const [[revision, localId], nodeId] of change.rootNodes.nodeChanges.entries()) {\n\t\tconst detachId: ChangeAtomId = { revision, localId };\n\t\tconst renamedId = firstAttachIdFromDetachId(change.rootNodes, detachId, 1).value;\n\n\t\t// This checks whether `change` attaches this node.\n\t\t// If it does, the node is not detached in the input context of the inverse, and so should not be included in the root table.\n\t\tif (\n\t\t\tchange.crossFieldKeys.getFirst({ ...renamedId, target: CrossFieldTarget.Destination }, 1)\n\t\t\t\t.value === undefined\n\t\t) {\n\t\t\tassignRootChange(\n\t\t\t\tinvertedRoots,\n\t\t\t\tundefined,\n\t\t\t\trenamedId,\n\t\t\t\tnodeId,\n\t\t\t\tchange.rootNodes.detachLocations.getFirst(detachId, 1).value,\n\t\t\t\tchange.rebaseVersion,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (isRollback) {\n\t\t// We only invert renames of nodes which are not attached or detached by this changeset.\n\t\t// When we invert an attach we will create a detach which incorporates the rename.\n\t\tfor (const {\n\t\t\tstart: oldId,\n\t\t\tvalue: newId,\n\t\t\tlength,\n\t\t} of change.rootNodes.oldToNewId.entries()) {\n\t\t\tinvertRename(change, invertedRoots, oldId, newId, length);\n\t\t}\n\t}\n\n\treturn invertedRoots;\n}\n\nfunction invertRename(\n\tchange: ModularChangeset,\n\tinvertedRoots: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tlength: number,\n): void {\n\tfor (const detachEntry of doesChangeDetachNodes(change.crossFieldKeys, newId, length)) {\n\t\tassert(\n\t\t\t!detachEntry.value,\n\t\t\t\"A changeset should not have a rename and detach for the same node.\",\n\t\t);\n\t}\n\n\tlet countProcessed = length;\n\tconst attachEntry = getFirstAttachField(change.crossFieldKeys, newId, countProcessed);\n\tcountProcessed = attachEntry.length;\n\tif (attachEntry.value === undefined) {\n\t\tconst outputDetachEntry = change.rootNodes.outputDetachLocations.getFirst(\n\t\t\tnewId,\n\t\t\tcountProcessed,\n\t\t);\n\t\tcountProcessed = outputDetachEntry.length;\n\n\t\tconst inputDetachEntry = change.rootNodes.detachLocations.getFirst(oldId, countProcessed);\n\t\tcountProcessed = inputDetachEntry.length;\n\n\t\taddNodeRename(\n\t\t\tinvertedRoots,\n\t\t\tnewId,\n\t\t\toldId,\n\t\t\tcountProcessed,\n\t\t\toutputDetachEntry.value ?? inputDetachEntry.value,\n\t\t);\n\t}\n\n\tif (countProcessed < length) {\n\t\tinvertRename(\n\t\t\tchange,\n\t\t\tinvertedRoots,\n\t\t\toffsetChangeAtomId(oldId, countProcessed),\n\t\t\toffsetChangeAtomId(newId, countProcessed),\n\t\t\tlength - countProcessed,\n\t\t);\n\t}\n}\n\nfunction doesChangeAttachNodes(\n\ttable: CrossFieldKeyTable,\n\tid: ChangeAtomId,\n\tcount: number,\n): RangeQueryResultFragment<boolean>[] {\n\treturn table\n\t\t.getAll2({ ...id, target: CrossFieldTarget.Destination }, count)\n\t\t.map((entry) => ({ ...entry, value: entry.value !== undefined }));\n}\n\nfunction doesChangeDetachNodes(\n\ttable: CrossFieldKeyTable,\n\tid: ChangeAtomId,\n\tcount: number,\n): RangeQueryResultFragment<boolean>[] {\n\treturn table\n\t\t.getAll2({ ...id, target: CrossFieldTarget.Source }, count)\n\t\t.map((entry) => ({ ...entry, value: entry.value !== undefined }));\n}\n\nexport function getFirstDetachField(\n\ttable: CrossFieldKeyTable,\n\tid: ChangeAtomId,\n\tcount: number,\n): RangeQueryResult<FieldId | undefined> {\n\treturn table.getFirst({ target: CrossFieldTarget.Source, ...id }, count);\n}\n\nexport function getFirstAttachField(\n\ttable: CrossFieldKeyTable,\n\tid: ChangeAtomId,\n\tcount: number,\n): RangeQueryResult<FieldId | undefined> {\n\treturn table.getFirst({ target: CrossFieldTarget.Destination, ...id }, count);\n}\n\nexport function addNodeRename(\n\ttable: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tcount: number,\n\tdetachLocation: FieldId | undefined,\n): void {\n\tif (areEqualChangeAtomIds(oldId, newId)) {\n\t\treturn;\n\t}\n\n\tfor (const entry of table.oldToNewId.getAll2(oldId, count)) {\n\t\tassert(\n\t\t\tentry.value === undefined ||\n\t\t\t\tareEqualChangeAtomIds(entry.value, offsetChangeAtomId(newId, entry.offset)),\n\t\t\t\"Rename collision detected\",\n\t\t);\n\t}\n\n\tfor (const entry of table.newToOldId.getAll2(newId, count)) {\n\t\tassert(\n\t\t\tentry.value === undefined ||\n\t\t\t\tareEqualChangeAtomIds(entry.value, offsetChangeAtomId(oldId, entry.offset)),\n\t\t\t\"Rename collision detected\",\n\t\t);\n\t}\n\n\ttable.oldToNewId.set(oldId, count, newId);\n\ttable.newToOldId.set(newId, count, oldId);\n\n\tif (detachLocation !== undefined) {\n\t\ttable.detachLocations.set(oldId, count, detachLocation);\n\t}\n}\n\n/**\n * Deletes any renames from `id`.\n */\nfunction deleteNodeRenameFrom(roots: RootNodeTable, id: ChangeAtomId, count: number): void {\n\tfor (const entry of roots.oldToNewId.getAll(id, count)) {\n\t\tdeleteNodeRenameEntry(roots, entry.start, entry.value, entry.length);\n\t}\n}\n\n/**\n * Deletes any renames to `id`.\n */\nfunction deleteNodeRenameTo(roots: RootNodeTable, id: ChangeAtomId, count: number): void {\n\tfor (const entry of roots.newToOldId.getAll(id, count)) {\n\t\tdeleteNodeRenameEntry(roots, entry.value, entry.start, entry.length);\n\t}\n}\n\nfunction appendNodeRename(\n\tcomposedTable: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tcount: number,\n\tchange1Table: RootNodeTable,\n\tdetachLocation: FieldId | undefined,\n): void {\n\tlet countToProcess = count;\n\tconst rename1Entry = change1Table.newToOldId.getFirst(oldId, countToProcess);\n\tcountToProcess = rename1Entry.length;\n\n\tif (rename1Entry.value !== undefined) {\n\t\tdeleteNodeRenameFrom(composedTable, rename1Entry.value, countToProcess);\n\t}\n\n\taddNodeRename(\n\t\tcomposedTable,\n\t\trename1Entry.value ?? oldId,\n\t\tnewId,\n\t\tcountToProcess,\n\t\tdetachLocation,\n\t);\n\n\ttryRemoveDetachLocation(composedTable, newId, countToProcess);\n\n\tif (countToProcess < count) {\n\t\tconst countRemaining = count - countToProcess;\n\t\tappendNodeRename(\n\t\t\tcomposedTable,\n\t\t\toffsetChangeAtomId(oldId, countToProcess),\n\t\t\toffsetChangeAtomId(newId, countToProcess),\n\t\t\tcountRemaining,\n\t\t\tchange1Table,\n\t\t\tdetachLocation,\n\t\t);\n\t}\n}\n\nfunction tryRemoveDetachLocation(\n\troots: RootNodeTable,\n\trootId: ChangeAtomId,\n\tcount: number,\n): void {\n\tlet countProcessed = count;\n\tconst renameEntry = roots.oldToNewId.getFirst(rootId, countProcessed);\n\tcountProcessed = renameEntry.length;\n\n\tconst outputDetachEntry = roots.outputDetachLocations.getFirst(rootId, countProcessed);\n\tcountProcessed = outputDetachEntry.length;\n\n\tconst nodeChangeEntry = rangeQueryChangeAtomIdMap(roots.nodeChanges, rootId, countProcessed);\n\tcountProcessed = nodeChangeEntry.length;\n\n\tif (\n\t\tnodeChangeEntry.value === undefined &&\n\t\trenameEntry.value === undefined &&\n\t\toutputDetachEntry.value === undefined\n\t) {\n\t\troots.detachLocations.delete(rootId, countProcessed);\n\t}\n\n\tconst countRemaining = count - countProcessed;\n\tif (countRemaining > 0) {\n\t\ttryRemoveDetachLocation(roots, offsetChangeAtomId(rootId, countProcessed), countRemaining);\n\t}\n}\n\n/**\n * Deletes the entry renaming the ID range of length `count` from `oldId` to `newId`.\n * This function assumes that such an entry exists.\n */\nfunction deleteNodeRenameEntry(\n\troots: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tcount: number,\n): void {\n\troots.oldToNewId.delete(oldId, count);\n\troots.newToOldId.delete(newId, count);\n}\n\nfunction replaceRootTableRevision(\n\ttable: RootNodeTable,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): RootNodeTable {\n\tconst oldToNewId = table.oldToNewId.mapEntries(\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t);\n\n\tconst newToOldId = table.newToOldId.mapEntries(\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t);\n\n\tconst nodeChanges: ChangeAtomIdBTree<NodeId> = newTupleBTree(\n\t\t[...table.nodeChanges.entries()].map(([[revision, id], nodeId]) => [\n\t\t\t[oldRevisions.has(revision) ? newRevision : revision, id],\n\t\t\treplaceAtomRevisions(normalizeNodeId(nodeId, nodeAliases), oldRevisions, newRevision),\n\t\t]),\n\t);\n\n\tconst detachLocations = table.detachLocations.mapEntries(\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t\t(fieldId) =>\n\t\t\treplaceFieldIdRevision(\n\t\t\t\tnormalizeFieldId(fieldId, nodeAliases),\n\t\t\t\toldRevisions,\n\t\t\t\tnewRevision,\n\t\t\t),\n\t);\n\n\tconst outputDetachLocations = table.outputDetachLocations.mapEntries(\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t\t(fieldId) =>\n\t\t\treplaceFieldIdRevision(\n\t\t\t\tnormalizeFieldId(fieldId, nodeAliases),\n\t\t\t\toldRevisions,\n\t\t\t\tnewRevision,\n\t\t\t),\n\t);\n\n\treturn { oldToNewId, newToOldId, nodeChanges, detachLocations, outputDetachLocations };\n}\n\nfunction newDetachedEntryMap(): ChangeAtomIdRangeMap<DetachedNodeEntry> {\n\treturn new RangeMap(offsetChangeAtomId, subtractChangeAtomIds, offsetDetachedNodeEntry);\n}\n\nfunction offsetDetachedNodeEntry(entry: DetachedNodeEntry, count: number): DetachedNodeEntry {\n\tassert(\n\t\tcount <= 1 || entry.nodeChange === undefined,\n\t\t\"Cannot split an entry with a node change\",\n\t);\n\n\treturn entry.detachId !== undefined\n\t\t? { ...entry, detachId: offsetChangeAtomId(entry.detachId, count) }\n\t\t: entry;\n}\n\nfunction getFieldsWithRootMoves(\n\troots: RootNodeTable,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): TupleBTree<FieldIdKey, boolean> {\n\tconst fields: TupleBTree<FieldIdKey, boolean> = newTupleBTree();\n\tfor (const { start: rootId, value: fieldId, length } of roots.detachLocations.entries()) {\n\t\tlet isRootMoved = false;\n\t\tfor (const renameEntry of roots.oldToNewId.getAll2(rootId, length)) {\n\t\t\tif (renameEntry.value !== undefined) {\n\t\t\t\tisRootMoved = true;\n\t\t\t}\n\t\t}\n\n\t\tfor (const outputDetachEntry of roots.outputDetachLocations.getAll2(rootId, length)) {\n\t\t\tif (outputDetachEntry.value !== undefined) {\n\t\t\t\tisRootMoved = true;\n\t\t\t}\n\t\t}\n\n\t\tif (isRootMoved) {\n\t\t\tfields.set(fieldIdKeyFromFieldId(normalizeFieldId(fieldId, nodeAliases)), true);\n\t\t}\n\t}\n\n\treturn fields;\n}\n\nfunction getFieldToRootChanges(\n\troots: RootNodeTable,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): TupleBTree<FieldIdKey, ChangeAtomId[]> {\n\tconst fields: TupleBTree<FieldIdKey, ChangeAtomId[]> = newTupleBTree();\n\tfor (const rootIdKey of roots.nodeChanges.keys()) {\n\t\tconst rootId: ChangeAtomId = { revision: rootIdKey[0], localId: rootIdKey[1] };\n\t\tconst detachLocation = roots.detachLocations.getFirst(rootId, 1).value;\n\t\tif (detachLocation !== undefined) {\n\t\t\tconst fieldIdKey = fieldIdKeyFromFieldId(normalizeFieldId(detachLocation, nodeAliases));\n\t\t\tlet rootsInField = fields.get(fieldIdKey);\n\t\t\tif (rootsInField === undefined) {\n\t\t\t\trootsInField = [];\n\t\t\t\tfields.set(fieldIdKey, rootsInField);\n\t\t\t}\n\n\t\t\trootsInField.push(rootId);\n\t\t}\n\t}\n\n\treturn fields;\n}\n\nfunction muteRootChanges(roots: RootNodeTable): RootNodeTable {\n\treturn {\n\t\toldToNewId: newChangeAtomIdTransform(),\n\t\tnewToOldId: newChangeAtomIdTransform(),\n\t\tnodeChanges: brand(roots.nodeChanges.clone()),\n\t\tdetachLocations: roots.detachLocations.clone(),\n\t\toutputDetachLocations: newChangeAtomIdRangeMap(),\n\t};\n}\n"]}
1
+ {"version":3,"file":"modularChangeFamily.js","sourceRoot":"","sources":["../../../src/feature-libraries/modular-schema/modularChangeFamily.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, fail } from \"@fluidframework/core-utils/internal\";\nimport { BTree } from \"@tylerbu/sorted-btree-es6\";\n\nimport type { ICodecFamily } from \"../../codec/index.js\";\nimport {\n\ttype ChangeEncodingContext,\n\ttype ChangeFamily,\n\ttype ChangeFamilyEditor,\n\ttype ChangeRebaser,\n\ttype ChangesetLocalId,\n\ttype DeltaDetachedNodeBuild,\n\ttype DeltaDetachedNodeDestruction,\n\ttype DeltaDetachedNodeId,\n\ttype DeltaFieldChanges,\n\ttype DeltaFieldMap,\n\ttype DeltaRoot,\n\tEditBuilder,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\ttype RevisionInfo,\n\ttype RevisionMetadataSource,\n\ttype RevisionTag,\n\ttype TaggedChange,\n\tmakeDetachedNodeId,\n\treplaceAtomRevisions,\n\trevisionMetadataSourceFromInfo,\n\tareEqualChangeAtomIds,\n\ttype ChangeAtomId,\n\tareEqualChangeAtomIdOpts,\n\ttagChange,\n\tmakeAnonChange,\n\ttype DeltaDetachedNodeChanges,\n\ttype DeltaDetachedNodeRename,\n\tmapTaggedChange,\n\tnewChangeAtomIdRangeMap,\n\tnewChangeAtomIdTransform,\n\ttype ChangeAtomIdRangeMap,\n\toffsetChangeAtomId,\n\ttype NormalizedUpPath,\n\ttype NormalizedFieldUpPath,\n\tisDetachedUpPathRoot,\n\tsubtractChangeAtomIds,\n\tmakeChangeAtomId,\n} from \"../../core/index.js\";\nimport {\n\ttype IdAllocationState,\n\ttype IdAllocator,\n\ttype Mutable,\n\tbrand,\n\tidAllocatorFromMaxId,\n\tidAllocatorFromState,\n\ttype RangeQueryResult,\n\tgetOrCreate,\n\tnewTupleBTree,\n\tmergeTupleBTrees,\n\ttype TupleBTree,\n\tRangeMap,\n\tbalancedReduce,\n\ttype RangeQueryEntry,\n\ttype RangeQueryResultFragment,\n} from \"../../util/index.js\";\nimport type { TreeChunk } from \"../chunked-forest/index.js\";\n\nimport {\n\ttype ComposeNodeManager,\n\ttype CrossFieldMap,\n\tCrossFieldTarget,\n\ttype DetachedNodeEntry,\n\ttype InvertNodeManager,\n\ttype RebaseDetachedNodeEntry,\n\ttype RebaseNodeManager,\n\tsetInCrossFieldMap,\n} from \"./crossFieldQueries.js\";\nimport {\n\ttype FieldChangeHandler,\n\tNodeAttachState,\n\ttype RebaseRevisionMetadata,\n} from \"./fieldChangeHandler.js\";\nimport { convertGenericChange, genericFieldKind } from \"./genericFieldKind.js\";\nimport type { GenericChangeset } from \"./genericFieldKindTypes.js\";\nimport {\n\ttype ChangeAtomIdBTree,\n\ttype ChangeAtomIdKey,\n\ttype CrossFieldKey,\n\ttype CrossFieldKeyRange,\n\ttype CrossFieldKeyTable,\n\ttype CrossFieldRangeTable,\n\ttype FieldChange,\n\ttype FieldChangeMap,\n\ttype FieldChangeset,\n\ttype FieldId,\n\tgetFromChangeAtomIdMap,\n\ttype ModularChangeset,\n\tnewCrossFieldRangeTable,\n\ttype NodeChangeset,\n\ttype NodeId,\n\ttype NodeLocation,\n\trangeQueryChangeAtomIdMap,\n\ttype RebaseVersion,\n\ttype RootNodeTable,\n\tsetInChangeAtomIdMap,\n} from \"./modularChangeTypes.js\";\nimport type { FlexFieldKind } from \"./fieldKind.js\";\n\n/**\n * Implementation of ChangeFamily which delegates work in a given field to the appropriate FieldKind\n * as determined by the schema.\n */\nexport class ModularChangeFamily\n\timplements\n\t\tChangeFamily<ModularEditBuilder, ModularChangeset>,\n\t\tChangeRebaser<ModularChangeset>\n{\n\tpublic static readonly emptyChange: ModularChangeset = makeModularChangeset();\n\n\tpublic readonly fieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>;\n\n\tpublic constructor(\n\t\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n\t\tpublic readonly codecs: ICodecFamily<ModularChangeset, ChangeEncodingContext>,\n\t) {\n\t\tthis.fieldKinds = fieldKinds;\n\t}\n\n\tpublic get rebaser(): ChangeRebaser<ModularChangeset> {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Produces an equivalent list of `FieldChangeset`s that all target the same {@link FlexFieldKind}.\n\t * @param changes - The list of `FieldChange`s whose `FieldChangeset`s needs to be normalized.\n\t * @returns An object that contains both the equivalent list of `FieldChangeset`s that all\n\t * target the same {@link FlexFieldKind}, and the `FieldKind` that they target.\n\t * The returned `FieldChangeset`s may be a shallow copy of the input `FieldChange`s.\n\t */\n\tprivate normalizeFieldChanges(\n\t\tchange1: FieldChange,\n\t\tchange2: FieldChange,\n\t): {\n\t\tfieldKind: FieldKindIdentifier;\n\t\tchangeHandler: FieldChangeHandler<unknown>;\n\t\tchange1: FieldChangeset;\n\t\tchange2: FieldChangeset;\n\t} {\n\t\t// TODO: Handle the case where changes have conflicting field kinds\n\t\tconst kind =\n\t\t\tchange1.fieldKind !== genericFieldKind.identifier\n\t\t\t\t? change1.fieldKind\n\t\t\t\t: change2.fieldKind;\n\n\t\tif (kind === genericFieldKind.identifier) {\n\t\t\t// Both changes are generic\n\t\t\treturn {\n\t\t\t\tfieldKind: genericFieldKind.identifier,\n\t\t\t\tchangeHandler: genericFieldKind.changeHandler,\n\t\t\t\tchange1: change1.change,\n\t\t\t\tchange2: change2.change,\n\t\t\t};\n\t\t}\n\t\tconst fieldKind = getFieldKind(this.fieldKinds, kind);\n\t\tconst changeHandler = fieldKind.changeHandler;\n\t\tconst normalizedChange1 = this.normalizeFieldChange(change1, changeHandler);\n\t\tconst normalizedChange2 = this.normalizeFieldChange(change2, changeHandler);\n\t\treturn {\n\t\t\tfieldKind: kind,\n\t\t\tchangeHandler,\n\t\t\tchange1: normalizedChange1,\n\t\t\tchange2: normalizedChange2,\n\t\t};\n\t}\n\n\tprivate normalizeFieldChange<T>(\n\t\tfieldChange: FieldChange,\n\t\thandler: FieldChangeHandler<T>,\n\t): FieldChangeset {\n\t\tif (fieldChange.fieldKind !== genericFieldKind.identifier) {\n\t\t\treturn fieldChange.change;\n\t\t}\n\n\t\t// The cast is based on the `fieldKind` check above\n\t\tconst genericChange = fieldChange.change as unknown as GenericChangeset;\n\t\tconst convertedChange = convertGenericChange(genericChange, handler) as FieldChangeset;\n\n\t\treturn convertedChange;\n\t}\n\n\tpublic compose(changes: TaggedChange<ModularChangeset>[]): ModularChangeset {\n\t\tconst { maxId } = getRevInfoFromTaggedChanges(changes);\n\t\tconst idState: IdAllocationState = { maxId };\n\n\t\tconst pairwiseDelegate = (\n\t\t\tleft: ModularChangeset,\n\t\t\tright: ModularChangeset,\n\t\t): ModularChangeset => {\n\t\t\treturn this.composePair(left, right, idState);\n\t\t};\n\n\t\tconst innerChanges = changes.map((change) => change.change);\n\t\treturn balancedReduce(innerChanges, pairwiseDelegate, makeModularChangeset);\n\t}\n\n\tprivate composePair(\n\t\tchange1: ModularChangeset,\n\t\tchange2: ModularChangeset,\n\t\tidState: IdAllocationState,\n\t): ModularChangeset {\n\t\tconst revInfos = composeRevInfos(change1.revisions, change2.revisions);\n\n\t\tconst { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys, rootNodes } =\n\t\t\tthis.composeAllFields(change1, change2, revInfos, idState);\n\n\t\tconst { allBuilds, allDestroys, allRefreshers } = composeBuildsDestroysAndRefreshers(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t);\n\n\t\tconst composed = makeModularChangeset({\n\t\t\tfieldChanges,\n\t\t\tnodeChanges,\n\t\t\tnodeToParent,\n\t\t\tnodeAliases,\n\t\t\tcrossFieldKeys,\n\t\t\tmaxId: idState.maxId,\n\t\t\trevisions: revInfos,\n\t\t\trootNodes,\n\t\t\tbuilds: allBuilds,\n\t\t\tdestroys: allDestroys,\n\t\t\trefreshers: allRefreshers,\n\t\t});\n\n\t\t// XXX: This is an expensive assert which should be disabled before merging.\n\t\tthis.validateChangeset(composed);\n\t\treturn composed;\n\t}\n\n\tprivate composeAllFields(\n\t\tpotentiallyConflictedChange1: ModularChangeset,\n\t\tpotentiallyConflictedChange2: ModularChangeset,\n\t\trevInfos: RevisionInfo[],\n\t\tidState: IdAllocationState,\n\t): ModularChangesetContent {\n\t\t// Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.\n\t\t// This means that compose must preserve declarations (e.g., new cells) made by conflicted changes (so that we can rebase over the composition).\n\t\t// TODO: remove once AB#46104 is completed\n\t\tconst change1 = this.getEffectiveChange(potentiallyConflictedChange1);\n\t\tconst change2 = this.getEffectiveChange(potentiallyConflictedChange2);\n\n\t\tconst genId: IdAllocator = idAllocatorFromState(idState);\n\t\tconst revisionMetadata: RevisionMetadataSource = revisionMetadataSourceFromInfo(revInfos);\n\n\t\t// We merge nodeChanges, nodeToParent, and nodeAliases from the two changesets.\n\t\t// The merged tables will have correct entries for all nodes which are only referenced in one of the input changesets.\n\t\t// During composeFieldMaps and composeInvalidatedElements we will find all nodes referenced in both input changesets\n\t\t// and adjust these tables as necessary.\n\t\t// Note that when merging these tables we may encounter key collisions and will arbitrarily drop values in that case.\n\t\t// A collision for a node ID means that that node is referenced in both changesets\n\t\t// (since we assume that if two changesets use the same node ID they are referring to the same node),\n\t\t// therefore all collisions will be addressed when processing the intersection of the changesets.\n\t\tconst composedNodeChanges: ChangeAtomIdBTree<NodeChangeset> = brand(\n\t\t\tmergeTupleBTrees(change1.nodeChanges, change2.nodeChanges),\n\t\t);\n\n\t\tconst composedNodeToParent: ChangeAtomIdBTree<NodeLocation> = brand(\n\t\t\tmergeTupleBTrees(change1.nodeToParent, change2.nodeToParent),\n\t\t);\n\t\tconst composedNodeAliases: ChangeAtomIdBTree<NodeId> = brand(\n\t\t\tmergeTupleBTrees(change1.nodeAliases, change2.nodeAliases),\n\t\t);\n\n\t\tconst pendingCompositions: PendingCompositions = {\n\t\t\tnodeIdsToCompose: [],\n\t\t\taffectedBaseFields: newTupleBTree(),\n\t\t};\n\n\t\tconst movedCrossFieldKeys: CrossFieldKeyTable = newCrossFieldRangeTable();\n\t\tconst removedCrossFieldKeys: CrossFieldRangeTable<boolean> = newCrossFieldRangeTable();\n\n\t\tconst composedRoots = composeRootTables(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t\tcomposedNodeToParent,\n\t\t\tmovedCrossFieldKeys,\n\t\t\tremovedCrossFieldKeys,\n\t\t\tpendingCompositions,\n\t\t);\n\n\t\tconst crossFieldTable = newComposeTable(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t\tcomposedRoots,\n\t\t\tmovedCrossFieldKeys,\n\t\t\tremovedCrossFieldKeys,\n\t\t\tpendingCompositions,\n\t\t);\n\n\t\tconst composedFields = this.composeFieldMaps(\n\t\t\tchange1.fieldChanges,\n\t\t\tchange2.fieldChanges,\n\t\t\tundefined,\n\t\t\tgenId,\n\t\t\tcrossFieldTable,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tthis.composeInvalidatedElements(\n\t\t\tcrossFieldTable,\n\t\t\tcomposedFields,\n\t\t\tcomposedNodeChanges,\n\t\t\tcomposedNodeToParent,\n\t\t\tcomposedNodeAliases,\n\t\t\tgenId,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tfor (const entry of crossFieldTable.renamesToDelete.entries()) {\n\t\t\tdeleteNodeRenameFrom(crossFieldTable.composedRootNodes, entry.start, entry.length);\n\t\t}\n\n\t\tfor (const [nodeId, location] of crossFieldTable.movedNodeToParent.entries()) {\n\t\t\t// Moved nodes are from change2.\n\t\t\t// If there is a corresponding node in change1, then composedNodeToParent will already have the correct entry,\n\t\t\t// because the location of the node is the same in change1 and the composed change\n\t\t\t// (since they have the same input context).\n\t\t\tif (crossFieldTable.newToBaseNodeId.get(nodeId) === undefined) {\n\t\t\t\tcomposedNodeToParent.set(nodeId, location);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tfieldChanges: composedFields,\n\t\t\tnodeChanges: composedNodeChanges,\n\t\t\tnodeToParent: composedNodeToParent,\n\t\t\tnodeAliases: composedNodeAliases,\n\t\t\tcrossFieldKeys: composeCrossFieldKeyTables(\n\t\t\t\tchange1.crossFieldKeys,\n\t\t\t\tchange2.crossFieldKeys,\n\t\t\t\tcrossFieldTable.movedCrossFieldKeys,\n\t\t\t\tcrossFieldTable.removedCrossFieldKeys,\n\t\t\t),\n\t\t\trootNodes: composedRoots,\n\t\t};\n\t}\n\n\tprivate composeInvalidatedField(\n\t\tfieldChange: FieldChange,\n\t\tcrossFieldTable: ComposeTable,\n\t\tgenId: IdAllocator,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst context = crossFieldTable.fieldToContext.get(fieldChange);\n\t\tassert(context !== undefined, 0x8cc /* Should have context for every invalidated field */);\n\t\tconst { change1: fieldChange1, change2: fieldChange2, composedChange } = context;\n\n\t\tcrossFieldTable.pendingCompositions.affectedBaseFields.delete(\n\t\t\tfieldIdKeyFromFieldId(context.fieldId),\n\t\t);\n\n\t\tconst rebaser = getChangeHandler(this.fieldKinds, composedChange.fieldKind).rebaser;\n\t\tconst composeNodes = (child1: NodeId | undefined, child2: NodeId | undefined): NodeId => {\n\t\t\tif (child1 !== undefined && child2 !== undefined) {\n\t\t\t\taddNodesToCompose(crossFieldTable, child1, child2);\n\t\t\t}\n\n\t\t\treturn child1 ?? child2 ?? fail(0xb22 /* Should not compose two undefined nodes */);\n\t\t};\n\n\t\tconst amendedChange = rebaser.compose(\n\t\t\tfieldChange1,\n\t\t\tfieldChange2,\n\t\t\tcomposeNodes,\n\t\t\tgenId,\n\t\t\tnew ComposeNodeManagerI(crossFieldTable, context.fieldId, false),\n\t\t\trevisionMetadata,\n\t\t);\n\t\tcomposedChange.change = brand(amendedChange);\n\t}\n\n\t/**\n\t * Updates everything in the composed output which may no longer be valid.\n\t * This could be due to\n\t * - discovering that two node changesets refer to the same node (`nodeIdsToCompose`)\n\t * - a previously composed field being invalidated by a cross field effect (`invalidatedFields`)\n\t * - a field which was copied directly from an input changeset being invalidated by a cross field effect\n\t * (`affectedBaseFields`)\n\t *\n\t * Updating an element may invalidate further elements. This function runs until there is no more invalidation.\n\t */\n\tprivate composeInvalidatedElements(\n\t\ttable: ComposeTable,\n\t\tcomposedFields: FieldChangeMap,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tcomposedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst pending = table.pendingCompositions;\n\t\twhile (pending.nodeIdsToCompose.length > 0 || pending.affectedBaseFields.length > 0) {\n\t\t\tthis.processPendingNodeCompositions(\n\t\t\t\ttable,\n\t\t\t\tcomposedNodes,\n\t\t\t\tcomposedNodeToParent,\n\t\t\t\tnodeAliases,\n\t\t\t\tgenId,\n\t\t\t\tmetadata,\n\t\t\t);\n\n\t\t\tthis.composeAffectedFields(\n\t\t\t\ttable,\n\t\t\t\ttable.baseChange,\n\t\t\t\tpending.affectedBaseFields,\n\t\t\t\tcomposedFields,\n\t\t\t\tcomposedNodes,\n\t\t\t\tgenId,\n\t\t\t\tmetadata,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate processPendingNodeCompositions(\n\t\ttable: ComposeTable,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tcomposedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RevisionMetadataSource,\n\t): void {\n\t\t// Note that the call to `composeNodesById` can add entries to `crossFieldTable.nodeIdPairs`.\n\t\tfor (const [id1, id2] of table.pendingCompositions.nodeIdsToCompose) {\n\t\t\tthis.composeNodesById(\n\t\t\t\ttable.baseChange,\n\t\t\t\ttable.newChange,\n\t\t\t\tcomposedNodes,\n\t\t\t\tcomposedNodeToParent,\n\t\t\t\tnodeAliases,\n\t\t\t\tid1,\n\t\t\t\tid2,\n\t\t\t\tgenId,\n\t\t\t\ttable,\n\t\t\t\tmetadata,\n\t\t\t);\n\t\t}\n\n\t\ttable.pendingCompositions.nodeIdsToCompose.length = 0;\n\t}\n\n\t/**\n\t * Ensures that each field in `affectedFields` has been updated in the composition output.\n\t * Any field which has already been composed is ignored.\n\t * All other fields are optimistically assumed to not have any changes in the other input changeset.\n\t *\n\t * @param change - The changeset which contains the affected fields.\n\t * This should be one of the two changesets being composed.\n\t * @param areBaseFields - Whether the affected fields are part of the base changeset.\n\t * If not, they are assumed to be part of the new changeset.\n\t * @param affectedFields - The set of fields to process.\n\t */\n\tprivate composeAffectedFields(\n\t\ttable: ComposeTable,\n\t\tchange: ModularChangeset,\n\t\taffectedFields: BTree<FieldIdKey, true>,\n\t\tcomposedFields: FieldChangeMap,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst fieldsToProcess = affectedFields.clone();\n\t\taffectedFields.clear();\n\n\t\tfor (const fieldIdKey of fieldsToProcess.keys()) {\n\t\t\tconst fieldId = fieldIdFromFieldIdKey(fieldIdKey);\n\t\t\tconst fieldChange = fieldChangeFromId(change, fieldId);\n\n\t\t\tif (\n\t\t\t\ttable.fieldToContext.has(fieldChange) ||\n\t\t\t\ttable.newFieldToBaseField.has(fieldChange)\n\t\t\t) {\n\t\t\t\tthis.composeInvalidatedField(fieldChange, table, genId, metadata);\n\t\t\t} else {\n\t\t\t\tthis.composeFieldWithNoNewChange(\n\t\t\t\t\ttable,\n\t\t\t\t\tfieldChange,\n\t\t\t\t\tfieldId,\n\t\t\t\t\tcomposedFields,\n\t\t\t\t\tcomposedNodes,\n\t\t\t\t\tgenId,\n\t\t\t\t\tmetadata,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate composeFieldWithNoNewChange(\n\t\ttable: ComposeTable,\n\t\tbaseFieldChange: FieldChange,\n\t\tfieldId: FieldId,\n\t\tcomposedFields: FieldChangeMap,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst emptyChange = this.createEmptyFieldChange(baseFieldChange.fieldKind);\n\n\t\tconst composedField = this.composeFieldChanges(\n\t\t\tfieldId,\n\t\t\tbaseFieldChange,\n\t\t\temptyChange,\n\t\t\tgenId,\n\t\t\ttable,\n\t\t\tmetadata,\n\t\t);\n\n\t\tif (fieldId.nodeId === undefined) {\n\t\t\tcomposedFields.set(fieldId.field, composedField);\n\t\t\treturn;\n\t\t}\n\n\t\tconst nodeId = normalizeNodeId(\n\t\t\tgetFromChangeAtomIdMap(table.newToBaseNodeId, fieldId.nodeId) ?? fieldId.nodeId,\n\t\t\ttable.baseChange.nodeAliases,\n\t\t);\n\n\t\t// We clone the node changeset before mutating it, as it may be from one of the input changesets.\n\t\tconst nodeChangeset: Mutable<NodeChangeset> = cloneNodeChangeset(\n\t\t\tnodeChangeFromId(composedNodes, table.baseChange.nodeAliases, nodeId),\n\t\t);\n\t\tsetInChangeAtomIdMap(composedNodes, nodeId, nodeChangeset);\n\n\t\tif (nodeChangeset.fieldChanges === undefined) {\n\t\t\tnodeChangeset.fieldChanges = new Map();\n\t\t}\n\n\t\tnodeChangeset.fieldChanges.set(fieldId.field, composedField);\n\t}\n\n\tprivate composeFieldMaps(\n\t\tchange1: FieldChangeMap | undefined,\n\t\tchange2: FieldChangeMap | undefined,\n\t\tparentId: NodeId | undefined,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: ComposeTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): FieldChangeMap {\n\t\tconst composedFields: FieldChangeMap = new Map();\n\t\tif (change1 === undefined || change2 === undefined) {\n\t\t\treturn change1 ?? change2 ?? composedFields;\n\t\t}\n\n\t\tfor (const [field, fieldChange1] of change1) {\n\t\t\tconst fieldId: FieldId = { nodeId: parentId, field };\n\t\t\tconst fieldChange2 = change2.get(field);\n\n\t\t\tconst cachedComposedFieldChange =\n\t\t\t\tcrossFieldTable.fieldToContext.get(fieldChange1)?.composedChange;\n\n\t\t\tif (fieldChange2 === undefined && cachedComposedFieldChange !== undefined) {\n\t\t\t\t// This can happen if the field was previous processed in `composeFieldWithNoNewChange`.\n\t\t\t\t// If `change2` does not have a change for this field, then without this check we would\n\t\t\t\t// lose the composed field change and instead simply have `change1`'s change.\n\t\t\t\tcomposedFields.set(field, cachedComposedFieldChange);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst composedField =\n\t\t\t\tfieldChange2 !== undefined\n\t\t\t\t\t? this.composeFieldChanges(\n\t\t\t\t\t\t\tfieldId,\n\t\t\t\t\t\t\tfieldChange1,\n\t\t\t\t\t\t\tfieldChange2,\n\t\t\t\t\t\t\tgenId,\n\t\t\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\t\t\trevisionMetadata,\n\t\t\t\t\t\t)\n\t\t\t\t\t: fieldChange1;\n\n\t\t\tcomposedFields.set(field, composedField);\n\t\t}\n\n\t\tfor (const [field, fieldChange2] of change2) {\n\t\t\tif (!change1?.has(field)) {\n\t\t\t\tcomposedFields.set(field, fieldChange2);\n\t\t\t}\n\t\t}\n\n\t\treturn composedFields;\n\t}\n\n\t/**\n\t * Returns the composition of the two input fields.\n\t *\n\t * Any nodes in this field which were modified by both changesets\n\t * will be added to `crossFieldTable.pendingCompositions.nodeIdsToCompose`.\n\t *\n\t * Any fields which had cross-field information sent to them as part of this field composition\n\t * will be added to `affectedBaseFields` in `crossFieldTable.pendingCompositions`.\n\t *\n\t * Any composed `FieldChange` which is invalidated by new cross-field information will be added to `crossFieldTable.invalidatedFields`.\n\t */\n\tprivate composeFieldChanges(\n\t\tfieldId: FieldId,\n\t\tchange1: FieldChange,\n\t\tchange2: FieldChange,\n\t\tidAllocator: IdAllocator,\n\t\tcrossFieldTable: ComposeTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): FieldChange {\n\t\tconst {\n\t\t\tfieldKind,\n\t\t\tchangeHandler,\n\t\t\tchange1: change1Normalized,\n\t\t\tchange2: change2Normalized,\n\t\t} = this.normalizeFieldChanges(change1, change2);\n\n\t\tconst manager = new ComposeNodeManagerI(crossFieldTable, fieldId);\n\n\t\tconst composedChange = changeHandler.rebaser.compose(\n\t\t\tchange1Normalized,\n\t\t\tchange2Normalized,\n\t\t\t(child1, child2) => {\n\t\t\t\tif (child1 !== undefined && child2 !== undefined) {\n\t\t\t\t\taddNodesToCompose(crossFieldTable, child1, child2);\n\t\t\t\t}\n\t\t\t\treturn child1 ?? child2 ?? fail(0xb23 /* Should not compose two undefined nodes */);\n\t\t\t},\n\t\t\tidAllocator,\n\t\t\tmanager,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tconst composedField: FieldChange = {\n\t\t\tfieldKind,\n\t\t\tchange: brand(composedChange),\n\t\t};\n\n\t\tcrossFieldTable.fieldToContext.set(change1, {\n\t\t\tfieldId,\n\t\t\tchange1: change1Normalized,\n\t\t\tchange2: change2Normalized,\n\t\t\tcomposedChange: composedField,\n\t\t});\n\n\t\tcrossFieldTable.newFieldToBaseField.set(change2, change1);\n\t\treturn composedField;\n\t}\n\n\tprivate composeNodesById(\n\t\tchange1: ModularChangeset,\n\t\tchange2: ModularChangeset,\n\t\tcomposedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tcomposedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\tcomposedAliases: ChangeAtomIdBTree<NodeId>,\n\t\tid1: NodeId,\n\t\tid2: NodeId,\n\t\tidAllocator: IdAllocator,\n\t\tcrossFieldTable: ComposeTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): void {\n\t\tconst nodeChangeset1 = nodeChangeFromId(change1.nodeChanges, change1.nodeAliases, id1);\n\t\tconst nodeChangeset2 = nodeChangeFromId(change2.nodeChanges, change2.nodeAliases, id2);\n\t\tconst composedNodeChangeset = this.composeNodeChanges(\n\t\t\tid1,\n\t\t\tnodeChangeset1,\n\t\t\tnodeChangeset2,\n\t\t\tidAllocator,\n\t\t\tcrossFieldTable,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tsetInChangeAtomIdMap(composedNodes, id1, composedNodeChangeset);\n\n\t\tif (!areEqualChangeAtomIds(id1, id2)) {\n\t\t\tcomposedNodes.delete([id2.revision, id2.localId]);\n\t\t\tcomposedNodeToParent.delete([id2.revision, id2.localId]);\n\t\t\tsetInChangeAtomIdMap(composedAliases, id2, id1);\n\n\t\t\t// We need to delete id1 to avoid forming a cycle in case id1 already had an alias.\n\t\t\tcomposedAliases.delete([id1.revision, id1.localId]);\n\t\t}\n\t}\n\n\tprivate composeNodeChanges(\n\t\tnodeId: NodeId,\n\t\tchange1: NodeChangeset,\n\t\tchange2: NodeChangeset,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: ComposeTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): NodeChangeset {\n\t\t// WARNING: this composition logic assumes that we never make compositions of the following form:\n\t\t// change1: a changeset that impact the existence of a node\n\t\t// change2: a node-exists constraint on that node.\n\t\t// This is currently enforced by the fact that constraints which apply to the input context are included first in the composition.\n\t\t// If that weren't the case, we would need to rebase the status of the constraint backward over the changes from change1.\n\t\tconst nodeExistsConstraint = change1.nodeExistsConstraint ?? change2.nodeExistsConstraint;\n\n\t\t// WARNING: this composition logic assumes that we never make compositions of the following form:\n\t\t// change1: a node-exists-on-revert constraint on a node\n\t\t// change2: a changeset that impacts the existence of that node\n\t\t// This is currently enforced by the fact that constraints which apply to the revert are included last in the composition.\n\t\t// If that weren't the case, we would need to rebase the status of the constraint forward over the changes from change2.\n\t\tconst nodeExistsConstraintOnRevert =\n\t\t\tchange1.nodeExistsConstraintOnRevert ?? change2.nodeExistsConstraintOnRevert;\n\n\t\tconst composedFieldChanges = this.composeFieldMaps(\n\t\t\tchange1.fieldChanges,\n\t\t\tchange2.fieldChanges,\n\t\t\tnodeId,\n\t\t\tgenId,\n\t\t\tcrossFieldTable,\n\t\t\trevisionMetadata,\n\t\t);\n\n\t\tconst composedNodeChange: Mutable<NodeChangeset> = {};\n\n\t\tif (composedFieldChanges.size > 0) {\n\t\t\tcomposedNodeChange.fieldChanges = composedFieldChanges;\n\t\t}\n\n\t\tif (nodeExistsConstraint !== undefined) {\n\t\t\tcomposedNodeChange.nodeExistsConstraint = nodeExistsConstraint;\n\t\t}\n\n\t\tif (nodeExistsConstraintOnRevert !== undefined) {\n\t\t\tcomposedNodeChange.nodeExistsConstraintOnRevert = nodeExistsConstraintOnRevert;\n\t\t}\n\n\t\treturn composedNodeChange;\n\t}\n\n\t/**\n\t * @param change - The change to invert.\n\t * @param isRollback - Whether the inverted change is meant to rollback a change on a branch as is the case when\n\t * @param revisionForInvert - The revision for the invert changeset.\n\t * performing a sandwich rebase.\n\t */\n\tpublic invert(\n\t\tchange: TaggedChange<ModularChangeset>,\n\t\tisRollback: boolean,\n\t\trevisionForInvert: RevisionTag,\n\t): ModularChangeset {\n\t\t// Rollback changesets destroy the nodes created by the change being rolled back.\n\t\tconst destroys = isRollback ? invertBuilds(change.change.builds) : undefined;\n\n\t\t// Destroys only occur in rollback changesets, which are never inverted.\n\t\tassert(\n\t\t\tchange.change.destroys === undefined,\n\t\t\t0x89a /* Unexpected destroys in change to invert */,\n\t\t);\n\n\t\tconst revInfos: RevisionInfo[] = isRollback\n\t\t\t? [{ revision: revisionForInvert, rollbackOf: change.revision }]\n\t\t\t: [{ revision: revisionForInvert }];\n\n\t\tif (hasConflicts(change.change)) {\n\t\t\treturn makeModularChangeset({\n\t\t\t\tmaxId: change.change.maxId as number,\n\t\t\t\trevisions: revInfos,\n\t\t\t\tdestroys,\n\t\t\t});\n\t\t}\n\n\t\tconst genId: IdAllocator = idAllocatorFromMaxId(change.change.maxId ?? -1);\n\n\t\tconst crossFieldTable: InvertTable = {\n\t\t\tchange: change.change,\n\t\t\tentries: newChangeAtomIdRangeMap(),\n\t\t\toriginalFieldToContext: new Map(),\n\t\t\tinvertRevision: revisionForInvert,\n\t\t\tinvertedNodeToParent: brand(change.change.nodeToParent.clone()),\n\t\t\tinvalidatedFields: new Set(),\n\t\t\tinvertedRoots: invertRootTable(change.change, isRollback),\n\t\t\tattachToDetachId: newChangeAtomIdTransform(),\n\t\t};\n\t\tconst { revInfos: oldRevInfos } = getRevInfoFromTaggedChanges([change]);\n\t\tconst revisionMetadata = revisionMetadataSourceFromInfo(oldRevInfos);\n\n\t\tconst invertedFields = this.invertFieldMap(\n\t\t\tchange.change.fieldChanges,\n\t\t\tundefined,\n\t\t\tisRollback,\n\t\t\tgenId,\n\t\t\tcrossFieldTable,\n\t\t\trevisionMetadata,\n\t\t\trevisionForInvert,\n\t\t);\n\n\t\tconst invertedNodes: ChangeAtomIdBTree<NodeChangeset> = newTupleBTree();\n\t\tchange.change.nodeChanges.forEachPair(([revision, localId], nodeChangeset) => {\n\t\t\tinvertedNodes.set(\n\t\t\t\t[revision, localId],\n\t\t\t\tthis.invertNodeChange(\n\t\t\t\t\tnodeChangeset,\n\t\t\t\t\t{ revision, localId },\n\t\t\t\t\tisRollback,\n\t\t\t\t\tgenId,\n\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\trevisionMetadata,\n\t\t\t\t\trevisionForInvert,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\n\t\tif (crossFieldTable.invalidatedFields.size > 0) {\n\t\t\tconst fieldsToUpdate = crossFieldTable.invalidatedFields;\n\t\t\tcrossFieldTable.invalidatedFields = new Set();\n\t\t\tfor (const fieldChange of fieldsToUpdate) {\n\t\t\t\tconst originalFieldChange = fieldChange.change;\n\t\t\t\tconst context = crossFieldTable.originalFieldToContext.get(fieldChange);\n\t\t\t\tassert(\n\t\t\t\t\tcontext !== undefined,\n\t\t\t\t\t0x851 /* Should have context for every invalidated field */,\n\t\t\t\t);\n\t\t\t\tconst { invertedField } = context;\n\n\t\t\t\tconst amendedChange = getChangeHandler(\n\t\t\t\t\tthis.fieldKinds,\n\t\t\t\t\tfieldChange.fieldKind,\n\t\t\t\t).rebaser.invert(\n\t\t\t\t\toriginalFieldChange,\n\t\t\t\t\tisRollback,\n\t\t\t\t\tgenId,\n\t\t\t\t\trevisionForInvert,\n\t\t\t\t\tnew InvertNodeManagerI(crossFieldTable, context.fieldId),\n\t\t\t\t\trevisionMetadata,\n\t\t\t\t);\n\t\t\t\tinvertedField.change = brand(amendedChange);\n\t\t\t}\n\t\t}\n\n\t\tconst crossFieldKeys = this.makeCrossFieldKeyTable(invertedFields, invertedNodes);\n\n\t\tthis.processInvertRenames(crossFieldTable);\n\n\t\treturn makeModularChangeset({\n\t\t\tfieldChanges: invertedFields,\n\t\t\tnodeChanges: invertedNodes,\n\t\t\tnodeToParent: crossFieldTable.invertedNodeToParent,\n\t\t\trootNodes: crossFieldTable.invertedRoots,\n\t\t\tnodeAliases: change.change.nodeAliases,\n\t\t\tcrossFieldKeys,\n\t\t\tmaxId: genId.getMaxId(),\n\t\t\trevisions: revInfos,\n\t\t\tconstraintViolationCount: change.change.constraintViolationCountOnRevert,\n\t\t\tconstraintViolationCountOnRevert: change.change.constraintViolationCount,\n\t\t\tdestroys,\n\t\t});\n\t}\n\n\tprivate invertFieldMap(\n\t\tchanges: FieldChangeMap,\n\t\tparentId: NodeId | undefined,\n\t\tisRollback: boolean,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: InvertTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t\trevisionForInvert: RevisionTag,\n\t): FieldChangeMap {\n\t\tconst invertedFields: FieldChangeMap = new Map();\n\n\t\tfor (const [field, fieldChange] of changes) {\n\t\t\tconst fieldId = { nodeId: parentId, field };\n\t\t\tconst manager = new InvertNodeManagerI(crossFieldTable, fieldId);\n\t\t\tconst invertedChange = getChangeHandler(\n\t\t\t\tthis.fieldKinds,\n\t\t\t\tfieldChange.fieldKind,\n\t\t\t).rebaser.invert(\n\t\t\t\tfieldChange.change,\n\t\t\t\tisRollback,\n\t\t\t\tgenId,\n\t\t\t\trevisionForInvert,\n\t\t\t\tmanager,\n\t\t\t\trevisionMetadata,\n\t\t\t);\n\n\t\t\tconst invertedFieldChange: FieldChange = {\n\t\t\t\t...fieldChange,\n\t\t\t\tchange: brand(invertedChange),\n\t\t\t};\n\t\t\tinvertedFields.set(field, invertedFieldChange);\n\n\t\t\tcrossFieldTable.originalFieldToContext.set(fieldChange, {\n\t\t\t\tfieldId,\n\t\t\t\tinvertedField: invertedFieldChange,\n\t\t\t});\n\t\t}\n\n\t\treturn invertedFields;\n\t}\n\n\tprivate invertNodeChange(\n\t\tchange: NodeChangeset,\n\t\tid: NodeId,\n\t\tisRollback: boolean,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: InvertTable,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t\trevisionForInvert: RevisionTag,\n\t): NodeChangeset {\n\t\tconst inverse: Mutable<NodeChangeset> = {};\n\n\t\t// If the node has a constraint, it should be inverted to a node-exist-on-revert constraint. This ensure that if\n\t\t// the inverse is inverted again, the original input constraint will be restored.\n\t\tif (change.nodeExistsConstraint !== undefined) {\n\t\t\tinverse.nodeExistsConstraintOnRevert = change.nodeExistsConstraint;\n\t\t}\n\n\t\t// The node-exist-on-revert constraint of a node is the constraint that should apply when the a change is reverted.\n\t\t// So, it should become the constraint in the inverse. If this constraint is violated when applying the inverse,\n\t\t// it will be discarded.\n\t\tif (change.nodeExistsConstraintOnRevert !== undefined) {\n\t\t\tinverse.nodeExistsConstraint = change.nodeExistsConstraintOnRevert;\n\t\t}\n\n\t\tif (change.fieldChanges !== undefined) {\n\t\t\tinverse.fieldChanges = this.invertFieldMap(\n\t\t\t\tchange.fieldChanges,\n\t\t\t\tid,\n\t\t\t\tisRollback,\n\t\t\t\tgenId,\n\t\t\t\tcrossFieldTable,\n\t\t\t\trevisionMetadata,\n\t\t\t\trevisionForInvert,\n\t\t\t);\n\t\t}\n\n\t\treturn inverse;\n\t}\n\n\tprivate processInvertRenames(table: InvertTable): void {\n\t\tfor (const {\n\t\t\tstart: newAttachId,\n\t\t\tvalue: originalDetachId,\n\t\t\tlength,\n\t\t} of table.attachToDetachId.entries()) {\n\t\t\t// Note that the detach location is already set in `invertDetach`.\n\t\t\taddNodeRename(table.invertedRoots, originalDetachId, newAttachId, length, undefined);\n\t\t}\n\t}\n\n\tpublic rebase(\n\t\ttaggedChange: TaggedChange<ModularChangeset>,\n\t\tpotentiallyConflictedOver: TaggedChange<ModularChangeset>,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): ModularChangeset {\n\t\t// Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.\n\t\t// This means that we must rebase over a muted version of the conflicted changeset.\n\t\t// That is, a version that includes its declarations (e.g., new cells) but not its changes.\n\t\t// TODO: remove once AB#46104 is completed\n\t\tconst over = mapTaggedChange(\n\t\t\tpotentiallyConflictedOver,\n\t\t\tthis.getEffectiveChange(potentiallyConflictedOver.change),\n\t\t);\n\n\t\tconst change = taggedChange.change;\n\t\tconst maxId = Math.max(change.maxId ?? -1, over.change.maxId ?? -1);\n\t\tconst idState: IdAllocationState = { maxId };\n\t\tconst genId: IdAllocator = idAllocatorFromState(idState);\n\n\t\tconst affectedBaseFields: TupleBTree<FieldIdKey, boolean> = newTupleBTree();\n\t\tconst nodesToRebase: [newChangeset: NodeId, baseChangeset: NodeId][] = [];\n\n\t\tconst rebasedNodeToParent: ChangeAtomIdBTree<NodeLocation> = brand(\n\t\t\tchange.nodeToParent.clone(),\n\t\t);\n\n\t\tconst rebaseVersion = Math.max(\n\t\t\tchange.rebaseVersion,\n\t\t\tover.change.rebaseVersion,\n\t\t) as RebaseVersion;\n\n\t\tconst rebasedRootNodes = rebaseRoots(\n\t\t\tchange,\n\t\t\tover.change,\n\t\t\taffectedBaseFields,\n\t\t\tnodesToRebase,\n\t\t\trebasedNodeToParent,\n\t\t\trebaseVersion,\n\t\t);\n\t\tconst crossFieldTable: RebaseTable = {\n\t\t\trebaseVersion,\n\t\t\tentries: newDetachedEntryMap(),\n\t\t\tnewChange: change,\n\t\t\tbaseChange: over.change,\n\t\t\tbaseFieldToContext: new Map(),\n\t\t\tbaseRoots: over.change.rootNodes,\n\t\t\trebasedRootNodes,\n\t\t\tbaseToRebasedNodeId: newTupleBTree(),\n\t\t\trebasedFields: new Set(),\n\t\t\trebasedNodeToParent,\n\t\t\trebasedDetachLocations: newChangeAtomIdRangeMap(),\n\t\t\tmovedDetaches: newChangeAtomIdRangeMap(),\n\t\t\tnodeIdPairs: [],\n\t\t\taffectedBaseFields,\n\t\t\tfieldsWithUnattachedChild: new Set(),\n\t\t};\n\n\t\tconst getBaseRevisions = (): RevisionTag[] =>\n\t\t\trevisionInfoFromTaggedChange(over).map((info) => info.revision);\n\n\t\tconst rebaseMetadata: RebaseRevisionMetadata = {\n\t\t\t...revisionMetadata,\n\t\t\tgetRevisionToRebase: () => taggedChange.revision,\n\t\t\tgetBaseRevisions,\n\t\t};\n\n\t\tconst rebasedNodes: ChangeAtomIdBTree<NodeChangeset> = brand(change.nodeChanges.clone());\n\n\t\tconst rebasedFields = this.rebaseIntersectingFields(\n\t\t\tnodesToRebase,\n\t\t\tcrossFieldTable,\n\t\t\trebasedNodes,\n\t\t\tgenId,\n\t\t\trebaseMetadata,\n\t\t);\n\n\t\tthis.rebaseInvalidatedFields(\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\tcrossFieldTable,\n\t\t\trebaseMetadata,\n\t\t\tgenId,\n\t\t);\n\n\t\tfixupRebasedDetachLocations(crossFieldTable);\n\n\t\tconst constraintState = newConstraintState(change.constraintViolationCount ?? 0);\n\t\tconst revertConstraintState = newConstraintState(\n\t\t\tchange.constraintViolationCountOnRevert ?? 0,\n\t\t);\n\n\t\tthis.updateConstraints(\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\trebasedRootNodes,\n\t\t\tconstraintState,\n\t\t\trevertConstraintState,\n\t\t);\n\n\t\tconst fieldsWithRootMoves = getFieldsWithRootMoves(\n\t\t\tcrossFieldTable.rebasedRootNodes,\n\t\t\tchange.nodeAliases,\n\t\t);\n\n\t\tconst fieldToRootChanges = getFieldToRootChanges(\n\t\t\tcrossFieldTable.rebasedRootNodes,\n\t\t\tchange.nodeAliases,\n\t\t);\n\n\t\tconst rebased = makeModularChangeset({\n\t\t\tfieldChanges: this.pruneFieldMap(\n\t\t\t\trebasedFields,\n\t\t\t\tundefined,\n\t\t\t\trebasedNodes,\n\t\t\t\tcrossFieldTable.rebasedNodeToParent,\n\t\t\t\tchange.nodeAliases,\n\t\t\t\tcrossFieldTable.rebasedRootNodes,\n\t\t\t\tfieldsWithRootMoves,\n\t\t\t\tfieldToRootChanges,\n\t\t\t),\n\t\t\tnodeChanges: rebasedNodes,\n\t\t\tnodeToParent: crossFieldTable.rebasedNodeToParent,\n\t\t\trootNodes: this.pruneRoots(\n\t\t\t\tcrossFieldTable.rebasedRootNodes,\n\t\t\t\trebasedNodes,\n\t\t\t\tcrossFieldTable.rebasedNodeToParent,\n\t\t\t\tchange.nodeAliases,\n\t\t\t\tfieldsWithRootMoves,\n\t\t\t\tfieldToRootChanges,\n\t\t\t),\n\t\t\t// TODO: Do we need to include aliases for node changesets added during rebasing?\n\t\t\tnodeAliases: change.nodeAliases,\n\t\t\tcrossFieldKeys: rebaseCrossFieldKeys(\n\t\t\t\tchange.crossFieldKeys,\n\t\t\t\tcrossFieldTable.movedDetaches,\n\t\t\t\tcrossFieldTable.rebasedDetachLocations,\n\t\t\t),\n\t\t\tmaxId: idState.maxId,\n\t\t\trevisions: change.revisions,\n\t\t\tconstraintViolationCount: constraintState.violationCount,\n\t\t\tconstraintViolationCountOnRevert: revertConstraintState.violationCount,\n\t\t\tbuilds: change.builds,\n\t\t\tdestroys: change.destroys,\n\t\t\trefreshers: change.refreshers,\n\t\t\trebaseVersion,\n\t\t});\n\n\t\t// XXX: This is an expensive assert which should be disabled before merging.\n\t\tthis.validateChangeset(rebased);\n\t\treturn rebased;\n\t}\n\n\t// This performs a first pass on all fields which have both new and base changes.\n\t// TODO: Can we also handle additional passes in this method?\n\tprivate rebaseIntersectingFields(\n\t\trootChanges: [newChangeset: NodeId, baseChangeset: NodeId][],\n\t\tcrossFieldTable: RebaseTable,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RebaseRevisionMetadata,\n\t): FieldChangeMap {\n\t\tconst change = crossFieldTable.newChange;\n\t\tconst baseChange = crossFieldTable.baseChange;\n\t\tconst rebasedFields = this.rebaseFieldMap(\n\t\t\tchange.fieldChanges,\n\t\t\tbaseChange.fieldChanges,\n\t\t\tundefined,\n\t\t\tgenId,\n\t\t\tcrossFieldTable,\n\t\t\tmetadata,\n\t\t);\n\n\t\tfor (const [newChildChange, baseChildChange] of rootChanges) {\n\t\t\tconst rebasedNode = this.rebaseNodeChange(\n\t\t\t\tnewChildChange,\n\t\t\t\tbaseChildChange,\n\t\t\t\tgenId,\n\t\t\t\tcrossFieldTable,\n\t\t\t\tmetadata,\n\t\t\t);\n\n\t\t\tsetInChangeAtomIdMap(rebasedNodes, newChildChange, rebasedNode);\n\t\t}\n\n\t\t// This loop processes all fields which have both base and new changes.\n\t\t// Note that the call to `rebaseNodeChange` can add entries to `crossFieldTable.nodeIdPairs`.\n\t\tfor (const [newId, baseId, _attachState] of crossFieldTable.nodeIdPairs) {\n\t\t\tconst rebasedNode = this.rebaseNodeChange(\n\t\t\t\tnewId,\n\t\t\t\tbaseId,\n\t\t\t\tgenId,\n\t\t\t\tcrossFieldTable,\n\t\t\t\tmetadata,\n\t\t\t);\n\n\t\t\tsetInChangeAtomIdMap(rebasedNodes, newId, rebasedNode);\n\t\t}\n\n\t\treturn rebasedFields;\n\t}\n\n\tprivate rebaseFieldWithoutNewChanges(\n\t\tbaseFieldChange: FieldChange,\n\t\tbaseFieldId: FieldId,\n\t\tcrossFieldTable: RebaseTable,\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tgenId: IdAllocator,\n\t\tmetadata: RebaseRevisionMetadata,\n\n\t\t/**\n\t\t * The ID of a node in `baseFieldChange` which should be included in the rebased field change.\n\t\t */\n\t\tbaseNodeId?: NodeId,\n\t): void {\n\t\t// This field has no changes in the new changeset, otherwise it would have been added to\n\t\t// `crossFieldTable.baseFieldToContext` when processing fields with both base and new changes.\n\t\tconst rebaseChild = (\n\t\t\tchild: NodeId | undefined,\n\t\t\tbaseChild: NodeId | undefined,\n\t\t\tstateChange: NodeAttachState | undefined,\n\t\t): NodeId | undefined => {\n\t\t\tassert(child === undefined, 0x9c3 /* There should be no new changes in this field */);\n\t\t\tif (baseChild === undefined || baseNodeId === undefined) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn areEqualChangeAtomIds(\n\t\t\t\tnormalizeNodeId(baseChild, crossFieldTable.baseChange.nodeAliases),\n\t\t\t\tbaseNodeId,\n\t\t\t)\n\t\t\t\t? baseNodeId\n\t\t\t\t: undefined;\n\t\t};\n\n\t\tconst handler = getChangeHandler(this.fieldKinds, baseFieldChange.fieldKind);\n\t\tconst fieldChange: FieldChange = {\n\t\t\t...baseFieldChange,\n\t\t\tchange: brand(handler.createEmpty()),\n\t\t};\n\n\t\tconst rebasedNodeId =\n\t\t\tbaseFieldId.nodeId !== undefined\n\t\t\t\t? rebasedNodeIdFromBaseNodeId(crossFieldTable, baseFieldId.nodeId)\n\t\t\t\t: undefined;\n\n\t\tconst fieldId: FieldId = { nodeId: rebasedNodeId, field: baseFieldId.field };\n\n\t\tconst rebasedField: unknown = handler.rebaser.rebase(\n\t\t\tfieldChange.change,\n\t\t\tbaseFieldChange.change,\n\t\t\trebaseChild,\n\t\t\tgenId,\n\t\t\tnew RebaseNodeManagerI(crossFieldTable, fieldId),\n\t\t\tmetadata,\n\t\t\tcrossFieldTable.rebaseVersion,\n\t\t);\n\n\t\tconst rebasedFieldChange: FieldChange = {\n\t\t\t...baseFieldChange,\n\t\t\tchange: brand(rebasedField),\n\t\t};\n\n\t\tconst context: RebaseFieldContext = {\n\t\t\tnewChange: fieldChange,\n\t\t\tbaseChange: baseFieldChange,\n\t\t\trebasedChange: rebasedFieldChange,\n\t\t\tfieldId,\n\t\t\tbaseNodeIds: newTupleBTree(),\n\t\t};\n\n\t\tif (baseNodeId !== undefined) {\n\t\t\tsetInChangeAtomIdMap(context.baseNodeIds, baseNodeId, true);\n\t\t}\n\n\t\tcrossFieldTable.baseFieldToContext.set(baseFieldChange, context);\n\n\t\tcrossFieldTable.rebasedFields.add(rebasedFieldChange);\n\n\t\tthis.attachRebasedField(\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\tcrossFieldTable,\n\t\t\trebasedFieldChange,\n\t\t\tfieldId,\n\t\t\tgenId,\n\t\t\tmetadata,\n\t\t);\n\t}\n\n\tprivate rebaseInvalidatedFields(\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tcrossFieldTable: RebaseTable,\n\t\trebaseMetadata: RebaseRevisionMetadata,\n\t\tgenId: IdAllocator,\n\t): void {\n\t\twhile (crossFieldTable.affectedBaseFields.size > 0) {\n\t\t\tconst baseFields = crossFieldTable.affectedBaseFields.clone();\n\t\t\tcrossFieldTable.affectedBaseFields.clear();\n\n\t\t\tfor (const baseFieldIdKey of baseFields.keys()) {\n\t\t\t\tconst baseFieldId = normalizeFieldId(\n\t\t\t\t\tfieldIdFromFieldIdKey(baseFieldIdKey),\n\t\t\t\t\tcrossFieldTable.baseChange.nodeAliases,\n\t\t\t\t);\n\n\t\t\t\tconst baseField = fieldChangeFromId(crossFieldTable.baseChange, baseFieldId);\n\n\t\t\t\tassert(\n\t\t\t\t\tbaseField !== undefined,\n\t\t\t\t\t0x9c2 /* Cross field key registered for empty field */,\n\t\t\t\t);\n\n\t\t\t\tconst context = crossFieldTable.baseFieldToContext.get(baseField);\n\t\t\t\tif (context === undefined) {\n\t\t\t\t\tthis.rebaseFieldWithoutNewChanges(\n\t\t\t\t\t\tbaseField,\n\t\t\t\t\t\tbaseFieldId,\n\t\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\t\trebasedFields,\n\t\t\t\t\t\trebasedNodes,\n\t\t\t\t\t\tgenId,\n\t\t\t\t\t\trebaseMetadata,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.rebaseInvalidatedField(\n\t\t\t\t\t\tbaseField,\n\t\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\trebaseMetadata,\n\t\t\t\t\t\tgenId,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rebaseInvalidatedField(\n\t\tbaseField: FieldChange,\n\t\tcrossFieldTable: RebaseTable,\n\t\tcontext: RebaseFieldContext,\n\t\trebaseMetadata: RebaseRevisionMetadata,\n\t\tgenId: IdAllocator,\n\t): void {\n\t\tconst {\n\t\t\tchangeHandler,\n\t\t\tchange1: fieldChangeset,\n\t\t\tchange2: baseChangeset,\n\t\t} = this.normalizeFieldChanges(context.newChange, context.baseChange);\n\n\t\tconst rebaseChild = (\n\t\t\tcurr: NodeId | undefined,\n\t\t\tbase: NodeId | undefined,\n\t\t): NodeId | undefined => {\n\t\t\tif (curr !== undefined) {\n\t\t\t\treturn curr;\n\t\t\t}\n\n\t\t\tif (base !== undefined && getFromChangeAtomIdMap(context.baseNodeIds, base) === true) {\n\t\t\t\treturn base;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\n\t\tlet allowInval = false;\n\t\tif (crossFieldTable.fieldsWithUnattachedChild.has(baseField)) {\n\t\t\tcrossFieldTable.fieldsWithUnattachedChild.delete(baseField);\n\t\t\tallowInval = true;\n\t\t}\n\n\t\tcontext.rebasedChange.change = brand(\n\t\t\tchangeHandler.rebaser.rebase(\n\t\t\t\tfieldChangeset,\n\t\t\t\tbaseChangeset,\n\t\t\t\trebaseChild,\n\t\t\t\tgenId,\n\t\t\t\tnew RebaseNodeManagerI(crossFieldTable, context.fieldId, allowInval),\n\t\t\t\trebaseMetadata,\n\t\t\t\tcrossFieldTable.rebaseVersion,\n\t\t\t),\n\t\t);\n\t}\n\n\tprivate attachRebasedField(\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\ttable: RebaseTable,\n\t\trebasedField: FieldChange,\n\t\t{ nodeId, field: fieldKey }: FieldId,\n\t\tidAllocator: IdAllocator,\n\t\tmetadata: RebaseRevisionMetadata,\n\t): void {\n\t\tif (nodeId === undefined) {\n\t\t\trebasedFields.set(fieldKey, rebasedField);\n\t\t\treturn;\n\t\t}\n\t\tconst rebasedNode = getFromChangeAtomIdMap(rebasedNodes, nodeId);\n\t\tif (rebasedNode !== undefined) {\n\t\t\tconst updatedRebasedNode: Mutable<NodeChangeset> = cloneNodeChangeset(rebasedNode);\n\t\t\tsetInChangeAtomIdMap(rebasedNodes, nodeId, updatedRebasedNode);\n\n\t\t\tif (updatedRebasedNode.fieldChanges === undefined) {\n\t\t\t\tupdatedRebasedNode.fieldChanges = new Map([[fieldKey, rebasedField]]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\t!updatedRebasedNode.fieldChanges.has(fieldKey),\n\t\t\t\t0x9c4 /* Expected an empty field */,\n\t\t\t);\n\t\t\tupdatedRebasedNode.fieldChanges.set(fieldKey, rebasedField);\n\t\t\treturn;\n\t\t}\n\n\t\tconst newNode: NodeChangeset = {\n\t\t\tfieldChanges: new Map([[fieldKey, rebasedField]]),\n\t\t};\n\n\t\tsetInChangeAtomIdMap(rebasedNodes, nodeId, newNode);\n\t\tsetInChangeAtomIdMap(table.baseToRebasedNodeId, nodeId, nodeId);\n\n\t\tconst parentBase = getNodeParent(table.baseChange, nodeId);\n\n\t\tthis.attachRebasedNode(\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\ttable,\n\t\t\tnodeId,\n\t\t\tparentBase,\n\t\t\tidAllocator,\n\t\t\tmetadata,\n\t\t);\n\t}\n\n\tprivate attachRebasedNode(\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\ttable: RebaseTable,\n\t\tbaseNodeId: NodeId,\n\t\tparentBase: NodeLocation,\n\t\tidAllocator: IdAllocator,\n\t\tmetadata: RebaseRevisionMetadata,\n\t): void {\n\t\tif (parentBase.root !== undefined) {\n\t\t\tconst renamedRoot = firstAttachIdFromDetachId(\n\t\t\t\ttable.baseChange.rootNodes,\n\t\t\t\tparentBase.root,\n\t\t\t\t1,\n\t\t\t).value;\n\n\t\t\tconst attachField = table.baseChange.crossFieldKeys.getFirst(\n\t\t\t\t{ ...renamedRoot, target: CrossFieldTarget.Destination },\n\t\t\t\t1,\n\t\t\t).value;\n\n\t\t\tif (attachField !== undefined) {\n\t\t\t\t// The base change inserts this node into `attachField`, so the rebased change should represent this node there.\n\t\t\t\tconst normalizedAttachField = normalizeFieldId(\n\t\t\t\t\tattachField,\n\t\t\t\t\ttable.baseChange.nodeAliases,\n\t\t\t\t);\n\n\t\t\t\tconst entry: DetachedNodeEntry = table.entries.getFirst(renamedRoot, 1).value ?? {};\n\t\t\t\ttable.entries.set(renamedRoot, 1, { ...entry, nodeChange: baseNodeId });\n\t\t\t\ttable.affectedBaseFields.set(fieldIdKeyFromFieldId(normalizedAttachField), true);\n\t\t\t\tthis.attachRebasedNode(\n\t\t\t\t\trebasedFields,\n\t\t\t\t\trebasedNodes,\n\t\t\t\t\ttable,\n\t\t\t\t\tbaseNodeId,\n\t\t\t\t\t{ field: normalizedAttachField },\n\t\t\t\t\tidAllocator,\n\t\t\t\t\tmetadata,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst baseDetachLocation = table.baseChange.rootNodes.detachLocations.getFirst(\n\t\t\t\t\tparentBase.root,\n\t\t\t\t\t1,\n\t\t\t\t).value;\n\n\t\t\t\tassignRootChange(\n\t\t\t\t\ttable.rebasedRootNodes,\n\t\t\t\t\ttable.rebasedNodeToParent,\n\t\t\t\t\trenamedRoot,\n\t\t\t\t\tbaseNodeId,\n\t\t\t\t\tbaseDetachLocation,\n\t\t\t\t\ttable.rebaseVersion,\n\t\t\t\t);\n\n\t\t\t\t// We need to make sure the rebased changeset includes the detach location,\n\t\t\t\t// so we add that field to `affectedBaseFields` unless it's already been processed.\n\t\t\t\tif (\n\t\t\t\t\tbaseDetachLocation !== undefined &&\n\t\t\t\t\t!table.baseFieldToContext.has(\n\t\t\t\t\t\tfieldChangeFromId(table.baseChange, baseDetachLocation),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\ttable.affectedBaseFields.set(fieldIdKeyFromFieldId(baseDetachLocation), true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst parentFieldIdBase = parentBase.field;\n\t\tconst baseFieldChange = fieldChangeFromId(table.baseChange, parentFieldIdBase);\n\n\t\tconst rebasedFieldId = rebasedFieldIdFromBaseId(table, parentFieldIdBase);\n\t\tsetInChangeAtomIdMap(table.rebasedNodeToParent, baseNodeId, { field: rebasedFieldId });\n\n\t\tconst context = table.baseFieldToContext.get(baseFieldChange);\n\t\tif (context !== undefined) {\n\t\t\t// We've already processed this field.\n\t\t\t// The new child node will be attached in the next pass.\n\t\t\t// Note that adding to `fieldsWithUnattachedChild` allows that field to generate new invalidations,\n\t\t\t// so to avoid invalidation cycles we make sure we only add to it once per new unattached child.\n\t\t\t// This is done by checking whether `context.baseNodeIds` already contained `baseNodeId`.\n\t\t\tif (setInChangeAtomIdMap(context.baseNodeIds, baseNodeId, true)) {\n\t\t\t\ttable.fieldsWithUnattachedChild.add(baseFieldChange);\n\t\t\t\ttable.affectedBaseFields.set(fieldIdKeyFromFieldId(parentFieldIdBase), true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.rebaseFieldWithoutNewChanges(\n\t\t\tbaseFieldChange,\n\t\t\tparentFieldIdBase,\n\t\t\ttable,\n\t\t\trebasedFields,\n\t\t\trebasedNodes,\n\t\t\tidAllocator,\n\t\t\tmetadata,\n\t\t\tbaseNodeId,\n\t\t);\n\t}\n\n\tprivate rebaseFieldMap(\n\t\tchange: FieldChangeMap,\n\t\tover: FieldChangeMap,\n\t\tparentId: NodeId | undefined,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: RebaseTable,\n\t\trevisionMetadata: RebaseRevisionMetadata,\n\t): FieldChangeMap {\n\t\tconst rebasedFields: FieldChangeMap = new Map();\n\t\tconst rebaseChild = (\n\t\t\tchild: NodeId | undefined,\n\t\t\tbaseChild: NodeId | undefined,\n\t\t\tstateChange: NodeAttachState | undefined,\n\t\t): NodeId | undefined => {\n\t\t\tif (child !== undefined && baseChild !== undefined) {\n\t\t\t\tcrossFieldTable.nodeIdPairs.push([child, baseChild, stateChange]);\n\t\t\t}\n\t\t\treturn child;\n\t\t};\n\n\t\tfor (const [field, fieldChange] of change) {\n\t\t\tconst fieldId: FieldId = { nodeId: parentId, field };\n\t\t\tconst baseChange = over.get(field);\n\t\t\tif (baseChange === undefined) {\n\t\t\t\trebasedFields.set(field, fieldChange);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst {\n\t\t\t\tfieldKind,\n\t\t\t\tchangeHandler,\n\t\t\t\tchange1: fieldChangeset,\n\t\t\t\tchange2: baseChangeset,\n\t\t\t} = this.normalizeFieldChanges(fieldChange, baseChange);\n\n\t\t\tconst manager = new RebaseNodeManagerI(crossFieldTable, fieldId);\n\n\t\t\tconst rebasedField = changeHandler.rebaser.rebase(\n\t\t\t\tfieldChangeset,\n\t\t\t\tbaseChangeset,\n\t\t\t\trebaseChild,\n\t\t\t\tgenId,\n\t\t\t\tmanager,\n\t\t\t\trevisionMetadata,\n\t\t\t\tcrossFieldTable.rebaseVersion,\n\t\t\t);\n\n\t\t\tconst rebasedFieldChange: FieldChange = {\n\t\t\t\tfieldKind,\n\t\t\t\tchange: brand(rebasedField),\n\t\t\t};\n\n\t\t\trebasedFields.set(field, rebasedFieldChange);\n\n\t\t\tcrossFieldTable.baseFieldToContext.set(baseChange, {\n\t\t\t\tbaseChange,\n\t\t\t\tnewChange: fieldChange,\n\t\t\t\trebasedChange: rebasedFieldChange,\n\t\t\t\tfieldId,\n\t\t\t\tbaseNodeIds: newTupleBTree(),\n\t\t\t});\n\n\t\t\tcrossFieldTable.rebasedFields.add(rebasedFieldChange);\n\t\t}\n\n\t\treturn rebasedFields;\n\t}\n\n\tprivate rebaseNodeChange(\n\t\tnewId: NodeId,\n\t\tbaseId: NodeId,\n\t\tgenId: IdAllocator,\n\t\tcrossFieldTable: RebaseTable,\n\t\trevisionMetadata: RebaseRevisionMetadata,\n\t): NodeChangeset {\n\t\tconst change = nodeChangeFromId(\n\t\t\tcrossFieldTable.newChange.nodeChanges,\n\t\t\tcrossFieldTable.newChange.nodeAliases,\n\t\t\tnewId,\n\t\t);\n\t\tconst over = nodeChangeFromId(\n\t\t\tcrossFieldTable.baseChange.nodeChanges,\n\t\t\tcrossFieldTable.baseChange.nodeAliases,\n\t\t\tbaseId,\n\t\t);\n\n\t\tconst baseMap: FieldChangeMap = over?.fieldChanges ?? new Map();\n\n\t\tconst fieldChanges =\n\t\t\tchange.fieldChanges !== undefined && over.fieldChanges !== undefined\n\t\t\t\t? this.rebaseFieldMap(\n\t\t\t\t\t\tchange?.fieldChanges ?? new Map(),\n\t\t\t\t\t\tbaseMap,\n\t\t\t\t\t\tnewId,\n\t\t\t\t\t\tgenId,\n\t\t\t\t\t\tcrossFieldTable,\n\t\t\t\t\t\trevisionMetadata,\n\t\t\t\t\t)\n\t\t\t\t: change.fieldChanges;\n\n\t\tconst rebasedChange: Mutable<NodeChangeset> = {};\n\n\t\tif (fieldChanges !== undefined && fieldChanges.size > 0) {\n\t\t\trebasedChange.fieldChanges = fieldChanges;\n\t\t}\n\n\t\tif (change?.nodeExistsConstraint !== undefined) {\n\t\t\trebasedChange.nodeExistsConstraint = change.nodeExistsConstraint;\n\t\t}\n\n\t\tif (change?.nodeExistsConstraintOnRevert !== undefined) {\n\t\t\trebasedChange.nodeExistsConstraintOnRevert = change.nodeExistsConstraintOnRevert;\n\t\t}\n\n\t\tsetInChangeAtomIdMap(crossFieldTable.baseToRebasedNodeId, baseId, newId);\n\t\treturn rebasedChange;\n\t}\n\n\tprivate updateConstraints(\n\t\trebasedFields: FieldChangeMap,\n\t\trebasedNodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\trebasedRoots: RootNodeTable,\n\t\tconstraintState: ConstraintState,\n\t\trevertConstraintState: ConstraintState,\n\t): void {\n\t\tthis.updateConstraintsForFields(\n\t\t\trebasedFields,\n\t\t\tNodeAttachState.Attached,\n\t\t\tNodeAttachState.Attached,\n\t\t\tconstraintState,\n\t\t\trevertConstraintState,\n\t\t\trebasedNodes,\n\t\t);\n\n\t\tfor (const [_detachId, nodeId] of rebasedRoots.nodeChanges.entries()) {\n\t\t\t// XXX: This is incorrect if the rebased changeset attaches the node.\n\t\t\t// Efficiently computing whether the changeset attaches the node would require maintaining a mapping from node ID to attach ID.\n\t\t\tconst detachedInOutput = true;\n\t\t\tthis.updateConstraintsForNode(\n\t\t\t\tnodeId,\n\t\t\t\tNodeAttachState.Detached,\n\t\t\t\tdetachedInOutput ? NodeAttachState.Detached : NodeAttachState.Attached,\n\t\t\t\trebasedNodes,\n\t\t\t\tconstraintState,\n\t\t\t\trevertConstraintState,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate updateConstraintsForFields(\n\t\tfields: FieldChangeMap,\n\t\tparentInputAttachState: NodeAttachState,\n\t\tparentOutputAttachState: NodeAttachState,\n\t\tconstraintState: ConstraintState,\n\t\trevertConstraintState: ConstraintState,\n\t\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\t): void {\n\t\tfor (const field of fields.values()) {\n\t\t\tconst handler = getChangeHandler(this.fieldKinds, field.fieldKind);\n\t\t\tfor (const [nodeId] of handler.getNestedChanges(field.change)) {\n\t\t\t\t// XXX: This is incorrect if the rebased changeset detaches this node.\n\t\t\t\t// Efficiently computing whether the changeset detaches the node would require maintaining a mapping from node ID to detach ID.\n\t\t\t\tconst isOutputDetached = false;\n\t\t\t\tconst outputAttachState =\n\t\t\t\t\tparentOutputAttachState === NodeAttachState.Detached || isOutputDetached\n\t\t\t\t\t\t? NodeAttachState.Detached\n\t\t\t\t\t\t: NodeAttachState.Attached;\n\n\t\t\t\tthis.updateConstraintsForNode(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tparentInputAttachState,\n\t\t\t\t\toutputAttachState,\n\t\t\t\t\tnodes,\n\t\t\t\t\tconstraintState,\n\t\t\t\t\trevertConstraintState,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateConstraintsForNode(\n\t\tnodeId: NodeId,\n\t\tinputAttachState: NodeAttachState,\n\t\toutputAttachState: NodeAttachState,\n\t\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tconstraintState: ConstraintState,\n\t\trevertConstraintState: ConstraintState,\n\t): void {\n\t\tconst node = getFromChangeAtomIdMap(nodes, nodeId) ?? fail(0xb24 /* Unknown node ID */);\n\n\t\tconst updatedNode: Mutable<NodeChangeset> = { ...node };\n\t\tsetInChangeAtomIdMap(nodes, nodeId, updatedNode);\n\n\t\tif (node.nodeExistsConstraint !== undefined) {\n\t\t\tconst isNowViolated = inputAttachState === NodeAttachState.Detached;\n\t\t\tif (node.nodeExistsConstraint.violated !== isNowViolated) {\n\t\t\t\tupdatedNode.nodeExistsConstraint = {\n\t\t\t\t\t...node.nodeExistsConstraint,\n\t\t\t\t\tviolated: isNowViolated,\n\t\t\t\t};\n\t\t\t\tconstraintState.violationCount += isNowViolated ? 1 : -1;\n\t\t\t}\n\t\t}\n\t\tif (node.nodeExistsConstraintOnRevert !== undefined) {\n\t\t\tconst isNowViolated = outputAttachState === NodeAttachState.Detached;\n\t\t\tif (node.nodeExistsConstraintOnRevert.violated !== isNowViolated) {\n\t\t\t\tupdatedNode.nodeExistsConstraintOnRevert = {\n\t\t\t\t\t...node.nodeExistsConstraintOnRevert,\n\t\t\t\t\tviolated: isNowViolated,\n\t\t\t\t};\n\t\t\t\trevertConstraintState.violationCount += isNowViolated ? 1 : -1;\n\t\t\t}\n\t\t}\n\n\t\tif (node.fieldChanges !== undefined) {\n\t\t\tthis.updateConstraintsForFields(\n\t\t\t\tnode.fieldChanges,\n\t\t\t\tinputAttachState,\n\t\t\t\toutputAttachState,\n\t\t\t\tconstraintState,\n\t\t\t\trevertConstraintState,\n\t\t\t\tnodes,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate pruneFieldMap(\n\t\tchangeset: FieldChangeMap | undefined,\n\t\tparentId: NodeId | undefined,\n\t\tnodeMap: ChangeAtomIdBTree<NodeChangeset>,\n\t\tnodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\taliases: ChangeAtomIdBTree<NodeId>,\n\t\troots: RootNodeTable,\n\t\tfieldsWithRootMoves: TupleBTree<FieldIdKey, boolean>,\n\t\tfieldsToRootChanges: TupleBTree<FieldIdKey, ChangeAtomId[]>,\n\t): FieldChangeMap | undefined {\n\t\tif (changeset === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prunedChangeset: FieldChangeMap = new Map();\n\t\tfor (const [field, fieldChange] of changeset) {\n\t\t\tconst handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);\n\n\t\t\tconst prunedFieldChangeset = handler.rebaser.prune(fieldChange.change, (nodeId) =>\n\t\t\t\tthis.pruneNodeChange(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tnodeMap,\n\t\t\t\t\tnodeToParent,\n\t\t\t\t\taliases,\n\t\t\t\t\troots,\n\t\t\t\t\tfieldsWithRootMoves,\n\t\t\t\t\tfieldsToRootChanges,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst fieldId: FieldId = { nodeId: parentId, field };\n\t\t\tconst fieldIdKey = fieldIdKeyFromFieldId(fieldId);\n\t\t\tconst rootsWithChanges = fieldsToRootChanges.get(fieldIdKey) ?? [];\n\t\t\tlet hasRootWithNodeChange = false;\n\t\t\tfor (const rootId of rootsWithChanges) {\n\t\t\t\tconst nodeId =\n\t\t\t\t\tgetFromChangeAtomIdMap(roots.nodeChanges, rootId) ?? fail(\"No root change found\");\n\n\t\t\t\tconst isRootChangeEmpty =\n\t\t\t\t\tthis.pruneNodeChange(\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tnodeMap,\n\t\t\t\t\t\tnodeToParent,\n\t\t\t\t\t\taliases,\n\t\t\t\t\t\troots,\n\t\t\t\t\t\tfieldsWithRootMoves,\n\t\t\t\t\t\tfieldsToRootChanges,\n\t\t\t\t\t) === undefined;\n\n\t\t\t\tif (isRootChangeEmpty) {\n\t\t\t\t\troots.nodeChanges.delete([rootId.revision, rootId.localId]);\n\t\t\t\t\ttryRemoveDetachLocation(roots, rootId, 1);\n\t\t\t\t} else {\n\t\t\t\t\thasRootWithNodeChange = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst hasRootChanges =\n\t\t\t\thasRootWithNodeChange || fieldsWithRootMoves.get(fieldIdKey) === true;\n\n\t\t\tif (!handler.isEmpty(prunedFieldChangeset) || hasRootChanges) {\n\t\t\t\tprunedChangeset.set(field, { ...fieldChange, change: brand(prunedFieldChangeset) });\n\t\t\t}\n\t\t}\n\n\t\treturn prunedChangeset.size > 0 ? prunedChangeset : undefined;\n\t}\n\n\tprivate pruneRoots(\n\t\troots: RootNodeTable,\n\t\tnodeMap: ChangeAtomIdBTree<NodeChangeset>,\n\t\tnodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\taliases: ChangeAtomIdBTree<NodeId>,\n\t\tfieldsWithRootMoves: TupleBTree<FieldIdKey, boolean>,\n\t\tfieldsToRootChanges: TupleBTree<FieldIdKey, ChangeAtomId[]>,\n\t): RootNodeTable {\n\t\tconst pruned: RootNodeTable = { ...roots, nodeChanges: newTupleBTree() };\n\t\tfor (const [rootIdKey, nodeId] of roots.nodeChanges.entries()) {\n\t\t\tconst rootId: ChangeAtomId = { revision: rootIdKey[0], localId: rootIdKey[1] };\n\t\t\tconst hasDetachLocation = roots.detachLocations.getFirst(rootId, 1).value !== undefined;\n\n\t\t\t// If the root has a detach location it should be pruned by recursion when pruning the field it was detached from.\n\t\t\tconst prunedId = hasDetachLocation\n\t\t\t\t? nodeId\n\t\t\t\t: this.pruneNodeChange(\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tnodeMap,\n\t\t\t\t\t\tnodeToParent,\n\t\t\t\t\t\taliases,\n\t\t\t\t\t\troots,\n\t\t\t\t\t\tfieldsWithRootMoves,\n\t\t\t\t\t\tfieldsToRootChanges,\n\t\t\t\t\t);\n\n\t\t\tif (prunedId !== undefined) {\n\t\t\t\tpruned.nodeChanges.set(rootIdKey, prunedId);\n\t\t\t}\n\n\t\t\ttryRemoveDetachLocation(pruned, rootId, 1);\n\t\t}\n\n\t\treturn pruned;\n\t}\n\n\tprivate pruneNodeChange(\n\t\tnodeId: NodeId,\n\t\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\t\tnodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\t\taliases: ChangeAtomIdBTree<NodeId>,\n\t\troots: RootNodeTable,\n\t\tfieldsWithRootMoves: TupleBTree<FieldIdKey, boolean>,\n\t\tfieldsToRootChanges: TupleBTree<FieldIdKey, ChangeAtomId[]>,\n\t): NodeId | undefined {\n\t\tconst changeset = nodeChangeFromId(nodes, aliases, nodeId);\n\t\tconst prunedFields =\n\t\t\tchangeset.fieldChanges !== undefined\n\t\t\t\t? this.pruneFieldMap(\n\t\t\t\t\t\tchangeset.fieldChanges,\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tnodes,\n\t\t\t\t\t\tnodeToParent,\n\t\t\t\t\t\taliases,\n\t\t\t\t\t\troots,\n\t\t\t\t\t\tfieldsWithRootMoves,\n\t\t\t\t\t\tfieldsToRootChanges,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\n\t\tconst prunedChange = { ...changeset, fieldChanges: prunedFields };\n\t\tif (prunedChange.fieldChanges === undefined) {\n\t\t\tdelete prunedChange.fieldChanges;\n\t\t}\n\n\t\tif (isEmptyNodeChangeset(prunedChange)) {\n\t\t\tconst nodeIdKey: ChangeAtomIdKey = [nodeId.revision, nodeId.localId];\n\n\t\t\t// TODO: Shouldn't we also delete all aliases associated with this node?\n\t\t\tnodes.delete(nodeIdKey);\n\t\t\tnodeToParent.delete(nodeIdKey);\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\tsetInChangeAtomIdMap(nodes, nodeId, prunedChange);\n\t\t\treturn nodeId;\n\t\t}\n\t}\n\n\tpublic changeRevision(\n\t\tchange: ModularChangeset,\n\t\tnewRevision: RevisionTag | undefined,\n\t\trollbackOf?: RevisionTag,\n\t): ModularChangeset {\n\t\tconst oldRevisions = new Set(\n\t\t\tchange.revisions === undefined || change.revisions.length === 0\n\t\t\t\t? [undefined]\n\t\t\t\t: change.revisions.map((revInfo) => revInfo.revision),\n\t\t);\n\t\tconst updatedFields = this.replaceFieldMapRevisions(\n\t\t\tchange.fieldChanges,\n\t\t\toldRevisions,\n\t\t\tnewRevision,\n\t\t);\n\n\t\tconst updatedNodes: ChangeAtomIdBTree<NodeChangeset> = newTupleBTree();\n\t\tfor (const [[revision, id], nodeChangeset] of change.nodeChanges.entries()) {\n\t\t\tupdatedNodes.set(\n\t\t\t\t[replaceRevision(revision, oldRevisions, newRevision), id],\n\t\t\t\tthis.replaceNodeChangesetRevisions(nodeChangeset, oldRevisions, newRevision),\n\t\t\t);\n\t\t}\n\n\t\tconst updatedNodeToParent: ChangeAtomIdBTree<NodeLocation> = newTupleBTree();\n\t\tfor (const [[revision, id], location] of change.nodeToParent.entries()) {\n\t\t\tupdatedNodeToParent.set(\n\t\t\t\t[replaceRevision(revision, oldRevisions, newRevision), id],\n\t\t\t\treplaceNodeLocationRevision(\n\t\t\t\t\tnormalizeNodeLocation(location, change.nodeAliases),\n\t\t\t\t\toldRevisions,\n\t\t\t\t\tnewRevision,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tconst updated: Mutable<ModularChangeset> = {\n\t\t\t...change,\n\t\t\tfieldChanges: updatedFields,\n\t\t\tnodeChanges: updatedNodes,\n\t\t\tnodeToParent: updatedNodeToParent,\n\t\t\trootNodes: replaceRootTableRevision(\n\t\t\t\tchange.rootNodes,\n\t\t\t\toldRevisions,\n\t\t\t\tnewRevision,\n\t\t\t\tchange.nodeAliases,\n\t\t\t),\n\n\t\t\t// We've updated all references to old node IDs, so we no longer need an alias table.\n\t\t\tnodeAliases: newTupleBTree(),\n\t\t\tcrossFieldKeys: change.crossFieldKeys.mapEntries(\n\t\t\t\t(key) => replaceCrossFieldKeyRevision(key, oldRevisions, newRevision),\n\t\t\t\t(id) =>\n\t\t\t\t\treplaceFieldIdRevision(\n\t\t\t\t\t\tnormalizeFieldId(id, change.nodeAliases),\n\t\t\t\t\t\toldRevisions,\n\t\t\t\t\t\tnewRevision,\n\t\t\t\t\t),\n\t\t\t),\n\t\t};\n\n\t\tif (change.builds !== undefined) {\n\t\t\tupdated.builds = replaceIdMapRevisions(change.builds, oldRevisions, newRevision);\n\t\t}\n\n\t\tif (change.destroys !== undefined) {\n\t\t\tupdated.destroys = replaceIdMapRevisions(change.destroys, oldRevisions, newRevision);\n\t\t}\n\n\t\tif (change.refreshers !== undefined) {\n\t\t\tupdated.refreshers = replaceIdMapRevisions(change.refreshers, oldRevisions, newRevision);\n\t\t}\n\n\t\tif (newRevision !== undefined) {\n\t\t\tconst revInfo: Mutable<RevisionInfo> = { revision: newRevision };\n\t\t\tif (rollbackOf !== undefined) {\n\t\t\t\trevInfo.rollbackOf = rollbackOf;\n\t\t\t}\n\n\t\t\tupdated.revisions = [revInfo];\n\t\t} else {\n\t\t\tdelete updated.revisions;\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tprivate replaceNodeChangesetRevisions(\n\t\tnodeChangeset: NodeChangeset,\n\t\toldRevisions: Set<RevisionTag | undefined>,\n\t\tnewRevision: RevisionTag | undefined,\n\t): NodeChangeset {\n\t\tconst updated = { ...nodeChangeset };\n\t\tif (nodeChangeset.fieldChanges !== undefined) {\n\t\t\tupdated.fieldChanges = this.replaceFieldMapRevisions(\n\t\t\t\tnodeChangeset.fieldChanges,\n\t\t\t\toldRevisions,\n\t\t\t\tnewRevision,\n\t\t\t);\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tprivate replaceFieldMapRevisions(\n\t\tfields: FieldChangeMap,\n\t\toldRevisions: Set<RevisionTag | undefined>,\n\t\tnewRevision: RevisionTag | undefined,\n\t): FieldChangeMap {\n\t\tconst updatedFields: FieldChangeMap = new Map();\n\t\tfor (const [field, fieldChange] of fields) {\n\t\t\tconst updatedFieldChange = getChangeHandler(\n\t\t\t\tthis.fieldKinds,\n\t\t\t\tfieldChange.fieldKind,\n\t\t\t).rebaser.replaceRevisions(fieldChange.change, oldRevisions, newRevision);\n\n\t\t\tupdatedFields.set(field, { ...fieldChange, change: brand(updatedFieldChange) });\n\t\t}\n\n\t\treturn updatedFields;\n\t}\n\n\tprivate makeCrossFieldKeyTable(\n\t\tfields: FieldChangeMap,\n\t\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\t): CrossFieldKeyTable {\n\t\tconst keys: CrossFieldKeyTable = newCrossFieldRangeTable();\n\t\tthis.populateCrossFieldKeyTableForFieldMap(keys, fields, undefined);\n\t\tnodes.forEachPair(([revision, localId], node) => {\n\t\t\tif (node.fieldChanges !== undefined) {\n\t\t\t\tthis.populateCrossFieldKeyTableForFieldMap(keys, node.fieldChanges, {\n\t\t\t\t\trevision,\n\t\t\t\t\tlocalId,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn keys;\n\t}\n\n\tprivate populateCrossFieldKeyTableForFieldMap(\n\t\ttable: CrossFieldKeyTable,\n\t\tfields: FieldChangeMap,\n\t\tparent: NodeId | undefined,\n\t): void {\n\t\tfor (const [fieldKey, fieldChange] of fields) {\n\t\t\tconst keys = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).getCrossFieldKeys(\n\t\t\t\tfieldChange.change,\n\t\t\t);\n\t\t\tfor (const { key, count } of keys) {\n\t\t\t\ttable.set(key, count, { nodeId: parent, field: fieldKey });\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic buildEditor(\n\t\tchangeReceiver: (change: TaggedChange<ModularChangeset>) => void,\n\t): ModularEditBuilder {\n\t\treturn new ModularEditBuilder(this, this.fieldKinds, changeReceiver);\n\t}\n\n\tprivate createEmptyFieldChange(fieldKind: FieldKindIdentifier): FieldChange {\n\t\tconst emptyChange = getChangeHandler(this.fieldKinds, fieldKind).createEmpty();\n\t\treturn { fieldKind, change: brand(emptyChange) };\n\t}\n\n\tpublic validateChangeset(change: ModularChangeset): void {\n\t\tconst unreachableNodes: ChangeAtomIdBTree<NodeLocation> = brand(\n\t\t\tchange.nodeToParent.clone(),\n\t\t);\n\n\t\tconst unreachableCFKs = change.crossFieldKeys.clone();\n\n\t\tthis.validateFieldChanges(\n\t\t\tchange,\n\t\t\tchange.fieldChanges,\n\t\t\tundefined,\n\t\t\tunreachableNodes,\n\t\t\tunreachableCFKs,\n\t\t);\n\n\t\tfor (const [[revision, localId], node] of change.nodeChanges.entries()) {\n\t\t\tif (node.fieldChanges === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst nodeId = normalizeNodeId({ revision, localId }, change.nodeAliases);\n\t\t\tthis.validateFieldChanges(\n\t\t\t\tchange,\n\t\t\t\tnode.fieldChanges,\n\t\t\t\tnodeId,\n\t\t\t\tunreachableNodes,\n\t\t\t\tunreachableCFKs,\n\t\t\t);\n\t\t}\n\n\t\tfor (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {\n\t\t\tconst detachId: ChangeAtomId = { revision: detachIdKey[0], localId: detachIdKey[1] };\n\t\t\tconst location = getNodeParent(change, nodeId);\n\t\t\tassert(areEqualChangeAtomIdOpts(location.root, detachId), \"Inconsistent node location\");\n\n\t\t\tconst normalizedNodeId = normalizeNodeId(nodeId, change.nodeAliases);\n\t\t\tunreachableNodes.delete([normalizedNodeId.revision, normalizedNodeId.localId]);\n\n\t\t\tconst fieldChanges = nodeChangeFromId(\n\t\t\t\tchange.nodeChanges,\n\t\t\t\tchange.nodeAliases,\n\t\t\t\tnodeId,\n\t\t\t).fieldChanges;\n\n\t\t\tif (fieldChanges !== undefined) {\n\t\t\t\tthis.validateFieldChanges(\n\t\t\t\t\tchange,\n\t\t\t\t\tfieldChanges,\n\t\t\t\t\tnormalizedNodeId,\n\t\t\t\t\tunreachableNodes,\n\t\t\t\t\tunreachableCFKs,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tassert(unreachableNodes.size === 0, \"Unreachable nodes found\");\n\t\tassert(unreachableCFKs.entries().length === 0, \"Unreachable cross-field keys found\");\n\t}\n\n\t/**\n\t * Asserts that each node has a correct entry in `change.nodeToParent`,\n\t * and each cross field key has a correct entry in `change.crossFieldKeys`.\n\t * @returns the number of children found.\n\t */\n\tprivate validateFieldChanges(\n\t\tchange: ModularChangeset,\n\t\tfieldChanges: FieldChangeMap,\n\t\tnodeParent: NodeId | undefined,\n\t\tunreachableNodes: ChangeAtomIdBTree<NodeLocation>,\n\t\tunreachableCFKs: CrossFieldRangeTable<FieldId>,\n\t): void {\n\t\tfor (const [field, fieldChange] of fieldChanges.entries()) {\n\t\t\tconst fieldId = { nodeId: nodeParent, field };\n\t\t\tconst handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);\n\t\t\tfor (const [child, _index] of handler.getNestedChanges(fieldChange.change)) {\n\t\t\t\tconst parentFieldId = getNodeParent(change, child);\n\t\t\t\tassert(\n\t\t\t\t\tparentFieldId.field !== undefined && areEqualFieldIds(parentFieldId.field, fieldId),\n\t\t\t\t\t0xa4e /* Inconsistent node parentage */,\n\t\t\t\t);\n\n\t\t\t\tunreachableNodes.delete([child.revision, child.localId]);\n\t\t\t}\n\n\t\t\tfor (const keyRange of handler.getCrossFieldKeys(fieldChange.change)) {\n\t\t\t\tconst fields = getFieldsForCrossFieldKey(change, keyRange.key, keyRange.count);\n\t\t\t\tassert(fields.length > 0, \"Unregistered cross-field key\");\n\t\t\t\tfor (const fieldFromLookup of fields) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tareEqualFieldIds(fieldFromLookup, fieldId),\n\t\t\t\t\t\t0xa4f /* Inconsistent cross field keys */,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tunreachableCFKs.delete(keyRange.key, keyRange.count);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getEffectiveChange(change: ModularChangeset): ModularChangeset {\n\t\tif (hasConflicts(change)) {\n\t\t\treturn this.muteChange(change);\n\t\t}\n\t\treturn change;\n\t}\n\n\t/**\n\t * Returns a copy of the given changeset with the same declarations (e.g., new cells) but no actual changes.\n\t */\n\tprivate muteChange(change: ModularChangeset): ModularChangeset {\n\t\tconst muted: Mutable<ModularChangeset> = {\n\t\t\t...change,\n\t\t\trootNodes: muteRootChanges(change.rootNodes),\n\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\tfieldChanges: this.muteFieldChanges(change.fieldChanges),\n\t\t\tnodeChanges: brand(change.nodeChanges.mapValues((v) => this.muteNodeChange(v))),\n\t\t};\n\t\treturn muted;\n\t}\n\n\tprivate muteNodeChange(change: NodeChangeset): NodeChangeset {\n\t\tif (change.fieldChanges === undefined) {\n\t\t\treturn change;\n\t\t}\n\t\treturn {\n\t\t\t...change,\n\t\t\tfieldChanges: this.muteFieldChanges(change.fieldChanges),\n\t\t};\n\t}\n\n\tprivate muteFieldChanges(change: FieldChangeMap): FieldChangeMap {\n\t\treturn new Map(\n\t\t\tArray.from(change.entries(), ([key, value]) => [key, this.muteFieldChange(value)]),\n\t\t);\n\t}\n\n\tprivate muteFieldChange(change: FieldChange): FieldChange {\n\t\tconst handler = getChangeHandler(this.fieldKinds, change.fieldKind);\n\t\treturn {\n\t\t\tfieldKind: change.fieldKind,\n\t\t\tchange: brand(handler.rebaser.mute(change.change)),\n\t\t};\n\t}\n}\n\nfunction replaceCrossFieldKeyRevision(\n\tkey: CrossFieldKey,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): CrossFieldKey {\n\treturn {\n\t\ttarget: key.target,\n\t\trevision: replaceRevision(key.revision, oldRevisions, newRevision),\n\t\tlocalId: key.localId,\n\t};\n}\n\nfunction replaceRevision(\n\trevision: RevisionTag | undefined,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): RevisionTag | undefined {\n\treturn oldRevisions.has(revision) ? newRevision : revision;\n}\n\nfunction replaceIdMapRevisions<T>(\n\tmap: ChangeAtomIdBTree<T>,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): ChangeAtomIdBTree<T> {\n\tconst updated: ChangeAtomIdBTree<T> = newTupleBTree();\n\tfor (const [[revision, id], value] of map.entries()) {\n\t\tupdated.set([replaceRevision(revision, oldRevisions, newRevision), id], value);\n\t}\n\n\treturn updated;\n}\n\ninterface BuildsDestroysAndRefreshers {\n\treadonly allBuilds: ChangeAtomIdBTree<TreeChunk>;\n\treadonly allDestroys: ChangeAtomIdBTree<number>;\n\treadonly allRefreshers: ChangeAtomIdBTree<TreeChunk>;\n}\n\nfunction composeBuildsDestroysAndRefreshers(\n\tchange1: ModularChangeset,\n\tchange2: ModularChangeset,\n): BuildsDestroysAndRefreshers {\n\t// Duplicate builds can happen in compositions of commits that needed to include detached tree refreshers (e.g., undos):\n\t// In that case, it's possible for the refreshers to contain different trees because the latter\n\t// refresher may already reflect the changes made by the commit that includes the earlier\n\t// refresher. This composition includes the changes made by the commit that includes the\n\t// earlier refresher, so we need to include the build for the earlier refresher, otherwise\n\t// the produced changeset will build a tree one which those changes have already been applied\n\t// and also try to apply the changes again, effectively applying them twice.\n\t// Note that it would in principle be possible to adopt the later build and exclude from the\n\t// composition all the changes already reflected on the tree, but that is not something we\n\t// care to support at this time.\n\tconst allBuilds: ChangeAtomIdBTree<TreeChunk> = brand(\n\t\tmergeTupleBTrees(\n\t\t\tchange1.builds ?? newTupleBTree(),\n\t\t\tchange2.builds ?? newTupleBTree(),\n\t\t\ttrue,\n\t\t),\n\t);\n\n\tconst allDestroys: ChangeAtomIdBTree<number> = brand(\n\t\tmergeTupleBTrees(change1.destroys ?? newTupleBTree(), change2.destroys ?? newTupleBTree()),\n\t);\n\n\tconst allRefreshers: ChangeAtomIdBTree<TreeChunk> = brand(\n\t\tmergeTupleBTrees(\n\t\t\tchange1.refreshers ?? newTupleBTree(),\n\t\t\tchange2.refreshers ?? newTupleBTree(),\n\t\t\ttrue,\n\t\t),\n\t);\n\n\tif (change1.destroys !== undefined && change2.builds !== undefined) {\n\t\tfor (const [key, chunk] of change2.builds.entries()) {\n\t\t\tconst destroyCount = change1.destroys.get(key);\n\t\t\tif (destroyCount !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tdestroyCount === chunk.topLevelLength,\n\t\t\t\t\t0x89b /* Expected build and destroy to have the same length */,\n\t\t\t\t);\n\n\t\t\t\tallBuilds.delete(key);\n\t\t\t\tallDestroys.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (change1.builds !== undefined && change2.destroys !== undefined) {\n\t\tfor (const [key, chunk] of change1.builds.entries()) {\n\t\t\tconst destroyCount = change2.destroys.get(key);\n\t\t\tif (destroyCount !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tdestroyCount === chunk.topLevelLength,\n\t\t\t\t\t0x9f0 /* Expected build and destroy to have the same length */,\n\t\t\t\t);\n\n\t\t\t\tallBuilds.delete(key);\n\t\t\t\tallDestroys.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\t// It's possible to have a build and a refresher for the same root because an attach operation need not be performed in the same changeset as the corresponding build.\n\tif (change1.builds !== undefined && change2.refreshers !== undefined) {\n\t\tfor (const [key, chunk] of change2.refreshers.entries()) {\n\t\t\tassert(chunk.topLevelLength === 1, \"Expected refresher chunk to have length 1\");\n\t\t\tconst match = change1.builds.getPairOrNextLower(key);\n\t\t\tif (match !== undefined) {\n\t\t\t\tconst [buildKey, buildChunk] = match;\n\t\t\t\tif (buildKey[0] === key[0] && buildKey[1] + buildChunk.topLevelLength > key[1]) {\n\t\t\t\t\tallRefreshers.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { allBuilds, allDestroys, allRefreshers };\n}\n\nfunction invertBuilds(\n\tbuilds: ChangeAtomIdBTree<TreeChunk> | undefined,\n): ChangeAtomIdBTree<number> | undefined {\n\tif (builds !== undefined) {\n\t\treturn brand(builds.mapValues((chunk) => chunk.topLevelLength));\n\t}\n\treturn undefined;\n}\n\n/**\n * Returns the set of removed roots that should be in memory for the given change to be applied.\n * A removed root is relevant if any of the following is true:\n * - It is being inserted\n * - It is being restored\n * - It is being edited\n * - The ID it is associated with is being changed\n *\n * May be conservative by returning more removed roots than strictly necessary.\n *\n * Will never return IDs for non-root trees, even if they are removed.\n *\n * @param change - The change to be applied.\n * @param fieldKinds - The field kinds to delegate to.\n */\nexport function* relevantRemovedRoots(\n\tchange: ModularChangeset,\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n): Iterable<DeltaDetachedNodeId> {\n\tconst rootIds: ChangeAtomIdRangeMap<boolean> = newChangeAtomIdRangeMap();\n\taddAttachesToSet(change, rootIds);\n\taddRenamesToSet(change, rootIds);\n\n\tfor (const [[revision, localId]] of change.rootNodes.nodeChanges.entries()) {\n\t\trootIds.set({ revision, localId }, 1, true);\n\t}\n\n\tfor (const entry of rootIds.entries()) {\n\t\tfor (let offset = 0; offset < entry.length; offset++) {\n\t\t\tconst detachId = offsetChangeAtomId(entry.start, offset);\n\t\t\tyield makeDetachedNodeId(detachId.revision, detachId.localId);\n\t\t}\n\t}\n}\n\nexport function* getBuildIds(change: ModularChangeset): Iterable<DeltaDetachedNodeId> {\n\tif (change.builds !== undefined) {\n\t\tfor (const [[revision, localId]] of change.builds.entries()) {\n\t\t\tyield makeDetachedNodeId(revision, localId);\n\t\t}\n\t}\n}\n\nfunction addAttachesToSet(\n\tchange: ModularChangeset,\n\trootIds: ChangeAtomIdRangeMap<boolean>,\n): void {\n\t// This includes each attach which does not have a corresponding detach.\n\tfor (const entry of change.crossFieldKeys.entries()) {\n\t\tif (entry.start.target !== CrossFieldTarget.Destination) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const detachIdEntry of change.rootNodes.newToOldId.getAll2(\n\t\t\tentry.start,\n\t\t\tentry.length,\n\t\t)) {\n\t\t\tconst detachId =\n\t\t\t\tdetachIdEntry.value ?? offsetChangeAtomId(entry.start, detachIdEntry.offset);\n\t\t\tfor (const detachEntry of change.crossFieldKeys.getAll2(\n\t\t\t\t{ ...detachId, target: CrossFieldTarget.Source },\n\t\t\t\tdetachIdEntry.length,\n\t\t\t)) {\n\t\t\t\tif (detachEntry.value === undefined) {\n\t\t\t\t\trootIds.set(\n\t\t\t\t\t\toffsetChangeAtomId(detachId, detachEntry.offset),\n\t\t\t\t\t\tdetachEntry.length,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction addRenamesToSet(\n\tchange: ModularChangeset,\n\trootIds: ChangeAtomIdRangeMap<boolean>,\n): void {\n\tfor (const renameEntry of change.rootNodes.oldToNewId.entries()) {\n\t\tfor (const detachEntry of change.crossFieldKeys.getAll2(\n\t\t\t{ ...renameEntry.start, target: CrossFieldTarget.Source },\n\t\t\trenameEntry.length,\n\t\t)) {\n\t\t\t// We only want to include renames of nodes which are detached in the input context of the changeset.\n\t\t\t// So if there is a detach for the node, the rename is not relevant.\n\t\t\tif (detachEntry.value === undefined) {\n\t\t\t\trootIds.set(renameEntry.start, renameEntry.length, true);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Adds any refreshers missing from the provided change that are relevant to the change and\n * removes any refreshers from the provided change that are not relevant to the change.\n *\n * @param change - The change that possibly has missing or superfluous refreshers. Not mutated by this function.\n * @param getDetachedNode - The function to retrieve a tree chunk from the corresponding detached node id.\n * @param removedRoots - The set of removed roots that should be in memory for the given change to be applied.\n * Can be retrieved by calling {@link relevantRemovedRoots}.\n * @param requireRefreshers - when true, this function enforces that all relevant removed roots have a\n * corresponding build or refresher.\n */\nexport function updateRefreshers(\n\tchange: ModularChangeset,\n\tgetDetachedNode: (id: DeltaDetachedNodeId) => TreeChunk | undefined,\n\tremovedRoots: Iterable<DeltaDetachedNodeId>,\n\trequireRefreshers: boolean = true,\n): ModularChangeset {\n\tconst refreshers: ChangeAtomIdBTree<TreeChunk> = newTupleBTree();\n\tconst chunkLengths: Map<RevisionTag | undefined, BTree<number, number>> = new Map();\n\n\tif (change.builds !== undefined) {\n\t\tfor (const [[revision, id], chunk] of change.builds.entries()) {\n\t\t\tconst lengthTree = getOrCreate(chunkLengths, revision, () => new BTree());\n\t\t\tlengthTree.set(id, chunk.topLevelLength);\n\t\t}\n\t}\n\n\tfor (const root of removedRoots) {\n\t\tif (change.builds !== undefined) {\n\t\t\tconst lengthTree = chunkLengths.get(root.major);\n\n\t\t\tif (lengthTree !== undefined) {\n\t\t\t\tconst lengthPair = lengthTree.getPairOrNextLower(root.minor);\n\t\t\t\tif (lengthPair !== undefined) {\n\t\t\t\t\tconst [firstMinor, length] = lengthPair;\n\n\t\t\t\t\t// if the root minor is within the length of the minor of the retrieved pair\n\t\t\t\t\t// then there's no need to check for the detached node\n\t\t\t\t\tif (root.minor < firstMinor + length) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst node = getDetachedNode(root);\n\t\tif (node === undefined) {\n\t\t\tassert(!requireRefreshers, 0x8cd /* detached node should exist */);\n\t\t} else {\n\t\t\trefreshers.set([root.major, brand(root.minor)], node);\n\t\t}\n\t}\n\n\tconst {\n\t\tfieldChanges,\n\t\tnodeChanges,\n\t\tmaxId,\n\t\trevisions,\n\t\tconstraintViolationCount,\n\t\tconstraintViolationCountOnRevert,\n\t\tbuilds,\n\t\tdestroys,\n\t} = change;\n\n\treturn makeModularChangeset({\n\t\tfieldChanges,\n\t\tnodeChanges,\n\t\tnodeToParent: change.nodeToParent,\n\t\tnodeAliases: change.nodeAliases,\n\t\trootNodes: change.rootNodes,\n\t\tcrossFieldKeys: change.crossFieldKeys,\n\t\tmaxId: maxId as number,\n\t\trevisions,\n\t\tconstraintViolationCount,\n\t\tconstraintViolationCountOnRevert,\n\t\tbuilds,\n\t\tdestroys,\n\t\trefreshers,\n\t});\n}\n\n/**\n * Converts a change into the delta format.\n *\n * @param change - The change to convert into a delta.\n * @param fieldKinds - The field kinds to delegate to.\n */\nexport function intoDelta(\n\ttaggedChange: TaggedChange<ModularChangeset>,\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n): DeltaRoot {\n\tconst change = taggedChange.change;\n\tconst rootDelta: Mutable<DeltaRoot> = {};\n\n\tif (!hasConflicts(change)) {\n\t\t// If there are no constraint violations, then tree changes apply.\n\t\tconst fieldDeltas = intoDeltaImpl(\n\t\t\tchange.fieldChanges,\n\t\t\tchange.nodeChanges,\n\t\t\tchange.nodeAliases,\n\t\t\tfieldKinds,\n\t\t);\n\n\t\tconst global: DeltaDetachedNodeChanges[] = [];\n\t\tfor (const [[major, minor], nodeId] of change.rootNodes.nodeChanges.entries()) {\n\t\t\tglobal.push({\n\t\t\t\tid: { major, minor },\n\t\t\t\tfields: deltaFromNodeChange(\n\t\t\t\t\tnodeChangeFromId(change.nodeChanges, change.nodeAliases, nodeId),\n\t\t\t\t\tchange.nodeChanges,\n\t\t\t\t\tchange.nodeAliases,\n\t\t\t\t\tfieldKinds,\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\tconst rename: DeltaDetachedNodeRename[] = [];\n\t\tfor (const {\n\t\t\tstart: oldId,\n\t\t\tvalue: newId,\n\t\t\tlength,\n\t\t} of change.rootNodes.oldToNewId.entries()) {\n\t\t\trename.push({\n\t\t\t\tcount: length,\n\t\t\t\toldId: makeDetachedNodeId(oldId.revision, oldId.localId),\n\t\t\t\tnewId: makeDetachedNodeId(newId.revision, newId.localId),\n\t\t\t});\n\t\t}\n\n\t\tif (fieldDeltas.size > 0) {\n\t\t\trootDelta.fields = fieldDeltas;\n\t\t}\n\t\tif (global.length > 0) {\n\t\t\trootDelta.global = global;\n\t\t}\n\t\tif (rename.length > 0) {\n\t\t\trootDelta.rename = rename;\n\t\t}\n\t}\n\n\t// Constraint violations should not prevent nodes from being built\n\tif (change.builds && change.builds.size > 0) {\n\t\trootDelta.build = copyDetachedNodes(change.builds);\n\t}\n\tif (change.destroys !== undefined && change.destroys.size > 0) {\n\t\tconst destroys: DeltaDetachedNodeDestruction[] = [];\n\t\tfor (const [[major, minor], count] of change.destroys.entries()) {\n\t\t\tdestroys.push({\n\t\t\t\tid: makeDetachedNodeId(major, minor),\n\t\t\t\tcount,\n\t\t\t});\n\t\t}\n\t\trootDelta.destroy = destroys;\n\t}\n\tif (change.refreshers && change.refreshers.size > 0) {\n\t\trootDelta.refreshers = copyDetachedNodes(change.refreshers);\n\t}\n\n\treturn rootDelta;\n}\n\nfunction copyDetachedNodes(\n\tdetachedNodes: ChangeAtomIdBTree<TreeChunk>,\n): DeltaDetachedNodeBuild[] | undefined {\n\tconst copiedDetachedNodes: DeltaDetachedNodeBuild[] = [];\n\tfor (const [[major, minor], chunk] of detachedNodes.entries()) {\n\t\tif (chunk.topLevelLength > 0) {\n\t\t\tchunk.referenceAdded();\n\t\t\tcopiedDetachedNodes.push({\n\t\t\t\tid: makeDetachedNodeId(major, minor),\n\t\t\t\ttrees: chunk,\n\t\t\t});\n\t\t}\n\t}\n\treturn copiedDetachedNodes.length > 0 ? copiedDetachedNodes : undefined;\n}\n\n/**\n * @param change - The change to convert into a delta.\n */\nfunction intoDeltaImpl(\n\tchange: FieldChangeMap,\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n): Map<FieldKey, DeltaFieldChanges> {\n\tconst delta: Map<FieldKey, DeltaFieldChanges> = new Map();\n\n\tfor (const [field, fieldChange] of change) {\n\t\tconst fieldDelta = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(\n\t\t\tfieldChange.change,\n\t\t\t(childChange): DeltaFieldMap => {\n\t\t\t\tconst nodeChange = nodeChangeFromId(nodeChanges, nodeAliases, childChange);\n\t\t\t\treturn deltaFromNodeChange(nodeChange, nodeChanges, nodeAliases, fieldKinds);\n\t\t\t},\n\t\t);\n\t\tif (fieldDelta !== undefined && fieldDelta.length > 0) {\n\t\t\tdelta.set(field, fieldDelta);\n\t\t}\n\t}\n\treturn delta;\n}\n\nfunction deltaFromNodeChange(\n\tchange: NodeChangeset,\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n): DeltaFieldMap {\n\tif (change.fieldChanges !== undefined) {\n\t\treturn intoDeltaImpl(change.fieldChanges, nodeChanges, nodeAliases, fieldKinds);\n\t}\n\t// TODO: update the API to allow undefined to be returned here\n\treturn new Map();\n}\n\n/**\n * @param revInfos - This should describe the revision being rebased and all revisions in the rebase path,\n * even if not part of the current base changeset.\n * For example, when rebasing change B from a local branch [A, B, C] over a branch [X, Y], the `revInfos` must include\n * the changes [A⁻¹ X, Y, A, B] for each rebase step of B.\n * @param revisionToRebase - The revision of the changeset which is being rebased.\n * @param baseRevisions - The set of revisions in the changeset being rebased over.\n * For example, when rebasing change B from a local branch [A, B, C] over a branch [X, Y], the `baseRevisions` must include\n * revisions [A⁻¹ X, Y, A] if rebasing over the composition of all those changes, or\n * revision [A⁻¹] for the first rebase, then [X], etc. if rebasing over edits individually.\n * @returns RebaseRevisionMetadata to be passed to `FieldChangeRebaser.rebase`*\n */\nexport function rebaseRevisionMetadataFromInfo(\n\trevInfos: readonly RevisionInfo[],\n\trevisionToRebase: RevisionTag | undefined,\n\tbaseRevisions: (RevisionTag | undefined)[],\n): RebaseRevisionMetadata {\n\tconst filteredRevisions: RevisionTag[] = [];\n\tfor (const revision of baseRevisions) {\n\t\tif (revision !== undefined) {\n\t\t\tfilteredRevisions.push(revision);\n\t\t}\n\t}\n\n\tconst getBaseRevisions = (): RevisionTag[] => filteredRevisions;\n\treturn {\n\t\t...revisionMetadataSourceFromInfo(revInfos),\n\t\tgetRevisionToRebase: () => revisionToRebase,\n\t\tgetBaseRevisions,\n\t};\n}\n\nfunction isEmptyNodeChangeset(change: NodeChangeset): boolean {\n\treturn (\n\t\tchange.fieldChanges === undefined &&\n\t\tchange.nodeExistsConstraint === undefined &&\n\t\tchange.nodeExistsConstraintOnRevert === undefined\n\t);\n}\n\nexport function getFieldKind(\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n\tkind: FieldKindIdentifier,\n): FlexFieldKind {\n\tif (kind === genericFieldKind.identifier) {\n\t\treturn genericFieldKind;\n\t}\n\tconst fieldKind = fieldKinds.get(kind);\n\tassert(fieldKind !== undefined, 0x3ad /* Unknown field kind */);\n\treturn fieldKind;\n}\n\nexport function getChangeHandler(\n\tfieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n\tkind: FieldKindIdentifier,\n): FieldChangeHandler<unknown> {\n\treturn getFieldKind(fieldKinds, kind).changeHandler;\n}\n\ninterface InvertTable {\n\tchange: ModularChangeset;\n\n\t// Entries are keyed on attach ID\n\tentries: CrossFieldMap<NodeId>;\n\toriginalFieldToContext: Map<FieldChange, InvertContext>;\n\tinvertedNodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\tinvertRevision: RevisionTag;\n\tinvalidatedFields: Set<FieldChange>;\n\tinvertedRoots: RootNodeTable;\n\n\t/**\n\t * Maps from attach ID in the inverted changeset to the corresponding detach ID in the base changeset.\n\t */\n\tattachToDetachId: ChangeAtomIdRangeMap<ChangeAtomId>;\n}\n\ninterface InvertContext {\n\tfieldId: FieldId;\n\tinvertedField: FieldChange;\n}\n\ninterface RebaseTable {\n\treadonly rebaseVersion: RebaseVersion;\n\n\t// Entries are keyed on attach ID\n\treadonly entries: CrossFieldMap<RebaseDetachedNodeEntry>;\n\treadonly baseChange: ModularChangeset;\n\treadonly newChange: ModularChangeset;\n\n\t/**\n\t * Maps from the FieldChange key used for the CrossFieldTable (which is the base FieldChange)\n\t * to the context for the field.\n\t */\n\treadonly baseFieldToContext: Map<FieldChange, RebaseFieldContext>;\n\treadonly baseRoots: RootNodeTable;\n\treadonly baseToRebasedNodeId: ChangeAtomIdBTree<NodeId>;\n\treadonly rebasedFields: Set<FieldChange>;\n\treadonly rebasedNodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\treadonly rebasedDetachLocations: ChangeAtomIdRangeMap<FieldId>;\n\treadonly movedDetaches: ChangeAtomIdRangeMap<boolean>;\n\treadonly rebasedRootNodes: RootNodeTable;\n\n\t/**\n\t * List of unprocessed (newId, baseId) pairs encountered so far.\n\t */\n\treadonly nodeIdPairs: [NodeId, NodeId, NodeAttachState | undefined][];\n\treadonly affectedBaseFields: TupleBTree<FieldIdKey, boolean>;\n\n\t/**\n\t * Set of base fields which contain a node which needs to be attached in the rebased changeset.\n\t */\n\treadonly fieldsWithUnattachedChild: Set<FieldChange>;\n}\n\nexport type FieldIdKey = [RevisionTag | undefined, ChangesetLocalId | undefined, FieldKey];\n\ninterface RebaseFieldContext {\n\tbaseChange: FieldChange;\n\tnewChange: FieldChange;\n\trebasedChange: FieldChange;\n\tfieldId: FieldId;\n\n\t/**\n\t * The set of node IDs in the base changeset which should be included in the rebased field,\n\t * even if there is no corresponding node changeset in the new change.\n\t */\n\tbaseNodeIds: ChangeAtomIdBTree<boolean>;\n}\n\nfunction newComposeTable(\n\tbaseChange: ModularChangeset,\n\tnewChange: ModularChangeset,\n\tcomposedRootNodes: RootNodeTable,\n\tmovedCrossFieldKeys: CrossFieldKeyTable,\n\tremovedCrossFieldKeys: CrossFieldRangeTable<boolean>,\n\tpendingCompositions: PendingCompositions,\n): ComposeTable {\n\treturn {\n\t\trebaseVersion: Math.max(\n\t\t\tbaseChange.rebaseVersion,\n\t\t\tnewChange.rebaseVersion,\n\t\t) as RebaseVersion,\n\t\tentries: newDetachedEntryMap(),\n\t\tbaseChange,\n\t\tnewChange,\n\t\tfieldToContext: new Map(),\n\t\tnewFieldToBaseField: new Map(),\n\t\tnewToBaseNodeId: newTupleBTree(),\n\t\tcomposedNodes: new Set(),\n\t\tmovedNodeToParent: newTupleBTree(),\n\t\tcomposedRootNodes,\n\t\tmovedCrossFieldKeys,\n\t\tremovedCrossFieldKeys,\n\t\trenamesToDelete: newChangeAtomIdRangeMap(),\n\t\tpendingCompositions,\n\t};\n}\n\ninterface ComposeTable {\n\treadonly rebaseVersion: RebaseVersion;\n\n\t// Entries are keyed on detach ID\n\treadonly entries: ChangeAtomIdRangeMap<DetachedNodeEntry>;\n\treadonly baseChange: ModularChangeset;\n\treadonly newChange: ModularChangeset;\n\n\t/**\n\t * Maps from an input changeset for a field (from change1 if it has one, from change2 otherwise) to the context for that field.\n\t */\n\treadonly fieldToContext: Map<FieldChange, ComposeFieldContext>;\n\treadonly newFieldToBaseField: Map<FieldChange, FieldChange>;\n\treadonly newToBaseNodeId: ChangeAtomIdBTree<NodeId>;\n\treadonly composedNodes: Set<NodeChangeset>;\n\treadonly movedNodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\treadonly composedRootNodes: RootNodeTable;\n\treadonly movedCrossFieldKeys: CrossFieldKeyTable;\n\treadonly removedCrossFieldKeys: CrossFieldRangeTable<boolean>;\n\treadonly renamesToDelete: ChangeAtomIdRangeMap<boolean>;\n\treadonly pendingCompositions: PendingCompositions;\n}\n\ninterface PendingCompositions {\n\t/**\n\t * Each entry in this list represents a node with both base and new changes which have not yet been composed.\n\t * Entries are of the form [baseId, newId].\n\t */\n\treadonly nodeIdsToCompose: [NodeId, NodeId][];\n\n\t/**\n\t * The set of fields in the base changeset which have been affected by a cross field effect.\n\t */\n\treadonly affectedBaseFields: BTree<FieldIdKey, true>;\n}\n\ninterface ComposeFieldContext {\n\t/**\n\t * The field ID for this field in the composed changeset.\n\t */\n\tfieldId: FieldId;\n\tchange1: FieldChangeset;\n\tchange2: FieldChangeset;\n\tcomposedChange: FieldChange;\n}\n\ninterface ConstraintState {\n\tviolationCount: number;\n}\n\nfunction newConstraintState(violationCount: number): ConstraintState {\n\treturn {\n\t\tviolationCount,\n\t};\n}\n\nclass InvertNodeManagerI implements InvertNodeManager {\n\tpublic constructor(\n\t\tprivate readonly table: InvertTable,\n\t\tprivate readonly fieldId: FieldId,\n\t) {}\n\n\tpublic invertDetach(\n\t\tdetachId: ChangeAtomId,\n\t\tcount: number,\n\t\tnodeChange: NodeId | undefined,\n\t\tnewAttachId: ChangeAtomId,\n\t): void {\n\t\tif (nodeChange !== undefined) {\n\t\t\tassert(count === 1, \"A node change should only affect one node\");\n\n\t\t\tconst attachEntry = firstAttachIdFromDetachId(\n\t\t\t\tthis.table.change.rootNodes,\n\t\t\t\tdetachId,\n\t\t\t\tcount,\n\t\t\t);\n\n\t\t\tconst attachFieldEntry = this.table.change.crossFieldKeys.getFirst(\n\t\t\t\t{ target: CrossFieldTarget.Destination, ...attachEntry.value },\n\t\t\t\tcount,\n\t\t\t);\n\n\t\t\tif (attachFieldEntry.value !== undefined) {\n\t\t\t\tsetInCrossFieldMap(this.table.entries, attachEntry.value, count, nodeChange);\n\t\t\t\tthis.table.invalidatedFields.add(\n\t\t\t\t\tfieldChangeFromId(this.table.change, attachFieldEntry.value),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tassignRootChange(\n\t\t\t\t\tthis.table.invertedRoots,\n\t\t\t\t\tthis.table.invertedNodeToParent,\n\t\t\t\t\tattachEntry.value,\n\t\t\t\t\tnodeChange,\n\t\t\t\t\tthis.fieldId,\n\t\t\t\t\tthis.table.change.rebaseVersion,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (!areEqualChangeAtomIds(detachId, newAttachId)) {\n\t\t\tfor (const entry of doesChangeAttachNodes(\n\t\t\t\tthis.table.change.crossFieldKeys,\n\t\t\t\tdetachId,\n\t\t\t\tcount,\n\t\t\t)) {\n\t\t\t\tif (!entry.value) {\n\t\t\t\t\tthis.table.attachToDetachId.set(newAttachId, count, detachId);\n\t\t\t\t\tthis.table.invertedRoots.detachLocations.set(detachId, count, this.fieldId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic invertAttach(\n\t\tattachId: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<DetachedNodeEntry> {\n\t\tlet countToProcess = count;\n\n\t\tconst detachIdEntry = firstDetachIdFromAttachId(\n\t\t\tthis.table.change.rootNodes,\n\t\t\tattachId,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = detachIdEntry.length;\n\n\t\tconst detachEntry = getFirstFieldForCrossFieldKey(\n\t\t\tthis.table.change,\n\t\t\t{ target: CrossFieldTarget.Source, ...detachIdEntry.value },\n\t\t\tcountToProcess,\n\t\t);\n\t\tcountToProcess = detachEntry.length;\n\n\t\tlet result: RangeQueryResult<DetachedNodeEntry>;\n\t\tif (detachEntry.value !== undefined) {\n\t\t\tconst moveEntry = this.table.entries.getFirst(attachId, countToProcess);\n\t\t\tresult = { ...moveEntry, value: { nodeChange: moveEntry.value } };\n\t\t} else {\n\t\t\t// This node is detached in the input context of the original change.\n\t\t\tconst nodeIdEntry = rangeQueryChangeAtomIdMap(\n\t\t\t\tthis.table.change.rootNodes.nodeChanges,\n\t\t\t\tdetachIdEntry.value,\n\t\t\t\tcountToProcess,\n\t\t\t);\n\n\t\t\tcountToProcess = nodeIdEntry.length;\n\t\t\tresult = {\n\t\t\t\tvalue: { nodeChange: nodeIdEntry.value, detachId: detachIdEntry.value },\n\t\t\t\tlength: countToProcess,\n\t\t\t};\n\t\t}\n\n\t\tif (result.value?.nodeChange !== undefined) {\n\t\t\tsetInChangeAtomIdMap(this.table.invertedNodeToParent, result.value.nodeChange, {\n\t\t\t\tfield: this.fieldId,\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n}\n\nclass RebaseNodeManagerI implements RebaseNodeManager {\n\tpublic constructor(\n\t\tprivate readonly table: RebaseTable,\n\t\tprivate readonly fieldId: FieldId,\n\t\tprivate readonly allowInval: boolean = true,\n\t) {}\n\n\tpublic getNewChangesForBaseAttach(\n\t\tbaseAttachId: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<RebaseDetachedNodeEntry | undefined> {\n\t\tlet countToProcess = count;\n\n\t\tconst detachEntry = firstDetachIdFromAttachId(\n\t\t\tthis.table.baseChange.rootNodes,\n\t\t\tbaseAttachId,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = detachEntry.length;\n\n\t\tconst nodeEntry = rangeQueryChangeAtomIdMap(\n\t\t\tthis.table.newChange.rootNodes.nodeChanges,\n\t\t\tdetachEntry.value,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = nodeEntry.length;\n\t\tconst newNodeId = nodeEntry.value;\n\n\t\tconst newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(\n\t\t\tdetachEntry.value,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = newRenameEntry.length;\n\n\t\tlet result: RangeQueryResult<DetachedNodeEntry | undefined>;\n\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\tif (newNodeId !== undefined || newRenameEntry.value !== undefined) {\n\t\t\tresult = {\n\t\t\t\t...newRenameEntry,\n\t\t\t\tvalue: { detachId: newRenameEntry.value, nodeChange: newNodeId },\n\t\t\t};\n\t\t} else {\n\t\t\t// This handles the case where the base changeset has moved these nodes,\n\t\t\t// meaning they were attached in the input context of the base changeset.\n\t\t\tresult = this.table.entries.getFirst(baseAttachId, countToProcess);\n\t\t}\n\n\t\t// TODO: Consider moving these two checks into a separate method so that this function has no side effects.\n\t\tif (result.value?.detachId !== undefined) {\n\t\t\tthis.table.rebasedDetachLocations.set(\n\t\t\t\tresult.value.detachId,\n\t\t\t\tresult.length,\n\t\t\t\tthis.fieldId,\n\t\t\t);\n\t\t}\n\n\t\tif (result.value?.nodeChange !== undefined) {\n\t\t\tsetInChangeAtomIdMap(this.table.rebasedNodeToParent, result.value.nodeChange, {\n\t\t\t\tfield: this.fieldId,\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic rebaseOverDetach(\n\t\tbaseDetachId: ChangeAtomId,\n\t\tcount: number,\n\t\tnewDetachId: ChangeAtomId | undefined,\n\t\tnodeChange: NodeId | undefined,\n\t\tcellRename?: ChangeAtomId,\n\t): void {\n\t\tlet countToProcess = count;\n\t\tconst attachIdEntry = firstAttachIdFromDetachId(\n\t\t\tthis.table.baseRoots,\n\t\t\tbaseDetachId,\n\t\t\tcountToProcess,\n\t\t);\n\t\tconst baseAttachId = attachIdEntry.value;\n\t\tcountToProcess = attachIdEntry.length;\n\n\t\tconst attachFieldEntry = getFirstFieldForCrossFieldKey(\n\t\t\tthis.table.baseChange,\n\t\t\t{ ...baseAttachId, target: CrossFieldTarget.Destination },\n\t\t\tcountToProcess,\n\t\t);\n\t\tcountToProcess = attachFieldEntry.length;\n\n\t\tconst detachedMoveEntry = this.table.baseChange.rootNodes.outputDetachLocations.getFirst(\n\t\t\tbaseDetachId,\n\t\t\tcountToProcess,\n\t\t);\n\t\tcountToProcess = detachedMoveEntry.length;\n\n\t\tconst destinationField = attachFieldEntry.value ?? detachedMoveEntry.value;\n\t\tif (destinationField !== undefined) {\n\t\t\t// The base detach is part of a move (or move of detach location) in the base changeset.\n\t\t\tsetInCrossFieldMap(this.table.entries, baseAttachId, countToProcess, {\n\t\t\t\tnodeChange,\n\t\t\t\tdetachId: newDetachId,\n\t\t\t\tcellRename,\n\t\t\t});\n\n\t\t\tif (nodeChange !== undefined || newDetachId !== undefined) {\n\t\t\t\tthis.invalidateBaseFields([destinationField]);\n\t\t\t}\n\t\t}\n\n\t\tif (attachFieldEntry.value === undefined) {\n\t\t\t// These nodes are detached in the output context of the base changeset.\n\t\t\tif (nodeChange !== undefined) {\n\t\t\t\tassignRootChange(\n\t\t\t\t\tthis.table.rebasedRootNodes,\n\t\t\t\t\tthis.table.rebasedNodeToParent,\n\t\t\t\t\tbaseAttachId,\n\t\t\t\t\tnodeChange,\n\t\t\t\t\tthis.fieldId,\n\t\t\t\t\tthis.table.rebaseVersion,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (newDetachId !== undefined) {\n\t\t\t\taddNodeRename(\n\t\t\t\t\tthis.table.rebasedRootNodes,\n\t\t\t\t\tbaseAttachId,\n\t\t\t\t\tnewDetachId,\n\t\t\t\t\tcountToProcess,\n\t\t\t\t\tthis.fieldId,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (newDetachId !== undefined) {\n\t\t\tthis.table.movedDetaches.set(newDetachId, countToProcess, true);\n\t\t}\n\n\t\tif (countToProcess < count) {\n\t\t\tconst remainingCount = count - countToProcess;\n\n\t\t\tconst nextDetachId =\n\t\t\t\tnewDetachId !== undefined\n\t\t\t\t\t? offsetChangeAtomId(newDetachId, countToProcess)\n\t\t\t\t\t: undefined;\n\n\t\t\tthis.rebaseOverDetach(\n\t\t\t\toffsetChangeAtomId(baseDetachId, countToProcess),\n\t\t\t\tremainingCount,\n\t\t\t\tnextDetachId,\n\t\t\t\tnodeChange,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic addDetach(id: ChangeAtomId, count: number): void {\n\t\tthis.table.rebasedDetachLocations.set(id, count, this.fieldId);\n\t}\n\n\tpublic removeDetach(id: ChangeAtomId, count: number): void {\n\t\tthis.table.movedDetaches.set(id, count, true);\n\t}\n\n\tpublic doesBaseAttachNodes(\n\t\tid: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryEntry<ChangeAtomId, boolean> {\n\t\tlet countToProcess = count;\n\t\tconst attachEntry = getFirstAttachField(\n\t\t\tthis.table.baseChange.crossFieldKeys,\n\t\t\tid,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = attachEntry.length;\n\t\treturn { start: id, value: attachEntry.value !== undefined, length: countToProcess };\n\t}\n\n\tpublic getBaseRename(\n\t\tid: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<ChangeAtomId | undefined> {\n\t\treturn this.table.baseChange.rootNodes.oldToNewId.getFirst(id, count);\n\t}\n\n\tpublic getNewRenameForBaseRename(\n\t\tbaseRenameTo: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<ChangeAtomId | undefined> {\n\t\tlet countToProcess = count;\n\t\tconst inputEntry = firstDetachIdFromAttachId(\n\t\t\tthis.table.baseChange.rootNodes,\n\t\t\tbaseRenameTo,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tconst attachEntry = getFirstAttachField(\n\t\t\tthis.table.baseChange.crossFieldKeys,\n\t\t\tbaseRenameTo,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = attachEntry.length;\n\t\tif (attachEntry.value !== undefined) {\n\t\t\t// These nodes are attached in the output context of the base changeset.\n\t\t\treturn { value: undefined, length: countToProcess };\n\t\t}\n\n\t\tcountToProcess = inputEntry.length;\n\t\tconst inputId = inputEntry.value;\n\n\t\tconst moveEntry = this.table.entries.getFirst(inputId, countToProcess);\n\n\t\tcountToProcess = moveEntry.length;\n\t\tif (moveEntry.value !== undefined) {\n\t\t\treturn { ...moveEntry, value: moveEntry.value.cellRename ?? moveEntry.value.detachId };\n\t\t}\n\n\t\treturn this.table.newChange.rootNodes.oldToNewId.getFirst(inputId, countToProcess);\n\t}\n\n\tprivate invalidateBaseFields(fields: FieldId[]): void {\n\t\tif (this.allowInval) {\n\t\t\tfor (const fieldId of fields) {\n\t\t\t\tthis.table.affectedBaseFields.set(fieldIdKeyFromFieldId(fieldId), true);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assignRootChange(\n\ttable: RootNodeTable,\n\tnodeToParent: ChangeAtomIdBTree<NodeLocation> | undefined,\n\tdetachId: ChangeAtomId,\n\tnodeId: NodeId,\n\tdetachLocation: FieldId | undefined,\n\trebaseVersion: RebaseVersion,\n): void {\n\tassert(\n\t\trebaseVersion >= 2 || detachLocation !== undefined,\n\t\t\"All root changes need a detach location to support compatibility with older client versions\",\n\t);\n\n\tsetInChangeAtomIdMap(table.nodeChanges, detachId, nodeId);\n\n\tif (nodeToParent !== undefined) {\n\t\tsetInChangeAtomIdMap(nodeToParent, nodeId, { root: detachId });\n\t}\n\n\ttable.detachLocations.set(detachId, 1, detachLocation);\n}\n\nclass ComposeNodeManagerI implements ComposeNodeManager {\n\tpublic constructor(\n\t\tprivate readonly table: ComposeTable,\n\t\tprivate readonly fieldId: FieldId,\n\t\tprivate readonly allowInval: boolean = true,\n\t) {}\n\n\tpublic getNewChangesForBaseDetach(\n\t\tbaseDetachId: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<DetachedNodeEntry | undefined> {\n\t\tlet countToProcess = count;\n\n\t\tconst baseAttachEntry = getFirstFieldForCrossFieldKey(\n\t\t\tthis.table.baseChange,\n\t\t\t{ target: CrossFieldTarget.Destination, ...baseDetachId },\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = baseAttachEntry.length;\n\n\t\tlet result: RangeQueryResult<DetachedNodeEntry | undefined>;\n\t\tif (baseAttachEntry.value !== undefined) {\n\t\t\t// The base detach was part of a move.\n\t\t\t// We check if we've previously seen a node change at the move destination.\n\t\t\tconst entry = this.table.entries.getFirst(baseDetachId, countToProcess);\n\t\t\tresult = { value: entry.value, length: entry.length };\n\t\t} else {\n\t\t\t// The detached nodes are still detached in the new change's input context.\n\t\t\tconst rootEntry = rangeQueryChangeAtomIdMap(\n\t\t\t\tthis.table.newChange.rootNodes.nodeChanges,\n\t\t\t\tbaseDetachId,\n\t\t\t\tcountToProcess,\n\t\t\t);\n\n\t\t\tcountToProcess = rootEntry.length;\n\n\t\t\tconst newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(\n\t\t\t\tbaseDetachId,\n\t\t\t\tcountToProcess,\n\t\t\t);\n\n\t\t\tcountToProcess = newRenameEntry.length;\n\n\t\t\tresult = {\n\t\t\t\tvalue: { nodeChange: rootEntry.value, detachId: newRenameEntry.value },\n\t\t\t\tlength: countToProcess,\n\t\t\t};\n\t\t}\n\n\t\t// TODO: Consider moving this to a separate method so that this method can be side-effect free.\n\t\tif (result.value?.nodeChange !== undefined) {\n\t\t\tsetInChangeAtomIdMap(this.table.movedNodeToParent, result.value.nodeChange, {\n\t\t\t\tfield: this.fieldId,\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic composeAttachDetach(\n\t\tbaseAttachId: ChangeAtomId,\n\t\tnewDetachId: ChangeAtomId,\n\t\tcount: number,\n\t): void {\n\t\tlet countToProcess = count;\n\n\t\tconst newAttachEntry = getFirstAttachField(\n\t\t\tthis.table.newChange.crossFieldKeys,\n\t\t\tnewDetachId,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = newAttachEntry.length;\n\n\t\t// Both changes can have the same ID if they came from inverse changesets.\n\t\t// If the new detach is part of a move,\n\t\t// then both input changesets contain the attach cross-field key for this ID.\n\t\t// The new attach may still exist in the composed changeset so we do not remove it here.\n\t\t// The new attach will typically cancel with a base detach,\n\t\t// in which case the cross-field key will be removed in `composeDetachAttach`.\n\t\tconst hasNewAttachWithBaseAttachId =\n\t\t\tareEqualChangeAtomIds(baseAttachId, newDetachId) && newAttachEntry.value !== undefined;\n\n\t\tif (!hasNewAttachWithBaseAttachId) {\n\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t{ ...baseAttachId, target: CrossFieldTarget.Destination },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\tconst baseDetachEntry = getFirstDetachField(\n\t\t\tthis.table.baseChange.crossFieldKeys,\n\t\t\tbaseAttachId,\n\t\t\tcountToProcess,\n\t\t);\n\n\t\tcountToProcess = baseDetachEntry.length;\n\n\t\tconst baseRootIdEntry = firstDetachIdFromAttachId(\n\t\t\tthis.table.baseChange.rootNodes,\n\t\t\tbaseAttachId,\n\t\t\tcountToProcess,\n\t\t);\n\t\tcountToProcess = baseRootIdEntry.length;\n\n\t\tconst baseDetachId = baseRootIdEntry.value;\n\n\t\tif (baseDetachEntry.value !== undefined) {\n\t\t\t// The base change moves these nodes.\n\t\t\tconst prevEntry =\n\t\t\t\tthis.table.entries.getFirst(baseAttachId, baseDetachEntry.length).value ?? {};\n\n\t\t\tthis.table.entries.set(baseAttachId, baseDetachEntry.length, {\n\t\t\t\t...prevEntry,\n\t\t\t\tdetachId: newDetachId,\n\t\t\t});\n\n\t\t\t// The new detach will replace the base detach, so we remove the key for the base detach, unless they have the same ID.\n\t\t\tif (!areEqualChangeAtomIds(baseAttachId, newDetachId)) {\n\t\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t\t{ ...baseAttachId, target: CrossFieldTarget.Source },\n\t\t\t\t\tcountToProcess,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.table.movedCrossFieldKeys.set(\n\t\t\t\t{ ...newDetachId, target: CrossFieldTarget.Source },\n\t\t\t\tcountToProcess,\n\t\t\t\tbaseDetachEntry.value,\n\t\t\t);\n\n\t\t\tthis.invalidateBaseFields([baseDetachEntry.value]);\n\t\t} else {\n\t\t\tconst baseDetachLocationEntry = this.table.baseChange.rootNodes.detachLocations.getFirst(\n\t\t\t\tbaseDetachId,\n\t\t\t\tcountToProcess,\n\t\t\t);\n\t\t\tcountToProcess = baseDetachLocationEntry.length;\n\n\t\t\t// These nodes were detached in the base change's input context,\n\t\t\t// so the net effect of the two changes is a rename.\n\t\t\tappendNodeRename(\n\t\t\t\tthis.table.composedRootNodes,\n\t\t\t\tbaseAttachId,\n\t\t\t\tnewDetachId,\n\t\t\t\tbaseDetachEntry.length,\n\t\t\t\tthis.table.baseChange.rootNodes,\n\t\t\t\tbaseDetachLocationEntry.value ?? this.fieldId,\n\t\t\t);\n\n\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t{ ...newDetachId, target: CrossFieldTarget.Source },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\tif (newAttachEntry.value === undefined) {\n\t\t\tconst newOutputDetachLocationEntry =\n\t\t\t\tthis.table.newChange.rootNodes.outputDetachLocations.getFirst(\n\t\t\t\t\tnewDetachId,\n\t\t\t\t\tcountToProcess,\n\t\t\t\t);\n\n\t\t\tcountToProcess = newOutputDetachLocationEntry.length;\n\n\t\t\tthis.table.composedRootNodes.outputDetachLocations.set(\n\t\t\t\tnewDetachId,\n\t\t\t\tcountToProcess,\n\t\t\t\tnewOutputDetachLocationEntry.value ?? this.fieldId,\n\t\t\t);\n\t\t}\n\n\t\tif (countToProcess < count) {\n\t\t\tconst remainingCount = count - countToProcess;\n\t\t\tthis.composeAttachDetach(\n\t\t\t\toffsetChangeAtomId(baseAttachId, countToProcess),\n\t\t\t\toffsetChangeAtomId(newDetachId, countToProcess),\n\t\t\t\tremainingCount,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic sendNewChangesToBaseSourceLocation(\n\t\tbaseAttachId: ChangeAtomId,\n\t\tnewChanges: NodeId,\n\t): void {\n\t\tconst { value: baseDetachId } = firstDetachIdFromAttachId(\n\t\t\tthis.table.baseChange.rootNodes,\n\t\t\tbaseAttachId,\n\t\t\t1,\n\t\t);\n\n\t\tconst detachFields = getFieldsForCrossFieldKey(\n\t\t\tthis.table.baseChange,\n\t\t\t{\n\t\t\t\t...baseDetachId,\n\t\t\t\ttarget: CrossFieldTarget.Source,\n\t\t\t},\n\t\t\t1,\n\t\t);\n\n\t\tif (detachFields.length > 0) {\n\t\t\t// The base attach is part of a move in the base changeset.\n\t\t\tconst prevEntry = this.table.entries.getFirst(baseDetachId, 1).value ?? {};\n\t\t\tthis.table.entries.set(baseDetachId, 1, { ...prevEntry, nodeChange: newChanges });\n\n\t\t\tif (newChanges !== undefined) {\n\t\t\t\tthis.invalidateBaseFields(detachFields);\n\t\t\t}\n\t\t} else {\n\t\t\tconst baseNodeId = getFromChangeAtomIdMap(\n\t\t\t\tthis.table.baseChange.rootNodes.nodeChanges,\n\t\t\t\tbaseDetachId,\n\t\t\t);\n\n\t\t\tif (baseNodeId !== undefined) {\n\t\t\t\taddNodesToCompose(this.table, baseNodeId, newChanges);\n\t\t\t} else {\n\t\t\t\tassignRootChange(\n\t\t\t\t\tthis.table.composedRootNodes,\n\t\t\t\t\tthis.table.movedNodeToParent,\n\t\t\t\t\tbaseDetachId,\n\t\t\t\t\tnewChanges,\n\t\t\t\t\tthis.fieldId,\n\t\t\t\t\tthis.table.rebaseVersion,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate areSameNodes(\n\t\tbaseDetachId: ChangeAtomId,\n\t\tnewAttachId: ChangeAtomId,\n\t\tcount: number,\n\t): RangeQueryResult<boolean> {\n\t\tconst renamedDetachEntry = firstAttachIdFromDetachId(\n\t\t\tthis.table.composedRootNodes,\n\t\t\tbaseDetachId,\n\t\t\tcount,\n\t\t);\n\n\t\tconst isReattachOfSameNodes = areEqualChangeAtomIds(renamedDetachEntry.value, newAttachId);\n\t\treturn { ...renamedDetachEntry, value: isReattachOfSameNodes };\n\t}\n\n\tpublic composeDetachAttach(\n\t\tbaseDetachId: ChangeAtomId,\n\t\tnewAttachId: ChangeAtomId,\n\t\tcount: number,\n\t\tcomposeToPin: boolean,\n\t): void {\n\t\tconst areSameEntry = this.areSameNodes(baseDetachId, newAttachId, count);\n\n\t\tconst countToProcess = areSameEntry.length;\n\t\tif (areSameEntry.value) {\n\t\t\t// These nodes have been moved back to their original location, so the composed changeset should not have any renames for them.\n\t\t\t// Note that deleting the rename from `this.table.composedRootNodes` would change the result of this method\n\t\t\t// if it were rerun due to the field being invalidated, so we instead record that the rename should be deleted later.\n\t\t\tthis.table.renamesToDelete.set(baseDetachId, countToProcess, true);\n\t\t}\n\n\t\tif (composeToPin) {\n\t\t\tthis.table.movedCrossFieldKeys.set(\n\t\t\t\t{ target: CrossFieldTarget.Source, ...newAttachId },\n\t\t\t\tcountToProcess,\n\t\t\t\tthis.fieldId,\n\t\t\t);\n\n\t\t\tif (!areEqualChangeAtomIds(baseDetachId, newAttachId)) {\n\t\t\t\t// The pin will have `newAttachId` as both its detach and attach ID.\n\t\t\t\t// So we remove `baseDetachId` unless that is equal to the pin's detach ID.\n\t\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t\t{ target: CrossFieldTarget.Source, ...baseDetachId },\n\t\t\t\t\tcountToProcess,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Note that while change2 should already have this key, change1 may have a rollback for the same ID in a different location.\n\t\t\t// In that case, change1's attach should be canceled out by a detach from change2.\n\t\t\t// Here we make sure that the composed change has the correct location (this field) for the attach ID.\n\t\t\tthis.table.movedCrossFieldKeys.set(\n\t\t\t\t{ target: CrossFieldTarget.Destination, ...newAttachId },\n\t\t\t\tcountToProcess,\n\t\t\t\tthis.fieldId,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t{ target: CrossFieldTarget.Source, ...baseDetachId },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tthis.table.removedCrossFieldKeys.set(\n\t\t\t\t{ target: CrossFieldTarget.Destination, ...newAttachId },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\tif (countToProcess < count) {\n\t\t\tthis.composeAttachDetach(\n\t\t\t\toffsetChangeAtomId(baseDetachId, countToProcess),\n\t\t\t\toffsetChangeAtomId(newAttachId, countToProcess),\n\t\t\t\tcount - countToProcess,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate invalidateBaseFields(fields: FieldId[]): void {\n\t\tif (this.allowInval) {\n\t\t\tfor (const fieldId of fields) {\n\t\t\t\tthis.table.pendingCompositions.affectedBaseFields.set(\n\t\t\t\t\tfieldIdKeyFromFieldId(fieldId),\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction makeModularChangeset(\n\tprops: {\n\t\trebaseVersion?: RebaseVersion;\n\t\tfieldChanges?: FieldChangeMap;\n\t\tnodeChanges?: ChangeAtomIdBTree<NodeChangeset>;\n\t\trootNodes?: RootNodeTable;\n\t\tnodeToParent?: ChangeAtomIdBTree<NodeLocation>;\n\t\tnodeAliases?: ChangeAtomIdBTree<NodeId>;\n\t\tcrossFieldKeys?: CrossFieldKeyTable;\n\t\tmaxId: number;\n\t\trevisions?: readonly RevisionInfo[];\n\t\tconstraintViolationCount?: number;\n\t\tconstraintViolationCountOnRevert?: number;\n\t\tbuilds?: ChangeAtomIdBTree<TreeChunk>;\n\t\tdestroys?: ChangeAtomIdBTree<number>;\n\t\trefreshers?: ChangeAtomIdBTree<TreeChunk>;\n\t} = {\n\t\tmaxId: -1,\n\t},\n): ModularChangeset {\n\tconst changeset: Mutable<ModularChangeset> = {\n\t\trebaseVersion: props.rebaseVersion ?? 1,\n\t\tfieldChanges: props.fieldChanges ?? new Map(),\n\t\tnodeChanges: props.nodeChanges ?? newTupleBTree(),\n\t\trootNodes: props.rootNodes ?? newRootTable(),\n\t\tnodeToParent: props.nodeToParent ?? newTupleBTree(),\n\t\tnodeAliases: props.nodeAliases ?? newTupleBTree(),\n\t\tcrossFieldKeys: props.crossFieldKeys ?? newCrossFieldRangeTable(),\n\t};\n\n\tif (props.revisions !== undefined && props.revisions.length > 0) {\n\t\tchangeset.revisions = props.revisions;\n\t}\n\tif (props.maxId >= 0) {\n\t\tchangeset.maxId = brand(props.maxId);\n\t}\n\tif (props.constraintViolationCount !== undefined && props.constraintViolationCount > 0) {\n\t\tchangeset.constraintViolationCount = props.constraintViolationCount;\n\t}\n\tif (\n\t\tprops.constraintViolationCountOnRevert !== undefined &&\n\t\tprops.constraintViolationCountOnRevert > 0\n\t) {\n\t\tchangeset.constraintViolationCountOnRevert = props.constraintViolationCountOnRevert;\n\t}\n\tif (props.builds !== undefined && props.builds.size > 0) {\n\t\tchangeset.builds = props.builds;\n\t}\n\tif (props.destroys !== undefined && props.destroys.size > 0) {\n\t\tchangeset.destroys = props.destroys;\n\t}\n\tif (props.refreshers !== undefined && props.refreshers.size > 0) {\n\t\tchangeset.refreshers = props.refreshers;\n\t}\n\n\treturn changeset;\n}\n\nexport class ModularEditBuilder extends EditBuilder<ModularChangeset> {\n\tprivate transactionDepth: number = 0;\n\tprivate idAllocator: IdAllocator;\n\n\tpublic constructor(\n\t\tfamily: ChangeFamily<ChangeFamilyEditor, ModularChangeset>,\n\t\tprivate readonly fieldKinds: ReadonlyMap<FieldKindIdentifier, FlexFieldKind>,\n\t\tchangeReceiver: (change: TaggedChange<ModularChangeset>) => void,\n\t) {\n\t\tsuper(family, changeReceiver);\n\t\tthis.idAllocator = idAllocatorFromMaxId();\n\t}\n\n\tpublic isInTransaction(): boolean {\n\t\treturn this.transactionDepth > 0;\n\t}\n\n\tpublic override enterTransaction(): void {\n\t\tthis.transactionDepth += 1;\n\t\tif (this.transactionDepth === 1) {\n\t\t\tthis.idAllocator = idAllocatorFromMaxId();\n\t\t}\n\t}\n\n\tpublic override exitTransaction(): void {\n\t\tassert(this.transactionDepth > 0, 0x5b9 /* Cannot exit inexistent transaction */);\n\t\tthis.transactionDepth -= 1;\n\t\tif (this.transactionDepth === 0) {\n\t\t\tthis.idAllocator = idAllocatorFromMaxId();\n\t\t}\n\t}\n\n\t/**\n\t * Builds a new tree to use in an edit.\n\t *\n\t * @param firstId - The ID to associate with the first node\n\t * @param content - The node(s) to build.\n\t * @param revision - The revision to use for the build.\n\t * @returns A description of the edit that can be passed to `submitChanges`.\n\t * The returned object may contain an owning reference to the given TreeChunk.\n\t */\n\tpublic buildTrees(\n\t\tfirstId: ChangesetLocalId,\n\t\tcontent: TreeChunk,\n\t\trevision: RevisionTag,\n\t): GlobalEditDescription {\n\t\tif (content.topLevelLength === 0) {\n\t\t\treturn { type: \"global\", revision };\n\t\t}\n\n\t\t// This content will be added to a GlobalEditDescription whose lifetime exceeds the scope of this function.\n\t\tcontent.referenceAdded();\n\n\t\tconst builds: ChangeAtomIdBTree<TreeChunk> = newTupleBTree();\n\t\tbuilds.set([revision, firstId], content);\n\n\t\treturn {\n\t\t\ttype: \"global\",\n\t\t\tbuilds,\n\t\t\trevision,\n\t\t};\n\t}\n\n\t/**\n\t * Adds a change to the edit builder\n\t * @param field - the field which is being edited\n\t * @param fieldKind - the kind of the field\n\t * @param change - the change to the field\n\t * @param revision - the revision of the change\n\t */\n\tpublic submitChange(\n\t\tfield: NormalizedFieldUpPath,\n\t\tfieldKind: FieldKindIdentifier,\n\t\tchange: FieldChangeset,\n\t\trevision: RevisionTag,\n\t): void {\n\t\tconst localCrossFieldKeys = getChangeHandler(this.fieldKinds, fieldKind).getCrossFieldKeys(\n\t\t\tchange,\n\t\t);\n\n\t\tconst modularChange = buildModularChangesetFromField({\n\t\t\tpath: field,\n\t\t\tfieldChange: { fieldKind, change },\n\t\t\tnodeChanges: newTupleBTree(),\n\t\t\tnodeToParent: newTupleBTree(),\n\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\trootNodes: newRootTable(),\n\t\t\tidAllocator: this.idAllocator,\n\t\t\tlocalCrossFieldKeys,\n\t\t\trevision,\n\t\t});\n\t\tthis.applyChange(tagChange(modularChange, revision));\n\t}\n\n\tpublic submitChanges(changes: EditDescription[], revision: RevisionTag): void {\n\t\tconst modularChange = this.buildChanges(changes);\n\t\tthis.applyChange(tagChange(modularChange, revision));\n\t}\n\n\tpublic buildChanges(changes: EditDescription[]): ModularChangeset {\n\t\tconst revisions: Set<RevisionTag> = new Set();\n\t\tconst changeMaps = changes.map((change) => {\n\t\t\trevisions.add(change.revision);\n\t\t\treturn makeAnonChange(\n\t\t\t\tchange.type === \"global\"\n\t\t\t\t\t? makeModularChangeset({\n\t\t\t\t\t\t\tmaxId: this.idAllocator.getMaxId(),\n\t\t\t\t\t\t\tbuilds: change.builds,\n\t\t\t\t\t\t\trootNodes: renameTableFromRenameDescriptions(change.renames ?? []),\n\t\t\t\t\t\t\trevisions: [{ revision: change.revision }],\n\t\t\t\t\t\t})\n\t\t\t\t\t: buildModularChangesetFromField({\n\t\t\t\t\t\t\tpath: change.field,\n\t\t\t\t\t\t\tfieldChange: {\n\t\t\t\t\t\t\t\tfieldKind: change.fieldKind,\n\t\t\t\t\t\t\t\tchange: change.change,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnodeChanges: newTupleBTree(),\n\t\t\t\t\t\t\tnodeToParent: newTupleBTree(),\n\t\t\t\t\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\t\t\t\t\trootNodes: newRootTable(),\n\t\t\t\t\t\t\tidAllocator: this.idAllocator,\n\t\t\t\t\t\t\tlocalCrossFieldKeys: getChangeHandler(\n\t\t\t\t\t\t\t\tthis.fieldKinds,\n\t\t\t\t\t\t\t\tchange.fieldKind,\n\t\t\t\t\t\t\t).getCrossFieldKeys(change.change),\n\t\t\t\t\t\t\trevision: change.revision,\n\t\t\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t\tconst revInfo = Array.from(revisions).map((revision) => ({ revision }));\n\t\tconst composedChange: Mutable<ModularChangeset> = {\n\t\t\t...this.changeFamily.rebaser.compose(changeMaps),\n\t\t\trevisions: revInfo,\n\t\t};\n\n\t\tconst maxId: ChangesetLocalId = brand(this.idAllocator.getMaxId());\n\t\tif (maxId >= 0) {\n\t\t\tcomposedChange.maxId = maxId;\n\t\t}\n\t\treturn composedChange;\n\t}\n\n\tpublic generateId(count?: number): ChangesetLocalId {\n\t\treturn brand(this.idAllocator.allocate(count));\n\t}\n\n\tpublic addNodeExistsConstraint(path: NormalizedUpPath, revision: RevisionTag): void {\n\t\tconst nodeChange: NodeChangeset = {\n\t\t\tnodeExistsConstraint: { violated: false },\n\t\t};\n\n\t\tthis.applyChange(\n\t\t\ttagChange(\n\t\t\t\tbuildModularChangesetFromNode({\n\t\t\t\t\tpath,\n\t\t\t\t\tnodeChange,\n\t\t\t\t\tnodeChanges: newTupleBTree(),\n\t\t\t\t\tnodeToParent: newTupleBTree(),\n\t\t\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\t\t\trootNodes: newRootTable(),\n\t\t\t\t\tidAllocator: this.idAllocator,\n\t\t\t\t\trevision,\n\t\t\t\t}),\n\t\t\t\trevision,\n\t\t\t),\n\t\t);\n\t}\n\n\tpublic addNodeExistsConstraintOnRevert(path: NormalizedUpPath, revision: RevisionTag): void {\n\t\tconst nodeChange: NodeChangeset = {\n\t\t\tnodeExistsConstraintOnRevert: { violated: false },\n\t\t};\n\n\t\tthis.applyChange(\n\t\t\ttagChange(\n\t\t\t\tbuildModularChangesetFromNode({\n\t\t\t\t\tpath,\n\t\t\t\t\tnodeChange,\n\t\t\t\t\tnodeChanges: newTupleBTree(),\n\t\t\t\t\tnodeToParent: newTupleBTree(),\n\t\t\t\t\tcrossFieldKeys: newCrossFieldRangeTable(),\n\t\t\t\t\trootNodes: newRootTable(),\n\t\t\t\t\tidAllocator: this.idAllocator,\n\t\t\t\t\trevision,\n\t\t\t\t}),\n\t\t\t\trevision,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport function buildModularChangesetFromField(props: {\n\tpath: NormalizedFieldUpPath;\n\tfieldChange: FieldChange;\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>;\n\tnodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\tcrossFieldKeys: CrossFieldKeyTable;\n\trootNodes: RootNodeTable;\n\tlocalCrossFieldKeys?: CrossFieldKeyRange[];\n\trevision: RevisionTag;\n\tidAllocator?: IdAllocator;\n\tchildId?: NodeId;\n}): ModularChangeset {\n\tconst {\n\t\tpath,\n\t\tfieldChange,\n\t\tnodeChanges,\n\t\tnodeToParent,\n\t\tcrossFieldKeys,\n\t\trootNodes,\n\t\tidAllocator = idAllocatorFromMaxId(),\n\t\tlocalCrossFieldKeys = [],\n\t\tchildId,\n\t\trevision,\n\t} = props;\n\tconst fieldChanges: FieldChangeMap = new Map([[path.field, fieldChange]]);\n\n\tif (path.parent === undefined) {\n\t\tconst field = { nodeId: undefined, field: path.field };\n\t\tfor (const { key, count } of localCrossFieldKeys) {\n\t\t\tcrossFieldKeys.set(key, count, field);\n\t\t}\n\n\t\tif (childId !== undefined) {\n\t\t\tsetInChangeAtomIdMap(nodeToParent, childId, {\n\t\t\t\tfield: {\n\t\t\t\t\tnodeId: undefined,\n\t\t\t\t\tfield: path.field,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn makeModularChangeset({\n\t\t\tfieldChanges,\n\t\t\tnodeChanges,\n\t\t\tnodeToParent,\n\t\t\tcrossFieldKeys,\n\t\t\trootNodes,\n\t\t\tmaxId: idAllocator.getMaxId(),\n\t\t\trevisions: [{ revision }],\n\t\t});\n\t}\n\n\tconst nodeChangeset: NodeChangeset = {\n\t\tfieldChanges,\n\t};\n\n\tconst parentId: NodeId = { localId: brand(idAllocator.allocate()), revision };\n\tconst fieldId = { nodeId: parentId, field: path.field };\n\n\tfor (const { key, count } of localCrossFieldKeys) {\n\t\tcrossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });\n\t}\n\n\tif (childId !== undefined) {\n\t\tsetInChangeAtomIdMap(nodeToParent, childId, {\n\t\t\tfield: fieldId,\n\t\t});\n\t}\n\n\treturn buildModularChangesetFromNode({\n\t\tpath: path.parent,\n\t\tnodeChange: nodeChangeset,\n\t\tnodeChanges,\n\t\tnodeToParent,\n\t\tcrossFieldKeys,\n\t\trootNodes,\n\t\tidAllocator,\n\t\trevision,\n\t\tnodeId: parentId,\n\t});\n}\n\nfunction buildModularChangesetFromNode(props: {\n\tpath: NormalizedUpPath;\n\tnodeChange: NodeChangeset;\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>;\n\tnodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\tcrossFieldKeys: CrossFieldKeyTable;\n\trootNodes: RootNodeTable;\n\tidAllocator: IdAllocator;\n\trevision: RevisionTag;\n\tnodeId?: NodeId;\n}): ModularChangeset {\n\tconst {\n\t\tpath,\n\t\tnodeId = { localId: brand(props.idAllocator.allocate()), revision: props.revision },\n\t} = props;\n\tsetInChangeAtomIdMap(props.nodeChanges, nodeId, props.nodeChange);\n\n\tif (isDetachedUpPathRoot(path)) {\n\t\tprops.rootNodes.nodeChanges.set(\n\t\t\t[path.detachedNodeId.major, brand(path.detachedNodeId.minor)],\n\t\t\tnodeId,\n\t\t);\n\t\treturn makeModularChangeset({\n\t\t\trootNodes: props.rootNodes,\n\t\t\tnodeChanges: props.nodeChanges,\n\t\t\tnodeToParent: props.nodeToParent,\n\t\t\tcrossFieldKeys: props.crossFieldKeys,\n\t\t\tmaxId: props.idAllocator.getMaxId(),\n\t\t\trevisions: [{ revision: props.revision }],\n\t\t});\n\t} else {\n\t\tconst fieldChangeset = genericFieldKind.changeHandler.editor.buildChildChanges([\n\t\t\t[path.parentIndex, nodeId],\n\t\t]);\n\n\t\tconst fieldChange: FieldChange = {\n\t\t\tfieldKind: genericFieldKind.identifier,\n\t\t\tchange: fieldChangeset,\n\t\t};\n\n\t\treturn buildModularChangesetFromField({\n\t\t\t...props,\n\t\t\tpath: { parent: path.parent, field: path.parentField },\n\t\t\tfieldChange,\n\t\t\tlocalCrossFieldKeys: [],\n\t\t\tchildId: nodeId,\n\t\t});\n\t}\n}\n\nexport interface FieldEditDescription {\n\ttype: \"field\";\n\tfield: NormalizedFieldUpPath;\n\tfieldKind: FieldKindIdentifier;\n\tchange: FieldChangeset;\n\trevision: RevisionTag;\n}\n\nexport interface GlobalEditDescription {\n\ttype: \"global\";\n\trevision: RevisionTag;\n\tbuilds?: ChangeAtomIdBTree<TreeChunk>;\n\trenames?: RenameDescription[];\n}\n\nexport interface RenameDescription {\n\tcount: number;\n\toldId: ChangeAtomId;\n\tnewId: ChangeAtomId;\n\tdetachLocation: FieldId | undefined;\n}\n\nfunction renameTableFromRenameDescriptions(renames: RenameDescription[]): RootNodeTable {\n\tconst table = newRootTable();\n\tfor (const rename of renames) {\n\t\taddNodeRename(table, rename.oldId, rename.newId, rename.count, rename.detachLocation);\n\t}\n\n\treturn table;\n}\n\nexport type EditDescription = FieldEditDescription | GlobalEditDescription;\n\nfunction getRevInfoFromTaggedChanges(changes: TaggedChange<ModularChangeset>[]): {\n\trevInfos: RevisionInfo[];\n\tmaxId: ChangesetLocalId;\n} {\n\tlet maxId = -1;\n\tconst revInfos: RevisionInfo[] = [];\n\tfor (const taggedChange of changes) {\n\t\tconst change = taggedChange.change;\n\t\tmaxId = Math.max(change.maxId ?? -1, maxId);\n\t\trevInfos.push(...revisionInfoFromTaggedChange(taggedChange));\n\t}\n\n\treturn { maxId: brand(maxId), revInfos };\n}\n\nfunction revisionInfoFromTaggedChange(\n\ttaggedChange: TaggedChange<ModularChangeset>,\n): RevisionInfo[] {\n\tconst revInfos: RevisionInfo[] = [];\n\tif (taggedChange.change.revisions !== undefined) {\n\t\trevInfos.push(...taggedChange.change.revisions);\n\t} else if (taggedChange.revision !== undefined) {\n\t\tconst info: Mutable<RevisionInfo> = { revision: taggedChange.revision };\n\t\tif (taggedChange.rollbackOf !== undefined) {\n\t\t\tinfo.rollbackOf = taggedChange.rollbackOf;\n\t\t}\n\t\trevInfos.push(info);\n\t}\n\treturn revInfos;\n}\n\nfunction fieldChangeFromId(change: ModularChangeset, id: FieldId): FieldChange {\n\tconst fieldId = normalizeFieldId(id, change.nodeAliases);\n\tconst fieldMap = fieldMapFromNodeId(\n\t\tchange.fieldChanges,\n\t\tchange.nodeChanges,\n\t\tchange.nodeAliases,\n\t\tfieldId.nodeId,\n\t);\n\treturn fieldMap.get(id.field) ?? fail(0xb25 /* No field exists for the given ID */);\n}\n\nfunction fieldMapFromNodeId(\n\trootFieldMap: FieldChangeMap,\n\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\taliases: ChangeAtomIdBTree<NodeId>,\n\tnodeId: NodeId | undefined,\n): FieldChangeMap {\n\tif (nodeId === undefined) {\n\t\treturn rootFieldMap;\n\t}\n\n\tconst node = nodeChangeFromId(nodes, aliases, nodeId);\n\tassert(node.fieldChanges !== undefined, 0x9c9 /* Expected node to have field changes */);\n\treturn node.fieldChanges;\n}\n\nfunction rebasedFieldIdFromBaseId(table: RebaseTable, baseId: FieldId): FieldId {\n\tif (baseId.nodeId === undefined) {\n\t\treturn baseId;\n\t}\n\n\treturn { ...baseId, nodeId: rebasedNodeIdFromBaseNodeId(table, baseId.nodeId) };\n}\n\nfunction rebasedNodeIdFromBaseNodeId(table: RebaseTable, baseId: NodeId): NodeId {\n\treturn getFromChangeAtomIdMap(table.baseToRebasedNodeId, baseId) ?? baseId;\n}\n\nfunction nodeChangeFromId(\n\tnodes: ChangeAtomIdBTree<NodeChangeset>,\n\taliases: ChangeAtomIdBTree<NodeId>,\n\tid: NodeId,\n): NodeChangeset {\n\tconst normalizedId = normalizeNodeId(id, aliases);\n\tconst node = getFromChangeAtomIdMap(nodes, normalizedId);\n\tassert(node !== undefined, 0x9ca /* Unknown node ID */);\n\treturn node;\n}\n\nfunction fieldIdFromFieldIdKey([revision, localId, field]: FieldIdKey): FieldId {\n\tconst nodeId = localId !== undefined ? { revision, localId } : undefined;\n\treturn { nodeId, field };\n}\n\nfunction fieldIdKeyFromFieldId(fieldId: FieldId): FieldIdKey {\n\treturn [fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field];\n}\n\nfunction cloneNodeChangeset(nodeChangeset: NodeChangeset): NodeChangeset {\n\tif (nodeChangeset.fieldChanges !== undefined) {\n\t\treturn { ...nodeChangeset, fieldChanges: new Map(nodeChangeset.fieldChanges) };\n\t}\n\n\treturn { ...nodeChangeset };\n}\n\nfunction replaceNodeLocationRevision(\n\tlocation: NodeLocation,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): NodeLocation {\n\treturn location.field !== undefined\n\t\t? { field: replaceFieldIdRevision(location.field, oldRevisions, newRevision) }\n\t\t: { root: replaceAtomRevisions(location.root, oldRevisions, newRevision) };\n}\n\nfunction replaceFieldIdRevision(\n\tfieldId: FieldId,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): FieldId {\n\tif (fieldId.nodeId === undefined) {\n\t\treturn fieldId;\n\t}\n\n\treturn {\n\t\t...fieldId,\n\t\tnodeId: replaceAtomRevisions(fieldId.nodeId, oldRevisions, newRevision),\n\t};\n}\n\nexport function getNodeParent(changeset: ModularChangeset, nodeId: NodeId): NodeLocation {\n\tconst normalizedNodeId = normalizeNodeId(nodeId, changeset.nodeAliases);\n\tconst location = getFromChangeAtomIdMap(changeset.nodeToParent, normalizedNodeId);\n\tassert(location !== undefined, 0x9cb /* Parent field should be defined */);\n\n\tif (location.field !== undefined) {\n\t\treturn { field: normalizeFieldId(location.field, changeset.nodeAliases) };\n\t}\n\n\treturn location;\n}\n\nfunction getFieldsForCrossFieldKey(\n\tchangeset: ModularChangeset,\n\tkey: CrossFieldKey,\n\tcount: number,\n): FieldId[] {\n\treturn changeset.crossFieldKeys\n\t\t.getAll(key, count)\n\t\t.map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));\n}\n\nfunction getFirstFieldForCrossFieldKey(\n\tchangeset: ModularChangeset,\n\tkey: CrossFieldKey,\n\tcount: number,\n): RangeQueryResult<FieldId | undefined> {\n\tconst result = changeset.crossFieldKeys.getFirst(key, count);\n\tif (result.value === undefined) {\n\t\treturn result;\n\t}\n\n\treturn { ...result, value: normalizeFieldId(result.value, changeset.nodeAliases) };\n}\n\nfunction normalizeNodeLocation(\n\tlocation: NodeLocation,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): NodeLocation {\n\tif (location.field !== undefined) {\n\t\treturn { field: normalizeFieldId(location.field, nodeAliases) };\n\t}\n\n\treturn location;\n}\n\n// This is only exported for use in test utilities.\nexport function normalizeFieldId(\n\tfieldId: FieldId,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): FieldId {\n\treturn fieldId.nodeId !== undefined\n\t\t? { ...fieldId, nodeId: normalizeNodeId(fieldId.nodeId, nodeAliases) }\n\t\t: fieldId;\n}\n\n/**\n * @returns The canonical form of nodeId, according to nodeAliases\n */\nexport function normalizeNodeId(\n\tnodeId: NodeId,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): NodeId {\n\tlet currentId = nodeId;\n\tlet cycleProbeId: NodeId | undefined = nodeId;\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst dealiased = getFromChangeAtomIdMap(nodeAliases, currentId);\n\t\tif (dealiased === undefined) {\n\t\t\treturn currentId;\n\t\t}\n\n\t\tcurrentId = dealiased;\n\n\t\tif (cycleProbeId !== undefined) {\n\t\t\tcycleProbeId = getFromChangeAtomIdMap(nodeAliases, cycleProbeId);\n\t\t}\n\n\t\tif (cycleProbeId !== undefined) {\n\t\t\tcycleProbeId = getFromChangeAtomIdMap(nodeAliases, cycleProbeId);\n\t\t}\n\n\t\tassert(!areEqualChangeAtomIdOpts(cycleProbeId, currentId), \"Alias cycle detected\");\n\t}\n}\n\nfunction hasConflicts(change: ModularChangeset): boolean {\n\treturn (change.constraintViolationCount ?? 0) > 0;\n}\n\ninterface ModularChangesetContent {\n\tfieldChanges: FieldChangeMap;\n\tnodeChanges: ChangeAtomIdBTree<NodeChangeset>;\n\tnodeToParent: ChangeAtomIdBTree<NodeLocation>;\n\trootNodes: RootNodeTable;\n\tnodeAliases: ChangeAtomIdBTree<NodeId>;\n\tcrossFieldKeys: CrossFieldKeyTable;\n}\n\nfunction areEqualFieldIds(a: FieldId, b: FieldId): boolean {\n\treturn areEqualChangeAtomIdOpts(a.nodeId, b.nodeId) && a.field === b.field;\n}\n\nfunction firstAttachIdFromDetachId(\n\troots: RootNodeTable,\n\tdetachId: ChangeAtomId,\n\tcount: number,\n): RangeQueryResult<ChangeAtomId> {\n\tconst result = roots.oldToNewId.getFirst(detachId, count);\n\treturn { ...result, value: result.value ?? detachId };\n}\n\nfunction firstDetachIdFromAttachId(\n\troots: RootNodeTable,\n\tattachId: ChangeAtomId,\n\tcount: number,\n): RangeQueryEntry<ChangeAtomId, ChangeAtomId> {\n\tconst result = roots.newToOldId.getFirst(attachId, count);\n\treturn { ...result, start: attachId, value: result.value ?? attachId };\n}\n\nfunction rebaseCrossFieldKeys(\n\tsourceTable: CrossFieldKeyTable,\n\tmovedDetaches: ChangeAtomIdRangeMap<boolean>,\n\tnewDetachLocations: ChangeAtomIdRangeMap<FieldId>,\n): CrossFieldKeyTable {\n\tconst rebasedTable = sourceTable.clone();\n\tfor (const entry of movedDetaches.entries()) {\n\t\trebasedTable.delete({ ...entry.start, target: CrossFieldTarget.Source }, entry.length);\n\t}\n\n\tfor (const entry of newDetachLocations.entries()) {\n\t\trebasedTable.set(\n\t\t\t{ ...entry.start, target: CrossFieldTarget.Source },\n\t\t\tentry.length,\n\t\t\tentry.value,\n\t\t);\n\t}\n\n\treturn rebasedTable;\n}\n\nexport function newRootTable(): RootNodeTable {\n\treturn {\n\t\tnewToOldId: newChangeAtomIdTransform(),\n\t\toldToNewId: newChangeAtomIdTransform(),\n\t\tnodeChanges: newTupleBTree(),\n\t\tdetachLocations: newChangeAtomIdRangeMap(),\n\t\toutputDetachLocations: newChangeAtomIdRangeMap(),\n\t};\n}\n\nfunction rebaseRoots(\n\tchange: ModularChangeset,\n\tbase: ModularChangeset,\n\taffectedBaseFields: TupleBTree<FieldIdKey, boolean>,\n\tnodesToRebase: [newChangeset: NodeId, baseChangeset: NodeId][],\n\trebasedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\trebaseVersion: RebaseVersion,\n): RootNodeTable {\n\tconst rebasedRoots = newRootTable();\n\tfor (const renameEntry of change.rootNodes.oldToNewId.entries()) {\n\t\trebaseRename(change.rootNodes, rebasedRoots, renameEntry, base, affectedBaseFields);\n\t}\n\n\tfor (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {\n\t\tconst changes = base.rootNodes.nodeChanges.get(detachIdKey);\n\t\tif (changes !== undefined) {\n\t\t\tnodesToRebase.push([nodeId, changes]);\n\t\t}\n\n\t\tconst detachId = makeChangeAtomId(detachIdKey[1], detachIdKey[0]);\n\t\tconst attachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;\n\t\tconst baseAttachEntry = base.crossFieldKeys.getFirst(\n\t\t\t{ target: CrossFieldTarget.Destination, ...attachId },\n\t\t\t1,\n\t\t);\n\t\tif (baseAttachEntry.value !== undefined) {\n\t\t\taffectedBaseFields.set(fieldIdKeyFromFieldId(baseAttachEntry.value), true);\n\t\t\trebasedNodeToParent.delete(detachIdKey);\n\t\t} else {\n\t\t\tconst renamedDetachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;\n\t\t\tconst baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(\n\t\t\t\trenamedDetachId,\n\t\t\t\t1,\n\t\t\t).value;\n\n\t\t\tif (baseOutputDetachLocation !== undefined) {\n\t\t\t\taffectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);\n\t\t\t}\n\n\t\t\tconst detachLocation =\n\t\t\t\tbaseOutputDetachLocation ??\n\t\t\t\tchange.rootNodes.detachLocations.getFirst(detachId, 1).value;\n\n\t\t\t// Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.\n\t\t\t// We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`\n\t\t\tassignRootChange(\n\t\t\t\trebasedRoots,\n\t\t\t\trebasedNodeToParent,\n\t\t\t\trenamedDetachId,\n\t\t\t\tnodeId,\n\t\t\t\tdetachLocation,\n\t\t\t\trebaseVersion,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const entry of change.rootNodes.outputDetachLocations.entries()) {\n\t\trebasedRoots.outputDetachLocations.set(entry.start, entry.length, entry.value);\n\t}\n\n\treturn rebasedRoots;\n}\n\nfunction rebaseRename(\n\tnewRoots: RootNodeTable,\n\trebasedRoots: RootNodeTable,\n\trenameEntry: RangeQueryEntry<ChangeAtomId, ChangeAtomId>,\n\tbase: ModularChangeset,\n\taffectedBaseFields: TupleBTree<FieldIdKey, boolean>,\n): void {\n\tlet count = renameEntry.length;\n\tconst baseRenameEntry = firstAttachIdFromDetachId(base.rootNodes, renameEntry.start, count);\n\tcount = baseRenameEntry.length;\n\n\tconst baseAttachEntry = base.crossFieldKeys.getFirst(\n\t\t{\n\t\t\t...baseRenameEntry.value,\n\t\t\ttarget: CrossFieldTarget.Destination,\n\t\t},\n\t\tcount,\n\t);\n\n\tcount = baseAttachEntry.length;\n\n\tif (baseAttachEntry.value !== undefined) {\n\t\t// This rename represents an intention to detach these nodes.\n\t\t// The rebased change should have a detach in the field where the base change attaches the nodes,\n\t\t// so we need to ensure that field is processed.\n\t\taffectedBaseFields.set(\n\t\t\tfieldIdKeyFromFieldId(normalizeFieldId(baseAttachEntry.value, base.nodeAliases)),\n\t\t\ttrue,\n\t\t);\n\t} else {\n\t\tconst baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(\n\t\t\tbaseRenameEntry.value,\n\t\t\t1,\n\t\t).value;\n\n\t\tif (baseOutputDetachLocation !== undefined) {\n\t\t\taffectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);\n\t\t}\n\n\t\tconst detachEntry = newRoots.detachLocations.getFirst(renameEntry.start, count);\n\t\tcount = detachEntry.length;\n\n\t\tconst detachLocation = baseOutputDetachLocation ?? detachEntry.value;\n\n\t\t// Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.\n\t\t// We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`\n\t\taddNodeRename(\n\t\t\trebasedRoots,\n\t\t\tbaseRenameEntry.value,\n\t\t\trenameEntry.value,\n\t\t\tcount,\n\t\t\tdetachLocation,\n\t\t);\n\t}\n\n\tconst countRemaining = renameEntry.length - count;\n\tif (countRemaining > 0) {\n\t\trebaseRename(\n\t\t\tnewRoots,\n\t\t\trebasedRoots,\n\t\t\t{\n\t\t\t\tstart: offsetChangeAtomId(renameEntry.start, count),\n\t\t\t\tvalue: offsetChangeAtomId(renameEntry.value, count),\n\t\t\t\tlength: countRemaining,\n\t\t\t},\n\t\t\tbase,\n\t\t\taffectedBaseFields,\n\t\t);\n\t}\n}\n\n/**\n * For each root detach location, replaces any node ID from the base changeset\n * with the corresponding ID in the new changeset.\n */\nfunction fixupRebasedDetachLocations(table: RebaseTable): void {\n\tfor (const {\n\t\tstart,\n\t\tlength,\n\t\tvalue: detachLocation,\n\t} of table.rebasedRootNodes.detachLocations.entries()) {\n\t\tconst normalizedDetachLocation = normalizeFieldId(\n\t\t\tdetachLocation,\n\t\t\ttable.baseChange.nodeAliases,\n\t\t);\n\n\t\tif (normalizedDetachLocation.nodeId !== undefined) {\n\t\t\tconst rebasedNodeId = getFromChangeAtomIdMap(\n\t\t\t\ttable.baseToRebasedNodeId,\n\t\t\t\tnormalizedDetachLocation.nodeId,\n\t\t\t);\n\n\t\t\tif (rebasedNodeId !== undefined) {\n\t\t\t\ttable.rebasedRootNodes.detachLocations.set(start, length, {\n\t\t\t\t\t...normalizedDetachLocation,\n\t\t\t\t\tnodeId: rebasedNodeId,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction addNodesToCompose(table: ComposeTable, id1: NodeId, id2: NodeId): void {\n\tconst normalizedId1 = normalizeNodeId(id1, table.baseChange.nodeAliases);\n\tconst normalizedId2 = normalizeNodeId(id2, table.newChange.nodeAliases);\n\tif (getFromChangeAtomIdMap(table.newToBaseNodeId, normalizedId2) === undefined) {\n\t\tsetInChangeAtomIdMap(table.newToBaseNodeId, normalizedId2, normalizedId1);\n\t\ttable.pendingCompositions.nodeIdsToCompose.push([normalizedId1, normalizedId2]);\n\t}\n}\n\nfunction composeRevInfos(\n\trevisions1: readonly RevisionInfo[] | undefined,\n\trevisions2: readonly RevisionInfo[] | undefined,\n): RevisionInfo[] {\n\tconst result: RevisionInfo[] = [...(revisions1 ?? []), ...(revisions2 ?? [])];\n\treturn result;\n}\n\nfunction composeCrossFieldKeyTables(\n\ttable1: CrossFieldKeyTable,\n\ttable2: CrossFieldKeyTable,\n\tmovedCrossFieldKeys: CrossFieldKeyTable,\n\tremovedCrossFieldKeys: CrossFieldRangeTable<boolean>,\n): CrossFieldKeyTable {\n\tconst composedTable = RangeMap.union(table1, table2);\n\tfor (const entry of movedCrossFieldKeys.entries()) {\n\t\tcomposedTable.set(entry.start, entry.length, entry.value);\n\t}\n\n\tfor (const entry of removedCrossFieldKeys.entries()) {\n\t\tcomposedTable.delete(entry.start, entry.length);\n\t}\n\n\treturn composedTable;\n}\n\nfunction composeRootTables(\n\tchange1: ModularChangeset,\n\tchange2: ModularChangeset,\n\tcomposedNodeToParent: ChangeAtomIdBTree<NodeLocation>,\n\tmovedCrossFieldKeys: CrossFieldKeyTable,\n\tremovedCrossFieldKeys: CrossFieldRangeTable<boolean>,\n\tpendingCompositions: PendingCompositions,\n): RootNodeTable {\n\tconst composedTable = cloneRootTable(change1.rootNodes);\n\n\tfor (const renameEntry of change2.rootNodes.oldToNewId.entries()) {\n\t\tcomposeRename(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t\tcomposedTable,\n\t\t\trenameEntry.start,\n\t\t\trenameEntry.value,\n\t\t\trenameEntry.length,\n\t\t\tmovedCrossFieldKeys,\n\t\t\tremovedCrossFieldKeys,\n\t\t\tpendingCompositions,\n\t\t);\n\t}\n\n\tfor (const [[revision2, id2], nodeId2] of change2.rootNodes.nodeChanges.entries()) {\n\t\tconst detachId2 = { revision: revision2, localId: id2 };\n\t\tconst detachId1 = firstDetachIdFromAttachId(change1.rootNodes, detachId2, 1).value;\n\t\tconst nodeId1 = getFromChangeAtomIdMap(change1.rootNodes.nodeChanges, detachId1);\n\n\t\tif (nodeId1 !== undefined) {\n\t\t\tpendingCompositions.nodeIdsToCompose.push([nodeId1, nodeId2]);\n\t\t} else {\n\t\t\tconst fieldId = getFieldsForCrossFieldKey(\n\t\t\t\tchange1,\n\t\t\t\t{ ...detachId1, target: CrossFieldTarget.Source },\n\t\t\t\t1,\n\t\t\t)[0];\n\n\t\t\tif (fieldId !== undefined) {\n\t\t\t\t// In this case, this node is attached in the input context of change1,\n\t\t\t\t// and is represented in detachFieldId.\n\t\t\t\tpendingCompositions.affectedBaseFields.set(\n\t\t\t\t\t[fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field],\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tassignRootChange(\n\t\t\t\t\tcomposedTable,\n\t\t\t\t\tcomposedNodeToParent,\n\t\t\t\t\tdetachId1,\n\t\t\t\t\tnodeId2,\n\t\t\t\t\tchange1.rootNodes.detachLocations.getFirst(detachId1, 1).value ??\n\t\t\t\t\t\tchange2.rootNodes.detachLocations.getFirst(detachId2, 1).value,\n\t\t\t\t\tMath.max(change1.rebaseVersion, change2.rebaseVersion) as RebaseVersion,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const outputDetachEntry of change1.rootNodes.outputDetachLocations.entries()) {\n\t\tcomposeOutputDetachLocation(\n\t\t\toutputDetachEntry.start,\n\t\t\toutputDetachEntry.length,\n\t\t\toutputDetachEntry.value,\n\t\t\tchange2,\n\t\t\tcomposedTable,\n\t\t);\n\t}\n\n\tfor (const entry of change2.rootNodes.outputDetachLocations.entries()) {\n\t\tcomposedTable.outputDetachLocations.set(entry.start, entry.length, entry.value);\n\t}\n\n\treturn composedTable;\n}\n\nfunction composeOutputDetachLocation(\n\toutputDetachId1: ChangeAtomId,\n\tcount: number,\n\tdetachLocation: FieldId,\n\tchange2: ModularChangeset,\n\tcomposedTable: RootNodeTable,\n): void {\n\tlet countToProcess = count;\n\tconst renameEntry = firstAttachIdFromDetachId(\n\t\tchange2.rootNodes,\n\t\toutputDetachId1,\n\t\tcountToProcess,\n\t);\n\tcountToProcess = renameEntry.length;\n\n\tconst attachEntry = getFirstAttachField(\n\t\tchange2.crossFieldKeys,\n\t\trenameEntry.value,\n\t\tcountToProcess,\n\t);\n\tcountToProcess = attachEntry.length;\n\n\tcomposedTable.outputDetachLocations.delete(outputDetachId1, countToProcess);\n\n\tif (attachEntry.value === undefined) {\n\t\t// We update the key for the detach location to the renamed ID of the root in the composed output context.\n\t\tcomposedTable.outputDetachLocations.set(renameEntry.value, countToProcess, detachLocation);\n\t} else {\n\t\t// These nodes are attached by `change2` and thus attached in the composed output context,\n\t\t// so there should be no output detach location.\n\t}\n\n\tconst countRemaining = count - countToProcess;\n\tif (countRemaining > 0) {\n\t\tcomposeOutputDetachLocation(\n\t\t\toffsetChangeAtomId(outputDetachId1, countToProcess),\n\t\t\tcountRemaining,\n\t\t\tdetachLocation,\n\t\t\tchange2,\n\t\t\tcomposedTable,\n\t\t);\n\t}\n}\n\nfunction composeRename(\n\tchange1: ModularChangeset,\n\tchange2: ModularChangeset,\n\tmergedTable: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tcount: number,\n\tmovedCrossFieldKeys: CrossFieldKeyTable,\n\tremovedCrossFieldKeys: CrossFieldRangeTable<boolean>,\n\tpendingCompositions: PendingCompositions,\n): void {\n\tlet countToProcess = count;\n\tconst detachEntry = getFirstDetachField(change1.crossFieldKeys, oldId, countToProcess);\n\tcountToProcess = detachEntry.length;\n\n\tif (detachEntry.value !== undefined) {\n\t\t// `change1` detached these nodes,\n\t\t// so we invalidate the detach location so that the detach's ID can be replaced with the new ID.\n\t\tpendingCompositions.affectedBaseFields.set(fieldIdKeyFromFieldId(detachEntry.value), true);\n\n\t\tif (!areEqualChangeAtomIds(oldId, newId)) {\n\t\t\t// `change1`'s detach will be replaced by `change2`'s detach, so we update the cross-field keys.\n\t\t\tremovedCrossFieldKeys.set(\n\t\t\t\t{ ...oldId, target: CrossFieldTarget.Source },\n\t\t\t\tcountToProcess,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\tmovedCrossFieldKeys.set(\n\t\t\t{ ...newId, target: CrossFieldTarget.Source },\n\t\t\tcountToProcess,\n\t\t\tdetachEntry.value,\n\t\t);\n\t} else {\n\t\t// `change1` may also have a rename to `renameEntry.value`, in which case it must refer to a different node.\n\t\t// That node must have been attached by `change1` and detached by `change2`.\n\t\t// The final rename for that node will be created in `composeAttachDetach`.\n\t\t// We delete any such rename for now to avoid colliding with the rename currently being processed.\n\t\tdeleteNodeRenameTo(mergedTable, newId, countToProcess);\n\n\t\t// The nodes were detached before `change`, so we append this rename.\n\t\tappendNodeRename(\n\t\t\tmergedTable,\n\t\t\toldId,\n\t\t\tnewId,\n\t\t\tcountToProcess,\n\t\t\tchange1.rootNodes,\n\t\t\tchange2.rootNodes.detachLocations.getFirst(oldId, countToProcess).value,\n\t\t);\n\t}\n\n\tif (countToProcess < count) {\n\t\tcomposeRename(\n\t\t\tchange1,\n\t\t\tchange2,\n\t\t\tmergedTable,\n\t\t\toffsetChangeAtomId(oldId, countToProcess),\n\t\t\toffsetChangeAtomId(newId, countToProcess),\n\t\t\tcount - countToProcess,\n\t\t\tmovedCrossFieldKeys,\n\t\t\tremovedCrossFieldKeys,\n\t\t\tpendingCompositions,\n\t\t);\n\t}\n}\n\nexport function cloneRootTable(table: RootNodeTable): RootNodeTable {\n\treturn {\n\t\toldToNewId: table.oldToNewId.clone(),\n\t\tnewToOldId: table.newToOldId.clone(),\n\t\tnodeChanges: brand(table.nodeChanges.clone()),\n\t\tdetachLocations: table.detachLocations.clone(),\n\t\toutputDetachLocations: table.outputDetachLocations.clone(),\n\t};\n}\n\nfunction invertRootTable(change: ModularChangeset, isRollback: boolean): RootNodeTable {\n\tconst invertedRoots: RootNodeTable = newRootTable();\n\tfor (const [[revision, localId], nodeId] of change.rootNodes.nodeChanges.entries()) {\n\t\tconst detachId: ChangeAtomId = { revision, localId };\n\t\tconst renamedId = firstAttachIdFromDetachId(change.rootNodes, detachId, 1).value;\n\n\t\t// This checks whether `change` attaches this node.\n\t\t// If it does, the node is not detached in the input context of the inverse, and so should not be included in the root table.\n\t\tif (\n\t\t\tchange.crossFieldKeys.getFirst({ ...renamedId, target: CrossFieldTarget.Destination }, 1)\n\t\t\t\t.value === undefined\n\t\t) {\n\t\t\tassignRootChange(\n\t\t\t\tinvertedRoots,\n\t\t\t\tundefined,\n\t\t\t\trenamedId,\n\t\t\t\tnodeId,\n\t\t\t\tchange.rootNodes.detachLocations.getFirst(detachId, 1).value,\n\t\t\t\tchange.rebaseVersion,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (isRollback) {\n\t\t// We only invert renames of nodes which are not attached or detached by this changeset.\n\t\t// When we invert an attach we will create a detach which incorporates the rename.\n\t\tfor (const {\n\t\t\tstart: oldId,\n\t\t\tvalue: newId,\n\t\t\tlength,\n\t\t} of change.rootNodes.oldToNewId.entries()) {\n\t\t\tinvertRename(change, invertedRoots, oldId, newId, length);\n\t\t}\n\t}\n\n\treturn invertedRoots;\n}\n\nfunction invertRename(\n\tchange: ModularChangeset,\n\tinvertedRoots: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tlength: number,\n): void {\n\tfor (const detachEntry of doesChangeDetachNodes(change.crossFieldKeys, newId, length)) {\n\t\tassert(\n\t\t\t!detachEntry.value,\n\t\t\t\"A changeset should not have a rename and detach for the same node.\",\n\t\t);\n\t}\n\n\tlet countProcessed = length;\n\tconst attachEntry = getFirstAttachField(change.crossFieldKeys, newId, countProcessed);\n\tcountProcessed = attachEntry.length;\n\tif (attachEntry.value === undefined) {\n\t\tconst outputDetachEntry = change.rootNodes.outputDetachLocations.getFirst(\n\t\t\tnewId,\n\t\t\tcountProcessed,\n\t\t);\n\t\tcountProcessed = outputDetachEntry.length;\n\n\t\tconst inputDetachEntry = change.rootNodes.detachLocations.getFirst(oldId, countProcessed);\n\t\tcountProcessed = inputDetachEntry.length;\n\n\t\taddNodeRename(\n\t\t\tinvertedRoots,\n\t\t\tnewId,\n\t\t\toldId,\n\t\t\tcountProcessed,\n\t\t\toutputDetachEntry.value ?? inputDetachEntry.value,\n\t\t);\n\t}\n\n\tif (countProcessed < length) {\n\t\tinvertRename(\n\t\t\tchange,\n\t\t\tinvertedRoots,\n\t\t\toffsetChangeAtomId(oldId, countProcessed),\n\t\t\toffsetChangeAtomId(newId, countProcessed),\n\t\t\tlength - countProcessed,\n\t\t);\n\t}\n}\n\nfunction doesChangeAttachNodes(\n\ttable: CrossFieldKeyTable,\n\tid: ChangeAtomId,\n\tcount: number,\n): RangeQueryResultFragment<boolean>[] {\n\treturn table\n\t\t.getAll2({ ...id, target: CrossFieldTarget.Destination }, count)\n\t\t.map((entry) => ({ ...entry, value: entry.value !== undefined }));\n}\n\nfunction doesChangeDetachNodes(\n\ttable: CrossFieldKeyTable,\n\tid: ChangeAtomId,\n\tcount: number,\n): RangeQueryResultFragment<boolean>[] {\n\treturn table\n\t\t.getAll2({ ...id, target: CrossFieldTarget.Source }, count)\n\t\t.map((entry) => ({ ...entry, value: entry.value !== undefined }));\n}\n\nexport function getFirstDetachField(\n\ttable: CrossFieldKeyTable,\n\tid: ChangeAtomId,\n\tcount: number,\n): RangeQueryResult<FieldId | undefined> {\n\treturn table.getFirst({ target: CrossFieldTarget.Source, ...id }, count);\n}\n\nexport function getFirstAttachField(\n\ttable: CrossFieldKeyTable,\n\tid: ChangeAtomId,\n\tcount: number,\n): RangeQueryResult<FieldId | undefined> {\n\treturn table.getFirst({ target: CrossFieldTarget.Destination, ...id }, count);\n}\n\nexport function addNodeRename(\n\ttable: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tcount: number,\n\tdetachLocation: FieldId | undefined,\n): void {\n\tif (areEqualChangeAtomIds(oldId, newId)) {\n\t\treturn;\n\t}\n\n\tfor (const entry of table.oldToNewId.getAll2(oldId, count)) {\n\t\tassert(\n\t\t\tentry.value === undefined ||\n\t\t\t\tareEqualChangeAtomIds(entry.value, offsetChangeAtomId(newId, entry.offset)),\n\t\t\t\"Rename collision detected\",\n\t\t);\n\t}\n\n\tfor (const entry of table.newToOldId.getAll2(newId, count)) {\n\t\tassert(\n\t\t\tentry.value === undefined ||\n\t\t\t\tareEqualChangeAtomIds(entry.value, offsetChangeAtomId(oldId, entry.offset)),\n\t\t\t\"Rename collision detected\",\n\t\t);\n\t}\n\n\ttable.oldToNewId.set(oldId, count, newId);\n\ttable.newToOldId.set(newId, count, oldId);\n\n\tif (detachLocation !== undefined) {\n\t\ttable.detachLocations.set(oldId, count, detachLocation);\n\t}\n}\n\n/**\n * Deletes any renames from `id`.\n */\nfunction deleteNodeRenameFrom(roots: RootNodeTable, id: ChangeAtomId, count: number): void {\n\tfor (const entry of roots.oldToNewId.getAll(id, count)) {\n\t\tdeleteNodeRenameEntry(roots, entry.start, entry.value, entry.length);\n\t}\n}\n\n/**\n * Deletes any renames to `id`.\n */\nfunction deleteNodeRenameTo(roots: RootNodeTable, id: ChangeAtomId, count: number): void {\n\tfor (const entry of roots.newToOldId.getAll(id, count)) {\n\t\tdeleteNodeRenameEntry(roots, entry.value, entry.start, entry.length);\n\t}\n}\n\nfunction appendNodeRename(\n\tcomposedTable: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tcount: number,\n\tchange1Table: RootNodeTable,\n\tdetachLocation: FieldId | undefined,\n): void {\n\tlet countToProcess = count;\n\tconst rename1Entry = change1Table.newToOldId.getFirst(oldId, countToProcess);\n\tcountToProcess = rename1Entry.length;\n\n\tif (rename1Entry.value !== undefined) {\n\t\tdeleteNodeRenameFrom(composedTable, rename1Entry.value, countToProcess);\n\t}\n\n\taddNodeRename(\n\t\tcomposedTable,\n\t\trename1Entry.value ?? oldId,\n\t\tnewId,\n\t\tcountToProcess,\n\t\tdetachLocation,\n\t);\n\n\ttryRemoveDetachLocation(composedTable, newId, countToProcess);\n\n\tif (countToProcess < count) {\n\t\tconst countRemaining = count - countToProcess;\n\t\tappendNodeRename(\n\t\t\tcomposedTable,\n\t\t\toffsetChangeAtomId(oldId, countToProcess),\n\t\t\toffsetChangeAtomId(newId, countToProcess),\n\t\t\tcountRemaining,\n\t\t\tchange1Table,\n\t\t\tdetachLocation,\n\t\t);\n\t}\n}\n\nfunction tryRemoveDetachLocation(\n\troots: RootNodeTable,\n\trootId: ChangeAtomId,\n\tcount: number,\n): void {\n\tlet countProcessed = count;\n\tconst renameEntry = roots.oldToNewId.getFirst(rootId, countProcessed);\n\tcountProcessed = renameEntry.length;\n\n\tconst outputDetachEntry = roots.outputDetachLocations.getFirst(rootId, countProcessed);\n\tcountProcessed = outputDetachEntry.length;\n\n\tconst nodeChangeEntry = rangeQueryChangeAtomIdMap(roots.nodeChanges, rootId, countProcessed);\n\tcountProcessed = nodeChangeEntry.length;\n\n\tif (\n\t\tnodeChangeEntry.value === undefined &&\n\t\trenameEntry.value === undefined &&\n\t\toutputDetachEntry.value === undefined\n\t) {\n\t\troots.detachLocations.delete(rootId, countProcessed);\n\t}\n\n\tconst countRemaining = count - countProcessed;\n\tif (countRemaining > 0) {\n\t\ttryRemoveDetachLocation(roots, offsetChangeAtomId(rootId, countProcessed), countRemaining);\n\t}\n}\n\n/**\n * Deletes the entry renaming the ID range of length `count` from `oldId` to `newId`.\n * This function assumes that such an entry exists.\n */\nfunction deleteNodeRenameEntry(\n\troots: RootNodeTable,\n\toldId: ChangeAtomId,\n\tnewId: ChangeAtomId,\n\tcount: number,\n): void {\n\troots.oldToNewId.delete(oldId, count);\n\troots.newToOldId.delete(newId, count);\n}\n\nfunction replaceRootTableRevision(\n\ttable: RootNodeTable,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): RootNodeTable {\n\tconst oldToNewId = table.oldToNewId.mapEntries(\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t);\n\n\tconst newToOldId = table.newToOldId.mapEntries(\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t);\n\n\tconst nodeChanges: ChangeAtomIdBTree<NodeId> = newTupleBTree(\n\t\t[...table.nodeChanges.entries()].map(([[revision, id], nodeId]) => [\n\t\t\t[oldRevisions.has(revision) ? newRevision : revision, id],\n\t\t\treplaceAtomRevisions(normalizeNodeId(nodeId, nodeAliases), oldRevisions, newRevision),\n\t\t]),\n\t);\n\n\tconst detachLocations = table.detachLocations.mapEntries(\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t\t(fieldId) =>\n\t\t\treplaceFieldIdRevision(\n\t\t\t\tnormalizeFieldId(fieldId, nodeAliases),\n\t\t\t\toldRevisions,\n\t\t\t\tnewRevision,\n\t\t\t),\n\t);\n\n\tconst outputDetachLocations = table.outputDetachLocations.mapEntries(\n\t\t(id) => replaceAtomRevisions(id, oldRevisions, newRevision),\n\t\t(fieldId) =>\n\t\t\treplaceFieldIdRevision(\n\t\t\t\tnormalizeFieldId(fieldId, nodeAliases),\n\t\t\t\toldRevisions,\n\t\t\t\tnewRevision,\n\t\t\t),\n\t);\n\n\treturn { oldToNewId, newToOldId, nodeChanges, detachLocations, outputDetachLocations };\n}\n\nfunction newDetachedEntryMap(): ChangeAtomIdRangeMap<DetachedNodeEntry> {\n\treturn new RangeMap(offsetChangeAtomId, subtractChangeAtomIds, offsetDetachedNodeEntry);\n}\n\nfunction offsetDetachedNodeEntry(entry: DetachedNodeEntry, count: number): DetachedNodeEntry {\n\tassert(\n\t\tcount <= 1 || entry.nodeChange === undefined,\n\t\t\"Cannot split an entry with a node change\",\n\t);\n\n\treturn entry.detachId !== undefined\n\t\t? { ...entry, detachId: offsetChangeAtomId(entry.detachId, count) }\n\t\t: entry;\n}\n\nfunction getFieldsWithRootMoves(\n\troots: RootNodeTable,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): TupleBTree<FieldIdKey, boolean> {\n\tconst fields: TupleBTree<FieldIdKey, boolean> = newTupleBTree();\n\tfor (const { start: rootId, value: fieldId, length } of roots.detachLocations.entries()) {\n\t\tlet isRootMoved = false;\n\t\tfor (const renameEntry of roots.oldToNewId.getAll2(rootId, length)) {\n\t\t\tif (renameEntry.value !== undefined) {\n\t\t\t\tisRootMoved = true;\n\t\t\t}\n\t\t}\n\n\t\tfor (const outputDetachEntry of roots.outputDetachLocations.getAll2(rootId, length)) {\n\t\t\tif (outputDetachEntry.value !== undefined) {\n\t\t\t\tisRootMoved = true;\n\t\t\t}\n\t\t}\n\n\t\tif (isRootMoved) {\n\t\t\tfields.set(fieldIdKeyFromFieldId(normalizeFieldId(fieldId, nodeAliases)), true);\n\t\t}\n\t}\n\n\treturn fields;\n}\n\nfunction getFieldToRootChanges(\n\troots: RootNodeTable,\n\tnodeAliases: ChangeAtomIdBTree<NodeId>,\n): TupleBTree<FieldIdKey, ChangeAtomId[]> {\n\tconst fields: TupleBTree<FieldIdKey, ChangeAtomId[]> = newTupleBTree();\n\tfor (const rootIdKey of roots.nodeChanges.keys()) {\n\t\tconst rootId: ChangeAtomId = { revision: rootIdKey[0], localId: rootIdKey[1] };\n\t\tconst detachLocation = roots.detachLocations.getFirst(rootId, 1).value;\n\t\tif (detachLocation !== undefined) {\n\t\t\tconst fieldIdKey = fieldIdKeyFromFieldId(normalizeFieldId(detachLocation, nodeAliases));\n\t\t\tlet rootsInField = fields.get(fieldIdKey);\n\t\t\tif (rootsInField === undefined) {\n\t\t\t\trootsInField = [];\n\t\t\t\tfields.set(fieldIdKey, rootsInField);\n\t\t\t}\n\n\t\t\trootsInField.push(rootId);\n\t\t}\n\t}\n\n\treturn fields;\n}\n\nfunction muteRootChanges(roots: RootNodeTable): RootNodeTable {\n\treturn {\n\t\toldToNewId: newChangeAtomIdTransform(),\n\t\tnewToOldId: newChangeAtomIdTransform(),\n\t\tnodeChanges: brand(roots.nodeChanges.clone()),\n\t\tdetachLocations: roots.detachLocations.clone(),\n\t\toutputDetachLocations: newChangeAtomIdRangeMap(),\n\t};\n}\n"]}