Parcourir la source

feat:导入大量文档和数据,完成一个可用的初版

jerry il y a 2 mois
Parent
commit
adc15f03a3
83 fichiers modifiés avec 12539 ajouts et 689 suppressions
  1. 0 267
      client.html
  2. BIN
      client/@mdit_plugin-tex插件教程.pdf
  3. 7 0
      client/README.md
  4. 11 0
      client/docs/.graphifyignore
  5. 11 3
      client/docs/.vitepress/config.mts
  6. 24 0
      client/docs/.vitepress/menuConfig.ts
  7. 878 0
      client/docs/.vitepress/plugins/DomToDocx/README.MD
  8. 221 0
      client/docs/.vitepress/plugins/DomToDocx/docxImage.ts
  9. 148 0
      client/docs/.vitepress/plugins/DomToDocx/docxList.ts
  10. 149 0
      client/docs/.vitepress/plugins/DomToDocx/docxMath.ts
  11. 39 0
      client/docs/.vitepress/plugins/DomToDocx/docxTable.ts
  12. 113 0
      client/docs/.vitepress/plugins/DomToDocx/docxText.ts
  13. 14 0
      client/docs/.vitepress/plugins/DomToDocx/docxTitle.ts
  14. 35 0
      client/docs/.vitepress/plugins/DomToDocx/globalConfig.ts
  15. 223 0
      client/docs/.vitepress/plugins/DomToDocx/handleElement.ts
  16. 23 0
      client/docs/.vitepress/plugins/DomToDocx/handleNodes.ts
  17. 40 0
      client/docs/.vitepress/plugins/DomToDocx/index.ts
  18. 9 0
      client/docs/.vitepress/plugins/DomToDocx/types.ts
  19. 43 4
      client/docs/.vitepress/theme/Layout.vue
  20. 1 1
      client/docs/.vitepress/theme/components/CasdoorCallback.vue
  21. 14 2
      client/docs/.vitepress/theme/components/ExcalidrawView.vue
  22. 1 1
      client/docs/.vitepress/theme/components/FilterComponent.vue
  23. 1 1
      client/docs/.vitepress/theme/components/FilterForm.vue
  24. 73 6
      client/docs/.vitepress/theme/components/NormalTable.vue
  25. 14 3
      client/docs/.vitepress/theme/components/ParameterTable.vue
  26. 1 1
      client/docs/.vitepress/theme/components/PdfViewer.vue
  27. 1 1
      client/docs/.vitepress/theme/components/SecurePdfViewer.vue
  28. 1 1
      client/docs/.vitepress/theme/components/SimpleTable.vue
  29. 1 1
      client/docs/.vitepress/theme/components/Waline.vue
  30. 7 0
      client/docs/.vitepress/theme/index.css
  31. 1 1
      client/docs/.vitepress/theme/index.ts
  32. 601 73
      client/docs/Hardware/Gate/MSA_C.md
  33. 11 0
      client/docs/Hardware/Other/SplitCT.md
  34. 6 0
      client/docs/Hardware/Power/aPower_1.0.md
  35. 3 0
      client/docs/Hardware/Power/aPower_1.2.md
  36. 8 6
      client/docs/Hardware/Power/aPower_1.3.md
  37. 8 7
      client/docs/Hardware/Power/aPower_2.md
  38. 419 18
      client/docs/Hardware/Power/aPower_S.md
  39. 5 0
      client/docs/Other/HostSideSoftware.md
  40. 5 0
      client/docs/Software/AddressAssignment.md
  41. 39 0
      client/docs/Software/EnergyStatistics.md
  42. 5 0
      client/docs/Software/ParamSync.md
  43. 1165 0
      client/docs/System/AlarmTable.md
  44. 361 0
      client/docs/System/EventMessage.md
  45. 1 1
      client/docs/System/SystemConfig.md
  46. 212 78
      client/docs/public/assets/Hardware/Gate/MSA_C/MSA-C_SystemCommunicationStructureDiagram.excalidraw
  47. BIN
      client/docs/public/assets/Hardware/Gate/MSA_C/RJ45-Pin定义图.png
  48. BIN
      client/docs/public/assets/Hardware/Gate/aGate_1.3/EMS-aGate1.3.png
  49. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/4301615202_RSD-S-PLC-Datasheet_Rev3.1_2025-02-12.pdf
  50. 35 0
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/4301615331_RSD-S-PLC-Quick-Installation-Guide_Rev3.1_2025-04-02-1.pdf
  51. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/4302915212_Transmitter-PLC-1P-datasheet_Rev1.8_2023-10-07.pdf
  52. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/APsmart-RSD-Tech-Training-_SMA.pdf
  53. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/RSD-S-PLCTransmitter-User-Manual_NA_EN_Rev4.1_2025-05-23.pdf
  54. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/Rapid-Shutdown-Devices-Application-202305.pdf
  55. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/600eea227a66f17b79f59822_RSS Signal Detector.pdf
  56. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/6286b222b95d50179e3a46dd_Tigo Rapid Shutdown Solutions Brochure - Final.pdf
  57. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/63c595c30a14e6d8c7324c55_Tigo Energy - Application Note - Pure Signal Technology - 002-00121-00 - REV 1.0 - 20221118.pdf
  58. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/66f439cbddd5c47ce3fd53db_002-00118-00 4.3 IO&M RSS Transmitter Installation 20240805.pdf
  59. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/680acdffe9d05260ee9e8fd0_002-00222-00 1.0 Datasheet TS4-A-F (725W) 20250418 - EN.pdf
  60. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/680fae5df8b93aad651a7e39_002-00146-00 1.4 Datasheet RSS w PCBA 20250411 - EN.pdf
  61. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/68599e8008025f447ded2ecb_002-00218-00 1.3 QSG TS4-A-O-S-F (725) 20250529 - EN.pdf
  62. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/68599f186ce7de70e0577ce0_002-00157-00 1.3 QSG TS4-A-F2F w RSS Transmitter 20250610 - EN.pdf
  63. 1856 0
      client/docs/public/assets/Hardware/Power/aPower_S/aPowerS_InnerEnergyFlow.excalidraw
  64. 4880 0
      client/docs/public/assets/Hardware/Power/aPower_S/aPowerS_PvEnergyFlow.excalidraw
  65. 478 0
      client/docs/public/assets/Hardware/Power/aPower_S/aPowerS基本规格参数表.json
  66. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/交流耦合接入连接图.png
  67. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/直流与交流耦合同时接入连接图.png
  68. BIN
      client/docs/public/assets/Hardware/Power/aPower_S/直流耦合接入连接图.png
  69. BIN
      client/docs/public/assets/Software/EnergyStatistics/AppHomeLoad.PNG
  70. BIN
      client/docs/public/pdf/规格书_23020016_XH-SCT-S24_星火电子.pdf
  71. BIN
      client/docs/public/ppt/NEM+ & BYOD+control logic EN.pptx
  72. BIN
      client/docs/public/ppt/NEM+ Training Materials-20240905.pptx
  73. 1 0
      client/package.json
  74. 54 0
      client/pnpm-lock.yaml
  75. 2 1
      client/tsconfig.json
  76. 0 164
      index.html
  77. 41 0
      server/README.md
  78. 0 1
      server/package.json
  79. 68 0
      server/waline/template/waline.pgsql
  80. 108 0
      server/waline/template/waline.sql
  81. BIN
      server/waline/template/waline.sqlite
  82. 63 0
      server/waline/template/waline.tidb
  83. 0 47
      ssr.html

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 267
client.html


BIN
client/@mdit_plugin-tex插件教程.pdf


+ 7 - 0
client/README.md

@@ -23,3 +23,10 @@ pnpm run install
 ```
 
 安装路径默认为:/var/www/fwh-wiki/fwhwiki/,请确保路径存在。
+
+### Markdown 教程
+
+https://mdit-plugins.github.io/zh/
+
+数学公式语法可在以下地址查阅:
+https://mdit-plugins.github.io/zh/tex.html#tex-%E6%95%99%E7%A8%8B

+ 11 - 0
client/docs/.graphifyignore

@@ -0,0 +1,11 @@
+# 排除所有文件
+*
+
+# 只保留 md 和 pdf
+!*.md
+!*.pdf
+!**/*.md
+!**/*.pdf
+
+# 保留目录遍历能力
+!*/

+ 11 - 3
client/docs/.vitepress/config.mts

@@ -3,9 +3,9 @@ import path from 'path'
 import menuConfig from './menuConfig'
 import vueJsx from '@vitejs/plugin-vue-jsx'
 import { withMermaid } from 'vitepress-plugin-mermaid'
-import AuthMid from './plugins/casdoor/mid'
-import SseMid from './plugins/SSE/server'
-import { watch } from 'fs'
+// import AuthMid from './plugins/casdoor/mid'
+// import SseMid from './plugins/SSE/server'
+// import { watch } from 'fs'
 
 const fileAndStyles: Record<string, string> = {}
 
@@ -56,6 +56,9 @@ export default defineConfig(
           },
           locales: {
             zh: {
+              label: '简体中文',
+              lang: 'zh-CN',
+              link: '/', // 默认语言链接
               translations: {
                 button: {
                   buttonText: '搜索文档',
@@ -70,6 +73,11 @@ export default defineConfig(
                   }
                 }
               }
+            },
+            en: {
+              label: 'English',
+              lang: 'en-US',
+              link: '/en/'
             }
           }
         }

+ 24 - 0
client/docs/.vitepress/menuConfig.ts

@@ -90,6 +90,10 @@ const menu : Page[] = [
           {
             title: 'Generator Module',
             path: '/GeneratorModule.md'
+          },
+          {
+            title: 'Split CT',
+            path: '/SplitCT.md'
           }
         ]
       }
@@ -138,6 +142,14 @@ const menu : Page[] = [
       {
         title: '虚拟电厂(VPP)',
         path: '/VPP.md'
+      },
+      {
+        title: '参数同步',
+        path: '/ParamSync.md'
+      },
+      {
+        title: '设备编址',
+        path: '/AddressAssignment.md'
       }
     ]
   },
@@ -152,6 +164,14 @@ const menu : Page[] = [
       {
         title: '系统配电',
         path: '/SystemDistribution.md'
+      },
+      {
+        title: '告警表',
+        path: '/AlarmTable.md'
+      },
+      {
+        title: '事件推送',
+        path: '/EventMessage.md'
       }
     ]
   },
@@ -162,6 +182,10 @@ const menu : Page[] = [
       {
         title: '资费套餐模版',
         path: '/TariffScheduleTemplates.md'
+      },
+      {
+        title: '上位机软件',
+        path: '/HostSideSoftware.md'
       }
     ]
   }

+ 878 - 0
client/docs/.vitepress/plugins/DomToDocx/README.MD

@@ -0,0 +1,878 @@
+# About docx
+
+## 用法
+
+组件结构
+
+<pre>
+Document
+├── sections
+│   ├── headers
+│   ├── footers
+│   ├── properties
+│   ├── children(Paragraph | Table | TableOfContents | Textbox)
+├── title
+├── subject
+├── creator
+├── keywords
+├── description
+├── lastModifiedBy
+├── revision
+├── externalStyles
+├── styles
+├── numbering
+├── comments
+├── footnotes
+├── background
+├── features
+├── compatabilityModeVersion
+├── compatibility
+├── customProperties
+├── evenAndOddHeaderAndFooters
+├── defaultTabStop
+├── fonts
+└── hyphenation
+</pre>
+
+### Document
+
+组件结构
+
+<pre>
+Document
+├── sections
+│   ├── headers
+│   ├── footers
+│   ├── properties
+│   ├── children(Paragraph | Table | TableOfContents | Textbox)
+├── title
+├── subject
+├── creator
+├── keywords
+├── description
+├── lastModifiedBy
+├── revision
+├── externalStyles
+├── styles
+├── numbering
+├── comments
+├── footnotes
+├── background
+├── features
+├── compatabilityModeVersion
+├── compatibility
+├── customProperties
+├── evenAndOddHeaderAndFooters
+├── defaultTabStop
+├── fonts
+└── hyphenation
+</pre>
+
+选项表:
+
+| 属性 | 类型 | 说明 |
+| ---- | :----: | ---- |
+| sections | ISectionOptions[] | 各章节相关内容 |
+| title | string | 文章标题,仅为文件的属性 |
+| subject | string | 文章主题,仅为文件的属性 |
+| creator | string | 文章作者,仅为文件的属性 |
+| keywords | string | 文章关键词,仅为文件的属性 |
+| description | string | 文章描述,仅为文件的属性 |
+| lastModifiedBy | string | 文章最后修订者 |
+| revision | string | 文章修订版本号 |
+| externalStyles | string | 文章修订版本号 |
+| styles | IStylesOptions | 配置文档样式,待研究 |
+| numbering | INumberingOptions | 有序/无序列表编号配置 |
+| comments | ICommentsOptions | 评论配置 |
+| footnotes | Record<string, { children: Paragraph[] }> | 脚注配置 |
+| background | IDocumentBackgroundOptions | 文档背景配置 |
+| features | { trackRevisions?: boolean;  updateFields?: boolean; } | 特征配置 |
+| compatabilityModeVersion | number | 兼容模式版本 |
+| compatibility | ICompatibilityOptions | 兼容性配置 |
+
+#### 特殊字段说明
+
+##### externalStyles
+
+导入外部样式内容导入,内容格式为xml。
+
+样式导入后,可在段落中设置指定样式。
+
+代码示例:
+
+```ts
+// This example shows 3 styles using XML styles
+
+import * as fs from "fs";
+import { Document, HeadingLevel, Packer, Paragraph } from "docx";
+
+const styles = fs.readFileSync("./demo/assets/custom-styles.xml", "utf-8");
+const doc = new Document({
+    title: "Title",
+    externalStyles: styles,
+    sections: [
+        {
+            children: [
+                new Paragraph({
+                    text: "Cool Heading Text",
+                    heading: HeadingLevel.HEADING_1,
+                }),
+                new Paragraph({
+                    text: 'This is a custom named style from the template "MyFancyStyle"',
+                    style: "MyFancyStyle",
+                }),
+                new Paragraph("Some normal text"),
+                new Paragraph({
+                    text: "MyFancyStyle again",
+                    style: "MyFancyStyle",
+                }),
+            ],
+        },
+    ],
+});
+
+Packer.toBuffer(doc).then((buffer) => {
+    fs.writeFileSync("My Document.docx", buffer);
+});
+```
+
+样式文件示例:
+
+```xml
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:styles xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+  xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
+  xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
+  xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
+  xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" mc:Ignorable="w14 w15">
+  <w:docDefaults>
+    <w:rPrDefault>
+      <w:rPr>
+        <w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorHAnsi" w:hAnsiTheme="minorHAnsi"
+          w:cstheme="minorBidi" />
+        <w:sz w:val="22" />
+        <w:szCs w:val="22" />
+        <w:lang w:val="en-GB" w:eastAsia="en-US" w:bidi="ar-SA" />
+      </w:rPr>
+    </w:rPrDefault>
+    <w:pPrDefault>
+      <w:pPr>
+        <w:spacing w:after="160" w:line="259" w:lineRule="auto" />
+      </w:pPr>
+    </w:pPrDefault>
+  </w:docDefaults>
+  <w:latentStyles w:defLockedState="0" w:defUIPriority="99" w:defSemiHidden="0"
+    w:defUnhideWhenUsed="0" w:defQFormat="0" w:count="371">
+    <w:lsdException w:name="Normal" w:uiPriority="0" w:qFormat="1" />
+    <w:lsdException w:name="heading 1" w:uiPriority="9" w:qFormat="1" />
+    <w:lsdException w:name="heading 2" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="heading 3" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="heading 4" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="heading 5" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="heading 6" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="heading 7" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="heading 8" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="heading 9" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="index 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index 5" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index 6" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index 7" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index 8" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index 9" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 1" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 2" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 3" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 4" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 5" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 6" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 7" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 8" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toc 9" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Normal Indent" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="footnote text" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="annotation text" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="header" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="footer" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="index heading" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="caption" w:semiHidden="1" w:uiPriority="35" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="table of figures" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="envelope address" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="envelope return" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="footnote reference" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="annotation reference" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="line number" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="page number" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="endnote reference" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="endnote text" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="table of authorities" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="macro" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="toa heading" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Bullet" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Number" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List 5" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Bullet 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Bullet 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Bullet 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Bullet 5" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Number 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Number 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Number 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Number 5" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Title" w:uiPriority="10" w:qFormat="1" />
+    <w:lsdException w:name="Closing" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Signature" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Default Paragraph Font" w:semiHidden="1" w:uiPriority="1"
+      w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Body Text" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Body Text Indent" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Continue" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Continue 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Continue 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Continue 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="List Continue 5" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Message Header" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Subtitle" w:uiPriority="11" w:qFormat="1" />
+    <w:lsdException w:name="Salutation" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Date" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Body Text First Indent" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Body Text First Indent 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Note Heading" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Body Text 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Body Text 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Body Text Indent 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Body Text Indent 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Block Text" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Hyperlink" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="FollowedHyperlink" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Strong" w:uiPriority="22" w:qFormat="1" />
+    <w:lsdException w:name="Emphasis" w:uiPriority="20" w:qFormat="1" />
+    <w:lsdException w:name="Document Map" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Plain Text" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="E-mail Signature" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Top of Form" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Bottom of Form" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Normal (Web)" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Acronym" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Address" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Cite" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Code" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Definition" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Keyboard" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Preformatted" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Sample" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Typewriter" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="HTML Variable" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Normal Table" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="annotation subject" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="No List" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Outline List 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Outline List 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Outline List 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Simple 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Simple 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Simple 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Classic 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Classic 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Classic 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Classic 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Colorful 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Colorful 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Colorful 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Columns 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Columns 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Columns 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Columns 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Columns 5" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid 5" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid 6" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid 7" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid 8" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table List 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table List 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table List 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table List 4" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table List 5" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table List 6" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table List 7" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table List 8" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table 3D effects 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table 3D effects 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table 3D effects 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Contemporary" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Elegant" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Professional" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Subtle 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Subtle 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Web 1" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Web 2" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Web 3" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Balloon Text" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Table Grid" w:uiPriority="39" />
+    <w:lsdException w:name="Table Theme" w:semiHidden="1" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="Placeholder Text" w:semiHidden="1" />
+    <w:lsdException w:name="No Spacing" w:uiPriority="1" w:qFormat="1" />
+    <w:lsdException w:name="Light Shading" w:uiPriority="60" />
+    <w:lsdException w:name="Light List" w:uiPriority="61" />
+    <w:lsdException w:name="Light Grid" w:uiPriority="62" />
+    <w:lsdException w:name="Medium Shading 1" w:uiPriority="63" />
+    <w:lsdException w:name="Medium Shading 2" w:uiPriority="64" />
+    <w:lsdException w:name="Medium List 1" w:uiPriority="65" />
+    <w:lsdException w:name="Medium List 2" w:uiPriority="66" />
+    <w:lsdException w:name="Medium Grid 1" w:uiPriority="67" />
+    <w:lsdException w:name="Medium Grid 2" w:uiPriority="68" />
+    <w:lsdException w:name="Medium Grid 3" w:uiPriority="69" />
+    <w:lsdException w:name="Dark List" w:uiPriority="70" />
+    <w:lsdException w:name="Colorful Shading" w:uiPriority="71" />
+    <w:lsdException w:name="Colorful List" w:uiPriority="72" />
+    <w:lsdException w:name="Colorful Grid" w:uiPriority="73" />
+    <w:lsdException w:name="Light Shading Accent 1" w:uiPriority="60" />
+    <w:lsdException w:name="Light List Accent 1" w:uiPriority="61" />
+    <w:lsdException w:name="Light Grid Accent 1" w:uiPriority="62" />
+    <w:lsdException w:name="Medium Shading 1 Accent 1" w:uiPriority="63" />
+    <w:lsdException w:name="Medium Shading 2 Accent 1" w:uiPriority="64" />
+    <w:lsdException w:name="Medium List 1 Accent 1" w:uiPriority="65" />
+    <w:lsdException w:name="Revision" w:semiHidden="1" />
+    <w:lsdException w:name="List Paragraph" w:uiPriority="34" w:qFormat="1" />
+    <w:lsdException w:name="Quote" w:uiPriority="29" w:qFormat="1" />
+    <w:lsdException w:name="Intense Quote" w:uiPriority="30" w:qFormat="1" />
+    <w:lsdException w:name="Medium List 2 Accent 1" w:uiPriority="66" />
+    <w:lsdException w:name="Medium Grid 1 Accent 1" w:uiPriority="67" />
+    <w:lsdException w:name="Medium Grid 2 Accent 1" w:uiPriority="68" />
+    <w:lsdException w:name="Medium Grid 3 Accent 1" w:uiPriority="69" />
+    <w:lsdException w:name="Dark List Accent 1" w:uiPriority="70" />
+    <w:lsdException w:name="Colorful Shading Accent 1" w:uiPriority="71" />
+    <w:lsdException w:name="Colorful List Accent 1" w:uiPriority="72" />
+    <w:lsdException w:name="Colorful Grid Accent 1" w:uiPriority="73" />
+    <w:lsdException w:name="Light Shading Accent 2" w:uiPriority="60" />
+    <w:lsdException w:name="Light List Accent 2" w:uiPriority="61" />
+    <w:lsdException w:name="Light Grid Accent 2" w:uiPriority="62" />
+    <w:lsdException w:name="Medium Shading 1 Accent 2" w:uiPriority="63" />
+    <w:lsdException w:name="Medium Shading 2 Accent 2" w:uiPriority="64" />
+    <w:lsdException w:name="Medium List 1 Accent 2" w:uiPriority="65" />
+    <w:lsdException w:name="Medium List 2 Accent 2" w:uiPriority="66" />
+    <w:lsdException w:name="Medium Grid 1 Accent 2" w:uiPriority="67" />
+    <w:lsdException w:name="Medium Grid 2 Accent 2" w:uiPriority="68" />
+    <w:lsdException w:name="Medium Grid 3 Accent 2" w:uiPriority="69" />
+    <w:lsdException w:name="Dark List Accent 2" w:uiPriority="70" />
+    <w:lsdException w:name="Colorful Shading Accent 2" w:uiPriority="71" />
+    <w:lsdException w:name="Colorful List Accent 2" w:uiPriority="72" />
+    <w:lsdException w:name="Colorful Grid Accent 2" w:uiPriority="73" />
+    <w:lsdException w:name="Light Shading Accent 3" w:uiPriority="60" />
+    <w:lsdException w:name="Light List Accent 3" w:uiPriority="61" />
+    <w:lsdException w:name="Light Grid Accent 3" w:uiPriority="62" />
+    <w:lsdException w:name="Medium Shading 1 Accent 3" w:uiPriority="63" />
+    <w:lsdException w:name="Medium Shading 2 Accent 3" w:uiPriority="64" />
+    <w:lsdException w:name="Medium List 1 Accent 3" w:uiPriority="65" />
+    <w:lsdException w:name="Medium List 2 Accent 3" w:uiPriority="66" />
+    <w:lsdException w:name="Medium Grid 1 Accent 3" w:uiPriority="67" />
+    <w:lsdException w:name="Medium Grid 2 Accent 3" w:uiPriority="68" />
+    <w:lsdException w:name="Medium Grid 3 Accent 3" w:uiPriority="69" />
+    <w:lsdException w:name="Dark List Accent 3" w:uiPriority="70" />
+    <w:lsdException w:name="Colorful Shading Accent 3" w:uiPriority="71" />
+    <w:lsdException w:name="Colorful List Accent 3" w:uiPriority="72" />
+    <w:lsdException w:name="Colorful Grid Accent 3" w:uiPriority="73" />
+    <w:lsdException w:name="Light Shading Accent 4" w:uiPriority="60" />
+    <w:lsdException w:name="Light List Accent 4" w:uiPriority="61" />
+    <w:lsdException w:name="Light Grid Accent 4" w:uiPriority="62" />
+    <w:lsdException w:name="Medium Shading 1 Accent 4" w:uiPriority="63" />
+    <w:lsdException w:name="Medium Shading 2 Accent 4" w:uiPriority="64" />
+    <w:lsdException w:name="Medium List 1 Accent 4" w:uiPriority="65" />
+    <w:lsdException w:name="Medium List 2 Accent 4" w:uiPriority="66" />
+    <w:lsdException w:name="Medium Grid 1 Accent 4" w:uiPriority="67" />
+    <w:lsdException w:name="Medium Grid 2 Accent 4" w:uiPriority="68" />
+    <w:lsdException w:name="Medium Grid 3 Accent 4" w:uiPriority="69" />
+    <w:lsdException w:name="Dark List Accent 4" w:uiPriority="70" />
+    <w:lsdException w:name="Colorful Shading Accent 4" w:uiPriority="71" />
+    <w:lsdException w:name="Colorful List Accent 4" w:uiPriority="72" />
+    <w:lsdException w:name="Colorful Grid Accent 4" w:uiPriority="73" />
+    <w:lsdException w:name="Light Shading Accent 5" w:uiPriority="60" />
+    <w:lsdException w:name="Light List Accent 5" w:uiPriority="61" />
+    <w:lsdException w:name="Light Grid Accent 5" w:uiPriority="62" />
+    <w:lsdException w:name="Medium Shading 1 Accent 5" w:uiPriority="63" />
+    <w:lsdException w:name="Medium Shading 2 Accent 5" w:uiPriority="64" />
+    <w:lsdException w:name="Medium List 1 Accent 5" w:uiPriority="65" />
+    <w:lsdException w:name="Medium List 2 Accent 5" w:uiPriority="66" />
+    <w:lsdException w:name="Medium Grid 1 Accent 5" w:uiPriority="67" />
+    <w:lsdException w:name="Medium Grid 2 Accent 5" w:uiPriority="68" />
+    <w:lsdException w:name="Medium Grid 3 Accent 5" w:uiPriority="69" />
+    <w:lsdException w:name="Dark List Accent 5" w:uiPriority="70" />
+    <w:lsdException w:name="Colorful Shading Accent 5" w:uiPriority="71" />
+    <w:lsdException w:name="Colorful List Accent 5" w:uiPriority="72" />
+    <w:lsdException w:name="Colorful Grid Accent 5" w:uiPriority="73" />
+    <w:lsdException w:name="Light Shading Accent 6" w:uiPriority="60" />
+    <w:lsdException w:name="Light List Accent 6" w:uiPriority="61" />
+    <w:lsdException w:name="Light Grid Accent 6" w:uiPriority="62" />
+    <w:lsdException w:name="Medium Shading 1 Accent 6" w:uiPriority="63" />
+    <w:lsdException w:name="Medium Shading 2 Accent 6" w:uiPriority="64" />
+    <w:lsdException w:name="Medium List 1 Accent 6" w:uiPriority="65" />
+    <w:lsdException w:name="Medium List 2 Accent 6" w:uiPriority="66" />
+    <w:lsdException w:name="Medium Grid 1 Accent 6" w:uiPriority="67" />
+    <w:lsdException w:name="Medium Grid 2 Accent 6" w:uiPriority="68" />
+    <w:lsdException w:name="Medium Grid 3 Accent 6" w:uiPriority="69" />
+    <w:lsdException w:name="Dark List Accent 6" w:uiPriority="70" />
+    <w:lsdException w:name="Colorful Shading Accent 6" w:uiPriority="71" />
+    <w:lsdException w:name="Colorful List Accent 6" w:uiPriority="72" />
+    <w:lsdException w:name="Colorful Grid Accent 6" w:uiPriority="73" />
+    <w:lsdException w:name="Subtle Emphasis" w:uiPriority="19" w:qFormat="1" />
+    <w:lsdException w:name="Intense Emphasis" w:uiPriority="21" w:qFormat="1" />
+    <w:lsdException w:name="Subtle Reference" w:uiPriority="31" w:qFormat="1" />
+    <w:lsdException w:name="Intense Reference" w:uiPriority="32" w:qFormat="1" />
+    <w:lsdException w:name="Book Title" w:uiPriority="33" w:qFormat="1" />
+    <w:lsdException w:name="Bibliography" w:semiHidden="1" w:uiPriority="37" w:unhideWhenUsed="1" />
+    <w:lsdException w:name="TOC Heading" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"
+      w:qFormat="1" />
+    <w:lsdException w:name="Plain Table 1" w:uiPriority="41" />
+    <w:lsdException w:name="Plain Table 2" w:uiPriority="42" />
+    <w:lsdException w:name="Plain Table 3" w:uiPriority="43" />
+    <w:lsdException w:name="Plain Table 4" w:uiPriority="44" />
+    <w:lsdException w:name="Plain Table 5" w:uiPriority="45" />
+    <w:lsdException w:name="Grid Table Light" w:uiPriority="40" />
+    <w:lsdException w:name="Grid Table 1 Light" w:uiPriority="46" />
+    <w:lsdException w:name="Grid Table 2" w:uiPriority="47" />
+    <w:lsdException w:name="Grid Table 3" w:uiPriority="48" />
+    <w:lsdException w:name="Grid Table 4" w:uiPriority="49" />
+    <w:lsdException w:name="Grid Table 5 Dark" w:uiPriority="50" />
+    <w:lsdException w:name="Grid Table 6 Colorful" w:uiPriority="51" />
+    <w:lsdException w:name="Grid Table 7 Colorful" w:uiPriority="52" />
+    <w:lsdException w:name="Grid Table 1 Light Accent 1" w:uiPriority="46" />
+    <w:lsdException w:name="Grid Table 2 Accent 1" w:uiPriority="47" />
+    <w:lsdException w:name="Grid Table 3 Accent 1" w:uiPriority="48" />
+    <w:lsdException w:name="Grid Table 4 Accent 1" w:uiPriority="49" />
+    <w:lsdException w:name="Grid Table 5 Dark Accent 1" w:uiPriority="50" />
+    <w:lsdException w:name="Grid Table 6 Colorful Accent 1" w:uiPriority="51" />
+    <w:lsdException w:name="Grid Table 7 Colorful Accent 1" w:uiPriority="52" />
+    <w:lsdException w:name="Grid Table 1 Light Accent 2" w:uiPriority="46" />
+    <w:lsdException w:name="Grid Table 2 Accent 2" w:uiPriority="47" />
+    <w:lsdException w:name="Grid Table 3 Accent 2" w:uiPriority="48" />
+    <w:lsdException w:name="Grid Table 4 Accent 2" w:uiPriority="49" />
+    <w:lsdException w:name="Grid Table 5 Dark Accent 2" w:uiPriority="50" />
+    <w:lsdException w:name="Grid Table 6 Colorful Accent 2" w:uiPriority="51" />
+    <w:lsdException w:name="Grid Table 7 Colorful Accent 2" w:uiPriority="52" />
+    <w:lsdException w:name="Grid Table 1 Light Accent 3" w:uiPriority="46" />
+    <w:lsdException w:name="Grid Table 2 Accent 3" w:uiPriority="47" />
+    <w:lsdException w:name="Grid Table 3 Accent 3" w:uiPriority="48" />
+    <w:lsdException w:name="Grid Table 4 Accent 3" w:uiPriority="49" />
+    <w:lsdException w:name="Grid Table 5 Dark Accent 3" w:uiPriority="50" />
+    <w:lsdException w:name="Grid Table 6 Colorful Accent 3" w:uiPriority="51" />
+    <w:lsdException w:name="Grid Table 7 Colorful Accent 3" w:uiPriority="52" />
+    <w:lsdException w:name="Grid Table 1 Light Accent 4" w:uiPriority="46" />
+    <w:lsdException w:name="Grid Table 2 Accent 4" w:uiPriority="47" />
+    <w:lsdException w:name="Grid Table 3 Accent 4" w:uiPriority="48" />
+    <w:lsdException w:name="Grid Table 4 Accent 4" w:uiPriority="49" />
+    <w:lsdException w:name="Grid Table 5 Dark Accent 4" w:uiPriority="50" />
+    <w:lsdException w:name="Grid Table 6 Colorful Accent 4" w:uiPriority="51" />
+    <w:lsdException w:name="Grid Table 7 Colorful Accent 4" w:uiPriority="52" />
+    <w:lsdException w:name="Grid Table 1 Light Accent 5" w:uiPriority="46" />
+    <w:lsdException w:name="Grid Table 2 Accent 5" w:uiPriority="47" />
+    <w:lsdException w:name="Grid Table 3 Accent 5" w:uiPriority="48" />
+    <w:lsdException w:name="Grid Table 4 Accent 5" w:uiPriority="49" />
+    <w:lsdException w:name="Grid Table 5 Dark Accent 5" w:uiPriority="50" />
+    <w:lsdException w:name="Grid Table 6 Colorful Accent 5" w:uiPriority="51" />
+    <w:lsdException w:name="Grid Table 7 Colorful Accent 5" w:uiPriority="52" />
+    <w:lsdException w:name="Grid Table 1 Light Accent 6" w:uiPriority="46" />
+    <w:lsdException w:name="Grid Table 2 Accent 6" w:uiPriority="47" />
+    <w:lsdException w:name="Grid Table 3 Accent 6" w:uiPriority="48" />
+    <w:lsdException w:name="Grid Table 4 Accent 6" w:uiPriority="49" />
+    <w:lsdException w:name="Grid Table 5 Dark Accent 6" w:uiPriority="50" />
+    <w:lsdException w:name="Grid Table 6 Colorful Accent 6" w:uiPriority="51" />
+    <w:lsdException w:name="Grid Table 7 Colorful Accent 6" w:uiPriority="52" />
+    <w:lsdException w:name="List Table 1 Light" w:uiPriority="46" />
+    <w:lsdException w:name="List Table 2" w:uiPriority="47" />
+    <w:lsdException w:name="List Table 3" w:uiPriority="48" />
+    <w:lsdException w:name="List Table 4" w:uiPriority="49" />
+    <w:lsdException w:name="List Table 5 Dark" w:uiPriority="50" />
+    <w:lsdException w:name="List Table 6 Colorful" w:uiPriority="51" />
+    <w:lsdException w:name="List Table 7 Colorful" w:uiPriority="52" />
+    <w:lsdException w:name="List Table 1 Light Accent 1" w:uiPriority="46" />
+    <w:lsdException w:name="List Table 2 Accent 1" w:uiPriority="47" />
+    <w:lsdException w:name="List Table 3 Accent 1" w:uiPriority="48" />
+    <w:lsdException w:name="List Table 4 Accent 1" w:uiPriority="49" />
+    <w:lsdException w:name="List Table 5 Dark Accent 1" w:uiPriority="50" />
+    <w:lsdException w:name="List Table 6 Colorful Accent 1" w:uiPriority="51" />
+    <w:lsdException w:name="List Table 7 Colorful Accent 1" w:uiPriority="52" />
+    <w:lsdException w:name="List Table 1 Light Accent 2" w:uiPriority="46" />
+    <w:lsdException w:name="List Table 2 Accent 2" w:uiPriority="47" />
+    <w:lsdException w:name="List Table 3 Accent 2" w:uiPriority="48" />
+    <w:lsdException w:name="List Table 4 Accent 2" w:uiPriority="49" />
+    <w:lsdException w:name="List Table 5 Dark Accent 2" w:uiPriority="50" />
+    <w:lsdException w:name="List Table 6 Colorful Accent 2" w:uiPriority="51" />
+    <w:lsdException w:name="List Table 7 Colorful Accent 2" w:uiPriority="52" />
+    <w:lsdException w:name="List Table 1 Light Accent 3" w:uiPriority="46" />
+    <w:lsdException w:name="List Table 2 Accent 3" w:uiPriority="47" />
+    <w:lsdException w:name="List Table 3 Accent 3" w:uiPriority="48" />
+    <w:lsdException w:name="List Table 4 Accent 3" w:uiPriority="49" />
+    <w:lsdException w:name="List Table 5 Dark Accent 3" w:uiPriority="50" />
+    <w:lsdException w:name="List Table 6 Colorful Accent 3" w:uiPriority="51" />
+    <w:lsdException w:name="List Table 7 Colorful Accent 3" w:uiPriority="52" />
+    <w:lsdException w:name="List Table 1 Light Accent 4" w:uiPriority="46" />
+    <w:lsdException w:name="List Table 2 Accent 4" w:uiPriority="47" />
+    <w:lsdException w:name="List Table 3 Accent 4" w:uiPriority="48" />
+    <w:lsdException w:name="List Table 4 Accent 4" w:uiPriority="49" />
+    <w:lsdException w:name="List Table 5 Dark Accent 4" w:uiPriority="50" />
+    <w:lsdException w:name="List Table 6 Colorful Accent 4" w:uiPriority="51" />
+    <w:lsdException w:name="List Table 7 Colorful Accent 4" w:uiPriority="52" />
+    <w:lsdException w:name="List Table 1 Light Accent 5" w:uiPriority="46" />
+    <w:lsdException w:name="List Table 2 Accent 5" w:uiPriority="47" />
+    <w:lsdException w:name="List Table 3 Accent 5" w:uiPriority="48" />
+    <w:lsdException w:name="List Table 4 Accent 5" w:uiPriority="49" />
+    <w:lsdException w:name="List Table 5 Dark Accent 5" w:uiPriority="50" />
+    <w:lsdException w:name="List Table 6 Colorful Accent 5" w:uiPriority="51" />
+    <w:lsdException w:name="List Table 7 Colorful Accent 5" w:uiPriority="52" />
+    <w:lsdException w:name="List Table 1 Light Accent 6" w:uiPriority="46" />
+    <w:lsdException w:name="List Table 2 Accent 6" w:uiPriority="47" />
+    <w:lsdException w:name="List Table 3 Accent 6" w:uiPriority="48" />
+    <w:lsdException w:name="List Table 4 Accent 6" w:uiPriority="49" />
+    <w:lsdException w:name="List Table 5 Dark Accent 6" w:uiPriority="50" />
+    <w:lsdException w:name="List Table 6 Colorful Accent 6" w:uiPriority="51" />
+    <w:lsdException w:name="List Table 7 Colorful Accent 6" w:uiPriority="52" />
+  </w:latentStyles>
+  <w:style w:type="paragraph" w:default="1" w:styleId="Normal">
+    <w:name w:val="Normal" />
+    <w:qFormat />
+    <w:rsid w:val="000D2D99" />
+    <w:rPr>
+      <w:rFonts w:ascii="MV Boli" w:hAnsi="MV Boli" />
+      <w:color w:val="C45911" w:themeColor="accent2" w:themeShade="BF" />
+    </w:rPr>
+  </w:style>
+  <w:style w:type="paragraph" w:styleId="Heading1">
+    <w:name w:val="heading 1" />
+    <w:basedOn w:val="Normal" />
+    <w:next w:val="Normal" />
+    <w:link w:val="Heading1Char" />
+    <w:uiPriority w:val="9" />
+    <w:qFormat />
+    <w:rsid w:val="000D2D99" />
+    <w:pPr>
+      <w:keepNext />
+      <w:keepLines />
+      <w:spacing w:before="240" w:after="0" />
+      <w:outlineLvl w:val="0" />
+    </w:pPr>
+    <w:rPr>
+      <w:rFonts w:ascii="Impact" w:eastAsiaTheme="majorEastAsia" w:hAnsi="Impact"
+        w:cstheme="majorBidi" />
+      <w:color w:val="538135" w:themeColor="accent6" w:themeShade="BF" />
+      <w:sz w:val="32" />
+      <w:szCs w:val="32" />
+    </w:rPr>
+  </w:style>
+  <w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont">
+    <w:name w:val="Default Paragraph Font" />
+    <w:uiPriority w:val="1" />
+    <w:semiHidden />
+    <w:unhideWhenUsed />
+  </w:style>
+  <w:style w:type="table" w:default="1" w:styleId="TableNormal">
+    <w:name w:val="Normal Table" />
+    <w:uiPriority w:val="99" />
+    <w:semiHidden />
+    <w:unhideWhenUsed />
+    <w:tblPr>
+      <w:tblInd w:w="0" w:type="dxa" />
+      <w:tblCellMar>
+        <w:top w:w="0" w:type="dxa" />
+        <w:left w:w="108" w:type="dxa" />
+        <w:bottom w:w="0" w:type="dxa" />
+        <w:right w:w="108" w:type="dxa" />
+      </w:tblCellMar>
+    </w:tblPr>
+  </w:style>
+  <w:style w:type="table" w:customStyle="1" w:styleId="MyCustomTableStyle">
+    <w:name w:val="My Custom TableStyle" />
+    <w:uiPriority w:val="99" />
+    <w:rsid w:val="00C36BA2" />
+    <w:pPr>
+      <w:spacing w:after="0" w:line="240" w:lineRule="auto" />
+    </w:pPr>
+    <w:rPr>
+      <w:rFonts w:ascii="Comic Sans MS" w:hAnsi="Comic Sans MS" />
+      <w:szCs w:val="20" />
+      <w:lang w:val="en-US" />
+    </w:rPr>
+    <w:tblPr>
+      <w:tblBorders>
+        <w:top w:val="dashSmallGap" w:sz="6" w:space="0" w:color="FF0000" />
+        <w:left w:val="dashSmallGap" w:sz="6" w:space="0" w:color="FF0000" />
+        <w:bottom w:val="dashSmallGap" w:sz="6" w:space="0" w:color="FF0000" />
+        <w:right w:val="dashSmallGap" w:sz="6" w:space="0" w:color="FF0000" />
+        <w:insideH w:val="dashSmallGap" w:sz="6" w:space="0" w:color="FF0000" />
+        <w:insideV w:val="dashSmallGap" w:sz="6" w:space="0" w:color="FF0000" />
+      </w:tblBorders>
+    </w:tblPr>
+    <w:tcPr>
+      <w:shd w:val="clear" w:color="auto" w:fill="auto" />
+    </w:tcPr>
+    <w:tblStylePr w:type="firstRow">
+      <w:rPr>
+        <w:b />
+        <w:bCs />
+        <w:color w:val="FFFFFF" w:themeColor="background1" />
+      </w:rPr>
+      <w:tblPr />
+      <w:tcPr>
+        <w:tcBorders>
+          <w:tl2br w:val="none" w:sz="0" w:space="0" w:color="auto" />
+          <w:tr2bl w:val="none" w:sz="0" w:space="0" w:color="auto" />
+        </w:tcBorders>
+        <w:shd w:val="clear" w:color="auto" w:fill="4472C4" w:themeFill="accent1" />
+      </w:tcPr>
+    </w:tblStylePr>
+  </w:style>
+  <w:style w:type="numbering" w:default="1" w:styleId="NoList">
+    <w:name w:val="No List" />
+    <w:uiPriority w:val="99" />
+    <w:semiHidden />
+    <w:unhideWhenUsed />
+  </w:style>
+  <w:style w:type="paragraph" w:customStyle="1" w:styleId="CustomStyle">
+    <w:name w:val="Custom Style" />
+    <w:basedOn w:val="Normal" />
+    <w:link w:val="CustomStyleChar" />
+    <w:rsid w:val="00B557A5" />
+    <w:rPr>
+      <w:sz w:val="72" />
+    </w:rPr>
+  </w:style>
+  <w:style w:type="character" w:customStyle="1" w:styleId="CustomStyleChar">
+    <w:name w:val="Custom Style Char" />
+    <w:basedOn w:val="DefaultParagraphFont" />
+    <w:link w:val="CustomStyle" />
+    <w:rsid w:val="00B557A5" />
+    <w:rPr>
+      <w:rFonts w:ascii="MV Boli" w:hAnsi="MV Boli" />
+      <w:color w:val="C45911" w:themeColor="accent2" w:themeShade="BF" />
+      <w:sz w:val="72" />
+    </w:rPr>
+  </w:style>
+  <w:style w:type="character" w:customStyle="1" w:styleId="Heading1Char">
+    <w:name w:val="Heading 1 Char" />
+    <w:basedOn w:val="DefaultParagraphFont" />
+    <w:link w:val="Heading1" />
+    <w:uiPriority w:val="9" />
+    <w:rsid w:val="000D2D99" />
+    <w:rPr>
+      <w:rFonts w:ascii="Impact" w:eastAsiaTheme="majorEastAsia" w:hAnsi="Impact"
+        w:cstheme="majorBidi" />
+      <w:color w:val="538135" w:themeColor="accent6" w:themeShade="BF" />
+      <w:sz w:val="32" />
+      <w:szCs w:val="32" />
+    </w:rPr>
+  </w:style>
+  <w:style w:type="paragraph" w:customStyle="1" w:styleId="MyFancyStyle">
+    <w:name w:val="MyFancyStyle" />
+    <w:basedOn w:val="Normal" />
+    <w:link w:val="MyFancyStyleChar" />
+    <w:qFormat />
+    <w:rsid w:val="008802A5" />
+    <w:rPr>
+      <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
+      <w:color w:val="FF0000" />
+      <w:sz w:val="144" />
+    </w:rPr>
+  </w:style>
+  <w:style w:type="character" w:customStyle="1" w:styleId="MyFancyStyleChar">
+    <w:name w:val="MyFancyStyle Char" />
+    <w:basedOn w:val="DefaultParagraphFont" />
+    <w:link w:val="MyFancyStyle" />
+    <w:rsid w:val="008802A5" />
+    <w:rPr>
+      <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
+      <w:color w:val="FF0000" />
+      <w:sz w:val="144" />
+    </w:rPr>
+  </w:style>
+</w:styles>
+```
+
+#### features
+
+本字段可以实现配置**变更跟踪**和**目录更新**
+
+**变更跟踪**
+
+启用 trackRevisions 功能后,可实现自动跟踪文档新的修订。
+
+```ts
+import { Document } from "docx";
+
+const doc = new Document({
+    features: {
+        trackRevisions: true,
+    },
+});
+```
+
+**目录更新**
+
+必须启用 updateFields 功能才能正确更新 TableOfContents。
+
+```ts
+const doc = new Document({
+    features: {
+        updateFields: true,
+    },
+    sections: [
+        {
+            children: [
+                new TableOfContents("Summary", {
+                    hyperlink: true,
+                    headingStyleRange: "1-5",
+                }),
+                new Paragraph({
+                    text: "Header #1",
+                    heading: HeadingLevel.HEADING_1,
+                    pageBreakBefore: true,
+                }),
+            ]
+        }
+    ]
+});
+```
+
+#### compatabilityModeVersion
+
+兼容模式是指当你用较新版本的 Word 打开一个旧版本(如 Word 97-2003 .doc)的文档,或者从老版本升级而未转换为最新格式时,Word 会进入 兼容模式(Compatibility Mode)。此模式会:
+- 禁用一些新特性(如新样式、新对象)
+- 模拟旧版本的渲染方式
+- 避免向后不兼容
+
+| Version | 对应 Word 版本         | 说明            |
+| --------- | ------------------ | ------------- |
+| 11        | Word 2003          | `.doc` 格式兼容模式 |
+| 12        | Word 2007          | 早期 `.docx` 格式 |
+| 14        | Word 2010          | 支持部分新样式       |
+| 15        | Word 2013          | 默认兼容版本之一      |
+| 16        | Word 2016/2019/365 | 最新兼容模式        |
+
+#### compatibility
+
+兼容性设置是可选设置,用于保留早期文字处理应用程序中创建的文档的视觉保真度。其中一些设置提供了特定行为的功能(详见下文);而其他设置则只是指示应用程序模仿现有文字处理应用程序的行为。
+
+```ts
+const doc = new docx.Document({
+    compatibility: {
+        version: 15,
+        doNotExpandShiftReturn: true,
+    },
+});
+```
+
+兼容性选项表:
+
+| 属性 | 类型 | 值 | 说明 |
+| ---- | :----: | ---- | ---- |
+| version | number | 15, 16, 17 | 最小兼容版本 |
+| useSingleBorderforContiguousCells | boolean | true, false, undefined | 相邻单元格仅绘制一条边框,模仿旧 Word 表格合并边框行为 |
+| wordPerfectJustification | boolean | true, false, undefined | |
+| noTabStopForHangingIndent | boolean | true, false, undefined | |
+| noLeading | boolean | true, false, undefined | |
+| spaceForUnderline | boolean | true, false, undefined | |
+| noColumnBalance | boolean | true, false, undefined | |
+| balanceSingleByteDoubleByteWidth | boolean | true, false, undefined | |
+| noExtraLineSpacing | boolean | true, false, undefined | |
+| doNotLeaveBackslashAlone | boolean | true, false, undefined | 不要单独使用反斜杠 |
+| underlineTrailingSpaces | boolean | true, false, undefined | 给尾随空格加下划线 |
+| doNotExpandShiftReturn | boolean | true, false, undefined | 尾随空格换行 |
+| spacingInWholePoints | boolean | true, false, undefined | |
+| lineWrapLikeWord6 | boolean | true, false, undefined | 模仿 Word 6 的自动换行规则 |
+| printBodyTextBeforeHeader | boolean | true, false, undefined | |
+| printColorsBlack | boolean | true, false, undefined | |
+| spaceWidth | boolean | true, false, undefined | |
+| showBreaksInFrames | boolean | true, false, undefined | |
+| subFontBySize | boolean | true, false, undefined | |
+| suppressBottomSpacing | boolean | true, false, undefined | |
+| suppressTopSpacing | boolean | true, false, undefined | |
+| suppressSpacingAtTopOfPage | boolean | true, false, undefined | |
+| suppressTopSpacingWP | boolean | true, false, undefined | |
+| suppressSpBfAfterPgBrk | boolean | true, false, undefined | |
+| swapBordersFacingPages | boolean | true, false, undefined | |
+| convertMailMergeEsc | boolean | true, false, undefined | |
+| truncateFontHeightsLikeWP6 | boolean | true, false, undefined | |
+| macWordSmallCaps | boolean | true, false, undefined | |
+| usePrinterMetrics | boolean | true, false, undefined | |
+| doNotSuppressParagraphBorders | boolean | true, false, undefined | |
+| wrapTrailSpaces | boolean | true, false, undefined | |
+| footnoteLayoutLikeWW8 | boolean | true, false, undefined | |
+| shapeLayoutLikeWW8 | boolean | true, false, undefined | |
+| alignTablesRowByRow | boolean | true, false, undefined | 表格逐行排列,不一次性渲染整表,以保持旧版 Word 排版一致 |
+| forgetLastTabAlignment | boolean | true, false, undefined | |
+| adjustLineHeightInTable | boolean | true, false, undefined | |
+| autoSpaceLikeWord95 | boolean | true, false, undefined | |
+| noSpaceRaiseLower | boolean | true, false, undefined | |
+| doNotUseHTMLParagraphAutoSpacing | boolean | true, false, undefined | |
+| layoutRawTableWidth | boolean | true, false, undefined | 控制旧版 Word 处理表格宽度的方式 |
+| layoutTableRowsApart | boolean | true, false, undefined | 控制旧版 Word 处理表格行间距的方式 |
+| useWord97LineBreakRules | boolean | true, false, undefined | 模仿Word 97 的自动换行规则 |
+| doNotBreakWrappedTables | boolean | true, false, undefined | 防止表格在文本换行点拆分 |
+| doNotSnapToGridInCell | boolean | true, false, undefined | |
+| selectFieldWithFirstOrLastCharacter | boolean | true, false, undefined | |
+| applyBreakingRules | boolean | true, false, undefined | |
+| doNotWrapTextWithPunctuation | boolean | true, false, undefined | |
+| doNotUseEastAsianBreakRules | boolean | true, false, undefined | |
+| useWord2002TableStyleRules | boolean | true, false, undefined | |
+| growAutofit | boolean | true, false, undefined | |
+| useFELayout | boolean | true, false, undefined | |
+| useNormalStyleForList | boolean | true, false, undefined | |
+| doNotUseIndentAsNumberingTabStop | boolean | true, false, undefined | |
+| useAlternateEastAsianLineBreakRules | boolean | true, false, undefined | |
+| allowSpaceOfSameStyleInTable | boolean | true, false, undefined | |
+| doNotSuppressIndentation | boolean | true, false, undefined | |
+| doNotAutofitConstrainedTables | boolean | true, false, undefined | 关闭受限表格的自动调整 |
+| autofitToFirstFixedWidthCell | boolean | true, false, undefined | 仅根据首列的固定宽度进行自适应 |
+| underlineTabInNumberingList | boolean | true, false, undefined | |
+| displayHangulFixedWidth | boolean | true, false, undefined | |
+| splitPgBreakAndParaMark | boolean | true, false, undefined | |
+| doNotVerticallyAlignCellWithSp | boolean | true, false, undefined | |
+| doNotBreakConstrainedForcedTable | boolean | true, false, undefined | |
+| ignoreVerticalAlignmentInTextboxes | boolean | true, false, undefined | |
+| useAnsiKerningPairs | boolean | true, false, undefined | |
+| cachedColumnBalance | boolean | true, false, undefined | |
+
+### Paragraph
+
+<pre>
+Paragraph
+├── TextRun
+├── ImageRun
+├── SymbolRun
+├── Bookmark
+├── PageBreak
+├── ColumnBreak
+├── SequentialIdentifier
+├── FootnoteReferenceRun
+├── InternalHyperlink
+├── ExternalHyperlink
+├── InsertedTextRun/DeletedTextRun
+├── Math
+├── SimpleField/SimpleMailMergeField
+├── CommentRangeStart/CommentRangeEnd
+├── CommentReference/Comments/Comment
+└── CheckBox
+</pre>
+
+### Table
+
+### TableOfContents
+
+### Textbox

+ 221 - 0
client/docs/.vitepress/plugins/DomToDocx/docxImage.ts

@@ -0,0 +1,221 @@
+import {
+  Paragraph,
+  ImageRun
+} from "docx"
+
+function getImageTypeFromURL(url: string): "jpg" | "png" | "gif" | "bmp" | "svg" | "webp" | "unknown" {
+  // 1. 尝试解析 data URL
+  if (url.startsWith("data:")) {
+    const mimeMatch = url.match(/^data:image\/(.*?);/)
+    if (mimeMatch) {
+      return normalizeImageType(mimeMatch[1])
+    }
+  }
+
+  // 2. 尝试解析扩展名
+  const extMatch = url.split("?")[0].match(/\.([a-zA-Z0-9]+)$/)
+  if (extMatch) {
+    return normalizeImageType(extMatch[1])
+  }
+
+  return "unknown"
+}
+
+function normalizeImageType(type: string): any {
+  const lower = type.toLowerCase()
+  switch (lower) {
+    case "jpeg":
+    case "jpg":
+      return "jpg"
+    case "png":
+      return "png"
+    case "gif":
+      return "gif"
+    case "bmp":
+      return "bmp"
+    case "svg":
+    case "svg+xml":
+      return "svg"
+    case "webp":
+      return "webp"
+    default:
+      return "unknown"
+  }
+}
+
+// Canvas格式转换成PNG
+async function convertCanvasToPngArrayBuffer(canvas: HTMLCanvasElement): Promise<ArrayBuffer> {
+  return new Promise((resolve, reject) => {
+    canvas.toBlob((blob) => {
+      if (!blob) {
+        reject(new Error("Canvas toBlob failed"))
+        return
+      }
+
+      blob.arrayBuffer().then(resolve).catch(reject)
+    }, "image/png")
+  })
+}
+
+// WebP格式转换成PNG
+async function convertWebPToPngArrayBuffer(url: string): Promise<ArrayBuffer> {
+  const img = new Image()
+  img.src = url
+  await img.decode()
+
+  const canvas = document.createElement("canvas")
+  canvas.width = img.width
+  canvas.height = img.height
+  const ctx = canvas.getContext("2d")!
+  ctx.drawImage(img, 0, 0)
+
+  return await convertCanvasToPngArrayBuffer(canvas)
+}
+
+async function svgToPngArrayBuffer(svgText: string): Promise<ArrayBuffer> {
+  // 创建 DOMParser 解析 SVG
+  const parser = new DOMParser()
+  const doc = parser.parseFromString(svgText, "image/svg+xml")
+  const svgEl = doc.querySelector("svg")
+
+  if (!svgEl) throw new Error("无效的 SVG 文本")
+
+  // 获取尺寸(尝试读取 width/height 或 viewBox)
+  let width = parseInt(svgEl.getAttribute("width") || "")
+  let height = parseInt(svgEl.getAttribute("height") || "")
+
+  if (!(width && height)) {
+    const viewBox = svgEl.getAttribute("viewBox") // 格式:"0 0 300 200"
+    if (viewBox) {
+      const parts = viewBox.split(" ")
+      width = parseInt(parts[2])
+      height = parseInt(parts[3])
+    } else {
+      width = 300
+      height = 150
+    }
+  }
+
+  return new Promise((resolve, reject) => {
+    const svgBlob = new Blob([svgText], { type: "image/svg+xml" })
+    const url = URL.createObjectURL(svgBlob)
+
+    const img = new Image()
+    img.onload = () => {
+      URL.revokeObjectURL(url)
+
+      const canvas = document.createElement("canvas")
+      canvas.width = width
+      canvas.height = height
+      const ctx = canvas.getContext("2d")!
+      ctx.drawImage(img, 0, 0, width, height)
+
+      canvas.toBlob((blob) => {
+        if (blob) {
+          blob.arrayBuffer().then(resolve)
+        } else {
+          reject(new Error("canvas.toBlob failed"))
+        }
+      }, "image/png")
+    }
+
+    img.onerror = reject
+    img.src = url
+  })
+}
+
+async function convertDomImgToDocxImg(imgEl: HTMLImageElement): Promise<ImageRun | undefined> {
+  // 判断图片类型
+  const imgType = getImageTypeFromURL(imgEl.src)
+  if (imgType === 'unknown') {
+    console.error("未知图片类型:", imgEl.src)
+    return
+  }
+
+  if (imgType === 'webp') {
+    const arrayBuffer = await convertWebPToPngArrayBuffer(imgEl.src)
+
+    return new ImageRun({
+      type: 'png',
+      data: arrayBuffer,
+      transformation: {
+        width: imgEl.naturalWidth / 2,
+        height: imgEl.naturalHeight / 2,
+      },
+    })
+  } else if (imgType === 'svg') {
+    const imageBlob = await fetch(imgEl.src).then(res => res.blob())
+    const arrayBuffer = await imageBlob.arrayBuffer()
+    const decoder = new TextDecoder('utf-8');
+    const fallbackBuffer = await svgToPngArrayBuffer(decoder.decode(new Uint8Array(arrayBuffer)))
+
+    return new ImageRun({
+      type: 'svg',
+      data: arrayBuffer,
+      fallback: {
+        type: 'png',
+        data: fallbackBuffer,
+      },
+      transformation: {
+        width: imgEl.naturalWidth / 2,
+        height: imgEl.naturalHeight / 2,
+      },
+    })
+  } else {
+    const imageBlob = await fetch(imgEl.src).then(res => res.blob())
+    const arrayBuffer = await imageBlob.arrayBuffer()
+
+    return new ImageRun({
+      type: imgType,
+      data: arrayBuffer,
+      transformation: {
+        width: imgEl.naturalWidth / 2,
+        height: imgEl.naturalHeight / 2,
+      },
+    })
+  }
+}
+
+async function convertDomCanvasToDocxImg(imgEl: HTMLCanvasElement): Promise<ImageRun | undefined> {
+  const arrayBuffer = await convertCanvasToPngArrayBuffer(imgEl)
+
+  return new ImageRun({
+    type: 'png',
+    data: arrayBuffer,
+    transformation: {
+      width: imgEl.width,
+      height: imgEl.height,
+    },
+  })
+}
+
+const handleImage = async (el: Element): Promise<Paragraph | undefined> => {
+  const tag = el.tagName.toLowerCase()
+
+  if (tag === "img") {
+    if (el instanceof HTMLImageElement) {
+      const imageRun = await convertDomImgToDocxImg(el)
+      if (imageRun) {
+        return new Paragraph({
+          children: [imageRun],
+          spacing: { after: 200 },
+        })
+      }
+    }
+  } else if (tag === "canvas") {
+    if (el instanceof HTMLCanvasElement) {
+      const imageRun = await convertDomCanvasToDocxImg(el)
+      if (imageRun) {
+        return new Paragraph({
+          children: [imageRun],
+          spacing: { after: 200 },
+        })
+      }
+    }
+  }
+}
+
+export default {
+  handleImage,
+  config: {} // 无配置
+}

+ 148 - 0
client/docs/.vitepress/plugins/DomToDocx/docxList.ts

@@ -0,0 +1,148 @@
+import {
+  Paragraph,
+  INumberingOptions,
+  LevelFormat,
+  Table,
+} from "docx"
+import { handleNestElement } from "./handleElement"
+import { handleNodes } from "./handleNodes"
+
+const config: {numbering?: INumberingOptions} = {
+  numbering: {
+    config: [
+      {
+        reference: "bullet-numbering", // 自定义编号 ID
+        levels: [
+          {
+            level: 0,
+            format: LevelFormat.BULLET, // 无序列表用 BULLET
+            text: "•",                  // 符号
+            alignment: "left",
+            style: {
+              paragraph: {
+                indent: { left: 720, hanging: 260 }
+              }
+            }
+          },
+          {
+            level: 1,
+            format: LevelFormat.BULLET,
+            text: "o",
+            alignment: "left",
+            style: {
+              paragraph: {
+                indent: { left: 1440, hanging: 260 }
+              }
+            }
+          },
+          {
+            level: 2,
+            format: LevelFormat.BULLET,
+            text: "▪",
+            alignment: "left",
+            style: {
+              paragraph: { indent: { left: 2160, hanging: 260 } }
+            }
+          }
+        ]
+      },
+      {
+        reference: "ordered-numbering", // 有序列表 ID
+        levels: [
+          {
+            level: 0,
+            format: LevelFormat.DECIMAL, // 有序列表用 DECIMAL(1, 2, 3)
+            text: "%1.",
+            alignment: "left",
+            style: {
+              paragraph: {
+                indent: { left: 720, hanging: 260 }
+              }
+            }
+          },
+          {
+            level: 1,
+            format: LevelFormat.LOWER_LETTER, // 二级有序列表 a,b,c
+            text: "%2.",
+            alignment: "left",
+            style: {
+              paragraph: {
+                indent: { left: 1440, hanging: 260 }
+              }
+            }
+          },
+          {
+            level: 2,
+            format: LevelFormat.LOWER_ROMAN, // i, ii, iii ...
+            text: "%3.",
+            alignment: "left",
+            style: {
+              paragraph: { indent: { left: 2160, hanging: 260 } }
+            }
+          }
+        ]
+      }
+    ]
+  }
+}
+
+const handleList = async (el: Element): Promise<(Paragraph | Table)[] | undefined> => {
+  const tag = el.tagName.toLowerCase()
+
+  // 无序列表
+  if (tag === "ul") {
+    const paragraphList: (Paragraph | Table)[] = []
+    for (const li of Array.from(el.querySelectorAll("li"))) {
+      if (li.children.length === 0) {
+        // 普通文本结构
+        const paragraph = new Paragraph({
+          text: li.textContent ?? "",
+          numbering: {
+            reference: "bullet-numbering",
+            level: 0,
+          },
+          bullet: { level: 0 },
+          spacing: { after: 100 },
+        })
+        paragraphList.push(paragraph)
+      } else {
+        // 复杂文本,交给handleNodes统一处理
+        paragraphList.push(handleNodes(li.childNodes))
+      }
+
+      const childParagraph = await handleNestElement(li)
+      paragraphList.push(...childParagraph)
+    }
+    return paragraphList
+  }
+
+  // 有序列表
+  if (tag === "ol") {
+    const paragraphList: (Paragraph | Table)[] = []
+    for (const li of Array.from(el.querySelectorAll("li"))) {
+      if (li.children.length === 0) {
+        const paragraph = new Paragraph({
+          text: li.textContent ?? "",
+          numbering: {
+            reference: "ordered-numbering",
+            level: 0,
+          },
+          spacing: { after: 100 },
+        })
+        paragraphList.push(paragraph)
+      } else {
+        // 复杂文本,交给handleNodes统一处理
+        paragraphList.push(handleNodes(li.childNodes))
+      }
+
+      const childParagraph = await handleNestElement(li)
+      paragraphList.push(...childParagraph)
+    }
+    return paragraphList
+  }
+}
+
+export default {
+  handleList,
+  config
+}

+ 149 - 0
client/docs/.vitepress/plugins/DomToDocx/docxMath.ts

@@ -0,0 +1,149 @@
+import {
+  Math as DocxMath,
+  MathRun,
+  MathFraction,
+  MathRadical,
+  MathSuperScript,
+  MathSubScript,
+  MathSubSuperScript
+} from "docx"
+
+type MathMLTag =
+  | "MATH"    // MathML集合
+  | "MI"      // 标识符
+  | "MN"      // 数字
+  | "MO"      // 符号
+  | "MTEXT"   // 一般文本(非数学内容)
+  | "MS"      // 字符串文本
+  | "MGLYPH"  // 自定义图形符号
+  | "MROW"    // 水平排列子表达式
+  | "MFRAC"   // 分数 (numerator/denominator)
+  | "MSUP"    // 上标(如 x²)
+  | "MSUB"    // 下标(如 a₁)
+  | "MSUBSUP" // 同时上标与下标
+  | "MSQRT"   // 平方根
+  | "MROOT"   // 带根指数的根式(如 ∛x)
+  | string; // 支持未列出的标签
+
+/**
+ * docx支持的数学公式符合如下:
+ * MathRun                文本
+ * MathFraction           分数
+ *  - numerator           分子
+ *  - denominator         分母
+ * MathSum                累加和
+ *  - subScript           变量和初值(i=1)
+ *  - superScript         最大值(n)
+ * MathRadical            根号
+ *  - degree              次数
+ * MathSuperScript        上标
+ *  - superScript         上标文本或指数
+ * MathSubScript          下标
+ *  - subScript           下标文本
+ * MathSubSuperScript     上下标
+ *  - superScript         上标文本
+ *  - subScript           下标文本
+ * MathFunctions          函数
+ *  - name                函数名
+ * MathSquareBrackets     方括号[]
+ * MathRoundBrackets      圆括号()
+ * MathCurlyBrackets      花括号{}
+ * MathAngledBrackets     尖括号<>
+ * MathLimitUpper         上限(效果未知)
+ *  - limit
+ * MathLimitLower         下限(效果未知)
+ *  - limit
+**/
+
+interface ParsedMathMLNode {
+  tag: MathMLTag;
+  text: string | undefined;
+  children: ParsedMathMLNode[];
+}
+
+function convertMathMLElement(node: Element): ParsedMathMLNode  {
+  const tag = node.tagName; // 如 'MFRAC', 'MI'
+  const children = Array.from(node.children).map(convertMathMLElement);
+  const text = node.textContent?.trim();
+
+  return {
+    tag,
+    text,
+    children
+  };
+}
+
+function convertMathMLNode(node: ParsedMathMLNode) {
+  switch (node.tag) {
+    case "MATH":
+      return new DocxMath({
+        children: Array.from(node.children).map(convertMathMLNode),
+      });
+
+    case "MSUP":
+      return new MathSuperScript({
+        children: [convertMathMLNode(node.children[0])],
+        superScript: convertMathMLNode(node.children[1]),
+      });
+
+    case "MSUB":
+      return new MathSubScript({
+        children: [convertMathMLNode(node.children[0])],
+        subScript: convertMathMLNode(node.children[1]),
+      });
+
+    case "MSUBSUP":
+      return new MathSubSuperScript({
+        children: [convertMathMLNode(node.children[0])],
+        subScript: convertMathMLNode(node.children[1]),
+        superScript: convertMathMLNode(node.children[2]),
+      });
+
+    case "MFRAC":
+      return new MathFraction({
+        numerator: convertMathMLNode(node.children[0]),
+        denominator: convertMathMLNode(node.children[1]),
+      });
+
+    case "MSQRT":
+      return new MathRadical({
+        children: [convertMathMLNode(node.children[0])],
+      });
+
+    case "MROOT":
+      return new MathRadical({
+        children: [convertMathMLNode(node.children[0])],
+        degree: [convertMathMLNode(node.children[1])]
+      });
+
+    case "MI":
+    case "MN":
+    case "MO":
+    case "MTEXT":
+    case "MS":
+    case "MGLYPH":
+      return new MathRun(node.text ?? "");
+
+    case "MROW":
+      return Array.from(node.children).map(convertMathMLNode);
+
+    default:
+      console.warn("Unsupported MathML tag:", node.tag);
+      return new MathRun(`[${node.tag}]`);
+  }
+}
+
+const handleMath = (el: Element): DocxMath | undefined => {
+  const tag = el.tagName.toLowerCase()
+
+  // 段落处理
+  if (tag === "math") {
+    const mathMlNode = convertMathMLElement(el)
+    return convertMathMLNode(mathMlNode)
+  }
+}
+
+export default {
+  handleMath,
+  config: {} // 无配置
+}

+ 39 - 0
client/docs/.vitepress/plugins/DomToDocx/docxTable.ts

@@ -0,0 +1,39 @@
+import {
+  Paragraph,
+  Table,
+  TableRow,
+  TableCell,
+} from "docx"
+
+export function convertDomTableToDocxTable(tableEl: HTMLTableElement): Table {
+  const rows = Array.from(tableEl.rows).map((htmlRow) => {
+    const cells = Array.from(htmlRow.cells).map((htmlCell) => {
+      const text = htmlCell.textContent?.trim() || ""
+
+      return new TableCell({
+        children: [new Paragraph(text)],
+        columnSpan: htmlCell.colSpan > 1 ? htmlCell.colSpan : undefined,
+        rowSpan: htmlCell.rowSpan > 1 ? htmlCell.rowSpan : undefined,
+      })
+    })
+
+    return new TableRow({ children: cells })
+  })
+
+  return new Table({ rows })
+}
+
+const handleTable = (el: Element): Table | undefined => {
+  const tag = el.tagName.toLowerCase()
+
+  if (tag === "table") {
+    if (el instanceof HTMLTableElement) {
+      return convertDomTableToDocxTable(el)
+    }
+  }
+}
+
+export default {
+  handleTable,
+  config: {} // 无配置
+}

+ 113 - 0
client/docs/.vitepress/plugins/DomToDocx/docxText.ts

@@ -0,0 +1,113 @@
+import {
+  Paragraph,
+  TextRun,
+  HeadingLevel,
+  ParagraphChild
+} from "docx"
+import { handleNodes } from "./handleNodes"
+
+const sizeMap: Record<string, number> = {
+  h1: 36,
+  h2: 32,
+  h3: 28,
+  h4: 24,
+  h5: 22,
+  h6: 20,
+  p: 22
+}
+
+const handleText = (el: Element): Paragraph | undefined => {
+  const tag = el.tagName.toLowerCase()
+
+  // 标题段落处理
+  if (/^h[1-6]$/.test(tag)) {
+    const level = parseInt(tag[1])
+    const paragraph = new Paragraph({
+      children: [new TextRun({ text: el.textContent?.trim() ?? "", bold: true, size: sizeMap[tag] ?? 22 })],
+      heading: (("Heading" + (level)) as (typeof HeadingLevel)[keyof typeof HeadingLevel]),
+      spacing: { after: 200 },
+    })
+    return paragraph
+  }
+
+  // 段落处理
+  if (tag === "p") {
+    if (el.children.length === 0) {
+      // 普通文本结构
+      const paragraph = new Paragraph({
+        children: [new TextRun({ text: el.textContent?.trim() ?? "" })],
+        spacing: { after: 200 },
+      })
+      return paragraph
+    } else {
+      // 复杂文本,交给handleNodes统一处理
+      return handleNodes(el.childNodes)
+    }
+  }
+}
+
+/**
+ * 
+ * @param el 
+ * @returns undefined 匹配失败
+ * @returns ParagraphChild 段落子部件
+ * ParagraphChild介绍
+ * ParagraphChild = TextRun | ImageRun | SymbolRun | Bookmark | PageBreak | ColumnBreak | SequentialIdentifier | FootnoteReferenceRun | InternalHyperlink | ExternalHyperlink | InsertedTextRun | DeletedTextRun | Math | SimpleField | SimpleMailMergeField | Comments | Comment | CommentRangeStart | CommentRangeEnd | CommentReference | CheckBox
+ * TextRun
+ * 表示一段文本,支持字体、加粗、颜色、高亮、上标/下标、大小、斜体等样式。是最常见的段落子元素。
+ * ImageRun
+ * 插入图像,可以是 Buffer、base64 或路径。支持控制大小、浮动、对齐方式等。
+ * SymbolRun
+ * 插入符号,例如特殊字符(☑、★等)。
+ * Bookmark
+ * 插入书签,供跳转或引用使用。
+ * PageBreak
+ * 插入分页符。
+ * ColumnBreak
+ * 插入分栏符,用于多栏布局的换栏操作。
+ * SequentialIdentifier
+ * 插入一个自动编号序列,如编号字段。
+ * FootnoteReferenceRun
+ * 插入脚注引用,链接到底部脚注。
+ * InternalHyperlink
+ * 插入指向文档内部书签的链接(例如跳转到某一章节)。
+ * ExternalHyperlink
+ * 插入外部链接,例如网页 URL。
+ * InsertedTextRun/DeletedTextRun
+ * 表示插入或删除的文字(用于显示修改痕迹/修订内容)。
+ * Math
+ * 表示数学公式,内部基于 Office MathML (OMML) 或 MathType 结构。用来插入数学表达式。
+ * SimpleField/SimpleMailMergeField
+ * 插入 Word 字段(如页码、日期等)或邮件合并字段。
+ * CommentRangeStart/CommentRangeEnd
+ * 注释范围的起始和结束标记,用于将某一段文字标记为注释内容。
+ * CommentReference/Comments/Comment
+ * 插入注释引用或注释本体内容,供审阅使用。
+ * CheckBox
+ * 插入复选框,可设置是否勾选。
+ */
+const handleEmbeddedText = (el: Element): ParagraphChild | undefined => {
+  const tag = el.tagName.toLowerCase()
+
+  if (tag === 'br') {
+    return new TextRun({ break: 1 }) // 添加换行
+  }
+
+  if (tag === 'strong') {
+    let textRun: TextRun
+    if (el.children.length === 0) {
+      // 普通文本结构
+      new TextRun({ text: el.textContent?.trim() ?? "", bold: true})
+      return paragraph
+    } else {
+      // 复杂文本,交给handleNodes统一处理
+      return handleNodes(el.childNodes)
+    }
+  }
+}
+
+export default {
+  handleText,
+  handleEmbeddedText,
+  config: {} // 无配置
+}

+ 14 - 0
client/docs/.vitepress/plugins/DomToDocx/docxTitle.ts

@@ -0,0 +1,14 @@
+
+const handleTitle = (el: Element): string | undefined => {
+  const tag = el.tagName.toLowerCase()
+
+  // 标题处理
+  if (tag === "h1") {
+    return el.textContent?.trim()
+  }
+}
+
+export default {
+  handleTitle,
+  config: {} // 无配置
+}

+ 35 - 0
client/docs/.vitepress/plugins/DomToDocx/globalConfig.ts

@@ -0,0 +1,35 @@
+import {
+  IPropertiesOptions
+} from "docx"
+
+// 正文除外的全局配置
+const options: Omit<IPropertiesOptions, "sections"> = {
+  // title: string;
+  // subject?: string;
+  // creator?: string;
+  // keywords?: string;
+  // description?: string;
+  // lastModifiedBy?: string;
+  // revision?: number;
+  // externalStyles?: string;
+  // styles?: IStylesOptions;
+  // numbering?: INumberingOptions;
+  // comments?: ICommentsOptions;
+  // footnotes?: Readonly<Record<string, {
+  //   children: readonly Paragraph[];
+  // }>>;
+  // background?: IDocumentBackgroundOptions;
+  // features?: {
+  //   trackRevisions?: boolean;
+  //   updateFields?: boolean;
+  // };
+  // compatabilityModeVersion?: number;
+  // compatibility?: ICompatibilityOptions;
+  // customProperties?: readonly ICustomPropertyOptions[];
+  // evenAndOddHeaderAndFooters?: boolean;
+  // defaultTabStop?: number;
+  // fonts?: readonly FontOptions[];
+  // hyphenation?: IHyphenationOptions;
+}
+
+export default options

+ 223 - 0
client/docs/.vitepress/plugins/DomToDocx/handleElement.ts

@@ -0,0 +1,223 @@
+import {
+  Paragraph,
+  ParagraphChild,
+  IPropertiesOptions,
+  Table,
+  TextRun
+} from "docx"
+
+import docxTitle from "./docxTitle"
+import docxText from "./docxText"
+import docxList from "./docxList"
+import docxTable from "./docxTable"
+import docxImage from "./docxImage"
+
+// 全局标签
+const TagsList = [
+  'h1', // 标题
+  'h2', // 章节
+  'h3', 'h4', 'h5', 'h6', // 子章节
+
+  // 文本标签
+  'p', // 段落(自动在前后添加间距)
+  'br', // 换行(单标签,插入换行)
+  'hr', // 水平线(分隔内容,常用于段落之间)
+  // 'pre', // 预格式化文本(保留空格和换行,常用于代码块)
+  'strong', // 强调重要性(加粗)
+  'em', // 强调语气(斜体)
+  'b', // 粗体
+  'i', // 斜体
+  'mark', // 高亮(黄色背景)
+  'small', // 小字(字体变小)
+  'sub', // 下标
+  'sup', // 上标
+  'del', // 删除内容(删除线)
+  'ins', // 插入内容(下划线)
+  'blockquote', // 块引用(长段引用内容,默认缩进)
+  'q', // 行内短引用(自动加引号)
+  'cite', // 引用来源(常用于引用文章标题或出处)
+  'code', // 代码片段(等宽字体)
+  'kbd', // 用户输入(表示键盘输入)
+  'samp', // 输出结果(表示计算机输出)
+  'var', // 变量名(通常斜体)
+  'mjx-container', // 数学公式
+
+
+  'div', // 块 -> 可转换成特殊表格块
+  'details', // 描述 -> 可转换成特殊表格块
+  'ul', // 无序列表,子项标签<li>
+  'ol', // 有序列表,子项标签<li>
+  'table', // 表格主体标签
+  'img', 'canvas', // 图片
+]
+
+// 可嵌套标签
+const NestTagsList = [
+  // 文本标签
+  'p', // 段落(自动在前后添加间距)
+  'br', // 换行(单标签,插入换行)
+  'hr', // 水平线(分隔内容,常用于段落之间)
+  // 'pre', // 预格式化文本(保留空格和换行,常用于代码块)
+  'strong', // 强调重要性(加粗)
+  'em', // 强调语气(斜体)
+  'b', // 粗体
+  'i', // 斜体
+  'mark', // 高亮(黄色背景)
+  'small', // 小字(字体变小)
+  'sub', // 下标
+  'sup', // 上标
+  'del', // 删除内容(删除线)
+  'ins', // 插入内容(下划线)
+  'blockquote', // 块引用(长段引用内容,默认缩进)
+  'q', // 行内短引用(自动加引号)
+  'cite', // 引用来源(常用于引用文章标题或出处)
+  'code', // 代码片段(等宽字体)
+  'kbd', // 用户输入(表示键盘输入)
+  'samp', // 输出结果(表示计算机输出)
+  'var', // 变量名(通常斜体)
+  'mjx-container', // 数学公式
+
+  'ul', // 无序列表,子项标签<li>
+  'ol', // 有序列表,子项标签<li>
+  'table', // 表格主体标签
+  'img', 'canvas', // 图片
+]
+
+// 可内嵌标签(段落内部嵌套标签)
+const EmbeddedTagsList = [
+  // 文本标签
+  'br', // 换行(单标签,插入换行)
+  // 'pre', // 预格式化文本(保留空格和换行,常用于代码块)
+  'strong', // 强调重要性(加粗)
+  'em', // 强调语气(斜体)
+  'b', // 粗体
+  'i', // 斜体
+  'mark', // 高亮(黄色背景)
+  'small', // 小字(字体变小)
+  'sub', // 下标
+  'sup', // 上标
+  'del', // 删除内容(删除线)
+  'ins', // 插入内容(下划线)
+  'blockquote', // 块引用(长段引用内容,默认缩进)
+  'q', // 行内短引用(自动加引号)
+  'cite', // 引用来源(常用于引用文章标题或出处)
+  'code', // 代码片段(等宽字体)
+  'kbd', // 用户输入(表示键盘输入)
+  'samp', // 输出结果(表示计算机输出)
+  'var', // 变量名(通常斜体)
+  'mjx-container', // 数学公式
+]
+
+let title: string | undefined = undefined
+export function getTitle(): string | undefined {
+  return title
+}
+
+export function getConfig(): Omit<IPropertiesOptions, "sections"> {
+  return {
+    ...docxTitle.config,
+    ...docxText.config,
+    ...docxList.config,
+    ...docxTable.config,
+    ...docxImage.config
+  }
+}
+
+export const handleElement = async (dom: Element): Promise<(Paragraph | Table)[]> => {
+  const paragraphs: (Paragraph | Table)[] = []
+  for (const el of dom.querySelectorAll(TagsList.toString())) {
+    const text = el.textContent?.trim()
+    if (!text) continue
+
+    // 处理标题
+    if (title === undefined) {
+      title = docxTitle.handleTitle(el)
+    }
+
+    // 处理章节标题和普通文本内容
+    const textParagraph = docxText.handleText(el)
+    if (textParagraph) {
+      paragraphs.push(textParagraph)
+      continue
+    }
+
+    // 处理无序和有序列表
+    const listParagraph = await docxList.handleList(el)
+    if (listParagraph) {
+      paragraphs.push(...listParagraph)
+      continue
+    }
+
+    // 处理表格
+    const tableParagraph = docxTable.handleTable(el)
+    if (tableParagraph) {
+      paragraphs.push(tableParagraph)
+      continue
+    }
+
+    // 处理图片
+    const imageParagraph = await docxImage.handleImage(el)
+    if (imageParagraph) {
+      paragraphs.push(imageParagraph)
+      continue
+    }
+
+    console.warn(`${el.tagName} 标签未处理。`)
+  }
+  return paragraphs
+}
+
+export const handleNestElement = async (dom: Element): Promise<(Paragraph | Table)[]> => {
+  const paragraphs: (Paragraph | Table)[] = []
+  for (const el of dom.querySelectorAll(NestTagsList.toString())) {
+    const text = el.textContent?.trim()
+    if (!text) continue
+
+    // 处理章节标题和普通文本内容
+    const textParagraph = docxText.handleText(el)
+    if (textParagraph) {
+      paragraphs.push(textParagraph)
+      continue
+    }
+
+    // 处理无序和有序列表
+    const listParagraph = await docxList.handleList(el)
+    if (listParagraph) {
+      paragraphs.push(...listParagraph)
+      continue
+    }
+
+    // 处理表格
+    const tableParagraph = docxTable.handleTable(el)
+    if (tableParagraph) {
+      paragraphs.push(tableParagraph)
+      continue
+    }
+
+    // 处理图片
+    const imageParagraph = await docxImage.handleImage(el)
+    if (imageParagraph) {
+      paragraphs.push(imageParagraph)
+      continue
+    }
+
+    console.warn(`${el.tagName} 标签未处理。`)
+  }
+  return paragraphs
+}
+
+export const handleEmbeddedElement = (dom: Element): ParagraphChild => {
+  for (const el of dom.querySelectorAll(EmbeddedTagsList.toString())) {
+    const text = el.textContent?.trim()
+    if (!text) continue
+
+    // 处理章节标题和普通文本内容
+    const textParagraphChiled = docxText.handleEmbeddedText(el)
+    if (textParagraphChiled) {
+      return textParagraphChiled
+    }
+
+    console.warn(`${el.tagName} 标签未处理。`)
+    return new TextRun("")
+  }
+}

+ 23 - 0
client/docs/.vitepress/plugins/DomToDocx/handleNodes.ts

@@ -0,0 +1,23 @@
+import {
+  Paragraph,
+  TextRun,
+  HeadingLevel,
+  ParagraphChild
+} from "docx"
+
+// 本模块主要用于复杂文本标签结构,从中提取#text节点,Element依然由handleElement处理
+
+export const handleNodes = (nodes: NodeListOf<ChildNode>): ParagraphChild[] => {
+  const paragraphChildList: ParagraphChild[] = []
+  nodes.forEach((n) => {
+    if (n.nodeType === 3) {
+      // TEXT节点
+    } else if (n.nodeType === 1) {
+      // ELEMENT节点
+    }
+  })
+  return new Paragraph({
+    children: [new TextRun()],
+    spacing: { after: 200 },
+  })
+}

+ 40 - 0
client/docs/.vitepress/plugins/DomToDocx/index.ts

@@ -0,0 +1,40 @@
+import {
+  Document,
+  Packer,
+  // Paragraph,
+  // TableOfContents
+} from "docx"
+
+import globalConfig from "./globalConfig"
+import { handleElement, getTitle, getConfig } from "./handleElement"
+
+export async function exportDomToWord(domSelector: string = ".content") {
+  const dom = document.querySelector(domSelector)
+  if (!dom) {
+    console.warn("未找到内容区域")
+    return
+  }
+
+  const paragraphs = await handleElement(dom)
+
+  // 构建 Word 文档
+  const doc = new Document({
+    title: getTitle(),
+    ...globalConfig,
+    ...getConfig(),
+    sections: [{
+      children: [
+        // 暂时不使用目录
+        // new Paragraph("文档目录如下:"),
+        // new TableOfContents("目录", {
+        //   hyperlink: true,
+        //   headingStyleRange: "1-3", // 收录 Heading 1~3
+        // }),
+        ...paragraphs
+      ]
+    }],
+  })
+
+  const blob = await Packer.toBlob(doc)
+  return blob
+}

+ 9 - 0
client/docs/.vitepress/plugins/DomToDocx/types.ts

@@ -0,0 +1,9 @@
+// 深度解除只读属性
+export type DeepMutable<T> =
+  T extends ReadonlyArray<infer U>   // 如果是只读数组
+    ? DeepMutableArray<U>            // 递归去除元素 readonly,返回普通数组
+    : T extends object               // 如果是对象
+      ? { -readonly [P in keyof T]: DeepMutable<T[P]> }  // 递归去除属性 readonly
+      : T                           // 其他类型保持不变
+
+type DeepMutableArray<T> = Array<DeepMutable<T>>

+ 43 - 4
client/docs/.vitepress/theme/Layout.vue

@@ -1,5 +1,10 @@
 <template>
   <Layout v-if="showLayout">
+    <template #doc-before> <!-- 正文插槽 -->
+      <div v-if="isDev" class="doc-action-bar">
+        <!-- <button @click="exportDocx">导出为 Word</button> -->
+      </div>
+    </template>
     <template #doc-after> <!-- 正文插槽 -->
       <ClientOnly>
         <!-- 页面正文之后插入评论 -->
@@ -23,14 +28,34 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, onMounted, watch, Component, h } from 'vue'
-import { useRouter, useRoute, withBase } from 'vitepress'
+import { ref, onMounted, watch, Component, h, useTemplateRef } from 'vue-demi'
+import { useRouter, useRoute, withBase, useData } from 'vitepress'
 import DefaultTheme from 'vitepress/theme'
 import { createDiscreteApi, NButton, NIcon, NDropdown, DropdownOption } from 'naive-ui'
 import { Exit as ExitIcon, Person as PersonIcon } from '@vicons/ionicons5'
 import { useCasdoor } from 'casdoor-vue-sdk'
 import type Waline from './components/Waline.vue'
 import { setWalineUserInfoFromToken } from '../plugins/waline'
+import { exportDomToWord } from '../plugins/DomToDocx'
+
+const isDev = import.meta.env.DEV;
+const { frontmatter } = useData()
+
+// async function exportDocx() {
+//   const blob = await exportDomToWord('.content .content-container .main')
+//   if (blob) {
+//     const url = URL.createObjectURL(blob)
+//     const a = document.createElement('a')
+//     a.href = url
+//     a.download = (frontmatter.value.title ?? "null") + ".docx"
+//     document.body.appendChild(a)
+//     a.click()
+
+//     // 清理
+//     document.body.removeChild(a)
+//     URL.revokeObjectURL(url)
+//   }
+// }
 
 function renderIcon(icon: Component) {
   return () => {
@@ -180,10 +205,24 @@ const handleExitClick = async () => {
 }
 
 /* 禁止选中内容(禁止复制) */
-.vp-doc {
-  user-select: none;  /* 禁止选中 */
+/* .vp-doc {
+  user-select: none;
   -webkit-user-select: none;
   -moz-user-select: none;
   -ms-user-select: none;
+} */
+
+.doc-action-bar {
+  display: flex;
+  justify-content: flex-end; /* 右对齐 */
+  margin-bottom: 1em;
+}
+.doc-action-bar button {
+  background-color: #3eaf7c;
+  color: white;
+  border: none;
+  padding: 6px 12px;
+  border-radius: 4px;
+  cursor: pointer;
 }
 </style>

+ 1 - 1
client/docs/.vitepress/theme/components/CasdoorCallback.vue

@@ -3,7 +3,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, onMounted } from 'vue'
+import { ref, onMounted } from 'vue-demi'
 import { withBase } from 'vitepress'
 import { createDiscreteApi } from 'naive-ui'
 import { useCasdoor } from "casdoor-vue-sdk"

+ 14 - 2
client/docs/.vitepress/theme/components/ExcalidrawView.vue

@@ -4,7 +4,7 @@
 </template>
 
 <script setup lang="ts">
-import { onMounted, ref, nextTick, onUnmounted } from 'vue'
+import { onMounted, ref, nextTick, onUnmounted } from 'vue-demi'
 import { withBase } from 'vitepress';
 import { exportToCanvas } from '@excalidraw/excalidraw'
 import { ExportedDataState } from '@excalidraw/excalidraw/data/types'
@@ -42,6 +42,7 @@ const dblclickCanvasHandler = (e: MouseEvent) => {
 };
 
 function showCanvasTop() {
+  if (showFullView.value) return // 防止重复点击
   showFullView.value = true;
 
   // 等待 DOM 渲染后复制内容
@@ -52,8 +53,11 @@ function showCanvasTop() {
       if (canvas) {
         topCanvas = canvas
         canvas.style.transform = `translate(0px, 0px) scale(1)`;
+        canvas.style.pointerEvents = 'auto';
+        canvas.style.userSelect = 'auto';
         origin = { x: 0, y: 0 };
         scale = 1;
+
         canvasFloating.value.appendChild(canvas)
 
         // 双击重置
@@ -126,6 +130,7 @@ function updateTransform() {
   if (topCanvas) {
     topCanvas.style.transform = `translate(${origin.x}px, ${origin.y}px) scale(${scale})`;
   }
+  
 }
 
 function onWheel(e: WheelEvent) {
@@ -222,13 +227,20 @@ onUnmounted(() => {
   left: 0;
   width: 100vw;
   height: 100vh;
-  background: rgba(0, 0, 0, 0.8);
+  /* background: rgba(0, 0, 0, 0.8); */
   z-index: 9999;
   display: flex;
   justify-content: center;
   align-items: center;
   overflow: hidden;
   cursor: grab;
+
+  pointer-events: none; /* ✅ 让这个 div 不接收鼠标事件 */
+  user-select: none;    /* ✅ 禁止选中文本 */
+}
+.floating-canvas > canvas {
+  pointer-events: auto; /* ✅ 子元素重新启用事件 */
+  user-select: auto;
 }
 .floating-canvas:active {
   cursor: grabbing;

+ 1 - 1
client/docs/.vitepress/theme/components/FilterComponent.vue

@@ -17,7 +17,7 @@
 <script setup lang="tsx">
 import FilterForm, { FormValueType, SupportItemConfig } from './FilterForm.vue'
 import ExcalidrawView from './ExcalidrawView.vue'
-import { ref, onMounted, reactive, watch, computed, VNodeChild, nextTick } from 'vue';
+import { ref, onMounted, reactive, watch, computed, VNodeChild, nextTick } from 'vue-demi';
 import { withBase } from 'vitepress'
 import { useLayout } from 'vitepress/dist/client/theme-default/without-fonts.js'
 

+ 1 - 1
client/docs/.vitepress/theme/components/FilterForm.vue

@@ -21,7 +21,7 @@
 </template>
 
 <script setup lang="tsx">
-import { ref, reactive, Reactive, VNode, computed, onMounted, watch } from 'vue'
+import { ref, reactive, Reactive, VNode, computed, onMounted, watch } from 'vue-demi'
 import type { FormInst } from 'naive-ui'
 import { 
   NCollapse,

+ 73 - 6
client/docs/.vitepress/theme/components/NormalTable.vue

@@ -1,5 +1,6 @@
 <template>
   <n-data-table class="normal-table"
+    v-if="columns.length > 0"
     :columns="columns as DataTableColumns"
     :data="tableData"
     :single-line="false"
@@ -7,7 +8,8 @@
 </template>
 
 <script setup lang="ts">
-import { h } from 'vue'
+import { h, ref, onMounted } from 'vue-demi'
+import { withBase } from 'vitepress';
 import { NDataTable, DataTableColumn, DataTableColumns, DataTableColumnGroup, DataTableBaseColumn, DataTableSelectionColumn, DataTableExpandColumn } from 'naive-ui'
 
 interface ChildColumnConfig {
@@ -73,15 +75,24 @@ type CellDataType = {
 interface Props {
   config?: TableConfig;
   data?: CellDataType[];
+  jsonFile?: string;
 }
 
 const props = withDefaults(defineProps<Props>(), {
   config: () => [],
-  data: () => []
+  data: () => [],
+  jsonFile: () => ''
 })
 
+const dataPointer: {data: CellDataType[]} = {
+  data: props.data
+}
+
+const columns = ref<TableColumns>([])
+const tableData = ref<any[]>([])
+
 const handleRowSpan = (rowData: TableRowData, rowIndex: number, key: string): number => {
-  const data = props.data[rowIndex]
+  const data = dataPointer.data[rowIndex]
   if (!data) return 1
   const keyValue = data[key]
   if (!keyValue) return 1
@@ -90,7 +101,7 @@ const handleRowSpan = (rowData: TableRowData, rowIndex: number, key: string): nu
 }
 
 const handleColSpan = (rowData: TableRowData, rowIndex: number, key: string): number => {
-  const data = props.data[rowIndex]
+  const data = dataPointer.data[rowIndex]
   if (!data) return 1
   const keyValue = data[key]
   if (!keyValue) return 1
@@ -223,8 +234,64 @@ function createData(data: CellDataType[]) {
   })
 }
 
-const columns = createColumns(props.config)
-const tableData = createData(props.data)
+// const columns = createColumns(props.config)
+// const tableData = createData(props.data)
+
+interface JsonData {
+  config: TableConfig,
+  data: CellDataType[]
+}
+
+const getJson = async (path: string): Promise<JsonData | undefined> => {
+  const res = await fetch(withBase(path)).catch((err) => {
+    console.log("table file err: ", err)
+  })
+  if (!res) return undefined
+
+  const json = await res.json()
+  return json as JsonData
+}
+
+let jsonDatePromise: Promise<JsonData | undefined> | undefined = undefined
+if (props.jsonFile !== "") {
+  jsonDatePromise = getJson(props.jsonFile)
+}
+
+const loadingLocalData = () => {
+  columns.value.length = 0
+  tableData.value.length = 0
+  columns.value.push(...createColumns(props.config))
+  tableData.value.push(...createData(props.data))
+}
+
+onMounted(async () => {
+  if (jsonDatePromise === undefined) {
+    loadingLocalData()
+  } else {
+    jsonDatePromise.then((value) => {
+      if (value === undefined) {
+        loadingLocalData()
+        return
+      }
+
+      // 尝试处理数据
+      try {
+        const jsonColumns = createColumns(value.config)
+        const jsonTableData = createData(value.data)
+        dataPointer.data = value.data
+        columns.value.push(...jsonColumns)
+        tableData.value.push(...jsonTableData)
+      } catch(err) {
+        console.error('json表格数据处理错误:', err)
+        loadingLocalData()
+      }
+    }).catch((reason) => {
+      console.error('获取json表格数据失败:', reason)
+      loadingLocalData()
+    })
+  }
+  
+})
 
 </script>
 

+ 14 - 3
client/docs/.vitepress/theme/components/ParameterTable.vue

@@ -1,13 +1,13 @@
 <template>
   <div class="para-tab-wrap">
     <div v-for="(item, index) in items" :key="index" class="para-tab-row">
-      <div class="para-tab-name" :style="{ width: labelWidth }">{{ item.name }}</div>
-      <div class="para-tab-content" v-html="item.content"></div>
+      <div class="para-tab-name" :style="{ width: labelWidth }" v-html="safeHtml(item.name)"></div>
+      <div class="para-tab-content" v-html="safeHtml(item.content)"></div>
     </div>
   </div>
 </template>
 
-<script setup>
+<script setup lang="ts">
 defineProps({
   labelWidth: {
     type: String,
@@ -19,6 +19,15 @@ defineProps({
     default: () => []
   }
 });
+
+// 防止 XSS
+function safeHtml(name: string) {
+  return name
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;')
+    .replace(/&lt;br&gt;/g, '<br>');
+}
+
 </script>
 
 <style scoped>
@@ -35,10 +44,12 @@ defineProps({
   gap: 20px;
 }
 .para-tab-name {
+  white-space: normal; /* 默认可以换行 */
   font-weight: bold;
   color: #333;
 }
 .para-tab-content {
+  white-space: normal; /* 默认可以换行 */
   flex: 1;
 }
 </style>

+ 1 - 1
client/docs/.vitepress/theme/components/PdfViewer.vue

@@ -4,7 +4,7 @@
 
 <script setup lang="ts">
 import { withBase } from 'vitepress'
-import { computed } from 'vue'
+import { computed } from 'vue-demi'
 
 const props = defineProps({
   title: {

+ 1 - 1
client/docs/.vitepress/theme/components/SecurePdfViewer.vue

@@ -5,7 +5,7 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, onMounted } from 'vue'
+import { ref, onMounted } from 'vue-demi'
 import { withBase } from 'vitepress'
 import { decrypt } from '../../script/decrypt_pdf'
 // import * as pdfjsLib from 'pdfjs-dist'

+ 1 - 1
client/docs/.vitepress/theme/components/SimpleTable.vue

@@ -21,7 +21,7 @@
 </template>
 
 <script setup lang="ts">
-import { computed } from 'vue'
+import { computed } from 'vue-demi'
 
 interface CellDataType {
   [title: string]: string

+ 1 - 1
client/docs/.vitepress/theme/components/Waline.vue

@@ -3,7 +3,7 @@
 </template>
 
 <script setup lang="ts">
-import { onMounted,  } from 'vue'
+import { onMounted,  } from 'vue-demi'
 import { init, WalineInstance  } from '@waline/client'
 import '@waline/client/style'
 

+ 7 - 0
client/docs/.vitepress/theme/index.css

@@ -5,3 +5,10 @@
 .medium-zoom-image {
   z-index: 9999 !important;/* 给的值是21,但是实测盖不住,直接999 */
 }
+
+@media print {
+  /* 隐藏导航栏/侧边栏/评论/页脚等 */
+  .VPNav, .VPLocalNav, .VPDocFooter, .waline-wrapper {
+    display: none !important;
+  }
+}

+ 1 - 1
client/docs/.vitepress/theme/index.ts

@@ -12,7 +12,7 @@ import {
 } from '../plugins/casdoor/config'
 
 // about Naive UI
-import { App, defineComponent, h, inject, onMounted, watch, nextTick } from 'vue'
+import { App, defineComponent, h, inject, onMounted, watch, nextTick } from 'vue-demi'
 import { setup } from '@css-render/vue3-ssr'
 import { NConfigProvider } from 'naive-ui'
 import { useRoute } from 'vitepress'

+ 601 - 73
client/docs/Hardware/Gate/MSA_C.md

@@ -19,6 +19,33 @@ editLink: false
   <ExcalidrawView filePath="/assets/Hardware/Gate/MSA_C/MSA-C_SystemCommunicationStructureDiagram.excalidraw" />
 </ClientOnly>
 
+<ParameterTable :items="[
+  {
+    name: '低速控制CAN',
+    content: '连接aGate/MSA-C、aPower(PE+BMS)和aPbox2.0的CAN通讯线,用于系统内部各设备间信息交互和控制命令的收发。'
+  },
+  {
+    name: '高速同步CAN',
+    content: '连接aGate/MSA-C的DSP与PE逆变DSP的CAN通讯线,主要用于同步aPower输出交流波形。'
+  },
+  {
+    name: 'SCI<br>(Serial Communication Interface)',
+    content: '一对一的串行通信协议接口,是 UART(通用异步收发器)的一种实现形式,通常等同于 UART 串口通信。通讯线有3根:TX(发送)、RX(接收)、GND。'
+  },
+  {
+    name: 'SPI<br>(Serial Peripheral Interface)',
+    content: '一主多从的高速、同步的全双工串行通信协议,常用于微控制器与外设之间通信。主从结构,通讯线有4根线:SCLK(通信时钟)、MOSI(主机发送数据)、MISO(设备发送数据)、SS/CS(低电平选中从机)'
+  },
+  {
+    name: 'IPC<br>(Inter-Process Communication)',
+    content: '芯片多核心间的通讯协议,主要用于协同工作和交换数据。'
+  },
+  {
+    name: 'MPPT<br>(Maximum Power Point Tracking)',
+    content: 'MPPT 是太阳能系统中用于实时追踪太阳能电池板最大功率输出点的一种算法或电路机制。MPPT 会动态调整负载电压,让光伏面板始终工作在其最高功率点,从而提高太阳能发电效率。'
+  }
+]" />
+
 ### MSA-C典型应用
 
 ![MSA-C+aPbox2.0典型应用系统图](/assets/Hardware/Gate/MSA_C/MSA-C+aPbox2.0典型应用系统图.png)
@@ -67,9 +94,9 @@ editLink: false
 
 **尺寸规格**
 
-| 型号 | 尺寸<br>高×宽×深(mm),误差:±1mm | 净重(kg) | 毛重(含包材)(kg) |
+| 型号 | 尺寸<br>高×宽×深(mm),误差:±1mm | 净重(kg) | 毛重-含包材(kg) |
 | ---- | ---- | ---- | ---- |
-| MSA-C | 297*212*80(mm) | < 3 | < 4 |
+| MSA-C | 297\*212\*80(mm) | < 3 | < 4 |
 
 **工作环境要求**
 
@@ -115,82 +142,583 @@ editLink: false
 | ETH | 以太网 | 接家庭网关 |
 | EPO | 远程紧急停机,断开生效 | |
 
-### 对外接口详细参数
+### 对外接口详细定义
 
-| 端子标签 | 功能 | 参数说明 |
-| ---- | ---- | ---- |
-| 12V_BUS | 12V电源 | |
-| AGND12V | 12V电源参考地 | |
-| Line_Curr_L1_P | 电网侧L1电流检测输出+ | 0.333V @ 200A |
-| Line _Curr_L1_N | 电网侧L1电流检测输出- | 0.333V @ 200A |
-| Line _Curr_L2_P | 电网侧L2电流检测输出+ | 0.333V @ 200A |
-| Line _Curr_L2_N | 电网侧L2电流检测输出- | 0.333V @ 200A |
-| Line _RMG_CT_L1_P | 电网侧L1电流罗氏线圈检测输出+ | 0.333V @ 200A |
-| Line _RMG_CT_L1_N | 电网侧L1电流罗氏线圈检测输出- | 0.333V @ 200A |
-| Line _RMG_CT_L2_P | 电网侧L2电流罗氏线圈检测输出+ | 0.333V @ 200A |
-| Line _RMG_CT_L2_N | 电网侧L2电流罗氏线圈检测输出- | 0.333V @ 200A |
-| Line _Volt_L1L2 | 电网侧L1L2线电压 | 0V to 10Vpp @ 288 Vac (5V bias) |
-| AGND12V | 参考地 | |
-| Load_Curr_ L1_P | 用户侧L1电流检测输出+ | 0.333V @ 200A |
-| Load _Curr_ L1_N | 用户侧L1电流检测输出- | 0.333V @ 200A |
-| Load _Curr_ L2_P | 用户侧L2电流检测输出+ | 0.333V @ 200A |
-| Load _Curr_ L2_N | 用户侧L2电流检测输出- | 0.333V @ 200A |
-| Load_Volt_L1L2 | 用户侧L1L2线电压 | 0V to 10Vpp @ 288 Vac (5V bias) |
-| AGND12V | 参考地 | |
-| MID_Ctrl_Open | MSA继电器控制断开 | |
-| MID_Ctrl_Close | MSA继电器控制闭合 | |
-| MID_Sense_12V | MSA继电器状态反馈电源 | |
-| MID_Sense_Out | MSA继电器状态反馈 | |
-| E-Stop_In | 急停控制状态电压输入 | |
-| E-Stop_Out | 急停控制状态,拉低有效 | |
-| Temp_Sense | MSA温度采集信号 | -50C to 150C, +/- 2.5C accuracy |
-| Grid_Power_OK | 电网状态反馈 | |
-| MID_Relay_Ready | MSA继电器驱动电路状态反馈 | |
-| MSA_Fault_N | SPD触发状态反馈,低有效 | |
-| Line_L1 | EQB MSA 电网侧L1 | |
-| N | 电网中线 | |
-| Line_L2 | EQB MSA 电网侧L2 | |
-| Load_L1 | EQB MSA 用户侧L1 | |
-| Load_L2 | EQB MSA 用户侧L2 | |
-| Load_CT_ L1_P | EQB MSA 用户侧L1电流采集 | |
-| Load _CT_L1_N | EQB MSA 用户侧L1电流采集 | |
-| Load _CT_ L2_P | EQB MSA 用户侧L2电流采集 | |
-| Load _CT_ L2_N | EQB MSA 用户侧L2电流采集 | |
-| Coil A1 | EQB MSA继电器控制口 | EQB继电器控制线圈 |
-| Coil A2 | EQB MSA继电器控制口 | EQB继电器控制线圈 |
-| PSI_OPEN | EQB MSA继电器状态反馈 | |
-| PSI_CLOSED | EQB MSA继电器状态反馈 | |
-| PSI_COMMON | EQB MSA继电器状态反馈公共端 | |
-| Grid_Res_CT_ L1_P | 预留市电侧L1电流采集 | |
-| Grid_Res _CT_L1_N | 预留市电侧L1电流采集 | |
-| Grid_Res _CT_ L2_P | 预留市电侧L2电流采集 | |
-| Grid_Res _CT_ L2_N | 预留市电侧L2电流采集 | |
-| Solar_ Res_CT_ P | 预留光伏电流采集 | |
-| Solar_ Res_CT_N | 预留光伏电流采集 | |
-| CAN1_H | CAN接口1 | |
-| CAN1_L | CAN接口1 | |
-| CAN2_H | CAN接口2 | |
-| CAN2_L | CAN接口2 | |
-| RS485_A_1 | RS485接口1 | |
-| RS485_B_1 | RS485接口1 | |
-| RS485_A_2 | RS485接口2 | |
-| RS485_B_2 | RS485接口2 | |
-| Vin_24V_A | 24V输入,来自aPower | |
-| AGND12V | 参考地 | |
-| Vin_24V_B | 24V输入,来自aPbox2.0 | |
-| AGND12V | 参考地 | |
-| EPO_A | 急停接口 | |
-| EPO_B | 急停接口 | |
-| Eth | 以太网接口 | |
-| USB | 4G接口 | 两个天线 |
-| Wifi | Wifi天线接口 | 两个天线 |
-
-## MSA-C基础功能介绍
+#### MSA-C内部端口定义
 
-### 智能负载管理
+<ClientOnly>
+  <NormalTable
+    :config = "[
+      '端子名称', 
+      'pin脚', 
+      'pin定义',
+      '功能',
+      '说明'
+    ]"
+    :data="[
+      {
+        端子名称: {
+          text: 'CND(J12)',
+          rowspan: 32
+        },
+        pin脚: '1',
+        pin定义: '12V_BUS',
+        功能: '12V电源',
+        说明: ''
+      },
+      {
+        pin脚: '2',
+        pin定义: 'AGND12V',
+        功能: '12V电源参考地',
+        说明: ''
+      },
+      {
+        pin脚: '3',
+        pin定义: 'Line_Curr_L1_P',
+        功能: '电网侧L1电流检测输出+',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '4',
+        pin定义: 'Line_Curr_L1_N',
+        功能: '电网侧L1电流检测输出-',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '5',
+        pin定义: 'Line_Curr_L2_P',
+        功能: '电网侧L2电流检测输出+',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '6',
+        pin定义: 'Line_Curr_L2_N',
+        功能: '电网侧L2电流检测输出-',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '7',
+        pin定义: 'Line_RMG_CT_L1_P',
+        功能: '电网侧L1电流罗氏线圈检测输出+',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '8',
+        pin定义: 'Line_RMG_CT_L1_N',
+        功能: '电网侧L1电流罗氏线圈检测输出-',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '9',
+        pin定义: 'Line_RMG_CT_L2_P',
+        功能: '电网侧L2电流罗氏线圈检测输出+',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '10',
+        pin定义: 'Line_RMG_CT_L2_N',
+        功能: '电网侧L2电流罗氏线圈检测输出-',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '11',
+        pin定义: 'Line_Volt_L1L2',
+        功能: '电网侧L1L2线电压',
+        说明: '0V to 10Vpp @ 288 Vac (5V bias)'
+      },
+      {
+        pin脚: '12',
+        pin定义: 'AGND12V',
+        功能: '参考地',
+        说明: ''
+      },
+      {
+        pin脚: '13',
+        pin定义: 'Load_Curr_L1_P',
+        功能: '用户侧L1电流检测输出+',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '14',
+        pin定义: 'Load_Curr_L1_N',
+        功能: '用户侧L1电流检测输出-',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '15',
+        pin定义: 'Load_Curr_L2_P',
+        功能: '用户侧L2电流检测输出+',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '16',
+        pin定义: 'Load_Curr_L2_N',
+        功能: '用户侧L2电流检测输出-',
+        说明: '0.333V @ 200A'
+      },
+      {
+        pin脚: '17',
+        pin定义: 'Load_Volt_L1L2',
+        功能: '用户侧L1L2线电压',
+        说明: '0V to 10Vpp @ 288 Vac (5V bias)'
+      },
+      {
+        pin脚: '18',
+        pin定义: 'AGND12V',
+        功能: '参考地',
+        说明: ''
+      },
+      {
+        pin脚: '19',
+        pin定义: 'MID_Ctrl_Open',
+        功能: 'MSA继电器控制断开',
+        说明: ''
+      },
+      {
+        pin脚: '20',
+        pin定义: 'MID_Ctrl_Close',
+        功能: 'MSA继电器控制闭合',
+        说明: ''
+      },
+      {
+        pin脚: '21',
+        pin定义: 'MID_Sense_12V',
+        功能: 'MSA继电器状态反馈电源',
+        说明: ''
+      },
+      {
+        pin脚: '22',
+        pin定义: 'MID_Sense_Out',
+        功能: 'MSA继电器状态反馈',
+        说明: ''
+      },
+      {
+        pin脚: '23',
+        pin定义: 'E-Stop_In',
+        功能: '急停控制状态电压输入',
+        说明: ''
+      },
+      {
+        pin脚: '24',
+        pin定义: 'E-Stop_Out',
+        功能: '急停控制状态,拉低有效',
+        说明: ''
+      },
+      {
+        pin脚: '25',
+        pin定义: 'Temp_Sense',
+        功能: 'MSA温度采集信号',
+        说明: '-50C to 150C, +/- 2.5C accuracy'
+      },
+      {
+        pin脚: '26',
+        pin定义: 'Grid_Power_OK',
+        功能: '电网状态反馈',
+        说明: ''
+      },
+      {
+        pin脚: '27',
+        pin定义: 'MID_Relay_Ready',
+        功能: 'MSA继电器驱动电路状态反馈',
+        说明: ''
+      },
+      {
+        pin脚: '28',
+        pin定义: 'MSA_Fault_N',
+        功能: 'SPD触发状态反馈,低有效',
+        说明: ''
+      },
+      {
+        pin脚: '29',
+        pin定义: '/',
+        功能: '/',
+        说明: ''
+      },
+      {
+        pin脚: '30',
+        pin定义: '/',
+        功能: '/',
+        说明: ''
+      },
+      {
+        pin脚: '31',
+        pin定义: '/',
+        功能: '/',
+        说明: ''
+      },
+      {
+        pin脚: '32',
+        pin定义: '/',
+        功能: '/',
+        说明: ''
+      },
+      {
+        端子名称: {
+          text: 'EQB_HV(J9)',
+          rowspan: 5
+        },
+        pin脚: '1',
+        pin定义: 'BACKUP_L2',
+        功能: '负载侧L2电压(继电器后)',
+        说明: ''
+      },
+      {
+        pin脚: '2',
+        pin定义: 'GRID_L2',
+        功能: '市电L2电压(继电器前)',
+        说明: ''
+      },
+      {
+        pin脚: '3',
+        pin定义: 'EQB_N',
+        功能: 'N线',
+        说明: ''
+      },
+      {
+        pin脚: '4',
+        pin定义: 'BACKUP_L1',
+        功能: '负载侧L1电压(继电器后)',
+        说明: ''
+      },
+      {
+        pin脚: '5',
+        pin定义: 'GRID_L1',
+        功能: '市电L1电压(继电器前)',
+        说明: ''
+      },
+      {
+        端子名称: {
+          text: 'EQB_S(J6)',
+          rowspan: 10
+        },
+        pin脚: '1',
+        pin定义: 'EQB_OFF',
+        功能: 'EQB断开驱动',
+        说明: ''
+      },
+      {
+        pin脚: '2',
+        pin定义: 'EQB_ON',
+        功能: 'EQB闭合驱动',
+        说明: ''
+      },
+      {
+        pin脚: '3',
+        pin定义: 'EQB_FB_ON',
+        功能: 'EQB闭合反馈指示',
+        说明: ''
+      },
+      {
+        pin脚: '4',
+        pin定义: 'EQB_FB_COM',
+        功能: 'EQB反馈公共端',
+        说明: ''
+      },
+      {
+        pin脚: '5',
+        pin定义: 'EQB_FB_OFF',
+        功能: 'EQB断开反馈指示',
+        说明: ''
+      },
+      {
+        pin脚: '6',
+        pin定义: '/',
+        功能: '/',
+        说明: ''
+      },
+      {
+        pin脚: '7',
+        pin定义: 'I_EQB_Grid_L1+',
+        功能: {
+          text: 'EQB市电电流采样L1',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '8',
+        pin定义: 'I_EQB_Grid_L1-',
+        说明: ''
+      },
+      {
+        pin脚: '9',
+        pin定义: 'I_EQB_Grid_L2+',
+        功能: {
+          text: 'EQB市电电流采样L2',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '10',
+        pin定义: 'I_EQB_Grid_L2-',
+        说明: ''
+      },
+      {
+        端子名称: {
+          text: '485通讯(J11)',
+          rowspan: 4
+        },
+        pin脚: '1',
+        pin定义: '12V_BUS',
+        功能: '12V电源',
+        说明: ''
+      },
+      {
+        端子名称: {
+          text: '485通讯(J11)',
+          rowspan: 4
+        },
+        pin脚: '1',
+        pin定义: 'RS485A_1',
+        功能: {
+          text: '485通讯1',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '2',
+        pin定义: 'RS485B_1',
+        说明: ''
+      },
+      {
+        pin脚: '3',
+        pin定义: 'RS485A_2',
+        功能: {
+          text: '485通讯2',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '4',
+        pin定义: 'RS485B_2',
+        说明: ''
+      },
+      {
+        端子名称: {
+          text: 'EP0&RSD急停(J2)',
+          rowspan: 4
+        },
+        pin脚: '1',
+        pin定义: 'EPO+',
+        功能: {
+          text: 'EPC急停',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '2',
+        pin定义: 'EPO-',
+        说明: ''
+      },
+      {
+        pin脚: '3',
+        pin定义: 'RSD+',
+        功能: {
+          text: 'RSD急停',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '4',
+        pin定义: 'RSD-',
+        说明: ''
+      },
+      {
+        端子名称: {
+          text: 'PV_CT(J4)',
+          rowspan: 4
+        },
+        pin脚: '1',
+        pin定义: 'I_PV1+',
+        功能: {
+          text: '光伏CT1',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '2',
+        pin定义: 'I_PV1-',
+        说明: ''
+      },
+      {
+        pin脚: '3',
+        pin定义: 'I_PV2+',
+        功能: {
+          text: '光伏CT2',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '4',
+        pin定义: 'I_PV2-',
+        说明: ''
+      },
+      {
+        端子名称: {
+          text: 'CAN_IN(J19-left)',
+          rowspan: 8
+        },
+        pin脚: '1',
+        pin定义: 'CAN1_H',
+        功能: {
+          text: 'CAN1(高速同步CAN)通信',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '2',
+        pin定义: 'CAN1_L',
+        说明: ''
+      },
+      {
+        pin脚: '3',
+        pin定义: '24V_IN',
+        功能: '辅源供电24V+',
+        说明: 'PE或APbox2.0电源'
+      },
+      {
+        pin脚: '4',
+        pin定义: 'CAN2_L',
+        功能: {
+          text: 'CAN2(低速控制CAN)通信',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '5',
+        pin定义: 'CAN2_H',
+        说明: ''
+      },
+      {
+        pin脚: '6',
+        pin定义: '24V_IN',
+        功能: '辅源供电24V+',
+        说明: 'PE或APbox2.0电源'
+      },
+      {
+        pin脚: '7',
+        pin定义: 'GND1',
+        功能: {
+          text: '电源地1',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '8',
+        pin定义: 'GND1',
+        说明: ''
+      },
+      {
+        端子名称: {
+          text: 'CAN_OUT(J19-right)',
+          rowspan: 8
+        },
+        pin脚: '1',
+        pin定义: 'CAN1_H',
+        功能: {
+          text: 'CAN1(高速同步CAN)通信',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '2',
+        pin定义: 'CAN1_L',
+        说明: ''
+      },
+      {
+        pin脚: '3',
+        pin定义: '24V_IN',
+        功能: '辅源供电24V+',
+        说明: 'PE或APbox2.0电源'
+      },
+      {
+        pin脚: '4',
+        pin定义: 'CAN2_L',
+        功能: {
+          text: 'CAN2(低速控制CAN)通信',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '5',
+        pin定义: 'CAN2_H',
+        说明: ''
+      },
+      {
+        pin脚: '6',
+        pin定义: '24V_IN',
+        功能: '辅源供电24V+',
+        说明: 'PE或APbox2.0电源'
+      },
+      {
+        pin脚: '7',
+        pin定义: 'GND2',
+        功能: {
+          text: '电源地2',
+          rowspan: 2
+        },
+        说明: ''
+      },
+      {
+        pin脚: '8',
+        pin定义: 'GND2',
+        说明: ''
+      },
+      {
+        端子名称: 'WIFI天线(J7&J8)',
+        pin脚: '1',
+        pin定义: 'WIFI_X1',
+        功能: 'WIFI天线',
+        说明: ''
+      }
+    ]"
+  />
+</ClientOnly>
+
+**RJ45(CAN)端口说明**
+
+![RJ45-Pin定义图](/assets/Hardware/Gate/MSA_C/RJ45-Pin定义图.png)
+
+#### MSA-C下方圆端子定义
+
+待补充
+
+## MSA-C功能介绍
+
+### 能量调度
+
+### SOC均衡
+
+### 黑启动
 
 ### 发电机&V2L管理
 
+### 光伏控制
+
+### 智能负载管理
+
+### 能量统计
+
+### PCS控制
+
+### SOC管理
+
+### 电表与虚拟电表管理
+
+### 子设备参数管理
+
 ### 电池加热管理
 
 ### 在线升级(OTA)

+ 11 - 0
client/docs/Hardware/Other/SplitCT.md

@@ -0,0 +1,11 @@
+---
+title: Split CT
+editLink: false
+---
+# Split CT
+
+## 规格书
+
+<ClientOnly>
+  <SecurePdfViewer fileUrl="/pdf/规格书_23020016_XH-SCT-S24_星火电子.pdf.enc" />
+</ClientOnly>

+ 6 - 0
client/docs/Hardware/Power/aPower_1.0.md

@@ -4,4 +4,10 @@ editLink: false
 ---
 # aPower 1.0
 
+**编码格式**
+
+aPower1.0编码:
+10050002:深圳制造
+10050003:深圳制造
+10050004:深圳制造
 

+ 3 - 0
client/docs/Hardware/Power/aPower_1.2.md

@@ -4,4 +4,7 @@ editLink: false
 ---
 # aPower 1.2
 
+**编码格式**
 
+aPower1.2编码:
+10050013:深圳制造

+ 8 - 6
client/docs/Hardware/Power/aPower_1.3.md

@@ -4,13 +4,15 @@ editLink: false
 ---
 # aPower 1.3
 
+**编码格式**
+
+aPower1.3编码:
+10050011:深圳制造
+
 **数据手册**
 
 更新于2025-03-31
 
-<iframe
-  src="/assets/Hardware/Power/aPower_1.3/aPower 1.3 Datasheet (SKU_ APR-05K13V1-US)_20240903.pdf"
-  width="100%"
-  height="800px"
-  style="border: none;"
-></iframe>
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_1.3/aPower 1.3 Datasheet (SKU_ APR-05K13V1-US)_20240903.pdf" />
+</ClientOnly>

+ 8 - 7
client/docs/Hardware/Power/aPower_2.md

@@ -7,7 +7,7 @@ editLink: false
 **编码格式**
 
 aPower2编码:
-10050015:广东制造
+10050015:深圳制造
 10050018:美国制造
 10050021:美国制造
 
@@ -15,12 +15,9 @@ aPower2编码:
 
 更新于2025-03-31
 
-<iframe
-  src="/assets/Hardware/Power/aPower_2/aPower 2 Datasheet (SKU_ APR-10K15V2-US)_20250331.pdf"
-  width="100%"
-  height="800px"
-  style="border: none;"
-></iframe>
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_2/aPower 2 Datasheet (SKU_ APR-10K15V2-US)_20250331.pdf" />
+</ClientOnly>
 
 **功率等级**
 
@@ -40,3 +37,7 @@ aPower2编码:
  | 9.6kva | 9.6kw | 40A | 9.6kVar | -1.0~1.0 |
  | 7.6kva | 7.6kw | 32A | 7.6kVar | -1.0~1.0 |
  | 5kva | 5kw | 21A | 5kVar | -1.0~1.0 |
+
+**加热逻辑**
+
+加热无法充电,BMS处于充电保护状态,断开充电MOS管,PE一旦有电流进入BMS,会将直流母线电压拱高,从而触发PE过充电保护。

+ 419 - 18
client/docs/Hardware/Power/aPower_S.md

@@ -4,28 +4,429 @@ editLink: false
 ---
 # aPower S
 
+## 规格参数
+
 **编码格式**
 
 aPowerS编码:
+10050019:深圳制造
 10050022:美国制造
 
 **功率等级**
 
- | 功率等级(kva) | 功率等级(kw) | 电流等级(A) | 无功等级(kVar) | 功率因数(PF) |
- | ------- | ------ | ------ | ------ | ------ |
- | 11.5kva | 10kw | 48A | 5.6kVar | -0.87~0.87 |
- | 9.6kva | 9.6kw | 40A | 9.6kVar | -1.0~1.0 |
- | 7.6kva | 7.6kw | 32A | 7.6kVar | -1.0~1.0 |
- | 5kva | 5kw | 21A | 5kVar | -1.0~1.0 |
-
- **RSD/MCI断开方式**
-
- | 事件 | 断开类型 | 说明 |
- | ---- | ---- | ---- |
- | RSD/MCI关断开关 | 主动断开 | |
- | EPO | 主动断开 | |
- | aPowerS关机 | 主动断开 | |
- | 母线继电器故障 | 故障断开 | |
- | 逆变输出继电器故障 | 故障断开 | |
- | 电池漏电保护故障 | 故障断开 | |
- | MPPT进入休眠 | 软件逻辑断开 | |
+| 功率等级(kva) | 功率等级(kw) | 电流等级(A) | 无功等级(kVar) | 功率因数(PF) |
+| ------- | ------ | ------ | ------ | ------ |
+| 11.5kva | 10kw | 48A | 5.6kVar | -0.87~0.87 |
+| 9.6kva | 9.6kw | 40A | 9.6kVar | -1.0~1.0 |
+| 7.6kva | 7.6kw | 32A | 7.6kVar | -1.0~1.0 |
+| 5kva | 5kw | 21A | 5kVar | -1.0~1.0 |
+
+**产品特点**
+
+- 高循环高吞吐
+- 高安全特性LFP
+- 支持直流光伏接入,可匹配20kW/STC光伏组件配置
+- 具备RSD解决方案
+- 具备AFCI功能
+- 具备绝缘电阻检测(ISO)功能
+- 具备残余电流检测(IMI)功能
+- 合规并网要求
+- 支持无缝备电切换
+- 离网带载能力,带空调负载-5Ton
+- 无差别适配光伏
+- 支持备电发电机接入(120V/208V不支持发电机)
+- 系统级电池均衡功能
+- 支持北美120V/240V-60Hz,120V/208V-60Hz系统
+- 硬件兼容澳洲单相230V/240V-50Hz,
+- 具备2.5kW-120V 半波载能力
+- SOC管理功能
+- 智能温控管理
+- 支持光伏直流接入并同时为电池充电和并网发电的模式
+- 支持无光伏独立运行模式
+- 电池双重安全保护机制
+- 并网的能量调度策略
+- 接受aGate调度满足虚拟电网服务
+- 备电参数比例可设
+- 离网模式下储能单元与光伏系统的匹配策略
+- 在线升级
+- 远程诊断
+- 设备运维集中管理
+- 历史数据管理
+- 光伏调频管理
+
+**环境条件**
+
+::: details 环境条件规格参数表
+| 项目 | 值/范围 | 说明 |
+| ---- | ---- | ---- |
+| 工作温度范围 | -20~50℃ | |
+| 满载工作范围 | -20~40℃ | 标准场景 |
+| 满载工作范围 | -20~50℃ | 纯直流光伏逆变场景,电池不参与工作 |
+| 高温降额工作范围 | 40℃~ 50℃ | 非纯光伏逆变场景,降额根据环境温度和内部温度总和考虑,纯光伏逆变场景支持-20~50℃满载不降额 |
+| 推荐使用温度 | 0~30℃ | |
+| 工作相对湿度 | 100%RH (凝露) | |
+| 工作海拔 | ≤ 3000m | |
+| 初始电量 | SOC 30% | |
+| 污染等级 | PD3 | |
+| 安装环境 | 室内/室外 | |
+| 存储时间 | -20℃~45℃(270天)<br>-30℃~-20℃,45℃~55℃(≤30天) | -30℃~-20℃,45℃~55℃两段时间总和不超过30天 |
+| 运输条件 | -20℃~35℃ ≤ 50天<br>36℃~45℃ ≤ 30天<br>46~60℃  ≤ 7天<br>-30~-20℃  ≤ 24 hour | |
+:::
+
+**基本规格**
+
+::: details aPowerS基本规格参数表
+<ClientOnly>
+  <NormalTable
+    jsonFile="/assets/Hardware/Power/aPower_S/aPowerS基本规格参数表.json"
+  />
+</ClientOnly>
+:::
+
+## 电气连接
+
+### 直流耦合接入
+
+直流耦合接入,光伏组串直流输出接入aPower 2S MPPT模块
+
+![直流耦合接入连接图](/assets/Hardware/Power/aPower_S/直流耦合接入连接图.png)
+
+### 交流耦合接入
+
+交流耦合接入,光伏经逆变器转换成交流后,通过aGate接入至aPower 2S的PCS交流侧
+
+![交流耦合接入连接图](/assets/Hardware/Power/aPower_S/交流耦合接入连接图.png)
+
+### 直流&交流耦合同时接入
+
+直流耦合及交流耦合同时接入,直流光伏接入aPower2SMPPT模块,交流光伏通过aGate接入至aPower 2S的PCS交流侧
+
+![直流与交流耦合同时接入连接图](/assets/Hardware/Power/aPower_S/直流与交流耦合同时接入连接图.png)
+
+## aPower S 控制逻辑
+
+### 直流光伏限幅
+
+系统能量流图
+
+<ClientOnly>
+  <ExcalidrawView filePath="/assets/Hardware/Power/aPower_S/aPowerS_PvEnergyFlow.excalidraw" />
+</ClientOnly>
+
+::: details 参数说明
+
+以下所有参数皆为功率值
+
+| 参数 | 含义 | 说明 |
+| :---: | --- | --- |
+| $L_{grid\_exp}$ | 允许馈网功率 | 由用户或安装商设置 |
+| $L_{sw}$ | aPower空开限制功率 | 由空开参数决定 |
+| $[L_{ap.1}, L_{ap.2}, ..., L_{ap.n}]$ | aPower额定充/放功率 | 由aPower额定参数决定 |
+| $[L_{sop\_chr.1}, L_{sop\_chr.2}, ..., L_{sop\_chr.n}]$ | 电池充电sop功率 | 由电池规格参数决定 |
+| $[L_{sop\_dsc.1}, L_{sop\_dsc.2}, ..., L_{sop\_dsc.n}]$ | 电池放电sop功率 | 由电池规格参数决定 |
+| $[L_{dcpv.1},L_{dcpv.2},...,L_{dcpv.n}]$ | 直流光伏(MPPT)最大输出功率 | 可实时控制参数 |
+| $[L_{acpv.1},L_{acpv.2},...,L_{acpv.n}]$ | 交流光伏最大输出功率 | 可实时控制参数(通过光伏调频) |
+| $P_{load}$ | 负载实时功率 | |
+| $P_{gen}$ | 发电机或V2L实时功率 | |
+| $[P_{dcpv.1}, P_{dcpv.2}, ..., P_{dcpv.n}]$ | 直流光伏(MPPT)实时功率 | |
+| $[P_{acpv.1}, P_{acpv.2}, ..., P_{acpv.n}]$ | 交流光伏实时功率 | |
+| $[P_{ap.1}, P_{ap.2}, ..., P_{ap.n}]$ | aPower实际充/放功率 | 放电为正,充电为负 |
+| $[R_{batt.1}, R_{batt.2}, ..., R_{batt.n}]$ | 电池充/放电功率请求值 | 可实时控制参数<br>放电为正,充电为负 |
+
+说明:
+- 字母L表示限制功率
+- 字母P表示实时功率
+- 字母R表示请求功率
+
+:::
+
+**并网-直流光伏限功逻辑算法**
+
+:::info 📜总结
+- 并网直流光伏的最大输出功率主要受限于以下几点
+  - aPower额定功率
+  - aPower空开
+  - 系统吸收功率(包括电网倒送功率、负载功率、电池可充电功率)
+  - 交流光伏功率
+- 通过以上参数计算出并网直流光伏限制功率
+:::
+
+单台直流光伏限制:
+- $L_{dcpv.i} = L_{ap.i} + L_{sop\_chr.i}$
+- 局部单台aPowerS设备,直流光伏的最大输出功率不得超出“aPower的最大放电功率” + “电池的最大充电功率”
+
+所有直流光伏总限制:
+- $\sum_{i=1}^{n} L_{dcpv.i} = \min(L_{sw}, L_{grid\_exp} + P_{load} - \sum_{i=1}^{n} P_{acpv.i}) + \sum_{i=1}^{n} L_{sop\_chr.i}$
+- 系统中,aPowerS放电总功率不得超过aPower空开限制功率
+- 系统中,aPowerS放电总功率不得超过“电网倒送功率” + “实时负载功率” - “交流光伏实时总功率”
+- 系统中,aPowerS直流光伏输出总功率不得超过“aPowerS放电总功率限制” + “电池可充电总功率”
+
+**离网-直流光伏限功逻辑算法**
+
+离网下有两大类场景需要考虑,有发电机接入供电和无发电机接入供电。
+
+**1.离网无发电机场景**
+
+:::info 📜总结
+- 离网场景下,aPower为电压源,aPower的充放电功率处于被动跟随状态,电池请求功率 $R_{batt}$ 不再可控,仅可通过**光伏调频**和**MPPT控制**来限制交流光伏与直流光伏的输出。
+- aPower处于放电状态时(负载较大),**光伏调频**和**MPPT控制**均不限制光伏功率。
+- 当电池处于充电状态时,优先是有直流光伏功率,MPPT限制将尽可能放宽。其次使用交流光伏功率充电。
+:::
+
+:::warning ⚠️可能触发的保护说明
+当负载过重导致aPower过载关闭交流输出:
+- 当 $P_{ap.i} > L_{ap.i}$ 且超出过多时,此时可能触发过载保护,aPower逆变关机,MPPT正常工作,可给电池充电。
+- 当 $P_{ap.i} > L_{sop\_dsc.i} + P_{dcpv.i}$ 时,此时触发BMS电池过放保护,aPower逆变关机,MPPT关机。
+
+当交流光伏发电量过大时,也会触发aPower充电过载:
+- 当 $-P_{ap.i} > L_{ap.i}$ 时,触发光伏超配,切断交流光伏继电器。(如无继电器,持续过载也可能触发aPower逆变关机)
+- 当 $-P_{ap.i} > L_{sop\_chr.i}$ 时,触发光伏超配,切断交流光伏继电器。如无继电器,此时触发BMS电池过充保护,aPower逆变关机,MPPT关机。
+- 在 $L_{sop.i} < L_{ap.i}$ 时,所以优先触发条件2,条件1可能无法触发。aPowerS永久满足此条件。
+:::
+
+此场景下,可控参数为 $\sum_{i=1}^{n} L_{acpv.i}$ (光伏调频) 和 $L_{dcpv.i}$ (MPPT控制)。
+
+$L_{dcpv.i} = L_{sop\_chr.i} + P_{ap.i}$
+
+MPPT的放宽限制调节是缓调节,不会突变。收窄限制的调节可立即完成。
+
+::: details 关于光伏调频与MPPT控制的关系
+
+光伏调频保持原有逻辑不改变。
+
+光伏调频特点总结:
+- 光伏调频的调节目标功率会维持在:可充电限制功率 - 500w
+- 当aPower充电功率 > 可充电限制功率时,光伏调频会升高频率以限制交流光伏输出功率
+
+光伏调频与MPPT控制优先级:
+- MPPT会根据自身逻辑缓慢调节提高直流光伏充电功率,从而使光伏调频因aPower充电功率 > 可充电限制功率而提高频率限制交流光伏充电功率。
+- 当MPPT充电功率完全满足电池充电的条件下,光伏调频会将交流光伏功率调至0w
+- MPPT的调节目标功率会维持在:可充电限制功率 - 200w
+- 故直流光伏的能量利用率高于交流光伏能量
+
+**优缺点**
+
+优点:
+- MPPT调节的充电维持功率更高,从而光伏利用率更高
+
+缺点:
+- 当直流光伏满足充电需求是,交流光伏会被限制在较低的功率,此时工作频率较高
+
+:::
+
+**2.离网发电机或V2L接入场景**
+
+:::info 📜总结
+- 离网发电机或V2L场景下,aPower不会放电供载,交流光伏不会接入,所有交流光伏的继电器都被切断。
+- 发电机或V2L都只会处于放电状态,当负载较小时可以给电池充电,维持原有逻辑不变。
+- aPowerS中的直流光伏仅支持本机充电。
+:::
+
+**aPowerS直流光伏仅本机充电算法**
+
+限制目标 $L_{dcpv.i} = L_{sop\_chr.i}$
+
+以上公式仅为算法目标,无法通过简单限制MPPT功率实现,以下将分析为何无法简单实现,以及如何实现此目标。
+
+<ClientOnly>
+  <ExcalidrawView filePath="/assets/Hardware/Power/aPower_S/aPowerS_InnerEnergyFlow.excalidraw" />
+</ClientOnly>
+
+如上图所示,aPower请求充放电功率的执行端实际是在靠近电池端的DC/DC,在没有请求充电功率时,MPPT的输出功率将沿着AC/DC从交流端输出,这将不满足aPower不会放电的目标。
+
+所以在电池没有实际输入功率时,MPPT将不会放开功率限制值。
+
+实际充电算法:
+- $R_{batt.i} = \max(100W, Generator\ or\ V2L\ target\ charging\ power)$ 维持最小100w充电功率,用于触发MPPT功率限制的逐步放开。
+- $L_{dcpv.i} = 
+  \begin{cases} 
+    P_{batt.i}, & P_{batt.i} \le 0 \\
+    0, & P_{batt.i} > 0
+  \end{cases}$ MPPT的限制功率将跟随电池的实际充电功率,保证MPPT输出功率不会超出电池充电功率。
+
+### SOC均流
+
+aPower S 的SOC均流功能与标准的SOC均流功能大同小异,主要差别在于需要考虑直流光伏的能量分配问题。如何来保证SOC的均匀性。
+
+#### 并网 - SOC均流
+
+待补充。。。
+
+#### 离网油机或V2L - SOC均流
+
+待补充。。。
+
+#### 离网无油机或V2L - SOC均流
+
+待补充。。。
+
+### 直流光伏快速关断装置
+
+aPowerS使用的光伏快速关断装置有两种:
+- 外购RSD
+- 自研MCI
+
+#### 外购RSD
+
+目前支持的RSD有两种型号:
+- Tigo: Single Core RSS Transmitter(Transmitter Model) + TS4-A-F(RSD Receiver Model)
+- APsmart: Transmitter-PLC-1P(Transmitter Model) + RSD-S-PLC(RSD Receiver Model)
+
+##### Tigo TS4-A-F
+
+Tigo RSD包含发射器和接收器(RSD模块)两个部分,发射器用于与RSD模块通讯,通讯方式为PLC(Power Line Communication)。
+
+**发射器**
+
+Tigo RSS(快速关机系统)发射器与Tigo经UL认证的消防安全解决方案--包括TS4-A-F(附加装置)、TS4-A-2F(两个模块的附加装置)搭配使用时,完善了经济高效的快速关机系统架构。RSS发射器通过PLC(电力线通信)向TS4-F单元发送信号,以便在通电时保持光伏组件的连接。当RSS发射器关闭时,TS4-F单元自动进入快速关机模式,并在RSS发射器恢复供电时恢复能源生产。采用纯信号技术的RSS发射机可将多个RSS发射机连接在一起,使一个协调的保持信号进入阵列,以最大限度地提高信号的完整性,即使在大型和复杂的太阳能装置中。该解决方案符合NEC 2014、2017和2020年690.12利用电力线通信(PLC)的快速关闭规范。可提供用于多发射器站点的纯信号技术,以套件、DIN导轨或PCBA的形式集成到逆变器中。
+
+功能
+- 用于Tigo TS4-A-F和TS4-A-2F的快速关机启动装置
+- 采用纯信号技术的RSS发射器可以在大型商业应用中把多个RSS发射器连接在一起,实现一个协调的信号,以减少串扰或信号干扰
+
+特点
+- 多厂商UL认证解决方案,满足NEC 690.12 2017/2020规范要求
+- 模块级停用,自动或手动关闭
+- 安装简单,无需调试过程
+- 与最大的UL认证的住宅和商业逆变器网络兼容
+- 集成到许多逆变器中,实现与Tigo TS4-A-F和TS4-A-2F的即插即用安装
+- 新产品:可使用纯信号技术,以简化具有多个发射器的站点的设计和安装
+
+**接收器(RSD模块)**
+
+TS4-A-F在1个模块对1个TS4的配置中实现了经济有效的快速关机功能。TS4-A-F通过了IEC和UL认证,可被全球接受。TS4-A-F通过了UL光伏快速关断系统(PVRSS)认证,数百台逆变器符合NEC 2014、2017和2020的快速关断要求。许多逆变器都集成了RSS发射器,它通过PLC与TS4-A-F进行通信,实现了即插即用的安装。
+
+功能
+- 快速安全关断
+
+特点
+- 每通道高达700W
+- 通过IEC和UL认证
+- 符合美国NEC快速关机安全要求
+- 通过UL PVRSS认证,拥有最大的逆变器网络
+- 16-80V,最高25A(每通道)
+- MC4(标准)连接器
+- 卡在模块框架上,便于安装
+- 不需要接地线
+- PLC通信
+- 25年保修
+
+配置
+- 每个TS4有一个模块
+- 需要配合RSS发射器使用
+
+**RSS信号检测器**
+
+RSS信号检测器用于测试PLC快速关断信号。
+
+::: details RSS信号检测器规格书
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/Tigo/600eea227a66f17b79f59822_RSS Signal Detector.pdf" />
+</ClientOnly>
+:::
+
+**相关资料文档**
+
+::: details RSS发射器规格书
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/Tigo/680fae5df8b93aad651a7e39_002-00146-00 1.4 Datasheet RSS w PCBA 20250411 - EN.pdf" />
+</ClientOnly>
+:::
+
+::: details RSD模块规格书
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/Tigo/680acdffe9d05260ee9e8fd0_002-00222-00 1.0 Datasheet TS4-A-F (725W) 20250418 - EN.pdf" />
+</ClientOnly>
+:::
+
+::: details RSD快速入门指南
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/Tigo/68599f186ce7de70e0577ce0_002-00157-00 1.3 QSG TS4-A-F2F w RSS Transmitter 20250610 - EN.pdf" />
+</ClientOnly>
+:::
+
+::: details RSD安装手册
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/Tigo/66f439cbddd5c47ce3fd53db_002-00118-00 4.3 IO&M RSS Transmitter Installation 20240805.pdf" />
+</ClientOnly>
+:::
+
+独有的纯信号技术(Pure Signal Technology),解决使用多个发射器导致串扰的问题。
+
+::: details 纯信号技术(Pure Signal Technology)介绍
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/Tigo/63c595c30a14e6d8c7324c55_Tigo Energy - Application Note - Pure Signal Technology - 002-00121-00 - REV 1.0 - 20221118.pdf" />
+</ClientOnly>
+:::
+
+##### APsmart RSD-S-PLC
+
+APsmart 由昱能科技的开发人员打造,提供先进的光伏组件快速关断装置(RSD-S-PLC 和 RSD-D),适用于任何新建或现有的组串式或中央逆变器系统,并符合美国 NEC 2017&2020 690.12 快速关断要求。凭借昱能科技在组件级电力电子领域久经考验的专业知识,APsmart 解决方案采用带有内部 IP 的 ASIC 芯片,并在系统级应用中与 TI 芯片集成。
+
+**APsmart RSD-S-PLC 产品特点**
+
+- 符合 NEC 2017 和 2020(690.12) 要求
+- 符合 SunSpec 要求
+- RSD ASIC芯片采用APsystems的IP设计,具有冗余拓扑结构
+- 高度集成的SoC
+- PCB 上的电气元件更少
+- 小巧轻便,可选粘贴式或机架式安装
+- 得益于 8V 的低启动电压,模块每天可多运行 15~30 分钟
+- 低功耗
+- RSD-S-PLC 噪声频段与 AFCI 噪声隔离,避免误跳闸
+
+**相关资料文档**
+
+::: details APsmart RSD-S-PLC 规格书
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/APsmart/4301615202_RSD-S-PLC-Datasheet_Rev3.1_2025-02-12.pdf" />
+</ClientOnly>
+:::
+
+::: details APsmart Transmitter-PLC-1P 规格书
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/APsmart/4302915212_Transmitter-PLC-1P-datasheet_Rev1.8_2023-10-07.pdf" />
+</ClientOnly>
+:::
+
+::: details APsmart RSD-S-PLC 快速安装手册
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/APsmart/4301615331_RSD-S-PLC-Quick-Installation-Guide_Rev3.1_2025-04-02-1.pdf" />
+</ClientOnly>
+:::
+
+::: details APsmart RSD-S-PLC 用户手册
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/APsmart/RSD-S-PLCTransmitter-User-Manual_NA_EN_Rev4.1_2025-05-23.pdf" />
+</ClientOnly>
+:::
+
+::: details APsmart RSD 应用手册
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/APsmart/Rapid-Shutdown-Devices-Application-202305.pdf" />
+</ClientOnly>
+:::
+
+::: details APsmart RSD 技术培训手册
+<ClientOnly>
+  <PdfViewer file="/assets/Hardware/Power/aPower_S/RSD/APsmart/APsmart-RSD-Tech-Training-_SMA.pdf" />
+</ClientOnly>
+:::
+
+#### 自研MCI
+
+待补充。。。
+
+#### 其他说明
+
+**RSD/MCI断开方式**
+
+| 事件 | 断开类型 | 说明 |
+| ---- | ---- | ---- |
+| RSD/MCI关断开关 | 主动断开 | |
+| EPO | 主动断开 | |
+| aPowerS关机 | 主动断开 | |
+| 母线继电器故障 | 故障断开 | |
+| 逆变输出继电器故障 | 故障断开 | |
+| 电池漏电保护故障 | 故障断开 | |
+| MPPT进入休眠 | 软件逻辑断开 | |

+ 5 - 0
client/docs/Other/HostSideSoftware.md

@@ -0,0 +1,5 @@
+---
+title: 上位机软件(Host-side software)
+editLink: false
+---
+# 上位机软件(Host-side software)

+ 5 - 0
client/docs/Software/AddressAssignment.md

@@ -0,0 +1,5 @@
+---
+title: 设备编址
+editLink: false
+---
+# 设备编址

+ 39 - 0
client/docs/Software/EnergyStatistics.md

@@ -64,3 +64,42 @@ PV采集使用的智能电表采集,PV meter用于采集光伏实时功率和
 <ClientOnly>
   <ExcalidrawView filePath="/assets/Software/EnergyStatistics/aGate1.0_1.1_GenCtrlPartial.excalidraw" />
 </ClientOnly>
+
+## 云平台能量数据展示
+
+参考:https://lhrq9x2skr.feishu.cn/wiki/WWMBwYg04i6VAwkdhqjctEdanGb
+
+### 家庭负载统计
+
+**界面UI**
+
+展示家庭负载的来源和供载占比
+
+[AppHomeLoad](/assets/Software/EnergyStatistics/AppHomeLoad.PNG)
+
+**数据源**
+
+APP接口:terminal/countLoad
+
+数据来源:设备201报文,43-46号字段
+
+| 名称 | 字段 | 类型 | 说明 |
+| --- | --- | --- | --- |
+| 太阳能供载量 | kwhSolarLoad | int | 单位 Wh |
+| 电网供载量 | kwhGridLoad | int | 单位 Wh |
+| FHP供载量 | kwhFhpLoad | int | 单位 Wh |
+| 发电机供载量 | kwhGenLoad | int | 单位 Wh |
+
+APP接口:terminal/electricStatistics
+
+数据来源:设备201报文,16-22号字段
+
+| 名称 | 字段 | 类型 | 说明 |
+| --- | --- | --- | --- |
+| 市电口输入电量 | kwh_uti_in | float |
+| 市电口输出电量 | kwh_uti_out | float |
+| 太阳能供电电量 | 
+| 发电机供电电量 |
+| FHP放电电量 |
+| FHP充电电量 |
+| 负荷用电量 |

+ 5 - 0
client/docs/Software/ParamSync.md

@@ -0,0 +1,5 @@
+---
+title: 参数同步
+editLink: false
+---
+# 参数同步

+ 1165 - 0
client/docs/System/AlarmTable.md

@@ -0,0 +1,1165 @@
+---
+title: 告警表
+editLink: false
+---
+# 告警表
+
+## 系统告警
+
+### 1001 电网继电器常闭故障
+
+### 1002 电网继电器常开故障
+
+### 1003 油机继电器常闭故障
+
+### 1004 油机继电器常开故障
+
+### 1005 EPO紧急停机
+
+### 1006 油机故障
+
+### 1007 备电故障
+
+### 1008 FHP总功率故障
+
+### 1009 DSP与ARM双向通信故障
+
+### 100A 光伏电表通信故障
+
+### 100B 市电电表通信故障
+
+### 100C 扩展电表通信故障
+
+### 100D 外部 485 通信故障
+
+### 100E CAN通信综合故障
+
+### 100F 备电母线电压异常
+
+### 1010 市电电表CT异常
+
+### 1011 系统电量低于安全保护电量
+
+### 1012 光伏继电器故障
+
+### 1016 主配电盘电流100%超限
+
+### 1017 BusBar过流故障
+
+### 1018 远端负载侧光伏继电器1故障
+
+### 1019 远端负载侧光伏继电器2故障
+
+### 101A 远端负载侧光伏电表1通信故障
+
+### 101B 远端负载侧光伏电表2通信故障
+
+### 101C 远端电网侧光伏电表通信故障
+
+### 101D 三相光伏电表通讯故障
+
+### 101E 三相市电电表通讯故障
+
+### 101F meterKit电表通讯故障
+
+### 1020 发电机启动异常
+
+### 1021 发电机输出异常
+
+### 1022 发电机输出过载
+
+### 1023 发电机停止失败
+
+### 1024 发电机CT故障
+
+### 1025 aPower空开过载
+
+### 1026 黑启动板故障
+
+### 1027 智能负载继电器1常开故障
+
+### 1028 智能负载继电器1常闭故障
+
+### 1029 硬限制保护
+
+### 102A 逆变开机异常
+
+### 102B 智能负载继电器2常闭故障
+
+### 102C 智能负载继电器3常闭故障
+
+### 102D V2L输出过载告警
+
+### 102E V2L输出过载退出告警
+
+### 102F MeterKit通信故障
+
+### 1030 PE硬件版本不兼容
+
+### 1032 近端光伏CT断开
+
+### 1033 apbox1光伏CT断开
+
+### 1034 apbox2光伏CT断开
+
+### 1035 NEM光伏电表CT断开
+
+### 1036 meterKit电表CT断开
+
+### 1037 市电电表CT测量不准
+
+### 1038 近端光伏CT测量不准
+
+### 1039 apbox1光伏CT测量不准
+
+### 103A apbox2光伏CT测量不准
+
+### 103B NEM光伏电表CT测量不准
+
+### 103C meterKit电表CT测量不准
+
+### 103D 近端光伏CT反向
+
+### 103E apbox1光伏CT反向
+
+### 103F apbox2光伏CT反向
+
+### 1040 NEM光伏CT反向
+
+### 1041 meterkit光伏CT反向
+
+### 1042 市电电表CT相位相反
+
+### 1043 市电电表L1 CT断开
+
+### 1044 市电电表L2 CT断开
+
+### 1045 市电电表CT全断开
+
+### 1046 市电电表L1 CT反向
+
+### 1047 市电电表L2 CT反向
+
+### 1048 市电电表CT全反向
+
+### 1049 主配电盘光伏1 CT反向
+
+### 1050 主配电盘光伏1 CT断开
+
+### 1051 主配电盘光伏2 CT反向
+
+### 1052 主配电盘光伏2 CT断开
+
+## EMS告警
+
+### 2001 云通信连接故障
+
+### 2002 环境温度传感器故障
+
+### 2003 CAN 硬线断线故障
+
+### 2004 aPower#1 通信异常
+
+### 2005 aPower#2 通信异常
+
+### 2006 aPower#3 通信异常
+
+### 2007 aPower#4 通信异常
+
+### 2008 aPower#5 通信异常
+
+### 2009 aPower#6 通信异常
+
+### 200A aPower#7 通信异常
+
+### 200B aPower#8 通信异常
+
+### 200C aPower#9 通信异常
+
+### 200D aPower#10 通信异常
+
+### 200E aPower#11 通信异常
+
+### 200F aPower#12 通信异常
+
+### 2010 aPower#13 通信异常
+
+### 2011 aPower#14 通信异常
+
+### 2012 aPower#15 通信异常
+
+### 2013 aPower#16 通信异常
+
+### 2014 aPower#17 通信异常
+
+### 2015 aPower#18 通信异常
+
+### 2016 aPower#19 通信异常
+
+### 2017 aPower#20 通信异常
+
+### 2018 从DSP参数同步错误
+
+### 2019 PE参数同步错误
+
+### 2100 CPU使用率过高
+
+### 2101 CPU温度过高
+
+### 2102 内存使用率过高
+
+### 2103 硬盘使用率过高
+
+### 2104 4G模块未接
+
+### 2105 SIM卡未插入
+
+### 2106 Wifi模块未接
+
+### 2107 Wifi模块异常
+
+### 2108 网关地址冲突
+
+### 2109 PowerLink连续升级失败1次
+
+### 210A PowerLink连续升级失败2次
+
+### 210B PowerLink连续升级失败3次(以上)
+
+### 3001 市电故障
+
+### 3002 市电一级过频保护
+
+### 3003 市电一级欠频保护
+
+### 3004 市电二级过频保护
+
+### 3005 市电二级欠频保护
+
+### 3006 市电一级过压保护
+
+### 3007 市电一级欠压保护
+
+### 3008 市电二级过压保护
+
+### 3009 市电二级欠压保护
+
+### 300A 市电快速瞬时值一级低压保护
+
+### 300B 市电快速瞬时值二级低压保护
+
+### 300C 市电快速瞬时值过压保护
+
+### 300D 市电过压十分钟保护
+
+### 300E 市电三级欠压
+
+### 300F 市电不平衡保护
+
+### 3010 市电锁相异常
+
+### 3011 市电快检故障
+
+### 3012 市电包络检测掉电
+
+### 3013 
+
+### 3014 市电幅值快检故障
+
+### 3015 油机继电器反馈触点异常
+
+### 3016 市电切换异常
+
+### 3017 市电直流分量快检故障
+
+### 3018 PE在线台数过多
+
+### 3019 PE在线台数有掉线
+
+### 301A 发电机快检异常
+
+### 301B 发电机锁相失败
+
+### 301C 发电机输出不稳
+
+### 301D aPower脱离发电机系统
+
+### 301E 黑启动板故障
+
+### 301F DRM0状态
+
+### 3020 发电机故障退出
+
+### 3021 DSP外环CAN通信故障
+
+### 3022 从DSP控制市电继电器反馈触点开路故障
+
+### 3023 光伏继电器异常断开
+
+### 3024 市电相制异常
+
+### 3025 市电相序异常
+
+### 3031 地区设置错误
+
+### 3034 EMS控制市电继电器反馈触点短路故障
+
+### 3035 市电继电器初始短路故障
+
+### 3036 市电电压反向异常
+
+### 3037 EMS控制市电继电器超时
+
+### 3038 V2L输出不稳
+
+### 3039 V2L输出故障退出
+
+### 303A IBG硬件版本识别故障
+
+### 303B 从dsp CLA 通信故障
+
+### 303C 从DSP故障录波功能异常关闭
+
+### 303D 市电断线故障
+
+### 303E 24V掉电检测
+
+### 303F MSA自动识别错误
+
+### 3040 CND急停
+
+### 3041 CND内部过温
+
+### 3042 CND继电器驱动电容容量不足
+
+### 3043 CND防雷器故障
+
+### 3044 EQB驱动电容容量不足
+
+### 3045 MSA类型设置不匹配
+
+### 3046 RSD按键生效
+
+### 3047 1号Ahub通信异常
+
+### 3048 2号Ahub通信异常
+
+### 3049 3号Ahub通信异常
+
+### 304A 4号Ahub通信异常
+
+### 304B V2L电压类型与APP设置不匹配
+
+### 710B 接入口3到4 A相局部过流
+
+### 710C 接入口3到4 B相局部过流
+
+### 710D 接入口2到3 A相局部过流
+
+### 710E 接入口2到3 B相局部过流
+
+### 7140 接入口1 A相过流5次锁定
+
+### 7141 接入口1 B相过流5次锁定
+
+### 7142 接入口2 A相过流5次锁定
+
+### 7143 接入口2 B相过流5次锁定
+
+### 7144 接入口3 A相过流5次锁定
+
+### 7145 接入口3 B相过流5次锁定
+
+### 7146 接入口4 A相过流5次锁定
+
+### 7147 接入口4 B相过流5次锁定
+
+### 7150 接入口4 A相CT开路
+
+### 7151 接入口4 B相CT开路
+
+### 7152 接入口4 A相CT短路
+
+### 7153 接入口4 B相CT短路
+
+## PE告警
+
+### 4x01 逆变故障
+
+### 4x02 逆变电压过压保护
+
+### 4x03 逆变电压欠压保护
+
+### 4x04 逆变瞬时值过压保护
+
+### 4x05 逆变电压直流分量过大保护
+
+### 4x06 逆变短路保护
+
+### 4x07 逆变过载保护
+
+### 4x08 逆变限流时间过长保护
+
+### 4x09 逆变过温保护
+
+### 4x0A 逆变硬件过流保护
+
+### 4x0B 逆变瞬时值过流保护
+
+### 4x0C 逆变电流直流分量过大保护
+
+### 4x0D 逆变自锁保护
+
+### 4x0E 逆变母线预充电故障
+
+### 4x0F PE 输出继电器短路故障
+
+### 4x10 PE 输出继电器开路故障
+
+### 4x11 输出故障
+
+### 4x12 输出回路异常
+
+### 4x13 输出过载保护
+
+### 4x14 输出过载告警
+
+### 4x15 输出继电器异常
+
+### 4x16 105%过载保护
+
+### 4x17 120%过载保护
+
+### 4x18 160%过载保护
+
+### 4x19 200%过载保护
+
+### 4x1A RCD过载保护
+
+### 4x1B 输出过载
+
+### 4x1C 输出过载20次锁定
+
+### 4x1D 半波过载
+
+### 4x21 并联线掉线保护
+
+### 4x22 并机无冗余
+
+### 4x23 双总线系统离线
+
+### 4x24 本地关机
+
+### 4x25 与IBG_EMU通讯故障
+
+### 4x26 零线开路
+
+### 4x27 系统环境温度过高
+
+### 4x28 PE_IBG回路异常
+
+### 4x29 PE高速can通讯异常
+
+### 4x2A PE光伏超配
+
+### 4x2B 离网光伏充电超时
+
+### 4x2C INV侧V版本不兼容故障
+
+### 4x2D CPU2心跳回传故障
+
+### 4x2E 市电实际相电压过压告警
+
+### 4x2F 辅源继电器即将断开
+
+### 4x31 母线故障
+
+### 4x32 母线瞬时过压
+
+### 4x33 母线瞬时欠压(不同输入电压不同)
+
+### 4x34 母线低压慢检
+
+### 4x35 母线过压慢检
+
+### 4x36 母线不平衡
+
+### 4x37 母线硬件故障
+
+### 4x38 母线跌落快检
+
+### 4x39 母线低压慢检
+
+### 4x3A INV侧母线冲击过压故障
+
+### 4x41 逆变相 A 短路
+
+### 4x42 逆变相 B 短路
+
+### 4x43 逆变相AB短路
+
+### 4x44 
+
+### 4x45 
+
+### 4x46 
+
+### 4x47 
+
+### 4x48 逆变散热过温
+
+### 4x49 逆变IGBT过温
+
+### 4x4A 前级锁逆变
+
+### 4x4B 逆变锁相异常
+
+### 4x4C PE相序异常
+
+### 4x4D DC/DC故障关逆变
+
+### 4x4E 协议不匹配故障
+
+### 4x4F BMS低压补电状态
+
+### 4x50 系统地址冲突故障
+
+### 4x51 BuckBoost 故障综合
+
+### 4x52 总母线过压快检故障
+
+### 4x53 正母线过压快检故障
+
+### 4x54 负母线过压快检故障
+
+### 4x55 总母线过压慢检故障
+
+### 4x56 正母线过压慢检故障
+
+### 4x57 负母线过压慢检故障
+
+### 4x58 正母线欠压慢检故障
+
+### 4x59 负母线欠压慢检故障
+
+### 4x5A 母线过压硬件故障
+
+### 4x5B 母线缓冲完成
+
+### 4x5C 
+
+### 4x5D 
+
+### 4x5E BuckBoost 放电过流快检故障
+
+### 4x5F BuckBoost 充电过流快检故障
+
+### 4x60 BuckBoost 放电过流慢检故障
+
+### 4x61 BuckBoost 充电过流慢检故障
+
+### 4x62 
+
+### 4x63 母线电压稳定标志
+
+### 4x64 Midbus 硬件过压故障
+
+### 4x65 功率器件不兼容故障
+
+### 4x66 总母线欠压慢检故障
+
+### 4x67 BuckBoost限流超时故障
+
+### 4x68 BMS-SOP限功率保护
+
+### 4x69 DC侧母线冲击过压故障
+
+### 4x70 
+
+### 4x71 LLC 故障综合
+
+### 4x72 LLC 母线过压快检故障
+
+### 4x73 LLC 母线过压慢检故障
+
+### 4x74 LLC 母线低压快检故障
+
+### 4x75 LLC 母线低压慢检故障
+
+### 4x76 LLC 母线正向缓冲完成
+
+### 4x77 LLC 母线 Buck 缓冲完成
+
+### 4x78 LLC 硬件过流故障
+
+### 4x79 LLC 母线高压驱动封锁
+
+### 4x7A LLC 电池高压驱动封锁
+
+### 4x81 电池过压保护
+
+### 4x82 电池低压保护
+
+### 4x83 电池过压告警
+
+### 4x84 电池低压告警
+
+### 4x85 电池未接
+
+### 4x92 DC 变换过温保护
+
+### 4x93 辅源 12V 异常保护
+
+### 4x94 BMS 通信异常
+
+### 4x95 FPGA 通信异常
+
+### 4x96 逆变故障
+
+### 4x97 本地关机
+
+### 4x98 三次锁定故障
+
+### 4x99 风机故障告警
+
+### 4x9A 系统EPO故障
+
+### 4x9B BMS综合故障
+
+### 4x9C 模块内部过温保护
+
+### 4x9D PE温度传感器断线故障
+
+### 4x9E DC侧V版本不兼容故障
+
+### 4x9F CPU1心跳回传故障
+
+### 4xA0 版本检测故障
+
+### 4xB1 FPGA心跳故障
+
+### 4xC0 系统自检
+
+### 4xE0 PE故障录波功能异常关闭
+
+### 4xE1 PE与agate版本不兼容
+
+### 4xE2 PE向油机放电保护故障
+
+### 4xE3 PE和MPPT的通信协议版本不匹配
+
+### 4xE4 PE和MPPT的SCI通信异常
+
+### 4xE5 aPower(非常规接线)黑启动关机
+
+### 4xE6 逐波限流过载故障
+
+### 4xE7 MPPT老化期间功率异常
+
+### 4xE8 纯并机版本不匹配
+
+### 4xE9 混合并机版本不匹配
+
+### 4xF0
+
+### 4xF1 漏电流突变30mA过大故障
+
+### 4xF2 漏电流突变60mA过大故障
+
+### 4xF3 漏电流突变150mA过大故障
+
+### 4xF4 漏电流持续300mA过大故障
+
+### 4xF5 漏电流自检失败
+
+### 4xF6 漏电流锁定故障
+
+### 4xF7 系统自检中
+
+## BMS告警
+
+### 6x01 电池保护
+
+### 6x02 SOC过低
+
+### 6x03 充电过流
+
+### 6x04 充电冲击电流保护(硬件触发阈值)
+
+### 6x05 风机充电过流(硬件触发阈值)
+
+### 6x06 放电过流
+
+### 6x07 放电短路过流保护(硬件触发阈值)
+
+### 6x08 风机放电过流(硬件触发阈值)
+
+### 6x09 单体过压
+
+### 6x0A 单体欠压
+
+### 6x0B 电池组过压
+
+### 6x0C 电池组欠压
+
+### 6x0D 充电高温
+
+### 6x0E 充电低温
+
+### 6x0F 非充高温
+
+### 6x10 非充低温
+
+### 6x11 环境高温
+
+### 6x12 环境低温
+
+### 6x13 MOS 高温
+
+### 6x14 单体压差大
+
+### 6x15 单体温差大
+
+### 6x16 单体电压断线
+
+### 6x17 单体温度断线/短路
+
+### 6x18 锁定故障
+
+### 6x19 硬件自检故障
+
+### 6x1A 总压异常
+
+### 6x1B 预充失败
+
+### 6x1C MOS 管短路
+
+### 6x1D 补电口过流
+
+### 6x1E PE 供电口过流
+
+### 6x1F PE 端反压
+
+### 6x20 电池温度极高
+
+### 6x21 直流绝缘漏电保护
+
+### 6x22 过充电失效保护
+
+### 6x23 过放电失效保护
+
+### 6x24 PE控制器失效保护
+
+### 6x25 与AFE通信故障
+
+### 6x26 加热板通信故障
+
+### 6x27 均衡板通信故障
+
+### 6x28 加热板故障
+
+### 6x29 均衡板故障
+
+### 6x2A SOC误差过大
+
+### 6x2B SOH 过低
+
+### 6x2C 温度异常保护
+
+### 6x2D AFE_SPI故障
+
+### 6x2E 加热膜过温故障
+
+### 6x2F 加热膜温度断线故障
+
+### 6x30 风扇故障
+
+### 6x31 交流辅源供电异常
+
+### 6x32 BMS地址冲突检测故障
+
+### 6x33 电芯信息录入异常
+
+### 6x34 充电回路异常
+
+## aHub告警
+
+### 7x01 接入口1A相过流
+
+### 7x02 接入口1B相过流
+
+### 7x03 接入口2A相过流
+
+### 7x04 接入口2B相过流
+
+### 7x05 接入口3A相过流
+
+### 7x06 接入口3B相过流
+
+### 7x07 接入口4A相过流
+
+### 7x08 接入口4B相过流
+
+### 7x09 备电主支路A相过流
+
+### 7x0A 备电主支路B相过流
+
+### 7x0B 
+
+### 7x0C 
+
+### 7x0D 
+
+### 7x0E 
+
+### 7x0F 
+
+### 7x10 
+
+### 7x11 接入口1 A相继电器常开故障
+
+### 7x12 接入口1 B相继电器常开故障
+
+### 7x13 接入口2 A相继电器常开故障
+
+### 7x14 接入口2 B相继电器常开故障
+
+### 7x15 接入口3 A相继电器常开故障
+
+### 7x16 接入口3 B相继电器常开故障
+
+### 7x17 接入口4 A相继电器常开故障
+
+### 7x18 接入口4 B相继电器常开故障
+
+### 7x19 
+
+### 7x1A 
+
+### 7x1B 
+
+### 7x1C 
+
+### 7x1D 
+
+### 7x1E 
+
+### 7x1F 
+
+### 7x20 
+
+### 7x21 接入口1 A相继电器常闭故障
+
+### 7x22 接入口1 B相继电器常闭故障
+
+### 7x23 接入口2 A相继电器常闭故障
+
+### 7x24 接入口2 B相继电器常闭故障
+
+### 7x25 接入口3 A相继电器常闭故障
+
+### 7x26 接入口3 B相继电器常闭故障
+
+### 7x27 接入口4 A相继电器常闭故障
+
+### 7x28 接入口4 B相继电器常闭故障
+
+### 7x29 
+
+### 7x2A 
+
+### 7x2B 
+
+### 7x2C 
+
+### 7x2D 
+
+### 7x2E 
+
+### 7x2F 
+
+### 7x30 
+
+### 7x31 
+
+### 7x32 硬件版本号匹配错误
+
+### 7x33 与从DSP心跳故障
+
+### 7x34 与EMS心跳故障
+
+### 7x35 电表通信故障
+
+### 7x36 CLA通信故障
+
+### 7x37 故障录波功能异常关闭
+
+### 7x38 外部FLASH异常保护
+
+### 7x39 环境温度过温保护
+
+### 7x3A 铜排温度过温保护
+
+### 7x3B 环境温度传感器断线保护
+
+### 7x3C 铜排温度传感器断线保护
+
+### 7x3D 
+
+### 7x3E 光伏继电器异常断开
+
+### 777B PowerLink故障
+
+## MPPT告警
+
+### 5x01 光伏支路1过压
+
+### 5x02 光伏支路1欠压
+
+### 5x03 光伏支路1过流
+
+### 5x04 光伏支路1长时间逐波限流
+
+### 5x05 光伏支路1逐波限流锁定
+
+### 5x06 光伏支路1反接故障
+
+### 5x07 光伏支路1电流反向
+
+### 5x08 光伏支路1电流零漂过大
+
+### 5x09 光伏支路1的RSD断开失败
+
+### 5x0A 光伏支路1的拉弧故障
+
+### 5x0B 光伏支路1的AFCI自检异常
+
+### 5x0C 光伏支路1过压2级
+
+### 5x0D 光伏支路1弱光
+
+### 5x0E 光伏支路1的MCI常闭
+
+### 5x0F 
+
+### 5x10 
+
+### 5x11 光伏支路2过压
+
+### 5x12 光伏支路2欠压
+
+### 5x13 光伏支路2过流
+
+### 5x14 光伏支路2长时间逐波限流
+
+### 5x15 光伏支路2逐波限流锁定
+
+### 5x16 光伏支路2反接故障
+
+### 5x17 光伏支路2电流反向
+
+### 5x18 光伏支路2电流零漂过大
+
+### 5x19 光伏支路2的RSD断开失败
+
+### 5x1A 光伏支路2的拉弧故障
+
+### 5x1B 光伏支路2的AFCI自检异常
+
+### 5x1C 光伏支路2过压2级
+
+### 5x1D 光伏支路2弱光
+
+### 5x1E 光伏支路2的MCI常闭
+
+### 5x1F 
+
+### 5x20 
+
+### 5x21 光伏支路3过压
+
+### 5x22 光伏支路3欠压
+
+### 5x23 光伏支路3过流
+
+### 5x24 光伏支路3长时间逐波限流
+
+### 5x25 光伏支路3逐波限流锁定
+
+### 5x26 光伏支路3反接故障
+
+### 5x27 光伏支路3电流反向
+
+### 5x28 光伏支路3电流零漂过大
+
+### 5x29 光伏支路3的RSD断开失败
+
+### 5x2A 光伏支路3的拉弧故障
+
+### 5x2B 光伏支路3的AFCI自检异常
+
+### 5x2C 光伏支路3过压2级
+
+### 5x2D 光伏支路3弱光
+
+### 5x2E 光伏支路3的MCI常闭
+
+### 5x2F 
+
+### 5x30 
+
+### 5x31 光伏支路4过压
+
+### 5x32 光伏支路4欠压
+
+### 5x33 光伏支路4过流
+
+### 5x34 光伏支路4长时间逐波限流
+
+### 5x35 光伏支路4逐波限流锁定
+
+### 5x36 光伏支路4反接故障
+
+### 5x37 光伏支路4电流反向
+
+### 5x38 光伏支路4电流零漂过大
+
+### 5x39 光伏支路4的RSD断开失败
+
+### 5x3A 光伏支路4的拉弧故障
+
+### 5x3B 光伏支路4的AFCI自检异常
+
+### 5x3C 光伏支路4过压2级
+
+### 5x3D 光伏支路4弱光
+
+### 5x3E 光伏支路4的MCI常闭
+
+### 5x3F 
+
+### 5x40 
+
+### 5x41 光伏功率超限
+
+### 5x42 光伏功率过低
+
+### 5x43 绝缘阻抗过低故障
+
+### 5x44 拉弧锁定故障
+
+### 5x45 AFCI自检异常
+
+### 5x46 MPPT功率超限2级
+
+### 5x47 RSD电压异常
+
+### 5x48 
+
+### 5x49 MPPT并联检测异常
+
+### 5x4A 
+
+### 5x4B 
+
+### 5x4C 
+
+### 5x4D 
+
+### 5x4E 
+
+### 5x4F 
+
+### 5x50 
+
+### 5x51 直流母线高压封波
+
+### 5x52 PE侧母线过压
+
+### 5x53 PE侧母线欠压
+
+### 5x54 PV侧母线过压
+
+### 5x55 直流母线电流零漂过大
+
+### 5x56 直流母线预充故障
+
+### 5x57 直流母线过流
+
+### 5x58 直流母线继电器开路
+
+### 5x59 直流母线继电器短路
+
+### 5x5A 直流母线继电器自检故障
+
+### 5x5B 
+
+### 5x5C 
+
+### 5x5D 
+
+### 5x5E 
+
+### 5x5F 
+
+### 5x60 
+
+### 5x61 腔温过高
+
+### 5x62 腔温温度传感器断线
+
+### 5x63 散热器1的温度过高
+
+### 5x64 散热器1的温度传感器断线
+
+### 5x65 散热器2的温度过高
+
+### 5x66 散热器2的温度传感器断线
+
+### 5x67 
+
+### 5x68 
+
+### 5x69 
+
+### 5x6A 
+
+### 5x6B 
+
+### 5x6C 
+
+### 5x6D 
+
+### 5x6E 
+
+### 5x6F 
+
+### 5x71 12V辅源欠压
+
+### 5x72 硬件版本号异常
+
+### 5x73 与AFCI的SCI异常
+
+### 5x74 与PE的SCI异常
+
+### 5x75 与PE的SCI协议不匹配
+
+### 5x76 低速CAN通讯异常
+
+### 5x77 低速CAN协议不匹配
+
+### 5x78 PE-MPPT快速保护
+
+### 5x79 外扩Flash参数存储区失效
+
+### 5x7A 与PE地址不匹配
+
+### 5x7B CLA心跳故障
+
+### 5x7C mppt多次通讯故障锁存
+
+### 5x7D 
+
+### 5x7E 
+
+### 5x7F 

+ 361 - 0
client/docs/System/EventMessage.md

@@ -0,0 +1,361 @@
+---
+title: 事件推送
+editLink: false
+---
+# 事件推送
+
+事件推送功能,由设备端EMS触发,向客户APP进行消息推送的功能。主要用于在某些事件节点上给用户一个提示,以便知晓设备的功能执行情况及一些处理措施。
+
+事件推送表(中文):
+
+| ID | 标题 | 内容 |
+| :-: | :-: | ---- |
+| 1 | 市电停电 | 电网中断了。FHP已经存储了$1kWh,根据过去72小时的最高消耗,大约可以提供$2的备电时长。 |
+| 2 | 市电恢复 | 已恢复至并网工作。 |
+| 3 | 电量低 | FHP电量低 。 |
+| 4 | 电量极低 | FHP电量极低,该设备即将进入休眠状态。 |
+| 5 | 黑启动失败 | FHP系统黑启动失败。 |
+| 6 | EPO停机 | 由于EPO动作,家庭供电被切断。 |
+| 7 | EPO复位 | EPO复位,家庭供电恢复。 |
+| 8 | 发电机接入 | 发电机正常运行,并已接入FHP系统。 |
+| 9 | 发电机退出 | 发电机退出FHP系统。 |
+| 10 | 紧急备电开始 | aGate已收到风暴通知,正在以紧急备用模式为电池充电。 |
+| 11 | 紧急备电结束 | 风暴信息变更,aGate将退出风暴模式,恢复先前的工作模式。 |
+| 12 | 固件升级开始 | FHP系统开始升级。 |
+| 13 | 固件升级结束 | FHP系统升级完成。 |
+| 14 | 系统停止 | FHP进行系统保护。 |
+| 15 | aPower停止 | aPower设备发生故障。 |
+| 16 | 离网过载 | 由于过载导致系统暂时保护。 |
+| 17 | 智能负载断开 | FHP系统电量低于限值,已断开智能负载。 |
+| 18 | 智能负载断开 | FHP系统电量低于限值,已断开智能负载。 |
+| 19 | 智能负载低SOC切断恢复 | |
+| 20 | 离网超发断光伏 | |
+| 21 | 离网恢复光伏 | |
+| 22 | 启动发电机 | |
+| 23 | 停止发电机 | |
+| 24 | 发电机启动异常 | 由于\{0\},导致发电机启动异常 |
+| 25 | 发电机运行异常 | 发电机运行异常,发电机将被关闭。 |
+| 26 | 系统休眠 | FHP系统电量耗尽,进入长时休眠状态。 |
+| 27 | 离网过载预警 | 负载功率超过FHP系统额定功率,即将触发系统保护。 |
+| 28 | 光伏接入尝试 | 发电机输出不稳定,无法对电池充电。系统正在尝试接入光伏充电。 |
+| 29 | 黑启动尝试 | 系统正在进行黑启动尝试。 |
+| 30 | 离网过载锁定 | 频繁触发系统过载保护,系统锁定。 |
+| 31 | 系统电量恢复 | 系统电量已经恢复至20%。 |
+| 32 | 智能线路已充满 | 智能线路已充满,退出定量充电。 |
+| 33 | 发电机演习成功 | 发电机演习成功 |
+| 34 | 发电机演习失败 | 发电机演习失败,可能是由于启动超时或其他异常情况 |
+| 35 | 发电机工作不稳定 | 发电机工作不稳定,aPower可能会进入待机模式 |
+| 36 | 发电机恢复稳定 | 发电机恢复稳定工作状态 |
+| 37 | 进入休眠模式 | 电池设备因线路异常进入休眠状态,请恢复线路后再试 |
+| 38 | V2L接入 | 系统已经接入V2L紧急电源模式,现在已经可以使用您的电动汽车为系统提供供载。请您注意降低家庭负载消耗功率。 |
+| 39 | V2L退出 | 电动汽车供载结束,系统已经退出V2L紧急电源模式。 |
+| 40 | 紧急备电模式退出 | 备电结束,aGate已切换至\{0\}模式。 |
+| 41 | V2L输出过载保护告警 | 您正在使用V2L模式。目前您的电动汽车输出功率已达到额定功率的 80%,请注意负载消耗情况。 |
+| 42 | V2L输出过载切断 | 您正在使用V2L模式。您的电动汽车输出功率已超过额定功率,V2L线路已切断。 |
+| 43 | PCS保护限制光伏 | 主电池板工作电流超过设定值的95%,需要限制光伏。 |
+| 44 | PCS保护切断智能负载 | 主电池板工作电流超过设定值的 100%,$1已被切断。 |
+| 45 | V2L启动异常 | 由于\{0\},导致V2L启动异常 |
+| 46 | - | - |
+| 47 | - | - |
+| 48 | PCS保护调节电池功率 | 主电池板工作电流超过设定值的 90%,需要调节电池功率。 |
+| 49 | 退出PCS保护调节电池 | 主面板工作电流降低到设定值的 85%,退出电池功率调节。 |
+| 50 | 退出PCS保护,恢复光伏 | 主面板工作电流降低到设定值的 85%,恢复光伏。 |
+| 51 | 退出PCS保护,恢复智能负载 | 由于主面板工作电流降至设定值的 80%,$1已恢复。 |
+| 1401 | 系统暂停 | FHP暂时保护,请等待系统尝试恢复。 |
+| 1402 | 系统停止 | FHP进行系统保护。 |
+| 1403 | 系统异常 | 系统检测异常。 |
+
+事件推送表(英文):
+
+| ID | Title | Content |
+| :-: | :-: | ---- |
+| 1 | Grid Outage | There is a grid outage. aGate has stored $1kWh for an estimated $2 of backup based on the highest consumption in the past 72h. |
+| 2 | Grid restored | Grid power has been restored. |
+| 3 | Low SOC | aGate battery storage is at SOC lower limit. |
+| 4 | Extremely low SOC | The aGate will enter sleep mode as the stored energy is almost depleted. |
+| 5 | Black start failure | The aGate failed to black start. |
+| 6 | EPO downtime | The home is powered off due to EPO activation. |
+| 7 | EPO replaced | The EPO has been reset your home is powered. |
+| 8 | Generator access | The generator is connected and supplying the home. |
+| 9 | Generator exit | Generator has been turned off. |
+| 10 | Emergency backup start | The aGate has received a storm notification and is charging the battery in emergency backup mode. |
+| 11 | Emergency backup end | Storm information has changed. The aGate will be out of storm mode, and resume the previous operating mode. |
+| 12 | Firmware upgrade | Your aGate is upgrading. |
+| 13 | Firmware upgrade completed | Your aGate upgrade is completed. |
+| 14 | aGate shutdown | Your aGate shut down for self-protection. |
+| 15 | aPower failure | There is an aPower malfunction. |
+| 16 | System overloading | Your aGate temporarily shut down due to an overload. |
+| 17 | Smart Circuits disconnected | The Smart Circuits have been disconnected as the battery SOC battery is below the set threshold. |
+| 18 | Smart Circuits disconnected | The Smart Circuits have been disconnected as the battery SOC battery is below the set threshold. |
+| 19 | Smart circuit reconnected | |
+| 20 | Solar disconnected | |
+| 21 | Solar reconnected | |
+| 22 | Generator start | |
+| 23 | Generator stop | |
+| 24 | Generator start abnormality | Generator start abnormality due to \{0\}. |
+| 25 | Generator abnormality | Your aGate is powered off due to battery depletion. |
+| 26 | System power-off | Your aGate is powered off due to battery depletion. |
+| 27 | Off-grid overload warning | Your aGate over-protection is about to be triggered, as your loads are overloading the battery. |
+| 28 | Solar attempt | The generator output is unstable and cannot recharge the battery. The aGate is attempting to charge the battery from solar. |
+| 29 | Black startup attempt | Your aGate is attempting a black start. |
+| 30 | aGate shutdown due to overload | The aGate shut down due to frequent overload protection. |
+| 31 | Battery power recovery | FHP battery has been recharged to SOC 20%. |
+| 32 | The load on the smart circuit is fully charged | The load on the smart circuit is full, the quantitative charging will end. |
+| 33 | Generator exercise success | Generator exercise success. |
+| 34 | Generator exercise fail | Generator exercise fail, possibly due to startup timeout or other abnormal conditions. |
+| 35 | Generator instability | The generator is unstable and the aPower(s) may enter standby mode. |
+| 36 | Generator stabilization | The generator returned to stable operation. |
+| 37 | Enter hibernation mode | The battery device went into hibernation mode due to a circuit abnormality. Please restore the circuit and try again. |
+| 38 | V2L mode access | V2L emergency power mode is enabled, and your EV is ready to power home loads. You might need to reduce in-essential home loads. |
+| 39 | V2L mode exit | Your EV has stopped powering loads, V2L emergency power mode is turned off. |
+| 40 | Emergency backup over. The aGate has been switched to the XXX(Previous mode) mode. | Emergency backup over. The aGate has been switched to the XXX(Previous mode) mode. |
+| 41 | V2L output overload protection alarm | You are using V2L mode. Currently the output power of your electric vehicle has reached 80% of the rated power, please pay attention to the load consumption. |
+| 42 | V2L output overload cut off | You are using V2L mode. The output of your electric vehicle exceeds the rated power. The V2L line has been disconnected. |
+| 43 | PCS protection to limit solar | Main panel operating current exceeds 95% of the set value, requires limiting the solar. |
+| 44 | PCS protection to shed smart circuits | Your house is using too much power and is nearing the safe limit of operation. $1 of your Smart Circuit is being temporarily disconnected until the home load decreases. |
+| 45 | V2L start abnormality | V2L start abnormality due to \{0\}. |
+| 46 | - | - |
+| 47 | - | - |
+| 48 | PCS protection to regulate battery power | Your house is using too much power and is nearing the safe limit of operation. Regulating the battery power until the home load decreases. |
+| 49 | Exit PCS protection to regulate battery power | Main panel operating current is reduced to 85% of the set value, exiting battery power regulation. |
+| 50 | Exit PCS protection, restore solar | Main panel operating current is reduced to 85% of the set value, restore solar. |
+| 51 | Exit PCS protection, restore smart circuits | Power to the $1 of Smart Circuit has been restored. Your home load has reduced to safe limits. |
+| 1401 | aGate suspension | Your aGate temporarily stopped working, and it will restart automatically. |
+| 1402 | aGate shutdown | The aGate detected an abnormality. |
+| 1403 | aGate abnormality | The aGate detected an abnormality. |
+
+## No.1 市电停电(Grid Outage)
+
+FWH系统从并网运行模式切换到离网运行模式,市电停电或市电质量不满足可正常使用标准。
+
+## No.2 市电恢复(Grid restored)
+
+市电恢复正常,FWH系统由离网运行模式切换到并网运行模式,系统接入市电。
+
+## No.3 电量低(Low SOC)
+
+FWH系统电量低于10%,提醒用户注意电量使用情况。
+
+## No.4 电量极低(Extremely low SOC)
+
+FWH系统电量为0%,系统即将关机。
+
+等待市电来电或黑启动尝试(每天10:00/12:00/14:00)
+
+:::warn
+aPower预留了5%的SOC用于黑启动尝试,黑启动尝试时电量可能会被负载消耗掉,导致黑启动尝试失败或者尝试次数锐减。请断开家中所有负载,以便提高黑启动成功率,避免电池完全耗尽。
+
+当电池完全耗尽时,将无法进行黑启动尝试,只能使用市电或油机给系统补电。
+
+当电池完全耗尽后,电芯一般只能维持大概15天左右,维护人员需在这个期限内及时补电,否则将会给电池带来不可逆的损伤。
+:::
+
+## No.5 黑启动失败(Black start failure)
+
+代码中已经屏蔽此事件,不会推送。
+
+## No.6 EPO停机(EPO downtime)
+
+EPO按钮被按下,系统进入紧急停机状态。
+
+## No.7 EPO复位(EPO replaced)
+
+EPO按钮复位,系统将重新初始化并尝试开机。
+
+## No.8 发电机接入(Generator access)
+
+发电机已经正常接入FWH系统,供载或充电。
+
+## No.9 发电机退出(Generator exit)
+
+发电机断开与FWH系统的连接。
+- 演习完成退出
+- 油机启动超时退出(油机未正常启动或油机启动超时时间设置过短)
+- 油机故障退出([发电机快检异常](./AlarmTable.md#301a-发电机快检异常)、[发电机锁相失败](./AlarmTable.md#301b-发电机锁相失败)、[发电机输出不稳](./AlarmTable.md#301c-发电机输出不稳)、[发电机故障退出](./AlarmTable.md#3020-发电机故障退出))
+
+## No.10 紧急备电开始(Emergency backup start)
+
+进入紧急备电状态,系统将开始使用电网充电,并将电池充至100%,为极端天气情况提供电力支持。
+
+## No.11 紧急备电结束(Emergency backup end)
+
+极端天气已结束,紧急备电状态解除,系统恢复到正常运行模式。
+
+## No.12 固件升级开始(Firmware upgrade)
+
+接收到云端固件升级请求,开始升级设备固件。
+
+## No.13 固件升级结束(Firmware upgrade completed)
+
+固件升级流程结束,升级结果可在Fleetview中查看。
+
+## No.14 系统停止(aGate shutdown)
+
+系统停止运行,有以下几种可能性:
+- EPO被按下
+- NewHome站点
+- 所有aPower开关被置于off状态或处于故障状态无法开机
+- 系统升级中
+
+## No.15 aPower停止(aPower failure)
+
+有一台或多台aPower处于非正常运行状态,可能原因:
+- 有一台或多台aPower开关被置于off状态
+- 有一台或多台aPower进入故障状态导致关机
+- 系统升级,关闭aPower
+- 油机运行不稳定,关闭aPower
+
+## No.16 离网过载(System overloading)
+
+离网运行模式下,系统长时间超出额定功率放电供载,说明此时系统负荷过大,需降低家庭负载。
+
+此时可能会伴随着以下故障:
+- [BMS-SOP限功率保护](./AlarmTable.md#4x68-bms-sop限功率保护)
+- [逆变过载保护](./AlarmTable.md#4x07-逆变过载保护)
+
+## No.17 智能负载断开(Smart Circuits disconnected)
+
+当开启智能负载的SOC阈值(SOC Threshold)功能时,离网系统的SOC低于此阈值后会断开智能负载并推送此消息。
+
+## No.18 智能负载断开(Smart Circuits disconnected)
+
+此消息未使用,与No.17重复。
+
+## No.19 智能负载低SOC切断恢复(Smart circuit reconnected)
+
+此消息未使用。
+
+## No.20 离网超发断光伏(Solar disconnected)
+
+触发[光伏继电器异常断开](./AlarmTable.md#3023-光伏继电器异常断开)故障后,推送此消息。
+
+此消息通常还会伴随着以下故障同时出现:
+- xxxxx
+- xxxxx
+
+## No.21 离网恢复光伏(Solar reconnected)
+
+[光伏继电器异常断开](./AlarmTable.md#3023-光伏继电器异常断开)故障消息后,推送此消息。
+
+## No.22 启动发电机(Generator start)
+
+满足发电机启动条件,尝试启动并接入发电机。
+
+发电机启动条件如下:
+- 发电机演习
+- 到达用户设定的发电机充电启动时间
+- 系统SOC低于用户设定的发电机启动SOC
+- 用户使用APP操作手动启动发电机
+
+## No.23 停止发电机(Generator stop)
+
+满足发电机停止条件,尝试停止发电机并端口发电机继电器。
+
+发电机停止条件如下:
+- 发电机启动超时,在设定的发电机启动时间内,发电机无法启动或保持稳定运行(同时会伴随No.24事件)
+- 演习完成退出
+- 到达用户设定的发电机充电结束时间
+- 系统SOC高于用户设定的发电机停止SOC
+- 用户使用APP操作手动停止发电机
+- 光伏尝试(同时会推送No.28事件)
+
+## No.24 发电机启动异常(Generator start abnormality)
+
+发电机启动超时,触发此事件。
+
+## No.25 发电机运行异常(Generator abnormality)
+
+[发电机故障退出](./AlarmTable.md#3020-发电机故障退出)告警出现时,会触发此推送。
+
+## No.26 系统休眠(System power-off)
+
+进入系统休眠时,推送此事件。
+
+休眠共有以下几种情况:
+- NewHome休眠,休眠设定时间30天
+- 黑启动失败休眠,休眠至下次黑启动时间
+- 所有aPower SOC下降至0.5%,深度休眠,休眠设定时间30天
+
+## No.27 离网过载预警(Off-grid overload warning)
+
+当有某台或多台aPower报出[输出过载告警](./AlarmTable.md#4x14-输出过载告警)时,触发此推送。
+
+## No.28 光伏接入尝试(Solar attempt)
+
+发电机运行过程中,如果处于中午可能太阳较大的时间点(10点、12点、14点),发电机会尝试退出,并接入光伏,尝试使用光伏充电,此时会推送此事件。
+
+## No.29 黑启动尝试(Black startup attempt)
+
+在系统SOC低于0%而导致的休眠后,当到达黑启动尝试时间点(10点、12点、14点)时,系统将开机,接入光伏,尝试黑启动。此时将会推送此事件。
+
+:::warn
+此时应提示用户减载,避免因负载导致快速耗尽电池电量,导致系统长期休眠,无法充电。
+
+电池耗尽后,需及时补电,否则可能对电池照成不可逆的伤害。
+:::
+
+## No.30 离网过载锁定(aGate shutdown due to overload)
+
+系统连续输出过载导致触发告警:[输出过载20次锁定](./AlarmTable.md#4x1c-输出过载20次锁定)
+
+提示用户家中负载过重或电器出现短路现象。
+
+## No.31 系统电量恢复(Battery power recovery)
+
+系统电量恢复消息,提示用户系统已退出低电量状态(系统SOC高于20%)。
+
+## No.32 智能线路已充满(The load on the smart circuit is fully charged)
+
+暂未实现。。。
+
+## No.33 发电机演习成功(Generator exercise success)
+
+油机演习完成消息推送。
+
+## No.34 发电机演习失败(Generator exercise fail)
+
+油机演习失败消息推送。常伴随着油机故障出现。
+
+以下情况会出现油机演习失败:
+- 演习中触发EPO按钮
+
+## No.35 发电机工作不稳定(Generator instability)
+
+## No.36 发电机恢复稳定(Generator stabilization)
+
+## No.37 进入休眠模式(Enter hibernation mode)
+
+## No.38 V2L接入(V2L mode access)
+
+## No.39 V2L退出(V2L mode exit)
+
+## No.40 紧急备电模式退出(Emergency backup over. The aGate has been switched to the XXX(Previous mode) mode.)
+
+## No.41 V2L输出过载保护告警(V2L output overload protection alarm)
+
+## No.42 V2L输出过载切断(V2L output overload cut off)
+
+## No.43 PCS保护限制光伏(PCS protection to limit solar)
+
+## No.44 PCS保护切断智能负载(PCS protection to shed smart circuits)
+
+## No.45 V2L启动异常(V2L start abnormality)
+
+## No.46 *预留
+
+## No.47 *预留
+
+## No.48 PCS保护调节电池功率(PCS protection to regulate battery power)
+
+## No.49 退出PCS保护调节电池(Exit PCS protection to regulate battery power)
+
+## No.50 退出PCS保护,恢复光伏(Exit PCS protection, restore solar)
+
+## No.51 退出PCS保护,恢复智能负载(Exit PCS protection, restore smart circuits)
+
+## No.1401 系统暂停(aGate suspension)
+
+## No.1402 系统停止(aGate shutdown)
+
+## No.1403 系统异常(aGate abnormality)
+

+ 1 - 1
client/docs/System/SystemConfig.md

@@ -11,7 +11,7 @@ editLink: false
 | aPower 1.0 | ✔️ | ❌ | ✔️ | ❌ |
 | aPower 1.2 | ❌ | ✔️ | ❌ | ❌ |
 | aPower 1.3 | ✔️ | ❌ | ✔️ | ❌ |
-| aPower 2 | ❌ | ❌ | ✔️ | ✔️ |
+| aPower 2 | ✔️(兼容备件替换) | ❌ | ✔️ | ✔️ |
 | aPower S | ❌ | ❌ | ✔️ | ✔️ |
 | aPbox 1.0 | ✔️ | ❌ | ✔️ | ❌ |
 | aHub(aPbox 2.0) | ❌ | ❌ | ✔️(开发中) | ✔️ |

+ 212 - 78
client/docs/public/assets/Hardware/Gate/MSA_C/MSA-C_SystemCommunicationStructureDiagram.excalidraw

@@ -1040,7 +1040,7 @@
       "version": 51,
       "versionNonce": 1102741077,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750297895874,
       "link": null,
       "locked": false,
@@ -1784,7 +1784,7 @@
       "version": 43,
       "versionNonce": 2003606587,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298099526,
       "link": null,
       "locked": false,
@@ -1829,7 +1829,7 @@
       "version": 56,
       "versionNonce": 819592469,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298164025,
       "link": null,
       "locked": false,
@@ -1874,7 +1874,7 @@
       "version": 45,
       "versionNonce": 1605721339,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298117692,
       "link": null,
       "locked": false,
@@ -1917,7 +1917,7 @@
       "version": 35,
       "versionNonce": 1407678651,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298128141,
       "link": null,
       "locked": false,
@@ -1954,7 +1954,7 @@
       "version": 37,
       "versionNonce": 1785536443,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298166141,
       "link": null,
       "locked": false,
@@ -1991,7 +1991,7 @@
       "version": 28,
       "versionNonce": 2040896629,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298153891,
       "link": null,
       "locked": false,
@@ -2030,7 +2030,7 @@
       "version": 32,
       "versionNonce": 1801011099,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298177565,
       "link": null,
       "locked": false,
@@ -2075,7 +2075,7 @@
       "version": 32,
       "versionNonce": 1050099259,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298182290,
       "link": null,
       "locked": false,
@@ -2120,7 +2120,7 @@
       "version": 39,
       "versionNonce": 1080257141,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298187441,
       "link": null,
       "locked": false,
@@ -2165,7 +2165,7 @@
       "version": 51,
       "versionNonce": 481768341,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298200859,
       "link": null,
       "locked": false,
@@ -2208,7 +2208,7 @@
       "version": 34,
       "versionNonce": 1938477083,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298220892,
       "link": null,
       "locked": false,
@@ -2345,7 +2345,7 @@
       "version": 71,
       "versionNonce": 474704283,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298799254,
       "link": null,
       "locked": false,
@@ -2407,8 +2407,8 @@
       "y": 228.2754425439859,
       "strokeColor": "#000000",
       "backgroundColor": "#ced4da",
-      "width": 94.51003383685139,
-      "height": 23.53968241082135,
+      "width": 94.5100338368514,
+      "height": 23.539682410821356,
       "seed": 791638427,
       "groupIds": [
         "oeLdMFFoMLbJRSIxeKTad",
@@ -2621,7 +2621,7 @@
       "version": 201,
       "versionNonce": 706574965,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298776136,
       "link": null,
       "locked": false,
@@ -2660,7 +2660,7 @@
       "version": 41,
       "versionNonce": 1811934069,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298786178,
       "link": null,
       "locked": false,
@@ -2703,7 +2703,7 @@
       "version": 26,
       "versionNonce": 802026325,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298793470,
       "link": null,
       "locked": false,
@@ -2949,7 +2949,7 @@
       "version": 36,
       "versionNonce": 2002177973,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750298864936,
       "link": null,
       "locked": false,
@@ -3111,7 +3111,7 @@
       "version": 75,
       "versionNonce": 137179157,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750300057547,
       "link": null,
       "locked": false,
@@ -4632,7 +4632,7 @@
       "version": 93,
       "versionNonce": 176443765,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750300057547,
       "link": null,
       "locked": false
@@ -4759,7 +4759,7 @@
       "version": 214,
       "versionNonce": 1990959867,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -4835,7 +4835,7 @@
       "version": 73,
       "versionNonce": 1356041115,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -5532,9 +5532,9 @@
     {
       "id": "nOOrW4ExBmRncE2bR3El5",
       "type": "text",
-      "x": 276.82072859961664,
+      "x": 301.9307063217846,
       "y": 1209.8789704475928,
-      "width": 85.59994506835938,
+      "width": 35.37998962402344,
       "height": 25,
       "angle": 0,
       "strokeColor": "#1e1e1e",
@@ -5552,20 +5552,20 @@
       "index": "b28P",
       "roundness": null,
       "seed": 2052271035,
-      "version": 316,
-      "versionNonce": 1515657525,
+      "version": 317,
+      "versionNonce": 1774853627,
       "isDeleted": false,
       "boundElements": [],
-      "updated": 1750304505161,
+      "updated": 1750389733713,
       "link": null,
       "locked": false,
-      "text": "INV-DSP",
+      "text": "INV",
       "fontSize": 20,
       "fontFamily": 5,
       "textAlign": "center",
       "verticalAlign": "middle",
       "containerId": null,
-      "originalText": "INV-DSP",
+      "originalText": "INV",
       "autoResize": true,
       "lineHeight": 1.25
     },
@@ -6252,9 +6252,9 @@
     {
       "id": "pbsYd9fn7zbdCijrSQgQ9",
       "type": "text",
-      "x": 266.14839307809217,
+      "x": 291.25837080026014,
       "y": 1358.120774918687,
-      "width": 106.57991027832031,
+      "width": 56.359954833984375,
       "height": 25,
       "angle": 0,
       "strokeColor": "#1e1e1e",
@@ -6272,20 +6272,20 @@
       "index": "b28l",
       "roundness": null,
       "seed": 129468341,
-      "version": 350,
-      "versionNonce": 990432507,
+      "version": 351,
+      "versionNonce": 1923101435,
       "isDeleted": false,
       "boundElements": [],
-      "updated": 1750304505161,
+      "updated": 1750389742771,
       "link": null,
       "locked": false,
-      "text": "DCDC-DSP",
+      "text": "DCDC",
       "fontSize": 20,
       "fontFamily": 5,
       "textAlign": "center",
       "verticalAlign": "middle",
       "containerId": null,
-      "originalText": "DCDC-DSP",
+      "originalText": "DCDC",
       "autoResize": true,
       "lineHeight": 1.25
     },
@@ -7071,7 +7071,7 @@
       "version": 35,
       "versionNonce": 853774133,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -8552,7 +8552,7 @@
       "version": 50,
       "versionNonce": 461310971,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -8597,7 +8597,7 @@
       "version": 56,
       "versionNonce": 683935029,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -8638,7 +8638,7 @@
       "version": 26,
       "versionNonce": 961664155,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -8685,7 +8685,7 @@
       "version": 52,
       "versionNonce": 483890837,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -8730,7 +8730,7 @@
       "version": 29,
       "versionNonce": 1862437179,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -8769,7 +8769,7 @@
       "version": 45,
       "versionNonce": 1597111285,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -8810,7 +8810,7 @@
       "version": 58,
       "versionNonce": 1643358683,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -8855,7 +8855,7 @@
       "version": 36,
       "versionNonce": 668513621,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750304505161,
       "link": null,
       "locked": false,
@@ -9682,9 +9682,9 @@
     {
       "id": "BeMexWTFVJtb2ETAI5xTs",
       "type": "text",
-      "x": 822.8754035850104,
+      "x": 847.9853813071784,
       "y": 1213.6651034484512,
-      "width": 85.59994506835938,
+      "width": 35.37998962402344,
       "height": 25,
       "angle": 0,
       "strokeColor": "#1e1e1e",
@@ -9701,20 +9701,20 @@
       "index": "b33",
       "roundness": null,
       "seed": 1726723669,
-      "version": 393,
-      "versionNonce": 262599099,
+      "version": 394,
+      "versionNonce": 73502555,
       "isDeleted": false,
       "boundElements": [],
-      "updated": 1750304494495,
+      "updated": 1750389801288,
       "link": null,
       "locked": false,
-      "text": "INV-DSP",
+      "text": "INV",
       "fontSize": 20,
       "fontFamily": 5,
       "textAlign": "center",
       "verticalAlign": "middle",
       "containerId": null,
-      "originalText": "INV-DSP",
+      "originalText": "INV",
       "autoResize": true,
       "lineHeight": 1.25
     },
@@ -10387,9 +10387,9 @@
     {
       "id": "5Iuh9_x4XlfKl9rcpabrq",
       "type": "text",
-      "x": 812.203068063486,
+      "x": 837.3130457856539,
       "y": 1361.9069079195456,
-      "width": 106.57991027832031,
+      "width": 56.359954833984375,
       "height": 25,
       "angle": 0,
       "strokeColor": "#1e1e1e",
@@ -10406,20 +10406,20 @@
       "index": "b3I",
       "roundness": null,
       "seed": 2130580213,
-      "version": 427,
-      "versionNonce": 2066626331,
+      "version": 428,
+      "versionNonce": 1457660149,
       "isDeleted": false,
       "boundElements": [],
-      "updated": 1750304494495,
+      "updated": 1750389796995,
       "link": null,
       "locked": false,
-      "text": "DCDC-DSP",
+      "text": "DCDC",
       "fontSize": 20,
       "fontFamily": 5,
       "textAlign": "center",
       "verticalAlign": "middle",
       "containerId": null,
-      "originalText": "DCDC-DSP",
+      "originalText": "DCDC",
       "autoResize": true,
       "lineHeight": 1.25
     },
@@ -13740,7 +13740,7 @@
       "version": 38,
       "versionNonce": 1248261883,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310342938,
       "link": null,
       "locked": false,
@@ -13785,7 +13785,7 @@
       "version": 248,
       "versionNonce": 1865135163,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310350166,
       "link": null,
       "locked": false,
@@ -13830,7 +13830,7 @@
       "version": 33,
       "versionNonce": 1072062069,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310357494,
       "link": null,
       "locked": false,
@@ -13875,7 +13875,7 @@
       "version": 26,
       "versionNonce": 925252123,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310355141,
       "link": null,
       "locked": false,
@@ -13920,7 +13920,7 @@
       "version": 253,
       "versionNonce": 2041160155,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310427669,
       "link": null,
       "locked": false,
@@ -13965,7 +13965,7 @@
       "version": 32,
       "versionNonce": 45258389,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310362780,
       "link": null,
       "locked": false,
@@ -14010,7 +14010,7 @@
       "version": 51,
       "versionNonce": 907283451,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310360258,
       "link": null,
       "locked": false,
@@ -14055,7 +14055,7 @@
       "version": 53,
       "versionNonce": 1180415253,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310382870,
       "link": null,
       "locked": false,
@@ -14100,7 +14100,7 @@
       "version": 92,
       "versionNonce": 1383440981,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310421807,
       "link": null,
       "locked": false,
@@ -14145,7 +14145,7 @@
       "version": 43,
       "versionNonce": 1244034293,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310441486,
       "link": null,
       "locked": false,
@@ -14190,7 +14190,7 @@
       "version": 89,
       "versionNonce": 1749991675,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310451836,
       "link": null,
       "locked": false,
@@ -14235,7 +14235,7 @@
       "version": 50,
       "versionNonce": 2062436341,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310461169,
       "link": null,
       "locked": false,
@@ -14278,7 +14278,7 @@
       "version": 16,
       "versionNonce": 350606459,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310509507,
       "link": null,
       "locked": false,
@@ -14317,7 +14317,7 @@
       "version": 69,
       "versionNonce": 1207335835,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310524526,
       "link": null,
       "locked": false,
@@ -14362,7 +14362,7 @@
       "version": 136,
       "versionNonce": 57498229,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310538402,
       "link": null,
       "locked": false,
@@ -14407,7 +14407,7 @@
       "version": 80,
       "versionNonce": 1060621435,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310565869,
       "link": null,
       "locked": false,
@@ -14452,7 +14452,7 @@
       "version": 61,
       "versionNonce": 35221077,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310554719,
       "link": null,
       "locked": false,
@@ -14497,7 +14497,7 @@
       "version": 57,
       "versionNonce": 2027254587,
       "isDeleted": false,
-      "boundElements": null,
+      "boundElements": [],
       "updated": 1750310574769,
       "link": null,
       "locked": false,
@@ -14553,6 +14553,140 @@
       "originalText": "高速同步CAN",
       "autoResize": true,
       "lineHeight": 1.25
+    },
+    {
+      "id": "6667nFGhAdFh5a4KEF3wr",
+      "type": "rectangle",
+      "x": 266.1494156442895,
+      "y": 1113.7695918060151,
+      "width": 109.55434741455763,
+      "height": 272.27477519206235,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "dashed",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b54",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1759843483,
+      "version": 111,
+      "versionNonce": 779325173,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1750389724893,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "bsvqc5kS6HVS6b1CViy3E",
+      "type": "text",
+      "x": 381.34258976400815,
+      "y": 1362.6835135052677,
+      "width": 41.999969482421875,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "dashed",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b56",
+      "roundness": null,
+      "seed": 1416089531,
+      "version": 68,
+      "versionNonce": 1767195355,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1750389773060,
+      "link": null,
+      "locked": false,
+      "text": "DSP",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "DSP",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "vqx7vAygSl4RUJxg7hTDp",
+      "type": "rectangle",
+      "x": 811.5045127005803,
+      "y": 1120.2139651833418,
+      "width": 109.55434741455763,
+      "height": 272.27477519206235,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "dashed",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b57",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 984534203,
+      "version": 184,
+      "versionNonce": 134647317,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750389788993,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "d83xf8WUxQff0qOnQBfEA",
+      "type": "text",
+      "x": 927.4474622275663,
+      "y": 1366.2944469485844,
+      "width": 41.999969482421875,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "dashed",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b58",
+      "roundness": null,
+      "seed": 799677429,
+      "version": 91,
+      "versionNonce": 1398156027,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750389806609,
+      "link": null,
+      "locked": false,
+      "text": "DSP",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "DSP",
+      "autoResize": true,
+      "lineHeight": 1.25
     }
   ],
   "appState": {

BIN
client/docs/public/assets/Hardware/Gate/MSA_C/RJ45-Pin定义图.png


BIN
client/docs/public/assets/Hardware/Gate/aGate_1.3/EMS-aGate1.3.png


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/4301615202_RSD-S-PLC-Datasheet_Rev3.1_2025-02-12.pdf


Fichier diff supprimé car celui-ci est trop grand
+ 35 - 0
client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/4301615331_RSD-S-PLC-Quick-Installation-Guide_Rev3.1_2025-04-02-1.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/4302915212_Transmitter-PLC-1P-datasheet_Rev1.8_2023-10-07.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/APsmart-RSD-Tech-Training-_SMA.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/RSD-S-PLCTransmitter-User-Manual_NA_EN_Rev4.1_2025-05-23.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/APsmart/Rapid-Shutdown-Devices-Application-202305.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/600eea227a66f17b79f59822_RSS Signal Detector.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/6286b222b95d50179e3a46dd_Tigo Rapid Shutdown Solutions Brochure - Final.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/63c595c30a14e6d8c7324c55_Tigo Energy - Application Note - Pure Signal Technology - 002-00121-00 - REV 1.0 - 20221118.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/66f439cbddd5c47ce3fd53db_002-00118-00 4.3 IO&M RSS Transmitter Installation 20240805.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/680acdffe9d05260ee9e8fd0_002-00222-00 1.0 Datasheet TS4-A-F (725W) 20250418 - EN.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/680fae5df8b93aad651a7e39_002-00146-00 1.4 Datasheet RSS w PCBA 20250411 - EN.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/68599e8008025f447ded2ecb_002-00218-00 1.3 QSG TS4-A-O-S-F (725) 20250529 - EN.pdf


BIN
client/docs/public/assets/Hardware/Power/aPower_S/RSD/Tigo/68599f186ce7de70e0577ce0_002-00157-00 1.3 QSG TS4-A-F2F w RSS Transmitter 20250610 - EN.pdf


+ 1856 - 0
client/docs/public/assets/Hardware/Power/aPower_S/aPowerS_InnerEnergyFlow.excalidraw

@@ -0,0 +1,1856 @@
+{
+  "type": "excalidraw",
+  "version": 2,
+  "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor",
+  "elements": [
+    {
+      "id": "xwMwUyb9CY1ollhq-gnzm",
+      "type": "diamond",
+      "x": 1528.5770857349792,
+      "y": 992.8978065608028,
+      "width": 154.50597655157134,
+      "height": 145.94680606349797,
+      "angle": 5.4116709586624125,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "seed": 420020907,
+      "version": 613,
+      "versionNonce": 1424709377,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993685303,
+      "index": "b59",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "aIpdYGHjcgG-O-yzlneeK",
+      "type": "line",
+      "x": 1632.0838254528305,
+      "y": 1011.0356144628583,
+      "width": 5.426227404925095,
+      "height": 102.72409811392365,
+      "angle": 0,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "seed": 432633163,
+      "version": 551,
+      "versionNonce": 1984614113,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993685304,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          102.72409811392365
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b5A",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 690,
+      "versionNonce": 1353730753,
+      "isDeleted": false,
+      "id": "YJbWMDe9sjYUyc36_rd03",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 1606.9173569713687,
+      "y": 1013.9358394551457,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 5.426227404925095,
+      "height": 136.77835286207326,
+      "seed": 455250923,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "boundElements": [],
+      "updated": 1750993685304,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          136.77835286207326
+        ]
+      ],
+      "index": "b5B",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 631,
+      "versionNonce": 1555778209,
+      "isDeleted": false,
+      "id": "BECbkuXCYFpvk0nWbr-Pi",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 1578.6635522077943,
+      "y": 1015.2456184839207,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 5.426227404925095,
+      "height": 106.84054649007366,
+      "seed": 1562304139,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "boundElements": [],
+      "updated": 1750993685304,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          106.84054649007366
+        ]
+      ],
+      "index": "b5C",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "JrGLckQLlpR_hVcc6RRch",
+      "type": "line",
+      "x": 1554.4326401754572,
+      "y": 1069.9756707577326,
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "angle": 0,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "seed": 980997419,
+      "version": 569,
+      "versionNonce": 1394298497,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993685304,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b5D",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 620,
+      "versionNonce": 714069601,
+      "isDeleted": false,
+      "id": "NXzQJMK6CC0TN2L6lcUaz",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 1556.116641783882,
+      "y": 1097.5745860069196,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "seed": 1385887691,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "boundElements": [],
+      "updated": 1750993685304,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "index": "b5E",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 671,
+      "versionNonce": 1441292865,
+      "isDeleted": false,
+      "id": "e6UxsVB0pdWkWLZL8eB5f",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 1552.374415987382,
+      "y": 1045.1834248559203,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "seed": 1939850859,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "boundElements": [],
+      "updated": 1750993685304,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "index": "b5F",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "8iubQmC_SyCjJLRZn0CdI",
+      "type": "text",
+      "x": 1572.3301045283426,
+      "y": 981.4195910701759,
+      "width": 62.199951171875,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "frameId": null,
+      "index": "b5G",
+      "roundness": null,
+      "seed": 1146208523,
+      "version": 388,
+      "versionNonce": 1107587617,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993685304,
+      "link": null,
+      "locked": false,
+      "text": "DC-PV",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "DC-PV",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "y1zjeVG04zwuBQCs2Hm2B",
+      "type": "rectangle",
+      "x": 1048.6522131935892,
+      "y": 881.4208756171503,
+      "width": 487.79209885527416,
+      "height": 674.3343417448798,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5P",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1203404011,
+      "version": 659,
+      "versionNonce": 480970287,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "zhJHNPje3OwBQ9IyYqoL7"
+        },
+        {
+          "id": "RIWcQKFQnFCE0GC-GhQJx",
+          "type": "arrow"
+        },
+        {
+          "id": "zIhar2faPyM6tqtSDbrKP",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750993677704,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "zhJHNPje3OwBQ9IyYqoL7",
+      "type": "text",
+      "x": 1247.4682989371443,
+      "y": 886.4208756171503,
+      "width": 90.15992736816406,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5Q",
+      "roundness": null,
+      "seed": 1861188389,
+      "version": 568,
+      "versionNonce": 484993103,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993677704,
+      "link": null,
+      "locked": false,
+      "text": "aPower S",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": "y1zjeVG04zwuBQCs2Hm2B",
+      "originalText": "aPower S",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "NZJOngIM1XTxfpDkv6iHd",
+      "type": "rectangle",
+      "x": 1415.9103110310516,
+      "y": 1177.9069309701713,
+      "width": 98.66666666666647,
+      "height": 97,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5T",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1914010539,
+      "version": 554,
+      "versionNonce": 1504533807,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "AzLjs0W_Wk-_5rUVL94H9"
+        },
+        {
+          "id": "cC4EzRZ0sRgT95TZ3QSG2",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750993673370,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "AzLjs0W_Wk-_5rUVL94H9",
+      "type": "text",
+      "x": 1435.0536571817677,
+      "y": 1213.9069309701713,
+      "width": 60.379974365234375,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5U",
+      "roundness": null,
+      "seed": 2023579403,
+      "version": 528,
+      "versionNonce": 1434967887,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993673370,
+      "link": null,
+      "locked": false,
+      "text": "MPPT",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "NZJOngIM1XTxfpDkv6iHd",
+      "originalText": "MPPT",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "UKC3sdnzeU7ojia3ee0jf",
+      "type": "rectangle",
+      "x": 1098.3996878110001,
+      "y": 1384.0472334625815,
+      "width": 147.4912657516062,
+      "height": 113.69118401686319,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5r",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1998757093,
+      "version": 327,
+      "versionNonce": 1011250945,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "oF63NvVKXUiI2hjO0EuMs"
+        },
+        {
+          "id": "C02zBfzMlIrHHb9jXMwfp",
+          "type": "arrow"
+        },
+        {
+          "id": "_FEv-hFXKJPcfyVhrnEeh",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750993019148,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "oF63NvVKXUiI2hjO0EuMs",
+      "type": "text",
+      "x": 1128.3113363118032,
+      "y": 1423.392825471013,
+      "width": 87.66796875,
+      "height": 35,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5s",
+      "roundness": null,
+      "seed": 1827125317,
+      "version": 282,
+      "versionNonce": 88207073,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993019148,
+      "link": null,
+      "locked": false,
+      "text": "BATT",
+      "fontSize": 28,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "UKC3sdnzeU7ojia3ee0jf",
+      "originalText": "BATT",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "ueHhJIKcb5Q89RMaBr-X0",
+      "type": "text",
+      "x": 1076.1670410702868,
+      "y": 1348.6135131058727,
+      "width": 60.81596374511719,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b66",
+      "roundness": null,
+      "seed": 828809861,
+      "version": 407,
+      "versionNonce": 369853633,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993939100,
+      "link": null,
+      "locked": false,
+      "text": "Lsop",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lsop",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "7bicJEghtmg8va09XuM5A",
+      "type": "arrow",
+      "x": 1612.5754842295864,
+      "y": 1149.4994313601674,
+      "width": 94.90723404506275,
+      "height": 76.80455891527458,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6A",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 531064069,
+      "version": 393,
+      "versionNonce": 1694050063,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993681220,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -94.90723404506275,
+          76.80455891527458
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "6fWHLT6C10YksVGQ9Okmi",
+      "type": "text",
+      "x": 1300.2729864643763,
+      "y": 1172.2858174063672,
+      "width": 77.36396789550781,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6H",
+      "roundness": null,
+      "seed": 2007583429,
+      "version": 211,
+      "versionNonce": 671137295,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993156632,
+      "link": null,
+      "locked": false,
+      "text": "Pdcpv",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pdcpv",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "TCR89X7csP3A7hR7o89DR",
+      "type": "text",
+      "x": 1302.1338673425662,
+      "y": 1219.4017937019314,
+      "width": 75.37596130371094,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6K",
+      "roundness": null,
+      "seed": 1922275787,
+      "version": 465,
+      "versionNonce": 216440943,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993151663,
+      "link": null,
+      "locked": false,
+      "text": "Ldcpv",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Ldcpv",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "ALR03rYFNIwrhvjg5sh6b",
+      "type": "rectangle",
+      "x": 1093.7349475609549,
+      "y": 941.6301170712114,
+      "width": 147.4912657516062,
+      "height": 113.69118401686319,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6S",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 779650731,
+      "version": 264,
+      "versionNonce": 1527802241,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "gzKzIaLdkwh1xw2417_ta"
+        },
+        {
+          "id": "C02zBfzMlIrHHb9jXMwfp",
+          "type": "arrow"
+        },
+        {
+          "id": "_FEv-hFXKJPcfyVhrnEeh",
+          "type": "arrow"
+        },
+        {
+          "id": "zIhar2faPyM6tqtSDbrKP",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750993171650,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "gzKzIaLdkwh1xw2417_ta",
+      "type": "text",
+      "x": 1147.8105898972071,
+      "y": 980.975709079643,
+      "width": 39.33998107910156,
+      "height": 35,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6T",
+      "roundness": null,
+      "seed": 1588099403,
+      "version": 221,
+      "versionNonce": 1102252075,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918275993,
+      "link": null,
+      "locked": false,
+      "text": "PE",
+      "fontSize": 28,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "ALR03rYFNIwrhvjg5sh6b",
+      "originalText": "PE",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "C02zBfzMlIrHHb9jXMwfp",
+      "type": "arrow",
+      "x": 1168.8242602812345,
+      "y": 1055.9333287686788,
+      "width": 2.971682319451247,
+      "height": 327.5018770132983,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6W",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 382251877,
+      "version": 142,
+      "versionNonce": 1770215599,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993028611,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          2.971682319451247,
+          327.5018770132983
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "ALR03rYFNIwrhvjg5sh6b",
+        "focus": -0.011073333073750366,
+        "gap": 1
+      },
+      "endBinding": {
+        "elementId": "UKC3sdnzeU7ojia3ee0jf",
+        "focus": 0.0023158738882487827,
+        "gap": 1
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "_FEv-hFXKJPcfyVhrnEeh",
+      "type": "arrow",
+      "x": 1139.1287659007019,
+      "y": 1383.4352057819772,
+      "width": 1.8806425412942644,
+      "height": 327.0666326204682,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6X",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 237965323,
+      "version": 136,
+      "versionNonce": 1962341985,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993019532,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -1.8806425412942644,
+          -327.0666326204682
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "UKC3sdnzeU7ojia3ee0jf",
+        "focus": -0.4415317972421559,
+        "gap": 1
+      },
+      "endBinding": {
+        "elementId": "ALR03rYFNIwrhvjg5sh6b",
+        "focus": 0.41266269335425493,
+        "gap": 1.7082262697933857
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "cC4EzRZ0sRgT95TZ3QSG2",
+      "type": "arrow",
+      "x": 1413.8858827334836,
+      "y": 1216.5958438943524,
+      "width": 237.525817440207,
+      "height": 2.066776021308442,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6Y",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1461475013,
+      "version": 341,
+      "versionNonce": 92641167,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993673404,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -237.525817440207,
+          -2.066776021308442
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "NZJOngIM1XTxfpDkv6iHd",
+        "focus": 0.19138259767274765,
+        "gap": 2.8402017929117847
+      },
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "5T1NBmxM89_CttaaN6Gmf",
+      "type": "rectangle",
+      "x": 1246.4808188639108,
+      "y": 655.1124545623845,
+      "width": 121,
+      "height": 80,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6b",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 2090608197,
+      "version": 235,
+      "versionNonce": 1405922703,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692737,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "TBwDKFsybyGTp1OvOR99R",
+      "type": "rectangle",
+      "x": 1242.4808188639108,
+      "y": 736.1124545623845,
+      "width": 128,
+      "height": 13,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6c",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 287905189,
+      "version": 216,
+      "versionNonce": 69084079,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692737,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "mCNS19nC7T_qFEtNvbCk1",
+      "type": "rectangle",
+      "x": 1261.4808188639108,
+      "y": 677.1124545623845,
+      "width": 35,
+      "height": 43,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6d",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 421599493,
+      "version": 217,
+      "versionNonce": 857462223,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "zIhar2faPyM6tqtSDbrKP",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750993692737,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "Rbg-aSn9uSGC7nrPtbmJ3",
+      "type": "line",
+      "x": 1285.1919748854862,
+      "y": 698.7986428283019,
+      "width": 20.96582407769565,
+      "height": 31.545007306275117,
+      "angle": 0,
+      "strokeColor": "#000",
+      "backgroundColor": "#ff00",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "zVuKZ7-wSjjOURSQEE2sY",
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "seed": 503427173,
+      "version": 1041,
+      "versionNonce": 937313263,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692737,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          3.8266896363502756,
+          -4.495535539415729
+        ],
+        [
+          -6.523740307649444,
+          -7.099835732189148
+        ],
+        [
+          -4.940052282859354,
+          -15.458691919054852
+        ],
+        [
+          -17.139134441345377,
+          -2.3859528962241803
+        ],
+        [
+          -9.003242999093644,
+          -0.21577089436751182
+        ],
+        [
+          -13.368501070636167,
+          16.086315387220267
+        ],
+        [
+          -3.642735264157652,
+          4.561339750972302
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b6e",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "oE8w4Qi7LT4_YfUApYbOB",
+      "type": "line",
+      "x": 1281.3553514156174,
+      "y": 696.4741220672055,
+      "width": 1.5570763555064515,
+      "height": 2.7249486827974203,
+      "angle": 0,
+      "strokeColor": "#3d71b7",
+      "backgroundColor": "#ff00",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "zVuKZ7-wSjjOURSQEE2sY",
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "seed": 496524229,
+      "version": 680,
+      "versionNonce": 1919806991,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692737,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -1.5570763555064515,
+          2.7249486827974203
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b6f",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "B7tUDm41_78fa-fPkNwOh",
+      "type": "line",
+      "x": 1312.4808188639108,
+      "y": 672.1124545623845,
+      "width": 38,
+      "height": 1,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6g",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 170789,
+      "version": 444,
+      "versionNonce": 767775791,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692737,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          38,
+          1
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "2MwKmfXXCbaVqO-imVZdF",
+      "type": "line",
+      "x": 1313.4808188639108,
+      "y": 685.1124545623845,
+      "width": 36,
+      "height": 1,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6h",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1303244421,
+      "version": 205,
+      "versionNonce": 1103558223,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692737,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          36,
+          -1
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "3egAlbfyIPRHi6cqsRQZR",
+      "type": "line",
+      "x": 1312.4808188639108,
+      "y": 696.1124545623845,
+      "width": 36,
+      "height": 0,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6i",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 626513381,
+      "version": 194,
+      "versionNonce": 1968264303,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692737,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          36,
+          0
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "RK-kjXDZDoZPeVJ40SOPA",
+      "type": "line",
+      "x": 1314.4808188639108,
+      "y": 709.1124545623845,
+      "width": 34,
+      "height": 0,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6j",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1913508165,
+      "version": 198,
+      "versionNonce": 539684495,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692737,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          34,
+          0
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "SIJXrEhiCzWRwO5I1iLqo",
+      "type": "text",
+      "x": 1260.5508567057077,
+      "y": 749.6124545623845,
+      "width": 97.85992431640625,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6k",
+      "roundness": null,
+      "seed": 1630363813,
+      "version": 392,
+      "versionNonce": 218907823,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "zIhar2faPyM6tqtSDbrKP",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750993692737,
+      "link": null,
+      "locked": false,
+      "text": "Generator",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Generator",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "zIhar2faPyM6tqtSDbrKP",
+      "type": "arrow",
+      "x": 1310.4480736391708,
+      "y": 783.1610868031554,
+      "width": 141.10067214195624,
+      "height": 155.76916835956695,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6l",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1697263653,
+      "version": 504,
+      "versionNonce": 578299119,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993692904,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -141.10067214195624,
+          155.76916835956695
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "SIJXrEhiCzWRwO5I1iLqo",
+        "focus": -0.33246599913166447,
+        "gap": 8.548632240770758
+      },
+      "endBinding": {
+        "elementId": "ALR03rYFNIwrhvjg5sh6b",
+        "focus": -0.41575071982031625,
+        "gap": 4.37701198789955
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "Al1xZHRsDACQFVyI2kSTB",
+      "type": "text",
+      "x": 1283.7232314342218,
+      "y": 819.3298733195887,
+      "width": 64.67997741699219,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6m",
+      "roundness": null,
+      "seed": 58926693,
+      "version": 172,
+      "versionNonce": 1532748225,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993173162,
+      "link": null,
+      "locked": false,
+      "text": "Pgen",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pgen",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "pmvZgTOjGYoeW2psHM1-c",
+      "type": "rectangle",
+      "x": 1105.6176965119498,
+      "y": 1255.3929973968368,
+      "width": 100,
+      "height": 87,
+      "angle": 0,
+      "strokeColor": "#f08c00",
+      "backgroundColor": "#ffec99",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6r",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 337081999,
+      "version": 292,
+      "versionNonce": 2055464033,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "LYHvT6jlLnHHQofNIvtqU"
+        },
+        {
+          "id": "kORtbmmIt9fxaT16v6Zu0",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750993348475,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "LYHvT6jlLnHHQofNIvtqU",
+      "type": "text",
+      "x": 1121.8277261140006,
+      "y": 1286.3929973968368,
+      "width": 67.57994079589844,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#f08c00",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6s",
+      "roundness": null,
+      "seed": 1646775471,
+      "version": 221,
+      "versionNonce": 2049417359,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993271461,
+      "link": null,
+      "locked": false,
+      "text": "DC/DC",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "pmvZgTOjGYoeW2psHM1-c",
+      "originalText": "DC/DC",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "XUOZUNBfNQJHzJ37twYqa",
+      "type": "rectangle",
+      "x": 1104.6176965119498,
+      "y": 1092.3929973968368,
+      "width": 100,
+      "height": 87,
+      "angle": 0,
+      "strokeColor": "#f08c00",
+      "backgroundColor": "#ffec99",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6t",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1481056399,
+      "version": 285,
+      "versionNonce": 1458907151,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "SKIQdEl3C0E3REkXIb8_z"
+        }
+      ],
+      "updated": 1750993135613,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "SKIQdEl3C0E3REkXIb8_z",
+      "type": "text",
+      "x": 1121.867727029528,
+      "y": 1123.3929973968368,
+      "width": 65.49993896484375,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#f08c00",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6u",
+      "roundness": null,
+      "seed": 382875311,
+      "version": 221,
+      "versionNonce": 46958529,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993141245,
+      "link": null,
+      "locked": false,
+      "text": "AC/DC",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "XUOZUNBfNQJHzJ37twYqa",
+      "originalText": "AC/DC",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "NOMH6egMKjFaRjZjmkgbI",
+      "type": "text",
+      "x": 1210.133516415083,
+      "y": 1280.159717363842,
+      "width": 69.77595520019531,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#f08c00",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6v",
+      "roundness": null,
+      "seed": 339098465,
+      "version": 129,
+      "versionNonce": 236423471,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751007992873,
+      "link": null,
+      "locked": false,
+      "text": "Rbatt",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Rbatt",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "kORtbmmIt9fxaT16v6Zu0",
+      "type": "arrow",
+      "x": 994.6176965119498,
+      "y": 1354.8929973968368,
+      "width": 109,
+      "height": 44,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#ffec99",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6w",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 795207055,
+      "version": 40,
+      "versionNonce": 155725903,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1750993357291,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          109,
+          -44
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": {
+        "elementId": "pmvZgTOjGYoeW2psHM1-c",
+        "focus": 0.14117986026075094,
+        "gap": 2
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "6NXnCN34ibA5bi_1QPraW",
+      "type": "text",
+      "x": 844.6176965119498,
+      "y": 1360.8929973968368,
+      "width": 187.77954101562497,
+      "height": 75,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#ffec99",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6y",
+      "roundness": null,
+      "seed": 1277128495,
+      "version": 148,
+      "versionNonce": 1982751279,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1750993415942,
+      "link": null,
+      "locked": false,
+      "text": "aPower charge and\ndischarge requests\ntake effect here.",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "aPower charge and discharge requests take effect here.",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "vE87uBuQO46h_PTNFQY3Z",
+      "type": "text",
+      "x": 1186.9039754158396,
+      "y": 1351.8185008229095,
+      "width": 68.76795959472656,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6z",
+      "roundness": null,
+      "seed": 1754908449,
+      "version": 304,
+      "versionNonce": 1722886913,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750993941566,
+      "link": null,
+      "locked": false,
+      "text": "Pbatt",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pbatt",
+      "autoResize": true,
+      "lineHeight": 1.35
+    }
+  ],
+  "appState": {
+    "gridSize": 20,
+    "gridStep": 5,
+    "gridModeEnabled": false,
+    "viewBackgroundColor": "#ffffff"
+  },
+  "files": {}
+}

+ 4880 - 0
client/docs/public/assets/Hardware/Power/aPower_S/aPowerS_PvEnergyFlow.excalidraw

@@ -0,0 +1,4880 @@
+{
+  "type": "excalidraw",
+  "version": 2,
+  "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor",
+  "elements": [
+    {
+      "id": "xwMwUyb9CY1ollhq-gnzm",
+      "type": "diamond",
+      "x": 1494.5770857349792,
+      "y": 885.8978065608028,
+      "width": 154.50597655157134,
+      "height": 145.94680606349797,
+      "angle": 5.4116709586624125,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "seed": 420020907,
+      "version": 485,
+      "versionNonce": 1855539179,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918385225,
+      "index": "b59",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "aIpdYGHjcgG-O-yzlneeK",
+      "type": "line",
+      "x": 1598.0838254528305,
+      "y": 904.0356144628583,
+      "width": 5.426227404925095,
+      "height": 102.72409811392365,
+      "angle": 0,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "seed": 432633163,
+      "version": 423,
+      "versionNonce": 2006913675,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918385225,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          102.72409811392365
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b5A",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 562,
+      "versionNonce": 2127726891,
+      "isDeleted": false,
+      "id": "YJbWMDe9sjYUyc36_rd03",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 1572.9173569713687,
+      "y": 906.9358394551457,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 5.426227404925095,
+      "height": 136.77835286207326,
+      "seed": 455250923,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "boundElements": [],
+      "updated": 1750918385225,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          136.77835286207326
+        ]
+      ],
+      "index": "b5B",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 503,
+      "versionNonce": 1235102667,
+      "isDeleted": false,
+      "id": "BECbkuXCYFpvk0nWbr-Pi",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 1544.6635522077943,
+      "y": 908.2456184839207,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 5.426227404925095,
+      "height": 106.84054649007366,
+      "seed": 1562304139,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "boundElements": [],
+      "updated": 1750918385225,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          106.84054649007366
+        ]
+      ],
+      "index": "b5C",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "JrGLckQLlpR_hVcc6RRch",
+      "type": "line",
+      "x": 1520.4326401754572,
+      "y": 962.9756707577325,
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "angle": 0,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "seed": 980997419,
+      "version": 441,
+      "versionNonce": 203192939,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918385225,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b5D",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 492,
+      "versionNonce": 320337163,
+      "isDeleted": false,
+      "id": "NXzQJMK6CC0TN2L6lcUaz",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 1522.116641783882,
+      "y": 990.5745860069196,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "seed": 1385887691,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "boundElements": [],
+      "updated": 1750918385225,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "index": "b5E",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 543,
+      "versionNonce": 772479915,
+      "isDeleted": false,
+      "id": "e6UxsVB0pdWkWLZL8eB5f",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 1518.374415987382,
+      "y": 938.1834248559204,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "seed": 1939850859,
+      "groupIds": [
+        "TaHG488Sf53U_3ocgwWq7",
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "boundElements": [],
+      "updated": 1750918385225,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "index": "b5F",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "8iubQmC_SyCjJLRZn0CdI",
+      "type": "text",
+      "x": 1538.3301045283426,
+      "y": 874.4195910701759,
+      "width": 62.199951171875,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "CdiMiQLklmEHZe04HAiZ6"
+      ],
+      "frameId": null,
+      "index": "b5G",
+      "roundness": null,
+      "seed": 1146208523,
+      "version": 260,
+      "versionNonce": 1495297611,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918385225,
+      "link": null,
+      "locked": false,
+      "text": "DC-PV",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "DC-PV",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "xGS5t0JVqFq0uWdIe9i0y",
+      "type": "line",
+      "x": 1003.5779232800742,
+      "y": 279.32959974297137,
+      "width": 21,
+      "height": 81,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "P3BHjzAQvuy3zkT7Dfq8b"
+      ],
+      "frameId": null,
+      "index": "b5H",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 824706987,
+      "version": 199,
+      "versionNonce": 248651909,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750907147961,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -21,
+          81
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "J1zqw_l_GM1r6O6Y1K_Wg",
+      "type": "line",
+      "x": 1004.5779232800742,
+      "y": 279.32959974297137,
+      "width": 24,
+      "height": 84,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "P3BHjzAQvuy3zkT7Dfq8b"
+      ],
+      "frameId": null,
+      "index": "b5I",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1103092299,
+      "version": 217,
+      "versionNonce": 1462093797,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750907147961,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          24,
+          84
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "6TD-LhXYSoh9-ayd9t7C8",
+      "type": "line",
+      "x": 982.5779232800742,
+      "y": 307.32959974297137,
+      "width": 47,
+      "height": 1,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "P3BHjzAQvuy3zkT7Dfq8b"
+      ],
+      "frameId": null,
+      "index": "b5J",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 553933035,
+      "version": 177,
+      "versionNonce": 1498252101,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750907147961,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          47,
+          -1
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "xVqurROEQ9fX4Wm96vsKe",
+      "type": "line",
+      "x": 991.5779232800742,
+      "y": 278.32959974297137,
+      "width": 35,
+      "height": 0,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "P3BHjzAQvuy3zkT7Dfq8b"
+      ],
+      "frameId": null,
+      "index": "b5K",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 746587019,
+      "version": 173,
+      "versionNonce": 1772540581,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750907147961,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          35,
+          0
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "P3ChdVs_rBYrKWhPGflqM",
+      "type": "line",
+      "x": 971.5779232800742,
+      "y": 332.32959974297137,
+      "width": 68,
+      "height": 1,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "P3BHjzAQvuy3zkT7Dfq8b"
+      ],
+      "frameId": null,
+      "index": "b5L",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 745364011,
+      "version": 185,
+      "versionNonce": 1960785413,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750907147961,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          68,
+          -1
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "r6pSGUp5lKBmk3QukRnsk",
+      "type": "text",
+      "x": 985.9679455579062,
+      "y": 249.8295997429714,
+      "width": 41.21995544433594,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "P3BHjzAQvuy3zkT7Dfq8b"
+      ],
+      "frameId": null,
+      "index": "b5M",
+      "roundness": null,
+      "seed": 2109136075,
+      "version": 281,
+      "versionNonce": 1978936677,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750907147961,
+      "link": null,
+      "locked": false,
+      "text": "Grid",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Grid",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "kg6SX9A91iHBz-67DeAZu",
+      "type": "rectangle",
+      "x": 875.4938808846247,
+      "y": 512.28632976639,
+      "width": 243.33333333333337,
+      "height": 265,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5N",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1559640875,
+      "version": 82,
+      "versionNonce": 19098603,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "8aD3bJ5bb4q_uTtaOzT59"
+        },
+        {
+          "id": "1GkiGTADmhN8PVHIdEzIy",
+          "type": "arrow"
+        },
+        {
+          "id": "43OXv9Y3GGQny98oa0qM5",
+          "type": "arrow"
+        },
+        {
+          "id": "3WmRS4veWrwptZu0tKVPX",
+          "type": "arrow"
+        },
+        {
+          "id": "zIhar2faPyM6tqtSDbrKP",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750923378753,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "8aD3bJ5bb4q_uTtaOzT59",
+      "type": "text",
+      "x": 966.9405692187718,
+      "y": 632.28632976639,
+      "width": 60.43995666503906,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5O",
+      "roundness": null,
+      "seed": 1090755979,
+      "version": 13,
+      "versionNonce": 106376107,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750905934935,
+      "link": null,
+      "locked": false,
+      "text": "aGate",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "kg6SX9A91iHBz-67DeAZu",
+      "originalText": "aGate",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "y1zjeVG04zwuBQCs2Hm2B",
+      "type": "rectangle",
+      "x": 1069.6522131935892,
+      "y": 896.4208756171503,
+      "width": 434.7920988552742,
+      "height": 433.3343417448796,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5P",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1203404011,
+      "version": 457,
+      "versionNonce": 394354085,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "zhJHNPje3OwBQ9IyYqoL7"
+        },
+        {
+          "id": "IqmuXBqIVxjSYZ0fp46Om",
+          "type": "arrow"
+        },
+        {
+          "id": "RIWcQKFQnFCE0GC-GhQJx",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750918391458,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "zhJHNPje3OwBQ9IyYqoL7",
+      "type": "text",
+      "x": 1241.9682989371443,
+      "y": 901.4208756171503,
+      "width": 90.15992736816406,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5Q",
+      "roundness": null,
+      "seed": 1861188389,
+      "version": 403,
+      "versionNonce": 979201605,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918391325,
+      "link": null,
+      "locked": false,
+      "text": "aPower S",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": "y1zjeVG04zwuBQCs2Hm2B",
+      "originalText": "aPower S",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "5Kjk7P3b4Pux6YxA7-t5j",
+      "type": "rectangle",
+      "x": 757.6552608342924,
+      "y": 944.5762648259878,
+      "width": 185,
+      "height": 388.9751617955854,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5R",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 561101707,
+      "version": 273,
+      "versionNonce": 1554381285,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "GQmZ1NKYYKa0oX-AclU3p"
+        },
+        {
+          "id": "meVM9Pqa4iihiPUGiVa7R",
+          "type": "arrow"
+        },
+        {
+          "id": "IbDpdqKjfEaOMF-xytzIv",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750918217517,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "GQmZ1NKYYKa0oX-AclU3p",
+      "type": "text",
+      "x": 804.295290741519,
+      "y": 949.5762648259878,
+      "width": 91.71994018554688,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5S",
+      "roundness": null,
+      "seed": 174592555,
+      "version": 210,
+      "versionNonce": 607830763,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918217517,
+      "link": null,
+      "locked": false,
+      "text": "aPower 2",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": "5Kjk7P3b4Pux6YxA7-t5j",
+      "originalText": "aPower 2",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "NZJOngIM1XTxfpDkv6iHd",
+      "type": "rectangle",
+      "x": 1382.9103110310516,
+      "y": 1073.9069309701713,
+      "width": 98.66666666666647,
+      "height": 97,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5T",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1914010539,
+      "version": 370,
+      "versionNonce": 1236950667,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "AzLjs0W_Wk-_5rUVL94H9"
+        },
+        {
+          "id": "7bicJEghtmg8va09XuM5A",
+          "type": "arrow"
+        },
+        {
+          "id": "cC4EzRZ0sRgT95TZ3QSG2",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750918374725,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "AzLjs0W_Wk-_5rUVL94H9",
+      "type": "text",
+      "x": 1402.0536571817677,
+      "y": 1109.9069309701713,
+      "width": 60.379974365234375,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5U",
+      "roundness": null,
+      "seed": 2023579403,
+      "version": 345,
+      "versionNonce": 128210219,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918374725,
+      "link": null,
+      "locked": false,
+      "text": "MPPT",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "NZJOngIM1XTxfpDkv6iHd",
+      "originalText": "MPPT",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "eeFISLaikyUzSiabesgKG",
+      "type": "diamond",
+      "x": 624.2647021326488,
+      "y": 405.8712128874638,
+      "width": 154.50597655157134,
+      "height": 145.94680606349797,
+      "angle": 5.4116709586624125,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "KCvmStel55BS45SjuGMLM",
+        "Nj2EAYAUy4y7hizVMyDqq"
+      ],
+      "seed": 6289355,
+      "version": 521,
+      "versionNonce": 150055589,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750906255752,
+      "index": "b5d",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "HYFIWxY7_SoYMLMnYQevZ",
+      "type": "line",
+      "x": 727.7714418504997,
+      "y": 424.00902078951935,
+      "width": 5.426227404925095,
+      "height": 102.72409811392365,
+      "angle": 0,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "KCvmStel55BS45SjuGMLM",
+        "Nj2EAYAUy4y7hizVMyDqq"
+      ],
+      "seed": 549766763,
+      "version": 459,
+      "versionNonce": 2018475563,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750906255752,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          102.72409811392365
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b5e",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 598,
+      "versionNonce": 353308165,
+      "isDeleted": false,
+      "id": "MntGwGjtgV0374EaQPS_u",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 702.6049733690384,
+      "y": 426.9092457818067,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 5.426227404925095,
+      "height": 136.77835286207326,
+      "seed": 81182987,
+      "groupIds": [
+        "KCvmStel55BS45SjuGMLM",
+        "Nj2EAYAUy4y7hizVMyDqq"
+      ],
+      "boundElements": [],
+      "updated": 1750906255752,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          136.77835286207326
+        ]
+      ],
+      "index": "b5f",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 539,
+      "versionNonce": 1370783947,
+      "isDeleted": false,
+      "id": "JS3mvKQkbzHcynHJkLmFY",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 674.351168605464,
+      "y": 428.2190248105817,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 5.426227404925095,
+      "height": 106.84054649007366,
+      "seed": 370173867,
+      "groupIds": [
+        "KCvmStel55BS45SjuGMLM",
+        "Nj2EAYAUy4y7hizVMyDqq"
+      ],
+      "boundElements": [],
+      "updated": 1750906255752,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          5.426227404925095,
+          106.84054649007366
+        ]
+      ],
+      "index": "b5g",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "NOmTPgkwl2Iy_klRXODC6",
+      "type": "line",
+      "x": 650.1202565731269,
+      "y": 482.94907708439337,
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "angle": 0,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "KCvmStel55BS45SjuGMLM",
+        "Nj2EAYAUy4y7hizVMyDqq"
+      ],
+      "seed": 714881611,
+      "version": 477,
+      "versionNonce": 845743461,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750906255752,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b5h",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 528,
+      "versionNonce": 1218457451,
+      "isDeleted": false,
+      "id": "YZcltEo2PV62qTaBPmGsn",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 651.8042581815512,
+      "y": 510.5479923335806,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "seed": 1867823339,
+      "groupIds": [
+        "KCvmStel55BS45SjuGMLM",
+        "Nj2EAYAUy4y7hizVMyDqq"
+      ],
+      "boundElements": [],
+      "updated": 1750906255752,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "index": "b5i",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "type": "line",
+      "version": 579,
+      "versionNonce": 877465797,
+      "isDeleted": false,
+      "id": "_Rb7LhIayX8xTNueZirCa",
+      "fillStyle": "solid",
+      "strokeWidth": 1,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "angle": 0,
+      "x": 648.0620323850512,
+      "y": 458.1568311825813,
+      "strokeColor": "#000000",
+      "backgroundColor": "transparent",
+      "width": 105.15654488164863,
+      "height": 10.665343520024937,
+      "seed": 298083211,
+      "groupIds": [
+        "KCvmStel55BS45SjuGMLM",
+        "Nj2EAYAUy4y7hizVMyDqq"
+      ],
+      "boundElements": [],
+      "updated": 1750906255752,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          105.15654488164863,
+          -10.665343520024937
+        ]
+      ],
+      "index": "b5j",
+      "frameId": null,
+      "roundness": {
+        "type": 2
+      },
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "I3sFVv4gLYe6-U6rpwUPI",
+      "type": "text",
+      "x": 669.0577218415397,
+      "y": 394.3929973968368,
+      "width": 60.11994934082031,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "Nj2EAYAUy4y7hizVMyDqq"
+      ],
+      "frameId": null,
+      "index": "b5k",
+      "roundness": null,
+      "seed": 707115563,
+      "version": 300,
+      "versionNonce": 1331497483,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750906255752,
+      "link": null,
+      "locked": false,
+      "text": "AC-PV",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "AC-PV",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "1GkiGTADmhN8PVHIdEzIy",
+      "type": "arrow",
+      "x": 706.5176904084342,
+      "y": 564.0402980203584,
+      "width": 166.25,
+      "height": 1.25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5l",
+      "roundness": null,
+      "seed": 1236488779,
+      "version": 66,
+      "versionNonce": 1493253035,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750906236090,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          166.25,
+          -1.25
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": {
+        "elementId": "kg6SX9A91iHBz-67DeAZu",
+        "focus": 0.6216051329187093,
+        "gap": 2.7261904761904816,
+        "fixedPoint": [
+          -0.017156052437186712,
+          0.18697809151480138
+        ]
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false,
+      "fixedSegments": null
+    },
+    {
+      "id": "icY3zTnuWNvpmQ8QlktXa",
+      "type": "text",
+      "x": 760.802309170768,
+      "y": 526.1108623498487,
+      "width": 75.823974609375,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5o",
+      "roundness": null,
+      "seed": 1303618027,
+      "version": 54,
+      "versionNonce": 1112001477,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750907447008,
+      "link": null,
+      "locked": false,
+      "text": "Pacpv",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pacpv",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "2KfJmhqe_316ccBfDPulT",
+      "type": "rectangle",
+      "x": 777.3365055583372,
+      "y": 1203.8300933957805,
+      "width": 147.4912657516062,
+      "height": 113.69118401686319,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5p",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1013051557,
+      "version": 244,
+      "versionNonce": 1215906507,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "lC0xamIcL5hfR8bHsn1d4"
+        },
+        {
+          "id": "-lemSubarpDt_VTco4y--",
+          "type": "arrow"
+        },
+        {
+          "id": "UrS_Cr3-IuWB18xKcP9si",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750918347736,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "lC0xamIcL5hfR8bHsn1d4",
+      "type": "text",
+      "x": 807.2481540591403,
+      "y": 1243.1756854042121,
+      "width": 87.66796875,
+      "height": 35,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5q",
+      "roundness": null,
+      "seed": 1841346667,
+      "version": 201,
+      "versionNonce": 2137891173,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918219976,
+      "link": null,
+      "locked": false,
+      "text": "BATT",
+      "fontSize": 28,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "2KfJmhqe_316ccBfDPulT",
+      "originalText": "BATT",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "UKC3sdnzeU7ojia3ee0jf",
+      "type": "rectangle",
+      "x": 1094.3996878110001,
+      "y": 1198.0472334625815,
+      "width": 147.4912657516062,
+      "height": 113.69118401686319,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5r",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1998757093,
+      "version": 250,
+      "versionNonce": 274973067,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "oF63NvVKXUiI2hjO0EuMs"
+        },
+        {
+          "id": "C02zBfzMlIrHHb9jXMwfp",
+          "type": "arrow"
+        },
+        {
+          "id": "_FEv-hFXKJPcfyVhrnEeh",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750918325654,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "oF63NvVKXUiI2hjO0EuMs",
+      "type": "text",
+      "x": 1124.3113363118032,
+      "y": 1237.392825471013,
+      "width": 87.66796875,
+      "height": 35,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5s",
+      "roundness": null,
+      "seed": 1827125317,
+      "version": 205,
+      "versionNonce": 1176220363,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918241410,
+      "link": null,
+      "locked": false,
+      "text": "BATT",
+      "fontSize": 28,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "UKC3sdnzeU7ojia3ee0jf",
+      "originalText": "BATT",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "DHPA9AnH5HB1NDqeDT8hN",
+      "type": "rectangle",
+      "x": 961.0592133028574,
+      "y": 741.4986387539078,
+      "width": 75.16277052436521,
+      "height": 35.733120413222764,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5y",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1218222053,
+      "version": 42,
+      "versionNonce": 1339784901,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "meVM9Pqa4iihiPUGiVa7R",
+          "type": "arrow"
+        },
+        {
+          "id": "IqmuXBqIVxjSYZ0fp46Om",
+          "type": "arrow"
+        },
+        {
+          "id": "ZSRrGRSbnfhQ5Vk4J0DL2",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750906649590,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "meVM9Pqa4iihiPUGiVa7R",
+      "type": "arrow",
+      "x": 1001.4963210326225,
+      "y": 778.3473530017558,
+      "width": 141.1831971592493,
+      "height": 165.32618515068555,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b5z",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 828172171,
+      "version": 206,
+      "versionNonce": 776111269,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918217518,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -141.1831971592493,
+          165.32618515068555
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "DHPA9AnH5HB1NDqeDT8hN",
+        "focus": -0.36083354684431185,
+        "gap": 2.464353131946382
+      },
+      "endBinding": {
+        "elementId": "5Kjk7P3b4Pux6YxA7-t5j",
+        "focus": -0.6059721619388214,
+        "gap": 1.000669252475518
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "IqmuXBqIVxjSYZ0fp46Om",
+      "type": "arrow",
+      "x": 1013.057603627726,
+      "y": 780.0910386388542,
+      "width": 156.14600033438217,
+      "height": 115.62391311042302,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b60",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1040217579,
+      "version": 373,
+      "versionNonce": 1569586660,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751003796888,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          156.14600033438217,
+          115.62391311042302
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "78un_agUm8Rtla9u5lCLW",
+        "focus": 0.22096441056995797,
+        "gap": 1
+      },
+      "endBinding": {
+        "elementId": "y1zjeVG04zwuBQCs2Hm2B",
+        "focus": 0.3445362114080974,
+        "gap": 1
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "ZSRrGRSbnfhQ5Vk4J0DL2",
+      "type": "arrow",
+      "x": 813.0909823177036,
+      "y": 814.8869059456824,
+      "width": 143.93957075853268,
+      "height": 55.05586101241306,
+      "angle": 0,
+      "strokeColor": "#2f9e44",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b61",
+      "roundness": null,
+      "seed": 1724849733,
+      "version": 286,
+      "versionNonce": 1235520722,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751100484434,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          143.93957075853268,
+          -55.05586101241306
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "94cRTg5Ts2MmRNEu6ds9m",
+        "focus": 0.7847743839122316,
+        "gap": 12.978515657549565
+      },
+      "endBinding": {
+        "elementId": "78un_agUm8Rtla9u5lCLW",
+        "focus": 0.5499874441414271,
+        "gap": 14.519839766211135
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "94cRTg5Ts2MmRNEu6ds9m",
+      "type": "text",
+      "x": 588.7178967210945,
+      "y": 797.3104236229708,
+      "width": 211.3945699390595,
+      "height": 35,
+      "angle": 0,
+      "strokeColor": "#2f9e44",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b62",
+      "roundness": null,
+      "seed": 338129989,
+      "version": 274,
+      "versionNonce": 224018194,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "ZSRrGRSbnfhQ5Vk4J0DL2",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1751100484434,
+      "link": null,
+      "locked": false,
+      "text": "aPower breaker",
+      "fontSize": 28,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "aPower breaker",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "78un_agUm8Rtla9u5lCLW",
+      "type": "text",
+      "x": 971.5503928424473,
+      "y": 741.2910386388542,
+      "width": 52.051971435546875,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b64",
+      "roundness": null,
+      "seed": 2011020555,
+      "version": 246,
+      "versionNonce": 162964043,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "ZSRrGRSbnfhQ5Vk4J0DL2",
+          "type": "arrow"
+        },
+        {
+          "id": "IqmuXBqIVxjSYZ0fp46Om",
+          "type": "arrow"
+        },
+        {
+          "id": "IbDpdqKjfEaOMF-xytzIv",
+          "type": "arrow"
+        },
+        {
+          "id": "RIWcQKFQnFCE0GC-GhQJx",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750909353582,
+      "link": null,
+      "locked": false,
+      "text": "Lsw",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lsw",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "ueHhJIKcb5Q89RMaBr-X0",
+      "type": "text",
+      "x": 1190.943575173508,
+      "y": 1159.4190597780384,
+      "width": 112.89593505859375,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b66",
+      "roundness": null,
+      "seed": 828809861,
+      "version": 277,
+      "versionNonce": 978615900,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751003811270,
+      "link": null,
+      "locked": false,
+      "text": "Lsop_chr",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lsop_chr",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "7bicJEghtmg8va09XuM5A",
+      "type": "arrow",
+      "x": 1577.5754842295864,
+      "y": 1045.4994313601674,
+      "width": 94.90723404506275,
+      "height": 76.80455891527458,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6A",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 531064069,
+      "version": 248,
+      "versionNonce": 385789131,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918396196,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -94.90723404506275,
+          76.80455891527458
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": {
+        "elementId": "NZJOngIM1XTxfpDkv6iHd",
+        "focus": 0.46032625535653243,
+        "gap": 1.0912724868055648
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "43OXv9Y3GGQny98oa0qM5",
+      "type": "arrow",
+      "x": 1005.0807517810697,
+      "y": 510.380098304915,
+      "width": 1.121601826865117,
+      "height": 146.92983931932235,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6B",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 289003557,
+      "version": 46,
+      "versionNonce": 2007362763,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750907157409,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -1.121601826865117,
+          -146.92983931932235
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "kg6SX9A91iHBz-67DeAZu",
+        "focus": 0.07292421999869904,
+        "gap": 1.9062314614750449
+      },
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "mzul3rTLagzurSXI7LRdj",
+      "type": "text",
+      "x": 1009.5671590885297,
+      "y": 430.74636859749603,
+      "width": 124.54393005371094,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6C",
+      "roundness": null,
+      "seed": 418243781,
+      "version": 37,
+      "versionNonce": 424709732,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751003753827,
+      "link": null,
+      "locked": false,
+      "text": "Lgrid_exp",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lgrid_exp",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "_j5qvQOOzq1NEd05ojwCi",
+      "type": "rectangle",
+      "x": 1323.4617255444155,
+      "y": 647.567404880281,
+      "width": 160.38906124170285,
+      "height": 151.4162466267826,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6D",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 255770347,
+      "version": 131,
+      "versionNonce": 1118119237,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "J8ftXhvJuFyRme692q7O3"
+        },
+        {
+          "id": "3WmRS4veWrwptZu0tKVPX",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750923359949,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "J8ftXhvJuFyRme692q7O3",
+      "type": "text",
+      "x": 1371.1202759406576,
+      "y": 705.7755281936722,
+      "width": 65.07196044921875,
+      "height": 35,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6E",
+      "roundness": null,
+      "seed": 2057640715,
+      "version": 86,
+      "versionNonce": 1270494373,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923359949,
+      "link": null,
+      "locked": false,
+      "text": "Load",
+      "fontSize": 28,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "_j5qvQOOzq1NEd05ojwCi",
+      "originalText": "Load",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "3WmRS4veWrwptZu0tKVPX",
+      "type": "arrow",
+      "x": 1121.5733967087053,
+      "y": 720.4715236265096,
+      "width": 198.52352335511478,
+      "height": 2.24320365373012,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6F",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 589993893,
+      "version": 146,
+      "versionNonce": 432551915,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923360510,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          198.52352335511478,
+          2.24320365373012
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "kg6SX9A91iHBz-67DeAZu",
+        "focus": 0.5548424244034316,
+        "gap": 2.7461824907472874
+      },
+      "endBinding": {
+        "elementId": "_j5qvQOOzq1NEd05ojwCi",
+        "focus": -0.005003928704353076,
+        "gap": 3.3648054805953507
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "oppSiOTSg0_KfDtGTjb2Y",
+      "type": "text",
+      "x": 1181.0182935325533,
+      "y": 687.945070647423,
+      "width": 73.16397094726562,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6G",
+      "roundness": null,
+      "seed": 1849270955,
+      "version": 70,
+      "versionNonce": 61463237,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923359949,
+      "link": null,
+      "locked": false,
+      "text": "Pload",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pload",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "6fWHLT6C10YksVGQ9Okmi",
+      "type": "text",
+      "x": 1300.2729864643763,
+      "y": 1084.2858174063672,
+      "width": 77.36396789550781,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6H",
+      "roundness": null,
+      "seed": 2007583429,
+      "version": 183,
+      "versionNonce": 1714364965,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918382941,
+      "link": null,
+      "locked": false,
+      "text": "Pdcpv",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pdcpv",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "Y_fNDzIr98s8k6Qvhezty",
+      "type": "text",
+      "x": 1182.169107878546,
+      "y": 857.1222938629232,
+      "width": 46.7039794921875,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6I",
+      "roundness": null,
+      "seed": 1589561163,
+      "version": 325,
+      "versionNonce": 2069344619,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "IqmuXBqIVxjSYZ0fp46Om",
+          "type": "arrow"
+        },
+        {
+          "id": "RIWcQKFQnFCE0GC-GhQJx",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750909404089,
+      "link": null,
+      "locked": false,
+      "text": "Lap",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lap",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "TPtUf5EW7ee5ft7R8lxie",
+      "type": "text",
+      "x": 900.6489958512907,
+      "y": 910.3511724181204,
+      "width": 46.7039794921875,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6J",
+      "roundness": null,
+      "seed": 1720294885,
+      "version": 310,
+      "versionNonce": 1127964965,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750924196412,
+      "link": null,
+      "locked": false,
+      "text": "Lap",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lap",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "TCR89X7csP3A7hR7o89DR",
+      "type": "text",
+      "x": 1301.1338673425662,
+      "y": 1126.4017937019314,
+      "width": 75.37596130371094,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6K",
+      "roundness": null,
+      "seed": 1922275787,
+      "version": 430,
+      "versionNonce": 440647877,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918378008,
+      "link": null,
+      "locked": false,
+      "text": "Ldcpv",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Ldcpv",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "IbDpdqKjfEaOMF-xytzIv",
+      "type": "arrow",
+      "x": 837.0332789635395,
+      "y": 943.4418221322242,
+      "width": 141.3730521682628,
+      "height": 161.63408172596564,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6L",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1425971595,
+      "version": 187,
+      "versionNonce": 814826539,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918217518,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          141.3730521682628,
+          -161.63408172596564
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "5Kjk7P3b4Pux6YxA7-t5j",
+        "focus": -0.701497413936738,
+        "gap": 1.257861351161182
+      },
+      "endBinding": {
+        "elementId": "78un_agUm8Rtla9u5lCLW",
+        "focus": 0.0061725037174361055,
+        "gap": 2.716701767404402
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "RIWcQKFQnFCE0GC-GhQJx",
+      "type": "arrow",
+      "x": 1194.1447380707484,
+      "y": 895.4810409915148,
+      "width": 165.51034792551286,
+      "height": 119.03991143636802,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6M",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 773951051,
+      "version": 158,
+      "versionNonce": 106733924,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751003796888,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -165.51034792551286,
+          -119.03991143636802
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "y1zjeVG04zwuBQCs2Hm2B",
+        "focus": 0.4042369863091441,
+        "gap": 1.3313506975210885
+      },
+      "endBinding": {
+        "elementId": "78un_agUm8Rtla9u5lCLW",
+        "focus": -0.16189449005553183,
+        "gap": 5.032025867241373
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "LF6hCKn9d0EnlIbUbgToD",
+      "type": "text",
+      "x": 1099.8749672625925,
+      "y": 797.434193385345,
+      "width": 48.52398681640625,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6O",
+      "roundness": null,
+      "seed": 648218853,
+      "version": 67,
+      "versionNonce": 1610195077,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750924599317,
+      "link": null,
+      "locked": false,
+      "text": "Pap",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pap",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "aai2ZPjIZXpVwF60TOfiN",
+      "type": "text",
+      "x": 856.672938319705,
+      "y": 836.1766646330823,
+      "width": 48.52398681640625,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6R",
+      "roundness": null,
+      "seed": 180358309,
+      "version": 72,
+      "versionNonce": 107586891,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750924610934,
+      "link": null,
+      "locked": false,
+      "text": "Pap",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pap",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "ALR03rYFNIwrhvjg5sh6b",
+      "type": "rectangle",
+      "x": 1093.7349475609549,
+      "y": 941.6301170712114,
+      "width": 147.4912657516062,
+      "height": 113.69118401686319,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6S",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 779650731,
+      "version": 263,
+      "versionNonce": 776149707,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "gzKzIaLdkwh1xw2417_ta"
+        },
+        {
+          "id": "C02zBfzMlIrHHb9jXMwfp",
+          "type": "arrow"
+        },
+        {
+          "id": "_FEv-hFXKJPcfyVhrnEeh",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750918325654,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "gzKzIaLdkwh1xw2417_ta",
+      "type": "text",
+      "x": 1147.8105898972071,
+      "y": 980.975709079643,
+      "width": 39.33998107910156,
+      "height": 35,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6T",
+      "roundness": null,
+      "seed": 1588099403,
+      "version": 221,
+      "versionNonce": 1102252075,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918275993,
+      "link": null,
+      "locked": false,
+      "text": "PE",
+      "fontSize": 28,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "ALR03rYFNIwrhvjg5sh6b",
+      "originalText": "PE",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "X9aKywBzcafHmHVxEo_2w",
+      "type": "rectangle",
+      "x": 775.7551844111496,
+      "y": 984.7322333037936,
+      "width": 147.4912657516062,
+      "height": 113.69118401686319,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6U",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 305825317,
+      "version": 292,
+      "versionNonce": 1230588939,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "sof_3DCtP6QipnIhQ2CB8"
+        },
+        {
+          "id": "-lemSubarpDt_VTco4y--",
+          "type": "arrow"
+        },
+        {
+          "id": "UrS_Cr3-IuWB18xKcP9si",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750918347736,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "sof_3DCtP6QipnIhQ2CB8",
+      "type": "text",
+      "x": 829.8308267474018,
+      "y": 1024.0778253122253,
+      "width": 39.33998107910156,
+      "height": 35,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6V",
+      "roundness": null,
+      "seed": 1202747781,
+      "version": 250,
+      "versionNonce": 2059064261,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918285109,
+      "link": null,
+      "locked": false,
+      "text": "PE",
+      "fontSize": 28,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "X9aKywBzcafHmHVxEo_2w",
+      "originalText": "PE",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "C02zBfzMlIrHHb9jXMwfp",
+      "type": "arrow",
+      "x": 1168.2938279128443,
+      "y": 1055.403032405695,
+      "width": 0,
+      "height": 142.31830831513003,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6W",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 382251877,
+      "version": 59,
+      "versionNonce": 1743398917,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918318815,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          142.31830831513003
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "ALR03rYFNIwrhvjg5sh6b",
+        "focus": -0.011027737431662096,
+        "gap": 1
+      },
+      "endBinding": {
+        "elementId": "UKC3sdnzeU7ojia3ee0jf",
+        "focus": 0.002013776548518158,
+        "gap": 1
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "_FEv-hFXKJPcfyVhrnEeh",
+      "type": "arrow",
+      "x": 1135.7639288693858,
+      "y": 1198.5345881969115,
+      "width": 0.8132474760866444,
+      "height": 141.5050608390436,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6X",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 237965323,
+      "version": 55,
+      "versionNonce": 422139947,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918325654,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0.8132474760866444,
+          -141.5050608390436
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "UKC3sdnzeU7ojia3ee0jf",
+        "focus": -0.4415317972421559,
+        "gap": 1
+      },
+      "endBinding": {
+        "elementId": "ALR03rYFNIwrhvjg5sh6b",
+        "focus": 0.41266269335425493,
+        "gap": 1.7082262697933857
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "cC4EzRZ0sRgT95TZ3QSG2",
+      "type": "arrow",
+      "x": 1380.0701092381398,
+      "y": 1124.529067873044,
+      "width": 207.71004394486317,
+      "height": 0,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6Y",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1461475013,
+      "version": 108,
+      "versionNonce": 1396390123,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918375459,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -207.71004394486317,
+          0
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "NZJOngIM1XTxfpDkv6iHd",
+        "focus": -0.043755400059227775,
+        "gap": 3.9853868118145783
+      },
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "-lemSubarpDt_VTco4y--",
+      "type": "arrow",
+      "x": 846.2478273826069,
+      "y": 1099.3183961143636,
+      "width": 1.6264949521729477,
+      "height": 102.46918198689377,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6Z",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1882352363,
+      "version": 38,
+      "versionNonce": 278812869,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918344110,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          1.6264949521729477,
+          102.46918198689377
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "X9aKywBzcafHmHVxEo_2w",
+        "focus": 0.05585561618443548,
+        "gap": 1
+      },
+      "endBinding": {
+        "elementId": "2KfJmhqe_316ccBfDPulT",
+        "focus": -0.030450728042418416,
+        "gap": 2.0425152945231275
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "UrS_Cr3-IuWB18xKcP9si",
+      "type": "arrow",
+      "x": 816.157670767408,
+      "y": 1203.4140730534305,
+      "width": 0.813247476086417,
+      "height": 101.65593451080736,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6a",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1891466059,
+      "version": 23,
+      "versionNonce": 1300017515,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750918347736,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0.813247476086417,
+          -101.65593451080736
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "2KfJmhqe_316ccBfDPulT",
+        "focus": -0.4768513606978028,
+        "gap": 1
+      },
+      "endBinding": {
+        "elementId": "X9aKywBzcafHmHVxEo_2w",
+        "focus": 0.43191758493337223,
+        "gap": 3.3347212219662197
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "5T1NBmxM89_CttaaN6Gmf",
+      "type": "rectangle",
+      "x": 1340.4808188639108,
+      "y": 503.1124545623845,
+      "width": 121,
+      "height": 80,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6b",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 2090608197,
+      "version": 85,
+      "versionNonce": 1607967493,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "TBwDKFsybyGTp1OvOR99R",
+      "type": "rectangle",
+      "x": 1336.4808188639108,
+      "y": 584.1124545623845,
+      "width": 128,
+      "height": 13,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6c",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 287905189,
+      "version": 66,
+      "versionNonce": 559348325,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "mCNS19nC7T_qFEtNvbCk1",
+      "type": "rectangle",
+      "x": 1355.4808188639108,
+      "y": 525.1124545623845,
+      "width": 35,
+      "height": 43,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6d",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 421599493,
+      "version": 67,
+      "versionNonce": 350214827,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "zIhar2faPyM6tqtSDbrKP",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1750923378753,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "Rbg-aSn9uSGC7nrPtbmJ3",
+      "type": "line",
+      "x": 1379.1919748854862,
+      "y": 546.7986428283019,
+      "width": 20.96582407769565,
+      "height": 31.545007306275117,
+      "angle": 0,
+      "strokeColor": "#000",
+      "backgroundColor": "#ff00",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "zVuKZ7-wSjjOURSQEE2sY",
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "seed": 503427173,
+      "version": 891,
+      "versionNonce": 1913480485,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          3.8266896363502756,
+          -4.495535539415729
+        ],
+        [
+          -6.523740307649444,
+          -7.099835732189148
+        ],
+        [
+          -4.940052282859354,
+          -15.458691919054852
+        ],
+        [
+          -17.139134441345377,
+          -2.3859528962241803
+        ],
+        [
+          -9.003242999093644,
+          -0.21577089436751182
+        ],
+        [
+          -13.368501070636167,
+          16.086315387220267
+        ],
+        [
+          -3.642735264157652,
+          4.561339750972302
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b6e",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "oE8w4Qi7LT4_YfUApYbOB",
+      "type": "line",
+      "x": 1375.3553514156174,
+      "y": 544.4741220672055,
+      "width": 1.5570763555064515,
+      "height": 2.7249486827974203,
+      "angle": 0,
+      "strokeColor": "#3d71b7",
+      "backgroundColor": "#ff00",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "zVuKZ7-wSjjOURSQEE2sY",
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "seed": 496524229,
+      "version": 530,
+      "versionNonce": 131037317,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -1.5570763555064515,
+          2.7249486827974203
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b6f",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "B7tUDm41_78fa-fPkNwOh",
+      "type": "line",
+      "x": 1406.4808188639108,
+      "y": 520.1124545623845,
+      "width": 38,
+      "height": 1,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6g",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 170789,
+      "version": 294,
+      "versionNonce": 1991778277,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          38,
+          1
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "2MwKmfXXCbaVqO-imVZdF",
+      "type": "line",
+      "x": 1407.4808188639108,
+      "y": 533.1124545623845,
+      "width": 36,
+      "height": 1,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6h",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1303244421,
+      "version": 55,
+      "versionNonce": 81058629,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          36,
+          -1
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "3egAlbfyIPRHi6cqsRQZR",
+      "type": "line",
+      "x": 1406.4808188639108,
+      "y": 544.1124545623845,
+      "width": 36,
+      "height": 0,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6i",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 626513381,
+      "version": 44,
+      "versionNonce": 1518545573,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          36,
+          0
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "RK-kjXDZDoZPeVJ40SOPA",
+      "type": "line",
+      "x": 1408.4808188639108,
+      "y": 557.1124545623845,
+      "width": 34,
+      "height": 0,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6j",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1913508165,
+      "version": 48,
+      "versionNonce": 946900485,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          34,
+          0
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "SIJXrEhiCzWRwO5I1iLqo",
+      "type": "text",
+      "x": 1354.5508567057077,
+      "y": 597.6124545623845,
+      "width": 97.85992431640625,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "JacQV6tZUDXXxsz7LXUKB"
+      ],
+      "frameId": null,
+      "index": "b6k",
+      "roundness": null,
+      "seed": 1630363813,
+      "version": 241,
+      "versionNonce": 1838843237,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923371532,
+      "link": null,
+      "locked": false,
+      "text": "Generator",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Generator",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "zIhar2faPyM6tqtSDbrKP",
+      "type": "arrow",
+      "x": 1337.869040785739,
+      "y": 545.2027222839259,
+      "width": 221.54936858429937,
+      "height": 62.6117780781716,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6l",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1697263653,
+      "version": 32,
+      "versionNonce": 621104459,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923378753,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -221.54936858429937,
+          62.6117780781716
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "mCNS19nC7T_qFEtNvbCk1",
+        "focus": 0.4285251128856083,
+        "gap": 14
+      },
+      "endBinding": {
+        "elementId": "kg6SX9A91iHBz-67DeAZu",
+        "focus": -0.019752783171366514,
+        "gap": 2.507542016518528
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "Al1xZHRsDACQFVyI2kSTB",
+      "type": "text",
+      "x": 1193.7232314342218,
+      "y": 534.3298733195887,
+      "width": 64.67997741699219,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#1971c2",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b6m",
+      "roundness": null,
+      "seed": 58926693,
+      "version": 94,
+      "versionNonce": 480684043,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1750923400715,
+      "link": null,
+      "locked": false,
+      "text": "Pgen",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Pgen",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "C8YYJoOw2Ut8eNh4qFYgU",
+      "x": 1625.541076678646,
+      "y": 530.0782388002679,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 10.399555008158492,
+      "height": 6.800680247506359,
+      "angle": 0,
+      "seed": 354995420,
+      "version": 388,
+      "versionNonce": 2067179364,
+      "isDeleted": false,
+      "groupIds": [
+        "cMoUL0ehPrcS_5U_5pHdc",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          8.82386449111737,
+          0
+        ],
+        [
+          8.82386449111737,
+          0
+        ],
+        [
+          9.937878840735646,
+          0.4604980540907079
+        ],
+        [
+          10.399555008158492,
+          1.5756905170411233
+        ],
+        [
+          10.399555008158492,
+          4.72707155112337
+        ],
+        [
+          10.399555008158492,
+          4.72707155112337
+        ],
+        [
+          9.961909948398345,
+          5.986050943026572
+        ],
+        [
+          8.902647814812964,
+          6.800680247506359
+        ]
+      ],
+      "index": "b6n",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "eVbEKtZQ5LwPl2ikFAL1C",
+      "x": 1560.3074868688307,
+      "y": 572.6218857657693,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 12.605524136328986,
+      "height": 11.029833619287865,
+      "angle": 0,
+      "seed": 1756549468,
+      "version": 388,
+      "versionNonce": 204741348,
+      "isDeleted": false,
+      "groupIds": [
+        "W6FVvu5GlEmyx4DSeYgQP",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          7.8784525852056175
+        ],
+        [
+          0,
+          7.8784525852056175
+        ],
+        [
+          -0.9221727188179774,
+          10.106475273659866
+        ],
+        [
+          -3.1513810340822466,
+          11.029833619287865
+        ],
+        [
+          -9.45414310224674,
+          11.029833619287865
+        ],
+        [
+          -9.45414310224674,
+          11.029833619287865
+        ],
+        [
+          -11.683351417511009,
+          10.106475273659866
+        ],
+        [
+          -12.605524136328986,
+          7.8784525852056175
+        ],
+        [
+          -12.605524136328986,
+          0
+        ]
+      ],
+      "index": "b6o",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "-97mBuqlLGB9rcs8rVJpX",
+      "x": 1632.7892506527223,
+      "y": 571.0461952487283,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 12.605524136328986,
+      "height": 12.605524136328986,
+      "angle": 0,
+      "seed": 898123228,
+      "version": 388,
+      "versionNonce": 339156580,
+      "isDeleted": false,
+      "groupIds": [
+        "Hkrb3SbN2yJyIm2d80iSl",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          9.45414310224674
+        ],
+        [
+          0,
+          9.45414310224674
+        ],
+        [
+          -0.9221742215135541,
+          11.682165790700987
+        ],
+        [
+          -3.1513810340822466,
+          12.605524136328986
+        ],
+        [
+          -9.45414310224674,
+          12.605524136328986
+        ],
+        [
+          -9.45414310224674,
+          12.605524136328986
+        ],
+        [
+          -11.683349914815432,
+          11.682165790700987
+        ],
+        [
+          -12.605524136328986,
+          9.45414310224674
+        ],
+        [
+          -12.605524136328986,
+          0
+        ]
+      ],
+      "index": "b6p",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "ONFphXB17w7PQ6ZKlle6Y",
+      "x": 1554.950139711969,
+      "y": 530.0782388002679,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 10.399558013549644,
+      "height": 6.800680247506359,
+      "angle": 0,
+      "seed": 549136988,
+      "version": 388,
+      "versionNonce": 1007530468,
+      "isDeleted": false,
+      "groupIds": [
+        "eIIX20IIKxm7yQ6iz3EMm",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -8.823867496508521,
+          0
+        ],
+        [
+          -8.823867496508521,
+          0
+        ],
+        [
+          -9.937880719105115,
+          0.4604980540907079
+        ],
+        [
+          -10.399558013549644,
+          1.5756905170411233
+        ],
+        [
+          -10.399558013549644,
+          4.72707155112337
+        ],
+        [
+          -10.399558013549644,
+          4.72707155112337
+        ],
+        [
+          -9.961909948398342,
+          5.986050943026572
+        ],
+        [
+          -8.902651947225797,
+          6.800680247506359
+        ]
+      ],
+      "index": "b6q",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "91xjcB0zl1uTmLb0UP2uh",
+      "x": 1552.7725354655045,
+      "y": 541.1206800354444,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 23.386397163250336,
+      "height": 29.626133173536587,
+      "angle": 0,
+      "seed": 1562214108,
+      "version": 388,
+      "versionNonce": 1657132388,
+      "isDeleted": false,
+      "groupIds": [
+        "KHp4Yn7dL7y2kLe1pX_UW",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          4.708163132681665,
+          -21.240310453811617
+        ],
+        [
+          4.708163132681665,
+          -21.240310453811617
+        ],
+        [
+          5.730096805446067,
+          -23.889535707025683
+        ],
+        [
+          7.445136791401961,
+          -26.076102029909737
+        ],
+        [
+          9.720335104791348,
+          -27.667056928619054
+        ],
+        [
+          12.422742257160651,
+          -28.529453920091203
+        ],
+        [
+          17.053698393806684,
+          -29.13333618072014
+        ],
+        [
+          23.386397163250336,
+          -29.626133173536587
+        ]
+      ],
+      "index": "b6r",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "00cm2r1c6MrY34K2XWpJX",
+      "x": 1605.8985133075505,
+      "y": 511.58593629879624,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 21.81701195684908,
+      "height": 29.53789338657678,
+      "angle": 0,
+      "seed": 1933656924,
+      "version": 388,
+      "versionNonce": 1437436132,
+      "isDeleted": false,
+      "groupIds": [
+        "vxWvAZ5ety4OnbjrHhCQ-",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          0
+        ],
+        [
+          5.343561427640877,
+          0.4636462013239091
+        ],
+        [
+          9.394269699688424,
+          1.0052898165567952
+        ],
+        [
+          12.097120147252856,
+          1.8676868080289446
+        ],
+        [
+          14.373060792257137,
+          3.4586417067382578
+        ],
+        [
+          16.08824353429282,
+          5.645208029622313
+        ],
+        [
+          17.10885032686299,
+          8.294433282836378
+        ],
+        [
+          21.81701195684908,
+          29.53789338657678
+        ]
+      ],
+      "index": "b6s",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "Q5Co4dGa6LR7Z-d-0fQul",
+      "x": 1632.7892506527223,
+      "y": 571.0461952487283,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 91.39004998838514,
+      "height": 6.302762068164493,
+      "angle": 0,
+      "seed": 158889948,
+      "version": 389,
+      "versionNonce": 139644004,
+      "isDeleted": false,
+      "groupIds": [
+        "s6LcMuVQj54SwPec5KvGN",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -85.08728792022065,
+          0
+        ],
+        [
+          -85.08728792022065,
+          0
+        ],
+        [
+          -87.31649623548492,
+          -0.9233583456279991
+        ],
+        [
+          -88.2386689543029,
+          -3.1513810340822466
+        ],
+        [
+          -88.2386689543029,
+          -6.302762068164493
+        ],
+        [
+          3.151381034082246,
+          -6.302762068164493
+        ],
+        [
+          3.151381034082246,
+          -3.1513810340822466
+        ],
+        [
+          3.151381034082246,
+          -3.1513810340822466
+        ],
+        [
+          2.229206812568692,
+          -0.9233583456279991
+        ],
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          0
+        ]
+      ],
+      "index": "b6t",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "ROtIWXXpMJgEdyqUlfIuC",
+      "x": 1544.5505816984194,
+      "y": 556.8649805953581,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 91.39004998838516,
+      "height": 17.332595687452358,
+      "angle": 0,
+      "seed": 735386716,
+      "version": 388,
+      "versionNonce": 1283694564,
+      "isDeleted": false,
+      "groupIds": [
+        "rjZrBMhZ6jgsGXqiLE_F9",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          -7.8784525852056175
+        ],
+        [
+          0,
+          -7.8784525852056175
+        ],
+        [
+          0.5523717346288916,
+          -10.942965793389586
+        ],
+        [
+          2.3018373492254605,
+          -13.261703208418481
+        ],
+        [
+          5.386922459854547,
+          -14.938591256377364
+        ],
+        [
+          9.946152682580996,
+          -16.077562374133592
+        ],
+        [
+          16.118052506447956,
+          -16.78251894464299
+        ],
+        [
+          24.04114867454196,
+          -17.157399415555243
+        ],
+        [
+          33.853964173210585,
+          -17.306118191390784
+        ],
+        [
+          45.69502499419258,
+          -17.332595687452358
+        ],
+        [
+          57.53608581517456,
+          -17.305991964962338
+        ],
+        [
+          67.34890431923434,
+          -17.156954617664535
+        ],
+        [
+          75.27199898463276,
+          -16.78168945668465
+        ],
+        [
+          81.4439003111953,
+          -16.076378250019143
+        ],
+        [
+          86.0031267771828,
+          -14.937208776446791
+        ],
+        [
+          89.08821489320306,
+          -13.260374825528672
+        ],
+        [
+          90.83767712673456,
+          -10.942058165261255
+        ],
+        [
+          91.39004998838516,
+          -7.8784525852056175
+        ],
+        [
+          91.39004998838516,
+          -0.9832317481863133
+        ]
+      ],
+      "index": "b6u",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "aOGBKp6BELJjGmkyOwDQs",
+      "x": 1635.9406316868046,
+      "y": 548.9865280101525,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 18.90828620449348,
+      "height": 9.45414310224674,
+      "angle": 0,
+      "seed": 338243804,
+      "version": 388,
+      "versionNonce": 172884836,
+      "isDeleted": false,
+      "groupIds": [
+        "O0g0MELFka46b0Noz2nKr",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          9.45414310224674
+        ],
+        [
+          -18.90828620449348,
+          9.45414310224674
+        ],
+        [
+          -18.90828620449348,
+          3.1513810340822466
+        ],
+        [
+          -18.90828620449348,
+          3.1513810340822466
+        ],
+        [
+          -17.986111982979924,
+          0.9221682107312473
+        ],
+        [
+          -15.756905170411232,
+          0
+        ],
+        [
+          -6.302762068164493,
+          0
+        ]
+      ],
+      "index": "b6v",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "KT3K0fcgVYFjH4T8kuftc",
+      "x": 1550.853343766584,
+      "y": 548.9865280101525,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 18.90828620449348,
+      "height": 9.45414310224674,
+      "angle": 0,
+      "seed": 1913042268,
+      "version": 389,
+      "versionNonce": 2013263588,
+      "isDeleted": false,
+      "groupIds": [
+        "D6aG_szEsb7TQgiLpbOOC",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          9.454143102246737,
+          0
+        ],
+        [
+          9.454143102246737,
+          0
+        ],
+        [
+          11.683351417511007,
+          0.9221682107312473
+        ],
+        [
+          12.605524136328984,
+          3.1513810340822466
+        ],
+        [
+          12.605524136328984,
+          9.45414310224674
+        ],
+        [
+          -6.302762068164492,
+          9.45414310224674
+        ],
+        [
+          -6.302762068164492,
+          0
+        ]
+      ],
+      "index": "b6w",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "aklGjeo1cAtoL0PX8Gt22",
+      "x": 1569.7616299710774,
+      "y": 558.4406711123993,
+      "strokeColor": "#263238",
+      "backgroundColor": "none",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "strokeSharpness": "sharp",
+      "roughness": 0,
+      "opacity": 100,
+      "width": 40.967953443069206,
+      "height": 9.45414310224674,
+      "angle": 0,
+      "seed": 851421660,
+      "version": 388,
+      "versionNonce": 1378318948,
+      "isDeleted": false,
+      "groupIds": [
+        "8BPNjXIQdUJEDN4S2FMBY",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "boundElementIds": null,
+      "type": "line",
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          -3.1513810340822466
+        ],
+        [
+          0,
+          -3.1513810340822466
+        ],
+        [
+          0.4973261172846432,
+          -5.598628974831125
+        ],
+        [
+          1.8514351553668587,
+          -7.602707946879881
+        ],
+        [
+          3.8555171328067677,
+          -8.956816984962096
+        ],
+        [
+          6.302762068164493,
+          -9.45414310224674
+        ],
+        [
+          34.665191374904715,
+          -9.45414310224674
+        ],
+        [
+          34.665191374904715,
+          -9.45414310224674
+        ],
+        [
+          37.11243330487128,
+          -8.956816984962096
+        ],
+        [
+          39.11651828770235,
+          -7.602707946879881
+        ],
+        [
+          40.47062732578456,
+          -5.598628974831125
+        ],
+        [
+          40.967953443069206,
+          -3.1513810340822466
+        ],
+        [
+          40.967953443069206,
+          0
+        ]
+      ],
+      "index": "b6x",
+      "frameId": null,
+      "roundness": null,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "startBinding": null,
+      "endBinding": null,
+      "lastCommittedPoint": null,
+      "startArrowhead": null,
+      "endArrowhead": null
+    },
+    {
+      "id": "AA1-MrV_TXuz6gC5j2loU",
+      "type": "line",
+      "x": 1603.1279882959063,
+      "y": 503.003538841226,
+      "width": 33.518770820567866,
+      "height": 50.43206823227278,
+      "angle": 0,
+      "strokeColor": "#000",
+      "backgroundColor": "#ff00",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "i0ikBwHW7vwvtSpWM6wh9",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "seed": 1231425116,
+      "version": 1489,
+      "versionNonce": 328371684,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          6.117857921870189,
+          -7.187164449295308
+        ],
+        [
+          -10.429723890396982,
+          -11.35074709627549
+        ],
+        [
+          -7.89782837522431,
+          -24.714332701656176
+        ],
+        [
+          -27.40091289869768,
+          -3.8145034519434153
+        ],
+        [
+          -14.393788558473407,
+          -0.344960213881967
+        ],
+        [
+          -21.372674021331385,
+          25.717735530616604
+        ],
+        [
+          -5.823763856208082,
+          7.2923678640534915
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b6y",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "HdMdiPzGHB6TyqrDo_vQS",
+      "type": "line",
+      "x": 1596.994248818995,
+      "y": 499.2872490178399,
+      "width": 2.4893505410011114,
+      "height": 4.356467461427532,
+      "angle": 0,
+      "strokeColor": "#3d71b7",
+      "backgroundColor": "#ff00",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 0,
+      "opacity": 100,
+      "groupIds": [
+        "i0ikBwHW7vwvtSpWM6wh9",
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "seed": 1993073372,
+      "version": 1127,
+      "versionNonce": 760164708,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -2.4893505410011114,
+          4.356467461427532
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": null,
+      "index": "b6z",
+      "frameId": null,
+      "roundness": null,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "uNq6k_qleyoIn0GJe-at1",
+      "type": "rectangle",
+      "x": 1526.6176965119498,
+      "y": 584.9967886541037,
+      "width": 128,
+      "height": 13,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "frameId": null,
+      "index": "b70",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 293807964,
+      "version": 313,
+      "versionNonce": 1051419876,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "eB2XFfY2ojFIbUAYu6c2S",
+      "type": "text",
+      "x": 1575.2677056672233,
+      "y": 598.4967886541037,
+      "width": 36.699981689453125,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [
+        "NIrz1d23oQmmtbysGqcSU"
+      ],
+      "frameId": null,
+      "index": "b71",
+      "roundness": null,
+      "seed": 1306385372,
+      "version": 491,
+      "versionNonce": 1295329380,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751002801414,
+      "link": null,
+      "locked": false,
+      "text": "V2L",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "V2L",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "aUmBiCif8hZ2XHfjqVEd2",
+      "type": "text",
+      "x": 1486.6176965119498,
+      "y": 539.8929973968368,
+      "width": 30.059982299804688,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b72",
+      "roundness": null,
+      "seed": 892326628,
+      "version": 7,
+      "versionNonce": 532917988,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751002811313,
+      "link": null,
+      "locked": false,
+      "text": "OR",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "OR",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "rK63v7BXjqB5e_WGUw5m_",
+      "type": "text",
+      "x": 1010.1697289826527,
+      "y": 1161.992997396837,
+      "width": 116.61993408203125,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b73",
+      "roundness": null,
+      "seed": 267947996,
+      "version": 324,
+      "versionNonce": 461081692,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751003805328,
+      "link": null,
+      "locked": false,
+      "text": "Lsop_dsc",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lsop_dsc",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "tOZz81Ds3zE7smfdbKdYW",
+      "type": "text",
+      "x": 870.1697289826527,
+      "y": 1170.992997396837,
+      "width": 112.89593505859375,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b74",
+      "roundness": null,
+      "seed": 227907420,
+      "version": 328,
+      "versionNonce": 2101246820,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751003816553,
+      "link": null,
+      "locked": false,
+      "text": "Lsop_chr",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lsop_chr",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "dKpDkw5kVky_oCw86scM0",
+      "type": "text",
+      "x": 693.3077294709342,
+      "y": 1169.992997396837,
+      "width": 116.61993408203125,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b75",
+      "roundness": null,
+      "seed": 1370883556,
+      "version": 335,
+      "versionNonce": 793735900,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751003820586,
+      "link": null,
+      "locked": false,
+      "text": "Lsop_dsc",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lsop_dsc",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "_tGXva2mLjVjYdlZ7SM8b",
+      "type": "text",
+      "x": 1132.3557031037465,
+      "y": 1269.992997396837,
+      "width": 69.77595520019531,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#f08c00",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b76",
+      "roundness": null,
+      "seed": 1428763492,
+      "version": 175,
+      "versionNonce": 2053188708,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751005125334,
+      "link": null,
+      "locked": false,
+      "text": "Rbatt",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Rbatt",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "3qIbJrlpy9ixlqMem2Xob",
+      "type": "text",
+      "x": 814.7297189118524,
+      "y": 1273.992997396837,
+      "width": 69.77595520019531,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#f08c00",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b77",
+      "roundness": null,
+      "seed": 1275240036,
+      "version": 194,
+      "versionNonce": 90227292,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751005121850,
+      "link": null,
+      "locked": false,
+      "text": "Rbatt",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Rbatt",
+      "autoResize": true,
+      "lineHeight": 1.35
+    },
+    {
+      "id": "JojmvUvZ78kkoBjpRzNNM",
+      "type": "text",
+      "x": 762.8213333885292,
+      "y": 566.7153439865148,
+      "width": 74.00396728515625,
+      "height": 37.800000000000004,
+      "angle": 0,
+      "strokeColor": "#e03131",
+      "backgroundColor": "transparent",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b78",
+      "roundness": null,
+      "seed": 1445394446,
+      "version": 348,
+      "versionNonce": 1424650258,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1751091400495,
+      "link": null,
+      "locked": false,
+      "text": "Lacpv",
+      "fontSize": 28,
+      "fontFamily": 6,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Lacpv",
+      "autoResize": true,
+      "lineHeight": 1.35
+    }
+  ],
+  "appState": {
+    "gridSize": 20,
+    "gridStep": 5,
+    "gridModeEnabled": false,
+    "viewBackgroundColor": "#ffffff"
+  },
+  "files": {}
+}

+ 478 - 0
client/docs/public/assets/Hardware/Power/aPower_S/aPowerS基本规格参数表.json

@@ -0,0 +1,478 @@
+{
+  "config": [
+    "类型",
+    "项目",
+    "值/范围",
+    "说明"
+  ],
+  "data": [
+    {
+      "类型": {
+        "text": "直流光伏",
+        "rowspan": 8
+      },
+      "项目": "最高STC光伏匹配功率",
+      "值/范围": "20kW"
+    },
+    {
+      "项目": "最大光伏输入功率",
+      "值/范围": "15kW"
+    },
+    {
+      "项目": "最大输入电压",
+      "值/范围": "600V"
+    },
+    {
+      "项目": "工作电压范围",
+      "值/范围": "60-550V"
+    },
+    {
+      "项目": "MPPT电压范围",
+      "值/范围": "90-480V"
+    },
+    {
+      "项目": "MPPT数量",
+      "值/范围": "4"
+    },
+    {
+      "项目": "最大MPPT电流",
+      "值/范围": "15A"
+    },
+    {
+      "项目": "最大短路电流",
+      "值/范围": "20A"
+    },
+    {
+      "类型": {
+        "text": "交流输出",
+        "rowspan": 28
+      },
+      "项目": "市电接入制式",
+      "值/范围": "120V/240VSPLIT\n120V/208V"
+    },
+    {
+      "项目": "输入电压范围",
+      "值/范围": "96~144V@120V\n192~288V@240V\n183~228V@208V"
+    },
+    {
+      "项目": "限流电压",
+      "值/范围": "105V@120V\n211V@240V\n183V@208V",
+      "说明": "电压低于此值可以限流"
+    },
+    {
+      "项目": "频率范围",
+      "值/范围": "50/60±5Hz"
+    },
+    {
+      "项目": "输出电压畸变率",
+      "值/范围": "< 3%",
+      "说明": "阻性满载下(离网)"
+    },
+    {
+      "项目": "输出电流畸变率",
+      "值/范围": "< 5%",
+      "说明": "阻性满载下\nIEEE-1547-2018"
+    },
+    {
+      "项目": "并网电流直流分量",
+      "值/范围": "< 0.5%",
+      "说明": "IEEE-1547-2018,7.1"
+    },
+    {
+      "项目": "离网功率",
+      "值/范围": "10 kW",
+      "说明": "240V"
+    },
+    {
+      "项目": "并网功率",
+      "值/范围": "11.5 kVA",
+      "说明": "240V"
+    },
+    {
+      "项目": "峰值有功功率",
+      "值/范围": "15kW/10s",
+      "说明": "240V"
+    },
+    {
+      "项目": "最大持续电流",
+      "值/范围": "47.9A",
+      "说明": "11500VA*1.0(PF)/240V"
+    },
+    {
+      "项目": "负载启动能力",
+      "值/范围": "150A",
+      "说明": "指能启动LRA具有150A的负载"
+    },
+    {
+      "项目": "输出功率因数",
+      "值/范围": "-1.0 ~ +1.0\n-0.87 ~ +0.87"
+    },
+    {
+      "项目": "负载功率因数",
+      "值/范围": "-1 ~ +1"
+    },
+    {
+      "项目": "动态响应时间",
+      "值/范围": "50ms",
+      "说明": "0~100% 负载变化"
+    },
+    {
+      "项目": "变换器最高效率",
+      "值/范围": "96.2%"
+    },
+    {
+      "项目": "光伏并网CEC效率",
+      "值/范围": ">97%"
+    },
+    {
+      "项目": "直流效率",
+      "值/范围": ">95%",
+      "说明": "@ 2000W"
+    },
+    {
+      "项目": "光伏至电池至交流的RTE效率",
+      "值/范围": "Up To 90%",
+      "说明": "@光伏组串电压接近BUS电压为电池充电/35℃"
+    },
+    {
+      "项目": "MPPT效率",
+      "值/范围": "≥99.5%"
+    },
+    {
+      "项目": "总吞吐电量",
+      "值/范围": "57MWH",
+      "说明": "AC(60*0.95)"
+    },
+    {
+      "项目": "并切离网切换时间",
+      "值/范围": "<16.6ms"
+    },
+    {
+      "项目": "离网切并网时间",
+      "值/范围": "<16.6ms"
+    },
+    {
+      "项目": "单机负载不平衡度",
+      "值/范围": "100%"
+    },
+    {
+      "项目": "过载能力",
+      "值/范围": "0 ~ 105%   长期\n105% ~ 120%   120s\n121% ~ 150%   10s\n150% ~ ∞      400ms",
+      "说明": "离网"
+    },
+    {
+      "项目": "最大交流组网数量",
+      "值/范围": "15(组网)",
+      "说明": "电量可以调度,最大功率需达到160A,系统稳定"
+    },
+    {
+      "项目": "最大交流并机数量",
+      "值/范围": "4(性能)"
+    },
+    {
+      "项目": "并机负载不平衡度",
+      "值/范围": "<5%",
+      "说明": "离网模式,SOC一致时"
+    },
+    {
+      "类型": {
+        "text": "电池",
+        "rowspan": 15
+      },
+      "项目": "额定安时容量(C10)",
+      "值/范围": "314AH"
+    },
+    {
+      "项目": "最大存储电量",
+      "值/范围": "16.07kWH"
+    },
+    {
+      "项目": "可用电量",
+      "值/范围": "15kWH"
+    },
+    {
+      "项目": "总吞吐电量",
+      "值/范围": "60MWH",
+      "说明": "70%SOH"
+    },
+    {
+      "项目": "循环次数",
+      "值/范围": "IR要求:7500 CYCLES @70%SOH/80%DOD\n实际能力:8750 CYCLES @70%SOH/80%DOD",
+      "说明": "25±2℃ 0.5P充放电"
+    },
+    {
+      "项目": "电池串联节数",
+      "值/范围": "16节"
+    },
+    {
+      "项目": "额定电池节电压/总电压",
+      "值/范围": "3.2V/51.2V"
+    },
+    {
+      "项目": "满充电压节电压/总电压",
+      "值/范围": "3.6V/57.6V"
+    },
+    {
+      "项目": "最低节电压/总电压",
+      "值/范围": "2.8V/44.8V"
+    },
+    {
+      "项目": "最大持续充电电流",
+      "值/范围": "246.7A",
+      "说明": "10*1.05/0.95/44.8"
+    },
+    {
+      "项目": "最大持续放电电流",
+      "值/范围": "221.5A",
+      "说明": "10*1.05*0.945/44.8"
+    },
+    {
+      "项目": "均衡开启电压",
+      "值/范围": "/",
+      "说明": "TBD"
+    },
+    {
+      "项目": "均衡开启压差",
+      "值/范围": "被动均衡:40mv\n主动均衡:80mv"
+    },
+    {
+      "项目": "均衡电流",
+      "值/范围": "充电均衡电流2A\n放电均衡电流1.5A/100mA",
+      "说明": "100mA放电均衡可同时开启多节"
+    },
+    {
+      "项目": "测温点数",
+      "值/范围": "16点"
+    },
+    {
+      "类型": {
+        "text": "BMS",
+        "rowspan": 18
+      },
+      "项目": "工作电源范围",
+      "值/范围": "38V~80V"
+    },
+    {
+      "项目": "工作温度范围",
+      "值/范围": "-40℃~80℃"
+    },
+    {
+      "项目": "采集串数",
+      "值/范围": "16串"
+    },
+    {
+      "项目": "温度检测点数",
+      "值/范围": "16个"
+    },
+    {
+      "项目": "单体检测范围",
+      "值/范围": "0~5V(@-20℃~60℃)",
+      "说明": "±5mv(-40~80℃)"
+    },
+    {
+      "项目": "电芯温度采集范围",
+      "值/范围": "-40℃~130℃",
+      "说明": "±2℃(-20~60)"
+    },
+    {
+      "项目": "环境温度",
+      "值/范围": "-40℃~130℃",
+      "说明": "±3℃(-20~60)"
+    },
+    {
+      "项目": "电池均衡原理",
+      "值/范围": "主动/被动均衡"
+    },
+    {
+      "项目": "均衡电流大小",
+      "值/范围": "被动均衡 1.5A\n主动均衡 2A",
+      "说明": "±0.2A"
+    },
+    {
+      "项目": "总压采集范围",
+      "值/范围": "38V~80V",
+      "说明": "±0.1V,100ms"
+    },
+    {
+      "项目": "电流采集范围",
+      "值/范围": "-350A~+280A",
+      "说明": "±1%FS"
+    },
+    {
+      "项目": "通信接口",
+      "值/范围": "CAN/UART",
+      "说明": "CAN*1,UART*1"
+    },
+    {
+      "项目": "推荐存储温度范围",
+      "值/范围": "0℃~30℃"
+    },
+    {
+      "项目": "工作环境湿度",
+      "值/范围": "100%(凝露)"
+    },
+    {
+      "项目": "SOC精度",
+      "值/范围": "0%~100%",
+      "说明": "精度≤5%"
+    },
+    {
+      "项目": "工作功耗",
+      "值/范围": "主控板:2W\n灯带:5W\n均衡板:0.7+10.4W",
+      "说明": "开启主动均衡的状态"
+    },
+    {
+      "项目": "电芯加热温度均匀性",
+      "值/范围": "温差≤9℃"
+    },
+    {
+      "项目": "计算寿命",
+      "值/范围": "20年"
+    },
+    {
+      "类型": {
+        "text": "温控单元",
+        "rowspan": 8
+      },
+      "项目": "工作环境温度范围(℃)",
+      "值/范围": "-20~50℃"
+    },
+    {
+      "项目": "输入电压范围(VDC)",
+      "值/范围": "40VDC~60VDC"
+    },
+    {
+      "项目": "工作功率(W)",
+      "值/范围": "≤440W@52VDC"
+    },
+    {
+      "项目": "加热启动温度",
+      "值/范围": "Tmin≤6℃",
+      "说明": "结合电芯SOC"
+    },
+    {
+      "项目": "加热停止温度",
+      "值/范围": "Tmin≥10℃",
+      "说明": "结合充电功率按策略动态调整"
+    },
+    {
+      "项目": "电池温度保护点",
+      "值/范围": "58℃"
+    },
+    {
+      "项目": "温度保护恢复点",
+      "值/范围": "53℃"
+    },
+    {
+      "项目": "温度传感器",
+      "值/范围": "-40℃~120℃",
+      "说明": "每个加热膜配置1个温度传感器,温度传感器精度可要求在+/-3℃(-20℃~60℃)"
+    },
+    {
+      "类型": {
+        "text": "法规及认证",
+        "rowspan": 4
+      },
+      "项目": "认证",
+      "值/范围": "UL 1741, UL 1973,UL 9540, IEEE 1547,IEEE 1547.1,IEEE2030.5, UN 38.3,UL9540A, UL1699B, UL1998, UL 1741 CRD PCS"
+    },
+    {
+      "项目": "电磁干扰",
+      "值/范围": "FCC Part 15 Class B\nICES 003 Class B"
+    },
+    {
+      "项目": "环保",
+      "值/范围": "RoHS Directive-2011 EU\nCalifornia`s Proposition 65"
+    },
+    {
+      "项目": "地震",
+      "值/范围": "AC156, IEEE 693-2005 (high)"
+    },
+    {
+      "类型": {
+        "text": "其他",
+        "rowspan": 6
+      },
+      "项目": "整机尺寸",
+      "值/范围": "1150*750*303"
+    },
+    {
+      "项目": "整机重量",
+      "值/范围": "≤159kg"
+    },
+    {
+      "项目": "质保年限",
+      "值/范围": "15年"
+    },
+    {
+      "项目": "计算寿命",
+      "值/范围": "20年"
+    },
+    {
+      "项目": "防护等级",
+      "值/范围": "Fullpack:\nNEMA Enclosure Type 6&6P\nPCS:NEMA Enclosure Type 6\n用户接口仓:NEMA Enclosure Type 3R\nIEC体系整机:IP56"
+    },
+    {
+      "项目": "噪音",
+      "值/范围": "≤40dB(A)",
+      "说明": "如实测值更低,再进行修正"
+    },
+    {
+      "类型": {
+        "text": "辅源\n&\n损耗",
+        "rowspan": 4
+      },
+      "项目": "输入电压",
+      "值/范围": "电池输入:42~65V;\n交流输入:200~460Vdc\nBUS输入:320~440V",
+      "说明": "交流为整流后直流电压"
+    },
+    {
+      "项目": "输出电压",
+      "值/范围": "BMS:12V;\nPCS :12V;\naGate:18~30V;\nMPPT:12V;\nRSD:12V"
+    },
+    {
+      "项目": "空载损耗(并网)",
+      "值/范围": "<45W",
+      "说明": "24小时消耗电网或电池的平均功率,不包含EMS"
+    },
+    {
+      "项目": "空载损耗(离网)",
+      "值/范围": "<55W",
+      "说明": "24小时消耗电池的平均功率,不包含EMS"
+    },
+    {
+      "类型": {
+        "text": "氛围灯",
+        "rowspan": 7
+      },
+      "项目": "工作环境温度范围(℃)",
+      "值/范围": "-20~50℃",
+      "说明": "TBD"
+    },
+    {
+      "项目": "工作湿度范围",
+      "值/范围": "5%RH~95%RH"
+    },
+    {
+      "项目": "SOC灯输入电压",
+      "值/范围": "12V"
+    },
+    {
+      "项目": "SOC灯电源功率(W)",
+      "值/范围": "20",
+      "说明": "TBD"
+    },
+    {
+      "项目": "SOC灯条个数",
+      "值/范围": "1"
+    },
+    {
+      "项目": "SOC灯颜色",
+      "值/范围": "支持自定义"
+    },
+    {
+      "项目": "SOC灯分段",
+      "值/范围": "连续显示分辨率2.5%"
+    }
+  ]
+}

BIN
client/docs/public/assets/Hardware/Power/aPower_S/交流耦合接入连接图.png


BIN
client/docs/public/assets/Hardware/Power/aPower_S/直流与交流耦合同时接入连接图.png


BIN
client/docs/public/assets/Hardware/Power/aPower_S/直流耦合接入连接图.png


BIN
client/docs/public/assets/Software/EnergyStatistics/AppHomeLoad.PNG


BIN
client/docs/public/pdf/规格书_23020016_XH-SCT-S24_星火电子.pdf


BIN
client/docs/public/ppt/NEM+ & BYOD+control logic EN.pptx


BIN
client/docs/public/ppt/NEM+ Training Materials-20240905.pptx


+ 1 - 0
client/package.json

@@ -63,6 +63,7 @@
     "cytoscape-cose-bilkent": "^4.1.0",
     "dayjs": "^1.11.13",
     "debug": "^4.4.0",
+    "docx": "^9.5.1",
     "html-docx-js-typescript": "^0.1.5",
     "js-pkce": "^2.0.0",
     "jwt-decode": "^4.0.0",

+ 54 - 0
client/pnpm-lock.yaml

@@ -41,6 +41,9 @@ importers:
       debug:
         specifier: ^4.4.0
         version: 4.4.1
+      docx:
+        specifier: ^9.5.1
+        version: 9.5.1
       html-docx-js-typescript:
         specifier: ^0.1.5
         version: 0.1.5
@@ -1453,6 +1456,9 @@ packages:
   '@types/node@22.15.32':
     resolution: {integrity: sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==}
 
+  '@types/node@24.0.7':
+    resolution: {integrity: sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==}
+
   '@types/pako@2.0.3':
     resolution: {integrity: sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==}
 
@@ -2431,6 +2437,10 @@ packages:
     resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
     engines: {node: '>=0.3.1'}
 
+  docx@9.5.1:
+    resolution: {integrity: sha512-ABDI7JEirFD2+bHhOBlsGZxaG1UgZb2M/QMKhLSDGgVNhxDesTCDcP+qoDnDGjZ4EOXTRfUjUgwHVuZ6VSTfWQ==}
+    engines: {node: '>=10'}
+
   dom-serializer@1.4.1:
     resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
 
@@ -2840,6 +2850,9 @@ packages:
   has-unicode@2.0.1:
     resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
 
+  hash.js@1.1.7:
+    resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+
   hasown@2.0.2:
     resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
     engines: {node: '>= 0.4'}
@@ -3606,6 +3619,9 @@ packages:
     resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
     engines: {node: '>=10'}
 
+  minimalistic-assert@1.0.1:
+    resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+
   minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
 
@@ -4889,6 +4905,9 @@ packages:
   undici-types@6.21.0:
     resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
 
+  undici-types@7.8.0:
+    resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==}
+
   unique-filename@1.1.1:
     resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
 
@@ -5237,6 +5256,10 @@ packages:
       utf-8-validate:
         optional: true
 
+  xml-js@1.6.11:
+    resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
+    hasBin: true
+
   xml-name-validator@5.0.0:
     resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
     engines: {node: '>=18'}
@@ -5249,6 +5272,9 @@ packages:
     resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==}
     engines: {node: '>=4.0.0'}
 
+  xml@1.0.1:
+    resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==}
+
   xmlbuilder@11.0.1:
     resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
     engines: {node: '>=4.0'}
@@ -6674,6 +6700,10 @@ snapshots:
     dependencies:
       undici-types: 6.21.0
 
+  '@types/node@24.0.7':
+    dependencies:
+      undici-types: 7.8.0
+
   '@types/pako@2.0.3': {}
 
   '@types/prop-types@15.7.15': {}
@@ -7768,6 +7798,15 @@ snapshots:
 
   diff@5.2.0: {}
 
+  docx@9.5.1:
+    dependencies:
+      '@types/node': 24.0.7
+      hash.js: 1.1.7
+      jszip: 3.10.1
+      nanoid: 5.1.5
+      xml: 1.0.1
+      xml-js: 1.6.11
+
   dom-serializer@1.4.1:
     dependencies:
       domelementtype: 2.3.0
@@ -8236,6 +8275,11 @@ snapshots:
   has-unicode@2.0.1:
     optional: true
 
+  hash.js@1.1.7:
+    dependencies:
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+
   hasown@2.0.2:
     dependencies:
       function-bind: 1.1.2
@@ -9258,6 +9302,8 @@ snapshots:
 
   mimic-response@3.1.0: {}
 
+  minimalistic-assert@1.0.1: {}
+
   minimatch@3.1.2:
     dependencies:
       brace-expansion: 1.1.12
@@ -10830,6 +10876,8 @@ snapshots:
 
   undici-types@6.21.0: {}
 
+  undici-types@7.8.0: {}
+
   unique-filename@1.1.1:
     dependencies:
       unique-slug: 2.0.2
@@ -11190,6 +11238,10 @@ snapshots:
 
   ws@8.18.2: {}
 
+  xml-js@1.6.11:
+    dependencies:
+      sax: 1.4.1
+
   xml-name-validator@5.0.0: {}
 
   xml2js@0.4.23:
@@ -11202,6 +11254,8 @@ snapshots:
       sax: 1.4.1
       xmlbuilder: 11.0.1
 
+  xml@1.0.1: {}
+
   xmlbuilder@11.0.1: {}
 
   xmlchars@2.2.0: {}

+ 2 - 1
client/tsconfig.json

@@ -20,7 +20,8 @@
       "@/*": ["docs/.vitepress/*"],
       "@theme/*": ["docs/.vitepress/theme/*"],
       "@docs/*": ["docs/*"]
-    }
+    },
+    "lib": ["DOM", "ESNext"]
   },
   "include": ["env.d.ts", "*.ts", "*.tsx", "src/**/*", ".vitepress/**/*"],
   "vueCompilerOptions": {

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 164
index.html


+ 41 - 0
server/README.md

@@ -0,0 +1,41 @@
+# franklin wiki
+
+## 脚本说明
+
+### 启动测试环境
+
+```bash
+pnpm run dev
+```
+
+### 构建项目
+
+```bash
+pnpm run build
+```
+
+### 安装项目
+
+```bash
+pnpm run install
+```
+
+安装路径默认为:/var/www/fwh-wiki/server/,请确保路径存在。
+
+### 运行
+
+```bash
+pnpm run start
+```
+
+使用pm2运行服务
+
+**重新运行**
+
+```bash
+pnpm run restart
+```
+
+正在运行的项目安装后使用重新运行即可。
+
+

+ 0 - 1
server/package.json

@@ -15,7 +15,6 @@
     "restart": "pm2 restart fwhwiki-server",
     "ts:build": "rm -rf dist && tsc && tsc-alias -f",
     "es:build": "rm -rf dist && NODE_ENV=production node scripts/esbuild-build.js",
-    "sea:pack": "",
     "test": "echo \"Error: no test specified\" && exit 1"
   },
   "bin": "dist/index.js",

+ 68 - 0
server/waline/template/waline.pgsql

@@ -0,0 +1,68 @@
+
+CREATE SEQUENCE wl_comment_seq;
+
+CREATE TABLE wl_comment (
+  id int check (id > 0) NOT NULL DEFAULT NEXTVAL ('wl_comment_seq'),
+  user_id int DEFAULT NULL,
+  comment text,
+  insertedAt timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  ip varchar(100) DEFAULT '',
+  link varchar(255) DEFAULT NULL,
+  mail varchar(255) DEFAULT NULL,
+  nick varchar(255) DEFAULT NULL,
+  pid int DEFAULT NULL,
+  rid int DEFAULT NULL,
+  sticky numeric DEFAULT NULL,
+  status varchar(50) NOT NULL DEFAULT '',
+  "like" int DEFAULT NULL,
+  ua text,
+  url varchar(255) DEFAULT NULL,
+  createdAt timestamp(0) without time zone NULL DEFAULT CURRENT_TIMESTAMP,
+  updatedAt timestamp(0) without time zone NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (id)
+) ;
+
+
+CREATE SEQUENCE wl_counter_seq;
+
+CREATE TABLE wl_counter (
+  id int check (id > 0) NOT NULL DEFAULT NEXTVAL ('wl_counter_seq'),
+  time int DEFAULT NULL,
+  reaction0 int DEFAULT NULL,
+  reaction1 int DEFAULT NULL,
+  reaction2 int DEFAULT NULL,
+  reaction3 int DEFAULT NULL,
+  reaction4 int DEFAULT NULL,
+  reaction5 int DEFAULT NULL,
+  reaction6 int DEFAULT NULL,
+  reaction7 int DEFAULT NULL,
+  reaction8 int DEFAULT NULL,
+  url varchar(255) NOT NULL DEFAULT '',
+  createdAt timestamp(0) without time zone NULL DEFAULT CURRENT_TIMESTAMP,
+  updatedAt timestamp(0) without time zone NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (id)
+) ;
+
+
+CREATE SEQUENCE wl_users_seq;
+
+CREATE TABLE wl_users (
+  id int check (id > 0) NOT NULL DEFAULT NEXTVAL ('wl_users_seq'),
+  display_name varchar(255) NOT NULL DEFAULT '',
+  email varchar(255) NOT NULL DEFAULT '',
+  password varchar(255) NOT NULL DEFAULT '',
+  type varchar(50) NOT NULL DEFAULT '',
+  label varchar(255) DEFAULT NULL,
+  url varchar(255) DEFAULT NULL,
+  avatar varchar(255) DEFAULT NULL,
+  github varchar(255) DEFAULT NULL,
+  twitter varchar(255) DEFAULT NULL,
+  facebook varchar(255) DEFAULT NULL,
+  google varchar(255) DEFAULT NULL,
+  weibo varchar(255) DEFAULT NULL,
+  qq varchar(255) DEFAULT NULL,
+  "2fa" varchar(32) DEFAULT NULL,
+  createdAt timestamp(0) without time zone NULL DEFAULT CURRENT_TIMESTAMP,
+  updatedAt timestamp(0) without time zone NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (id)
+) ;

+ 108 - 0
server/waline/template/waline.sql

@@ -0,0 +1,108 @@
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+SET NAMES utf8mb4;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+
+# Dump of table wl_Comment
+DROP TABLE IF EXISTS `wl_Comment`;
+# ------------------------------------------------------------
+
+CREATE TABLE `wl_Comment` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `user_id` int(11) DEFAULT NULL,
+  `comment` text,
+  `insertedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `ip` varchar(100) DEFAULT '',
+  `link` varchar(255) DEFAULT NULL,
+  `mail` varchar(255) DEFAULT NULL,
+  `nick` varchar(255) DEFAULT NULL,
+  `pid` int(11) DEFAULT NULL,
+  `rid` int(11) DEFAULT NULL,
+  `sticky` boolean DEFAULT NULL,
+  `status` varchar(50) NOT NULL DEFAULT '',
+  `like` int(11) DEFAULT NULL,
+  `ua` text,
+  `url` varchar(255) DEFAULT NULL,
+  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  INDEX `idx_comment_url` (`url`),
+  INDEX `idx_comment_user_id` (`user_id`),
+  INDEX `idx_comment_status` (`status`),
+  INDEX `idx_comment_pid_rid` (`pid`, `rid`),
+  INDEX `idx_comment_created_at` (`createdAt`),
+  INDEX `idx_comment_updated_at` (`updatedAt`),
+  INDEX `idx_comment_sticky` (`sticky`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+
+
+# Dump of table wl_Counter
+DROP TABLE IF EXISTS `wl_Counter`;
+# ------------------------------------------------------------
+
+CREATE TABLE `wl_Counter` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `time` int(11) DEFAULT NULL,
+  `reaction0` int(11) DEFAULT NULL,
+  `reaction1` int(11) DEFAULT NULL,
+  `reaction2` int(11) DEFAULT NULL,
+  `reaction3` int(11) DEFAULT NULL,
+  `reaction4` int(11) DEFAULT NULL,
+  `reaction5` int(11) DEFAULT NULL,
+  `reaction6` int(11) DEFAULT NULL,
+  `reaction7` int(11) DEFAULT NULL,
+  `reaction8` int(11) DEFAULT NULL,
+  `url` varchar(255) NOT NULL DEFAULT '',
+  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  INDEX `idx_counter_url` (`url`),
+  INDEX `idx_counter_time` (`time`),
+  INDEX `idx_counter_created_at` (`createdAt`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+
+
+# Dump of table wl_Users
+DROP TABLE IF EXISTS `wl_Users`;
+# ------------------------------------------------------------
+
+CREATE TABLE `wl_Users` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `display_name` varchar(255) NOT NULL DEFAULT '',
+  `email` varchar(255) NOT NULL DEFAULT '',
+  `password` varchar(255) NOT NULL DEFAULT '',
+  `type` varchar(50) NOT NULL DEFAULT '',
+  `label` varchar(255) DEFAULT NULL,
+  `url` varchar(255) DEFAULT NULL,
+  `avatar` varchar(255) DEFAULT NULL,
+  `github` varchar(255) DEFAULT NULL,
+  `twitter` varchar(255) DEFAULT NULL,
+  `facebook` varchar(255) DEFAULT NULL,
+  `google` varchar(255) DEFAULT NULL,
+  `weibo` varchar(255) DEFAULT NULL,
+  `qq` varchar(255) DEFAULT NULL,
+  `2fa` varchar(32) DEFAULT NULL,
+  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  UNIQUE INDEX `idx_user_email` (`email`),
+  INDEX `idx_user_type` (`type`),
+  INDEX `idx_user_created_at` (`createdAt`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+
+
+
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

BIN
server/waline/template/waline.sqlite


+ 63 - 0
server/waline/template/waline.tidb

@@ -0,0 +1,63 @@
+CREATE DATABASE `waline`;
+
+USE waline;
+
+CREATE TABLE `wl_Comment` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `user_id` int(11) DEFAULT NULL,
+  `comment` text,
+  `insertedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `ip` varchar(100) DEFAULT '',
+  `link` varchar(255) DEFAULT NULL,
+  `mail` varchar(255) DEFAULT NULL,
+  `nick` varchar(255) DEFAULT NULL,
+  `pid` int(11) DEFAULT NULL,
+  `rid` int(11) DEFAULT NULL,
+  `sticky` boolean DEFAULT NULL,
+  `status` varchar(50) NOT NULL DEFAULT '',
+  `like` int(11) DEFAULT NULL,
+  `ua` text,
+  `url` varchar(255) DEFAULT NULL,
+  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`)
+) CHARSET=utf8mb4;
+
+CREATE TABLE `wl_Counter` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `time` int(11) DEFAULT NULL,
+  `reaction0` int(11) DEFAULT NULL,
+  `reaction1` int(11) DEFAULT NULL,
+  `reaction2` int(11) DEFAULT NULL,
+  `reaction3` int(11) DEFAULT NULL,
+  `reaction4` int(11) DEFAULT NULL,
+  `reaction5` int(11) DEFAULT NULL,
+  `reaction6` int(11) DEFAULT NULL,
+  `reaction7` int(11) DEFAULT NULL,
+  `reaction8` int(11) DEFAULT NULL,
+  `url` varchar(255) NOT NULL DEFAULT '',
+  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`)
+) CHARSET=utf8mb4;
+
+CREATE TABLE `wl_Users` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `display_name` varchar(255) NOT NULL DEFAULT '',
+  `email` varchar(255) NOT NULL DEFAULT '',
+  `password` varchar(255) NOT NULL DEFAULT '',
+  `type` varchar(50) NOT NULL DEFAULT '',
+  `label` varchar(255) DEFAULT NULL,
+  `url` varchar(255) DEFAULT NULL,
+  `avatar` varchar(255) DEFAULT NULL,
+  `github` varchar(255) DEFAULT NULL,
+  `twitter` varchar(255) DEFAULT NULL,
+  `facebook` varchar(255) DEFAULT NULL,
+  `google` varchar(255) DEFAULT NULL,
+  `weibo` varchar(255) DEFAULT NULL,
+  `qq` varchar(255) DEFAULT NULL,
+  `2fa` varchar(32) DEFAULT NULL,
+  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`)
+) CHARSET=utf8mb4;

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 47
ssr.html


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff