@visactor/vtable-plugins 1.23.3-alpha.0 → 1.24.0

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 (143) hide show
  1. package/cjs/auto-fill/index.d.ts +3 -2
  2. package/cjs/auto-fill/index.js.map +1 -1
  3. package/cjs/auto-fill/series-converters.d.ts +3 -3
  4. package/cjs/auto-fill/series-converters.js.map +1 -1
  5. package/cjs/contextmenu/handle-menu-helper.js +1 -2
  6. package/cjs/contextmenu/index.js +2 -1
  7. package/cjs/excel-edit-cell-keyboard.d.ts +4 -2
  8. package/cjs/excel-edit-cell-keyboard.js.map +1 -1
  9. package/cjs/filter/filter-engine.js +5 -1
  10. package/cjs/filter/filter-engine.js.map +1 -1
  11. package/cjs/filter/filter-state-manager.d.ts +6 -1
  12. package/cjs/filter/filter-state-manager.js +81 -0
  13. package/cjs/filter/filter-state-manager.js.map +1 -1
  14. package/cjs/filter/filter-toolbar.d.ts +2 -0
  15. package/cjs/filter/filter-toolbar.js +23 -3
  16. package/cjs/filter/filter-toolbar.js.map +1 -1
  17. package/cjs/filter/filter.d.ts +4 -2
  18. package/cjs/filter/filter.js +32 -10
  19. package/cjs/filter/filter.js.map +1 -1
  20. package/cjs/filter/index.js +2 -1
  21. package/cjs/filter/types.d.ts +3 -0
  22. package/cjs/filter/types.js.map +1 -1
  23. package/cjs/filter/value-filter.js +11 -41
  24. package/cjs/filter/value-filter.js.map +1 -1
  25. package/cjs/filter/value-filter.syncSingleStateFromTableData.backup.d.ts +46 -0
  26. package/cjs/filter/value-filter.syncSingleStateFromTableData.backup.js +247 -0
  27. package/cjs/filter/value-filter.syncSingleStateFromTableData.backup.js.map +1 -0
  28. package/cjs/history/formula.d.ts +40 -0
  29. package/cjs/history/formula.js +112 -0
  30. package/cjs/history/formula.js.map +1 -0
  31. package/cjs/history/history-plugin.d.ts +88 -0
  32. package/cjs/history/history-plugin.js +699 -0
  33. package/cjs/history/history-plugin.js.map +1 -0
  34. package/cjs/history/index.d.ts +3 -0
  35. package/cjs/history/index.js +24 -0
  36. package/cjs/history/index.js.map +1 -0
  37. package/cjs/history/replay.d.ts +9 -0
  38. package/cjs/history/replay.js +268 -0
  39. package/cjs/history/replay.js.map +1 -0
  40. package/cjs/history/sheet-key.d.ts +9 -0
  41. package/cjs/history/sheet-key.js +44 -0
  42. package/cjs/history/sheet-key.js.map +1 -0
  43. package/cjs/history/snapshot.d.ts +15 -0
  44. package/cjs/history/snapshot.js +78 -0
  45. package/cjs/history/snapshot.js.map +1 -0
  46. package/cjs/history/types.d.ts +105 -0
  47. package/cjs/history/types.js +6 -0
  48. package/cjs/history/types.js.map +1 -0
  49. package/cjs/history-plugin.d.ts +1 -0
  50. package/cjs/history-plugin.js +21 -0
  51. package/cjs/history-plugin.js.map +1 -0
  52. package/cjs/index.d.ts +1 -0
  53. package/cjs/index.js +2 -1
  54. package/cjs/index.js.map +1 -1
  55. package/cjs/master-detail-plugin/checkbox.js +1 -1
  56. package/cjs/master-detail-plugin/config.js +1 -1
  57. package/cjs/master-detail-plugin/core.js +1 -1
  58. package/cjs/master-detail-plugin/events.js +1 -1
  59. package/cjs/master-detail-plugin/types.d.ts +1 -1
  60. package/cjs/master-detail-plugin/types.js.map +1 -1
  61. package/cjs/rotate-table.d.ts +7 -6
  62. package/cjs/rotate-table.js +12 -13
  63. package/cjs/rotate-table.js.map +1 -1
  64. package/cjs/row-series.js +2 -1
  65. package/cjs/table-export/util/pagination.js.map +1 -1
  66. package/cjs/wps-fill-handle.d.ts +4 -2
  67. package/cjs/wps-fill-handle.js.map +1 -1
  68. package/dist/vtable-plugins.js +1903 -81
  69. package/dist/vtable-plugins.min.js +3 -3
  70. package/es/auto-fill/index.d.ts +3 -2
  71. package/es/auto-fill/index.js.map +1 -1
  72. package/es/auto-fill/series-converters.d.ts +3 -3
  73. package/es/auto-fill/series-converters.js.map +1 -1
  74. package/es/contextmenu/handle-menu-helper.js +1 -2
  75. package/es/contextmenu/index.js +2 -1
  76. package/es/excel-edit-cell-keyboard.d.ts +4 -2
  77. package/es/excel-edit-cell-keyboard.js.map +1 -1
  78. package/es/filter/filter-engine.js +5 -1
  79. package/es/filter/filter-engine.js.map +1 -1
  80. package/es/filter/filter-state-manager.d.ts +6 -1
  81. package/es/filter/filter-state-manager.js +81 -0
  82. package/es/filter/filter-state-manager.js.map +1 -1
  83. package/es/filter/filter-toolbar.d.ts +2 -0
  84. package/es/filter/filter-toolbar.js +23 -3
  85. package/es/filter/filter-toolbar.js.map +1 -1
  86. package/es/filter/filter.d.ts +4 -2
  87. package/es/filter/filter.js +32 -10
  88. package/es/filter/filter.js.map +1 -1
  89. package/es/filter/index.js +2 -1
  90. package/es/filter/types.d.ts +3 -0
  91. package/es/filter/types.js.map +1 -1
  92. package/es/filter/value-filter.js +12 -41
  93. package/es/filter/value-filter.js.map +1 -1
  94. package/es/filter/value-filter.syncSingleStateFromTableData.backup.d.ts +46 -0
  95. package/es/filter/value-filter.syncSingleStateFromTableData.backup.js +242 -0
  96. package/es/filter/value-filter.syncSingleStateFromTableData.backup.js.map +1 -0
  97. package/es/history/formula.d.ts +40 -0
  98. package/es/history/formula.js +103 -0
  99. package/es/history/formula.js.map +1 -0
  100. package/es/history/history-plugin.d.ts +88 -0
  101. package/es/history/history-plugin.js +698 -0
  102. package/es/history/history-plugin.js.map +1 -0
  103. package/es/history/index.d.ts +3 -0
  104. package/es/history/index.js +4 -0
  105. package/es/history/index.js.map +1 -0
  106. package/es/history/replay.d.ts +9 -0
  107. package/es/history/replay.js +260 -0
  108. package/es/history/replay.js.map +1 -0
  109. package/es/history/sheet-key.d.ts +9 -0
  110. package/es/history/sheet-key.js +38 -0
  111. package/es/history/sheet-key.js.map +1 -0
  112. package/es/history/snapshot.d.ts +15 -0
  113. package/es/history/snapshot.js +71 -0
  114. package/es/history/snapshot.js.map +1 -0
  115. package/es/history/types.d.ts +105 -0
  116. package/es/history/types.js +2 -0
  117. package/es/history/types.js.map +1 -0
  118. package/es/history-plugin.d.ts +1 -0
  119. package/es/history-plugin.js +2 -0
  120. package/es/history-plugin.js.map +1 -0
  121. package/es/index.d.ts +1 -0
  122. package/es/index.js +2 -0
  123. package/es/index.js.map +1 -1
  124. package/es/master-detail-plugin/checkbox.js +1 -1
  125. package/es/master-detail-plugin/config.js +1 -1
  126. package/es/master-detail-plugin/core.js +1 -1
  127. package/es/master-detail-plugin/events.js +1 -1
  128. package/es/master-detail-plugin/types.d.ts +1 -1
  129. package/es/master-detail-plugin/types.js.map +1 -1
  130. package/es/rotate-table.d.ts +7 -6
  131. package/es/rotate-table.js +2 -3
  132. package/es/rotate-table.js.map +1 -1
  133. package/es/row-series.js +2 -1
  134. package/es/table-export/util/pagination.js.map +1 -1
  135. package/es/wps-fill-handle.d.ts +4 -2
  136. package/es/wps-fill-handle.js.map +1 -1
  137. package/package.json +10 -8
  138. package/cjs/auto-fill/__tests__/formula-integration.test.d.ts +0 -23
  139. package/cjs/auto-fill/__tests__/formula-integration.test.js +0 -61
  140. package/cjs/auto-fill/__tests__/formula-integration.test.js.map +0 -1
  141. package/es/auto-fill/__tests__/formula-integration.test.d.ts +0 -23
  142. package/es/auto-fill/__tests__/formula-integration.test.js +0 -54
  143. package/es/auto-fill/__tests__/formula-integration.test.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/history/history-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA+BnD,MAAM,OAAO,aAAa;IAmNxB,YAAY,OAA8B;;QA/M1C,OAAE,GAAG,gBAAgB,CAAC;QAItB,SAAI,GAAG,SAAS,CAAC;QAMjB,YAAO,GAAU;YACf,gBAAgB,CAAC,WAAW;YAC5B,gBAAgB,CAAC,WAAW;YAC5B,gBAAgB,CAAC,cAAc;YAC/B,gBAAgB,CAAC,iBAAiB;YAClC,gBAAgB,CAAC,kBAAkB;YACnC,gBAAgB,CAAC,WAAW;YAC5B,gBAAgB,CAAC,WAAW;YAC5B,gBAAgB,CAAC,aAAa;YAC9B,gBAAgB,CAAC,UAAU;YAC3B,gBAAgB,CAAC,aAAa;YAC9B,gBAAgB,CAAC,aAAa;YAC9B,gBAAgB,CAAC,UAAU;YAC3B,gBAAgB,CAAC,aAAa;YAC9B,gBAAgB,CAAC,sBAAsB;YACvC,gBAAgB,CAAC,UAAU;YAC3B,gBAAgB,CAAC,UAAU;YAC3B,gBAAgB,CAAC,cAAc;YAC/B,gBAAgB,CAAC,aAAa;YAC9B,gBAAgB,CAAC,iBAAiB;SACnC,CAAC;QAMM,UAAK,GAAqB,IAAI,CAAC;QAe/B,cAAS,GAAyB,EAAE,CAAC;QAKrC,cAAS,GAAyB,EAAE,CAAC;QAIrC,uBAAkB,GAA8B,IAAI,CAAC;QAKrD,gBAAW,GAAG,KAAK,CAAC;QAepB,wBAAmB,GAAgC,IAAI,CAAC;QAQxD,wBAAmB,GAAiB,IAAI,CAAC;QAIzC,yBAAoB,GAAkC,IAAI,CAAC;QAI3D,kCAA6B,GAAkC,IAAI,CAAC;QAIpE,iCAA4B,GAAkC,IAAI,CAAC;QAQnE,uBAAkB,GAA+C,IAAI,CAAC;QAItE,sBAAiB,GAA+C,IAAI,CAAC;QAIrE,gBAAW,GAAG,KAAK,CAAC;QAIpB,mBAAc,GAAG,KAAK,CAAC;QAUvB,yBAAoB,GAAqB,IAAI,GAAG,EAAE,CAAC;QAInD,iBAAY,GAAoC,IAAI,GAAG,EAAE,CAAC;QAI1D,sBAAiB,GAAG,KAAK,CAAC;QAa1B,yBAAoB,GAAwB,IAAI,GAAG,EAAE,CAAC;QAItD,wBAAmB,GAAwB,IAAI,GAAG,EAAE,CAAC;QAQrD,qBAAgB,GAAG,KAAK,CAAC;QAMzB,sBAAiB,GAAwB,IAAI,CAAC;QAiC9C,2BAAsB,GAAG,KAAK,CAAC;QAMrC,IAAI,CAAC,EAAE,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,mCAAI,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,mCAAI,GAAG,CAAC;QAC7C,IAAI,CAAC,iBAAiB,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,mCAAI,KAAK,CAAC;QAC7D,IAAI,CAAC,mBAAmB,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,CAAC;IAC1D,CAAC;IAiBD,GAAG,CAAC,GAAG,IAAuG;;QAC5G,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAQ,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAQ,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAc,CAAC;QAEnC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,WAAW,GAAI,KAAa,CAAC,aAAa,CAAC;YAChD,IAAI,OAAO,KAAK,gBAAgB,CAAC,WAAW,KAAI,MAAC,KAAa,CAAC,aAAa,0CAAE,UAAU,CAAA,EAAE;gBACxF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE;oBAC5B,cAAc,EAAE,MAAA,IAAI,CAAC,WAAW,0CAAE,cAAc;oBAChD,QAAQ;iBACT,CAAC,CAAC;gBACH,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAC,KAAa,CAAC,aAAa,0CAAE,SAAS,CAAC,CAAC;aAC5F;SACF;aAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAC5B,IAAI,CAAC,WAAW,GAAI,KAAa,CAAC,aAAa,CAAC;SACjD;QAED,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,OAAO,KAAK,gBAAgB,CAAC,WAAW,EAAE;YAC5C,OAAO;SACR;QACD,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,MAAM,iBAAiB,GAAG,MAAA,MAAC,IAAI,CAAC,KAAa,0CAAE,aAAa,0CAAE,0BAA0B,CAAC;QACzF,IAAI,IAAI,CAAC,WAAW,IAAI,iBAAiB,EAAE;YACzC,OAAO;SACR;QAED,QAAQ,OAAO,EAAE;YACf,KAAK,gBAAgB,CAAC,WAAW;gBAC/B,MAAM;YACR,KAAK,gBAAgB,CAAC,cAAc;gBAClC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,gBAAgB,CAAC,iBAAiB;gBACrC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,gBAAgB,CAAC,kBAAkB;gBACtC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM;YACR,KAAK,gBAAgB,CAAC,WAAW;gBAC/B,MAAM;YACR,KAAK,gBAAgB,CAAC,WAAW;gBAC/B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,gBAAgB,CAAC,UAAU;gBAC9B,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,gBAAgB,CAAC,UAAU;gBAC9B,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,gBAAgB,CAAC,sBAAsB;gBAC1C,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,gBAAgB,CAAC,UAAU;gBAC9B,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,gBAAgB,CAAC,UAAU;gBAC9B,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,gBAAgB,CAAC,cAAc;gBAClC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,gBAAgB,CAAC,iBAAiB;gBACrC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBACtC,MAAM;YACR;gBACE,MAAM;SACT;QAED,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE;gBACjC,cAAc,EAAE,MAAA,IAAI,CAAC,WAAW,0CAAE,cAAc;gBAChD,QAAQ;aACT,CAAC,CAAC;YACH,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAMD,gBAAgB;QACd,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,OAAO;SACR;QACD,IAAI,CAAC,kBAAkB,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAKD,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7E,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,OAAO;SACR;QACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACjC,CAAC;IAMD,IAAI;;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9C,OAAO;SACR;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAG,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI;YACF,KAAK,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBACzD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;aACpD;SACF;gBAAS;YACR,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC1B;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE;gBACjC,cAAc,EAAE,MAAA,IAAI,CAAC,WAAW,0CAAE,cAAc;gBAChD,QAAQ;aACT,CAAC,CAAC;YACH,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAMD,IAAI;;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9C,OAAO;SACR;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAG,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI;YACF,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACtC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;aAChC;SACF;gBAAS;YACR,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC1B;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE;gBACjC,cAAc,EAAE,MAAA,IAAI,CAAC,WAAW,0CAAE,cAAc;gBAChD,QAAQ;aACT,CAAC,CAAC;YACH,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAKD,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACjC,CAAC;IAKD,aAAa,CAAC,OAAsC;QAClD,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,EAAE;YAC9B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;YACrC,IAAI,CAAC,WAAW,EAAE,CAAC;SACpB;QACD,IAAI,OAAO,CAAC,iBAAiB,IAAI,IAAI,EAAE;YACrC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;SACpD;QACD,IAAI,OAAO,CAAC,mBAAmB,EAAE;YAC/B,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;SACxD;IACH,CAAC;IAKD,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,yBAAyB,GAAG,SAAS,CAAC;QAC3C,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IAClC,CAAC;IAEO,yBAAyB;;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,EAAE,GAAI,IAAI,CAAC,KAAa,CAAC,aAAa,CAAC;QAC7C,MAAM,YAAY,GAChB,MAAA,MAAA,MAAA,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,SAAS,mDAAG,QAAQ,CAAC,mCACzB,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,eAAe,mDAAG,QAAQ,CAAC,mCAC/B,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,SAAS,mDAAG,eAAe,CAAC,mCAChC,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,eAAe,mDAAG,eAAe,CAAC,CAAC;QACzC,IAAI,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,iBAAiB,CAAA,IAAI,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,mBAAmB,CAAA,EAAE;YAC1E,OAAO;SACR;QAaD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC;YACpC,IAAI,CAAC,cAAc,GAAG,MAAA,YAAY,CAAC,EAAE,mCAAI,QAAQ,CAAC;YAClD,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAC;SACxE;QAED,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE;YACrC,IAAI,CAAC,2BAA2B,GAAG,MAAA,YAAY,CAAC,mBAAmB,0CAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACxF,IAAI,IAAI,CAAC,2BAA2B,EAAE;gBACpC,YAAY,CAAC,mBAAmB,GAAG,CAAC,QAAa,EAAO,EAAE;;oBACxD,IAAI,IAAI,CAAC,WAAW,EAAE;wBACpB,OAAO,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;qBACnD;oBACD,MAAM,WAAW,GAAG,MAAA,IAAI,CAAC,mBAAmB,mCAAI,YAAY,CAAC,iBAAiB,EAAE,CAAC;oBACjF,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;oBACnC,IAAI;wBACF,OAAO,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;qBACnD;4BAAS;wBACR,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;wBACpC,MAAM,WAAW,GAAG,YAAY,CAAC,iBAAiB,EAAE,CAAC;wBACrD,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;4BAC/D,MAAM,GAAG,GAAkB;gCACzB,IAAI,EAAE,QAAQ;gCACd,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;gCAC5B,QAAQ,EAAE,MAAA,IAAI,CAAC,cAAc,mCAAI,QAAQ;gCACzC,WAAW;gCACX,WAAW;6BACZ,CAAC;4BACF,IAAI,CAAC,WAAW,CAAC,GAA4B,CAAC,CAAC;4BAC/C,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;yBACnD;6BAAM;4BACL,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;yBACnD;qBACF;gBACH,CAAC,CAAC;aACH;SACF;QAED,MAAM,YAAY,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,kBAAkB,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,iBAAiB,KAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,CAAA,EAAE;YACtD,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,MAAW,EAAE,MAAW,EAAE,EAAE;;gBAC3E,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,OAAO;iBACR;gBACD,IAAI,IAAI,CAAC,sBAAsB,EAAE;oBAC/B,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAC;oBACvE,OAAO;iBACR;gBAED,MAAM,CAAC,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,CAAC;gBACvB,IACE,CAAC,KAAK,gBAAgB,CAAC,aAAa;oBACpC,CAAC,KAAK,gBAAgB,CAAC,iBAAiB;oBACxC,CAAC,KAAK,gBAAgB,CAAC,aAAa;oBACpC,CAAC,KAAK,gBAAgB,CAAC,cAAc,EACrC;oBACA,OAAO;iBACR;gBAED,MAAM,WAAW,GAAG,MAAA,IAAI,CAAC,mBAAmB,mCAAI,YAAY,CAAC,iBAAiB,EAAE,CAAC;gBACjF,MAAM,WAAW,GAAG,YAAY,CAAC,iBAAiB,EAAE,CAAC;gBACrD,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;oBAC/D,OAAO;iBACR;gBAED,MAAM,GAAG,GAAkB;oBACzB,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;oBAC5B,QAAQ,EAAE,MAAA,IAAI,CAAC,cAAc,mCAAI,QAAQ;oBACzC,WAAW;oBACX,WAAW;iBACZ,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,GAA4B,CAAC,CAAC;gBAC/C,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAEO,kBAAkB;;QAOxB,MAAA,IAAI,CAAC,iBAAiB,oDAAI,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,2BAA2B,EAAE;YAC5D,IAAI,CAAC,eAAe,CAAC,mBAAmB,GAAG,IAAI,CAAC,2BAA2B,CAAC;SAC7E;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACtC,CAAC;IAMO,WAAW;QACjB,MAAM,QAAQ,GAAG,eAAe,CAAC;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,gBAAgB;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC;QACxC,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAKO,gBAAgB;QACtB,OAAO;YACL,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;YACjE,4BAA4B,EAAE,IAAI,CAAC,4BAA4B;SAChE,CAAC;IACJ,CAAC;IAKO,gBAAgB,CAAC,IAOxB;;QACC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,CAAC,oBAAoB,GAAG,MAAA,IAAI,CAAC,oBAAoB,mCAAI,IAAI,CAAC;QAC9D,IAAI,CAAC,6BAA6B,GAAG,MAAA,IAAI,CAAC,6BAA6B,mCAAI,IAAI,CAAC;QAChF,IAAI,CAAC,4BAA4B,GAAG,MAAA,IAAI,CAAC,4BAA4B,mCAAI,IAAI,CAAC;IAChF,CAAC;IAKO,eAAe,CAAC,EAAsB;;QAE5C,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5B,OAAO;SACR;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACjD,MAAM,iBAAiB,GAAG,MAAA,MAAC,IAAI,CAAC,KAAa,0CAAE,aAAa,0CAAE,0BAA0B,CAAC;YACzF,IAAI,CAAC,iBAAiB,EAAE;gBACtB,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,MAAA,IAAI,CAAC,KAAK,mCAAI,SAAS,EAAE,CAAC,CAAC;aAChG;SACF;IACH,CAAC;IAKO,WAAW;QACjB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;YAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;SACnE;IACH,CAAC;IAOO,WAAW,CAAC,GAAmB;QACrC,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3C,OAAO;SACR;QACD,IAAI,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAKD,qBAAqB,CAAC,GAAmB;QACvC,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO;SACR;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAKO,qBAAqB,CAAC,MAAkB,EAAE,QAAiB;QACjE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B,OAAO,KAAK,CAAC;SACd;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/C,OAAO,KAAK,CAAC;SACd;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE;YACjF,MAAM,KAAK,GAAI,IAAoB,CAAC,KAAK,CAAC;YAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE;gBACpF,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;gBACxC,OAAO,IAAI,CAAC;aACb;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAQO,mBAAmB,CAAC,SAA+D;;QACzF,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACrB,OAAO;SACR;QAED,MAAM,YAAY,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;QAC5C,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO;SACR;QAED,MAAM,cAAc,GAAG,MAAA,IAAI,CAAC,WAAW,0CAAE,cAAc,CAAC;QACxD,IAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,oBAAoB,EAAE;YACxC,OAAO;SACR;QACD,IAAI,MAAA,IAAI,CAAC,KAAK,CAAC,aAAa,0CAAE,aAAa,EAAE;YAC3C,OAAO;SACR;QAED,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,MAAM,eAAe,GAAG,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,yBAAyB,kDAAI,CAAC;YACxE,IAAI,CAAC,CAAC,QAAQ,EAAE;gBACd,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxD;iBAAM;gBACL,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxD;YACD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAC;SACrB;aAAM,IAAI,GAAG,KAAK,GAAG,EAAE;YACtB,MAAM,eAAe,GAAG,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,yBAAyB,kDAAI,CAAC;YACxE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACvD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAC;SACrB;IACH,CAAC;IAMO,qBAAqB,CAAC,SAAkE;;QAC9F,2BAA2B,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;YAC5B,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,cAAc,EAAE,MAAA,IAAI,CAAC,WAAW,0CAAE,cAAc;YAChD,KAAK,EAAE,IAAI,CAAC,oBAAoB;SACjC,CAAC,CAAC;IACL,CAAC;IASO,sBAAsB,CAAC,SAAmE;;QAChG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,MAAA,IAAI,CAAC,WAAW,0CAAE,cAAc,CAAC;QACxD,MAAM,KAAK,GAAiB,SAAS,CAAC,MAAM;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,MAAM,UAAU,GAAG,uBAAuB,CAAC;gBACzC,QAAQ;gBACR,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,kBAAkB,EAAE,CAAC,CAAC,YAAY;gBAClC,KAAK,EAAE,IAAI,CAAC,oBAAoB;aACjC,CAAC,CAAC;YACH,MAAM,aAAa,GAAG,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;YAC3D,MAAM,aAAa,GAAG,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YACnE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;QAC1F,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE;YACV,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE;gBACjC,OAAO,KAAK,CAAC;aACd;YACD,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,cAAc,CAAA,IAAI,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,YAAY,CAAA,EAAE;gBACjF,OAAO,IAAI,CAAC;aACb;YACD,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACpE,OAAO,KAAK,CAAC;aACd;YACD,MAAM,OAAO,GAAG,cAAc,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3F,IAAI,CAAC,OAAO,EAAE;gBACZ,OAAO,IAAI,CAAC;aACb;YACD,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACxF,MAAM,OAAO,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,EAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAC;YAC1D,IAAI,OAAO,KAAK,CAAC,CAAC,UAAU,EAAE;gBAC5B,OAAO,KAAK,CAAC;aACd;YACD,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;gBACvF,OAAO,KAAK,CAAC;aACd;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEL,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACjB,OAAO;SACR;QAED,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE;YACpF,OAAO;SACR;QAED,MAAM,GAAG,GAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC5D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAMO,0BAA0B;;QAChC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC9D,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;SACR;QACD,MAAM,SAAS,GACb,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,EAAC,iBAAiB,mDAAG,QAAQ,CAAC,mCAAI,MAAA,MAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,0CAAE,GAAG,mDAAG,QAAQ,CAAC,CAAC;QACzG,MAAM,YAAY,GAAI,SAAiB,aAAjB,SAAS,uBAAT,SAAS,CAAU,YAAY,CAAC;QACtD,IAAI,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,EAAE,CAAA,IAAI,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,GAAG,CAAA,EAAE;YAC3C,OAAO;SACR;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,mBAAmB,GAAG,YAAY,CAAC;QAExC,IAAI,CAAC,qBAAqB,GAAG,CAAC,KAAU,EAAE,EAAE;YAC1C,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,OAAO;aACR;YACD,MAAM,IAAI,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC;YACzB,MAAM,OAAO,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAC;YAC/B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE;gBACzE,OAAO;aACR;YACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBAClD,OAAO;aACR;YACD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;YACrE,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,UAAU,GAAQ,uBAAuB,CAAC;gBAC9C,QAAQ;gBACR,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,kBAAkB,EAAE,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAC3D,KAAK,EAAE,IAAI,CAAC,oBAAoB;aACjC,CAAC,CAAC;YAEH,IAAI,UAAU,KAAK,UAAU,EAAE;gBAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACvC,OAAO;aACR;YAED,MAAM,GAAG,GAAgB;gBACvB,IAAI,EAAE,OAAO;gBACb,QAAQ;gBACR,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;aAC9E,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACzC,CAAC,CAAC;QAEF,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/D,CAAC;IAYO,uBAAuB;;QAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;YACtC,OAAO;SACR;QACD,MAAM,EAAE,GAAQ,MAAC,IAAI,CAAC,KAAa,CAAC,aAAa,0CAAE,UAAU,CAAC;QAC9D,IAAI,CAAC,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,EAAE,CAAA,IAAI,CAAC,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,GAAG,CAAA,EAAE;YACvB,OAAO;SACR;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;;YAC1D,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACxD,OAAO;aACR;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC5C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAC,IAAI,CAAC,KAAa,CAAC,aAAa,0CAAE,SAAS,CAAC,CAAC;YAC3F,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;gBACjE,IAAI,CAAC,kBAAkB,GAAG,YAAY,CAAC;gBACvC,OAAO;aACR;YACD,MAAM,GAAG,GAAgB;gBACvB,IAAI,EAAE,MAAM;gBACZ,QAAQ;gBACR,YAAY,EAAE,YAAmB;gBACjC,YAAY,EAAE,YAAmB;aAClC,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,kBAAkB,GAAG,YAAY,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAKO,gBAAgB;;QACtB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,OAAO;SACR;QACD,MAAM,EAAE,GAAQ,MAAA,MAAC,IAAI,CAAC,KAAa,0CAAE,aAAa,0CAAE,UAAU,CAAC;QAC/D,IAAI;YACF,IAAI,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,GAAG,KAAI,IAAI,CAAC,yBAAyB,EAAE;gBAC7C,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;aACxC;SACF;QAAC,WAAM;SACP;gBAAS;YACR,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,yBAAyB,GAAG,SAAS,CAAC;YAC3C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;SAC/B;IACH,CAAC;IAKO,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACxD,OAAO;SACR;QACD,IAAI;YACF,IAAI,IAAI,CAAC,qBAAqB,EAAE;gBAC9B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;aAC3E;SACF;QAAC,WAAM;SAEP;gBAAS;YACR,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;YACrC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;SACxC;IACH,CAAC;IAKO,gBAAgB,CAAC,KAAU;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SACrC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,iBAAiB,CAAC,CAAM,EAAE,CAAM;;QACtC,MAAM,SAAS,GAAG,CAAC,CAAM,EAAE,EAAE;YAC3B,IAAI,CAAC,IAAI,IAAI,EAAE;gBACb,OAAO,EAAE,CAAC;aACX;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACpB,OAAO,CAAC,CAAC;aACV;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QACF,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,EAAE,KAAK,EAAE,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YAC1C,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE;gBAC3B,OAAO,KAAK,CAAC;aACd;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAClC,MAAM,EAAE,GAAG,MAAA,EAAE,CAAC,CAAC,CAAC,0CAAE,KAAK,CAAC;gBACxB,MAAM,EAAE,GAAG,MAAA,EAAE,CAAC,CAAC,CAAC,0CAAE,KAAK,CAAC;gBACxB,IACE,CAAC,EAAE;oBACH,CAAC,EAAE;oBACH,CAAA,MAAA,EAAE,CAAC,KAAK,0CAAE,GAAG,OAAK,MAAA,EAAE,CAAC,KAAK,0CAAE,GAAG,CAAA;oBAC/B,CAAA,MAAA,EAAE,CAAC,KAAK,0CAAE,GAAG,OAAK,MAAA,EAAE,CAAC,KAAK,0CAAE,GAAG,CAAA;oBAC/B,CAAA,MAAA,EAAE,CAAC,GAAG,0CAAE,GAAG,OAAK,MAAA,EAAE,CAAC,GAAG,0CAAE,GAAG,CAAA;oBAC3B,CAAA,MAAA,EAAE,CAAC,GAAG,0CAAE,GAAG,OAAK,MAAA,EAAE,CAAC,GAAG,0CAAE,GAAG,CAAA;oBAC3B,CAAA,MAAA,EAAE,CAAC,CAAC,CAAC,0CAAE,IAAI,OAAK,MAAA,EAAE,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAA,EAC3B;oBACA,OAAO,KAAK,CAAC;iBACd;aACF;YACD,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,gBAAgB,CAAC,SAA4D;QACnF,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAKO,kBAAkB,CAAC,SAA8D;QACvF,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAMO,wBAAwB,CAAC,SAKhC;;QACC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAC,IAAI,CAAC,KAAa,CAAC,OAAO,0CAAE,eAAe,CAAC,CAAC;QAClF,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;YACzC,OAAO;SACR;QAED,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;YAC5B,QAAQ;YACR,QAAQ;YACR,MAAM;YACN,MAAM;YACN,kBAAkB,EAAE,MAAM;YAC1B,kBAAkB,EAAE,KAAK;SAC1B,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAKO,eAAe,CAAC,SAA2D;;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,YAAY;YAClB,QAAQ;YACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;YAC1E,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,WAAW,EAAE,MAAA,SAAS,CAAC,WAAW,mCAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;SACxG,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ,EAAE;YAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC;YACpC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC;YAC9B,MAAM,EAAE,GAAQ,MAAA,MAAC,IAAI,CAAC,KAAa,0CAAE,aAAa,0CAAE,UAAU,CAAC;YAC/D,MAAM,UAAU,GAAsB,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,aAAa,0CAAE,OAAO,CAAC;YACjE,MAAM,WAAW,GAAI,IAAI,CAAC,KAAa,CAAC,OAAgB,CAAC;YACzD,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE;gBACpD,GAAG,CAAC,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClE,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;aAC9C;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;gBAC3D,IAAI,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC;gBACvC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC5B,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC;iBACpC;qBAAM,IAAI,KAAK,IAAI,CAAC,EAAE;oBACrB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACtC,cAAc,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBACrC;qBAAM,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE;oBACtC,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACrC,cAAc,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;iBACzD;qBAAM;oBACL,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACpC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACrC,cAAc,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;iBACzD;gBACD,GAAG,CAAC,cAAc,GAAG,cAAc,CAAC;aACrC;SACF;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAKO,kBAAkB,CAAC,SAA8D;;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC;YACxD,CAAC,CAAG,SAAS,CAAC,YAAsC,CAAC,KAAK,EAA4B;YACtF,CAAC,CAAC,CAAC,SAAS,CAAC,YAAmB,CAAC,CAAC;QAEpC,IAAI,iBAAqD,CAAC;QAC1D,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,6BAA6B,EAAE;YACpD,MAAM,WAAW,GAAI,IAAI,CAAC,KAAa,CAAC,SAAS;gBAC/C,CAAC,CAAE,IAAI,CAAC,KAAa,CAAC,mBAAmB;gBACzC,CAAC,CAAE,IAAI,CAAC,KAAa,CAAC,sBAAsB,CAAC;YAC/C,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;;gBACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;oBAC3B,OAAO;iBACR;gBACD,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,CAAC,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,6BAA6B,0CAAG,QAAQ,CAAC,CAAC;gBAC9D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;oBAC9B,IAAI,CAAC,iBAAiB,EAAE;wBACtB,iBAAiB,GAAG,EAAE,CAAC;qBACxB;oBACD,iBAAiB,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;iBACjC;YACH,CAAC,CAAC,CAAC;SACJ;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzE,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAA,MAAC,IAAI,CAAC,KAAa,0CAAE,OAAO,0CAAE,eAAe,CAAC,CAAC;QAEhG,MAAM,GAAG,GAAwB;YAC/B,IAAI,EAAE,eAAe;YACrB,QAAQ;YACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;YAC1E,YAAY;YACZ,iBAAiB;YACjB,kBAAkB;YAClB,kBAAkB;SACnB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAKO,kBAAkB,CAAC,SAA8D;QACvF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC,YAAY,IAAI,EAAE,CAA0B,CAAC;QAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAErF,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACjG,OAAO;SACR;QAED,MAAM,UAAU,GAAU,EAAE,CAAC;QAC7B,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;gBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAoB,CAAC,GAAG,CAAC,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACnE;iBAAM;gBACL,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAC5B;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAwB,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;QAC3G,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAKO,eAAe,CAAC,SAA2D;QACjF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;QACxD,MAAM,YAAY,GAAI,OAAgC;aACnD,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC;aAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAqB,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAChH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAMO,kBAAkB,CAAC,SAA8D;QACvF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,eAAe,GAAG,CAAC,SAAS,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAClE,MAAM,uBAAuB,GAAI,SAAiB,CAAC,cAAkD,CAAC;QACtG,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC;QACnD,MAAM,cAAc,GAAyB,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC;YACjF,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YAC1B,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE;oBACxC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAClD;YACH,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,mBAAmB,GAAyB,SAAiB,CAAC,mBAA0C,CAAC;QAC7G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;YACtE,mBAAmB,GAAG,SAAS,CAAC;YAChC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;gBAC9E,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACvD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;wBACtB,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;qBAC7C;oBACD,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBACH,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;oBAClD,mBAAmB,GAAG,SAAS,CAAC;iBACjC;aACF;SACF;QAED,IAAI,eAAmD,CAAC;QACxD,IAAI,IAAI,CAAC,oBAAoB,IAAI,eAAe,CAAC,MAAM,EAAE;YACvD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC1D,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE;gBACrC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;oBAClD,IAAI,CAAC,eAAe,EAAE;wBACpB,eAAe,GAAG,EAAE,CAAC;qBACtB;oBACD,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;iBACpC;YACH,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,gBAAoD,CAAC;QACzD,IAAI,IAAI,CAAC,4BAA4B,IAAI,eAAe,CAAC,MAAM,EAAE;YAC/D,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;;gBAC5B,MAAM,CAAC,GAAG,MAAA,IAAI,CAAC,4BAA4B,0CAAG,GAAG,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;oBACzB,IAAI,CAAC,gBAAgB,EAAE;wBACrB,gBAAgB,GAAG,EAAE,CAAC;qBACvB;oBACD,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAC3B;YACH,CAAC,CAAC,CAAC;SACJ;QAED,MAAM,GAAG,GAAwB;YAC/B,IAAI,EAAE,eAAe;YACrB,QAAQ;YACR,eAAe;YACf,OAAO,EAAE,cAAc;YACvB,mBAAmB;YACnB,eAAe;YACf,gBAAgB;SACjB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAKO,0BAA0B,CAAC,SAAuE;;QACxG,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAA,SAAS,CAAC,iBAAiB,mCAAI,QAAQ,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;QACtF,MAAM,WAAW,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;QAEtF,MAAM,GAAG,GAAgC;YACvC,IAAI,EAAE,wBAAwB;YAC9B,QAAQ;YACR,MAAM;YACN,WAAW;YACX,WAAW;SACZ,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAOO,kBAAkB,CAAC,KAAU;QACnC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC;SACb;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,MAAM,IAAI,GAAG,KAAK;iBACf,MAAM,CAAC,OAAO,CAAC;iBACf,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;iBACrD,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,IAAY,CAAC,CAAC,CAAC,IAAI,CAAC;SAC3C;QACD,MAAM,CAAC,GAAG,KAAY,CAAC;QACvB,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE;YACtE,OAAO,IAAI,CAAC;SACb;QACD,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAS,CAAC;IACnD,CAAC;IASO,eAAe,CAAC,UAA4D;QAClF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;aAC/B;QACH,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAKO,eAAe,CAAC,SAA2D;;QACjF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACvC,MAAM,SAAS,GAAG,MAAA,MAAC,IAAI,CAAC,KAAa,EAAC,YAAY,mDAAG,GAAG,CAAC,CAAC;YAC1D,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;gBACjC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;aAC/C;SACF;IACH,CAAC;IAKO,kBAAkB,CAAC,SAA+D;;QACxF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QAC1B,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;QACtC,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAI,SAAS,CAAC;QAClE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,SAAS,EAAE;YAC7F,OAAO;SACR;QACD,MAAM,GAAG,GAAqB,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAC1F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAKO,kBAAkB,CAAC,SAA8D;;QACvF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACtC,MAAM,QAAQ,GAAG,MAAA,MAAC,IAAI,CAAC,KAAa,EAAC,WAAW,mDAAG,GAAG,CAAC,CAAC;YACxD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;gBAChC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;aAC7C;SACF;IACH,CAAC;IAKO,qBAAqB,CAAC,SAAkE;;QAC9F,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QAC1B,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAA,SAAS,CAAC,GAAG,CAAC,mCAAI,MAAA,MAAC,IAAI,CAAC,KAAa,EAAC,WAAW,mDAAG,GAAG,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAI,QAAQ,CAAC;QAC/D,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE;YACzF,OAAO;SACR;QACD,MAAM,GAAG,GAAwB,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC9F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAKO,YAAY,CAAC,GAAmB,EAAE,SAA0B;QAClE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,aAAa,CAAC;YACZ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG;YACH,SAAS;YACT,wBAAwB,EAAE,CAAC,OAAc,EAAE,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC;SACrF,CAAC,CAAC;IACL,CAAC;IAMO,wBAAwB,CAAC,OAAc;QAC7C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAA,EAAE;YACnC,OAAO;SACR;QACD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAU,CAAC;QACzD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,GAAG,IAAI,CAAC,EAAE;gBACZ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAClB;QACH,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,IAAK,IAAI,CAAC,KAAa,CAAC,aAAa,EAAE;YACrD,IAAI,CAAC,KAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;SAC3C;IACH,CAAC;CACF","file":"history-plugin.js","sourcesContent":["import type { BaseTableAPI, ListTable, pluginsDefinition, TYPES } from '@visactor/vtable';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport type { TableEventHandlersEventArgumentMap } from '@visactor/vtable/es/ts-types/events';\nimport { captureCellPreChangeContent, parseA1Notation, popCellPreChangeContent } from './formula';\nimport { replayCommand } from './replay';\nimport { captureSnapshot, cloneDeep, cloneRecord } from './snapshot';\nimport { resolveSheetKey } from './sheet-key';\nimport { FilterActionType } from '../filter/types';\nimport type {\n AddColumnCommand,\n AddRecordCommand,\n CellChange,\n CellCommand,\n ChangeHeaderPositionCommand,\n DeleteColumnCommand,\n DeleteRecordCommand,\n FilterCommand,\n HistoryCommand,\n HistoryPluginOptions,\n HistoryTransaction,\n MergeCellsCommand,\n ResizeColumnCommand,\n ResizeRowCommand,\n SortCommand,\n UpdateRecordCommand\n} from './types';\n\n/**\n * HistoryPlugin\n *\n * 目标:为 VTable / VTableSheet 提供可撤销/恢复(undo/redo)的历史栈管理。\n *\n * 设计要点:\n * - 以 “命令(HistoryCommand)” 作为最小回放单元;以 “事务(HistoryTransaction)” 作为一次 undo/redo 的原子操作。\n * - 通过监听 table 的运行时事件,把用户操作转换为命令并 push 到 undoStack。\n * - undo 时按逆序回放事务命令;redo 时按正序回放事务命令。\n * - 回放期间(isReplaying)会屏蔽事件采集,避免回放动作再次写入历史栈。\n */\nexport class HistoryPlugin implements pluginsDefinition.IVTablePlugin {\n /**\n * 插件唯一标识(pluginManager 用它做索引)。\n */\n id = 'history-plugin';\n /**\n * 插件名称(pluginManager 可用它做展示/检索)。\n */\n name = 'History';\n\n /**\n * 该插件关心的运行时事件列表。\n * VTable 会在这些事件发生时调用本插件的 run(...)。\n */\n runTime: any[] = [\n TABLE_EVENT_TYPE.BEFORE_INIT,\n TABLE_EVENT_TYPE.INITIALIZED,\n TABLE_EVENT_TYPE.BEFORE_KEYDOWN,\n TABLE_EVENT_TYPE.CHANGE_CELL_VALUE,\n TABLE_EVENT_TYPE.CHANGE_CELL_VALUES,\n TABLE_EVENT_TYPE.PASTED_DATA,\n TABLE_EVENT_TYPE.MERGE_CELLS,\n TABLE_EVENT_TYPE.UNMERGE_CELLS,\n TABLE_EVENT_TYPE.ADD_RECORD,\n TABLE_EVENT_TYPE.DELETE_RECORD,\n TABLE_EVENT_TYPE.UPDATE_RECORD,\n TABLE_EVENT_TYPE.ADD_COLUMN,\n TABLE_EVENT_TYPE.DELETE_COLUMN,\n TABLE_EVENT_TYPE.CHANGE_HEADER_POSITION,\n TABLE_EVENT_TYPE.SORT_CLICK,\n TABLE_EVENT_TYPE.RESIZE_ROW,\n TABLE_EVENT_TYPE.RESIZE_ROW_END,\n TABLE_EVENT_TYPE.RESIZE_COLUMN,\n TABLE_EVENT_TYPE.RESIZE_COLUMN_END\n ];\n\n /**\n * 当前绑定的 table 实例(vtable-sheet 下为内部的 ListTable)。\n * 该插件只对 ListTable 生效。\n */\n private table: ListTable | null = null;\n /**\n * vtable-sheet 宿主对象引用(通过 table.__vtableSheet 注入)。\n * 用于访问公式引擎、worksheet eventManager 等。\n */\n private vtableSheet: any;\n /**\n * 当前表格对应的 sheetKey(vtable-sheet 多工作表场景)。\n * 该值会被缓存,避免频繁解析。\n */\n private resolvedSheetKey: string | undefined;\n\n /**\n * 撤销栈:栈顶为最近一次可撤销事务。\n */\n private undoStack: HistoryTransaction[] = [];\n /**\n * 重做栈:栈顶为最近一次可重做事务。\n * 新命令写入后会清空 redoStack。\n */\n private redoStack: HistoryTransaction[] = [];\n /**\n * 当前事务(可选):用于把一组命令打包成一次 undo/redo。\n */\n private currentTransaction: HistoryTransaction | null = null;\n /**\n * 标记当前是否处于回放中(undo/redo 期间)。\n * 回放期间需要屏蔽事件采集,避免“回放导致的新事件”再次写入历史栈。\n */\n private isReplaying = false;\n\n /**\n * 最大保留历史事务数量(超过后会丢弃最早的)。\n */\n private maxHistory: number;\n /**\n * 是否启用命令压缩(比如连续编辑同一单元格合并为一条命令)。\n */\n private enableCompression: boolean;\n private onTransactionPushed?: HistoryPluginOptions['onTransactionPushed'];\n\n /**\n * 上一次快照的 columns(用于计算 add/delete column 的差异与回放)。\n */\n private prevColumnsSnapshot: TYPES.ColumnDefine[] | null = null;\n /**\n * 上一次快照的合并单元格配置(用于 merge/unmerge 的回放)。\n */\n private prevMergeSnapshot: TYPES.CustomMergeCellArray | undefined;\n /**\n * 上一次快照的 records(用于 update_record 的 oldRecords 生成等)。\n */\n private prevRecordsSnapshot: any[] | null = null;\n /**\n * 上一次快照的公式表(A1 -> formula),用于删除列撤销时恢复公式关系。\n */\n private prevFormulasSnapshot: Record<string, string> | null = null;\n /**\n * 上一次快照的“被用户调整过的行高”(key 为表格 rowIndex)。\n */\n private prevResizedRowHeightsSnapshot: Record<number, number> | null = null;\n /**\n * 上一次快照的“被用户调整过的列宽”(key 为表格 colIndex)。\n */\n private prevResizedColWidthsSnapshot: Record<number, number> | null = null;\n\n /**\n * 用于 sort 命令采集的“最近一次稳定排序状态”。\n * 注意:ListTable 在触发 SORT_CLICK 事件前可能会原地改写 internalProps.sortState,\n * 因此不能在 SORT_CLICK 回调里直接读取 internalProps.sortState 来作为 oldSortState,\n * 需要用该缓存值表示“排序前”的状态。\n */\n private lastKnownSortState: TYPES.SortState | TYPES.SortState[] | null = null;\n /**\n * sort 命令采集:一次排序开始时记录的 oldSortState(来自 lastKnownSortState)。\n */\n private sortStartSnapshot: TYPES.SortState | TYPES.SortState[] | null = null;\n /**\n * sort 命令采集:标记一次 SORT_CLICK 已发生,等待 DataSource 的 change_order 事件落盘命令。\n */\n private sortPending = false;\n /**\n * sort 事件监听是否已绑定(绑定在 table.dataSource 上)。\n */\n private sortEventBound = false;\n /**\n * DataSource change_order 事件订阅 id(用于解绑)。\n */\n private sortChangeOrderListenerId: any;\n\n /**\n * 单元格编辑前的内容缓存(key 形如 `${sheetKey}:${row}:${col}`)。\n * CHANGE_CELL_VALUE 先采集旧值,CHANGE_CELL_VALUES 再批量生成命令。\n */\n private cellPreChangeContent: Map<string, any> = new Map();\n /**\n * 公式缓存(用于处理 formula_added 这类“异步追加公式”的事件链)。\n */\n private formulaCache: Map<string, string | undefined> = new Map();\n /**\n * 公式事件是否已绑定(绑定在 worksheet.eventManager 上)。\n */\n private formulaEventBound = false;\n /**\n * worksheet.eventManager 引用,用于解绑 formula_added。\n */\n private formulaEventManager: any;\n /**\n * formula_added 的事件处理函数引用(用于解绑)。\n */\n private onFormulaAddedHandler: any;\n\n /**\n * 行高调整起始高度(RESIZE_ROW -> RESIZE_ROW_END 用于形成 oldHeight/newHeight)。\n */\n private resizeRowStartHeight: Map<number, number> = new Map();\n /**\n * 列宽调整起始宽度(RESIZE_COLUMN -> RESIZE_COLUMN_END 用于形成 oldWidth/newWidth)。\n */\n private resizeColStartWidth: Map<number, number> = new Map();\n\n /**\n * Filter 相关绑定是否已完成。\n *\n * FilterPlugin 的筛选状态变更不一定会映射成 TABLE_EVENT_TYPE(例如点击筛选面板的应用/清除),\n * 因此 HistoryPlugin 需要自行“订阅 FilterPlugin 的状态变化”并把快照差异转成可 undo/redo 的命令。\n */\n private filterEventBound = false;\n /**\n * FilterPlugin.filterStateManager 的订阅取消函数(如果 subscribe 可用)。\n *\n * 用于捕获来自 UI/交互产生的 filter action(APPLY_FILTERS/CLEAR_ALL_FILTERS/REMOVE_FILTER/DISABLE_FILTER)。\n */\n private filterUnsubscribe: (() => void) | null = null;\n /**\n * 最近一次已知的 filter snapshot(用于生成 oldSnapshot/newSnapshot)。\n *\n * 由于 FilterPlugin 的状态变更可能来自:\n * - 直接调用 filter.applyFilterSnapshot(声明式设置)\n * - UI 触发的 filterStateManager action\n * 这里缓存一个“上一帧”快照,用来在变化发生时构造历史命令的差异。\n */\n private filterSnapshotCache: any;\n /**\n * FilterPlugin 的 plugin id(用于回放时从 pluginManager 定位到同一个插件实例)。\n */\n private filterPluginId: string | undefined;\n /**\n * FilterPlugin 实例引用(用于在解绑时恢复被包裹的 applyFilterSnapshot)。\n */\n private filterPluginRef: any;\n /**\n * FilterPlugin.applyFilterSnapshot 的原始实现(被 ensureFilterEventBindings 包裹前的函数)。\n *\n * 我们包裹 applyFilterSnapshot 的目的:\n * - 捕获“声明式 snapshot 设置”带来的状态变化,并确保一定能生成一条 filter 历史命令;\n * - 避免只依赖 stateManager.subscribe(初始化时机/未就绪时可能漏记)。\n */\n private filterApplySnapshotOriginal: any;\n /**\n * applyFilterSnapshot 包裹函数执行中的保护标记。\n *\n * 作用:\n * - 避免包裹 applyFilterSnapshot 时,内部又触发 stateManager.subscribe 导致重复入栈;\n * - 在包裹函数 finally 中统一更新 filterSnapshotCache,保持 old/new 计算正确。\n */\n private filterApplyingSnapshot = false;\n\n /**\n * @param options 插件配置:maxHistory / enableCompression 等。\n */\n constructor(options?: HistoryPluginOptions) {\n this.id = options?.id ?? this.id;\n this.maxHistory = options?.maxHistory ?? 100;\n this.enableCompression = options?.enableCompression ?? false;\n this.onTransactionPushed = options?.onTransactionPushed;\n }\n\n /**\n * VTable 插件协议入口:由 VTable 在运行时事件触发时调用。\n *\n * @param args\n * - args[0] 事件参数(不同 runtime 对应不同 shape)\n * - args[1] runtime(事件类型)\n * - args[2] table 实例\n *\n * 行为:\n * - 首次绑定 table / vtableSheet,并初始化快照状态与 lastKnownSortState。\n * - 确保公式事件与排序事件已绑定(仅绑定一次)。\n * - 如果 isReplaying 为 true,直接返回,避免回放再入栈。\n * - 根据 runtime 分发到对应 handler,生成并 push 命令。\n * - 每次事件后刷新快照,用于下一次计算 old/new 差异。\n */\n run(...args: [TableEventHandlersEventArgumentMap[keyof TableEventHandlersEventArgumentMap], any, BaseTableAPI]) {\n const eventArgs = args[0] as any;\n const runtime = args[1] as any;\n const table = args[2] as ListTable;\n\n if (!table) {\n return;\n }\n if (!this.table) {\n this.table = table;\n this.vtableSheet = (table as any).__vtableSheet;\n if (runtime !== TABLE_EVENT_TYPE.BEFORE_INIT && (table as any).internalProps?.dataSource) {\n const state = this.getSnapshotState();\n const sheetKey = this.getSheetKey();\n captureSnapshot(table, state, {\n formulaManager: this.vtableSheet?.formulaManager,\n sheetKey\n });\n this.setSnapshotState(state);\n this.lastKnownSortState = this.normalizeSortState((table as any).internalProps?.sortState);\n }\n } else if (!this.vtableSheet) {\n this.vtableSheet = (table as any).__vtableSheet;\n }\n\n this.ensureFilterEventBindings();\n if (runtime === TABLE_EVENT_TYPE.BEFORE_INIT) {\n return;\n }\n this.ensureFormulaEventBindings();\n this.ensureSortEventBindings();\n\n const workbookReplaying = (this.table as any)?.__vtableSheet?.__workbookHistoryReplaying;\n if (this.isReplaying || workbookReplaying) {\n return;\n }\n\n switch (runtime) {\n case TABLE_EVENT_TYPE.INITIALIZED:\n break;\n case TABLE_EVENT_TYPE.BEFORE_KEYDOWN:\n this.handleBeforeKeydown(eventArgs);\n break;\n case TABLE_EVENT_TYPE.CHANGE_CELL_VALUE:\n this.handleChangeCellValue(eventArgs);\n break;\n case TABLE_EVENT_TYPE.CHANGE_CELL_VALUES:\n this.handleChangeCellValues(eventArgs);\n break;\n case TABLE_EVENT_TYPE.PASTED_DATA:\n break;\n case TABLE_EVENT_TYPE.MERGE_CELLS:\n this.handleMergeCells(eventArgs);\n break;\n case TABLE_EVENT_TYPE.UNMERGE_CELLS:\n this.handleUnmergeCells(eventArgs);\n break;\n case TABLE_EVENT_TYPE.ADD_RECORD:\n this.handleAddRecord(eventArgs);\n break;\n case TABLE_EVENT_TYPE.DELETE_RECORD:\n this.handleDeleteRecord(eventArgs);\n break;\n case TABLE_EVENT_TYPE.UPDATE_RECORD:\n this.handleUpdateRecord(eventArgs);\n break;\n case TABLE_EVENT_TYPE.ADD_COLUMN:\n this.handleAddColumn(eventArgs);\n break;\n case TABLE_EVENT_TYPE.DELETE_COLUMN:\n this.handleDeleteColumn(eventArgs);\n break;\n case TABLE_EVENT_TYPE.CHANGE_HEADER_POSITION:\n this.handleChangeHeaderPosition(eventArgs);\n break;\n case TABLE_EVENT_TYPE.SORT_CLICK:\n this.handleSortClick(eventArgs);\n break;\n case TABLE_EVENT_TYPE.RESIZE_ROW:\n this.handleResizeRow(eventArgs);\n break;\n case TABLE_EVENT_TYPE.RESIZE_ROW_END:\n this.handleResizeRowEnd(eventArgs);\n break;\n case TABLE_EVENT_TYPE.RESIZE_COLUMN:\n this.handleResizeColumn(eventArgs);\n break;\n case TABLE_EVENT_TYPE.RESIZE_COLUMN_END:\n this.handleResizeColumnEnd(eventArgs);\n break;\n default:\n break;\n }\n\n if (this.table) {\n const state = this.getSnapshotState();\n const sheetKey = this.getSheetKey();\n captureSnapshot(this.table, state, {\n formulaManager: this.vtableSheet?.formulaManager,\n sheetKey\n });\n this.setSnapshotState(state);\n }\n }\n\n /**\n * 开始一个事务:后续 pushCommand 会写入 currentTransaction.commands,\n * 直到 endTransaction() 才一次性压入 undoStack。\n */\n startTransaction(): void {\n if (this.currentTransaction) {\n return;\n }\n this.currentTransaction = { commands: [] };\n }\n\n /**\n * 结束当前事务:若事务内无命令则丢弃;否则压入 undoStack 并清空 redoStack。\n */\n endTransaction(): void {\n if (!this.currentTransaction || this.currentTransaction.commands.length === 0) {\n this.currentTransaction = null;\n return;\n }\n this.pushTransaction(this.currentTransaction);\n this.currentTransaction = null;\n }\n\n /**\n * 撤销一次:弹出 undoStack 栈顶事务,并按逆序回放其命令。\n * 回放完成后将该事务压入 redoStack。\n */\n undo(): void {\n if (!this.table || this.undoStack.length === 0) {\n return;\n }\n const transaction = this.undoStack.pop()!;\n this.isReplaying = true;\n try {\n for (let i = transaction.commands.length - 1; i >= 0; i--) {\n this.applyCommand(transaction.commands[i], 'undo');\n }\n } finally {\n this.isReplaying = false;\n }\n this.redoStack.push(transaction);\n if (this.table) {\n const state = this.getSnapshotState();\n const sheetKey = this.getSheetKey();\n captureSnapshot(this.table, state, {\n formulaManager: this.vtableSheet?.formulaManager,\n sheetKey\n });\n this.setSnapshotState(state);\n }\n }\n\n /**\n * 重做一次:弹出 redoStack 栈顶事务,并按正序回放其命令。\n * 回放完成后将该事务压入 undoStack。\n */\n redo(): void {\n if (!this.table || this.redoStack.length === 0) {\n return;\n }\n const transaction = this.redoStack.pop()!;\n this.isReplaying = true;\n try {\n for (const cmd of transaction.commands) {\n this.applyCommand(cmd, 'redo');\n }\n } finally {\n this.isReplaying = false;\n }\n this.undoStack.push(transaction);\n if (this.table) {\n const state = this.getSnapshotState();\n const sheetKey = this.getSheetKey();\n captureSnapshot(this.table, state, {\n formulaManager: this.vtableSheet?.formulaManager,\n sheetKey\n });\n this.setSnapshotState(state);\n }\n }\n /**\n * 清空历史:会清空 undo/redo,并中止当前事务。\n */\n\n clear(): void {\n this.undoStack = [];\n this.redoStack = [];\n this.currentTransaction = null;\n }\n /**\n * 动态更新插件配置。\n */\n\n updateOptions(options: Partial<HistoryPluginOptions>): void {\n if (options.maxHistory != null) {\n this.maxHistory = options.maxHistory;\n this.trimHistory();\n }\n if (options.enableCompression != null) {\n this.enableCompression = options.enableCompression;\n }\n if (options.onTransactionPushed) {\n this.onTransactionPushed = options.onTransactionPushed;\n }\n }\n\n /**\n * 释放插件:解绑事件、清空栈与缓存,并断开与 table/vtableSheet 的引用。\n */\n release(): void {\n this.clear();\n this.unbindFormulaEvents();\n this.unbindSortEvents();\n this.unbindFilterEvents();\n this.table = null;\n this.vtableSheet = null;\n this.resolvedSheetKey = undefined;\n this.prevColumnsSnapshot = null;\n this.prevMergeSnapshot = undefined;\n this.prevRecordsSnapshot = null;\n this.prevFormulasSnapshot = null;\n this.prevResizedRowHeightsSnapshot = null;\n this.prevResizedColWidthsSnapshot = null;\n this.lastKnownSortState = null;\n this.sortStartSnapshot = null;\n this.sortPending = false;\n this.sortEventBound = false;\n this.sortChangeOrderListenerId = undefined;\n this.cellPreChangeContent.clear();\n this.formulaCache.clear();\n this.resizeRowStartHeight.clear();\n this.resizeColStartWidth.clear();\n this.filterEventBound = false;\n this.filterUnsubscribe = null;\n this.filterSnapshotCache = undefined;\n this.filterPluginId = undefined;\n }\n\n private ensureFilterEventBindings(): void {\n if (!this.table) {\n return;\n }\n const pm = (this.table as any).pluginManager;\n const filterPlugin =\n pm?.getPlugin?.('filter') ??\n pm?.getPluginByName?.('Filter') ??\n pm?.getPlugin?.('filter-plugin') ??\n pm?.getPluginByName?.('filter-plugin');\n if (!filterPlugin?.getFilterSnapshot || !filterPlugin?.applyFilterSnapshot) {\n return;\n }\n\n /**\n * 绑定策略(两个入口互补):\n * 1) 包裹 filter.applyFilterSnapshot:\n * - 任何“声明式设置 snapshot”都会经过这里;\n * - 可以直接比较 oldSnapshot/newSnapshot 并 push 一条 filter 命令;\n * - 不依赖 filterStateManager.subscribe 的就绪时机。\n *\n * 2) 订阅 filter.filterStateManager(如果可用):\n * - 覆盖 UI 交互(例如筛选面板点击“确认/清除”)触发的 action;\n * - 通过 action.type 过滤出真正会改变筛选状态的动作,再根据快照差异 push 命令。\n */\n if (!this.filterEventBound) {\n this.filterEventBound = true;\n this.filterPluginRef = filterPlugin;\n this.filterPluginId = filterPlugin.id ?? 'filter';\n this.filterSnapshotCache = cloneDeep(filterPlugin.getFilterSnapshot());\n }\n\n if (!this.filterApplySnapshotOriginal) {\n this.filterApplySnapshotOriginal = filterPlugin.applyFilterSnapshot?.bind(filterPlugin);\n if (this.filterApplySnapshotOriginal) {\n filterPlugin.applyFilterSnapshot = (snapshot: any): any => {\n if (this.isReplaying) {\n return this.filterApplySnapshotOriginal(snapshot);\n }\n const oldSnapshot = this.filterSnapshotCache ?? filterPlugin.getFilterSnapshot();\n this.filterApplyingSnapshot = true;\n try {\n return this.filterApplySnapshotOriginal(snapshot);\n } finally {\n this.filterApplyingSnapshot = false;\n const newSnapshot = filterPlugin.getFilterSnapshot();\n if (JSON.stringify(oldSnapshot) !== JSON.stringify(newSnapshot)) {\n const cmd: FilterCommand = {\n type: 'filter',\n sheetKey: this.getSheetKey(),\n pluginId: this.filterPluginId ?? 'filter',\n oldSnapshot,\n newSnapshot\n };\n this.pushCommand(cmd as any as HistoryCommand);\n this.filterSnapshotCache = cloneDeep(newSnapshot);\n } else {\n this.filterSnapshotCache = cloneDeep(newSnapshot);\n }\n }\n };\n }\n }\n\n const stateManager = filterPlugin?.filterStateManager;\n if (!this.filterUnsubscribe && stateManager?.subscribe) {\n this.filterUnsubscribe = stateManager.subscribe((_state: any, action: any) => {\n if (this.isReplaying) {\n return;\n }\n if (this.filterApplyingSnapshot) {\n this.filterSnapshotCache = cloneDeep(filterPlugin.getFilterSnapshot());\n return;\n }\n\n const t = action?.type;\n if (\n t !== FilterActionType.APPLY_FILTERS &&\n t !== FilterActionType.CLEAR_ALL_FILTERS &&\n t !== FilterActionType.REMOVE_FILTER &&\n t !== FilterActionType.DISABLE_FILTER\n ) {\n return;\n }\n\n const oldSnapshot = this.filterSnapshotCache ?? filterPlugin.getFilterSnapshot();\n const newSnapshot = filterPlugin.getFilterSnapshot();\n if (JSON.stringify(oldSnapshot) === JSON.stringify(newSnapshot)) {\n return;\n }\n\n const cmd: FilterCommand = {\n type: 'filter',\n sheetKey: this.getSheetKey(),\n pluginId: this.filterPluginId ?? 'filter',\n oldSnapshot,\n newSnapshot\n };\n this.pushCommand(cmd as any as HistoryCommand);\n this.filterSnapshotCache = cloneDeep(newSnapshot);\n });\n }\n }\n\n private unbindFilterEvents(): void {\n /**\n * 解绑策略:\n * - 取消 stateManager.subscribe(如果曾订阅)\n * - 恢复被包裹的 filter.applyFilterSnapshot 原始实现\n * - 清空缓存/标记,确保 release 后不会继续响应旧实例事件\n */\n this.filterUnsubscribe?.();\n this.filterUnsubscribe = null;\n this.filterEventBound = false;\n if (this.filterPluginRef && this.filterApplySnapshotOriginal) {\n this.filterPluginRef.applyFilterSnapshot = this.filterApplySnapshotOriginal;\n }\n this.filterPluginRef = null;\n this.filterApplySnapshotOriginal = null;\n this.filterApplyingSnapshot = false;\n }\n\n /**\n * 获取当前 sheetKey(vtable-sheet 场景)。\n * 内部使用 resolveSheetKey 做缓存更新。\n */\n private getSheetKey(): string | undefined {\n const resolved = resolveSheetKey({\n vtableSheet: this.vtableSheet,\n table: this.table,\n cached: this.resolvedSheetKey\n });\n this.resolvedSheetKey = resolved.cached;\n return resolved.sheetKey;\n }\n\n /**\n * 读取当前快照 state(用于 captureSnapshot 的输入/输出)。\n */\n private getSnapshotState() {\n return {\n prevColumnsSnapshot: this.prevColumnsSnapshot,\n prevMergeSnapshot: this.prevMergeSnapshot,\n prevRecordsSnapshot: this.prevRecordsSnapshot,\n prevFormulasSnapshot: this.prevFormulasSnapshot,\n prevResizedRowHeightsSnapshot: this.prevResizedRowHeightsSnapshot,\n prevResizedColWidthsSnapshot: this.prevResizedColWidthsSnapshot\n };\n }\n\n /**\n * 写入快照 state(captureSnapshot 后调用)。\n */\n private setSnapshotState(next: {\n prevColumnsSnapshot: any;\n prevMergeSnapshot: any;\n prevRecordsSnapshot: any;\n prevFormulasSnapshot?: any;\n prevResizedRowHeightsSnapshot?: any;\n prevResizedColWidthsSnapshot?: any;\n }) {\n this.prevColumnsSnapshot = next.prevColumnsSnapshot;\n this.prevMergeSnapshot = next.prevMergeSnapshot;\n this.prevRecordsSnapshot = next.prevRecordsSnapshot;\n this.prevFormulasSnapshot = next.prevFormulasSnapshot ?? null;\n this.prevResizedRowHeightsSnapshot = next.prevResizedRowHeightsSnapshot ?? null;\n this.prevResizedColWidthsSnapshot = next.prevResizedColWidthsSnapshot ?? null;\n }\n\n /**\n * 压入一个事务到 undoStack(并清空 redoStack)。\n */\n private pushTransaction(tx: HistoryTransaction): void {\n // console.trace('pushTransaction');\n if (tx.commands.length === 0) {\n return;\n }\n this.undoStack.push(tx);\n this.redoStack = [];\n this.trimHistory();\n if (this.onTransactionPushed && !this.isReplaying) {\n const workbookReplaying = (this.table as any)?.__vtableSheet?.__workbookHistoryReplaying;\n if (!workbookReplaying) {\n this.onTransactionPushed({ tx, sheetKey: this.getSheetKey(), table: this.table ?? undefined });\n }\n }\n }\n\n /**\n * 修剪历史栈:保证 undoStack 不超过 maxHistory。\n */\n private trimHistory(): void {\n if (this.undoStack.length > this.maxHistory) {\n this.undoStack.splice(0, this.undoStack.length - this.maxHistory);\n }\n }\n\n /**\n * 压入一条命令:\n * - 若当前存在事务,则追加到事务中;\n * - 否则以单命令事务的形式压入 undoStack。\n */\n private pushCommand(cmd: HistoryCommand): void {\n if (this.currentTransaction) {\n this.currentTransaction.commands.push(cmd);\n return;\n }\n this.pushTransaction({ commands: [cmd] });\n }\n\n /**\n * 记录外部命令:用于其他插件/业务侧主动插入命令到历史栈。\n */\n recordExternalCommand(cmd: HistoryCommand): void {\n if (this.isReplaying) {\n return;\n }\n this.pushCommand(cmd);\n }\n\n /**\n * 单元格变更压缩:用于“连续编辑同一格”的场景,把最新 newContent 合并进上一条 cell/cells 命令。\n */\n private tryCompressCellChange(change: CellChange, sheetKey?: string): boolean {\n if (!this.enableCompression) {\n return false;\n }\n const targetTx = this.currentTransaction || this.undoStack[this.undoStack.length - 1];\n if (!targetTx || targetTx.commands.length === 0) {\n return false;\n }\n const last = targetTx.commands[targetTx.commands.length - 1];\n if ((last.type === 'cell' || last.type === 'cells') && last.sheetKey === sheetKey) {\n const cells = (last as CellCommand).cells;\n if (cells.length === 1 && cells[0].row === change.row && cells[0].col === change.col) {\n cells[0].newContent = change.newContent;\n return true;\n }\n }\n return false;\n }\n\n /**\n * 键盘快捷键:监听 Ctrl/Cmd + Z / Y。\n * - Ctrl/Cmd + Z:undo\n * - Ctrl/Cmd + Shift + Z 或 Ctrl/Cmd + Y:redo\n * 会在公式输入/编辑器激活时跳过,避免干扰输入。\n */\n private handleBeforeKeydown(eventArgs: TableEventHandlersEventArgumentMap['before_keydown']): void {\n const e = eventArgs.event;\n if (!e || !this.table) {\n return;\n }\n\n const isCtrlOrMeta = e.ctrlKey || e.metaKey;\n if (!isCtrlOrMeta) {\n return;\n }\n\n const formulaManager = this.vtableSheet?.formulaManager;\n if (formulaManager?.formulaWorkingOnCell) {\n return;\n }\n if (this.table.editorManager?.editingEditor) {\n return;\n }\n\n const key = e.key.toLowerCase();\n if (key === 'z') {\n const workbookHistory = this.vtableSheet?.getWorkbookHistoryManager?.();\n if (e.shiftKey) {\n workbookHistory ? workbookHistory.redo() : this.redo();\n } else {\n workbookHistory ? workbookHistory.undo() : this.undo();\n }\n e.preventDefault();\n e.stopPropagation();\n } else if (key === 'y') {\n const workbookHistory = this.vtableSheet?.getWorkbookHistoryManager?.();\n workbookHistory ? workbookHistory.redo() : this.redo();\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n /**\n * 单格编辑“变更前”采集:用于在 CHANGE_CELL_VALUES 阶段拿到 oldContent。\n * CHANGE_CELL_VALUE 事件通常在编辑开始/值即将改变时触发。\n */\n private handleChangeCellValue(eventArgs: TableEventHandlersEventArgumentMap['change_cell_value']): void {\n captureCellPreChangeContent({\n sheetKey: this.getSheetKey(),\n row: eventArgs.row,\n col: eventArgs.col,\n currentValue: eventArgs.currentValue,\n formulaManager: this.vtableSheet?.formulaManager,\n store: this.cellPreChangeContent\n });\n }\n\n /**\n * 单元格批量变更:生成 cells 命令并入栈。\n * 处理逻辑:\n * - 根据 preChangeContent 取 oldContent,fallback 使用 currentValue\n * - 对公式输入/显示值等场景做过滤,避免重复记录\n * - 如果允许压缩,尝试合并到上一条命令\n */\n private handleChangeCellValues(eventArgs: TableEventHandlersEventArgumentMap['change_cell_values']): void {\n if (!this.table) {\n return;\n }\n const sheetKey = this.getSheetKey();\n const formulaManager = this.vtableSheet?.formulaManager;\n const cells: CellChange[] = eventArgs.values\n .map(v => {\n const oldContent = popCellPreChangeContent({\n sheetKey,\n row: v.row,\n col: v.col,\n fallbackOldContent: v.currentValue,\n store: this.cellPreChangeContent\n });\n const normalizedOld = oldContent == null ? '' : oldContent;\n const normalizedNew = v.changedValue == null ? '' : v.changedValue;\n return { row: v.row, col: v.col, oldContent: normalizedOld, newContent: normalizedNew };\n })\n .filter(c => {\n if (c.oldContent === c.newContent) {\n return false;\n }\n if (!sheetKey || !formulaManager?.getCellFormula || !formulaManager?.getCellValue) {\n return true;\n }\n if (typeof c.newContent === 'string' && c.newContent.startsWith('=')) {\n return false;\n }\n const formula = formulaManager.getCellFormula({ sheet: sheetKey, row: c.row, col: c.col });\n if (!formula) {\n return true;\n }\n const result = formulaManager.getCellValue({ sheet: sheetKey, row: c.row, col: c.col });\n const display = result?.error ? '#ERROR!' : result?.value;\n if (display === c.newContent) {\n return false;\n }\n if (display != null && c.newContent != null && String(display) === String(c.newContent)) {\n return false;\n }\n return true;\n });\n\n if (!cells.length) {\n return;\n }\n\n if (sheetKey && cells.length === 1 && this.tryCompressCellChange(cells[0], sheetKey)) {\n return;\n }\n\n const cmd: CellCommand = { type: 'cells', sheetKey, cells };\n this.pushCommand(cmd);\n }\n\n /**\n * 绑定 vtable-sheet 的公式事件(worksheet.eventManager)。\n * 当前用于监听 formula_added,把“公式变更”也纳入历史栈。\n */\n private ensureFormulaEventBindings(): void {\n if (!this.table || !this.vtableSheet || this.formulaEventBound) {\n return;\n }\n const sheetKey = this.getSheetKey();\n if (!sheetKey) {\n return;\n }\n const worksheet =\n this.vtableSheet.getWorkSheetByKey?.(sheetKey) ?? this.vtableSheet.workSheetInstances?.get?.(sheetKey);\n const eventManager = (worksheet as any)?.eventManager;\n if (!eventManager?.on || !eventManager?.off) {\n return;\n }\n\n this.formulaEventBound = true;\n this.formulaEventManager = eventManager;\n\n this.onFormulaAddedHandler = (event: any) => {\n if (this.isReplaying) {\n return;\n }\n const cell = event?.cell;\n const formula = event?.formula;\n if (!cell || typeof cell.row !== 'number' || typeof cell.col !== 'number') {\n return;\n }\n if (typeof formula !== 'string' || !formula.length) {\n return;\n }\n const normalized = formula.startsWith('=') ? formula : `=${formula}`;\n const key = `${sheetKey}:${cell.row}:${cell.col}`;\n const prev = this.formulaCache.get(key);\n const oldContent: any = popCellPreChangeContent({\n sheetKey,\n row: cell.row,\n col: cell.col,\n fallbackOldContent: typeof prev !== 'undefined' ? prev : '',\n store: this.cellPreChangeContent\n });\n\n if (oldContent === normalized) {\n this.formulaCache.set(key, normalized);\n return;\n }\n\n const cmd: CellCommand = {\n type: 'cells',\n sheetKey,\n cells: [{ row: cell.row, col: cell.col, oldContent, newContent: normalized }]\n };\n this.pushCommand(cmd);\n this.formulaCache.set(key, normalized);\n };\n\n eventManager.on('formula_added', this.onFormulaAddedHandler);\n }\n\n /**\n * 绑定排序事件(DataSource.change_order)。\n * 采集时机:\n * - SORT_CLICK:记录 oldSortState(来自 lastKnownSortState),并设置 sortPending=true\n * - change_order:排序数据真正发生变化后触发,在这里落盘 sort 命令,并更新 lastKnownSortState\n *\n * 这样设计的原因:\n * - ListTable 在 fire SORT_CLICK 前可能已经原地改写 internalProps.sortState,\n * 不能依赖 SORT_CLICK 时读取 internalProps.sortState 来当 oldSortState。\n */\n private ensureSortEventBindings(): void {\n if (!this.table || this.sortEventBound) {\n return;\n }\n const ds: any = (this.table as any).internalProps?.dataSource;\n if (!ds?.on || !ds?.off) {\n return;\n }\n this.sortEventBound = true;\n this.sortChangeOrderListenerId = ds.on('change_order', () => {\n if (this.isReplaying || !this.table || !this.sortPending) {\n return;\n }\n const sheetKey = this.getSheetKey();\n const oldSortState = this.sortStartSnapshot;\n this.sortStartSnapshot = null;\n this.sortPending = false;\n const newSortState = this.normalizeSortState((this.table as any).internalProps?.sortState);\n if (JSON.stringify(oldSortState) === JSON.stringify(newSortState)) {\n this.lastKnownSortState = newSortState;\n return;\n }\n const cmd: SortCommand = {\n type: 'sort',\n sheetKey,\n oldSortState: oldSortState as any,\n newSortState: newSortState as any\n };\n this.pushCommand(cmd);\n this.lastKnownSortState = newSortState;\n });\n }\n\n /**\n * 解绑 DataSource 的排序事件监听。\n */\n private unbindSortEvents(): void {\n if (!this.sortEventBound) {\n return;\n }\n const ds: any = (this.table as any)?.internalProps?.dataSource;\n try {\n if (ds?.off && this.sortChangeOrderListenerId) {\n ds.off(this.sortChangeOrderListenerId);\n }\n } catch {\n } finally {\n this.sortEventBound = false;\n this.sortChangeOrderListenerId = undefined;\n this.sortPending = false;\n this.sortStartSnapshot = null;\n }\n }\n\n /**\n * 解绑 worksheet 的公式事件监听。\n */\n private unbindFormulaEvents(): void {\n if (!this.formulaEventBound || !this.formulaEventManager) {\n return;\n }\n try {\n if (this.onFormulaAddedHandler) {\n this.formulaEventManager.off('formula_added', this.onFormulaAddedHandler);\n }\n } catch {\n // ignore\n } finally {\n this.formulaEventBound = false;\n this.formulaEventManager = undefined;\n this.onFormulaAddedHandler = undefined;\n }\n }\n\n /**\n * 合并单元格配置深拷贝:避免引用被后续修改污染历史命令。\n */\n private cloneMergeConfig(input: any): any {\n if (Array.isArray(input)) {\n return input.map(i => cloneDeep(i));\n }\n return input;\n }\n\n /**\n * 判断两个合并配置是否一致(用于去重:避免重复入栈)。\n */\n private isSameMergeConfig(a: any, b: any): boolean {\n const normalize = (v: any) => {\n if (v == null) {\n return [];\n }\n if (Array.isArray(v)) {\n return v;\n }\n return v;\n };\n const aa = normalize(a);\n const bb = normalize(b);\n if (aa === bb) {\n return true;\n }\n if (Array.isArray(aa) && Array.isArray(bb)) {\n if (aa.length !== bb.length) {\n return false;\n }\n for (let i = 0; i < aa.length; i++) {\n const ra = aa[i]?.range;\n const rb = bb[i]?.range;\n if (\n !ra ||\n !rb ||\n ra.start?.col !== rb.start?.col ||\n ra.start?.row !== rb.start?.row ||\n ra.end?.col !== rb.end?.col ||\n ra.end?.row !== rb.end?.row ||\n aa[i]?.text !== bb[i]?.text\n ) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n /**\n * merge_cells 事件处理:抽象到 handleMergeConfigChanged。\n */\n private handleMergeCells(eventArgs: TableEventHandlersEventArgumentMap['merge_cells']): void {\n this.handleMergeConfigChanged(eventArgs);\n }\n\n /**\n * unmerge_cells 事件处理:抽象到 handleMergeConfigChanged。\n */\n private handleUnmergeCells(eventArgs: TableEventHandlersEventArgumentMap['unmerge_cells']): void {\n this.handleMergeConfigChanged(eventArgs);\n }\n\n /**\n * 合并配置变更统一处理:对比 prevMergeSnapshot 与当前 table.options.customMergeCell,\n * 生成 merge_cells 命令入栈。\n */\n private handleMergeConfigChanged(eventArgs: {\n startCol: number;\n startRow: number;\n endCol: number;\n endRow: number;\n }): void {\n if (!this.table) {\n return;\n }\n const { startCol, startRow, endCol, endRow } = eventArgs;\n const before = this.cloneMergeConfig(this.prevMergeSnapshot);\n const after = this.cloneMergeConfig((this.table as any).options?.customMergeCell);\n if (this.isSameMergeConfig(before, after)) {\n return;\n }\n\n const cmd: MergeCellsCommand = {\n type: 'merge_cells',\n sheetKey: this.getSheetKey(),\n startCol,\n startRow,\n endCol,\n endRow,\n oldCustomMergeCell: before,\n newCustomMergeCell: after\n };\n this.pushCommand(cmd);\n }\n\n /**\n * 添加行:记录新增 records 与插入位置。\n */\n private handleAddRecord(eventArgs: TableEventHandlersEventArgumentMap['add_record']): void {\n const sheetKey = this.getSheetKey();\n const cmd: AddRecordCommand = {\n type: 'add_record',\n sheetKey,\n records: Array.isArray(eventArgs.records) ? eventArgs.records.slice() : [],\n recordIndex: eventArgs.recordIndex,\n recordCount: eventArgs.recordCount ?? (Array.isArray(eventArgs.records) ? eventArgs.records.length : 0)\n };\n if (this.table && typeof eventArgs.recordIndex === 'number') {\n const start = eventArgs.recordIndex;\n const count = cmd.recordCount;\n const ds: any = (this.table as any)?.internalProps?.dataSource;\n const rawRecords: any[] | undefined = ds?.dataSourceObj?.records;\n const viewRecords = (this.table as any).records as any[];\n if (Array.isArray(viewRecords) && viewRecords.length) {\n cmd.anchorBefore = start > 0 ? viewRecords[start - 1] : undefined;\n cmd.anchorAfter = viewRecords[start + count];\n }\n if (Array.isArray(rawRecords) && Array.isArray(viewRecords)) {\n let rawInsertIndex = rawRecords.length;\n if (viewRecords.length === 0) {\n rawInsertIndex = rawRecords.length;\n } else if (start <= 0) {\n const first = viewRecords[0];\n const idx = rawRecords.indexOf(first);\n rawInsertIndex = idx >= 0 ? idx : 0;\n } else if (start >= viewRecords.length) {\n const last = viewRecords[viewRecords.length - 1];\n const idx = rawRecords.indexOf(last);\n rawInsertIndex = idx >= 0 ? idx + 1 : rawRecords.length;\n } else {\n const prev = viewRecords[start - 1];\n const idx = rawRecords.indexOf(prev);\n rawInsertIndex = idx >= 0 ? idx + 1 : rawRecords.length;\n }\n cmd.rawInsertIndex = rawInsertIndex;\n }\n }\n this.pushCommand(cmd);\n }\n\n /**\n * 删除行:记录被删除的 records 与 index 列表;必要时记录被删除行的自定义行高与合并配置快照。\n */\n private handleDeleteRecord(eventArgs: TableEventHandlersEventArgumentMap['delete_record']): void {\n const sheetKey = this.getSheetKey();\n const recordIndexs = Array.isArray(eventArgs.recordIndexs)\n ? ((eventArgs.recordIndexs as (number | number[])[]).slice() as (number | number[])[])\n : [eventArgs.recordIndexs as any];\n\n let deletedRowHeights: Record<number, number> | undefined;\n if (this.table && this.prevResizedRowHeightsSnapshot) {\n const headerCount = (this.table as any).transpose\n ? (this.table as any).rowHeaderLevelCount\n : (this.table as any).columnHeaderLevelCount;\n recordIndexs.forEach(idx => {\n if (typeof idx !== 'number') {\n return;\n }\n const rowIndex = idx + (headerCount ?? 0);\n const height = this.prevResizedRowHeightsSnapshot?.[rowIndex];\n if (typeof height === 'number') {\n if (!deletedRowHeights) {\n deletedRowHeights = {};\n }\n deletedRowHeights[idx] = height;\n }\n });\n }\n\n const oldCustomMergeCell = this.cloneMergeConfig(this.prevMergeSnapshot);\n const newCustomMergeCell = this.cloneMergeConfig((this.table as any)?.options?.customMergeCell);\n\n const cmd: DeleteRecordCommand = {\n type: 'delete_record',\n sheetKey,\n records: Array.isArray(eventArgs.records) ? eventArgs.records.slice() : [],\n recordIndexs,\n deletedRowHeights,\n oldCustomMergeCell,\n newCustomMergeCell\n };\n this.pushCommand(cmd);\n }\n\n /**\n * 更新行:从 prevRecordsSnapshot 生成 oldRecords,与本次 newRecords / recordIndexs 形成 update_record 命令。\n */\n private handleUpdateRecord(eventArgs: TableEventHandlersEventArgumentMap['update_record']): void {\n if (!this.table) {\n return;\n }\n const sheetKey = this.getSheetKey();\n const recordIndexs = (eventArgs.recordIndexs || []) as (number | number[])[];\n const newRecords = Array.isArray(eventArgs.records) ? eventArgs.records.slice() : [];\n\n if (!this.prevRecordsSnapshot || !Array.isArray(this.prevRecordsSnapshot) || !recordIndexs.length) {\n return;\n }\n\n const oldRecords: any[] = [];\n recordIndexs.forEach(idx => {\n if (typeof idx === 'number') {\n const rec = this.prevRecordsSnapshot![idx];\n oldRecords.push(rec !== undefined ? cloneRecord(rec) : undefined);\n } else {\n oldRecords.push(undefined);\n }\n });\n\n const cmd: UpdateRecordCommand = { type: 'update_record', sheetKey, oldRecords, newRecords, recordIndexs };\n this.pushCommand(cmd);\n }\n\n /**\n * 添加列:从 columns 快照中提取新增列定义,生成 add_column 命令。\n */\n private handleAddColumn(eventArgs: TableEventHandlersEventArgumentMap['add_column']): void {\n if (!this.table) {\n return;\n }\n const sheetKey = this.getSheetKey();\n const { columnIndex, columnCount, columns } = eventArgs;\n const addedColumns = (columns as TYPES.ColumnDefine[])\n .slice(columnIndex, columnIndex + columnCount)\n .map(c => cloneDeep(c));\n const cmd: AddColumnCommand = { type: 'add_column', sheetKey, columnIndex, columnCount, columns: addedColumns };\n this.pushCommand(cmd);\n }\n\n /**\n * 删除列:记录被删除的列定义、二维数组 records 场景下被 splice 掉的列值、\n * 以及 vtable-sheet 场景下被删除列对应的公式与列宽信息,生成 delete_column 命令。\n */\n private handleDeleteColumn(eventArgs: TableEventHandlersEventArgumentMap['delete_column']): void {\n if (!this.table) {\n return;\n }\n const sheetKey = this.getSheetKey();\n const deleteColIndexs = (eventArgs.deleteColIndexs || []).slice();\n const deletedColumnsFromEvent = (eventArgs as any).deletedColumns as TYPES.ColumnDefine[] | undefined;\n const prevColumns = this.prevColumnsSnapshot || [];\n const deletedColumns: TYPES.ColumnDefine[] = Array.isArray(deletedColumnsFromEvent)\n ? deletedColumnsFromEvent.map(c => cloneDeep(c))\n : [];\n if (!deletedColumns.length) {\n deleteColIndexs.forEach(idx => {\n if (idx >= 0 && idx < prevColumns.length) {\n deletedColumns.push(cloneDeep(prevColumns[idx]));\n }\n });\n }\n\n let deletedRecordValues: any[][] | undefined = (eventArgs as any).deletedRecordValues as any[][] | undefined;\n if (!Array.isArray(deletedRecordValues) || !deletedRecordValues.length) {\n deletedRecordValues = undefined;\n if (Array.isArray(this.prevRecordsSnapshot) && this.prevRecordsSnapshot.length) {\n deletedRecordValues = this.prevRecordsSnapshot.map(rec => {\n if (Array.isArray(rec)) {\n return deleteColIndexs.map(idx => rec[idx]);\n }\n return [];\n });\n if (deletedRecordValues.every(v => v.length === 0)) {\n deletedRecordValues = undefined;\n }\n }\n }\n\n let deletedFormulas: Record<string, string> | undefined;\n if (this.prevFormulasSnapshot && deleteColIndexs.length) {\n const entries = Object.entries(this.prevFormulasSnapshot);\n entries.forEach(([cellRef, formula]) => {\n const parsed = parseA1Notation(cellRef);\n if (parsed && deleteColIndexs.includes(parsed.col)) {\n if (!deletedFormulas) {\n deletedFormulas = {};\n }\n deletedFormulas[cellRef] = formula;\n }\n });\n }\n\n let deletedColWidths: Record<number, number> | undefined;\n if (this.prevResizedColWidthsSnapshot && deleteColIndexs.length) {\n deleteColIndexs.forEach(idx => {\n const w = this.prevResizedColWidthsSnapshot?.[idx];\n if (typeof w === 'number') {\n if (!deletedColWidths) {\n deletedColWidths = {};\n }\n deletedColWidths[idx] = w;\n }\n });\n }\n\n const cmd: DeleteColumnCommand = {\n type: 'delete_column',\n sheetKey,\n deleteColIndexs,\n columns: deletedColumns,\n deletedRecordValues,\n deletedFormulas,\n deletedColWidths\n };\n this.pushCommand(cmd);\n }\n\n /**\n * 调整表头位置(拖拽列/行顺序):记录 sourceIndex/targetIndex 与移动类型(row/column)。\n */\n private handleChangeHeaderPosition(eventArgs: TableEventHandlersEventArgumentMap['change_header_position']): void {\n const sheetKey = this.getSheetKey();\n const moving = eventArgs.movingColumnOrRow ?? 'column';\n const sourceIndex = moving === 'column' ? eventArgs.source.col : eventArgs.source.row;\n const targetIndex = moving === 'column' ? eventArgs.target.col : eventArgs.target.row;\n\n const cmd: ChangeHeaderPositionCommand = {\n type: 'change_header_position',\n sheetKey,\n moving,\n sourceIndex,\n targetIndex\n };\n this.pushCommand(cmd);\n }\n\n /**\n * 把内部 sortState 归一化为可序列化且稳定的结构。\n * - 过滤掉 order=normal 的项(等价于“不参与排序”)\n * - 多列排序时返回数组;单列排序时返回对象;无排序时返回 null\n */\n private normalizeSortState(input: any): TYPES.SortState | TYPES.SortState[] | null {\n if (!input) {\n return null;\n }\n if (Array.isArray(input)) {\n const list = input\n .filter(Boolean)\n .map((s: any) => ({ field: s.field, order: s.order }))\n .filter((s: any) => typeof s.field !== 'undefined' && s.order && s.order !== 'normal');\n return list.length ? (list as any) : null;\n }\n const s = input as any;\n if (typeof s.field === 'undefined' || !s.order || s.order === 'normal') {\n return null;\n }\n return { field: s.field, order: s.order } as any;\n }\n\n /**\n * SORT_CLICK:记录排序开始前的 oldSortState(来自 lastKnownSortState),并标记 sortPending。\n * 实际的命令落盘在 DataSource.change_order 回调里完成。\n *\n * 同时设置一个 0ms 的兜底清理:如果用户在 SORT_CLICK 回调里返回 false 取消了排序,\n * 则不会有 change_order 事件,此时要清空 sortPending/sortStartSnapshot 防止污染后续操作。\n */\n private handleSortClick(_eventArgs: TableEventHandlersEventArgumentMap['sort_click']): void {\n if (!this.table) {\n return;\n }\n this.sortStartSnapshot = this.lastKnownSortState;\n this.sortPending = true;\n setTimeout(() => {\n if (this.sortPending) {\n this.sortPending = false;\n this.sortStartSnapshot = null;\n }\n }, 0);\n }\n\n /**\n * RESIZE_ROW:记录起始行高(用于 end 阶段计算 oldHeight/newHeight)。\n */\n private handleResizeRow(eventArgs: TableEventHandlersEventArgumentMap['resize_row']): void {\n if (!this.table) {\n return;\n }\n const row = eventArgs.row;\n if (!this.resizeRowStartHeight.has(row)) {\n const oldHeight = (this.table as any).getRowHeight?.(row);\n if (typeof oldHeight === 'number') {\n this.resizeRowStartHeight.set(row, oldHeight);\n }\n }\n }\n\n /**\n * RESIZE_ROW_END:生成 resize_row 命令入栈。\n */\n private handleResizeRowEnd(eventArgs: TableEventHandlersEventArgumentMap['resize_row_end']): void {\n if (!this.table) {\n return;\n }\n const sheetKey = this.getSheetKey();\n const row = eventArgs.row;\n const newHeight = eventArgs.rowHeight;\n const oldHeight = this.resizeRowStartHeight.get(row) ?? newHeight;\n this.resizeRowStartHeight.delete(row);\n\n if (typeof oldHeight === 'number' && typeof newHeight === 'number' && oldHeight === newHeight) {\n return;\n }\n const cmd: ResizeRowCommand = { type: 'resize_row', sheetKey, row, oldHeight, newHeight };\n this.pushCommand(cmd);\n }\n\n /**\n * RESIZE_COLUMN:记录起始列宽(用于 end 阶段计算 oldWidth/newWidth)。\n */\n private handleResizeColumn(eventArgs: TableEventHandlersEventArgumentMap['resize_column']): void {\n if (!this.table) {\n return;\n }\n const col = eventArgs.col;\n if (!this.resizeColStartWidth.has(col)) {\n const oldWidth = (this.table as any).getColWidth?.(col);\n if (typeof oldWidth === 'number') {\n this.resizeColStartWidth.set(col, oldWidth);\n }\n }\n }\n\n /**\n * RESIZE_COLUMN_END:生成 resize_column 命令入栈。\n */\n private handleResizeColumnEnd(eventArgs: TableEventHandlersEventArgumentMap['resize_column_end']): void {\n if (!this.table) {\n return;\n }\n const sheetKey = this.getSheetKey();\n const col = eventArgs.col;\n const colWidths = eventArgs.colWidths || [];\n const newWidth = colWidths[col] ?? (this.table as any).getColWidth?.(col);\n const oldWidth = this.resizeColStartWidth.get(col) ?? newWidth;\n this.resizeColStartWidth.delete(col);\n\n if (typeof oldWidth === 'number' && typeof newWidth === 'number' && oldWidth === newWidth) {\n return;\n }\n const cmd: ResizeColumnCommand = { type: 'resize_column', sheetKey, col, oldWidth, newWidth };\n this.pushCommand(cmd);\n }\n\n /**\n * 回放单条命令:统一委托给 replayCommand(集中管理回放逻辑)。\n */\n private applyCommand(cmd: HistoryCommand, direction: 'undo' | 'redo'): void {\n if (!this.table) {\n return;\n }\n replayCommand({\n table: this.table,\n vtableSheet: this.vtableSheet,\n cmd,\n direction,\n deleteRecordsByReference: (records: any[]) => this.deleteRecordsByReference(records)\n });\n }\n\n /**\n * 按“引用匹配”删除记录:用于 add_record 撤销时找不到确定 index 的场景。\n * 注意:要求 table.records 与命令中 records 仍然保持引用一致。\n */\n private deleteRecordsByReference(records: any[]): void {\n if (!this.table || !records?.length) {\n return;\n }\n const tableRecords = (this.table.records || []) as any[];\n const indexs: number[] = [];\n records.forEach(rec => {\n const idx = tableRecords.indexOf(rec);\n if (idx >= 0) {\n indexs.push(idx);\n }\n });\n if (indexs.length && (this.table as any).deleteRecords) {\n (this.table as any).deleteRecords(indexs);\n }\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export { HistoryPlugin } from './history-plugin';
2
+ export { replayCommand } from './replay';
3
+ export type { HistoryCommand, HistoryPluginOptions, HistoryTransaction } from './types';
@@ -0,0 +1,4 @@
1
+ export { HistoryPlugin } from "./history-plugin";
2
+
3
+ export { replayCommand } from "./replay";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/history/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC","file":"index.js","sourcesContent":["export { HistoryPlugin } from './history-plugin';\nexport { replayCommand } from './replay';\nexport type { HistoryCommand, HistoryPluginOptions, HistoryTransaction } from './types';\n"]}
@@ -0,0 +1,9 @@
1
+ import type { ListTable } from '@visactor/vtable';
2
+ import type { HistoryCommand } from './types';
3
+ export declare function replayCommand(args: {
4
+ table: ListTable;
5
+ vtableSheet: any;
6
+ cmd: HistoryCommand;
7
+ direction: 'undo' | 'redo';
8
+ deleteRecordsByReference: (records: any[]) => void;
9
+ }): void;
@@ -0,0 +1,260 @@
1
+ import { applyCellContent, parseA1Notation } from "./formula";
2
+
3
+ function cloneMergeConfig(input) {
4
+ return Array.isArray(input) ? input.map((i => Object.assign(Object.assign({}, i), {
5
+ range: (null == i ? void 0 : i.range) ? {
6
+ start: Object.assign({}, i.range.start),
7
+ end: Object.assign({}, i.range.end)
8
+ } : null == i ? void 0 : i.range
9
+ }))) : input;
10
+ }
11
+
12
+ function getCustomMergeCellFunc(customMergeCell) {
13
+ return "function" == typeof customMergeCell ? customMergeCell : Array.isArray(customMergeCell) ? (col, row) => customMergeCell.find((item => item.range.start.col <= col && item.range.end.col >= col && item.range.start.row <= row && item.range.end.row >= row)) : void 0;
14
+ }
15
+
16
+ function applyMergeConfig(table, customMergeCell) {
17
+ (null == table ? void 0 : table.options) && (null == table ? void 0 : table.internalProps) && (table.options.customMergeCell = cloneMergeConfig(customMergeCell),
18
+ table.internalProps.customMergeCell = getCustomMergeCellFunc(table.options.customMergeCell));
19
+ }
20
+
21
+ function cloneSortState(input) {
22
+ return input ? Array.isArray(input) ? input.filter(Boolean).map((s => ({
23
+ field: s.field,
24
+ order: s.order
25
+ }))) : {
26
+ field: input.field,
27
+ order: input.order
28
+ } : null;
29
+ }
30
+
31
+ export function replayCommand(args) {
32
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16;
33
+ const {table: table, vtableSheet: vtableSheet, cmd: cmd, direction: direction, deleteRecordsByReference: deleteRecordsByReference} = args;
34
+ switch (cmd.type) {
35
+ case "cell":
36
+ case "cells":
37
+ {
38
+ const sheetKey = cmd.sheetKey;
39
+ cmd.cells.forEach((c => {
40
+ const content = "undo" === direction ? c.oldContent : c.newContent;
41
+ applyCellContent({
42
+ table: table,
43
+ sheetKey: sheetKey,
44
+ row: c.row,
45
+ col: c.col,
46
+ content: content,
47
+ formulaManager: null == vtableSheet ? void 0 : vtableSheet.formulaManager
48
+ });
49
+ }));
50
+ break;
51
+ }
52
+
53
+ case "merge_cells":
54
+ {
55
+ const c = cmd, next = "undo" === direction ? c.oldCustomMergeCell : c.newCustomMergeCell;
56
+ applyMergeConfig(table, next);
57
+ const sg = table.scenegraph;
58
+ if (null == sg ? void 0 : sg.updateCellContent) {
59
+ for (let i = c.startCol; i <= c.endCol; i++) for (let j = c.startRow; j <= c.endRow; j++) sg.updateCellContent(i, j);
60
+ null === (_a = sg.updateNextFrame) || void 0 === _a || _a.call(sg);
61
+ } else "function" == typeof table.renderWithRecreateCells && table.renderWithRecreateCells();
62
+ break;
63
+ }
64
+
65
+ case "filter":
66
+ {
67
+ const c = cmd, pluginId = c.pluginId, snapshot = "undo" === direction ? c.oldSnapshot : c.newSnapshot, pm = table.pluginManager, filterPlugin = null !== (_g = null !== (_e = null !== (_c = null === (_b = null == pm ? void 0 : pm.getPlugin) || void 0 === _b ? void 0 : _b.call(pm, pluginId)) && void 0 !== _c ? _c : null === (_d = null == pm ? void 0 : pm.getPluginByName) || void 0 === _d ? void 0 : _d.call(pm, "Filter")) && void 0 !== _e ? _e : null === (_f = null == pm ? void 0 : pm.getPlugin) || void 0 === _f ? void 0 : _f.call(pm, "filter")) && void 0 !== _g ? _g : null === (_h = null == pm ? void 0 : pm.getPluginByName) || void 0 === _h ? void 0 : _h.call(pm, "filter");
68
+ (null == filterPlugin ? void 0 : filterPlugin.applyFilterSnapshot) && filterPlugin.applyFilterSnapshot(snapshot);
69
+ break;
70
+ }
71
+
72
+ case "sort":
73
+ {
74
+ const c = cmd, next = "undo" === direction ? c.oldSortState : c.newSortState;
75
+ null === (_k = (_j = table).updateSortState) || void 0 === _k || _k.call(_j, null !== (_l = cloneSortState(next)) && void 0 !== _l ? _l : null, !0);
76
+ break;
77
+ }
78
+
79
+ case "add_record":
80
+ {
81
+ const c = cmd;
82
+ if ("undo" === direction) {
83
+ const ds = null === (_m = null == table ? void 0 : table.internalProps) || void 0 === _m ? void 0 : _m.dataSource, rawRecords = null === (_o = null == ds ? void 0 : ds.dataSourceObj) || void 0 === _o ? void 0 : _o.records;
84
+ let deletedByRaw = !1;
85
+ if (Array.isArray(rawRecords) && "number" == typeof c.rawInsertIndex && c.recordCount > 0) {
86
+ const idx = c.rawInsertIndex;
87
+ idx >= 0 && idx < rawRecords.length && (rawRecords.splice(idx, c.recordCount), deletedByRaw = !0);
88
+ }
89
+ if (Array.isArray(rawRecords) && Array.isArray(c.records) && c.records.length) for (let i = 0; i < c.records.length; i++) {
90
+ const rawIndex = rawRecords.indexOf(c.records[i]);
91
+ rawIndex >= 0 && (rawRecords.splice(rawIndex, 1), deletedByRaw = !0);
92
+ }
93
+ if (!deletedByRaw && Array.isArray(rawRecords) && "number" == typeof c.recordCount && c.recordCount > 0) {
94
+ const before = c.anchorBefore, after = c.anchorAfter, beforeIndex = before ? rawRecords.indexOf(before) : -1, afterIndex = after ? rawRecords.indexOf(after) : -1;
95
+ beforeIndex >= 0 ? (rawRecords.splice(beforeIndex + 1, c.recordCount), deletedByRaw = !0) : afterIndex >= 0 && (rawRecords.splice(Math.max(0, afterIndex - c.recordCount), c.recordCount),
96
+ deletedByRaw = !0);
97
+ }
98
+ if (deletedByRaw && (null === (_q = null === (_p = null == ds ? void 0 : ds.beforeChangedRecordsMap) || void 0 === _p ? void 0 : _p.clear) || void 0 === _q || _q.call(_p),
99
+ null === (_s = null === (_r = null == ds ? void 0 : ds.sortedIndexMap) || void 0 === _r ? void 0 : _r.clear) || void 0 === _s || _s.call(_r),
100
+ "function" == typeof table.updateFilterRules ? table.updateFilterRules(null === (_t = null == ds ? void 0 : ds.dataConfig) || void 0 === _t ? void 0 : _t.filterRules, {
101
+ clearRowHeightCache: !1
102
+ }) : null === (_u = null == ds ? void 0 : ds.updateFilterRules) || void 0 === _u || _u.call(ds, null === (_v = null == ds ? void 0 : ds.dataConfig) || void 0 === _v ? void 0 : _v.filterRules)),
103
+ !deletedByRaw) if ("number" == typeof c.recordIndex && c.recordCount > 0) {
104
+ const indexs = [];
105
+ for (let i = 0; i < c.recordCount; i++) indexs.push(c.recordIndex + i);
106
+ null === (_x = (_w = table).deleteRecords) || void 0 === _x || _x.call(_w, indexs);
107
+ } else deleteRecordsByReference(c.records);
108
+ } else c.records.length && (null === (_z = (_y = table).addRecords) || void 0 === _z || _z.call(_y, c.records, c.recordIndex));
109
+ break;
110
+ }
111
+
112
+ case "delete_record":
113
+ {
114
+ const c = cmd;
115
+ if ("undo" === direction) {
116
+ if (table.addRecord && Array.isArray(c.records) && Array.isArray(c.recordIndexs)) {
117
+ const pairs = [];
118
+ for (let i = 0; i < c.recordIndexs.length; i++) {
119
+ const idx = c.recordIndexs[i];
120
+ "number" == typeof idx && pairs.push({
121
+ idx: idx,
122
+ record: c.records[i]
123
+ });
124
+ }
125
+ pairs.sort(((a, b) => a.idx - b.idx));
126
+ for (const p of pairs) table.addRecord(p.record, p.idx);
127
+ }
128
+ if (c.deletedRowHeights && "function" == typeof table.setRowHeight) {
129
+ const headerCount = table.transpose ? table.rowHeaderLevelCount : table.columnHeaderLevelCount;
130
+ Object.keys(c.deletedRowHeights).forEach((k => {
131
+ const idx = Number(k), height = c.deletedRowHeights[k];
132
+ Number.isFinite(idx) && "number" == typeof height && table.setRowHeight(idx + (null != headerCount ? headerCount : 0), height);
133
+ }));
134
+ }
135
+ } else table.deleteRecords && table.deleteRecords(c.recordIndexs);
136
+ if ("oldCustomMergeCell" in c || "newCustomMergeCell" in c) {
137
+ const target = "undo" === direction ? c.oldCustomMergeCell : c.newCustomMergeCell;
138
+ applyMergeConfig(table, target);
139
+ const sg = table.scenegraph;
140
+ if (null == sg ? void 0 : sg.updateCellContent) {
141
+ [ ...Array.isArray(c.oldCustomMergeCell) ? c.oldCustomMergeCell.map((i => null == i ? void 0 : i.range)).filter(Boolean) : [], ...Array.isArray(c.newCustomMergeCell) ? c.newCustomMergeCell.map((i => null == i ? void 0 : i.range)).filter(Boolean) : [] ].forEach((r => {
142
+ if (null == r ? void 0 : r.start) for (let col = r.start.col; col <= r.end.col; col++) for (let row = r.start.row; row <= r.end.row; row++) sg.updateCellContent(col, row);
143
+ })), null === (_0 = sg.updateNextFrame) || void 0 === _0 || _0.call(sg);
144
+ } else "function" == typeof table.renderWithRecreateCells && table.renderWithRecreateCells();
145
+ }
146
+ break;
147
+ }
148
+
149
+ case "update_record":
150
+ {
151
+ const c = cmd;
152
+ table.updateRecords && ("undo" === direction ? table.updateRecords(c.oldRecords, c.recordIndexs) : table.updateRecords(c.newRecords, c.recordIndexs));
153
+ break;
154
+ }
155
+
156
+ case "add_column":
157
+ {
158
+ const c = cmd;
159
+ if ("undo" === direction) {
160
+ const deleteIndexs = [];
161
+ for (let i = 0; i < c.columnCount; i++) deleteIndexs.push(c.columnIndex + i);
162
+ null === (_2 = (_1 = table).deleteColumns) || void 0 === _2 || _2.call(_1, deleteIndexs, !0);
163
+ } else null === (_4 = (_3 = table).addColumns) || void 0 === _4 || _4.call(_3, c.columns, c.columnIndex, !0);
164
+ break;
165
+ }
166
+
167
+ case "delete_column":
168
+ {
169
+ const c = cmd;
170
+ if ("undo" === direction) {
171
+ if (c.deleteColIndexs.map(((idx, i) => ({
172
+ idx: idx,
173
+ column: c.columns[i]
174
+ }))).sort(((a, b) => a.idx - b.idx)).forEach((item => {
175
+ var _a, _b;
176
+ null === (_b = (_a = table).addColumns) || void 0 === _b || _b.call(_a, [ item.column ], item.idx, !0);
177
+ })), c.deletedColWidths && "function" == typeof table.setColWidth && Object.entries(c.deletedColWidths).forEach((([k, width]) => {
178
+ const idx = Number(k);
179
+ Number.isFinite(idx) && "number" == typeof width && table.setColWidth(idx, width);
180
+ })), Array.isArray(c.deletedRecordValues) && c.deletedRecordValues.length) {
181
+ const records = table.records;
182
+ if (Array.isArray(records) && records.length) {
183
+ const recordIndexs = [], newRecords = [];
184
+ for (let i = 0; i < records.length; i++) {
185
+ const rec = records[i], rowValues = c.deletedRecordValues[i];
186
+ if (!Array.isArray(rec) || !Array.isArray(rowValues) || rowValues.length !== c.deleteColIndexs.length) continue;
187
+ const next = rec.slice();
188
+ for (let k = 0; k < c.deleteColIndexs.length; k++) next[c.deleteColIndexs[k]] = rowValues[k];
189
+ recordIndexs.push(i), newRecords.push(next);
190
+ }
191
+ recordIndexs.length && (null === (_6 = (_5 = table).updateRecords) || void 0 === _6 || _6.call(_5, newRecords, recordIndexs, !1));
192
+ }
193
+ }
194
+ if (c.sheetKey) {
195
+ const fm = null == vtableSheet ? void 0 : vtableSheet.formulaManager, engine = null == fm ? void 0 : fm.formulaEngine;
196
+ if ((null == fm ? void 0 : fm.normalizeSheetData) && (null == engine ? void 0 : engine.updateSheetData)) try {
197
+ const normalized = fm.normalizeSheetData(table.records || [], table);
198
+ engine.updateSheetData(c.sheetKey, normalized);
199
+ } catch (_17) {}
200
+ }
201
+ if (c.sheetKey && c.deletedFormulas) {
202
+ Object.entries(c.deletedFormulas).forEach((([cellRef, formula]) => {
203
+ const parsed = parseA1Notation(cellRef);
204
+ parsed && applyCellContent({
205
+ table: table,
206
+ sheetKey: c.sheetKey,
207
+ row: parsed.row,
208
+ col: parsed.col,
209
+ content: formula,
210
+ formulaManager: null == vtableSheet ? void 0 : vtableSheet.formulaManager
211
+ });
212
+ }));
213
+ }
214
+ } else null === (_8 = (_7 = table).deleteColumns) || void 0 === _8 || _8.call(_7, c.deleteColIndexs, !0);
215
+ break;
216
+ }
217
+
218
+ case "change_header_position":
219
+ {
220
+ const c = cmd, moving = c.moving, from = "undo" === direction ? c.targetIndex : c.sourceIndex, to = "undo" === direction ? c.sourceIndex : c.targetIndex;
221
+ "column" === moving ? null === (_10 = (_9 = table).changeHeaderPosition) || void 0 === _10 || _10.call(_9, {
222
+ source: {
223
+ col: from,
224
+ row: 0
225
+ },
226
+ target: {
227
+ col: to,
228
+ row: 0
229
+ },
230
+ movingColumnOrRow: "column"
231
+ }) : null === (_12 = (_11 = table).changeHeaderPosition) || void 0 === _12 || _12.call(_11, {
232
+ source: {
233
+ col: 0,
234
+ row: from
235
+ },
236
+ target: {
237
+ col: 0,
238
+ row: to
239
+ },
240
+ movingColumnOrRow: "row"
241
+ });
242
+ break;
243
+ }
244
+
245
+ case "resize_row":
246
+ {
247
+ const c = cmd, height = "undo" === direction ? c.oldHeight : c.newHeight;
248
+ null === (_14 = (_13 = table).setRowHeight) || void 0 === _14 || _14.call(_13, c.row, height);
249
+ break;
250
+ }
251
+
252
+ case "resize_column":
253
+ {
254
+ const c = cmd, width = "undo" === direction ? c.oldWidth : c.newWidth;
255
+ null === (_16 = (_15 = table).setColWidth) || void 0 === _16 || _16.call(_15, c.col, width);
256
+ break;
257
+ }
258
+ }
259
+ }
260
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/history/replay.ts"],"names":[],"mappings":"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","file":"replay.js","sourcesContent":["import type { ListTable } from '@visactor/vtable';\nimport { applyCellContent, parseA1Notation } from './formula';\nimport type {\n AddColumnCommand,\n AddRecordCommand,\n CellCommand,\n ChangeHeaderPositionCommand,\n DeleteColumnCommand,\n DeleteRecordCommand,\n FilterCommand,\n HistoryCommand,\n MergeCellsCommand,\n ResizeColumnCommand,\n ResizeRowCommand,\n SortCommand,\n UpdateRecordCommand\n} from './types';\n\nfunction cloneMergeConfig(input: any): any {\n if (Array.isArray(input)) {\n return input.map(i => ({\n ...i,\n range: i?.range\n ? {\n start: { ...i.range.start },\n end: { ...i.range.end }\n }\n : i?.range\n }));\n }\n return input;\n}\n\nfunction getCustomMergeCellFunc(customMergeCell?: any) {\n if (typeof customMergeCell === 'function') {\n return customMergeCell;\n }\n if (Array.isArray(customMergeCell)) {\n return (col: number, row: number) => {\n return customMergeCell.find(item => {\n return (\n item.range.start.col <= col &&\n item.range.end.col >= col &&\n item.range.start.row <= row &&\n item.range.end.row >= row\n );\n });\n };\n }\n return undefined;\n}\n\nfunction applyMergeConfig(table: any, customMergeCell: any): void {\n if (!table?.options || !table?.internalProps) {\n return;\n }\n table.options.customMergeCell = cloneMergeConfig(customMergeCell);\n table.internalProps.customMergeCell = getCustomMergeCellFunc(table.options.customMergeCell);\n}\n\nfunction cloneSortState(input: any): any {\n if (!input) {\n return null;\n }\n if (Array.isArray(input)) {\n return input.filter(Boolean).map((s: any) => ({\n field: s.field,\n order: s.order\n }));\n }\n return {\n field: (input as any).field,\n order: (input as any).order\n };\n}\n\nexport function replayCommand(args: {\n table: ListTable;\n vtableSheet: any;\n cmd: HistoryCommand;\n direction: 'undo' | 'redo';\n deleteRecordsByReference: (records: any[]) => void;\n}): void {\n const { table, vtableSheet, cmd, direction, deleteRecordsByReference } = args;\n\n // 所有回放逻辑尽量只调用 table 的公开 API,避免依赖内部状态。\n switch (cmd.type) {\n case 'cell':\n case 'cells': {\n const sheetKey = cmd.sheetKey;\n const cells = (cmd as CellCommand).cells;\n cells.forEach(c => {\n const content = direction === 'undo' ? c.oldContent : c.newContent;\n applyCellContent({\n table,\n sheetKey,\n row: c.row,\n col: c.col,\n content,\n formulaManager: vtableSheet?.formulaManager\n });\n });\n break;\n }\n case 'merge_cells': {\n const c = cmd as MergeCellsCommand;\n const next = direction === 'undo' ? c.oldCustomMergeCell : c.newCustomMergeCell;\n applyMergeConfig(table as any, next);\n const sg = (table as any).scenegraph;\n if (sg?.updateCellContent) {\n for (let i = c.startCol; i <= c.endCol; i++) {\n for (let j = c.startRow; j <= c.endRow; j++) {\n sg.updateCellContent(i, j);\n }\n }\n sg.updateNextFrame?.();\n } else if (typeof (table as any).renderWithRecreateCells === 'function') {\n (table as any).renderWithRecreateCells();\n }\n break;\n }\n case 'filter': {\n const c = cmd as FilterCommand;\n const pluginId = (c as any).pluginId;\n const snapshot = direction === 'undo' ? (c as any).oldSnapshot : (c as any).newSnapshot;\n const pm = (table as any).pluginManager;\n const filterPlugin =\n pm?.getPlugin?.(pluginId) ??\n pm?.getPluginByName?.('Filter') ??\n pm?.getPlugin?.('filter') ??\n pm?.getPluginByName?.('filter');\n if (filterPlugin?.applyFilterSnapshot) {\n filterPlugin.applyFilterSnapshot(snapshot);\n }\n break;\n }\n case 'sort': {\n const c = cmd as SortCommand;\n const next = direction === 'undo' ? c.oldSortState : c.newSortState;\n (table as any).updateSortState?.(cloneSortState(next) ?? null, true);\n break;\n }\n case 'add_record': {\n const c = cmd as AddRecordCommand;\n if (direction === 'undo') {\n const ds: any = (table as any)?.internalProps?.dataSource;\n const rawRecords: any[] | undefined = ds?.dataSourceObj?.records;\n let deletedByRaw = false;\n if (Array.isArray(rawRecords) && typeof (c as any).rawInsertIndex === 'number' && c.recordCount > 0) {\n const idx = (c as any).rawInsertIndex;\n if (idx >= 0 && idx < rawRecords.length) {\n rawRecords.splice(idx, c.recordCount);\n deletedByRaw = true;\n }\n }\n if (Array.isArray(rawRecords) && Array.isArray(c.records) && c.records.length) {\n for (let i = 0; i < c.records.length; i++) {\n const rawIndex = rawRecords.indexOf(c.records[i]);\n if (rawIndex >= 0) {\n rawRecords.splice(rawIndex, 1);\n deletedByRaw = true;\n }\n }\n }\n if (!deletedByRaw && Array.isArray(rawRecords) && typeof c.recordCount === 'number' && c.recordCount > 0) {\n const before = (c as any).anchorBefore;\n const after = (c as any).anchorAfter;\n const beforeIndex = before ? rawRecords.indexOf(before) : -1;\n const afterIndex = after ? rawRecords.indexOf(after) : -1;\n if (beforeIndex >= 0) {\n rawRecords.splice(beforeIndex + 1, c.recordCount);\n deletedByRaw = true;\n } else if (afterIndex >= 0) {\n rawRecords.splice(Math.max(0, afterIndex - c.recordCount), c.recordCount);\n deletedByRaw = true;\n }\n }\n if (deletedByRaw) {\n ds?.beforeChangedRecordsMap?.clear?.();\n ds?.sortedIndexMap?.clear?.();\n if (typeof (table as any).updateFilterRules === 'function') {\n (table as any).updateFilterRules(ds?.dataConfig?.filterRules, {\n clearRowHeightCache: false\n });\n } else {\n ds?.updateFilterRules?.(ds?.dataConfig?.filterRules);\n }\n }\n if (!deletedByRaw) {\n if (typeof c.recordIndex === 'number' && c.recordCount > 0) {\n const indexs: number[] = [];\n for (let i = 0; i < c.recordCount; i++) {\n indexs.push(c.recordIndex + i);\n }\n (table as any).deleteRecords?.(indexs);\n } else {\n deleteRecordsByReference(c.records);\n }\n }\n } else {\n if (c.records.length) {\n (table as any).addRecords?.(c.records, c.recordIndex);\n }\n }\n break;\n }\n case 'delete_record': {\n const c = cmd as DeleteRecordCommand;\n if (direction === 'undo') {\n if ((table as any).addRecord && Array.isArray(c.records) && Array.isArray(c.recordIndexs)) {\n // 删除多行时常见的 index 顺序是倒序(便于 splice)。撤销必须按 idx 升序插入回去,保证行顺序稳定。\n const pairs: Array<{ idx: number; record: any }> = [];\n for (let i = 0; i < c.recordIndexs.length; i++) {\n const idx = c.recordIndexs[i];\n if (typeof idx === 'number') {\n pairs.push({ idx, record: c.records[i] });\n }\n }\n pairs.sort((a, b) => a.idx - b.idx);\n for (const p of pairs) {\n (table as any).addRecord(p.record, p.idx);\n }\n }\n if (c.deletedRowHeights && typeof (table as any).setRowHeight === 'function') {\n const headerCount = (table as any).transpose\n ? (table as any).rowHeaderLevelCount\n : (table as any).columnHeaderLevelCount;\n Object.keys(c.deletedRowHeights).forEach(k => {\n const idx = Number(k);\n const height = (c.deletedRowHeights as any)[k];\n if (!Number.isFinite(idx) || typeof height !== 'number') {\n return;\n }\n (table as any).setRowHeight(idx + (headerCount ?? 0), height);\n });\n }\n } else {\n if ((table as any).deleteRecords) {\n (table as any).deleteRecords(c.recordIndexs as any);\n }\n }\n\n const hasMergeSnapshot = 'oldCustomMergeCell' in c || 'newCustomMergeCell' in c;\n if (hasMergeSnapshot) {\n const target = direction === 'undo' ? (c as any).oldCustomMergeCell : (c as any).newCustomMergeCell;\n applyMergeConfig(table as any, target);\n\n const sg = (table as any).scenegraph;\n if (sg?.updateCellContent) {\n const prevRanges = Array.isArray((c as any).oldCustomMergeCell)\n ? ((c as any).oldCustomMergeCell as any[]).map(i => i?.range).filter(Boolean)\n : [];\n const nextRanges = Array.isArray((c as any).newCustomMergeCell)\n ? ((c as any).newCustomMergeCell as any[]).map(i => i?.range).filter(Boolean)\n : [];\n const refreshRanges = [...prevRanges, ...nextRanges];\n refreshRanges.forEach(r => {\n if (!r?.start) {\n return;\n }\n for (let col = r.start.col; col <= r.end.col; col++) {\n for (let row = r.start.row; row <= r.end.row; row++) {\n sg.updateCellContent(col, row);\n }\n }\n });\n sg.updateNextFrame?.();\n } else if (typeof (table as any).renderWithRecreateCells === 'function') {\n (table as any).renderWithRecreateCells();\n }\n }\n break;\n }\n case 'update_record': {\n const c = cmd as UpdateRecordCommand;\n if ((table as any).updateRecords) {\n if (direction === 'undo') {\n (table as any).updateRecords(c.oldRecords, c.recordIndexs as any);\n } else {\n (table as any).updateRecords(c.newRecords, c.recordIndexs as any);\n }\n }\n break;\n }\n case 'add_column': {\n const c = cmd as AddColumnCommand;\n if (direction === 'undo') {\n const deleteIndexs: number[] = [];\n for (let i = 0; i < c.columnCount; i++) {\n deleteIndexs.push(c.columnIndex + i);\n }\n (table as any).deleteColumns?.(deleteIndexs, true);\n } else {\n (table as any).addColumns?.(c.columns, c.columnIndex, true);\n }\n break;\n }\n case 'delete_column': {\n const c = cmd as DeleteColumnCommand;\n if (direction === 'undo') {\n const items = c.deleteColIndexs.map((idx, i) => ({ idx, column: c.columns[i] })).sort((a, b) => a.idx - b.idx);\n\n items.forEach(item => {\n (table as any).addColumns?.([item.column], item.idx, true);\n });\n\n if (c.deletedColWidths && typeof (table as any).setColWidth === 'function') {\n Object.entries(c.deletedColWidths).forEach(([k, width]) => {\n const idx = Number(k);\n if (!Number.isFinite(idx) || typeof width !== 'number') {\n return;\n }\n (table as any).setColWidth(idx, width);\n });\n }\n\n if (Array.isArray(c.deletedRecordValues) && c.deletedRecordValues.length) {\n const records = (table as any).records as any[] | undefined;\n if (Array.isArray(records) && records.length) {\n const recordIndexs: number[] = [];\n const newRecords: any[] = [];\n for (let i = 0; i < records.length; i++) {\n const rec = records[i];\n const rowValues = c.deletedRecordValues[i];\n if (!Array.isArray(rec) || !Array.isArray(rowValues) || rowValues.length !== c.deleteColIndexs.length) {\n continue;\n }\n const next = rec.slice();\n for (let k = 0; k < c.deleteColIndexs.length; k++) {\n next[c.deleteColIndexs[k]] = rowValues[k];\n }\n recordIndexs.push(i);\n newRecords.push(next);\n }\n if (recordIndexs.length) {\n (table as any).updateRecords?.(newRecords, recordIndexs, false);\n }\n }\n }\n\n if (c.sheetKey) {\n // updateRecords(..., trigger=false) 不会触发 vtable-sheet 的数据同步,\n // 这里主动把最新 records 同步到 formula engine,避免公式读取到旧 sheetData 导致计算为 0。\n const fm = vtableSheet?.formulaManager;\n const engine = fm?.formulaEngine;\n if (fm?.normalizeSheetData && engine?.updateSheetData) {\n try {\n const normalized = fm.normalizeSheetData((table as any).records || [], table);\n engine.updateSheetData(c.sheetKey, normalized);\n } catch {\n // ignore\n }\n }\n }\n\n if (c.sheetKey && c.deletedFormulas) {\n const entries = Object.entries(c.deletedFormulas);\n entries.forEach(([cellRef, formula]) => {\n const parsed = parseA1Notation(cellRef);\n if (!parsed) {\n return;\n }\n applyCellContent({\n table,\n sheetKey: c.sheetKey,\n row: parsed.row,\n col: parsed.col,\n content: formula,\n formulaManager: vtableSheet?.formulaManager\n });\n });\n }\n } else {\n (table as any).deleteColumns?.(c.deleteColIndexs, true);\n }\n break;\n }\n case 'change_header_position': {\n const c = cmd as ChangeHeaderPositionCommand;\n const moving = c.moving;\n const from = direction === 'undo' ? c.targetIndex : c.sourceIndex;\n const to = direction === 'undo' ? c.sourceIndex : c.targetIndex;\n if (moving === 'column') {\n (table as any).changeHeaderPosition?.({\n source: { col: from, row: 0 },\n target: { col: to, row: 0 },\n movingColumnOrRow: 'column'\n });\n } else {\n (table as any).changeHeaderPosition?.({\n source: { col: 0, row: from },\n target: { col: 0, row: to },\n movingColumnOrRow: 'row'\n });\n }\n break;\n }\n case 'resize_row': {\n const c = cmd as ResizeRowCommand;\n const height = direction === 'undo' ? c.oldHeight : c.newHeight;\n (table as any).setRowHeight?.(c.row, height);\n break;\n }\n case 'resize_column': {\n const c = cmd as ResizeColumnCommand;\n const width = direction === 'undo' ? c.oldWidth : c.newWidth;\n (table as any).setColWidth?.(c.col, width);\n break;\n }\n default:\n break;\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { ListTable } from '@visactor/vtable';
2
+ export declare function resolveSheetKey(args: {
3
+ vtableSheet: any;
4
+ table: ListTable | null;
5
+ cached: string | undefined;
6
+ }): {
7
+ sheetKey: string | undefined;
8
+ cached: string | undefined;
9
+ };
@@ -0,0 +1,38 @@
1
+ export function resolveSheetKey(args) {
2
+ var _a, _b, _c;
3
+ const {vtableSheet: vtableSheet, table: table, cached: cached} = args;
4
+ if (!vtableSheet) return {
5
+ sheetKey: void 0,
6
+ cached: void 0
7
+ };
8
+ if (cached) return {
9
+ sheetKey: cached,
10
+ cached: cached
11
+ };
12
+ try {
13
+ const workSheetInstances = vtableSheet.workSheetInstances;
14
+ if (workSheetInstances && table) for (const [sheetKey, worksheet] of workSheetInstances.entries()) if ((null == worksheet ? void 0 : worksheet.tableInstance) === table) return {
15
+ sheetKey: sheetKey,
16
+ cached: sheetKey
17
+ };
18
+ const active = null === (_a = vtableSheet.getActiveSheet) || void 0 === _a ? void 0 : _a.call(vtableSheet);
19
+ if (null == active ? void 0 : active.getKey) {
20
+ const key = active.getKey();
21
+ return {
22
+ sheetKey: key,
23
+ cached: key
24
+ };
25
+ }
26
+ const activeDefine = null === (_c = null === (_b = vtableSheet.sheetManager) || void 0 === _b ? void 0 : _b.getActiveSheet) || void 0 === _c ? void 0 : _c.call(_b), key = null == activeDefine ? void 0 : activeDefine.sheetKey;
27
+ return {
28
+ sheetKey: key,
29
+ cached: key
30
+ };
31
+ } catch (_d) {
32
+ return {
33
+ sheetKey: void 0,
34
+ cached: void 0
35
+ };
36
+ }
37
+ }
38
+ //# sourceMappingURL=sheet-key.js.map