ovtools 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +121 -2
  3. package/assets/common/bond-inspect.sh +368 -0
  4. package/assets/common/config.sh +263 -0
  5. package/assets/common/extract-data.sh +197 -0
  6. package/assets/common/harden-host.sh +37 -0
  7. package/assets/common/install-deps.sh +93 -0
  8. package/assets/common/node-enroll.sh +65 -0
  9. package/assets/common/node-setup.sh +150 -0
  10. package/assets/common/node-start.sh +90 -0
  11. package/assets/common/node-stop.sh +18 -0
  12. package/assets/common/node-upgrade.sh +45 -0
  13. package/assets/common/pre-run.sh +497 -0
  14. package/assets/common/promote-validator.sh +104 -0
  15. package/assets/deploy/10-prepare-host.sh +98 -0
  16. package/assets/deploy/20-install-toolchain.sh +93 -0
  17. package/assets/deploy/30-setup-node.sh +82 -0
  18. package/assets/deploy/40-start-node.sh +75 -0
  19. package/assets/deploy/50-verify.sh +259 -0
  20. package/assets/deploy/60-enroll.sh +304 -0
  21. package/assets/deploy/70-promote.sh +152 -0
  22. package/assets/deploy/lib.sh +398 -0
  23. package/assets/manage/10-bond-increase.sh +149 -0
  24. package/assets/manage/10-diagnose-node.sh +169 -0
  25. package/assets/manage/20-exit-validator.sh +259 -0
  26. package/assets/manage/25-recover-node.sh +291 -0
  27. package/assets/manage/30-status.sh +64 -0
  28. package/assets/manage/40-exit-withdraw.sh +133 -0
  29. package/assets/manage/bond_inc.sh +318 -0
  30. package/assets/manage/dashboard_monitor/app.js +1544 -0
  31. package/assets/manage/dashboard_monitor/assets/v2.2/css/base.css +113 -0
  32. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/content.css +133 -0
  33. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/controls.css +229 -0
  34. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/data.css +374 -0
  35. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/icons.css +35 -0
  36. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/motion.css +57 -0
  37. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/shell.css +51 -0
  38. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/sidebar.css +242 -0
  39. package/assets/manage/dashboard_monitor/assets/v2.2/css/components/topbar.css +138 -0
  40. package/assets/manage/dashboard_monitor/assets/v2.2/css/fonts.css +30 -0
  41. package/assets/manage/dashboard_monitor/assets/v2.2/css/synteq-ui-v2.css +25 -0
  42. package/assets/manage/dashboard_monitor/assets/v2.2/css/theme-dark.css +38 -0
  43. package/assets/manage/dashboard_monitor/assets/v2.2/css/theme-light.css +36 -0
  44. package/assets/manage/dashboard_monitor/assets/v2.2/css/tokens.css +61 -0
  45. package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-Medium.ttf +0 -0
  46. package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-Regular.ttf +0 -0
  47. package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-SemiBold.ttf +0 -0
  48. package/assets/manage/dashboard_monitor/assets/v2.2/js/synteq-ui-v2.js +869 -0
  49. package/assets/manage/dashboard_monitor/deploy-dashboard.sh +230 -0
  50. package/assets/manage/dashboard_monitor/favicon.svg +13 -0
  51. package/assets/manage/dashboard_monitor/index.html +1197 -0
  52. package/assets/manage/dashboard_monitor/nginx-octra.conf +76 -0
  53. package/assets/manage/dashboard_monitor/octra-dashboard.service +29 -0
  54. package/assets/manage/dashboard_monitor/octra-node-prune.cron +12 -0
  55. package/assets/manage/dashboard_monitor/octra-node-prune.service +16 -0
  56. package/assets/manage/dashboard_monitor/octra-node-prune.timer +12 -0
  57. package/assets/manage/dashboard_monitor/prune-node-junk.sh +329 -0
  58. package/assets/manage/dashboard_monitor/server.py +1887 -0
  59. package/assets/manage/dashboard_monitor/ssl-certbot.sh +90 -0
  60. package/assets/manage/dashboard_monitor/styles.css +327 -0
  61. package/assets/manage/lib.sh +347 -0
  62. package/assets/manifest.json +143 -0
  63. package/assets/migrate/00-backup-identity.sh +67 -0
  64. package/assets/migrate/01-prepare-target.sh +145 -0
  65. package/assets/migrate/02-authorize-pull.sh +43 -0
  66. package/assets/migrate/03-pull-state.sh +102 -0
  67. package/assets/migrate/04-stop-source.sh +85 -0
  68. package/assets/migrate/05-finalize-target.sh +140 -0
  69. package/assets/migrate/06-start-target.sh +57 -0
  70. package/assets/migrate/07-verify.sh +237 -0
  71. package/assets/migrate/08-rollback.sh +54 -0
  72. package/assets/migrate/lib.sh +149 -0
  73. package/assets/upgrade/10-preflight.sh +120 -0
  74. package/assets/upgrade/20-upgrade.sh +142 -0
  75. package/assets/upgrade/30-manual-upgrade.sh +129 -0
  76. package/assets/upgrade/40-storage-prune.sh +65 -0
  77. package/assets/upgrade/50-status.sh +58 -0
  78. package/assets/upgrade/lib.sh +232 -0
  79. package/bin/ovtools.js +32 -0
  80. package/dist/api/checks.d.ts +6 -0
  81. package/dist/api/checks.d.ts.map +1 -0
  82. package/dist/api/checks.js +173 -0
  83. package/dist/api/checks.js.map +1 -0
  84. package/dist/api/hostkeys.d.ts +10 -0
  85. package/dist/api/hostkeys.d.ts.map +1 -0
  86. package/dist/api/hostkeys.js +58 -0
  87. package/dist/api/hostkeys.js.map +1 -0
  88. package/dist/api/jobs.d.ts +33 -0
  89. package/dist/api/jobs.d.ts.map +1 -0
  90. package/dist/api/jobs.js +483 -0
  91. package/dist/api/jobs.js.map +1 -0
  92. package/dist/api/nodes.d.ts +16 -0
  93. package/dist/api/nodes.d.ts.map +1 -0
  94. package/dist/api/nodes.js +126 -0
  95. package/dist/api/nodes.js.map +1 -0
  96. package/dist/api/server.d.ts +3 -0
  97. package/dist/api/server.d.ts.map +1 -0
  98. package/dist/api/server.js +443 -0
  99. package/dist/api/server.js.map +1 -0
  100. package/dist/cli.d.ts +3 -0
  101. package/dist/cli.d.ts.map +1 -0
  102. package/dist/cli.js +301 -0
  103. package/dist/cli.js.map +1 -0
  104. package/dist/constants.d.ts +76 -0
  105. package/dist/constants.d.ts.map +1 -0
  106. package/dist/constants.js +150 -0
  107. package/dist/constants.js.map +1 -0
  108. package/dist/index.d.ts +18 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +60 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/orchestrator/base.d.ts +52 -0
  113. package/dist/orchestrator/base.d.ts.map +1 -0
  114. package/dist/orchestrator/base.js +219 -0
  115. package/dist/orchestrator/base.js.map +1 -0
  116. package/dist/orchestrator/deploy.d.ts +33 -0
  117. package/dist/orchestrator/deploy.d.ts.map +1 -0
  118. package/dist/orchestrator/deploy.js +313 -0
  119. package/dist/orchestrator/deploy.js.map +1 -0
  120. package/dist/orchestrator/manage.d.ts +28 -0
  121. package/dist/orchestrator/manage.d.ts.map +1 -0
  122. package/dist/orchestrator/manage.js +267 -0
  123. package/dist/orchestrator/manage.js.map +1 -0
  124. package/dist/orchestrator/migrate.d.ts +31 -0
  125. package/dist/orchestrator/migrate.d.ts.map +1 -0
  126. package/dist/orchestrator/migrate.js +442 -0
  127. package/dist/orchestrator/migrate.js.map +1 -0
  128. package/dist/ssh/client.d.ts +39 -0
  129. package/dist/ssh/client.d.ts.map +1 -0
  130. package/dist/ssh/client.js +418 -0
  131. package/dist/ssh/client.js.map +1 -0
  132. package/dist/test/core.test.d.ts +2 -0
  133. package/dist/test/core.test.d.ts.map +1 -0
  134. package/dist/test/core.test.js +188 -0
  135. package/dist/test/core.test.js.map +1 -0
  136. package/dist/types.d.ts +267 -0
  137. package/dist/types.d.ts.map +1 -0
  138. package/dist/types.js +3 -0
  139. package/dist/types.js.map +1 -0
  140. package/dist/utils/assets.d.ts +28 -0
  141. package/dist/utils/assets.d.ts.map +1 -0
  142. package/dist/utils/assets.js +583 -0
  143. package/dist/utils/assets.js.map +1 -0
  144. package/dist/utils/browser.d.ts +2 -0
  145. package/dist/utils/browser.d.ts.map +1 -0
  146. package/dist/utils/browser.js +23 -0
  147. package/dist/utils/browser.js.map +1 -0
  148. package/dist/utils/dashboard.d.ts +16 -0
  149. package/dist/utils/dashboard.d.ts.map +1 -0
  150. package/dist/utils/dashboard.js +177 -0
  151. package/dist/utils/dashboard.js.map +1 -0
  152. package/dist/utils/helpers.d.ts +29 -0
  153. package/dist/utils/helpers.d.ts.map +1 -0
  154. package/dist/utils/helpers.js +204 -0
  155. package/dist/utils/helpers.js.map +1 -0
  156. package/dist/utils/scripts.d.ts +60 -0
  157. package/dist/utils/scripts.d.ts.map +1 -0
  158. package/dist/utils/scripts.js +174 -0
  159. package/dist/utils/scripts.js.map +1 -0
  160. package/dist/utils/state.d.ts +12 -0
  161. package/dist/utils/state.d.ts.map +1 -0
  162. package/dist/utils/state.js +44 -0
  163. package/dist/utils/state.js.map +1 -0
  164. package/dist/utils/tar.d.ts +11 -0
  165. package/dist/utils/tar.d.ts.map +1 -0
  166. package/dist/utils/tar.js +93 -0
  167. package/dist/utils/tar.js.map +1 -0
  168. package/dist/utils/update.d.ts +9 -0
  169. package/dist/utils/update.d.ts.map +1 -0
  170. package/dist/utils/update.js +134 -0
  171. package/dist/utils/update.js.map +1 -0
  172. package/dist/utils/websocket.d.ts +10 -0
  173. package/dist/utils/websocket.d.ts.map +1 -0
  174. package/dist/utils/websocket.js +203 -0
  175. package/dist/utils/websocket.js.map +1 -0
  176. package/package.json +55 -4
  177. package/public/app.js +2712 -0
  178. package/public/assets/v2.2/css/base.css +113 -0
  179. package/public/assets/v2.2/css/components/content.css +133 -0
  180. package/public/assets/v2.2/css/components/controls.css +229 -0
  181. package/public/assets/v2.2/css/components/data.css +373 -0
  182. package/public/assets/v2.2/css/components/icons.css +35 -0
  183. package/public/assets/v2.2/css/components/motion.css +57 -0
  184. package/public/assets/v2.2/css/components/shell.css +51 -0
  185. package/public/assets/v2.2/css/components/sidebar.css +242 -0
  186. package/public/assets/v2.2/css/components/topbar.css +138 -0
  187. package/public/assets/v2.2/css/fonts.css +30 -0
  188. package/public/assets/v2.2/css/synteq-ui-v2.css +25 -0
  189. package/public/assets/v2.2/css/theme-dark.css +38 -0
  190. package/public/assets/v2.2/css/theme-light.css +36 -0
  191. package/public/assets/v2.2/css/tokens.css +61 -0
  192. package/public/assets/v2.2/fonts/GoogleSansCode-Medium.ttf +0 -0
  193. package/public/assets/v2.2/fonts/GoogleSansCode-Regular.ttf +0 -0
  194. package/public/assets/v2.2/fonts/GoogleSansCode-SemiBold.ttf +0 -0
  195. package/public/assets/v2.2/js/synteq-ui-v2.js +869 -0
  196. package/public/favicon.svg +7 -0
  197. package/public/index.html +1080 -0
  198. package/public/styles.css +552 -0
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.jobs = exports.JobManager = void 0;
37
+ exports.normalizeSettings = normalizeSettings;
38
+ exports.loadSettings = loadSettings;
39
+ const fs = __importStar(require("fs/promises"));
40
+ const path = __importStar(require("path"));
41
+ const helpers_1 = require("../utils/helpers");
42
+ const constants_1 = require("../constants");
43
+ const deploy_1 = require("../orchestrator/deploy");
44
+ const migrate_1 = require("../orchestrator/migrate");
45
+ const manage_1 = require("../orchestrator/manage");
46
+ const nodes_1 = require("./nodes");
47
+ const IP_RE = /^[0-9a-fA-F.:]{3,45}$/;
48
+ const DEFAULT_SETTINGS = {
49
+ swapGB: 8,
50
+ dataDevice: '/dev/sdb',
51
+ dataMinGB: 1000,
52
+ dashboardDomain: '',
53
+ };
54
+ function normalizeSettings(raw) {
55
+ const input = raw || {};
56
+ const swap = Number(input.swapGB);
57
+ const min = Number(input.dataMinGB);
58
+ return {
59
+ swapGB: Number.isFinite(swap) && swap >= 1 && swap <= 256 ? Math.round(swap) : DEFAULT_SETTINGS.swapGB,
60
+ dataDevice: typeof input.dataDevice === 'string' && input.dataDevice.trim() ? input.dataDevice.trim() : DEFAULT_SETTINGS.dataDevice,
61
+ dataMinGB: Number.isFinite(min) && min >= 10 ? Math.round(min) : DEFAULT_SETTINGS.dataMinGB,
62
+ dashboardDomain: typeof input.dashboardDomain === 'string' ? input.dashboardDomain.trim().toLowerCase() : '',
63
+ assetsRepo: typeof input.assetsRepo === 'string' ? input.assetsRepo.trim() : '',
64
+ assetsRef: typeof input.assetsRef === 'string' && input.assetsRef.trim() ? input.assetsRef.trim() : 'main',
65
+ };
66
+ }
67
+ async function loadSettings() {
68
+ try {
69
+ return normalizeSettings((await (0, helpers_1.readJSON)(constants_1.SETTINGS_FILE)) || undefined);
70
+ }
71
+ catch {
72
+ return normalizeSettings(undefined);
73
+ }
74
+ }
75
+ class JobManager {
76
+ state = {
77
+ running: false,
78
+ exitCode: null,
79
+ lastSeq: 0,
80
+ };
81
+ logger = null;
82
+ listeners = new Set();
83
+ orchestrator = null;
84
+ lastLogAt = Date.now();
85
+ activationTimer = null;
86
+ exitTimer = null;
87
+ subscribe(listener) {
88
+ this.listeners.add(listener);
89
+ return () => this.listeners.delete(listener);
90
+ }
91
+ snapshot() {
92
+ const now = Date.now();
93
+ const running = this.state.running;
94
+ return {
95
+ ...this.state,
96
+ idleSec: running ? Math.max(0, Math.round((now - this.lastLogAt) / 1000)) : undefined,
97
+ elapsedSec: this.state.startedAt ? Math.max(0, Math.round(now / 1000 - this.state.startedAt)) : undefined,
98
+ lastSeq: this.logger?.lastSeq() ?? this.state.lastSeq ?? 0,
99
+ };
100
+ }
101
+ lines(since) {
102
+ return this.logger ? this.logger.entriesSince(since) : [];
103
+ }
104
+ getLogger() {
105
+ return this.logger;
106
+ }
107
+ async start(request) {
108
+ if (this.state.running)
109
+ throw new Error('a phase is already running - wait for it to finish');
110
+ const program = request.program;
111
+ if (!['deploy', 'migrate', 'manage'].includes(program))
112
+ throw new Error(`unknown program: ${program}`);
113
+ const phase = String(request.phase || '').trim();
114
+ const meta = (0, constants_1.phaseMeta)(program, phase);
115
+ if (!meta)
116
+ throw new Error(`unknown ${program} phase: ${phase}`);
117
+ if (meta.confirm && !request.approved && String(request.confirm || '').toUpperCase() !== meta.confirm.toUpperCase()) {
118
+ throw new Error(`this phase needs approval (approved=true or confirm=${meta.confirm})`);
119
+ }
120
+ const settings = await loadSettings();
121
+ const oldAuth = this.auth(request, 'old');
122
+ const newAuth = this.auth(request, 'new');
123
+ if (request.sameAuth && program === 'migrate') {
124
+ newAuth.method = oldAuth.method;
125
+ newAuth.password = oldAuth.password;
126
+ newAuth.keyPath = oldAuth.keyPath;
127
+ }
128
+ const oldIp = String(request.oldIp || '').trim();
129
+ const newIp = String(request.newIp || '').trim();
130
+ if (program === 'migrate') {
131
+ if (!IP_RE.test(oldIp))
132
+ throw new Error('a source address is required');
133
+ if (phase !== 'backup' && !IP_RE.test(newIp))
134
+ throw new Error('a target address is required');
135
+ if (newIp && oldIp === newIp)
136
+ throw new Error('source and target must differ');
137
+ await this.validateAuth(oldAuth, 'source', oldIp);
138
+ if (phase !== 'backup')
139
+ await this.validateAuth(newAuth, 'target', newIp);
140
+ }
141
+ else {
142
+ if (!IP_RE.test(newIp))
143
+ throw new Error('the node address is required');
144
+ await this.validateAuth(newAuth, program === 'deploy' ? 'target' : 'node', newIp);
145
+ }
146
+ if (program === 'manage') {
147
+ if (phase === 'bond') {
148
+ const amount = String(request.amount || '').trim();
149
+ if (!/^[0-9]+(\.[0-9]{1,6})?$/.test(amount) || Number(amount) < 1) {
150
+ throw new Error('type the amount to add in OCT (min 1, e.g. 100 or 12.5)');
151
+ }
152
+ }
153
+ if (phase === 'dashboard') {
154
+ const sslMode = String(request.sslMode || 'auto').toLowerCase();
155
+ if (!['auto', 'cloudflare', 'certbot'].includes(sslMode)) {
156
+ throw new Error('sslMode must be auto, cloudflare or certbot');
157
+ }
158
+ if (sslMode === 'cloudflare') {
159
+ if (!request.certDir)
160
+ throw new Error('choose the folder that holds fullchain.pem and privkey.pem');
161
+ await this.validateCertDir(request.certDir);
162
+ }
163
+ if (sslMode === 'certbot' && !request.domain) {
164
+ throw new Error("Let's Encrypt needs the domain (it must already point at the node)");
165
+ }
166
+ }
167
+ }
168
+ this.clearWatchers();
169
+ this.state = {
170
+ running: true,
171
+ program,
172
+ phase,
173
+ step: meta.label,
174
+ exitCode: null,
175
+ startedAt: Date.now() / 1000,
176
+ newIp,
177
+ oldIp,
178
+ domain: (request.domain || settings.dashboardDomain || '').toLowerCase() || undefined,
179
+ awaiting: null,
180
+ activation: null,
181
+ watching: null,
182
+ exitWatching: null,
183
+ progress: null,
184
+ status: null,
185
+ label: null,
186
+ lastSeq: 0,
187
+ };
188
+ this.lastLogAt = Date.now();
189
+ const logger = (0, helpers_1.createLogger)(`${program}-${phase}`, false);
190
+ logger.subscribe(entry => this.onEntry(entry));
191
+ this.logger = logger;
192
+ try {
193
+ const role = request.role === 'observer' ? 'observer' : constants_1.DEFAULT_ROLE;
194
+ if (program === 'deploy') {
195
+ const bondRaw = this.rawBond(request);
196
+ this.orchestrator = new deploy_1.DeployOrchestrator({
197
+ ip: newIp,
198
+ auth: newAuth,
199
+ nodeName: request.nodeName,
200
+ role: role === 'observer' ? 'observer' : 'validator',
201
+ bond: bondRaw,
202
+ domain: request.domain || settings.dashboardDomain || undefined,
203
+ swapGB: settings.swapGB,
204
+ dataDevice: settings.dataDevice,
205
+ dataMinGB: settings.dataMinGB,
206
+ skipDashboard: true,
207
+ samples: 3,
208
+ interval: 20,
209
+ reset: Boolean(request.reset),
210
+ wipeVolume: Boolean(request.wipeVolume),
211
+ keepData: Boolean(request.keepData),
212
+ phase,
213
+ }, logger);
214
+ }
215
+ else if (program === 'migrate') {
216
+ this.orchestrator = new migrate_1.MigrateOrchestrator({
217
+ oldIp,
218
+ oldAuth,
219
+ newIp,
220
+ newAuth,
221
+ wipeTargetVolume: Boolean(request.wipeTargetVolume),
222
+ keepTargetData: Boolean(request.keepTargetData),
223
+ phase,
224
+ samples: 3,
225
+ interval: 30,
226
+ reset: Boolean(request.reset),
227
+ }, logger);
228
+ }
229
+ else {
230
+ this.orchestrator = new manage_1.ManageOrchestrator({
231
+ ip: newIp,
232
+ auth: newAuth,
233
+ phase: phase,
234
+ amount: request.amount,
235
+ newBond: Boolean(request.newBond),
236
+ domain: request.domain || undefined,
237
+ sslMode: request.sslMode || 'auto',
238
+ certDir: request.certDir,
239
+ email: request.email,
240
+ testOnly: Boolean(request.testOnly),
241
+ noRestart: Boolean(request.noRestart),
242
+ reset: Boolean(request.reset),
243
+ waitSeconds: request.waitSeconds ? Number(request.waitSeconds) : 900,
244
+ extra: request.extra,
245
+ }, logger);
246
+ }
247
+ void this.execute();
248
+ return this.snapshot();
249
+ }
250
+ catch (err) {
251
+ this.state.running = false;
252
+ this.state.exitCode = 1;
253
+ throw err;
254
+ }
255
+ }
256
+ async execute() {
257
+ const orch = this.orchestrator;
258
+ const program = this.state.program;
259
+ const phase = this.state.phase;
260
+ try {
261
+ if (program === 'deploy') {
262
+ const deploy = orch;
263
+ await deploy.run();
264
+ if (deploy.awaitingEnroll) {
265
+ this.state.awaiting = {
266
+ action: 'enroll',
267
+ ip: this.state.newIp,
268
+ address: deploy.awaitingEnroll.address,
269
+ bond: deploy.awaitingEnroll.bond,
270
+ };
271
+ }
272
+ if (deploy.dashboardUrl)
273
+ this.state.domain = deploy.dashboardUrl.replace(/^https?:\/\//, '').replace(/\/$/, '');
274
+ const shouldWatch = deploy.awaitingEnroll === null
275
+ && ['deploy', 'all', 'enroll', 'promote', 'verify'].includes(phase);
276
+ if (shouldWatch)
277
+ this.startActivationWatch(this.state.newIp);
278
+ }
279
+ else if (program === 'migrate') {
280
+ const migrate = orch;
281
+ await migrate.run();
282
+ if (phase === 'all' || phase === 'auto' || phase === 'verify' || migrate.activationPending) {
283
+ this.startActivationWatch(this.state.newIp);
284
+ }
285
+ }
286
+ else {
287
+ await orch.run();
288
+ if (phase === 'exit')
289
+ this.startExitWatch(this.state.newIp);
290
+ }
291
+ this.state.exitCode = 0;
292
+ }
293
+ catch (err) {
294
+ this.state.exitCode = 1;
295
+ const msg = err instanceof Error ? err.message : String(err);
296
+ this.logger?.log(`run failed: ${msg}`, 'error', { program });
297
+ }
298
+ finally {
299
+ this.state.running = false;
300
+ this.lastLogAt = Date.now();
301
+ }
302
+ }
303
+ cancel() {
304
+ if (!this.state.running || !this.orchestrator)
305
+ return false;
306
+ this.orchestrator.abort();
307
+ this.logger?.log('cancel requested - the current phase will stop at the next safe point', 'warn', { program: this.state.program });
308
+ return true;
309
+ }
310
+ dispose() {
311
+ this.clearWatchers();
312
+ }
313
+ auth(request, side) {
314
+ const method = (side === 'old' ? request.oldAuth : request.newAuth) === 'key' ? 'key' : 'password';
315
+ return {
316
+ method,
317
+ password: side === 'old' ? request.oldPassword : request.newPassword,
318
+ keyPath: side === 'old' ? request.oldKey : request.newKey,
319
+ };
320
+ }
321
+ async validateAuth(auth, label, ip) {
322
+ if (auth.method === 'key') {
323
+ if (!auth.keyPath)
324
+ throw new Error(`no SSH key selected for ${label} ${ip}`);
325
+ try {
326
+ await fs.access(auth.keyPath);
327
+ }
328
+ catch {
329
+ throw new Error(`the SSH key for ${label} ${ip} does not exist: ${auth.keyPath}`);
330
+ }
331
+ return;
332
+ }
333
+ if (!auth.password)
334
+ throw new Error(`no password typed for ${label} ${ip}`);
335
+ }
336
+ async validateCertDir(dir) {
337
+ for (const name of ['fullchain.pem', 'privkey.pem']) {
338
+ try {
339
+ await fs.access(path.join(dir, name));
340
+ }
341
+ catch {
342
+ throw new Error(`${name} is missing in ${dir}`);
343
+ }
344
+ }
345
+ }
346
+ rawBond(request) {
347
+ const oct = Number(request.bondOct);
348
+ if (Number.isFinite(oct) && oct > 0)
349
+ return Math.round(oct * 1_000_000);
350
+ const raw = Number(request.bond);
351
+ return Number.isFinite(raw) && raw > 0 ? Math.round(raw) : 0;
352
+ }
353
+ onEntry(entry) {
354
+ this.lastLogAt = Date.now();
355
+ this.state.lastSeq = entry.seq;
356
+ const labelMatch = /^--> \[([^\]]+)\]\s+(.+?)(?:\s+\(detached.*\))?$/.exec(entry.line);
357
+ if (labelMatch) {
358
+ this.state.label = { ip: labelMatch[1], label: labelMatch[2] };
359
+ this.state.step = labelMatch[2];
360
+ }
361
+ const statusMatch = /^status\s*=\s*(RUNNING|DONE|FAILED|WAITING-[A-Z-]+)\s*(.*)$/i.exec(entry.line);
362
+ if (statusMatch) {
363
+ this.state.status = { state: statusMatch[1].toUpperCase(), detail: statusMatch[2].trim() };
364
+ }
365
+ const progress = /([\d,]+)\s+(\d+)%\s+([\d.]+\s*[kKMG]?B\/s)/.exec(entry.line);
366
+ if (progress) {
367
+ this.state.progress = { pct: Number(progress[2]), bytes: progress[1].replace(/,/g, ''), rate: progress[3].trim() };
368
+ }
369
+ for (const listener of this.listeners) {
370
+ try {
371
+ listener(entry);
372
+ }
373
+ catch {
374
+ // ignore
375
+ }
376
+ }
377
+ }
378
+ startActivationWatch(ip) {
379
+ if (!ip)
380
+ return;
381
+ this.clearActivation();
382
+ this.state.watching = { ip };
383
+ const deadline = Date.now() + 6 * 3600 * 1000;
384
+ const tick = async () => {
385
+ if (Date.now() > deadline) {
386
+ this.state.watching = null;
387
+ this.clearActivation();
388
+ return;
389
+ }
390
+ try {
391
+ const summary = await (0, nodes_1.probeNode)(ip);
392
+ const validator = summary.validator || {};
393
+ if (validator.active) {
394
+ this.state.activation = {
395
+ id: `${ip}:${validator.activate_epoch || validator.head_epoch || Date.now()}`,
396
+ ip,
397
+ epoch: Number(validator.activate_epoch || validator.head_epoch) || undefined,
398
+ bond: Number(validator.bond) || undefined,
399
+ };
400
+ this.state.watching = null;
401
+ this.clearActivation();
402
+ }
403
+ }
404
+ catch {
405
+ // node not reachable yet: keep watching
406
+ }
407
+ };
408
+ void tick();
409
+ this.activationTimer = setInterval(() => void tick(), 60000);
410
+ this.activationTimer.unref?.();
411
+ }
412
+ startExitWatch(ip) {
413
+ if (!ip)
414
+ return;
415
+ this.clearExit();
416
+ this.state.exitWatching = { ip };
417
+ const deadline = Date.now() + 30 * 24 * 3600 * 1000;
418
+ const tick = async () => {
419
+ if (Date.now() > deadline) {
420
+ this.state.exitWatching = null;
421
+ this.clearExit();
422
+ return;
423
+ }
424
+ try {
425
+ const result = await (0, nodes_1.getEnrollment)(ip);
426
+ if (!result)
427
+ return;
428
+ const bond = Number(result.bond) || 0;
429
+ const member = result.membership || {};
430
+ const state = String(result.state || '');
431
+ const done = bond === 0 && !['bonded', 'ready', 'exiting'].includes(state);
432
+ const remaining = result.remaining_epochs === undefined || result.remaining_epochs === null
433
+ ? null
434
+ : Number(result.remaining_epochs);
435
+ const id = `${ip}:${done ? 'done' : 'pending'}:${result.withdraw_epoch || result.exit_epoch || ''}:${remaining ?? ''}`;
436
+ this.state.exitInfo = {
437
+ id,
438
+ ip,
439
+ done,
440
+ exit_epoch: result.exit_epoch !== undefined && result.exit_epoch !== null ? String(result.exit_epoch) : undefined,
441
+ withdraw_epoch: result.withdraw_epoch !== undefined && result.withdraw_epoch !== null ? String(result.withdraw_epoch) : undefined,
442
+ remaining,
443
+ eta: undefined,
444
+ active: Boolean(member.active),
445
+ scheduled: Boolean(member.scheduled),
446
+ };
447
+ if (done) {
448
+ this.state.exitWatching = null;
449
+ this.clearExit();
450
+ }
451
+ }
452
+ catch {
453
+ // keep following
454
+ }
455
+ };
456
+ void tick();
457
+ this.exitTimer = setInterval(() => void tick(), 120000);
458
+ this.exitTimer.unref?.();
459
+ }
460
+ clearActivation() {
461
+ if (this.activationTimer) {
462
+ clearInterval(this.activationTimer);
463
+ this.activationTimer = null;
464
+ }
465
+ }
466
+ clearExit() {
467
+ if (this.exitTimer) {
468
+ clearInterval(this.exitTimer);
469
+ this.exitTimer = null;
470
+ }
471
+ }
472
+ clearWatchers() {
473
+ this.clearActivation();
474
+ this.clearExit();
475
+ this.state.watching = null;
476
+ this.state.exitWatching = null;
477
+ this.state.activation = null;
478
+ this.state.exitInfo = null;
479
+ }
480
+ }
481
+ exports.JobManager = JobManager;
482
+ exports.jobs = new JobManager();
483
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/api/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { NodeSummary } from '../types';
2
+ interface Probe {
3
+ ip: string;
4
+ reachable: boolean;
5
+ error?: string | null;
6
+ chain?: any;
7
+ validator?: any;
8
+ ts: number;
9
+ }
10
+ export declare function probeNode(ip: string): Promise<Probe>;
11
+ export declare function tokenAmount(raw: unknown): number | null;
12
+ export declare function nodeSummaryFromProbe(probe: Probe): NodeSummary;
13
+ export declare function nodeSummary(ip: string): Promise<NodeSummary>;
14
+ export declare function getEnrollment(ip: string): Promise<any | null>;
15
+ export {};
16
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/api/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAwBD,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CA6C1D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIvD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CA6B9D;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAElE;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGnE"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.probeNode = probeNode;
4
+ exports.tokenAmount = tokenAmount;
5
+ exports.nodeSummaryFromProbe = nodeSummaryFromProbe;
6
+ exports.nodeSummary = nodeSummary;
7
+ exports.getEnrollment = getEnrollment;
8
+ const constants_1 = require("../constants");
9
+ const cache = new Map();
10
+ async function httpJson(url, init = {}, timeoutMs = 4000) {
11
+ const controller = new AbortController();
12
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
13
+ try {
14
+ const response = await fetch(url, { ...init, signal: controller.signal });
15
+ if (!response.ok)
16
+ throw new Error(`HTTP ${response.status}`);
17
+ return await response.json();
18
+ }
19
+ finally {
20
+ clearTimeout(timer);
21
+ }
22
+ }
23
+ function rpc(ip, method, params = []) {
24
+ return httpJson(`http://${ip}:${constants_1.NODE_API_PORT}/rpc`, {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
28
+ });
29
+ }
30
+ async function probeNode(ip) {
31
+ const cached = cache.get(ip);
32
+ if (cached && Date.now() - cached.ts < constants_1.PROBE_TTL_MS)
33
+ return cached.probe;
34
+ const probe = { ip, reachable: false, ts: Date.now() };
35
+ try {
36
+ const status = await httpJson(`http://${ip}:${constants_1.NODE_API_PORT}/status`);
37
+ probe.reachable = true;
38
+ probe.chain = {
39
+ epoch: status.current_epoch,
40
+ head_epoch: status.head_epoch,
41
+ txid_hi: status.txid_hi,
42
+ accounts: status.total_accounts,
43
+ network: status.network_version,
44
+ state_root: status.state_root,
45
+ };
46
+ }
47
+ catch (err) {
48
+ probe.error = err.message.slice(0, 180);
49
+ }
50
+ if (probe.reachable) {
51
+ try {
52
+ const enroll = await rpc(ip, 'octra_validatorEnrollment');
53
+ const result = enroll?.result || enroll || {};
54
+ const member = result.membership || {};
55
+ const committed = result.committed_enrollment || result.enrollment || {};
56
+ probe.validator = {
57
+ address: result.address,
58
+ state: result.state,
59
+ bond: result.bond,
60
+ head_epoch: result.head_epoch,
61
+ active: Boolean(member.active),
62
+ scheduled: Boolean(member.scheduled),
63
+ next_set_epoch: member.next_set_epoch,
64
+ activate_epoch: member.activate_epoch,
65
+ duty_automatic: Boolean(result.duty?.automatic),
66
+ exit_epoch: committed.exit_epoch ?? result.exit_epoch,
67
+ withdraw_epoch: committed.withdraw_epoch ?? result.withdraw_epoch,
68
+ remaining_epochs: committed.remaining_epochs ?? result.remaining_epochs,
69
+ raw: result,
70
+ };
71
+ }
72
+ catch (err) {
73
+ probe.validator_error = err.message.slice(0, 180);
74
+ }
75
+ }
76
+ cache.set(ip, { ts: probe.ts, probe });
77
+ return probe;
78
+ }
79
+ function tokenAmount(raw) {
80
+ const value = Number(raw);
81
+ if (!Number.isFinite(value) || value < 0)
82
+ return null;
83
+ return value / constants_1.TOKEN_UNIT;
84
+ }
85
+ function nodeSummaryFromProbe(probe) {
86
+ const chain = probe.chain || {};
87
+ const validator = probe.validator || {};
88
+ let state = 'unreachable';
89
+ if (probe.reachable) {
90
+ if (validator.active)
91
+ state = 'validator';
92
+ else if (validator.scheduled)
93
+ state = 'scheduled';
94
+ else if (validator.state === 'ready')
95
+ state = 'ready-idle';
96
+ else
97
+ state = 'observer';
98
+ }
99
+ return {
100
+ ip: probe.ip,
101
+ state,
102
+ reachable: probe.reachable,
103
+ error: probe.error || null,
104
+ epoch: chain.epoch ?? null,
105
+ head_epoch: chain.head_epoch ?? null,
106
+ accounts: chain.accounts ?? null,
107
+ network: chain.network ?? null,
108
+ address: validator.address ?? null,
109
+ bond: validator.bond ?? null,
110
+ bondOct: tokenAmount(validator.bond),
111
+ enrollment: validator.state ?? null,
112
+ active: Boolean(validator.active),
113
+ scheduled: Boolean(validator.scheduled),
114
+ next_set_epoch: validator.next_set_epoch ?? null,
115
+ duty_automatic: Boolean(validator.duty_automatic),
116
+ ts: probe.ts,
117
+ };
118
+ }
119
+ async function nodeSummary(ip) {
120
+ return nodeSummaryFromProbe(await probeNode(ip));
121
+ }
122
+ async function getEnrollment(ip) {
123
+ const probe = await probeNode(ip);
124
+ return probe.validator?.raw || probe.validator || null;
125
+ }
126
+ //# sourceMappingURL=nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/api/nodes.ts"],"names":[],"mappings":";;AAkCA,8BA6CC;AAED,kCAIC;AAED,oDA6BC;AAED,kCAEC;AAED,sCAGC;AA5HD,4CAAuE;AAWvE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwC,CAAC;AAE9D,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,OAAoB,EAAE,EAAE,SAAS,GAAG,IAAI;IAC3E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,EAAU,EAAE,MAAc,EAAE,SAAoB,EAAE;IAC7D,OAAO,QAAQ,CAAC,UAAU,EAAE,IAAI,yBAAa,MAAM,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;KAChE,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,EAAU;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,wBAAY;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IACzE,MAAM,KAAK,GAAU,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,IAAI,yBAAa,SAAS,CAAC,CAAC;QACtE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,KAAK,GAAG;YACZ,KAAK,EAAE,MAAM,CAAC,aAAa;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,cAAc;YAC/B,OAAO,EAAE,MAAM,CAAC,eAAe;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,KAAK,GAAI,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,MAAM,IAAI,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,CAAC,oBAAoB,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YACzE,KAAK,CAAC,SAAS,GAAG;gBAChB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC9B,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;gBACpC,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;gBAC/C,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU;gBACrD,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc;gBACjE,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB;gBACvE,GAAG,EAAE,MAAM;aACZ,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACZ,KAAa,CAAC,eAAe,GAAI,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,WAAW,CAAC,GAAY;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,KAAK,GAAG,sBAAU,CAAC;AAC5B,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAY;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;IACxC,IAAI,KAAK,GAAG,aAAa,CAAC;IAC1B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,SAAS,CAAC,MAAM;YAAE,KAAK,GAAG,WAAW,CAAC;aACrC,IAAI,SAAS,CAAC,SAAS;YAAE,KAAK,GAAG,WAAW,CAAC;aAC7C,IAAI,SAAS,CAAC,KAAK,KAAK,OAAO;YAAE,KAAK,GAAG,YAAY,CAAC;;YACtD,KAAK,GAAG,UAAU,CAAC;IAC1B,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,KAAK;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;QACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,IAAI;QAClC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,IAAI;QAC5B,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC;QACpC,UAAU,EAAE,SAAS,CAAC,KAAK,IAAI,IAAI;QACnC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;QACjC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;QACvC,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,IAAI;QAChD,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC;QACjD,EAAE,EAAE,KAAK,CAAC,EAAE;KACb,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,OAAO,oBAAoB,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,EAAU;IAC5C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC;AACzD,CAAC"}