iobroker.javascript 10.0.0 → 10.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/README.md +48 -12
  2. package/admin/assets/AiChatPanel-C_WbKMGX.js +242 -0
  3. package/admin/assets/AiDiffView-BtXbDWZ8.js +1 -0
  4. package/admin/assets/Debugger-DAdJnEhw.js +15 -0
  5. package/admin/assets/Error-DQ1pzKcf.js +1 -0
  6. package/admin/assets/Import-BjMtH6Gk.js +1 -0
  7. package/admin/assets/RulesEditor-dDRPHw4X.js +1 -0
  8. package/admin/assets/RulesEditor-k-DMHotH.css +1 -0
  9. package/admin/assets/{ScriptEditor-BGIuoNei.js → ScriptEditor-CZSc7rwE.js} +2 -2
  10. package/admin/assets/ScriptEditorVanillaMonaco-DEKg14_A.js +3 -0
  11. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DPmwd_G2.js +1 -0
  12. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-C8inUeKt.js +1243 -0
  13. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-VcQjt7_9.js +9 -0
  14. package/admin/assets/aiPromptBuilder-D5FDo74i.js +1 -0
  15. package/admin/assets/blockly-DBw-ytY1.js +1047 -0
  16. package/admin/assets/blocks_action-BqfWEwpf.js +1 -0
  17. package/admin/assets/blocks_convert-CX0i-JfS.js +3 -0
  18. package/admin/assets/blocks_logic-D-QSzw95.js +1 -0
  19. package/admin/assets/blocks_number-D7JuNYsw.js +1 -0
  20. package/admin/assets/blocks_object-C9DzAlc7.js +1 -0
  21. package/admin/assets/blocks_procedures-BJMz6HWW.js +3 -0
  22. package/admin/assets/blocks_sendto-DRh7lk9o.js +5 -0
  23. package/admin/assets/blocks_switch-BfmboMex.js +2 -0
  24. package/admin/assets/blocks_system-B-78JfAc.js +1 -0
  25. package/admin/assets/blocks_text-CGbR0Ozw.js +1 -0
  26. package/admin/assets/blocks_time-5vS2geJg.js +1 -0
  27. package/admin/assets/blocks_timeout-BdaTywfN.js +1 -0
  28. package/admin/assets/blocks_trigger-D8kgHKbg.js +2 -0
  29. package/admin/assets/blocks_words-BhHIf_1o.js +1 -0
  30. package/admin/assets/{cronHoverProvider-pKJkSevo.js → cronHoverProvider-DpgESCox.js} +1 -1
  31. package/admin/assets/dist-CaOsN0XW.js +4 -0
  32. package/admin/assets/field_cron-B40zwSfJ.js +1 -0
  33. package/admin/assets/field_oid-KfoBnEM9.js +1 -0
  34. package/admin/assets/field_script-yXhe1iCp.js +1 -0
  35. package/admin/assets/helpers-B0ByElPJ.js +1 -0
  36. package/admin/assets/hostInit-9REPDUe7.js +1 -0
  37. package/admin/assets/index-07o_WKsX.js +726 -0
  38. package/admin/assets/index-Z8Hkv58g.css +1 -0
  39. package/admin/assets/{inlineChatWidget-ZaisTOLh.js → inlineChatWidget-B9y_gQcH.js} +2 -2
  40. package/admin/assets/{inlineDiffController-hTwHHqcc.js → inlineDiffController-C07CdIFo.js} +2 -2
  41. package/admin/assets/{mf-entry-bootstrap-0-d6052b31.js → mf-entry-bootstrap-0-efcb49d3.js} +7 -2
  42. package/admin/assets/stateHoverProvider-CqeoOjXs.js +9 -0
  43. package/admin/assets/{virtualExposes-Ed0lGq7k.js → virtualExposes-DgGB-18P.js} +1 -1
  44. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BwSvIKEV.js +1 -0
  45. package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-ChiJXsfH.js +1 -0
  46. package/admin/custom/assets/Components-BCQTjBgm.js +1 -0
  47. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-BuAc8OyX.js +1 -0
  48. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BGJv4zZP.js +1 -0
  49. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CGb5Cofy.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-B4E6MFJ4.js} +1 -1
  50. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BVCIAgbo.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-aRlxyEhq.js} +78 -78
  51. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DQwzYx75.js +1494 -0
  52. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-h-rCw3iz.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-n2zIPi0L.js} +1 -1
  53. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-xxszBNje.js +9 -0
  54. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Cb5TR7FB.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Tq7tesSS.js} +1 -1
  55. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-DARUoA03.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-BeF0jEWM.js} +1 -1
  56. package/admin/custom/assets/hostInit-CHwrowP4.js +1 -0
  57. package/admin/custom/assets/{index-uEKAoVT7.js → index-Cm6xl9K4.js} +1 -1
  58. package/admin/custom/assets/{lib-Yj8cfN0A.js → lib-bhrFL6jR.js} +1 -1
  59. package/admin/custom/assets/{mf-entry-bootstrap-0-77793feb.js → mf-entry-bootstrap-0-f08941e2.js} +7 -2
  60. package/admin/custom/assets/{setYear-DJ9FbdkO.js → setYear-DzTZ2h9A.js} +1 -1
  61. package/admin/custom/assets/virtualExposes-B5LJmnfO.js +1 -0
  62. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-ML-chjs6.js +1 -0
  63. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-C3ImybiM.js +2 -0
  64. package/admin/custom/customComponents.js +12 -1
  65. package/admin/custom/i18n/de.json +11 -1
  66. package/admin/custom/i18n/en.json +11 -1
  67. package/admin/custom/i18n/es.json +11 -1
  68. package/admin/custom/i18n/fr.json +11 -1
  69. package/admin/custom/i18n/it.json +11 -1
  70. package/admin/custom/i18n/nl.json +11 -1
  71. package/admin/custom/i18n/pl.json +11 -1
  72. package/admin/custom/i18n/pt.json +11 -1
  73. package/admin/custom/i18n/ru.json +11 -1
  74. package/admin/custom/i18n/uk.json +11 -1
  75. package/admin/custom/i18n/zh-cn.json +11 -1
  76. package/admin/google-blockly/VERSION +1 -0
  77. package/admin/google-blockly/media/drop.mp3 +0 -0
  78. package/admin/google-blockly/msg/js/de.js +332 -56
  79. package/admin/google-blockly/msg/js/en.js +319 -43
  80. package/admin/google-blockly/msg/js/es.js +319 -42
  81. package/admin/google-blockly/msg/js/fr.js +315 -39
  82. package/admin/google-blockly/msg/js/it.js +327 -51
  83. package/admin/google-blockly/msg/js/nl.js +376 -100
  84. package/admin/google-blockly/msg/js/pl.js +318 -42
  85. package/admin/google-blockly/msg/js/pt.js +318 -42
  86. package/admin/google-blockly/msg/js/ru.js +320 -44
  87. package/admin/google-blockly/msg/js/uk.js +326 -50
  88. package/admin/google-blockly/msg/js/zh-cn.js +322 -46
  89. package/admin/i18n/de.json +51 -26
  90. package/admin/i18n/en.json +50 -25
  91. package/admin/i18n/es.json +51 -18
  92. package/admin/i18n/fr.json +50 -17
  93. package/admin/i18n/it.json +50 -17
  94. package/admin/i18n/nl.json +50 -17
  95. package/admin/i18n/pl.json +51 -18
  96. package/admin/i18n/pt.json +50 -17
  97. package/admin/i18n/ru.json +50 -17
  98. package/admin/i18n/uk.json +50 -17
  99. package/admin/i18n/zh-cn.json +50 -17
  100. package/admin/jsonConfig.json +398 -0
  101. package/admin/mf-manifest.json +1 -1
  102. package/admin/mf-stats.json +1 -1
  103. package/admin/remoteEntry.js +12 -1
  104. package/admin/tab.html +6 -98
  105. package/build/lib/javascript.d.ts +48 -0
  106. package/build/lib/mirror.js +9 -0
  107. package/build/lib/mirror.js.map +1 -1
  108. package/build/lib/sandbox.js +37 -0
  109. package/build/lib/sandbox.js.map +1 -1
  110. package/build/lib/secrets.js +220 -0
  111. package/build/lib/secrets.js.map +1 -0
  112. package/build/lib/typescriptSettings.js +112 -2
  113. package/build/lib/typescriptSettings.js.map +1 -1
  114. package/build/lib/typescriptTools.js +168 -43
  115. package/build/lib/typescriptTools.js.map +1 -1
  116. package/build/main.js +61 -5
  117. package/build/main.js.map +1 -1
  118. package/build/types.d.ts +48 -0
  119. package/docs/en/blockly.md +29 -0
  120. package/docs/en/javascript.md +72 -0
  121. package/docs/en/upgrade-guide.md +3 -0
  122. package/io-package.json +59 -28
  123. package/package.json +8 -3
  124. package/admin/assets/AiChatPanel-p0KAg6Cs.js +0 -237
  125. package/admin/assets/AiDiffView-BPTLnNx1.js +0 -1
  126. package/admin/assets/AiScriptAnalyzer--BHML2rN.js +0 -9
  127. package/admin/assets/BlocklyEditor-CAjVMhYT.js +0 -81
  128. package/admin/assets/ContextWrapper-BVc8wTK_.css +0 -1
  129. package/admin/assets/ContextWrapper-D9CrnNKs.js +0 -127
  130. package/admin/assets/Debugger-SjROokFI.js +0 -15
  131. package/admin/assets/Error-DDfrxAt2.js +0 -1
  132. package/admin/assets/Import-DpTg1Jow.js +0 -1
  133. package/admin/assets/RulesEditor-BSRFWpEm.css +0 -1
  134. package/admin/assets/RulesEditor-D0hgrcBc.js +0 -1
  135. package/admin/assets/ScriptEditorVanillaMonaco-DyMQtoTQ.js +0 -3
  136. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DWJotR1B.js +0 -1
  137. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-CxICLr5Z.js +0 -1243
  138. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BBAXJaqI.js +0 -9
  139. package/admin/assets/aiCodeLensProvider-hyAmut0e.js +0 -4
  140. package/admin/assets/aiPromptBuilder-Bs27qOHT.js +0 -7
  141. package/admin/assets/blocklyDarkTheme-DEiAX5DT.js +0 -1
  142. package/admin/assets/dist-uw5orDgd.js +0 -4
  143. package/admin/assets/hostInit-BFg5u9hY.js +0 -1
  144. package/admin/assets/index-B1gICjdq.js +0 -192
  145. package/admin/assets/index-BHhhebRG.css +0 -1
  146. package/admin/assets/mjs-DWqivHEk.js +0 -90
  147. package/admin/assets/stateHoverProvider-C7DawIs-.js +0 -9
  148. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BYs71IQF.js +0 -1
  149. package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-DnnXQRkG.js +0 -1
  150. package/admin/custom/assets/Components-BrDyDHXh.js +0 -1
  151. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-CyYJM2-v.js +0 -1
  152. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BdzCssLn.js +0 -1
  153. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-BkB0anQX.js +0 -1494
  154. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BotqDuw-.js +0 -9
  155. package/admin/custom/assets/hostInit-DJx2uXXy.js +0 -1
  156. package/admin/custom/assets/virtualExposes-CxDjLoYu.js +0 -1
  157. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-BU-ugy_7.js +0 -1
  158. package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-BEfZbrf7.js +0 -2
  159. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-CTeZ0Jpm.js +0 -2
  160. package/admin/google-blockly/blockly_compressed.js +0 -1679
  161. package/admin/google-blockly/blocks_compressed.js +0 -193
  162. package/admin/google-blockly/javascript_compressed.js +0 -264
  163. package/admin/google-blockly/msg/messages.js +0 -1630
  164. package/admin/google-blockly/own/blocks_action.js +0 -765
  165. package/admin/google-blockly/own/blocks_convert.js +0 -480
  166. package/admin/google-blockly/own/blocks_logic.js +0 -459
  167. package/admin/google-blockly/own/blocks_number.js +0 -30
  168. package/admin/google-blockly/own/blocks_object.js +0 -402
  169. package/admin/google-blockly/own/blocks_procedures.js +0 -688
  170. package/admin/google-blockly/own/blocks_sendto.js +0 -702
  171. package/admin/google-blockly/own/blocks_switch.js +0 -257
  172. package/admin/google-blockly/own/blocks_system.js +0 -1409
  173. package/admin/google-blockly/own/blocks_text.js +0 -104
  174. package/admin/google-blockly/own/blocks_time.js +0 -639
  175. package/admin/google-blockly/own/blocks_timeout.js +0 -551
  176. package/admin/google-blockly/own/blocks_trigger.js +0 -1791
  177. package/admin/google-blockly/own/blocks_words.js +0 -708
  178. package/admin/google-blockly/own/field_cron.js +0 -158
  179. package/admin/google-blockly/own/field_oid.js +0 -642
  180. package/admin/google-blockly/own/field_script.js +0 -159
@@ -2455,6 +2455,36 @@ declare global {
2455
2455
  headers: Record<string, string>;
2456
2456
  responseTime?: number;
2457
2457
  }
2458
+
2459
+ /**
2460
+ * All entries of the central ioBroker credential store, keyed by their name.
2461
+ *
2462
+ * The JavaScript adapter augments this interface with the names of the credentials that
2463
+ * actually exist, so the editor can suggest them.
2464
+ */
2465
+ interface Secrets {
2466
+ [name: string]: Secret;
2467
+ }
2468
+
2469
+ /**
2470
+ * One entry of the central ioBroker credential store (`system.credentials.<name>`).
2471
+ * All encrypted fields are already decrypted.
2472
+ *
2473
+ * A credential has one of two forms: a single `key` (API keys, passwords) or a
2474
+ * `login`/`password` pair. Which of them a credential really has is declared for every
2475
+ * existing credential by the JavaScript adapter, so this type is only the fallback for
2476
+ * names the adapter does not know.
2477
+ */
2478
+ interface Secret {
2479
+ /** The key of a credential with the "key" form, e.g. an API key or a password */
2480
+ key?: string;
2481
+ /** The user name of a credential with the "login" form */
2482
+ login?: string;
2483
+ /** The password of a credential with the "login" form */
2484
+ password?: string;
2485
+ /** Any further field of the credential */
2486
+ [field: string]: string | number | boolean | undefined;
2487
+ }
2458
2488
  } // end namespace iobJS
2459
2489
 
2460
2490
  // =======================================================
@@ -2480,6 +2510,24 @@ declare global {
2480
2510
  */
2481
2511
  const verbose: boolean;
2482
2512
 
2513
+ /**
2514
+ * Decrypted credentials of the central ioBroker credential store.
2515
+ *
2516
+ * The credentials are managed in the admin UI under "Basic settings" -> "Credentials".
2517
+ * A credential either holds a single `key` (e.g. an API key) or a `login`/`password` pair.
2518
+ * The values are always up to date - editing a credential in the admin UI takes effect
2519
+ * immediately, without restarting the script.
2520
+ *
2521
+ * ```js
2522
+ * const password = SECRETS.CameraPassword.key;
2523
+ * const user = SECRETS.MyMailAccount.login;
2524
+ * ```
2525
+ *
2526
+ * `undefined` is returned if no credential with this name exists or if the access to the
2527
+ * credentials was disabled in the instance settings.
2528
+ */
2529
+ const SECRETS: iobJS.Secrets;
2530
+
2483
2531
  /**
2484
2532
  * Queries all states with the given selector
2485
2533
  *
@@ -329,6 +329,15 @@ class Mirror {
329
329
  return `script.js.${parts.join('.')}`;
330
330
  }
331
331
  removeScriptsInFolder(folder) {
332
+ // Deleting a folder on disk is meant to delete its scripts in the database - that is what
333
+ // the mirroring is for. A folder that only *looks* gone because the mirror directory as a
334
+ // whole became unreachable is a different story: an unmounted share or a changed permission
335
+ // would otherwise take the scripts with it. In that case nothing is deleted and the next
336
+ // start syncs the directory again from the database.
337
+ if (!(0, node_fs_1.existsSync)(this.diskRoot)) {
338
+ this.log.warn(`Mirror directory ${this.diskRoot} is not accessible - the scripts of ${folder} are kept in the database`);
339
+ return;
340
+ }
332
341
  // get all files in this folder
333
342
  const folderId = this._fileName2scriptId(folder);
334
343
  for (const id in this.dbList) {
@@ -1 +1 @@
1
- {"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/lib/mirror.ts"],"names":[],"mappings":";;;AAAA,qCAaiB;AACjB,yCAAqD;AAGrD,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAa,MAAM;IACP,OAAO,CAAmB;IACjB,QAAQ,CAAS;IACjB,IAAI,CAAS;IACb,UAAU,CAAS;IACnB,GAAG,CAOlB;IACM,aAAa,GAA8B,EAAE,CAAC;IACrC,QAAQ,CAA+D;IAChF,MAAM,GAAwC,EAAE,CAAC;IACjD,KAAK,GAAG,KAAK,CAAC;IAEtB,YAAY,OAA+E;QACvF,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,GAAG,kBAAkB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvD,IAAI,CAAC,UAAU,GAAG,GAAG,IAAI,CAAC,IAAI,WAAW,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QAEnB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAOlB,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,GAAG,GAAG;gBACP,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAChC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAChC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC9B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;aACrC,CAAC;QACN,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,cAAc,EAAE,CAAC;YACzE,mCAAmC;YACnC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACD,IAAA,mBAAS,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,QAAQ,KAAK,GAAY,EAAE,CAAC,CAAC;gBAC5E,OAAO;YACX,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,CACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAExB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;YAEhE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,sBAAsB;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC,CACL,CAAC;IACN,CAAC;IAED,YAAY,CAAC,KAAa;QACtB,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;QAElD,iGAAiG;QACjG,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACvE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACjB,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,CAAC;gBAE5B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,MAAM,KAAK,GAAG,IAAA,mBAAS,EAAC,IAAI,CAAC,CAAC;oBAC9B,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;wBAC1B,OAAO;oBACX,CAAC;oBAED,MAAM,UAAU,GAAG,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC;oBAEtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,IAAI,OAAO,UAAU,EAAE,CAAC,CAAC;oBAC/D,IAAA,eAAK,EAAC,UAAU,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE;wBAC5C,0CAA0C;wBAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;wBAC5C,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBACvC,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,KAAK,KAAK,GAAY,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,IAAA,eAAK,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE;oBAC7D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;oBACxD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;YACP,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,KAAK,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;YAChG,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC;gBAC9C,IAAI,CAAC;oBACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACnE,CAAC;gBAAC,MAAM,CAAC;oBACL,eAAe;gBACnB,CAAC;gBAED,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,EAAkC;QAClD,KAAK,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,kBAAkB;gBAClB,MAAM,GAAG,GAAyB;oBAC9B,GAAG,EAAE,IAAI,CAAC,UAAU;oBACpB,MAAM,EAAE;wBACJ,IAAI,EAAE,gBAAgB;wBACtB,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,WAAW;wBACjB,KAAK,EAAE,KAAK;wBACZ,GAAG,EAAE,CAAC;wBACN,IAAI,EAAE,IAAI;qBACb;oBACD,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,EAAE;iBACb,CAAC;gBAEF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,CACrD,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CACxE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,KAAK,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,GAAa,CAAC,CAAC,CAAC;YACpG,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,EAAU;QACzB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,IAAY;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACb,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACrC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjE,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAAY;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACb,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,QAAgB,EAAE,IAAY;QAC5C,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,eAAe,CAAC;QAC3B,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IACjG,CAAC;IAED,gBAAgB,CAAC,EAAU;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACjC,KAAK,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAoB,CAAC,CAAC;IAC/E,CAAC;IAEO,YAAY,CAAC,QAAkB;QACnC,OAAO,IAAA,gBAAI,EAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,MAAgB;QACtC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC;QACvB,CAAC;QACD,OAAO,aAAa,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3C,CAAC;IAEO,eAAe,CAAC,QAAgB;QACpC,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACpE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAEO,iBAAiB,CAAC,MAAc;QACpC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;aAC1B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC1B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACK,UAAU,CAAC,EAAU;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC;YACD,kDAAkD;YAClD,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7E,IAAA,uBAAa,EAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7E,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,GAAY,EAAE,CAAC,CAAC;YAChG,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,IAAI,CAAC,YAAoB,EAAE,QAAmB,EAAE,MAAiB;QAC7D,YAAY,GAAG,YAAY,IAAI,CAAC,CAAC;QACjC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAE9C,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,YAAY;YACZ,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACpG,YAAY;gBACZ,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1D,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACJ,qCAAqC;gBACrC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1B,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;wBAEpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;4BACrB,SAAS;wBACb,CAAC;wBAED,IACI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;4BACnB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE;gCACtC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EACvD,CAAC;4BACC,oBAAoB;4BACpB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;4BAChC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;4BACzD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;4BAC7D,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;wBACxB,CAAC;6BAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;4BAChF,kBAAkB;4BAClB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;4BACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;4BAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;4BACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;4BACvC,KAAK,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAoB,CAAC,CAAC;wBAC/E,CAAC;wBACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBACnB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBACrB,MAAM;oBACV,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,kDAAkD;QAClD,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CACpC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EACxB,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAC1D,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,aAAa,QAAQ;iBAC1B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;iBAC/B,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;iBACtB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QAED,8CAA8C;QAC9C,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,qBAAqB;YACrB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC;gBAC3D,+DAA+D;gBAC/D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG;oBACd,GAAG,EAAE,EAAE;oBACP,MAAM,EAAE;wBACJ,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;wBACd,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM;wBAChC,MAAM,EAAE,kBAAkB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;wBAClD,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;wBAC/E,KAAK,EAAE,KAAK;wBACZ,OAAO,EAAE,KAAK;qBACjB;oBACD,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE;oBACxB,MAAM,EAAE,EAAE;iBACb,CAAC;gBACF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;gBACjD,mEAAmE;gBACnE,IAAI,CAAC,0BAA0B,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjD,KAAK,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAoB,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAA,gBAAI,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC;QACL,CAAC;IACL,CAAC;IAEO,kBAAkB,CAAC,EAAU,EAAE,IAAgB;QACnD,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,CACH,IAAA,gBAAI,EAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;YACxD,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CACnE,CAAC;IACN,CAAC;IAEO,kBAAkB,CAAC,IAAY;QACnC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAED,OAAO,aAAa,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,qBAAqB,CAAC,MAAc;QAChC,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACjD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,IACI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrD,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EACjE,CAAC;gBACC,YAAY;gBACZ,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;oBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;oBAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACvB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACtC,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,YAAY,CAAC,KAAgD,EAAE,IAAY;QACvE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACd,OAAO;QACX,CAAC;QACD,IAAI,KAAwB,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAA,oBAAU,EAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,CAAC;gBACD,KAAK,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAI,KAAK,GAAY,EAAE,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;gBAC9C,IAAI,MAAM,EAAE,CAAC;oBACT,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBACrD,IAAI,CAAC;wBACD,mBAAmB;wBACnB,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;wBAEtE,qCAAqC;wBACrC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAA,gBAAI,EAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;oBACvF,CAAC;oBAAC,OAAO,GAAY,EAAE,CAAC;wBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,IAAI,KAAK,GAAY,EAAE,CAAC,CAAC;oBACvF,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;wBACjC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBACpC,CAAC;oBACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO;YACX,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,IAAI,CAAC;oBACD,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;wBACjC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBACpC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACL,eAAe;gBACnB,CAAC;gBACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YACD,OAAO;QACX,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;gBAClB,kCAAkC;gBAElC,IAAI,CAAC;oBACD,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;wBACjC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBACpC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACL,eAAe;gBACnB,CAAC;gBACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YACD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEzC,IAAI,MAAM,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC;gBACD,KAAK,GAAG,KAAK,IAAI,IAAA,kBAAQ,EAAC,IAAI,CAAC,CAAC;gBAChC,MAAM,MAAM,GAAG,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC7C,MAAM,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAE/C,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;oBAClB,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;wBAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;wBACvC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;wBACxB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;wBAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;wBACjC,KAAK,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAoB,CAAC,CAAC;oBAC/E,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;oBAC5B,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;oBAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC5B,aAAa;oBACb,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG;wBACd,GAAG,EAAE,EAAE;wBACP,MAAM,EAAE;4BACJ,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE;4BACjB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;4BAC3C,MAAM;4BACN,OAAO,EAAE,KAAK;4BACd,MAAM,EAAE,kBAAkB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;4BAClD,KAAK,EAAE,KAAK;4BACZ,OAAO,EAAE,KAAK;yBACjB;wBACD,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,EAAE;wBACV,EAAE,EAAE,EAAE;qBACT,CAAC;oBACF,IAAI,CAAC,0BAA0B,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBACjD,KAAK,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAoB,CAAC,CAAC;gBAC/E,CAAC;YACL,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAI,KAAK,GAAY,EAAE,CAAC,CAAC;YAChE,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClD,sGAAsG;YACtG,IAAI,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9D,sBAAsB;gBACtB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACJ,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;oBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;oBAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACvB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACtC,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACL,CAAC;QACL,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,cAAc,CAAC,EAAU,EAAE,GAA6C;QACpE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO;QACX,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,UAAwB,CAAC,CAAC;QAEhF,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;YACf,mBAAmB;YACnB,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACxC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACpC,CAAC;gBAED,IAAI,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC;wBACzC,IAAA,oBAAU,EAAC,IAAI,CAAC,CAAC;oBACrB,CAAC;oBAAC,OAAO,GAAY,EAAE,CAAC;wBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,GAAY,EAAE,CAAC,CAAC;oBAC7D,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACL,CAAC;QACL,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBAClB,eAAe;gBACf,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACtD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;oBACtB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC;oBACzC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACrE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACxB,CAAC;qBAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBAC9E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC;oBACzC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACrE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACxB,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,aAAa;gBACb,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACvE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC;oBACzC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACrE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACxB,CAAC;YACL,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,QAAQ,CACJ,OAAgB,EAChB,IAAmE;QAEnE,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;QACnC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;gBAC7D,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBACrC,MAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC,QAAQ,CAAC,CAAC;oBACjC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACtB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;oBACtD,CAAC;yBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;wBACnC,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;wBAC5C,IAAI,CAAC,CAAC,CAAC,GAAG;4BACN,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;4BACzB,MAAM,EAAE,IAAA,sBAAY,EAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;4BACzC,IAAI,EAAE,QAAQ;yBACjB,CAAC;oBACN,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,OAAO,KAAK,GAAY,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,0BAA0B,CAAC,EAAU,EAAE,IAAyC;QACpF,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClB,MAAM,GAAG,GAA2B;oBAChC,GAAG,EAAE,QAAQ;oBACb,MAAM,EAAE;wBACJ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;qBAChC;oBACD,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,EAAE;iBACb,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;gBACrB,IAAI,CAAC;oBACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;wBAC/C,IAAI,GAAG,EAAE,CAAC;4BACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,QAAQ,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;wBAC3F,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,QAAQ,YAAY,EAAE,MAAM,GAAY,EAAE,CAAC,CAAC;gBACpG,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,EAAuD;QAC1D,IAAI,CAAC,OAAO,CAAC,aAAa,CACtB,QAAQ,EACR,SAAS,EACT,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,EACtD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACT,qEAAqE;YACrE,kDAAkD;YAClD,MAAM,IAAI,GAAmE,EAAE,CAAC;YAChF,IAAI,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+DAA+D,GAAG,EAAE,CAAC,CAAC;YACzF,CAAC;YACD,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;gBACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;oBAChC,IAAI,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;oBACpD,CAAC;gBACL,CAAC;YACL,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,aAAa,CACtB,QAAQ,EACR,YAAY,EACZ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,EACtD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACT,IAAI,GAAG,EAAE,CAAC;oBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kEAAkE,GAAG,EAAE,CAAC,CAAC;gBAC5F,CAAC;gBACD,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;oBACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;wBAChC,IAAI,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;4BAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;4BAChD,mEAAmE;4BACnE,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;wBACjE,CAAC;oBACL,CAAC;gBACL,CAAC;gBACD,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,CACJ,CAAC;QACN,CAAC,CACJ,CAAC;IACN,CAAC;CACJ;AA/qBD,wBA+qBC","sourcesContent":["import {\n readdirSync,\n lstatSync,\n statSync,\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n watch,\n realpathSync,\n type Stats,\n type FSWatcher,\n} from 'node:fs';\nimport { join, normalize, dirname } from 'node:path';\nimport type { ScriptType } from '../types';\n\nconst MODE_0777 = 511;\n\nexport class Mirror {\n private adapter: ioBroker.Adapter;\n private readonly diskRoot: string;\n private readonly from: string;\n private readonly lastSyncID: string;\n private readonly log: {\n log: (text: string) => void;\n silly: (text: string) => void;\n debug: (text: string) => void;\n info: (text: string) => void;\n warn: (text: string) => void;\n error: (text: string) => void;\n };\n private watchedFolder: Record<string, FSWatcher> = {};\n private readonly diskList: Record<string, { ts: number; source: string; name: string }>;\n private dbList: Record<string, ioBroker.BaseObject> = {};\n private ready = false;\n\n constructor(options: { diskRoot: string; adapter: ioBroker.Adapter; log?: ioBroker.Logger }) {\n if (!options.adapter) {\n throw new Error('No adapter defined');\n }\n this.adapter = options.adapter;\n this.diskRoot = normalize(options.diskRoot || '').replace(/\\\\/g, '/');\n this.from = `system.adapter.${this.adapter.namespace}`;\n this.lastSyncID = `${this.from}.lastSync`;\n this.diskList = {};\n\n if (options.log) {\n this.log = options.log as unknown as {\n log: (text: string) => void;\n silly: (text: string) => void;\n debug: (text: string) => void;\n info: (text: string) => void;\n warn: (text: string) => void;\n error: (text: string) => void;\n };\n this.log.log = this.log.log || ((text: string) => console.log(text));\n } else {\n this.log = {\n silly: text => console.log(text),\n debug: text => console.log(text),\n info: text => console.log(text),\n log: text => console.log(text),\n warn: text => console.warn(text),\n error: text => console.error(text),\n };\n }\n if (!options.diskRoot?.trim() || this.adapter.namespace !== 'javascript.0') {\n // only instance 0 can sync objects\n return;\n }\n\n if (!existsSync(this.diskRoot)) {\n try {\n mkdirSync(this.diskRoot);\n } catch (err: unknown) {\n this.log.error(`Cannot create directory ${this.diskRoot}: ${err as Error}`);\n return;\n }\n }\n\n this.diskList = this.scanDisk();\n this.checkLastSyncObject(lastSyncTime =>\n this.scanDB(list => {\n this.dbList = list;\n this.sync(lastSyncTime);\n\n this.adapter.setForeignState(this.lastSyncID, Date.now(), true);\n\n this.ready = true;\n // monitor all folders\n this.watchFolders(this.diskRoot);\n }),\n );\n }\n\n watchFolders(root_: string): void {\n root_ = root_.endsWith('/') ? root_ : `${root_}/`;\n\n // ignore all .xxx folders, like \".git\", \".idea\", so users may not have scripts starting with \".\"\n try {\n const files = readdirSync(root_).filter(name => !name.startsWith('.'));\n files.forEach(file => {\n const name = join(root_, file).replace(/\\\\/g, '/');\n const stat = statSync(name);\n\n if (stat.isDirectory()) {\n this.watchFolders(name);\n } else {\n const lstat = lstatSync(name);\n if (!lstat.isSymbolicLink()) {\n return;\n }\n\n const linkTarget = realpathSync(name);\n\n this.log.info(`Watch symlinked file ${name} -> ${linkTarget}`);\n watch(linkTarget, (eventType /*, _filename*/) => {\n // Pretend the symlink source was changed.\n this.log.debug(`File ${name} ${eventType}`);\n this.onFileChange(eventType, name);\n });\n }\n });\n } catch (err: unknown) {\n return this.log.warn(`Error while trying to watch folder ${root_}: ${err as Error}`);\n }\n\n if (!this.watchedFolder[root_]) {\n this.log.info(`Watch ${root_}`);\n try {\n this.watchedFolder[root_] = watch(root_, (eventType, fileName) => {\n this.log.debug(`File ${root_}${fileName} ${eventType}`);\n this.onFileChange(eventType, root_ + fileName);\n });\n } catch (err: any) {\n this.log.error(`Could not watch folder ${root_}: ${err.message}`);\n this.log.error(`Please check that no other processes change data in the mirror directory!`);\n }\n\n this.watchedFolder[root_].on('error', () => {\n this.log.debug(`Folder ${root_} was deleted`);\n try {\n this.watchedFolder[root_] && this.watchedFolder[root_].close();\n } catch {\n // ignore error\n }\n\n if (this.watchedFolder[root_]) {\n delete this.watchedFolder[root_];\n }\n });\n }\n }\n\n checkLastSyncObject(cb: (lastSyncTime: number) => void): void {\n void this.adapter.getForeignObject(this.lastSyncID, (_err, obj) => {\n if (!obj) {\n // create variable\n const obj: ioBroker.StateObject = {\n _id: this.lastSyncID,\n common: {\n name: 'Last sync time',\n type: 'number',\n role: 'timestamp',\n write: false,\n min: 0,\n read: true,\n },\n type: 'state',\n native: {},\n };\n\n this.adapter.setForeignObject(this.lastSyncID, obj, () =>\n this.adapter.setForeignState(this.lastSyncID, 0, true, () => cb?.(0)),\n );\n } else {\n void this.adapter.getForeignState(this.lastSyncID, (_err, state) => cb?.(state?.val as number));\n }\n });\n }\n\n static getDBFolder(id: string): string {\n const parts = id.split('.');\n parts.pop();\n return parts.join('.');\n }\n\n static isBlockly(data: string): boolean {\n const pos = data.lastIndexOf('\\n');\n if (pos !== -1) {\n data = data.substring(pos + 1);\n if (data[0] === '/' && data[1] === '/') {\n data = Buffer.from(data.substring(2), 'base64').toString('utf8');\n if (data.startsWith('%3Cxml')) {\n return true;\n }\n }\n }\n return false;\n }\n\n static isRules(data: string): boolean {\n const pos = data.lastIndexOf('\\n');\n if (pos !== -1) {\n data = data.substring(pos + 1);\n if (data.startsWith('//{\"') && data.endsWith('}')) {\n return true;\n }\n }\n return false;\n }\n\n static detectType(fileName: string, data: string): ScriptType {\n if (fileName.endsWith('.ts')) {\n return 'TypeScript/ts';\n }\n return Mirror.isBlockly(data) ? 'Blockly' : Mirror.isRules(data) ? 'Rules' : 'Javascript/js';\n }\n\n updateFolderTime(id: string): void {\n this.dbList[id].ts = Date.now();\n this.dbList[id].from = this.from;\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n }\n\n private _getDiskPath(pathDisk: string[]): string {\n return join(this.diskRoot, pathDisk.join('/')).replace(/\\\\/g, '/');\n }\n\n private static _getDbPath(pathDB: string[]): string {\n if (!pathDB || !pathDB.length) {\n return 'script.js';\n }\n return `script.js.${pathDB.join('.')}`;\n }\n\n private _getFilesInPath(pathDisk: string): string[] {\n pathDisk = pathDisk.substring(this.diskRoot.length + 1);\n const id = pathDisk.replace(/\\./g, '\\\\.').replace(/[/\\\\]/g, '\\\\.');\n const reg = new RegExp(`script\\\\.js${id ? `.${id}` : ''}\\\\.[^.]+$`);\n return Object.keys(this.diskList)\n .filter(file => reg.test(file))\n .map(id => id.split('.').pop() || '');\n }\n\n private _getObjectsInPath(pathDB: string): string[] {\n const reg = new RegExp(`${pathDB.replace(/\\./g, '\\\\.')}\\\\.[^.]+$`);\n return Object.keys(this.dbList)\n .filter(id => reg.test(id))\n .map(id => id.split('.').pop() || '');\n }\n\n /**\n * Write file to disk, synchron, catch (and print) error.\n *\n * @param id of script\n * @returns true if write was successful\n */\n private _writeFile(id: string): boolean {\n const diskListEntry = this.diskList[id];\n try {\n //check if the directory exists and create if not:\n mkdirSync(dirname(diskListEntry.name), { recursive: true, mode: MODE_0777 });\n writeFileSync(diskListEntry.name, diskListEntry.source, { mode: MODE_0777 });\n diskListEntry.ts = Date.now();\n return true;\n } catch (err: unknown) {\n this.log.error(`Cannot write file ${diskListEntry ? diskListEntry.name : id}: ${err as Error}`);\n return false;\n }\n }\n\n sync(lastSyncTime: number, pathDisk?: string[], pathDB?: string[]): void {\n lastSyncTime = lastSyncTime || 0;\n pathDisk = pathDisk || [];\n pathDB = pathDB || [];\n\n const dirDisk = this._getDiskPath(pathDisk);\n const dirDB = Mirror._getDbPath(pathDB);\n const files = this._getFilesInPath(dirDisk);\n const objects = this._getObjectsInPath(dirDB);\n\n for (let o = objects.length - 1; o >= 0; o--) {\n // if folder\n if (this.dbList[`${dirDB}.${objects[o]}`] && this.dbList[`${dirDB}.${objects[o]}`].type === 'channel') {\n // dive into\n const nextPathDisk = JSON.parse(JSON.stringify(pathDisk));\n nextPathDisk.push(objects[o]);\n const nextPathDB = JSON.parse(JSON.stringify(pathDB));\n nextPathDB.push(objects[o]);\n objects.splice(o, 1);\n this.sync(lastSyncTime, nextPathDisk, nextPathDB);\n } else {\n // try to find this DB script on disk\n for (let f = files.length - 1; f >= 0; f--) {\n if (objects[o] === files[f]) {\n const id = `${dirDB}.${objects[o]}`;\n\n if (!this.diskList[id]) {\n continue;\n }\n\n if (\n !this.dbList[id].ts ||\n (this.dbList[id].ts > this.diskList[id].ts &&\n this.dbList[id].ts - this.diskList[id].ts > 2000)\n ) {\n // copy text to file\n this.dbList[id].ts = Date.now();\n this.diskList[id].source = this.dbList[id].common.source;\n this.log.debug(`Update disk with ${this.diskList[id].name}`);\n this._writeFile(id);\n } else if (this.dbList[id].ts && this.diskList[id].ts - this.dbList[id].ts > 2000) {\n // copy file to DB\n this.dbList[id].common.source = this.diskList[id].source;\n this.dbList[id].ts = this.diskList[id].ts;\n this.dbList[id].from = this.from;\n this.log.debug(`Update DB with ${id}`);\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n }\n files.splice(f, 1);\n objects.splice(o, 1);\n break;\n }\n }\n }\n }\n\n // go through objects, that does not exist on disk\n for (let o = objects.length - 1; o >= 0; o--) {\n const fileName = this._scriptId2FileName(\n `${dirDB}.${objects[o]}`,\n this.dbList[`${dirDB}.${objects[o]}`].common.engineType,\n );\n this.log.info(`Created script file on disk ${fileName}`);\n const f = `script.js.${fileName\n .substring(this.diskRoot.length)\n .replace(/[\\\\/]/g, '.')\n .replace(/\\.js$|\\.ts$/g, '')}`;\n this.diskList[f] = { name: fileName, source: this.dbList[`${dirDB}.${objects[o]}`].common.source, ts: 0 };\n this._writeFile(f);\n }\n\n // go through files, that does not exist in DB\n for (let f = files.length - 1; f >= 0; f--) {\n // read creation time\n const id = `${dirDB}.${files[f]}`;\n if (this.diskList[id] && this.diskList[id].ts > lastSyncTime) {\n // The file was created after last sync. So create it in DB too\n this.dbList[id] = {\n _id: id,\n common: {\n name: files[f],\n enabled: false,\n source: this.diskList[id].source,\n engine: `system.adapter.${this.adapter.namespace}`,\n engineType: Mirror.detectType(this.diskList[id].name, this.diskList[id].source),\n debug: false,\n verbose: false,\n },\n type: 'script',\n ts: this.diskList[id].ts,\n native: {},\n };\n this.log.debug(`Create script in DB with ${id}`);\n // ensure that every script has a folder and if not, then create it\n this._checkIfAllFoldersAreExist(id, this.dbList);\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n } else {\n this.log.warn(`Please delete file ${join(dirDisk, files[f])}`);\n }\n }\n }\n\n private _scriptId2FileName(id: string, type: ScriptType): string {\n id = id.substring('script.js.'.length);\n const parts = id.split('.');\n return (\n join(this.diskRoot, parts.join('/')).replace(/\\\\/g, '/') +\n (type && type.toLowerCase() === 'typescript/ts' ? '.ts' : '.js')\n );\n }\n\n private _fileName2scriptId(file: string): string {\n file = file.substring(this.diskRoot.length).replace(/\\.js$/g, '').replace(/\\.ts$/g, '');\n const parts = file.replace(/\\\\/g, '/').split('/');\n if (!parts[0] && parts.length) {\n parts.shift();\n }\n\n return `script.js.${parts.join('.')}`;\n }\n\n removeScriptsInFolder(folder: string): void {\n // get all files in this folder\n const folderId = this._fileName2scriptId(folder);\n for (const id in this.dbList) {\n if (\n Object.prototype.hasOwnProperty.call(this.dbList, id) &&\n (id.startsWith(folderId) || id === folderId.replace(/\\.$/, ''))\n ) {\n // delete it\n if (this.dbList[id]) {\n this.log.debug(`Delete script ${id} in DB`);\n delete this.dbList[id];\n this.adapter.delForeignObject(id);\n }\n if (this.diskList[id]) {\n delete this.diskList[id];\n }\n }\n }\n }\n\n onFileChange(event: 'change' | 'create' | 'delete' | 'rename', file: string): void {\n if (!this.ready) {\n return;\n }\n let stats: Stats | undefined;\n const exists = existsSync(file);\n if (exists) {\n try {\n stats = statSync(file);\n } catch (err: unknown) {\n this.log.error(`Cannot read file ${file}: ${err as Error}`);\n }\n\n if (stats?.isDirectory()) {\n file = file.endsWith('/') ? file : `${file}/`;\n if (exists) {\n !this.watchedFolder[file] && this.watchFolders(file);\n try {\n // scan folder anew\n const files = readdirSync(file).filter(name => !name.startsWith('.'));\n\n // update all files in this directory\n files.forEach(f => this.onFileChange('change', join(file, f).replace(/\\\\/g, '/')));\n } catch (err: unknown) {\n this.log.error(`Error while checking files in directory ${file}: ${err as Error}`);\n }\n } else {\n if (this.watchedFolder[file]) {\n this.watchedFolder[file].close();\n delete this.watchedFolder[file];\n }\n this.removeScriptsInFolder(file);\n }\n return;\n }\n } else if (this.watchedFolder[file]) {\n if (!exists) {\n try {\n if (this.watchedFolder[file]) {\n this.watchedFolder[file].close();\n delete this.watchedFolder[file];\n }\n } catch {\n // ignore error\n }\n this.removeScriptsInFolder(file);\n }\n return;\n } else if (this.watchedFolder[`${file}/`]) {\n if (!exists) {\n file = `${file}/`;\n // delete all files in this folder\n\n try {\n if (this.watchedFolder[file]) {\n this.watchedFolder[file].close();\n delete this.watchedFolder[file];\n }\n } catch {\n // ignore error\n }\n this.removeScriptsInFolder(file);\n }\n return;\n }\n\n if (!file.match(/\\.ts$|\\.js$/)) {\n return;\n }\n const id = this._fileName2scriptId(file);\n\n if (exists && (event === 'change' || event === 'create')) {\n try {\n stats = stats || statSync(file);\n const source = readFileSync(file).toString();\n const ts = stats?.mtime.getTime() || 0;\n this.diskList[id] = { ts, source, name: file };\n\n if (this.dbList[id]) {\n if (this.dbList[id].common.source !== source) {\n this.dbList[id].common.source = source;\n this.dbList[id].ts = ts;\n this.log.debug(`Update script ${id} in DB`);\n this.dbList[id].from = this.from;\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n } else {\n this.dbList[id].ts = ts;\n }\n } else {\n this.log.debug(`Create script ${id} in DB`);\n const parts = id.split('.');\n // new script\n this.dbList[id] = {\n _id: id,\n common: {\n name: parts.pop(),\n engineType: Mirror.detectType(file, source),\n source,\n enabled: false,\n engine: `system.adapter.${this.adapter.namespace}`,\n debug: false,\n verbose: false,\n },\n type: 'script',\n native: {},\n ts: ts,\n };\n this._checkIfAllFoldersAreExist(id, this.dbList);\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n }\n } catch (err: unknown) {\n this.log.error(`Cannot read file ${file}: ${err as Error}`);\n }\n } else if (event === 'delete' || event === 'rename') {\n // there is a bug: just after creation of a script on disk from ioBroker, \"rename\" event is generated!\n if (event === 'rename' && this.diskList[id] && Date.now() - this.diskList[id].ts < 200) {\n console.log(`Interval: ${Date.now() - this.diskList[id].ts}`);\n // 'rename' is ignored\n this.log.debug(`Rename event for ${id} is ignored`);\n } else {\n if (this.dbList[id]) {\n this.log.debug(`Delete script ${id} in DB`);\n delete this.dbList[id];\n this.adapter.delForeignObject(id);\n }\n if (this.diskList[id]) {\n delete this.diskList[id];\n }\n }\n }\n this.adapter.setForeignState(this.lastSyncID, Date.now(), true);\n }\n\n onObjectChange(id: string, obj: ioBroker.ScriptObject | null | undefined): void {\n if (!this.dbList || !id || !this.ready) {\n return;\n }\n\n const file = this._scriptId2FileName(id, obj?.common?.engineType as ScriptType);\n\n if (!obj?.common) {\n // File was deleted\n if (this.dbList[id]) {\n delete this.dbList[id];\n const folderId = Mirror.getDBFolder(id);\n if (this.dbList[folderId]) {\n this.updateFolderTime(folderId);\n }\n\n if (existsSync(file)) {\n try {\n this.log.debug(`Delete ${file} on disk`);\n unlinkSync(file);\n } catch (err: unknown) {\n this.log.error(`Cannot delete ${file}: ${err as Error}`);\n }\n }\n if (this.diskList[id]) {\n delete this.diskList[id];\n }\n }\n } else if (obj.type === 'script' && id.startsWith('script.js.')) {\n if (this.dbList[id]) {\n // File changed\n if (this.dbList[id].common.source !== obj.common.source) {\n this.dbList[id] = obj;\n this.log.debug(`Update ${file} on disk`);\n this.diskList[id] = { ts: 0, source: obj.common.source, name: file };\n this._writeFile(id);\n } else if (!this.diskList[id] || this.diskList[id].source !== obj.common.source) {\n this.log.debug(`Update ${file} on disk`);\n this.diskList[id] = { ts: 0, source: obj.common.source, name: file };\n this._writeFile(id);\n }\n } else {\n // new script\n this.dbList[id] = obj;\n if (!this.diskList[id] || this.diskList[id].source !== obj.common.source) {\n this.log.debug(`Create ${file} on disk`);\n this.diskList[id] = { ts: 0, source: obj.common.source, name: file };\n this._writeFile(id);\n }\n }\n this.dbList[id].ts = Date.now();\n }\n\n this.adapter.setForeignState(this.lastSyncID, Date.now(), true);\n }\n\n scanDisk(\n dirPath?: string,\n list?: Record<string, { ts: number; source: string; name: string }>,\n ): Record<string, { ts: number; source: string; name: string }> {\n dirPath = dirPath || this.diskRoot;\n list = list || {};\n try {\n if (dirPath && !dirPath.startsWith('.') && existsSync(dirPath)) {\n const files = readdirSync(dirPath).filter(name => !name.startsWith('.'));\n for (const file of files) {\n const fullName = join(dirPath, file);\n const stats = statSync(fullName);\n if (stats.isDirectory()) {\n this.scanDisk(fullName.replace(/\\\\/g, '/'), list);\n } else if (file.match(/\\.js$|\\.ts$/)) {\n const f = this._fileName2scriptId(fullName);\n list[f] = {\n ts: stats.mtime.getTime(),\n source: readFileSync(fullName).toString(),\n name: fullName,\n };\n }\n }\n }\n } catch (err: unknown) {\n this.log.error(`Error while checking files in directory ${dirPath}: ${err as Error}`);\n }\n return list;\n }\n\n private _checkIfAllFoldersAreExist(id: string, list: Record<string, ioBroker.BaseObject>): void {\n const parts = id.split('.');\n for (let i = parts.length - 1; i >= 2; i--) {\n parts.pop();\n const folderId = parts.join('.');\n if (!list[folderId]) {\n const obj: ioBroker.ChannelObject = {\n _id: folderId,\n common: {\n name: parts[parts.length - 1],\n },\n type: 'channel',\n native: {},\n };\n list[folderId] = obj;\n try {\n this.adapter.setForeignObject(folderId, obj, err => {\n if (err) {\n this.log.warn(`Error while checking script folder ${folderId} for id \"${id}\": ${err}`);\n }\n });\n } catch (err: unknown) {\n this.log.warn(`Error while checking script folder ${folderId} for id \"${id}\": ${err as Error}`);\n }\n }\n }\n }\n\n scanDB(cb: (list: Record<string, ioBroker.BaseObject>) => void): void {\n this.adapter.getObjectView(\n 'system',\n 'channel',\n { startkey: 'script.js.', endkey: 'script.js.\\u9999' },\n (err, res) => {\n // this is not required, because JavaScript subscribes on ALL objects\n // adapter.subscribeForeignObjects('script.js.*');\n const list: Record<string, ioBroker.ChannelObject | ioBroker.ScriptObject> = {};\n if (err) {\n this.log.error(`Error while checking scripts channel from objects database: ${err}`);\n }\n if (res?.rows) {\n for (let i = 0; i < res.rows.length; i++) {\n const value = res.rows[i].value;\n if (value?._id && value.common) {\n list[res.rows[i].value._id] = res.rows[i].value;\n }\n }\n }\n this.adapter.getObjectView(\n 'script',\n 'javascript',\n { startkey: 'script.js.', endkey: 'script.js.\\u9999' },\n (err, res) => {\n if (err) {\n this.log.error(`Error while checking scripts javascript from objects database: ${err}`);\n }\n if (res?.rows) {\n for (let i = 0; i < res.rows.length; i++) {\n const value = res.rows[i].value;\n if (value?._id && value.common) {\n list[res.rows[i].value._id] = res.rows[i].value;\n // ensure that every script has a folder and if not, then create it\n this._checkIfAllFoldersAreExist(res.rows[i].value._id, list);\n }\n }\n }\n cb?.(list);\n },\n );\n },\n );\n }\n}\n"]}
1
+ {"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/lib/mirror.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n readdirSync,\n lstatSync,\n statSync,\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n watch,\n realpathSync,\n type Stats,\n type FSWatcher,\n} from 'node:fs';\nimport { join, normalize, dirname } from 'node:path';\nimport type { ScriptType } from '../types';\n\nconst MODE_0777 = 511;\n\nexport class Mirror {\n private adapter: ioBroker.Adapter;\n private readonly diskRoot: string;\n private readonly from: string;\n private readonly lastSyncID: string;\n private readonly log: {\n log: (text: string) => void;\n silly: (text: string) => void;\n debug: (text: string) => void;\n info: (text: string) => void;\n warn: (text: string) => void;\n error: (text: string) => void;\n };\n private watchedFolder: Record<string, FSWatcher> = {};\n private readonly diskList: Record<string, { ts: number; source: string; name: string }>;\n private dbList: Record<string, ioBroker.BaseObject> = {};\n private ready = false;\n\n constructor(options: { diskRoot: string; adapter: ioBroker.Adapter; log?: ioBroker.Logger }) {\n if (!options.adapter) {\n throw new Error('No adapter defined');\n }\n this.adapter = options.adapter;\n this.diskRoot = normalize(options.diskRoot || '').replace(/\\\\/g, '/');\n this.from = `system.adapter.${this.adapter.namespace}`;\n this.lastSyncID = `${this.from}.lastSync`;\n this.diskList = {};\n\n if (options.log) {\n this.log = options.log as unknown as {\n log: (text: string) => void;\n silly: (text: string) => void;\n debug: (text: string) => void;\n info: (text: string) => void;\n warn: (text: string) => void;\n error: (text: string) => void;\n };\n this.log.log = this.log.log || ((text: string) => console.log(text));\n } else {\n this.log = {\n silly: text => console.log(text),\n debug: text => console.log(text),\n info: text => console.log(text),\n log: text => console.log(text),\n warn: text => console.warn(text),\n error: text => console.error(text),\n };\n }\n if (!options.diskRoot?.trim() || this.adapter.namespace !== 'javascript.0') {\n // only instance 0 can sync objects\n return;\n }\n\n if (!existsSync(this.diskRoot)) {\n try {\n mkdirSync(this.diskRoot);\n } catch (err: unknown) {\n this.log.error(`Cannot create directory ${this.diskRoot}: ${err as Error}`);\n return;\n }\n }\n\n this.diskList = this.scanDisk();\n this.checkLastSyncObject(lastSyncTime =>\n this.scanDB(list => {\n this.dbList = list;\n this.sync(lastSyncTime);\n\n this.adapter.setForeignState(this.lastSyncID, Date.now(), true);\n\n this.ready = true;\n // monitor all folders\n this.watchFolders(this.diskRoot);\n }),\n );\n }\n\n watchFolders(root_: string): void {\n root_ = root_.endsWith('/') ? root_ : `${root_}/`;\n\n // ignore all .xxx folders, like \".git\", \".idea\", so users may not have scripts starting with \".\"\n try {\n const files = readdirSync(root_).filter(name => !name.startsWith('.'));\n files.forEach(file => {\n const name = join(root_, file).replace(/\\\\/g, '/');\n const stat = statSync(name);\n\n if (stat.isDirectory()) {\n this.watchFolders(name);\n } else {\n const lstat = lstatSync(name);\n if (!lstat.isSymbolicLink()) {\n return;\n }\n\n const linkTarget = realpathSync(name);\n\n this.log.info(`Watch symlinked file ${name} -> ${linkTarget}`);\n watch(linkTarget, (eventType /*, _filename*/) => {\n // Pretend the symlink source was changed.\n this.log.debug(`File ${name} ${eventType}`);\n this.onFileChange(eventType, name);\n });\n }\n });\n } catch (err: unknown) {\n return this.log.warn(`Error while trying to watch folder ${root_}: ${err as Error}`);\n }\n\n if (!this.watchedFolder[root_]) {\n this.log.info(`Watch ${root_}`);\n try {\n this.watchedFolder[root_] = watch(root_, (eventType, fileName) => {\n this.log.debug(`File ${root_}${fileName} ${eventType}`);\n this.onFileChange(eventType, root_ + fileName);\n });\n } catch (err: any) {\n this.log.error(`Could not watch folder ${root_}: ${err.message}`);\n this.log.error(`Please check that no other processes change data in the mirror directory!`);\n }\n\n this.watchedFolder[root_].on('error', () => {\n this.log.debug(`Folder ${root_} was deleted`);\n try {\n this.watchedFolder[root_] && this.watchedFolder[root_].close();\n } catch {\n // ignore error\n }\n\n if (this.watchedFolder[root_]) {\n delete this.watchedFolder[root_];\n }\n });\n }\n }\n\n checkLastSyncObject(cb: (lastSyncTime: number) => void): void {\n void this.adapter.getForeignObject(this.lastSyncID, (_err, obj) => {\n if (!obj) {\n // create variable\n const obj: ioBroker.StateObject = {\n _id: this.lastSyncID,\n common: {\n name: 'Last sync time',\n type: 'number',\n role: 'timestamp',\n write: false,\n min: 0,\n read: true,\n },\n type: 'state',\n native: {},\n };\n\n this.adapter.setForeignObject(this.lastSyncID, obj, () =>\n this.adapter.setForeignState(this.lastSyncID, 0, true, () => cb?.(0)),\n );\n } else {\n void this.adapter.getForeignState(this.lastSyncID, (_err, state) => cb?.(state?.val as number));\n }\n });\n }\n\n static getDBFolder(id: string): string {\n const parts = id.split('.');\n parts.pop();\n return parts.join('.');\n }\n\n static isBlockly(data: string): boolean {\n const pos = data.lastIndexOf('\\n');\n if (pos !== -1) {\n data = data.substring(pos + 1);\n if (data[0] === '/' && data[1] === '/') {\n data = Buffer.from(data.substring(2), 'base64').toString('utf8');\n if (data.startsWith('%3Cxml')) {\n return true;\n }\n }\n }\n return false;\n }\n\n static isRules(data: string): boolean {\n const pos = data.lastIndexOf('\\n');\n if (pos !== -1) {\n data = data.substring(pos + 1);\n if (data.startsWith('//{\"') && data.endsWith('}')) {\n return true;\n }\n }\n return false;\n }\n\n static detectType(fileName: string, data: string): ScriptType {\n if (fileName.endsWith('.ts')) {\n return 'TypeScript/ts';\n }\n return Mirror.isBlockly(data) ? 'Blockly' : Mirror.isRules(data) ? 'Rules' : 'Javascript/js';\n }\n\n updateFolderTime(id: string): void {\n this.dbList[id].ts = Date.now();\n this.dbList[id].from = this.from;\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n }\n\n private _getDiskPath(pathDisk: string[]): string {\n return join(this.diskRoot, pathDisk.join('/')).replace(/\\\\/g, '/');\n }\n\n private static _getDbPath(pathDB: string[]): string {\n if (!pathDB || !pathDB.length) {\n return 'script.js';\n }\n return `script.js.${pathDB.join('.')}`;\n }\n\n private _getFilesInPath(pathDisk: string): string[] {\n pathDisk = pathDisk.substring(this.diskRoot.length + 1);\n const id = pathDisk.replace(/\\./g, '\\\\.').replace(/[/\\\\]/g, '\\\\.');\n const reg = new RegExp(`script\\\\.js${id ? `.${id}` : ''}\\\\.[^.]+$`);\n return Object.keys(this.diskList)\n .filter(file => reg.test(file))\n .map(id => id.split('.').pop() || '');\n }\n\n private _getObjectsInPath(pathDB: string): string[] {\n const reg = new RegExp(`${pathDB.replace(/\\./g, '\\\\.')}\\\\.[^.]+$`);\n return Object.keys(this.dbList)\n .filter(id => reg.test(id))\n .map(id => id.split('.').pop() || '');\n }\n\n /**\n * Write file to disk, synchron, catch (and print) error.\n *\n * @param id of script\n * @returns true if write was successful\n */\n private _writeFile(id: string): boolean {\n const diskListEntry = this.diskList[id];\n try {\n //check if the directory exists and create if not:\n mkdirSync(dirname(diskListEntry.name), { recursive: true, mode: MODE_0777 });\n writeFileSync(diskListEntry.name, diskListEntry.source, { mode: MODE_0777 });\n diskListEntry.ts = Date.now();\n return true;\n } catch (err: unknown) {\n this.log.error(`Cannot write file ${diskListEntry ? diskListEntry.name : id}: ${err as Error}`);\n return false;\n }\n }\n\n sync(lastSyncTime: number, pathDisk?: string[], pathDB?: string[]): void {\n lastSyncTime = lastSyncTime || 0;\n pathDisk = pathDisk || [];\n pathDB = pathDB || [];\n\n const dirDisk = this._getDiskPath(pathDisk);\n const dirDB = Mirror._getDbPath(pathDB);\n const files = this._getFilesInPath(dirDisk);\n const objects = this._getObjectsInPath(dirDB);\n\n for (let o = objects.length - 1; o >= 0; o--) {\n // if folder\n if (this.dbList[`${dirDB}.${objects[o]}`] && this.dbList[`${dirDB}.${objects[o]}`].type === 'channel') {\n // dive into\n const nextPathDisk = JSON.parse(JSON.stringify(pathDisk));\n nextPathDisk.push(objects[o]);\n const nextPathDB = JSON.parse(JSON.stringify(pathDB));\n nextPathDB.push(objects[o]);\n objects.splice(o, 1);\n this.sync(lastSyncTime, nextPathDisk, nextPathDB);\n } else {\n // try to find this DB script on disk\n for (let f = files.length - 1; f >= 0; f--) {\n if (objects[o] === files[f]) {\n const id = `${dirDB}.${objects[o]}`;\n\n if (!this.diskList[id]) {\n continue;\n }\n\n if (\n !this.dbList[id].ts ||\n (this.dbList[id].ts > this.diskList[id].ts &&\n this.dbList[id].ts - this.diskList[id].ts > 2000)\n ) {\n // copy text to file\n this.dbList[id].ts = Date.now();\n this.diskList[id].source = this.dbList[id].common.source;\n this.log.debug(`Update disk with ${this.diskList[id].name}`);\n this._writeFile(id);\n } else if (this.dbList[id].ts && this.diskList[id].ts - this.dbList[id].ts > 2000) {\n // copy file to DB\n this.dbList[id].common.source = this.diskList[id].source;\n this.dbList[id].ts = this.diskList[id].ts;\n this.dbList[id].from = this.from;\n this.log.debug(`Update DB with ${id}`);\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n }\n files.splice(f, 1);\n objects.splice(o, 1);\n break;\n }\n }\n }\n }\n\n // go through objects, that does not exist on disk\n for (let o = objects.length - 1; o >= 0; o--) {\n const fileName = this._scriptId2FileName(\n `${dirDB}.${objects[o]}`,\n this.dbList[`${dirDB}.${objects[o]}`].common.engineType,\n );\n this.log.info(`Created script file on disk ${fileName}`);\n const f = `script.js.${fileName\n .substring(this.diskRoot.length)\n .replace(/[\\\\/]/g, '.')\n .replace(/\\.js$|\\.ts$/g, '')}`;\n this.diskList[f] = { name: fileName, source: this.dbList[`${dirDB}.${objects[o]}`].common.source, ts: 0 };\n this._writeFile(f);\n }\n\n // go through files, that does not exist in DB\n for (let f = files.length - 1; f >= 0; f--) {\n // read creation time\n const id = `${dirDB}.${files[f]}`;\n if (this.diskList[id] && this.diskList[id].ts > lastSyncTime) {\n // The file was created after last sync. So create it in DB too\n this.dbList[id] = {\n _id: id,\n common: {\n name: files[f],\n enabled: false,\n source: this.diskList[id].source,\n engine: `system.adapter.${this.adapter.namespace}`,\n engineType: Mirror.detectType(this.diskList[id].name, this.diskList[id].source),\n debug: false,\n verbose: false,\n },\n type: 'script',\n ts: this.diskList[id].ts,\n native: {},\n };\n this.log.debug(`Create script in DB with ${id}`);\n // ensure that every script has a folder and if not, then create it\n this._checkIfAllFoldersAreExist(id, this.dbList);\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n } else {\n this.log.warn(`Please delete file ${join(dirDisk, files[f])}`);\n }\n }\n }\n\n private _scriptId2FileName(id: string, type: ScriptType): string {\n id = id.substring('script.js.'.length);\n const parts = id.split('.');\n return (\n join(this.diskRoot, parts.join('/')).replace(/\\\\/g, '/') +\n (type && type.toLowerCase() === 'typescript/ts' ? '.ts' : '.js')\n );\n }\n\n private _fileName2scriptId(file: string): string {\n file = file.substring(this.diskRoot.length).replace(/\\.js$/g, '').replace(/\\.ts$/g, '');\n const parts = file.replace(/\\\\/g, '/').split('/');\n if (!parts[0] && parts.length) {\n parts.shift();\n }\n\n return `script.js.${parts.join('.')}`;\n }\n\n removeScriptsInFolder(folder: string): void {\n // Deleting a folder on disk is meant to delete its scripts in the database - that is what\n // the mirroring is for. A folder that only *looks* gone because the mirror directory as a\n // whole became unreachable is a different story: an unmounted share or a changed permission\n // would otherwise take the scripts with it. In that case nothing is deleted and the next\n // start syncs the directory again from the database.\n if (!existsSync(this.diskRoot)) {\n this.log.warn(\n `Mirror directory ${this.diskRoot} is not accessible - the scripts of ${folder} are kept in the database`,\n );\n return;\n }\n\n // get all files in this folder\n const folderId = this._fileName2scriptId(folder);\n for (const id in this.dbList) {\n if (\n Object.prototype.hasOwnProperty.call(this.dbList, id) &&\n (id.startsWith(folderId) || id === folderId.replace(/\\.$/, ''))\n ) {\n // delete it\n if (this.dbList[id]) {\n this.log.debug(`Delete script ${id} in DB`);\n delete this.dbList[id];\n this.adapter.delForeignObject(id);\n }\n if (this.diskList[id]) {\n delete this.diskList[id];\n }\n }\n }\n }\n\n onFileChange(event: 'change' | 'create' | 'delete' | 'rename', file: string): void {\n if (!this.ready) {\n return;\n }\n let stats: Stats | undefined;\n const exists = existsSync(file);\n if (exists) {\n try {\n stats = statSync(file);\n } catch (err: unknown) {\n this.log.error(`Cannot read file ${file}: ${err as Error}`);\n }\n\n if (stats?.isDirectory()) {\n file = file.endsWith('/') ? file : `${file}/`;\n if (exists) {\n !this.watchedFolder[file] && this.watchFolders(file);\n try {\n // scan folder anew\n const files = readdirSync(file).filter(name => !name.startsWith('.'));\n\n // update all files in this directory\n files.forEach(f => this.onFileChange('change', join(file, f).replace(/\\\\/g, '/')));\n } catch (err: unknown) {\n this.log.error(`Error while checking files in directory ${file}: ${err as Error}`);\n }\n } else {\n if (this.watchedFolder[file]) {\n this.watchedFolder[file].close();\n delete this.watchedFolder[file];\n }\n this.removeScriptsInFolder(file);\n }\n return;\n }\n } else if (this.watchedFolder[file]) {\n if (!exists) {\n try {\n if (this.watchedFolder[file]) {\n this.watchedFolder[file].close();\n delete this.watchedFolder[file];\n }\n } catch {\n // ignore error\n }\n this.removeScriptsInFolder(file);\n }\n return;\n } else if (this.watchedFolder[`${file}/`]) {\n if (!exists) {\n file = `${file}/`;\n // delete all files in this folder\n\n try {\n if (this.watchedFolder[file]) {\n this.watchedFolder[file].close();\n delete this.watchedFolder[file];\n }\n } catch {\n // ignore error\n }\n this.removeScriptsInFolder(file);\n }\n return;\n }\n\n if (!file.match(/\\.ts$|\\.js$/)) {\n return;\n }\n const id = this._fileName2scriptId(file);\n\n if (exists && (event === 'change' || event === 'create')) {\n try {\n stats = stats || statSync(file);\n const source = readFileSync(file).toString();\n const ts = stats?.mtime.getTime() || 0;\n this.diskList[id] = { ts, source, name: file };\n\n if (this.dbList[id]) {\n if (this.dbList[id].common.source !== source) {\n this.dbList[id].common.source = source;\n this.dbList[id].ts = ts;\n this.log.debug(`Update script ${id} in DB`);\n this.dbList[id].from = this.from;\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n } else {\n this.dbList[id].ts = ts;\n }\n } else {\n this.log.debug(`Create script ${id} in DB`);\n const parts = id.split('.');\n // new script\n this.dbList[id] = {\n _id: id,\n common: {\n name: parts.pop(),\n engineType: Mirror.detectType(file, source),\n source,\n enabled: false,\n engine: `system.adapter.${this.adapter.namespace}`,\n debug: false,\n verbose: false,\n },\n type: 'script',\n native: {},\n ts: ts,\n };\n this._checkIfAllFoldersAreExist(id, this.dbList);\n void this.adapter.setForeignObject(id, this.dbList[id] as ioBroker.Object);\n }\n } catch (err: unknown) {\n this.log.error(`Cannot read file ${file}: ${err as Error}`);\n }\n } else if (event === 'delete' || event === 'rename') {\n // there is a bug: just after creation of a script on disk from ioBroker, \"rename\" event is generated!\n if (event === 'rename' && this.diskList[id] && Date.now() - this.diskList[id].ts < 200) {\n console.log(`Interval: ${Date.now() - this.diskList[id].ts}`);\n // 'rename' is ignored\n this.log.debug(`Rename event for ${id} is ignored`);\n } else {\n if (this.dbList[id]) {\n this.log.debug(`Delete script ${id} in DB`);\n delete this.dbList[id];\n this.adapter.delForeignObject(id);\n }\n if (this.diskList[id]) {\n delete this.diskList[id];\n }\n }\n }\n this.adapter.setForeignState(this.lastSyncID, Date.now(), true);\n }\n\n onObjectChange(id: string, obj: ioBroker.ScriptObject | null | undefined): void {\n if (!this.dbList || !id || !this.ready) {\n return;\n }\n\n const file = this._scriptId2FileName(id, obj?.common?.engineType as ScriptType);\n\n if (!obj?.common) {\n // File was deleted\n if (this.dbList[id]) {\n delete this.dbList[id];\n const folderId = Mirror.getDBFolder(id);\n if (this.dbList[folderId]) {\n this.updateFolderTime(folderId);\n }\n\n if (existsSync(file)) {\n try {\n this.log.debug(`Delete ${file} on disk`);\n unlinkSync(file);\n } catch (err: unknown) {\n this.log.error(`Cannot delete ${file}: ${err as Error}`);\n }\n }\n if (this.diskList[id]) {\n delete this.diskList[id];\n }\n }\n } else if (obj.type === 'script' && id.startsWith('script.js.')) {\n if (this.dbList[id]) {\n // File changed\n if (this.dbList[id].common.source !== obj.common.source) {\n this.dbList[id] = obj;\n this.log.debug(`Update ${file} on disk`);\n this.diskList[id] = { ts: 0, source: obj.common.source, name: file };\n this._writeFile(id);\n } else if (!this.diskList[id] || this.diskList[id].source !== obj.common.source) {\n this.log.debug(`Update ${file} on disk`);\n this.diskList[id] = { ts: 0, source: obj.common.source, name: file };\n this._writeFile(id);\n }\n } else {\n // new script\n this.dbList[id] = obj;\n if (!this.diskList[id] || this.diskList[id].source !== obj.common.source) {\n this.log.debug(`Create ${file} on disk`);\n this.diskList[id] = { ts: 0, source: obj.common.source, name: file };\n this._writeFile(id);\n }\n }\n this.dbList[id].ts = Date.now();\n }\n\n this.adapter.setForeignState(this.lastSyncID, Date.now(), true);\n }\n\n scanDisk(\n dirPath?: string,\n list?: Record<string, { ts: number; source: string; name: string }>,\n ): Record<string, { ts: number; source: string; name: string }> {\n dirPath = dirPath || this.diskRoot;\n list = list || {};\n try {\n if (dirPath && !dirPath.startsWith('.') && existsSync(dirPath)) {\n const files = readdirSync(dirPath).filter(name => !name.startsWith('.'));\n for (const file of files) {\n const fullName = join(dirPath, file);\n const stats = statSync(fullName);\n if (stats.isDirectory()) {\n this.scanDisk(fullName.replace(/\\\\/g, '/'), list);\n } else if (file.match(/\\.js$|\\.ts$/)) {\n const f = this._fileName2scriptId(fullName);\n list[f] = {\n ts: stats.mtime.getTime(),\n source: readFileSync(fullName).toString(),\n name: fullName,\n };\n }\n }\n }\n } catch (err: unknown) {\n this.log.error(`Error while checking files in directory ${dirPath}: ${err as Error}`);\n }\n return list;\n }\n\n private _checkIfAllFoldersAreExist(id: string, list: Record<string, ioBroker.BaseObject>): void {\n const parts = id.split('.');\n for (let i = parts.length - 1; i >= 2; i--) {\n parts.pop();\n const folderId = parts.join('.');\n if (!list[folderId]) {\n const obj: ioBroker.ChannelObject = {\n _id: folderId,\n common: {\n name: parts[parts.length - 1],\n },\n type: 'channel',\n native: {},\n };\n list[folderId] = obj;\n try {\n this.adapter.setForeignObject(folderId, obj, err => {\n if (err) {\n this.log.warn(`Error while checking script folder ${folderId} for id \"${id}\": ${err}`);\n }\n });\n } catch (err: unknown) {\n this.log.warn(`Error while checking script folder ${folderId} for id \"${id}\": ${err as Error}`);\n }\n }\n }\n }\n\n scanDB(cb: (list: Record<string, ioBroker.BaseObject>) => void): void {\n this.adapter.getObjectView(\n 'system',\n 'channel',\n { startkey: 'script.js.', endkey: 'script.js.\\u9999' },\n (err, res) => {\n // this is not required, because JavaScript subscribes on ALL objects\n // adapter.subscribeForeignObjects('script.js.*');\n const list: Record<string, ioBroker.ChannelObject | ioBroker.ScriptObject> = {};\n if (err) {\n this.log.error(`Error while checking scripts channel from objects database: ${err}`);\n }\n if (res?.rows) {\n for (let i = 0; i < res.rows.length; i++) {\n const value = res.rows[i].value;\n if (value?._id && value.common) {\n list[res.rows[i].value._id] = res.rows[i].value;\n }\n }\n }\n this.adapter.getObjectView(\n 'script',\n 'javascript',\n { startkey: 'script.js.', endkey: 'script.js.\\u9999' },\n (err, res) => {\n if (err) {\n this.log.error(`Error while checking scripts javascript from objects database: ${err}`);\n }\n if (res?.rows) {\n for (let i = 0; i < res.rows.length; i++) {\n const value = res.rows[i].value;\n if (value?._id && value.common) {\n list[res.rows[i].value._id] = res.rows[i].value;\n // ensure that every script has a folder and if not, then create it\n this._checkIfAllFoldersAreExist(res.rows[i].value._id, list);\n }\n }\n }\n cb?.(list);\n },\n );\n },\n );\n }\n}\n"]}
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.FORBIDDEN_CHARS = void 0;
37
+ exports.normalizeStateDefault = normalizeStateDefault;
37
38
  exports.isValidPattern = isValidPattern;
38
39
  exports.pattern2RegEx = pattern2RegEx;
39
40
  exports.isExactId = isExactId;
@@ -46,6 +47,30 @@ const wordsMod = __importStar(require("./words"));
46
47
  const eventObjMod = __importStar(require("./eventObj"));
47
48
  const patternCompareFunctions_1 = require("./patternCompareFunctions");
48
49
  const SCRIPT_CODE_MARKER = 'script.js.';
50
+ /**
51
+ * State types whose value - and therefore whose default - is stored as JSON, not as itself.
52
+ *
53
+ * `json` is missing from `ioBroker.CommonType` but js-controller accepts it and applies the same
54
+ * rule, so these are compared as plain strings - `setStateHelper` treats it the same way.
55
+ */
56
+ const STRINGIFIED_STATE_TYPES = ['object', 'json', 'array'];
57
+ /**
58
+ * Brings `common.def` of a state into the shape js-controller expects, in place.
59
+ *
60
+ * A state of a structured type keeps its value as JSON - `setState` stringifies it on the way in.
61
+ * js-controller expects the same of the default and rejects anything else with "Default value has
62
+ * to be stringified but received type ...", which a script author cannot act on
63
+ * (https://github.com/ioBroker/ioBroker.javascript/issues/2307).
64
+ *
65
+ * @param common The `common` part of a state object
66
+ * @throws {TypeError} if the default cannot be stringified, e.g. because it is circular
67
+ */
68
+ function normalizeStateDefault(common) {
69
+ if (common.def == null || typeof common.def === 'string' || !STRINGIFIED_STATE_TYPES.includes(common.type)) {
70
+ return;
71
+ }
72
+ common.def = JSON.stringify(common.def);
73
+ }
49
74
  // Pre-compiled RegExp constants for formatTimeDiff – avoids recompiling on every call
50
75
  const FTD_TEST_D = /(?<!\\)[DTД]/;
51
76
  const FTD_REPL_DD = /(?<!\\)(?:DD|TT|ДД)/g;
@@ -635,6 +660,8 @@ function sandBox(script, name, verbose, debug, context, logCollector) {
635
660
  scriptName: name,
636
661
  instance: adapter.instance || 0,
637
662
  defaultDataDir: context.getAbsoluteDefaultDataDir(),
663
+ // Read-only view on the central ioBroker credential store, e.g. `SECRETS.CameraPassword.key`
664
+ SECRETS: context.secrets,
638
665
  verbose,
639
666
  exports: {}, // Polyfill for the export object in TypeScript modules
640
667
  require: function (md) {
@@ -2921,6 +2948,16 @@ function sandBox(script, name, verbose, debug, context, logCollector) {
2921
2948
  if (!isAlias && initValue === undefined) {
2922
2949
  initValue = _common.def;
2923
2950
  }
2951
+ // Deliberately after the default was taken as the initial value above: that value stays
2952
+ // the object it was and takes the usual road through `setState`, which stringifies it.
2953
+ // Only the object definition is brought into the shape js-controller expects.
2954
+ try {
2955
+ normalizeStateDefault(_common);
2956
+ }
2957
+ catch (err) {
2958
+ sandbox.log(`Cannot stringify ${name}.common.def: ${err}`, 'warn');
2959
+ delete _common.def;
2960
+ }
2924
2961
  native = native || {};
2925
2962
  // Check min, max and def values for number
2926
2963
  if (_common.type !== undefined && _common.type === 'number') {