@prismshadow/penguin-server 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +1 -1
  2. package/dist/api/types.d.ts +402 -52
  3. package/dist/api/types.js +17 -3
  4. package/dist/auth-token.js +1 -1
  5. package/dist/{chunk-HMTT2PX4.js → chunk-2LZDP26O.js} +8 -5
  6. package/dist/chunk-2LZDP26O.js.map +1 -0
  7. package/dist/chunk-5YLLSHY3.js +1195 -0
  8. package/dist/chunk-5YLLSHY3.js.map +1 -0
  9. package/dist/{chunk-D3JNA6ZI.js → chunk-B3PSKR3D.js} +2 -2
  10. package/dist/chunk-B3PSKR3D.js.map +1 -0
  11. package/dist/{chunk-LPPVGHYD.js → chunk-BL4U7GYY.js} +2 -2
  12. package/dist/chunk-BL4U7GYY.js.map +1 -0
  13. package/dist/chunk-BRMNPLU6.js +37 -0
  14. package/dist/chunk-BRMNPLU6.js.map +1 -0
  15. package/dist/chunk-GGIINEEK.js +3401 -0
  16. package/dist/chunk-GGIINEEK.js.map +1 -0
  17. package/dist/{chunk-QFV3ERQO.js → chunk-OQZDL3TR.js} +2 -2
  18. package/dist/hmr/manifest.js +1 -1
  19. package/dist/index.js +13440 -8991
  20. package/dist/index.js.map +1 -1
  21. package/dist/machine-status.js +2 -2
  22. package/dist/model-catalog.d.ts +610 -0
  23. package/dist/model-catalog.js +108 -0
  24. package/dist/model-catalog.js.map +1 -0
  25. package/dist/plugin/index.d.ts +170 -74
  26. package/dist/reset-admin-password.js +2 -2
  27. package/dist/version-report.js +2 -2
  28. package/package.json +14 -9
  29. package/web-dist/assets/{abnfDiagram-VCTEODGH-0AKFiyig.js → abnfDiagram-VCTEODGH-C_Ej4MyZ.js} +1 -1
  30. package/web-dist/assets/{addon-clipboard-BovFnNVg.js → addon-clipboard-eONBCa8x.js} +1 -1
  31. package/web-dist/assets/{addon-fit-B1npgxQk.js → addon-fit-Dk6bkT8u.js} +1 -1
  32. package/web-dist/assets/{addon-web-links-D88QHj7A.js → addon-web-links-e0JpGvGv.js} +1 -1
  33. package/web-dist/assets/{arc-Beox1Cgf.js → arc-ytwqobEL.js} +1 -1
  34. package/web-dist/assets/{architectureDiagram-5GKGNRK7-CC1sLMY1.js → architectureDiagram-5GKGNRK7-oxT9SNOE.js} +1 -1
  35. package/web-dist/assets/{blockDiagram-I7D4REHJ-B8BY1PkZ.js → blockDiagram-I7D4REHJ-D8OXfpb9.js} +1 -1
  36. package/web-dist/assets/{c4Diagram-7LVT6UL2-yjY0BkxQ.js → c4Diagram-7LVT6UL2-BNYNzSWK.js} +1 -1
  37. package/web-dist/assets/channel-7Be_pU-b.js +1 -0
  38. package/web-dist/assets/{chunk-2Q5K7J3B-DdgIvETg.js → chunk-2Q5K7J3B-C2yNhFmh.js} +1 -1
  39. package/web-dist/assets/{chunk-5VM5RSS4-BE38k1Rs.js → chunk-5VM5RSS4-CAeuhwbB.js} +1 -1
  40. package/web-dist/assets/{chunk-F27PBJKO-D4YXmaqQ.js → chunk-F27PBJKO-DSuRiLxP.js} +1 -1
  41. package/web-dist/assets/{chunk-IMKFNOWR-CyJFdThc.js → chunk-IMKFNOWR-MStar4cf.js} +1 -1
  42. package/web-dist/assets/{chunk-JWPE2WC7-BAM_oEUU.js → chunk-JWPE2WC7-CIgQwRv4.js} +1 -1
  43. package/web-dist/assets/{chunk-POPQ4Y6H-BP3D0FVi.js → chunk-POPQ4Y6H-CA8evx9g.js} +1 -1
  44. package/web-dist/assets/{chunk-SVP7TREG-Clk8PdKZ.js → chunk-SVP7TREG-bR7-FT1W.js} +1 -1
  45. package/web-dist/assets/{chunk-TICWLB2K-EvWPnEGg.js → chunk-TICWLB2K-C0ZdCnvI.js} +1 -1
  46. package/web-dist/assets/{chunk-XXDRQBXY-6p5D0UB1.js → chunk-XXDRQBXY-CzozFLFI.js} +1 -1
  47. package/web-dist/assets/classDiagram-ZZMXUADV-BjVhvDIH.js +1 -0
  48. package/web-dist/assets/classDiagram-v2-VYDZK3BY-BjVhvDIH.js +1 -0
  49. package/web-dist/assets/{cose-bilkent-JH36ORCC-bpkI-tLJ.js → cose-bilkent-JH36ORCC-nkjrY6eI.js} +1 -1
  50. package/web-dist/assets/{cynefin-OW5HDTMX-srLaqJ4e.js → cynefin-OW5HDTMX-D2A0h062.js} +1 -1
  51. package/web-dist/assets/{cynefinDiagram-5FMLGOSQ-BPfpHSPc.js → cynefinDiagram-5FMLGOSQ-DFZQ7d_T.js} +1 -1
  52. package/web-dist/assets/{dagre-GXQ25YYZ-C4fF5-j7.js → dagre-GXQ25YYZ-DPYLLARd.js} +1 -1
  53. package/web-dist/assets/{diagram-S7CK7UJ4-BzBLb_9-.js → diagram-S7CK7UJ4-B204Nrur.js} +1 -1
  54. package/web-dist/assets/{diagram-UQ7AKVKN-BJuJ1o_T.js → diagram-UQ7AKVKN-DWORCZlS.js} +1 -1
  55. package/web-dist/assets/{diagram-VSXAHHWV-DFelN9i9.js → diagram-VSXAHHWV-Su6Bzm4Z.js} +1 -1
  56. package/web-dist/assets/{diagram-VX7I27RA-BgrEoPyp.js → diagram-VX7I27RA-B4p8ssYj.js} +1 -1
  57. package/web-dist/assets/{diagram-Z3DM3KII-C71KiMiX.js → diagram-Z3DM3KII-BgMz7jjW.js} +1 -1
  58. package/web-dist/assets/{ebnfDiagram-PWID7BFC-EYteyp1b.js → ebnfDiagram-PWID7BFC-DBCS3Cwc.js} +1 -1
  59. package/web-dist/assets/{erDiagram-RLTQ6QDP-B6n6-sz6.js → erDiagram-RLTQ6QDP-DEm39S5C.js} +1 -1
  60. package/web-dist/assets/{flowDiagram-HODETNUW-BtoMTdyT.js → flowDiagram-HODETNUW-CEUQGUza.js} +1 -1
  61. package/web-dist/assets/{ganttDiagram-EL5Y4UJY-CbOAa3vS.js → ganttDiagram-EL5Y4UJY-myYTgwFp.js} +1 -1
  62. package/web-dist/assets/{gitGraphDiagram-WWUBYQGX-B7-8sszH.js → gitGraphDiagram-WWUBYQGX-BAQ0Kl1C.js} +1 -1
  63. package/web-dist/assets/highlighter-DRTMVWxI.js +2 -0
  64. package/web-dist/assets/{highlighter-core-CMXoD8ze.js → highlighter-core-DgISzHrX.js} +1 -1
  65. package/web-dist/assets/{highlighter.worker-D6D9fPma.js → highlighter.worker-CKF6ok1g.js} +1 -1
  66. package/web-dist/assets/index-PA-IFoA6.js +1300 -0
  67. package/web-dist/assets/index-oCEyg9BT.css +1 -0
  68. package/web-dist/assets/{infoDiagram-27XIBGKW-BBjf6pkP.js → infoDiagram-27XIBGKW-B2WDMvX9.js} +1 -1
  69. package/web-dist/assets/{ishikawaDiagram-5VMMS53U-BBSvCv45.js → ishikawaDiagram-5VMMS53U-8qHTttjq.js} +1 -1
  70. package/web-dist/assets/{journeyDiagram-3NMN7TZE-CuHHl5zk.js → journeyDiagram-3NMN7TZE-DKE_xRCO.js} +1 -1
  71. package/web-dist/assets/{kanban-definition-UXKFOSKX-DJyP4Myw.js → kanban-definition-UXKFOSKX-EnJbHEmV.js} +1 -1
  72. package/web-dist/assets/{layout-Bqqhdwtt.js → layout-BlhCFmEZ.js} +1 -1
  73. package/web-dist/assets/{linear-BZfUSIf8.js → linear-Dw2VzU-D.js} +1 -1
  74. package/web-dist/assets/mermaid.core-CaXNMz57.js +310 -0
  75. package/web-dist/assets/{mindmap-definition-YA3MSWOX-BtyMD4wz.js → mindmap-definition-YA3MSWOX-DnTTfqbu.js} +1 -1
  76. package/web-dist/assets/{pegDiagram-XKGWAZYB-BUF_GJ0B.js → pegDiagram-XKGWAZYB-C3SArVd6.js} +1 -1
  77. package/web-dist/assets/{pieDiagram-E7YTZNPT-nweubbsU.js → pieDiagram-E7YTZNPT-CTOmO6ke.js} +1 -1
  78. package/web-dist/assets/powershell-DXrKVo3G.js +1 -0
  79. package/web-dist/assets/powershell-Dpen1YoG.js +1 -0
  80. package/web-dist/assets/{quadrantDiagram-AXDQQJYC-B_r4Wkxy.js → quadrantDiagram-AXDQQJYC-CbUsMwzO.js} +1 -1
  81. package/web-dist/assets/{railroadDiagram-O6MQD6OU-Dn7nm0MX.js → railroadDiagram-O6MQD6OU-Co2hsvaZ.js} +1 -1
  82. package/web-dist/assets/{requirementDiagram-BXWQKSXE-DaagYJ49.js → requirementDiagram-BXWQKSXE-BqFG0eYQ.js} +1 -1
  83. package/web-dist/assets/{sankeyDiagram-P5KCCOFB-CqEX6H-B.js → sankeyDiagram-P5KCCOFB-YgQHJlB7.js} +1 -1
  84. package/web-dist/assets/{sequenceDiagram-WJ2MYXX4-BzLfQO55.js → sequenceDiagram-WJ2MYXX4-CdDrP6O2.js} +1 -1
  85. package/web-dist/assets/{sizeCapture-INFHLROL-BcUuVH2L.js → sizeCapture-INFHLROL-CKwbEVhU.js} +1 -1
  86. package/web-dist/assets/{stateDiagram-D77RDMKH-BO3LWLvT.js → stateDiagram-D77RDMKH-kTJR3t2p.js} +1 -1
  87. package/web-dist/assets/stateDiagram-v2-MP3YSRHH-DzaSnZwj.js +1 -0
  88. package/web-dist/assets/{swimlanes-42K2YHIH-etP_hkIB.js → swimlanes-42K2YHIH-DCAO3rCQ.js} +1 -1
  89. package/web-dist/assets/swimlanesDiagram-VR7AAH4N-DNfCLejq.js +8 -0
  90. package/web-dist/assets/{timeline-definition-24CTP7MA-CTLt2XCT.js → timeline-definition-24CTP7MA-DEjnyzKw.js} +1 -1
  91. package/web-dist/assets/{vennDiagram-4TSXK5OY-DPO6ZSvH.js → vennDiagram-4TSXK5OY-DSihUvCq.js} +1 -1
  92. package/web-dist/assets/{wardleyDiagram-VM6X3IG4-DFofGg8b.js → wardleyDiagram-VM6X3IG4-CnAoMeCH.js} +1 -1
  93. package/web-dist/assets/{xterm-RdyTuaAH.js → xterm-3JwPT74G.js} +1 -1
  94. package/web-dist/assets/{xychartDiagram-S5SC5T6Z-Bgtb34Gu.js → xychartDiagram-S5SC5T6Z-43dHqZTr.js} +1 -1
  95. package/web-dist/index.html +6 -5
  96. package/web-dist/workbench-ui.css +164 -34
  97. package/dist/chunk-3SFJKLQU.js +0 -1016
  98. package/dist/chunk-3SFJKLQU.js.map +0 -1
  99. package/dist/chunk-D3JNA6ZI.js.map +0 -1
  100. package/dist/chunk-HMTT2PX4.js.map +0 -1
  101. package/dist/chunk-LPPVGHYD.js.map +0 -1
  102. package/dist/chunk-W7JNIJ25.js +0 -19
  103. package/dist/chunk-W7JNIJ25.js.map +0 -1
  104. package/web-dist/assets/channel-mfsAVJLE.js +0 -1
  105. package/web-dist/assets/classDiagram-ZZMXUADV-BPVO1m8i.js +0 -1
  106. package/web-dist/assets/classDiagram-v2-VYDZK3BY-BPVO1m8i.js +0 -1
  107. package/web-dist/assets/highlighter-Bj5l2XH_.js +0 -2
  108. package/web-dist/assets/index-BOCqRT4e.css +0 -1
  109. package/web-dist/assets/index-BrMpjp2s.js +0 -1286
  110. package/web-dist/assets/mermaid.core-BlUspEsI.js +0 -310
  111. package/web-dist/assets/stateDiagram-v2-MP3YSRHH-B-EuucjM.js +0 -1
  112. package/web-dist/assets/swimlanesDiagram-VR7AAH4N-0JbFdDbQ.js +0 -8
  113. /package/dist/{chunk-QFV3ERQO.js.map → chunk-OQZDL3TR.js.map} +0 -0
package/dist/api/types.js CHANGED
@@ -1,10 +1,24 @@
1
1
  import {
2
+ API_SOCKET_PATH,
3
+ BACKGROUND_IMAGE_MAX_CHARS,
4
+ DRAFTS_PATCH_MAX_ENTRIES,
5
+ DRAFT_KINDS,
6
+ DRAFT_VALUE_MAX_CHARS,
2
7
  MACHINE_PHASES,
3
- TICKET_SLUG_PATTERN
4
- } from "../chunk-W7JNIJ25.js";
8
+ TICKET_SLUG_PATTERN,
9
+ apiSocketPath,
10
+ sessionKindPath
11
+ } from "../chunk-BRMNPLU6.js";
5
12
  import "../chunk-B5IP37ZQ.js";
6
13
  export {
14
+ API_SOCKET_PATH,
15
+ BACKGROUND_IMAGE_MAX_CHARS,
16
+ DRAFTS_PATCH_MAX_ENTRIES,
17
+ DRAFT_KINDS,
18
+ DRAFT_VALUE_MAX_CHARS,
7
19
  MACHINE_PHASES,
8
- TICKET_SLUG_PATTERN
20
+ TICKET_SLUG_PATTERN,
21
+ apiSocketPath,
22
+ sessionKindPath
9
23
  };
10
24
  //# sourceMappingURL=types.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-G7GY7PJU.js";
5
5
  import {
6
6
  openExistingDatabase
7
- } from "./chunk-3SFJKLQU.js";
7
+ } from "./chunk-5YLLSHY3.js";
8
8
  import "./chunk-B5IP37ZQ.js";
9
9
 
10
10
  // src/auth-token.ts
@@ -50,12 +50,13 @@ var MachinesRepo = class {
50
50
  installedAt: null,
51
51
  sessionPid: null,
52
52
  remotePort: null,
53
- platform: null
53
+ platform: null,
54
+ adoptedAt: null
54
55
  },
55
56
  ...patch
56
57
  };
57
58
  this.db.prepare(
58
- "INSERT OR REPLACE INTO machines (address, machine_id, version, installed_at, session_pid, remote_port, platform) VALUES (?, ?, ?, ?, ?, ?, ?)"
59
+ "INSERT OR REPLACE INTO machines (address, machine_id, version, installed_at, session_pid, remote_port, platform, adopted_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
59
60
  ).run(
60
61
  address,
61
62
  next.machineId,
@@ -63,7 +64,8 @@ var MachinesRepo = class {
63
64
  next.installedAt,
64
65
  next.sessionPid,
65
66
  next.remotePort,
66
- next.platform
67
+ next.platform,
68
+ next.adoptedAt
67
69
  );
68
70
  }
69
71
  /** The addresses a Project uses, or null when it has never had a list written for it. */
@@ -83,11 +85,12 @@ function toRow(row) {
83
85
  installedAt: row.installed_at ?? null,
84
86
  sessionPid: row.session_pid ?? null,
85
87
  remotePort: row.remote_port ?? null,
86
- platform: row.platform ?? null
88
+ platform: row.platform ?? null,
89
+ adoptedAt: row.adopted_at ?? null
87
90
  };
88
91
  }
89
92
 
90
93
  export {
91
94
  MachinesRepo
92
95
  };
93
- //# sourceMappingURL=chunk-HMTT2PX4.js.map
96
+ //# sourceMappingURL=chunk-2LZDP26O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/repos/machines.ts"],"sourcesContent":["/**\n * What this server remembers about machines: its own identity, one row per machine it has\n * installed on or reached (what is installed there, the session held to it), and which\n * machines each Project uses. All in web.db, so a hot swap or a restart reads back exactly\n * what the last generation wrote — the JSON file this replaces could not survive a schema\n * change, and nothing else this server remembers lives outside the database.\n */\nimport type { DatabaseSync } from \"node:sqlite\";\nimport { randomBytes } from \"node:crypto\";\n\nexport interface MachineRow {\n /** `ssh:<alias>` */\n address: string;\n /** That machine's own id, once heard. */\n machineId: string | null;\n /** What this server last installed there; null when it never has. */\n version: string | null;\n installedAt: string | null;\n /**\n * Non-null while a connection to it is HELD: the pid of the session as of the last connect.\n * A record of intent, not a handle — a restart or a hot push re-holds every machine with one,\n * and a disconnect clears it. It is never used to kill anything: a pid read back from a file\n * may by then be anyone's.\n */\n sessionPid: number | null;\n /** The port its server was bound to over there, as of the last connect. */\n remotePort: number | null;\n /** What the install found the machine to be; null until one has. The status probe speaks that dialect. */\n platform: \"linux\" | \"darwin\" | \"win32\" | null;\n /**\n * When this server adopted the machine: when it first recorded it at this address, again when\n * the address answers with another machine's id. The Sessions that machine held before then\n * read as CLI tasks through this server (runtime/session-sources.ts). Null for a machine\n * recorded before the time was kept, which never gets one and which the rule leaves alone.\n */\n adoptedAt: string | null;\n}\n\n/** Everything but the address may be patched; absent fields keep their value. */\ntype MachinePatch = Partial<Omit<MachineRow, \"address\">>;\n\n/**\n * 12 random bytes as base64url: 16 characters a person can read in a tooltip, 96 bits\n * against ids minted on machines that never coordinate.\n */\nconst MACHINE_ID_BYTES = 12;\n\nexport class MachinesRepo {\n constructor(private readonly db: DatabaseSync) {}\n\n /**\n * This server's own id if one has been minted, WITHOUT minting one — `penguin server\n * status` runs on a data root whose server may never have started, and must not create an\n * identity as a side effect of the question.\n */\n peekOwnId(): string | null {\n const row = this.db.prepare(\"SELECT machine_id FROM machine WHERE singleton = 1\").get();\n return row ? (row.machine_id as string) : null;\n }\n\n /** This server's own id, minted on first call and stable ever after. */\n ownId(): string {\n const existing = this.peekOwnId();\n if (existing !== null) return existing;\n const minted = randomBytes(MACHINE_ID_BYTES).toString(\"base64url\");\n this.db.prepare(\"INSERT INTO machine (singleton, machine_id) VALUES (1, ?)\").run(minted);\n return minted;\n }\n\n get(address: string): MachineRow | null {\n const row = this.db.prepare(\"SELECT * FROM machines WHERE address = ?\").get(address);\n return row === undefined ? null : toRow(row);\n }\n\n /**\n * Every row answering to a machine's own id — two aliases for one host are two rows with\n * one id. Newest install first, then by address, so the order is the same every time; which\n * of them to speak through is the service's to decide (it knows which has a session).\n */\n byMachineId(machineId: string): MachineRow[] {\n return this.db\n .prepare(\n \"SELECT * FROM machines WHERE machine_id = ? ORDER BY installed_at DESC, address ASC\",\n )\n .all(machineId)\n .map(toRow);\n }\n\n all(): MachineRow[] {\n return this.db.prepare(\"SELECT * FROM machines\").all().map(toRow);\n }\n\n /** Writes the fields given, creating the row when there is none. */\n patch(address: string, patch: MachinePatch): void {\n const next: MachineRow = {\n ...(this.get(address) ?? {\n address,\n machineId: null,\n version: null,\n installedAt: null,\n sessionPid: null,\n remotePort: null,\n platform: null,\n adoptedAt: null,\n }),\n ...patch,\n };\n this.db\n .prepare(\n \"INSERT OR REPLACE INTO machines (address, machine_id, version, installed_at, session_pid, remote_port, platform, adopted_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\",\n )\n .run(\n address,\n next.machineId,\n next.version,\n next.installedAt,\n next.sessionPid,\n next.remotePort,\n next.platform,\n next.adoptedAt,\n );\n }\n\n /** The addresses a Project uses, or null when it has never had a list written for it. */\n members(projectId: string): string[] | null {\n const row = this.db\n .prepare(\"SELECT addresses FROM machine_project WHERE project_id = ?\")\n .get(projectId);\n return row ? (JSON.parse(row.addresses as string) as string[]) : null;\n }\n\n setMembers(projectId: string, addresses: string[]): void {\n this.db\n .prepare(\"INSERT OR REPLACE INTO machine_project (project_id, addresses) VALUES (?, ?)\")\n .run(projectId, JSON.stringify(addresses));\n }\n}\n\nfunction toRow(row: Record<string, unknown>): MachineRow {\n return {\n address: row.address as string,\n machineId: (row.machine_id as string | null) ?? null,\n version: (row.version as string | null) ?? null,\n installedAt: (row.installed_at as string | null) ?? null,\n sessionPid: (row.session_pid as number | null) ?? null,\n remotePort: (row.remote_port as number | null) ?? null,\n platform: (row.platform as MachineRow[\"platform\"]) ?? null,\n adoptedAt: (row.adopted_at as string | null) ?? null,\n };\n}\n"],"mappings":";AAQA,SAAS,mBAAmB;AAqC5B,IAAM,mBAAmB;AAElB,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,IAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,YAA2B;AACzB,UAAM,MAAM,KAAK,GAAG,QAAQ,oDAAoD,EAAE,IAAI;AACtF,WAAO,MAAO,IAAI,aAAwB;AAAA,EAC5C;AAAA;AAAA,EAGA,QAAgB;AACd,UAAM,WAAW,KAAK,UAAU;AAChC,QAAI,aAAa,KAAM,QAAO;AAC9B,UAAM,SAAS,YAAY,gBAAgB,EAAE,SAAS,WAAW;AACjE,SAAK,GAAG,QAAQ,2DAA2D,EAAE,IAAI,MAAM;AACvF,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAoC;AACtC,UAAM,MAAM,KAAK,GAAG,QAAQ,0CAA0C,EAAE,IAAI,OAAO;AACnF,WAAO,QAAQ,SAAY,OAAO,MAAM,GAAG;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,WAAiC;AAC3C,WAAO,KAAK,GACT;AAAA,MACC;AAAA,IACF,EACC,IAAI,SAAS,EACb,IAAI,KAAK;AAAA,EACd;AAAA,EAEA,MAAoB;AAClB,WAAO,KAAK,GAAG,QAAQ,wBAAwB,EAAE,IAAI,EAAE,IAAI,KAAK;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,SAAiB,OAA2B;AAChD,UAAM,OAAmB;AAAA,MACvB,GAAI,KAAK,IAAI,OAAO,KAAK;AAAA,QACvB;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,WAAW;AAAA,MACb;AAAA,MACA,GAAG;AAAA,IACL;AACA,SAAK,GACF;AAAA,MACC;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACJ;AAAA;AAAA,EAGA,QAAQ,WAAoC;AAC1C,UAAM,MAAM,KAAK,GACd,QAAQ,4DAA4D,EACpE,IAAI,SAAS;AAChB,WAAO,MAAO,KAAK,MAAM,IAAI,SAAmB,IAAiB;AAAA,EACnE;AAAA,EAEA,WAAW,WAAmB,WAA2B;AACvD,SAAK,GACF,QAAQ,8EAA8E,EACtF,IAAI,WAAW,KAAK,UAAU,SAAS,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,MAAM,KAA0C;AACvD,SAAO;AAAA,IACL,SAAS,IAAI;AAAA,IACb,WAAY,IAAI,cAAgC;AAAA,IAChD,SAAU,IAAI,WAA6B;AAAA,IAC3C,aAAc,IAAI,gBAAkC;AAAA,IACpD,YAAa,IAAI,eAAiC;AAAA,IAClD,YAAa,IAAI,eAAiC;AAAA,IAClD,UAAW,IAAI,YAAuC;AAAA,IACtD,WAAY,IAAI,cAAgC;AAAA,EAClD;AACF;","names":[]}